---
# System prepended metadata

title: 健康報告

---

# 健康報告

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








