# 健康報告
---
常數定義
- [報告類型](#報告類型)
- [報告來源](#報告來源)
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

### 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"
}
}
}
```