# 健康報告 --- 常數定義 - [報告類型](#報告類型) - [報告來源](#報告來源) API 清單 * [WEB] [取得上傳報告URL](#取得上傳報告URL) * [WEB/APP] [取得/檢視健康報告列表](#取得檢視健康報告列表) * [WEB] [新增健康報告](#新增健康報告) * [WEB] [刪除健康報告](#刪除健康報告) * [WEB] [編輯健康報告](#編輯健康報告) * [WEB/APP] [取得健康報告Raw Data](#取得健康報告Raw-Data) * [WEB] [取得健檢報告Raw Data匯入記錄](#取得健檢報告Raw-Data匯入記錄) * [WEB] [匯入健檢報告RawData Data匯入記錄](#匯入健檢報告RawData) --- ## 常數定義 ### 報告類型 欄位 | 型態 | 說明 ---|---|--- reportType | string | 健檢報告類型, FILE: 檔案, URL: 連結, RAW_DATA: raw data, EXAM_DATA: 檢驗檢查資料 ### 報告來源 欄位 | 型態 | 說明 ---|---|--- source | string | 健檢報告來源, LOCAL: 透過365頁面上傳, VGHKS: 高榮數位健檢報告, HUAYU: 華育數位健檢報告, IMPORT_RAW_DATA: 匯入的raw data ## 取得上傳報告URL ```url POST /medical-report/get-upload-url ``` * 新增/編輯健康報告時用來上傳圖片(jpg, jpeg, png)、檔案(pdf)、影片(mp4) * 新增/編輯健康報告時用來上傳縮圖(jpg, jpeg, png) ### Request 欄位 | 型態 | 必填 | 預設 | 說明 ---|---|---|---|--- isMultipart | boolean | Y | false | 是否使用分段上傳 isThumbnail | boolean | Y | false | 上傳的是否為縮圖 fileName | String | Y | | 檔名,不包含副檔名,限制最多50字 fileType | String | Y | | 副檔名, 限制最多10字 totalPart | int | **N** (isMultipart=false)<br>**Y** (isMultipart=true) | | 總分塊數量,不可小於2 parts | Array [...part] | **N** (isMultipart=false)<br>**Y** (isMultipart=true) | | part 資訊 * part(Object) 欄位 | 型態 | 必填 | 預設 | 說明 ---|---|---|---|--- chunkSize | int | Y | | 該 chunk 的大小, bytes md5 | string | Y | | 該 part 的 md5 part | int | Y | | part number, 第幾塊 chunk ```javascript // 單檔 { "isMultipart": false, "isThumbnail": false, "fileName": "ad_bg_jp", "fileType": "png" } // 分塊上傳 { "isMultipart": true, "isThumbnail": false, "fileName": "giphy (7)", "fileType": "mp4", "totalPart": 2, "parts": [ { "chunkSize": 5242880, "md5": "5AACA89868CD486D81192221CF9F9415", "part": 1 }, { "chunkSize": 3145728, "md5": "5AACA89868CD486D81192221CF9F9415", "part": 2 } ] } ``` ### Response * data 欄位 | 型態 | 說明 --- | --- | --- objectKey | string | storage 中的 objectKey, **unique** uploadId | string | 識別該次上傳的 uploadId fileName | string | 名稱 fileType | string | 副檔名 url | string | 單檔上傳的時候,才會回傳該 url, 時效 3600 秒 parts | [...part] | multipart上傳各part的url * part(Object) 欄位 | 型態 | 說明 --- | --- | --- chunkSize | int | 該 chunk 的大小, bytes md5 | string | 該 part 的 md5 part | int | part number, 第幾塊 chunk url | string | 可上傳的 url, 時效 3600 秒 ```javascript // HttpStatus:422, 上傳的檔案類型不允許 { "errorMsg": "SERVICE_ERROR.EVENT_MGMT_UPLOAD_FILE_TYPE_NOT_ALLOWED", "httpCode": 422 } // HttpStatus: 200 // 單檔 { "httpCode": 200, "result": { "data": { "objectKey": "event/9f9de11b-12b9-4964-bae8-3233e9da065b.png", "uploadId": "11becd09-7571-4b0d-b8ee-cb3f09f66cf0", "fileName": "ad_bg_jp", "fileType": "png", // 單檔 才有 url "url": "http://192.168.100.239:12345/v1/AUTH_test/kmuh/event%2F9f9de11b-12b9-4964-bae8-3233e9da065b.png?temp_url_sig=e61d9e721d860294bde4d0151e111ebf8ed57ed7&temp_url_expires=1554114780" } } } // 分塊上傳 { "httpCode": 200, "result": { "data": { "objectKey": "event/f76adf26-1e22-4b18-980d-b9a68efc5171.mp4", "uploadId": "53fde368-43d9-455f-a610-62091fc30be6", "fileName": "giphy (7)", "fileType": "mp4", "parts": [ { "chunkSize": 5242880, "md5": "5AACA89868CD486D81192221CF9F9415", "part": 1, "url": "http://192.168.100.239:12345/v1/AUTH_test/kmuh_segments/event%2Ff76adf26-1e22-4b18-980d-b9a68efc5171.mp4%2F1?temp_url_sig=796c52b00f75b62be658533b2fadbc7f14381e36&temp_url_expires=1554263771" }, { "chunkSize": 3145728, "md5": "5AACA89868CD486D81192221CF9F9415", "part": 2, "url": "http://192.168.100.239:12345/v1/AUTH_test/kmuh_segments/event%2Ff76adf26-1e22-4b18-980d-b9a68efc5171.mp4%2F2?temp_url_sig=ad71de81dfbcd94bce4a091f2630c6f1373ff3cd&temp_url_expires=1554263771" } ] } } } ``` ## 取得/檢視健康報告列表 ```url POST /medical-report/list ``` ### Request - [WEB] 欄位 | 型態 | 必填 | 預設 | 說明 ---|---|---|---|--- householdMemberId | String | Y | | 個案householdMemberId ```javascript { "householdMemberId": "8a9e980a-c612-4f87-af07-a97a5f0fbed5" } ``` - [APP] none ### Response 欄位 | 型態 | 說明 --- | --- | --- id | string | 健康報告ID householdMemberId | String | 個案householdMemberId uploader | String | 上傳者account id uploadTime | timestamp | 上傳時間 fileTime | timestamp | 報告時間 fileName | String | 檔案名稱 fileType | String | 副檔名 fileObjectKey | String | 檔案object key fileUrl | String | FILE 可 download 的 url, 時效 3600 秒 reportName | String | 輸入的報告名稱 tenantId | String | 租戶ID tenantName | String | 租戶名稱 thumbnailObjectKey | String | 縮圖object key thumbnailUrl | String | 縮圖的 url, 時效 3600 秒 source | String | 報告來源, 參閱[報告來源](#報告來源) reportType | String | 報告類型, 參閱[報告類型](#報告類型) ```javascript { "httpCode": 200, "result": { "data": [ { "id": "7eaa10a6-fae3-43da-b8b7-88c7442dcf3f", "fileTime": 1671071148480, "reportName": "員工健檢報告", "updateTime": 1671071148480, "tenantId": "858b7fbb-3ba0-4d49-9882-c893a1ef07dc", "tenantName": "緯緯醫學", "source": "IMPORT_RAW_DATA", "reportType": "RAW_DATA" }, { "id": "8693df2d-ec96-4049-81e5-2a375bb2291f", "householdMemberId": "8a9e980a-c612-4f87-af07-a97a5f0fbed5", "uploader": "98953ae4-b8f1-488c-b3ae-cb64d8caae15", "uploadTime": 1661406351333, "fileTime": 1659321000000, "fileName": "vghks_health_check_report", "fileType": "pdf", "fileObjectKey": "medical-report/5c51a4c8-470a-4323-a81e-755f615b28ca.pdf", "fileUrl": "http://content-service/swift/v1/medical-report/5c51a4c8-470a-4323-a81e-755f615b28ca.pdf", "reportName": "高雄榮總健檢報告書", "updateTime": 1661406351333, "tenantId": "858b7fbb-3ba0-4d49-9882-c893a1ef07dc", "tenantName": "緯緯醫學", "thumbnailObjectKey": "medical-report/thumbnail/39a614e3-93f6-46cb-bbec-7ca86764bb2d.png", "thumbnailUrl": "http://content-service/swift/v1/medical-report/thumbnail/39a614e3-93f6-46cb-bbec-7ca86764bb2d.png", "source": "LOCAL", "reportType": "FILE" } ] } } ``` ## 新增健康報告 ```url= POST /medical-report/add ``` ### Request 欄位 | 型態 | 必填 | 預設 | 說明 ---|---|---|---|--- householdMemberId | String | Y | | 個案householdMemberId fileTime | timestamp | Y | | 檔案日期 fileName | String | Y | | 檔名,不包含副檔名,限制最多200字 fileType | String | Y | | 副檔名, 限制最多50字 fileObjectKey| String | Y | | 檔案object key reportName | String | Y | | 輸入的報告名稱 thumbnailObjectKey | String | N | | 縮圖object key isFileMultipart | boolean | N | | 上傳的報告檔案是否分塊上傳,預設為 false fileTotalPart | int | **N** (isFileMultipart=false)<br>**Y** (isFileMultipart=true) | | 總分塊數量,不可小於2 fileUploadId | String | **N** (isFileMultipart=false)<br>**Y** (isFileMultipart=true) | | 從 /medical-report/get-upload-url 取得的 uploadId isThumbnailMultipart | boolean | N | | 縮圖上傳時是否分塊上傳,預設為 false thumbnailTotalPart | int | **N** (isThumbnailMultipart=false)<br>**Y** (isThumbnailMultipart=true) | | 縮圖上傳的總分塊數量,不可小於2 thumbnailUploadId | String | **N** (isThumbnailMultipart=false)<br>**Y** (isThumbnailMultipart=true) | | 從 /event-mgmt/get-upload-url 取得的 uploadId ```javascript { "householdMemberId": "8a9e980a-c612-4f87-af07-a97a5f0fbed5", "fileTime": 1659321000000, "fileName": "vghks_health_check_report", "fileType": "pdf", "reportName": "高雄榮總健檢報告書", "thumbnailObjectKey": "medical-report/thumbnail/39a614e3-93f6-46cb-bbec-7ca86764bb2d.png", "fileObjectKey": "medical-report/5c51a4c8-470a-4323-a81e-755f615b28ca.pdf", "isThumbnailMultipart": false, "thumbnailTotalPart": null, "thumbnailUploadId": null, "isFileMultipart": false, "fileTotalPart": null, "fileUploadId": null } ``` ### Response 欄位 | 型態 | 說明 --- | --- | --- id | string | 健康報告id uploader | string | 上傳者 account id uploadTime | timestamp | 上傳時間 fileTime | timestamp | 報告時間 fileName | String | 報告名稱 fileType | string | 副檔名 fileObjectKey| string | 檔案object key tenantId| string | 租戶id reportName | String | 輸入的報告名稱 thumbnailObjectKey | String | 縮圖object key ```javascript { "httpCode": 200, "result": { "data": { "id": "8693df2d-ec96-4049-81e5-2a375bb2291f", "householdMemberId": "8a9e980a-c612-4f87-af07-a97a5f0fbed5", "uploader": "98953ae4-b8f1-488c-b3ae-cb64d8caae15", "uploadTime": 1661406351333, "fileTime": 1659321000000, "fileName": "vghks_health_check_report", "fileType": "pdf", "fileObjectKey": "medical-report/5c51a4c8-470a-4323-a81e-755f615b28ca.pdf", "tenantId": "858b7fbb-3ba0-4d49-9882-c893a1ef07dc", "reportName": "高雄榮總健檢報告書", "updateTime": 1661406351333, "thumbnailObjectKey": "medical-report/thumbnail/39a614e3-93f6-46cb-bbec-7ca86764bb2d.png" } } } ``` ## 刪除健康報告 ```url POST /medical-report/delete ``` * 僅source: LOCAL的報告可以刪除 ### Request 欄位 | 型態 | 必填 | 預設 | 說明 ---|---|---|---|--- id | String | Y | | 健康報告ID ```javascript { "id": "8693df2d-ec96-4049-81e5-2a375bb2291f" } ``` ### Response 欄位 | 型態 | 說明 --- | --- | --- count | int | 刪除筆數, > 0 表示成功刪除 ```javascript // 不存在 { "errorMsg": "API_ERROR.NOT_EXIST", "httpCode": 400 } // 刪除成功 { "httpCode": 200, "result": { "data": { "count": 1 } } } ``` ## 編輯健康報告 ```url POST /medical-report/update ``` * source: LOCAL以外的報告僅可以編輯縮圖 ### Request 欄位 | 型態 | 必填 | 預設 | 說明 ---|---|---|---|--- id | String | Y | | 健康報告ID fileTime | timestamp | Y | | 檔案日期 fileName | String | Y | | 檔名,不包含副檔名,限制最多200字 fileType | String | N | | 副檔名, 限制最多50字 fileObjectKey| String | N | | 檔案object key reportName | String | Y | | 輸入的報告名稱 householdMemberId | String | Y | | 個案householdMemberId fileTime | timestamp | Y | | 檔案日期 fileName | String | Y | | 檔名,不包含副檔名,限制最多200字 fileType | String | Y | | 副檔名, 限制最多50字 source | String | Y | | 報告來源 fileObjectKey| String | Y | | 檔案object key reportName | String | Y | | 輸入的報告名稱 thumbnailObjectKey | String | N | | 縮圖object key isFileMultipart | boolean | N | | 上傳的報告檔案是否分塊上傳,預設為 false fileTotalPart | int | **N** (isFileMultipart=false)<br>**Y** (isFileMultipart=true) | | 總分塊數量,不可小於2 fileUploadId | String | **N** (isFileMultipart=false)<br>**Y** (isFileMultipart=true) | | 從 /medical-report/get-upload-url 取得的 uploadId isThumbnailMultipart | boolean | N | | 縮圖上傳時是否分塊上傳,預設為 false thumbnailTotalPart | int | **N** (isThumbnailMultipart=false)<br>**Y** (isThumbnailMultipart=true) | | 縮圖上傳的總分塊數量,不可小於2 thumbnailUploadId | String | **N** (isThumbnailMultipart=false)<br>**Y** (isThumbnailMultipart=true) | | 從 /event-mgmt/get-upload-url 取得的 uploadId ```javascript { "id":"fec8dca0-adc6-4320-912b-9936a3caf819", "householdMemberId": "8a9e980a-c612-4f87-af07-a97a5f0fbed5", "fileTime": 1659321000000, "fileName": "vghks_health_check_report", "fileType": "pdf", "reportName": "高雄榮總健檢報告書", "thumbnailObjectKey": "medical-report/thumbnail/39a614e3-93f6-46cb-bbec-7ca86764bb2d.png", "fileObjectKey": "medical-report/5c51a4c8-470a-4323-a81e-755f615b28ca.pdf", "source": "LOCAL", "isThumbnailMultipart": false, "thumbnailTotalPart": null, "thumbnailUploadId": null, "isFileMultipart": false, "fileTotalPart": null, "fileUploadId": null } ``` ### Response 欄位 | 型態 | 說明 --- | --- | --- id | string | 健康報告id uploader | string | 上傳者 account id uploadTime | timestamp | 上傳時間 fileTime | timestamp | 報告時間 fileName | String | 報告名稱 fileType | string | 副檔名 fileObjectKey| string | 檔案object key tenantId| string | 租戶id reportName | String | 輸入的報告名稱 thumbnailObjectKey | String | 縮圖object key ```javascript { "httpCode": 200, "result": { "data": { "id": "8693df2d-ec96-4049-81e5-2a375bb2291f", "householdMemberId": "8a9e980a-c612-4f87-af07-a97a5f0fbed5", "uploader": "98953ae4-b8f1-488c-b3ae-cb64d8caae15", "uploadTime": 1661406351333, "fileTime": 1659321000000, "fileName": "vghks_health_check_report", "fileType": "pdf", "fileObjectKey": "medical-report/5c51a4c8-470a-4323-a81e-755f615b28ca.pdf", "tenantId": "858b7fbb-3ba0-4d49-9882-c893a1ef07dc", "reportName": "高雄榮總健檢報告書", "updateTime": 1661406351333, "thumbnailObjectKey": "medical-report/thumbnail/39a614e3-93f6-46cb-bbec-7ca86764bb2d.png" } } } ``` ## 取得健康報告Raw Data ```url POST /medical-report/get-raw-data ``` * reportType 為RAW_DATA的才可以呼叫此API ### Request 欄位 | 型態 | 必填 | 預設 | 說明 ---|---|---|---|--- id | String | Y | | 健檢報告id ```javascript { "id": "8a9e980a-c612-4f87-af07-a97a5f0fbed5" } ``` ### Response 欄位 | 型態 | 說明 --- | --- | --- id | string | 健康報告RawData ID householdMemberId | string | 個案householdMemberId tenantId | string | 租戶ID tenantName | string | 租戶名稱 source | string | 報告來源, 參閱[報告來源](#報告來源) checkDate | timestamp | 檢驗日期 employeeName | string | 員工名稱 employeeNo | string | 員工編號 idCardNo | string | 身份證字號 reportOrg | string | 健檢機構 reportType | string | 報告類型, 參閱[報告類型](#報告類型) reportName | string | 輸入的報告名稱 rawDataInfo | json array | raw data json array #### Response-rawData(json) 欄位 | 型態 | 說明 --- | --- | --- title | string | raw data 欄位名稱 value | string | raw data 欄位值 unit | string | raw data 欄位單位 description | string | raw data 欄位說明 ```javascript { "httpCode": 200, "result": { "data": [ { "id": "8693df2d-ec96-4049-81e5-2a375bb2291f", "householdMemberId": "8a9e980a-c612-4f87-af07-a97a5f0fbed5", "tenantId": "858b7fbb-3ba0-4d49-9882-c893a1ef07dc", "tenantName": "緯緯醫學", "checkDate": 1669824000000, "employeeName": "林健康", "employeeNo": "AD001", "reportOrg": "DELIN", "reportType": "RAW_DATA", "reportName": "員工健檢報告", "source": "LOCAL", "rawDataInfo": [ { "title": "檢驗日期", "value": "2022/12/16" }, { "title": "員工姓名", "value": "林健康" }, { "title": "員工編號", "value": "AD001" }, { "title": "三酸甘油脂", "value": "210", "unit": "mg/dl", "description": "<150 mg/g - Normal" }, ... ] } ] } } ``` ## 取得健檢報告Raw Data匯入記錄 ```url POST /medical-report/list-import-records ``` * 租戶管理員權限叫用 ### Request 欄位 | 型態 | 預設 | 說明 --- | --- | --- |--- query | json | | 查詢條件json pagination | json | | 分頁json sorter | json | | 排序json #### query (查詢條件json) 欄位 | 型態 | 必填 | 長度限制 | 預設 | 說明 ---|---|---|---|---|--- startDate | string | | 10 | | 要搜尋的啟始日期, YYYY-MM-DD endDate | string | | 10 | | 要搜尋的結束日期, YYYY-MM-DD keyword | string | | 50 | | 輸入關鍵字查詢姓名、編號、報告名稱 #### pagination (分頁json) 欄位 | 型態 | 必填 | 預設 | 說明 ---|---|---|---|--- current | int | | 1 | 當前頁數 pageSize | int | | 10 | 每頁結果數量,-1 為顯示所有 #### sorter (排序json) 欄位 | 型態 | 必填 | 預設 | 說明 ---|---|---|---|--- field | string | | time | 排序欄位,可排序欄位有 checkDate, employeeName, employeeNo, reportName, isBind order | string | | desc | 升序或降序 ```javascript { "query": { "tenantId": null, "startDate": null, "endDate": null, "keyword": null } , "pagination": { "current": 1, "pageSize": 10 }, "sorter": { "field": "checkDate", "order": "desc" } } ``` ### Response 欄位 | 型態 | 說明 --- | --- | --- id | string | 匯入raw data id checkDate | timestamp | 健檢日期 employeeName | string | 員工名稱 employeeNo | string | 員工編號 reportName | string | 報告名稱 isBind | boolean | 是否已連結, true: 已連結, false: 已匯入 ```javascript { "httpCode": 200, "result": { "data": [ { "id": "728cd364-66f6-4efb-9713-4d3b137a6b48", "checkDate": 1670601600000, "employeeName": "林健康", "employeeNo": "AD001", "reportName": "員工健檢報告", "isBind": false }, ... ], "pagination": { "current": 1, "pageSize": 10, "total": 3 }, "sorter": { "field": "checkDate", "order": "desc" }, "total": 3 } } ``` ## 匯入健檢報告RawData ```url POST /medical-report/import-raw-data ``` * 租戶管理員權限叫用 * reportType為RAW_DATA的, 請叫用此支API * 若有發生匯入失敗的話, 可以呼叫[下載健檢錯誤資料檔 API](#https://hackmd.io/qUF83bDBRmiBt2SZhpbXIw?view#%E4%B8%8B%E8%BC%89%E5%81%A5%E6%AA%A2%E9%8C%AF%E8%AA%A4%E8%B3%87%E6%96%99%E6%AA%94) ### Request * body format: form-data 欄位 | 型態 | 必填 | 預設 | 說明 ---|---|---|---|--- file | File | Y | | 匯入的excel檔案 hospital | string | Y | | 健檢醫院, DELIN: 德霖管顧 year | string | Y | | 健檢年度, 格式: yyyy ![](https://i.imgur.com/RnCprd9.png) ### Error httpCode | 錯誤碼 | 說明 --- | --- | --- 400 | API_ERROR.ARGUMENT_ERROR | 未選擇上傳檔案 400 | API_ERROR.IMPORT_FILE_FORMAT_ERROR | 匯入檔案非excel 格式 ### Response 欄位 | 型態 | 說明 --- | --- |--- totalCount | int | 匯入處理筆數 successCount | int | 匯入成功筆數 failCount | int | 匯入失敗筆數 failuresId | string | 匯入失敗檔案下載id ```javascript //匯入成功 { "httpCode": 200, "result": { "data": { "totalCount": 30, "successCount": 30, "failCount": 0, "failuresId": null } } } //匯入失敗 { "httpCode": 200, "result": { "data": { "totalCount": 30, "successCount": 0, "failCount": 30, "failuresId": "18982a76-7062-44cd-a27e-d132da550b52" } } } ```