---
# System prepended metadata

title: 問卷調查

---

# 問卷調查

---
- 常數定義
  - [問卷語系](#問卷語系)
  - [計分方式](#計分方式)
  - [問卷狀態](#問卷狀態)
  - [題型類別](#題型類別)
  - [計分規則運算子](#計分規則運算子)
  - [隱私設定](#隱私設定)
  - [派送對象類別](#派送對象類別)
  - [派送記錄狀態](#派送記錄狀態)
  - [派送問卷來源類別](#派送問卷來源類別)
  - [App問卷列表查詢類別](#App問卷列表查詢類別)
  - [問卷群組公開對象類別](#問卷群組公開對象類別)
- API 清單
  - 問卷管理[WEB]
    - 問卷設計
      - [問卷管理列表](#問卷管理列表)
      - [取得問卷管理明細](#取得問卷管理明細)
      - [取得上傳網址](#取得上傳網址)
      - [新增問卷](#新增問卷)
      - [編輯問卷](#編輯問卷)
      - [編輯問卷狀態](#編輯問卷狀態)
      - [刪除問卷](#刪除問卷)
      - [撤銷問卷](#撤銷問卷)
    - 問卷群組
      - [問卷群組列表](#問卷群組列表)
      - [取得問卷群組明細](#取得問卷群組明細)
      - [取得已啟用問卷列表](#取得已啟用問卷列表)
      - [新增問卷群組](#新增問卷群組)
      - [編輯問卷群組](#編輯問卷群組)
      - [刪除問卷群組](#刪除問卷群組)
      - [取得經銷列表](#取得經銷列表)
      - [取得經銷租戶列表](#取得經銷租戶列表)
    - 問卷派送
      - [問卷派送記錄列表](#問卷派送記錄列表)
      - [取得問卷派送記錄明細](#取得問卷派送記錄明細)
      - [取得問卷派送記錄來源列表](#取得問卷派送記錄來源列表)
      - [新增問卷派送記錄](#新增問卷派送記錄)
      - [編輯問卷派送記錄](#編輯問卷派送記錄)
      - [編輯問卷派送記錄狀態](#編輯問卷派送記錄狀態)
      - [撤銷問卷派送記錄](#撤銷問卷派送記錄)
      - [編輯問卷派送記錄結束日期](#編輯問卷派送記錄結束日期)
      - [刪除問卷派送記錄](#刪除問卷派送記錄)
      - [問卷派送統計](#問卷派送統計)
      - [匯出問卷派送統計Excel](#匯出問卷派送統計Excel)
      - [匯出問卷派送未填寫Excel](#匯出問卷派送未填寫Excel)
    - 檢視用戶(會員)問卷調查結果
      - [取得使用者問卷調查列表](#取得使用者問卷調查列表)
      - [取得使用者問卷調查明細結果](#取得使用者問卷調查明細結果)
  - App端
    - [取得問卷列表](#取得問卷列表)
    - [取得問卷明細](#取得問卷明細)
    - [填寫問卷](#填寫問卷)
---

## 常數定義

### 問卷語系
 欄位 | 型態  | 說明  
 ---|---|---
 language | string | 語系, zh-CHT:繁體中文, en-US:英文, ja-JP:日文, id-ID:印尼文, vi-VN:越南文, th-TH:泰文

### 計分方式
 欄位 | 型態  | 說明  
 ---|---|---
 scoreType | string | 計分方式, NONE:不計分, NO_SECTION:不分區, SECTION:分區計分

### 問卷狀態
 欄位 | 型態  | 說明  
 ---|---|---
 status | string | 問卷狀態, NONE:未啟用, ON:啟用, OFF:停用

### 題型類別
 欄位 | 型態  | 說明  
 ---|---|---
 questionType | string | 題型類別, SINGLE:單選, MULTIPLE:多選, DROPDOWN:下拉選單, TEXT:文字, DATE:日期, TIME:時間
 
### 計分規則運算子 
 欄位 | 型態  | 說明  
 ---|---|---
 op | string | 計分規則(運算子), LT:小於, LE:小於等於, EQ:等於, GT:大於, GE:大於等於, BTW:Between
 
### 隱私設定 
 欄位 | 型態  | 說明  
 ---|---|---
 is_public | boolean | 隱私設定, 只有平台管理員可以設定公開或不公開, 租戶/企客預設為不公開,且不開放設定<br/>TRUE:公開, FALSE:不公開

### 派送對象類別
 欄位 | 型態  | 說明  
 ---|---|---
 targetType | string | 派送對象類別, ALL:全部會員, TENANT:組織單位, MEMBER:會員, DISEASE:疾病別<br/> 平台管理員可使用ALL、TENANT、MEMBER<br/>醫院租戶(tenantType=HOSPITAL)管理員可使用ALL、MEMBER、DISEASE<br/>非醫院租戶(tenantType!=HOSPITAL)管理員可使用ALL、MEMBER

### 派送記錄狀態
 欄位 | 型態  | 說明  
 ---|---|---
 status | string | 問卷派送記錄狀態, NONE:未派送, ON:已派送, OFF:已結束

### 派送問卷來源類別 
 欄位 | 型態  | 說明  
 ---|---|---
 dispatchSource | string | 問卷派送記錄問卷來源類別, QUESTIONNAIRE:單一問卷, GROUP:問卷群組

### App問卷列表查詢類別
 欄位 | 型態  | 說明  
 ---|---|---
 listQueryType | string | 問卷列表查詢類別, FILL:可填寫, FILL_OUT:已填寫, END:已結束

### 問卷群組公開對象類別
 欄位 | 型態  | 說明  
 ---|---|---
 publicType | string | 問卷群組公開對象類別, 01:不公開, 02:公開, 03:限定對象

---

## 問卷管理列表

```url
POST /questionnaire-mgmt/questionnaire/list
```

### Request
#### query (查詢條件json)
 欄位 | 型態  | 必填 | 長度限制 | 預設 | 說明  
 ---|---|---|---|---|---
 scoreType | string | | 20 | | 計分方式, 未填則表示查詢全部, 參閱 [計分方式](#計分方式)
 language | string | | 20 | | 問卷語系, 未填則表示查詢全部, 參閱 [問卷語系](#問卷語系)
 status | string | | 20 | | 問卷狀態, 未填則表示查詢全部, 參閱 [問卷狀態](#問卷狀態)
 keyword | string | | 50 | | 關鍵字, 查詢問卷名稱
 
#### pagination (分頁json)
 欄位 | 型態  | 必填 | 預設 | 說明
 ---|---|---|---|---
 current | int | | 1 | 當前頁數 
 pageSize | int | | 10 | 每頁結果數量，-1 為顯示所有
 
#### sorter (排序json) 
 欄位 | 型態  | 必填 | 預設 | 說明
 ---|---|---|---|--- 
 field | string | | createTime | 排序欄位,可排序欄位有 createTime, name, language, scoreType, remark, status, dispatched, updateTime 
 order | string | | desc | 升序或降序 

```javascript
{
    "query": {
        "scoreType": null,
        "language": null,
        "status": null,
        "keyword": null
    } ,
    "pagination": {
        "current": 1,
        "pageSize": 10
    }, 
    "sorter": {
        "field": "updateTime",
        "order": "desc"
    }
}
```

### Response-問卷管理列表
 欄位 | 型態 | 說明 
 ---  | --- | ---
 id | string | 問卷id
 name | string | 問卷名稱 
 language | string | 問卷語系, 參閱 [問卷語系](#問卷語系)
 scoreType | string | 計分方式, 參閱 [計分方式](#計分方式)
 remark | string | 備註
 status | string | 問卷狀態, 參閱 [問卷狀態](#問卷狀態)
 isPublic | boolean | 隱私設定, 參閱 [隱私設定](#隱私設定)
 dispatched | boolean | 派送狀態
 tenantName | string | 租戶名稱
 createTime | timestamp | 建立日期時間
 updateTime | timestamp | 更新日期時間
 

```javascript
{
    "httpCode": 200,
    "result": {
        "data": [
            {
                "id": "f783d4cd-f6e4-40e4-845a-44b227b71f2a",
                "name": "問卷標題",
                "language": "zh-CHT",
                "remark": "v1",
                "scoreType": "SECTION",
                "status": "NONE",
                "isPublic": false,
                "dispatched": false,
                "createTime": 1657100732058,
                "updateTime": 1657100732058,
                "tenantName": "緯創醫學"
            }
        ],
        "pagination": {
            "current": 1,
            "pageSize": 10,
            "total": 1
        },
        "sorter": {
            "field": "updateTime",
            "order": "desc"
        },
        "total": 1
    }
}
```


## 取得問卷管理明細

```url
POST /questionnaire-mgmt/questionnaire/info
```

### Request
 欄位 | 型態  | 必填 | 長度限制 | 預設 | 說明  
 ---|---|---|---|---|---
 id | string | Y | 36 | | 問卷id 
 
```javascript
{
    "id": "f783d4cd-f6e4-40e4-845a-44b227b71f2a"
}
```

### Error
 httpCode | 錯誤碼 | 說明
 --- | --- | ---
 400 | API_ERROR.NOT_EXIST | 無此筆資料

### Response
 欄位 | 型態 | 說明 
 ---  | --- | ---
 id | string | 問卷id 
 tenantId | string | 租戶id
 tenantName | string | 租戶名稱
 tenantShortName | string | 租戶簡稱
 name | string | 問卷名稱
 language | string | 問卷語系, 參閱 [問卷語系](#問卷語系)
 description | string | 問卷說明
 remark | string | 備註
 scoreType | string | 計分方式, 參閱 [計分方式](#計分方式)
 status | string | 問卷狀態, 參閱 [問卷狀態](#問卷狀態)
 isPublic | boolean | 隱私設定, 參閱 [隱私設定](#隱私設定)
 dispatched | boolean | 派送狀態
 createTime | timestamp | 建立日期時間
 updateTime | timestamp | 更新日期時間
 sections | json array | 問卷區段json object array
 generalScoreRule | json | 不分區計分規則json object
 
#### 問卷區段 section (json object)
 欄位 | 型態 | 說明 
 ---  | --- | ---
 id | string | 問卷區段id
 questionnaireId | string | 問卷id
 seq | int | 排序序號
 title | string | 區段名稱
 description | string | 說明
 objectKey | string | 圖檔 objectKey
 url | string | 圖檔 url
 questionData | json array | 問題 json object array
 scoreRule | json | 分區計分規則json object

#### 問題 question (json object)
 欄位 | 型態 | 說明 
 ---  | --- | ---
 id | string | 問題id
 questionnaireId | string | 問卷id
 sectionId | string | 問卷區段id
 seq | int | 排序序號
 title | string | 問題題目
 questionType | string | 題型設定, 請參閱 [題型類別](#題型類別)
 required | boolean | 是否必填
 requireScored | boolean | 是否計分
 objectKey | string | 圖檔 objectKey
 url | string | 圖檔 url
 options | json array | 問題選項 json object array

#### 問題選項 option (json object)
 欄位 | 型態 | 說明 
 ---  | --- | ---
 id | string | 問題選項id
 questionnaireId | string | 問卷id
 questionId | string | 問題id
 seq | int | 排序序號
 name | string | 選項名稱
 score | decimal | 選項分數
 canInput | boolean | 該選項是否自帶輸入框

#### 計分規則 scoreRule (json object)
 欄位 | 型態 | 說明 
 ---  | --- | ---
 id | string | 規則id
 questionnaireId | string | 問卷id
 scoreType | string | 計分方式, 參閱 [計分方式](#計分方式)
 sectionId | string | 問卷區段id
 showScore | boolean | 是否顯示分數
 showLevel | boolean | 是否顯示分級
 showDescription | boolean | 是否顯示說明
 levels | json array | 規則分級 json object array

#### 規則分級 scoreLevel (json object)
 欄位 | 型態 | 說明 
 ---  | --- | ---
 id | string | 規則分級id
 questionnaireId | string | 問卷id
 ruleId | string | 規則id
 seq | int | 排序序號
 op | string | 規則分級條件運算子, 請參閱 [計分規則運算子](#計分規則運算子)
 leftScore | decimal | 分級條件的左邊分數
 rightScore | decimal | 分級條件的右邊分數
 level | string | 分級名稱
 description | string | 分級說明


```javascript
{
    "httpCode": 200,
    "result": {
        "data": {
            "id": "f783d4cd-f6e4-40e4-845a-44b227b71f2a",
            "tenantId": "WMT",
            "name": "問卷標題",
            "language": "zh-CHT",
            "description": "問卷說明",
            "remark": "v1",
            "scoreType": "SECTION",
            "status": "NONE",
            "isPublic": false,
            "createTime": 1657100732058,
            "updateTime": 1657100732058,
            "dispatched": false,
            "tenantName": "緯創醫學",
            "sections": [
                {
                    "id": "ec735929-e073-4fa3-8afc-517258dad27e",
                    "questionnaireId": "f783d4cd-f6e4-40e4-845a-44b227b71f2a",
                    "seq": 1,
                    "title": "區段名稱",
                    "description": "區段說明",
                    "objectKey": "questionnaire/878b9dad-2dda-4430-9f65-34a521080a11.jpg",
                    "url": "http://content-service/swift/v1/questionnaire/878b9dad-2dda-4430-9f65-34a521080a11.jpg"
                    "questionData": [
                        {
                            "id": "d3c7904c-e6e0-4b98-be43-c8a8bea8d031",
                            "questionnaireId": "f783d4cd-f6e4-40e4-845a-44b227b71f2a",
                            "sectionId": "ec735929-e073-4fa3-8afc-517258dad27e",
                            "seq": 1,
                            "title": "輸入問題",
                            "questionType": "SINGLE",
                            "required": true,
                            "requireScored": true,
                            "objectKey": "xxxxxxxxxxx",
                            "options": [
                                {
                                    "id": "d57dd118-7f29-433e-b101-10a2bef93dd1",
                                    "questionnaireId": "f783d4cd-f6e4-40e4-845a-44b227b71f2a",
                                    "questionId": "d3c7904c-e6e0-4b98-be43-c8a8bea8d031",
                                    "seq": 1,
                                    "name": "選項1"
                                },
                                {
                                    "id": "96e81351-1c21-412c-a95e-eae22b775d2d",
                                    "questionnaireId": "f783d4cd-f6e4-40e4-845a-44b227b71f2a",
                                    "questionId": "d3c7904c-e6e0-4b98-be43-c8a8bea8d031",
                                    "seq": 2,
                                    "name": "選項2",
                                    "score": 2.0
                                },
                                {
                                    "id": "4d8f3d13-3282-4a66-9192-473de469405f",
                                    "questionnaireId": "f783d4cd-f6e4-40e4-845a-44b227b71f2a",
                                    "questionId": "d3c7904c-e6e0-4b98-be43-c8a8bea8d031",
                                    "seq": 3,
                                    "name": "選項3",
                                    "score": 3.0
                                }
                            ]
                        }
                    ],
                    "scoreRule": {
                        "id": "e7c78024-09f0-4e09-950c-f778163d411b",
                        "questionnaireId": "f783d4cd-f6e4-40e4-845a-44b227b71f2a",
                        "scoreType": "SECTION",
                        "sectionId": "ec735929-e073-4fa3-8afc-517258dad27e",
                        "showScore": true,
                        "showLevel": true,
                        "showDescription": true,
                        "levels": [
                            {
                                "id": "131d043d-584a-4874-b193-315c46711ed6",
                                "questionnaireId": "f783d4cd-f6e4-40e4-845a-44b227b71f2a",
                                "ruleId": "e7c78024-09f0-4e09-950c-f778163d411b",
                                "seq": 1,
                                "op": "GE",
                                "rightScore": 15.0,
                                "level": "輕微1",
                                "description": "沒事啦1"
                            },
                            {
                                "id": "41259d95-b825-4614-925b-ea47669838fe",
                                "questionnaireId": "f783d4cd-f6e4-40e4-845a-44b227b71f2a",
                                "ruleId": "e7c78024-09f0-4e09-950c-f778163d411b",
                                "seq": 2,
                                "op": "LT",
                                "rightScore": 15.0,
                                "level": "輕微2",
                                "description": "沒事啦22"
                            },
                            {
                                "id": "cf557a1d-c334-46f1-88c7-441725e4d45e",
                                "questionnaireId": "f783d4cd-f6e4-40e4-845a-44b227b71f2a",
                                "ruleId": "e7c78024-09f0-4e09-950c-f778163d411b",
                                "seq": 3,
                                "op": "GT",
                                "rightScore": 12.0,
                                "level": "輕微3",
                                "description": "沒事啦333"
                            },
                            {
                                "id": "cebf914d-1b6f-4082-b091-c547ea5dd421",
                                "questionnaireId": "f783d4cd-f6e4-40e4-845a-44b227b71f2a",
                                "ruleId": "e7c78024-09f0-4e09-950c-f778163d411b",
                                "seq": 4,
                                "op": "GE",
                                "rightScore": 12.0,
                                "level": "輕微4",
                                "description": "沒事啦4444"
                            },
                            {
                                "id": "f24afbbc-6cea-474b-9fa0-6f2455766b76",
                                "questionnaireId": "f783d4cd-f6e4-40e4-845a-44b227b71f2a",
                                "ruleId": "e7c78024-09f0-4e09-950c-f778163d411b",
                                "seq": 5,
                                "op": "BTW",
                                "leftScore": 12.0,
                                "rightScore": 15.0,
                                "level": "輕微5",
                                "description": "沒事啦55555"
                            }
                        ]
                    }
                }
            ]
        }
    }
}
```


## 取得上傳網址

```url
POST /questionnaire-mgmt/questionnaire/get-upload-url
```

*  新增/編輯問卷時用來上傳縮圖

### Request
 欄位 | 型態  | 必填 | 長度限制 | 預設 | 說明 
 ---|---|---|---|---|---
 isMultipart | boolean | Y | | false | 是否使用分段上傳
 fileName    | String | Y | 50 | | 檔名，不包含副檔名，限制最多50字
 fileType    | String | Y | 10 | | 副檔名, 限制最多10字
 totalPart   | int    | **Y** (isMultipart=true) | | 總分塊數量，不可小於2
 parts       | Array [...part] | **Y** (isMultipart=true) | | part 資訊 

#### part (json object)

 欄位 | 型態  | 必填 | 長度限制 | 預設 | 說明 
 ---|---|---|---|---|---
 chunkSize | int | Y | | | 該 chunk 的大小, bytes
 md5 | string | Y | 256 | | 該 part 的 md5
 part | int | Y | | | part number, 第幾塊 chunk


```javascript
// 單檔
{
    "isMultipart": false,
    "fileName": "cofee_time",
    "fileType": "png"
}
// 分塊上傳
{
    "isMultipart": true,
    "fileName": "giphy (7)",
    "fileType": "mp4",
    "totalPart": 2,
    "parts": [
    	{
    		"chunkSize": 5242880,
    		"md5": "5AACA89868CD486D81192221CF9F9415",
    		"part": 1
    	},
    	{
    		"chunkSize": 3145728,
    		"md5": "5AACA89868CD486D81192221CF9F9415",
    		"part": 2
    	}
    ]
}
```

###  Response
 欄位 | 型態 | 說明 
 ---  | --- | ---
 objectKey | string | storage 中的 objectKey, **unique** 
 uploadId | string | 識別該次上傳的 uploadId 
 fileName | string | 名稱 
 fileType | string | 副檔名 
 url | string | 單檔上傳的時候，才會回傳該 url, 時效 3600 秒
 parts | [...part] | multipart上傳各part的url

#### part (json object)
 
 欄位 | 型態 | 說明 
 ---  | --- | ---
 chunkSize | int | 該 chunk 的大小, bytes
 md5 | string | 該 part 的 md5
 part | int | part number, 第幾塊 chunk
 url | string | 可上傳的 url, 時效 3600 秒

```javascript
// HttpStatus:422, 上傳的檔案類型不允許
{
    "errorMsg": "SERVICE_ERROR.UPLOAD_FILE_TYPE_NOT_ALLOWED",
    "httpCode": 422
}

// HttpStatus: 200
// 單檔
{
    "httpCode": 200,
    "result": {
        "data": {
            "objectKey": "questionnaire/275dce23-8ff5-4def-a780-007a50be1bca.png",
            "uploadId": "dd9177f7-3ca8-4296-b587-6d6334643eea",
            "fileName": "cofee_time",
            "fileType": "png",
            "url": "http://swift-storage/questionnaire/275dce23-8ff5-4def-a780-007a50be1bca.png"
        }
    }
}
// 分塊上傳
{
    "httpCode": 200,
    "result": {
        "data": {
            "objectKey": "questionnaire/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/questionnaire%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/questionnaire%2Ff76adf26-1e22-4b18-980d-b9a68efc5171.mp4%2F2?temp_url_sig=ad71de81dfbcd94bce4a091f2630c6f1373ff3cd&temp_url_expires=1554263771"
                }
            ]
        }
    }
}
```


## 新增問卷

```url
POST /questionnaire-mgmt/questionnaire/add
```

* 隱私設定說明：
 - 只開放給平台管理員可以設定, 一般租戶/企客不能設定此欄位, 預設是不公開
 - 平台管理員設定為公開的問卷, 一般租戶/企客在問卷設計列表可以看見公開問卷, 並可以在問卷群組裡使用, 派送

### Request
 欄位 | 型態  | 必填 | 長度限制 | 預設 | 說明 
 ---|---|---|---|---|---
 name | string | Y | 500 | | 問卷名稱
 language | string | Y | 20 | | 問卷語系, 參閱 [問卷語系](#問卷語系)
 description | string | | 2000 | | 問卷說明
 remark | string | | 1000 | | 備註
 scoreType | string | Y | 20 | | 計分方式, 參閱 [計分方式](#計分方式)
 isPublic | boolean | **Y** (role=PlatformAdmin) | | false | 隱私設定, 參閱 [隱私設定](#隱私設定)
 status | string | | 20 | | 問卷狀態, 新增時只可帶入NONE 或 ON, 若未帶值,系統預設為NONE, 參閱 [問卷狀態](#問卷狀態)
 generalScoreRule | json | **Y** (scoreType=NO_SECTION) | |  | 不分區計分規則json object, 參閱 [request-計分規則](#request-計分規則-scoreRule-json-object)
 sections | json array | Y | | | 問卷區段json object array, 參閱 [request-問卷區段](#request-問卷區段-section-json-object)
 
#### request-問卷區段 section (json object)
 欄位 | 型態  | 必填 | 長度限制 | 預設 | 說明 
 ---|---|---|---|---|---
 seq | int | Y | | | 排序序號, 以1啟始, 不可重複
 title | string | | 500 | | 區段名稱
 description | string | | 2000 | | 區段說明
 questionData | json array | Y | | | 問題 json object array
 scoreRule | json | **Y** (問卷計分方式scoreType=SECTION) | | | 分區計分規則json object
 objectKey | string | | 200 | | 圖檔objectKey, 先取得圖檔上傳網址並上傳成功，取其 objectKey。
 isMultipart | boolean | | | | 圖檔上傳時是否分塊上傳，預設為 false
 totalPart | int | **Y** (isMultipart=true) | | | 圖檔上傳的總分塊數量，不可小於2
 uploadId | string | **Y** (isMultipart=true) | 100 | | 從 /questionnaire-mgmt/questionnaire/get-upload-url 取得的 uploadId

#### request-問題 question (json object)
 欄位 | 型態  | 必填 | 長度限制 | 預設 | 說明 
 ---|---|---|---|---|---
 seq | int | Y | | | 排序序號, 以1啟始, 不可重複
 title | string | Y | 2000 | | 問題題目
 questionType | string | Y | 20 | | 題型設定, 請參閱 [題型類別](#題型類別)
 required | boolean | Y | | | 是否必填
 requireScored | boolean | | | | 是否計分
 options | json array | **Y** (questionType=SINGLE、MULTIPLE、DROPDOWN) | | | 問題選項 json object array, <BR/>**questionType=SINGLE、MULTIPLE、DROPDOWN時, 最少2項, 最多10項**<BR/>**questionType=TEXT、DATE、TIME時, 不會有options**
 objectKey | string | | 200 | | 圖檔objectKey, 先取得圖檔上傳網址並上傳成功，取其 objectKey。
 isMultipart | boolean | | | | 圖檔上傳時是否分塊上傳，預設為 false
 totalPart | int | **Y** (isMultipart=true) | | | 圖檔上傳的總分塊數量，不可小於2
 uploadId | string | **Y** (isMultipart=true) | 100 | | 從 /questionnaire-mgmt/questionnaire/get-upload-url 取得的 uploadId

#### request-問題選項 option (json object)
 欄位 | 型態  | 必填 | 長度限制 | 預設 | 說明 
 ---|---|---|---|---|---
 seq | int | Y | | | 排序序號, 以1啟始, 不可重複
 name | string | Y | 2000 | | 選項名稱
 score | double | | | | 選項分數
 canInput | Boolean | | | | 該選項是否自帶輸入框

#### request-計分規則 scoreRule (json object)
 欄位 | 型態  | 必填 | 長度限制 | 預設 | 說明 
 ---|---|---|---|---|---
 showScore | boolean | Y | | | 是否顯示分數
 showLevel | boolean | Y | | | 是否顯示分級
 showDescription | boolean | Y | | | 是否顯示說明
 levels | json array | Y | | | 規則分級 json object array

#### request-規則分級 scoreLevel (json object)
 欄位 | 型態  | 必填 | 長度限制 | 預設 | 說明 
 ---|---|---|---|---|---
 seq | int | Y | | | 排序序號, 以1啟始, 不可重複
 op | string | Y | 5 | | 規則分級條件運算子, 請參閱 [計分規則運算子](#計分規則運算子)
 leftScore | decimal | **Y** (op=BTW) | | | 分級條件的左邊分數
 rightScore | decimal | Y | | | 分級條件的右邊分數
 level | string | | 100 | | 分級名稱
 description | string | | 2000 | | 分級說明


```javascript
{
   "name": "問卷標題",
   "language": "zh-CHT",
   "description": "問卷說明",
   "remark": "v1",
   "scoreType": "SECTION",
   "isPublic": false,
   "generalScoreRule": null,
   "status": null,
   "sections": [
     {
       "seq":1,
       "title": "區段名稱",
       "description": "區段說明",
       "objectKey": "questionnaire/878b9dad-2dda-4430-9f65-34a521080a11.jpg",
       "scoreRule": {
         "showScore": true,
         "showLevel": true,
         "showDescription": true,
         "levels": [
           {
             "seq": 1,
             "leftScore": null,
             "rightScore": 15,
             "op": "GE",
             "level": "輕微1",
             "description": "沒事啦1"
           },
           {
             "seq": 2,
             "leftScore": null,
             "rightScore": 15,
             "op": "LT",
             "level": "輕微2",
             "description": "沒事啦22"
           }
         ]
       },
       "questionData": [
         {
           "seq": 1,
           "title": "輸入問題",
           "description": "說明",
           "questionType": "SINGLE",
           "required": true,
           "requireScored": true,
           "objectKey": "xxxxxxxxxxx",
           "options": [
             {
               "seq": 1,
               "name": "選項1",
               "score": null
             },
             {
               "seq": 2,
               "name": "選項2",
               "score": 2
             }
           ]
         }
       ]
     }
   ]
 }
```

### Error
 httpCode | 錯誤碼 | 說明
 --- | --- | ---
 400 | API_ERROR.ARGUMENT_ERROR | 輸入參數錯誤, 可參閱 errorDesc

### Response
 欄位 | 型態 | 說明 
 ---  | --- | ---
 id | string | 問卷id 
 tenantId | string | 租戶id
 name | string | 問卷名稱
 language | string | 問卷語系, 參閱 [問卷語系](#問卷語系)
 description | string | 問卷說明
 remark | string | 備註
 scoreType | string | 計分方式, 參閱 [計分方式](#計分方式)
 isPublic | boolean | 隱私設定, 參閱 [隱私設定](#隱私設定)
 status | string | 問卷狀態, 參閱 [問卷狀態](#問卷狀態)
 dispatched | boolean | 派送狀態
 createTime | timestamp | 建立日期時間
 updateTime | timestamp | 更新日期時間

```javascript
{
    "httpCode": 200,
    "result": {
        "data": {
            "id": "f783d4cd-f6e4-40e4-845a-44b227b71f2a",
            "tenantId": "WMT",
            "name": "問卷標題",
            "language": "zh-CHT",
            "description": "問卷說明",
            "remark": "v1",
            "scoreType": "SECTION",
            "isPublic": false,
            "status": "NONE",
            "creator": "a1131b35-dab0-4593-899b-9485356e02d4",
            "dispatched": false,
            "createTime": 1657100732058,
            "updateTime": 1657100732058
        }
    }
}
```

## 編輯問卷

```url
POST /questionnaire-mgmt/questionnaire/update
```

* 只允許未啟用或停用但尚未派送的問卷可以編輯
* 若要編輯已啟用但尚未派送的問卷, 需先將問卷停用後再進行編輯
* 編輯問卷時, 只會保留問卷主檔資料做更新, 其餘問卷區段 sections, 問題題目 questions, 題目選項 options, 計分規則 scoreRules, 計分分級 scoreLevels 都會先刪除舊的資料再新增進去

### Request
 欄位 | 型態  | 必填 | 長度限制 | 預設 | 說明 
 ---|---|---|---|---|---
 id | string | Y | 36 | | 問卷id
 name | string | Y | 500 | | 問卷名稱
 language | string | Y | 20 | | 問卷語系, 參閱 [問卷語系](#問卷語系)
 description | string | | 2000 | | 問卷說明
 remark | string | | 1000 | | 備註
 scoreType | string | Y | 20 | | 計分方式, 參閱 [計分方式](#計分方式)
 isPublic | boolean | **Y** (role=PlatformAdmin) | | false | 隱私設定, 參閱 [隱私設定](#隱私設定)
 status | string | Y | 20 | | 問卷狀態, 原本狀態為NONE時可變更為ON, 原本狀態為ON時可變更為OFF, 參閱 [問卷狀態](#問卷狀態)
 generalScoreRule | json | **Y** (scoreType=NO_SECTION) | | | 不分區計分規則json object, 參閱 [request-計分規則](#request-計分規則-scoreRule-json-object)
 sections | json array | Y | | | 問卷區段json object array, 參閱 [request-問卷區段](#request-問卷區段-section-json-object)


```javascript
{
  "id": "f783d4cd-f6e4-40e4-845a-44b227b71f2a",
  "name": "問卷標題",
  "language": "zh-CHT",
  "description": "問卷說明",
  "remark": "v1",
  "scoreType": "SECTION",
  "isPublic": false,
  "generalScoreRule": null,
  "status": "ON",
  "sections": [
    {
      "seq":1,
      "title": "區段名稱",
      "description": "區段說明",
      "objectKey": "questionnaire/878b9dad-2dda-4430-9f65-34a521080a11.jpg",
      "scoreRule": {
        "showScore": true,
        "showLevel": true,
        "showDescription": true,
        "levels": [
          {
            "seq": 1,
            "leftScore": null,
            "rightScore": 15,
            "op": "GE",
            "level": "輕微1",
            "description": "沒事啦1"
          },
          {
            "seq": 2,
            "leftScore": null,
            "rightScore": 15,
            "op": "LT",
            "level": "輕微2",
            "description": "沒事啦22"
          }
        ]
      },
      "questionData": [
        {
          "seq": 1,
          "title": "輸入問題",
          "description": "說明",
          "questionType": "SINGLE",
          "required": true,
          "requireScored": true,
          "objectKey": "xxxxxxxxxxx",
          "options": [
            {
              "seq": 1,
              "name": "選項1",
              "score": null
            },
            {
              "seq": 2,
              "name": "選項2",
              "score": 2
            }
          ]
        }
      ]
    }
  ]
}
```

### Error
 httpCode | 錯誤碼 | 說明
 --- | --- | ---
 400 | API_ERROR.NOT_EXIST | 無此筆資料
 400 | API_ERROR.ARGUMENT_ERROR | 輸入參數錯誤, 可參閱 errorDesc
 422 | SERVICE_ERROR.QUESTIONNAIRE_UPDATE_NOT_ALLOWED | 不允許編輯已啟用或已派送問卷

### Response
 欄位 | 型態 | 說明 
 ---  | --- | ---
 id | string | 問卷id 
 tenantId | string | 租戶id
 name | string | 問卷名稱
 language | string | 問卷語系, 參閱 [問卷語系](#問卷語系)
 description | string | 問卷說明
 remark | string | 備註
 scoreType | string | 計分方式, 參閱 [計分方式](#計分方式)
 isPublic | boolean | 隱私設定, 參閱 [隱私設定](#隱私設定)
 status | string | 問卷狀態, 參閱 [問卷狀態](#問卷狀態)
 dispatched | boolean | 派送狀態
 createTime | timestamp | 建立日期時間
 updateTime | timestamp | 更新日期時間

```javascript
{
    "httpCode": 200,
    "result": {
        "data": {
            "id": "f783d4cd-f6e4-40e4-845a-44b227b71f2a",
            "tenantId": "WMT",
            "name": "問卷標題",
            "language": "zh-CHT",
            "description": "問卷說明",
            "remark": "v1",
            "scoreType": "SECTION",
            "isPublic": false,
            "status": "NONE",
            "creator": "a1131b35-dab0-4593-899b-9485356e02d4",
            "dispatched": false,
            "createTime": 1657100732058,
            "updateTime": 1657100732058
        }
    }
}
```


## 編輯問卷狀態

* 未啟用可以變更為已啟用
* 已啟用可以變更為停用
* 已停用可以變更為已啟用

```url
POST /questionnaire-mgmt/questionnaire/update-status
```

### Request
 欄位 | 型態  | 必填 | 長度限制 | 預設 | 說明 
 ---|---|---|---|---|---
 id | string | Y | 36 | | 問卷id
 status | string | Y | 20 | | 問卷狀態, 原本狀態為NONE/OFF時可變更為ON, 原本狀態為ON時可變更為OFF, 參閱 [問卷狀態](#問卷狀態)
 

```javascript
{
  "id": "f783d4cd-f6e4-40e4-845a-44b227b71f2a",
  "status": "ON"
}
```

### Error
 httpCode | 錯誤碼 | 說明
 --- | --- | ---
 400 | API_ERROR.NOT_EXIST | 無此筆資料
 400 | API_ERROR.ARGUMENT_ERROR | 輸入參數錯誤, 可參閱 errorDesc
 403 | API_ERROR.PERMISSION_DENIED | 無此操作權限
 422 | SERVICE_ERROR.QUESTIONNAIRE_UPDATE_NOT_ALLOWED | 不允許編輯已啟用或已派送問卷

### Response
 欄位 | 型態 | 說明 
 ---  | --- | ---
 id | string | 問卷id 
 tenantId | string | 租戶id
 name | string | 問卷名稱
 language | string | 問卷語系, 參閱 [問卷語系](#問卷語系)
 description | string | 問卷說明
 remark | string | 備註
 scoreType | string | 計分方式, 參閱 [計分方式](#計分方式)
 isPublic | boolean | 隱私設定, 參閱 [隱私設定](#隱私設定)
 status | string | 問卷狀態, 參閱 [問卷狀態](#問卷狀態)
 dispatched | boolean | 派送狀態
 createTime | timestamp | 建立日期時間
 updateTime | timestamp | 更新日期時間

```javascript
{
    "httpCode": 200,
    "result": {
        "data": {
            "id": "f783d4cd-f6e4-40e4-845a-44b227b71f2a",
            "tenantId": "WMT",
            "name": "問卷標題",
            "language": "zh-CHT",
            "description": "問卷說明",
            "remark": "v1",
            "scoreType": "SECTION",
            "isPublic": false,
            "status": "ON",
            "creator": "a1131b35-dab0-4593-899b-9485356e02d4",
            "dispatched": false,
            "createTime": 1657100732058,
            "updateTime": 1657100732058
        }
    }
}
```


## 刪除問卷

```url
POST /questionnaire-mgmt/questionnaire/delete
```

* 未啟用問卷才允許刪除

### Request
 欄位 | 型態  | 必填 | 長度限制 | 預設 | 說明  
 ---|---|---|---|---|---
 id | string | Y | 36 | | 問卷id
 
```javascript
{
    "id": "c4ede7cd-8602-43fe-9f72-cfe5146d8a3c"
}
```

### Error
 httpCode | 錯誤碼 | 說明
 --- | --- | ---
 400 | API_ERROR.NOT_EXIST | 無此筆資料
 400 | API_ERROR.ARGUMENT_ERROR | 輸入參數錯誤, 可參閱 errorDesc
 403 | API_ERROR.PERMISSION_DENIED | 無此操作權限
 422 | SERVICE_ERROR.QUESTIONNAIRE_DELETE_NOT_ALLOWED | 不允許刪除已啟用或已派送問卷

### Response
 欄位 | 型態 | 說明 
 ---  | --- | ---
 count | int | 刪除筆數, > 0 表示成功刪除

```javascript
{
    "httpCode": 200,
    "result": {
        "data": {
            "count": 1
        }
    }
}
```

---
## 撤銷問卷

```url
POST /questionnaire-mgmt/questionnaire/update-mark-delete-status
```

* 針對不可刪除的問卷可以透過撤銷讓此問卷呈現和刪除相同效果. 但相關資料都還留存在資料庫內

### Request
 欄位 | 型態  | 必填 | 長度限制 | 預設 | 說明  
 ---|---|---|---|---|---
 id | string | Y | 36 | | 問卷id
 isMarkDelete|boolean|Y|||是否撤除問卷, 目前僅允許TRUE

 
```javascript
{
    "id": "c4ede7cd-8602-43fe-9f72-cfe5146d8a3c",
    "isMarkDelete": true     
}
```

### Error
 httpCode | 錯誤碼 | 說明
 --- | --- | ---
 400 | API_ERROR.NOT_EXIST | 無此筆資料
 400 | API_ERROR.ARGUMENT_ERROR | 輸入參數錯誤, 可參閱 errorDesc
 403 | API_ERROR.PERMISSION_DENIED | 無此操作權限
 422 | SERVICE_ERROR.QUESTIONNAIRE_UPDATE_MARK_DELETE_STATUS_NOT_ALLOWED | 不允許修改撤銷狀態

### Response
 欄位 | 型態 | 說明 
 ---  | --- | ---
 id | string | 問卷id 
 tenantId | string | 租戶id
 name | string | 問卷名稱
 language | string | 問卷語系, 參閱 [問卷語系](#問卷語系)
 description | string | 問卷說明
 remark | string | 備註
 scoreType | string | 計分方式, 參閱 [計分方式](#計分方式)
 isPublic | boolean | 隱私設定, 參閱 [隱私設定](#隱私設定)
 status | string | 問卷狀態, 參閱 [問卷狀態](#問卷狀態)
 dispatched | boolean | 派送狀態
 createTime | timestamp | 建立日期時間
 updateTime | timestamp | 更新日期時間

```javascript
{
    "httpCode": 200,
    "result": {
        "data": {
            "id": "f783d4cd-f6e4-40e4-845a-44b227b71f2a",
            "tenantId": "WMT",
            "name": "問卷標題",
            "language": "zh-CHT",
            "description": "問卷說明",
            "remark": "v1",
            "scoreType": "SECTION",
            "isPublic": false,
            "status": "ON",
            "creator": "a1131b35-dab0-4593-899b-9485356e02d4",
            "dispatched": false,
            "createTime": 1657100732058,
            "updateTime": 1657100732058
        }
    }
}
```

---

## 問卷群組列表

```url
POST /questionnaire-mgmt/group/list
```

### Request
#### query (查詢條件json)
 欄位 | 型態  | 必填 | 長度限制 | 預設 | 說明  
 ---|---|---|---|---|---
 keyword | string | | 50 | | 關鍵字, 查詢問卷群組名稱
 dispatched | boolean | | | | 派送狀態, 未填則表示查詢全部狀態
 
#### pagination (分頁json)
 欄位 | 型態  | 必填 | 預設 | 說明
 ---|---|---|---|---
 current | int | | 1 | 當前頁數 
 pageSize | int | | 10 | 每頁結果數量，-1 為顯示所有
 
#### sorter (排序json) 
 欄位 | 型態  | 必填 | 預設 | 說明
 ---|---|---|---|--- 
 field | string | | createTime | 排序欄位,可排序欄位有 createTime, name, dispatched, updateTime 
 order | string | | desc | 升序或降序 

```javascript
{
    "query": {
        "keyword": null,
        "dispatched": null
    } ,
    "pagination": {
        "current": 1,
        "pageSize": -1
    }, 
    "sorter": {
        "field": "updateTime",
        "order": "desc"
    }
}
```

### Response-問卷群組列表
 欄位 | 型態 | 說明 
 ---  | --- | ---
 id | string | 問卷群組id
 tenantId | string | 租戶id
 name | string | 問卷群組名稱
 quantity | int | 問卷數量
 dispatched | boolean | 派送狀態
 languages | string array | 問卷語系 array, 參閱 [問卷語系](#問卷語系)
 publicType | string | 問卷群組公開對象類別, 參閱 [問卷群組公開對象類別](#問卷群組公開對象類別)
 
```javascript
{
    "httpCode": 200,
    "result": {
        "data": [
            {
                "id": "c44c85b1-5d67-4787-bdc6-f6266656e3fd",
                "tenantId": "858b7fbb-3ba0-4d49-9882-c893a1ef07dc",
                "name": "自訂問卷群-1",
                "quantity": 2,
                "dispatched": false,
                "languages": [
                    "en-US",
                    "zh-CHT"
                ],
                "publicType": "01"
            }
        ],
        "pagination": {
            "current": 1,
            "pageSize": -1,
            "total": 1
        },
        "sorter": {
            "field": "updateTime",
            "order": "desc"
        },
        "total": 1
    }
}
```


## 取得問卷群組明細

```url
POST /questionnaire-mgmt/group/info
```

### Request
 欄位 | 型態  | 必填 | 長度限制 | 預設 | 說明  
 ---|---|---|---|---|---
 id | string | Y | 36 | | 問卷群組id 
 
```javascript
{
    "id": "c44c85b1-5d67-4787-bdc6-f6266656e3fd"
}
```

### Error
 httpCode | 錯誤碼 | 說明
 --- | --- | ---
 400 | API_ERROR.NOT_EXIST | 無此筆資料

### Response
 欄位 | 型態 | 說明 
 ---  | --- | ---
 id | string | 問卷群組id
 tenantId | string | 租戶id
 name | string | 問卷群組名稱
 quantity | int | 問卷數量
 dispatched | boolean | 派送狀態
 createTime | timestamp | 建立日期時間
 updateTime | timestamp | 更新日期時間
 details | json array | 問卷區段json object array
 publicType | string | 問卷群組公開對象類別, 參閱 [問卷群組公開對象類別](#問卷群組公開對象類別)
 tenants | json array | 問卷群組限定對象租戶列表 json object array, publicType=03 (限定對象)時才有資料
 
#### 群組明細 details (json object)
 欄位 | 型態 | 說明 
 ---  | --- | ---
 groupId | string | 問卷群組id
 questionnaireId | string | 問卷id
 seq | int | 排序序號
 language | string | 問卷語系, 參閱 [問卷語系](#問卷語系)
 tenantId | string | 問卷租戶id
 name | string | 問卷名稱
 description | string | 問卷說明
 remark | string | 問卷備註
 status | string | 問卷狀態, 參閱 [問卷狀態](#問卷狀態)
 dispatched | boolean | 問卷派送狀態

#### 問卷群組公開對象租戶列表 tenants (json object)
 欄位 | 型態 | 說明 
 ---  | --- | ---
 groupId | string | 問卷群組id
 tenantId | string | 限定對象租戶id
 seq | int | 排序序號
 tenantName | string | 限定對象租戶名稱
 tenantShortName | string | 限定對象租戶簡稱

```javascript
{
    "httpCode": 200,
    "result": {
        "data": {
            "id": "6010bd71-a39e-4987-bf5f-1537893f137d",
            "tenantId": "WMT",
            "name": "問卷群組-限定對象",
            "quantity": 2,
            "dispatched": false,
            "createTime": 1683513785432,
            "updateTime": 1683513785432,
            "details": [
                {
                    "groupId": "6010bd71-a39e-4987-bf5f-1537893f137d",
                    "questionnaireId": "7e57aa1c-b328-4742-a4b1-1ad6a98a7d73",
                    "language": "zh-CHT",
                    "seq": 1,
                    "tenantId": "WMT",
                    "name": "智力測驗-copy",
                    "description": "",
                    "remark": "多語系群組",
                    "status": "ON",
                    "dispatched": true
                }, ...
            ],
            "publicType": "03",
            "tenants": [
                {
                    "groupId": "6010bd71-a39e-4987-bf5f-1537893f137d",
                    "tenantId": "858b7fbb-3ba0-4d49-9882-c893a1ef07dc",
                    "seq": 1,
                    "tenantName": "緯緯醫學",
                    "tenantShortName": "緯緯"
                }, ...
            ]
        }
    }
}
```


## 取得已啟用問卷列表

```url
POST /questionnaire-mgmt/group/questionnaire-list
```

### Request
#### query (查詢條件json)
 欄位 | 型態  | 必填 | 長度限制 | 預設 | 說明  
 ---|---|---|---|---|---
 keyword | string | | 50 | | 關鍵字, 查詢問卷名稱
 
#### pagination (分頁json)
 欄位 | 型態  | 必填 | 預設 | 說明
 ---|---|---|---|---
 current | int | | 1 | 當前頁數 
 pageSize | int | | 10 | 每頁結果數量，-1 為顯示所有
 
#### sorter (排序json) 
 欄位 | 型態  | 必填 | 預設 | 說明
 ---|---|---|---|--- 
 field | string | | createTime | 排序欄位,可排序欄位有 createTime, name, language, dispatched, updateTime 
 order | string | | desc | 升序或降序 

```javascript
{
    "query": {
        "keyword": null
    } ,
    "pagination": {
        "current": 1,
        "pageSize": -1
    }, 
    "sorter": {
        "field": "updateTime",
        "order": "desc"
    }
}
```

### Response
 欄位 | 型態 | 說明 
 ---  | --- | ---
 id | string | 問卷id
 tenantId | string | 租戶id
 name | string | 問卷名稱 
 language | string | 問卷語系, 參閱 [問卷語系](#問卷語系)
 scoreType | string | 計分方式, 參閱 [計分方式](#計分方式)
 remark | string | 備註
 status | string | 問卷狀態, 參閱 [問卷狀態](#問卷狀態)
 isPublic | boolean | 隱私設定, 參閱 [隱私設定](#隱私設定)
 dispatched | boolean | 派送狀態
 tenantName | string | 租戶名稱
 tenantShortName | string | 租戶簡稱
 createTime | timestamp | 建立日期時間
 updateTime | timestamp | 更新日期時間

 
```javascript
{
    "httpCode": 200,
    "result": {
        "data": [
            {
                "id": "9804cb8f-6f0a-48f4-9ba2-6779bd5c0b47",
                "tenantId": "858b7fbb-3ba0-4d49-9882-c893a1ef07dc",
                "name": "Questionnaire Title-11",
                "language": "en-US",
                "remark": "v1",
                "scoreType": "SECTION",
                "status": "ON",
                "createTime": 1658233907242,
                "updateTime": 1658233907242,
                "dispatched": false,
                "isPublic": false,
                "tenantName": "緯緯醫學",
                "tenantShortName": "丫緯"
            },
            ...
        ],
        "pagination": {
            "current": 1,
            "pageSize": -1,
            "total": 4
        },
        "sorter": {
            "field": "updateTime",
            "order": "desc"
        },
        "total": 4
    }
}
```


## 新增問卷群組

```url
POST /questionnaire-mgmt/group/add
```
* 群組明細的語系不可以重複
* 群組的公開對象設定欄位, 只有平台管理員可以設定, 非平台管理員只能設為01不公開

### Request
 欄位 | 型態  | 必填 | 長度限制 | 預設 | 說明 
 ---|---|---|---|---|---
 name | string | Y | 500 | | 問卷群組名稱
 details | json array | Y | | | 問卷群組明細json object array, 參閱 [request-問卷群組明細](#request-問卷群組明細-detail-json-object)
 publicType | string | Y | 2 | | 問卷群組公開對象類別, 參閱 [問卷群組公開對象類別](#問卷群組公開對象類別), 非平台管理員只能設定為01不公開
 tenants | json array | | | | 問卷群組限定對象租戶json array, 當publicType=03 時,必填
 
#### request-問卷群組明細 detail (json object)
 欄位 | 型態  | 必填 | 長度限制 | 預設 | 說明 
 ---|---|---|---|---|---
 seq | int | Y | | | 排序序號, 以1啟始, 不可重複
 questionnaireId | string | | 36 | | 問卷id

#### request-問卷群組限定對象租戶 tenants (json object)
 欄位 | 型態  | 必填 | 長度限制 | 預設 | 說明 
 ---|---|---|---|---|---
 tenantId | string | | 36 | | 租戶id


```javascript
{
  "name": "自訂問卷群-1",
  "details": [
    {
      "seq":1,
      "questionnaireId": "9804cb8f-6f0a-48f4-9ba2-6779bd5c0b47"
    },
    {
      "seq":2,
      "questionnaireId": "1c49f0f6-6493-440d-bdc4-56b4e7540cb0"
    }
  ], 
  "publicType": "03",
  "tenants": [
    {
      "tenantId": "858b7fbb-3ba0-4d49-9882-c893a1ef07dc"
    }
  ]
}
```

### Error
 httpCode | 錯誤碼 | 說明
 --- | --- | ---
 400 | API_ERROR.ARGUMENT_ERROR | 輸入參數錯誤, 可參閱 errorDesc

### Response
 欄位 | 型態 | 說明 
 ---  | --- | ---
 id | string | 問卷群組id 
 tenantId | string | 租戶id
 name | string | 問卷群組名稱
 dispatched | boolean | 派送狀態
 quantity | int | 問卷數量
 createTime | timestamp | 建立日期時間
 updateTime | timestamp | 更新日期時間
 publicType | string | 問卷群組公開對象類別, 參閱 [問卷群組公開對象類別](#問卷群組公開對象類別)

```javascript
{
    "httpCode": 200,
    "result": {
        "data": {
            "id": "c44c85b1-5d67-4787-bdc6-f6266656e3fd",
            "tenantId": "858b7fbb-3ba0-4d49-9882-c893a1ef07dc",
            "name": "自訂問卷群-1",
            "dispatched": false,
            "quantity": 2,
            "createTime": 1658234021187,
            "updateTime": 1658234021187,
            "publicType": "03"
        }
    }
}
```

## 編輯問卷群組

```url
POST /questionnaire-mgmt/group/update
```
* 已派送的問卷群組不可編輯
* 群組明細的語系不可以重複
* 群組的公開對象設定欄位, 只有平台管理員可以設定, 非平台管理員只能設為01不公開

### Request
 欄位 | 型態  | 必填 | 長度限制 | 預設 | 說明 
 ---|---|---|---|---|---
 id | string | Y | 36 | | 問卷群組id 
 name | string | Y | 500 | | 問卷群組名稱
 details | json array | Y | | | 問卷群組明細json object array, 參閱 [request-問卷群組明細](#request-問卷群組明細-detail-json-object)
 publicType | string | Y | 2 | | 問卷群組公開對象類別, 參閱 [問卷群組公開對象類別](#問卷群組公開對象類別), 非平台管理員只能設定為01不公開
 tenants | json array | | | | 問卷群組限定對象租戶json array, 當publicType=03 時,必填
 
#### request-問卷群組明細 detail (json object)
 欄位 | 型態  | 必填 | 長度限制 | 預設 | 說明 
 ---|---|---|---|---|---
 seq | int | Y | | | 排序序號, 以1啟始, 不可重複
 questionnaireId | string | | 36 | | 問卷id

#### request-問卷群組限定對象租戶 tenants (json object)
 欄位 | 型態  | 必填 | 長度限制 | 預設 | 說明 
 ---|---|---|---|---|---
 tenantId | string | | 36 | | 租戶id


```javascript
{
  "id": "c44c85b1-5d67-4787-bdc6-f6266656e3fd",
  "name": "自訂問卷群-11",
  "details": [
    {
      "seq":1,
      "questionnaireId": "9804cb8f-6f0a-48f4-9ba2-6779bd5c0b47",
      "language": "en-US"
    },
    {
      "seq":2,
      "questionnaireId": "6f251e85-6a88-409b-ad89-c579a134052b",
      "language": "zh-CHT"
    }
  ], 
  "publicType": "03",
  "tenants": [
    {
      "tenantId": "858b7fbb-3ba0-4d49-9882-c893a1ef07dc"
    }
  ]    
}
```

### Error
 httpCode | 錯誤碼 | 說明
 --- | --- | ---
 400 | API_ERROR.NOT_EXIST | 無此筆資料
 400 | API_ERROR.ARGUMENT_ERROR | 輸入參數錯誤, 可參閱 errorDesc
 403 | API_ERROR.PERMISSION_DENIED | 無此操作權限
 422 | SERVICE_ERROR.QUESTIONNAIRE_GROUP_UPDATE_NOT_ALLOWED | 不允許編輯已派送問卷群組


### Response
 欄位 | 型態 | 說明 
 ---  | --- | ---
 id | string | 問卷群組id 
 tenantId | string | 租戶id
 name | string | 問卷群組名稱
 dispatched | boolean | 派送狀態
 quantity | int | 問卷數量
 createTime | timestamp | 建立日期時間
 updateTime | timestamp | 更新日期時間
 publicType | string | 問卷群組公開對象類別, 參閱 [問卷群組公開對象類別](#問卷群組公開對象類別)

```javascript
{
    "httpCode": 200,
    "result": {
        "data": {
            "id": "c44c85b1-5d67-4787-bdc6-f6266656e3fd",
            "tenantId": "858b7fbb-3ba0-4d49-9882-c893a1ef07dc",
            "name": "自訂問卷群-1",
            "dispatched": false,
            "quantity": 2,
            "createTime": 1658234021187,
            "updateTime": 1658234021187,
            "publicType": "03"
        }
    }
}
```


## 刪除問卷群組

```url
POST /questionnaire-mgmt/group/delete
```

* 未派送的問卷群組才允許刪除

### Request
 欄位 | 型態  | 必填 | 長度限制 | 預設 | 說明  
 ---|---|---|---|---|---
 id | string | Y | 36 | | 問卷群組id
 
```javascript
{
  "id": "efd04fc0-371d-4cfc-9ae8-66c0dbf517a9"
}
```

### Error
 httpCode | 錯誤碼 | 說明
 --- | --- | ---
 400 | API_ERROR.NOT_EXIST | 無此筆資料
 403 | API_ERROR.PERMISSION_DENIED | 無此操作權限
 422 | SERVICE_ERROR.QUESTIONNAIRE_GROUP_DELETE_NOT_ALLOWED | 不允許刪除已派送問卷群組

### Response
 欄位 | 型態 | 說明 
 ---  | --- | ---
 count | int | 刪除筆數, > 0 表示成功刪除

```javascript
{
    "httpCode": 200,
    "result": {
        "data": {
            "count": 1
        }
    }
}
```


## 取得經銷列表
```url
POST /questionnaire-mgmt/group/dealer-list
```

### Request

### Response-取得經銷列表
 欄位 | 型態 | 說明 
 ---  | --- | ---
 id | string | 租戶id
 name | string | 租戶名稱

```javascript
{
    "httpCode": 200,
    "result": {
        "data": [
            {
                "id": "WMT",
                "name": "Health 365健康照護平台",
                "featureList": [],
                "industryTypeList": []
            },
            {
                "id": "71912123-f0ed-45df-af62-2e78edad0bb5",
                "name": "金生中醫診所",
                "featureList": [],
                "industryTypeList": []
            },
            ...
        ]
    }
}
```


## 取得經銷租戶列表
```url
POST /questionnaire-mgmt/group/dealer-tenant-list
```

### Request
#### query (查詢條件json)
 欄位 | 型態  | 必填 | 長度限制 | 預設 | 說明  
 ---|---|---|---|---|---
 dealerId | string | | 36 | | 經銷id
 nameKeyword | string | | 50 | | 關鍵字, 查詢租戶名稱

```javascript
{
    "query": {
        "dealerId": "71912123-f0ed-45df-af62-2e78edad0bb5",
        "nameKeyword": null
    }
}
```

### Response-取得經銷租戶列表
 欄位 | 型態 | 說明 
 ---  | --- | ---
 id | string | 租戶id
 name | string | 租戶名稱
 dealerId | string | 經銷id
 dealerName | string | 經銷名稱
 shortName | string | 租戶簡稱

```javascript
{
    "httpCode": 200,
    "result": {
        "data": [
            {
                "id": "858b7fbb-3ba0-4d49-9882-c893a1ef07dc",
                "name": "緯緯醫學",
                "dealerId": "71912123-f0ed-45df-af62-2e78edad0bb5",
                "dealerName": "金生中醫診所",
                "shortName": "緯緯",
                "featureList": [],
                "industryTypeList": []
            },
            {
                "id": "7696a8bb-9c1a-4e61-89ef-651bbfbfcbd0",
                "name": "opo3",
                "dealerId": "71912123-f0ed-45df-af62-2e78edad0bb5",
                "dealerName": "金生中醫診所",
                "featureList": [],
                "industryTypeList": []
            },
            ...
        ]
    }
}
```


---

## 問卷派送記錄列表

```url
POST /questionnaire-mgmt/dispatch/list
```

### Request
#### query (查詢條件json)
 欄位 | 型態  | 必填 | 長度限制 | 預設 | 說明  
 ---|---|---|---|---|---
 targetType | string | | 20 | | 派送對象類別, 參閱 [派送對象類別](#派送對象類別)
 status | string | | 20 | | 問卷派送記錄狀態, 參閱 [派送記錄狀態](#派送記錄狀態)
 keyword | string | | 50 | | 關鍵字, 查詢問卷群組名稱
 
#### pagination (分頁json)
 欄位 | 型態  | 必填 | 預設 | 說明
 ---|---|---|---|---
 current | int | | 1 | 當前頁數 
 pageSize | int | | 10 | 每頁結果數量，-1 為顯示所有
 
#### sorter (排序json) 
 欄位 | 型態  | 必填 | 預設 | 說明
 ---|---|---|---|--- 
 field | string | | updateTime | 排序欄位,可排序欄位有 dispatchTime, name, targetType, dispatchCount, fillOutCount, isModifiable, status, updateTime 
 order | string | | desc | 升序或降序 

```javascript
{
    "query": {
        "targetType": null,
        "status": null,
        "keyword": null
    } ,
    "pagination": {
        "current": 1,
        "pageSize": 10
    }, 
    "sorter": {
        "field": "updateTime",
        "order": "desc"
    }
}
```

### Response-問卷派送記錄列表
 欄位 | 型態 | 說明 
 ---  | --- | ---
 id | string | 問卷派送記錄id
 tenantId | string | 租戶id
 name | string | 問卷(群組)名稱
 questionnaireId | string | 問卷id
 groupId | string | 問卷群組id
 targetType | string | 派送對象類別, 參閱 [派送對象類別](#派送對象類別)
 targetTenantId | string | 派送對象TenantId, targetType=ALL、TENANT 時會有值
 targetHouseholdMemberIds | string array | 派送對象HouseholdMemberId, targetType=MEMBER 時會有值
 targetDiseaseId | string | 派送對象DiseaseId, targetType=DISEASE 時會有值
 targetDiseaseStageId | string | 派送對象DiseaseId, targetType=DISEASE 時可能會有值
 isModifiable | boolean | 是否可以填寫修改
 status | string | 問卷派送記錄狀態, 參閱 [派送記錄狀態](#派送記錄狀態)
 dispatched | boolean | 是否有執行派送過
 fillOutStartDate | date | 問卷填寫啟始日期
 fillOutEndDate | date | 問卷填寫結束日期
 dispatchTime | timestamp | 問卷派送時間
 dispatchCount | int | 派送數量
 fillOutCount | int | 已填寫數量
 unFillOutCount | int | 未填寫數量
 targetTenantName | string | 派送對象-組織單位名稱
 targetHouseholdMemberName | string | targetType="MEMBER"時. 派送對象-會員名稱, 多筆的話以逗號分隔
 targetDiseaseName | string | 派送對象-疾病名稱
 targetDiseaseStageName | string | 派送對象-疾病階段名稱
 targetDescription | string | 派送對象-說明, <br/>targetType=TENANT 時, 表示"組織單位名稱", <br/>targetType=MEMBER 時, 表示"會員名稱 電話", 多筆時以逗號分隔, <br/>targetType=DISEASE 時, 表示"疾病名稱-階段名稱" 
 
 
```javascript
{
    "httpCode": 200,
    "result": {
        "data": [
            {
                "id": "3b5bc656-3d53-43f7-893f-170748e138a9",
                "tenantId": "858b7fbb-3ba0-4d49-9882-c893a1ef07dc",
                "name": "問卷標題-11",
                "questionnaireId": "6f251e85-6a88-409b-ad89-c579a134052b",
                "targetType": "MEMBER",
                "targetHouseholdMemberId": "8a9e980a-c612-4f87-af07-a97a5f0fbed5",
                "isModifiable": false,
                "status": "NONE",
                "dispatched": false,
                "fillOutStartDate": 1659283200000,
                "fillOutEndDate": 1661875200000,
                "dispatchTime": 1658840400000,
                "createTime": 1658836660797,
                "updateTime": 1658836759781,
                "dispatchCount": 0,
                "fillOutCount": 0,
                "targetHouseholdMemberName": "蘇凱文",
                "targetDescription": "蘇凱文 0925309365"
            },
            {
                "id": "c1d0c93d-fdd5-4a60-90dc-562ec310cf04",
                "tenantId": "5efcfd67-334e-45b3-bf49-7e52f5172891",
                "name": "測是1",
                "questionnaireId": "dca90899-fcc1-4f82-9c87-2d7f88126484",
                "targetType": "MEMBER",
                "isModifiable": true,
                "status": "ON",
                "dispatched": true,
                "fillOutStartDate": 1684771200000,
                "fillOutEndDate": 1685462400000,
                "dispatchTime": 1684889500000,
                "createTime": 1684893112235,
                "updateTime": 1684893442651,
                "dispatchCount": 2,
                "fillOutCount": 0,
                "unFillOutCount": 2,
                "targetHouseholdMemberName": "aaa,taco",
                "targetDescription": "aaa 0988123456,taco 0917052302",
                "tenantName": "企客第一家"
            },
            {
                "id": "883b3f12-4e12-4a66-96cc-7f3f830b2256",
                "tenantId": "858b7fbb-3ba0-4d49-9882-c893a1ef07dc",
                "name": "問卷標題-11",
                "questionnaireId": "6f251e85-6a88-409b-ad89-c579a134052b",
                "targetType": "ALL",
                "targetTenantId": "858b7fbb-3ba0-4d49-9882-c893a1ef07dc",
                "isModifiable": false,
                "status": "OFF",
                "dispatched": false,
                "fillOutStartDate": 1658851200000,
                "fillOutEndDate": 1661875200000,
                "dispatchTime": 1658836800000,
                "createTime": 1658835791374,
                "updateTime": 1658835873974,
                "dispatchCount": 0,
                "fillOutCount": 0,
                "targetTenantName": "緯緯醫學"
            },
            ...
        ],
        "pagination": {
            "current": 1,
            "pageSize": -1,
            "total": 4
        },
        "sorter": {
            "field": "updateTime",
            "order": "desc"
        },
        "total": 4
    }
}
```


## 取得問卷派送記錄明細

```url
POST /questionnaire-mgmt/dispatch/info
```

### Request
 欄位 | 型態  | 必填 | 長度限制 | 預設 | 說明  
 ---|---|---|---|---|---
 id | string | Y | 36 | | 問卷派送記錄id
 
```javascript
{
    "id": "d1cb5c01-b757-4bb4-8a6e-eba4a1278e5f"
}
```

### Error
 httpCode | 錯誤碼 | 說明
 --- | --- | ---
 400 | API_ERROR.NOT_EXIST | 無此筆資料

### Response
參閱 [Response-問卷派送記錄列表](#Response-問卷派送記錄列表)

```javascript=
// targetType=ALL
{
    "httpCode": 200,
    "result": {
        "data": {
            "id": "d1cb5c01-b757-4bb4-8a6e-eba4a1278e5f",
            "tenantId": "858b7fbb-3ba0-4d49-9882-c893a1ef07dc",
            "name": "問卷標題-11",
            "questionnaireId": "6f251e85-6a88-409b-ad89-c579a134052b",
            "targetType": "ALL",
            "isModifiable": false,
            "status": "NONE",
            "dispatched": false,
            "fillOutStartDate": 1658678400000,
            "fillOutEndDate": 1661875200000,
            "dispatchTime": 1658748661901,
            "createTime": 1658748661901,
            "updateTime": 1658748661901,
            "dispatchCount": 0,
            "fillOutCount": 0
        }
    }
}
// targetType=MEMBER
{
    "httpCode": 200,
    "result": {
        "data": {
            "id": "2c6b10ae-c866-4712-bcdf-a66c5cf42344",
            "tenantId": "5efcfd67-334e-45b3-bf49-7e52f5172891",
            "name": "測是1",
            "questionnaireId": "dca90899-fcc1-4f82-9c87-2d7f88126484",
            "targetType": "MEMBER",
            "targetHouseholdMemberIds": [
                "b1082e02-6037-4ce8-b8a5-a1d1ac8bdee9"
            ],
            "isModifiable": true,
            "status": "NONE",
            "dispatched": false,
            "fillOutStartDate": 1684771200000,
            "fillOutEndDate": 1685462400000,
            "dispatchTime": 1684996700000,
            "createTime": 1684911744705,
            "updateTime": 1684913177747,
            "dispatchCount": 0,
            "fillOutCount": 0,
            "unFillOutCount": 0,
            "targetHouseholdMemberName": "taco",
            "targetDescription": "taco 0917052302",
            "tenantName": "企客第一家"
        }
    }
}
```


## 取得問卷派送記錄來源列表

```url
POST /questionnaire-mgmt/dispatch/source-list
```

### Request
#### query (查詢條件json)
 欄位 | 型態  | 必填 | 長度限制 | 預設 | 說明  
 ---|---|---|---|---|---
 dispatchSource | string | Y | 20 | | 問卷派送記錄問卷來源類別, 參閱 [派送問卷來源類別](#派送問卷來源類別)
 
```javascript
{
    "dispatchSource": "QUESTIONNAIRE"
}
```

### Response

* dispatchSource="QUESTIONNAIRE", 參閱 [Response-問卷管理列表](#Response-問卷管理列表)
* dispatchSource="GROUP", 參閱 [Response-問卷群組列表](#Response-問卷群組列表)
 
```javascript
//dispatchSource="QUESTIONNAIRE"
{
    "httpCode": 200,
    "result": {
        "data": [
            {
                "id": "9804cb8f-6f0a-48f4-9ba2-6779bd5c0b47",
                "tenantId": "858b7fbb-3ba0-4d49-9882-c893a1ef07dc",
                "name": "Questionnaire Title-11",
                "language": "en-US",
                "remark": "v1",
                "scoreType": "SECTION",
                "status": "ON",
                "createTime": 1658233907242,
                "updateTime": 1658233907242,
                "dispatched": false,
                "isPublic": false,
                "tenantName": "緯緯醫學",
                "tenantShortName": "丫緯"
            },
            {
                "id": "c8554a72-2cae-4c8b-969b-6a9ef9e29f3c",
                "tenantId": "WMT",
                "name": "Basic Questionnaire",
                "language": "en-US",
                "remark": "v1",
                "scoreType": "NONE",
                "status": "ON",
                "createTime": 1658229714476,
                "updateTime": 1658229714476,
                "dispatched": false,
                "isPublic": true,
                "tenantName": "緯創醫學"
            },
            ...
        ]
    }
}

//dispatchSource="GROUP"
{
    "httpCode": 200,
    "result": {
        "data": [
            {
                "id": "2c04c7c9-9fdc-4c41-8e25-6dcba540d2d6",
                "tenantId": "858b7fbb-3ba0-4d49-9882-c893a1ef07dc",
                "name": "自訂問卷群-2",
                "quantity": 2,
                "dispatched": false,
                "languages": [
                    "zh-CHT",
                    "en-US"
                ]
            },
            {
                "id": "c44c85b1-5d67-4787-bdc6-f6266656e3fd",
                "tenantId": "858b7fbb-3ba0-4d49-9882-c893a1ef07dc",
                "name": "自訂問卷群-11",
                "quantity": 2,
                "dispatched": false,
                "languages": [
                    "en-US",
                    "zh-CHT"
                ]
            }
        ]
    }
}
```


## 新增問卷派送記錄

```url
POST /questionnaire-mgmt/dispatch/add
```

- 選擇派送的問卷時, 可以call [/questionnaire-mgmt/dispatch/source-list](#取得問卷派送記錄來源列表)
- 派送對象類別, 依據登入身份可選類別不同
  - 平台管理員: ALL、TENANT、MEMBER
  - 醫院租戶管理員(tenantType="HOSPITAL"): ALL、MEMBER、DISEASE
  - 非醫院租戶管理員(tenantType != "HOSPITAL"): ALL、MEMBER
- 派送對象說明
  - ALL:
    - 平台: 表示全平台會員
    - 醫院租戶: 表示該醫院租戶所有收案個案會員
    - 非醫院租戶: 表示該租戶所有會員
  - TENANT: 需填入targetTenantId
    - 可以call [/tenant/list](https://hackmd.io/j4jEJwS-QbSf8fLFAIvyRw#%E7%A7%9F%E6%88%B6%E5%88%97%E8%A1%A8) API
  - MEMBER: 需填入targetHouseholdMemberId
    - 可以call [/householdMember/name/list](https://hackmd.io/FTyy4D3cRGavm1kFogOGKg?view#13-Get-Name-List) API
  - DISEASE: 需填入targetDiseaseId, targetDiseaseStageId
    - 可以call [/disease/list](https://hackmd.io/Dd1Byz-rTjGcF_TcdF5G5A#%E7%96%BE%E7%97%85%E5%88%97%E8%A1%A8) API

### Request
 欄位 | 型態  | 必填 | 長度限制 | 預設 | 說明 
 ---|---|---|---|---|---
 questionnaireId | string | **Y**(選單一問卷時) | 36 |  | 問卷id
 groupId | string | **Y**(選問卷群組時) | 36 |  | 問卷群組id
 targetType | string | Y | 20 |  | 派送對象類別, 參閱 [派送對象類別](#派送對象類別)
 targetTenantId | string | **Y**(targetType="TENANT") | 36 |  | 派送對象-組織單位 TenantId
 targetHouseholdMemberIds | string array | **Y**(targetType="MEMBER") | 36 |  | 派送對象-成員 HouseholdMemberId組成陣列 
 targetDiseaseId | string | **Y**(targetType="DISEASE") | 36 |  | 派送對象-疾病別 diseaseId
 targetDiseaseStageId | string |  | 36 |  | 派送對象-疾病別 diseaseStageId
 isModifiable | boolean | Y |  |  | 是否可以填寫修改 
 fillOutStartDate | date | Y |  |  | 問卷填寫啟始日期
 fillOutEndDate | date | Y |  |  | 問卷填寫結束日期
 dispatchTime | timestamp | Y |  |  | 問卷派送時間
 status | string | Y | 10 | NONE | 問卷派送記錄狀態, 參閱 [派送記錄狀態](#派送記錄狀態)

```javascript=
// targetType=ALL
{
    "questionnaireId": "6f251e85-6a88-409b-ad89-c579a134052b",
    "groupId": null, 
    "targetType": "ALL",
    "targetTenantId": null,
    "targetHouseholdMemberId": null,
    "targetDiseaseId": null,
    "targetDiseaseStageId": null,
    "isModifiable": false,
    "fillOutStartDate": "2022-07-27",
    "fillOutEndDate": "2022-08-31",
    "dispatchTime": 1658835000000,
    "status": "NONE"
}
// targetType=MEMBER
{
    "questionnaireId": "dca90899-fcc1-4f82-9c87-2d7f88126484",
    "name": "測是1",
    "targetType": "MEMBER",
    "targetHouseholdMemberIds": ["b1082e02-6037-4ce8-b8a5-a1d1ac8bdee9","63a7f9b9-0b22-409e-b46b-d4bb59075ac2"],
    "isModifiable": false,
    "fillOutStartDate": "2023-05-23",
    "fillOutEndDate": "2023-05-31",
    "dispatchedDate": "2023-05-24T01:36:28.492Z",
    "dispatchedDateHr": "09",
    "dispatchedDateMin": "45",
    "status": "NONE",
    "dispatchTime": 1684996700000
}
```

### Error
 httpCode | 錯誤碼 | 說明
 --- | --- | ---
 400 | API_ERROR.ARGUMENT_ERROR | 輸入參數錯誤, 可參閱 errorDesc

### Response
 欄位 | 型態 | 說明 
 ---  | --- | ---
 id | string | 問卷派送記錄id
 tenantId | string | 租戶id
 name | string | 問卷(群組)名稱
 questionnaireId | string | 問卷id
 groupId | string | 問卷群組id
 targetType | string | 派送對象類別, 參閱 [派送對象類別](#派送對象類別)
 targetTenantId | string | 派送對象TenantId, targetType=ALL、TENANT 時會有值
 targetHouseholdMemberId | string | 派送對象HouseholdMemberId, targetType=MEMBER 時會有值
 targetDiseaseId | string | 派送對象DiseaseId, targetType=DISEASE 時會有值
 targetDiseaseStageId | string | 派送對象DiseaseId, targetType=DISEASE 時可能會有值
 isModifiable | boolean | 是否可以填寫修改
 status | string | 問卷派送記錄狀態, 參閱 [派送記錄狀態](#派送記錄狀態)
 dispatched | boolean | 是否有執行派送過
 fillOutStartDate | date | 問卷填寫啟始日期
 fillOutEndDate | date | 問卷填寫結束日期
 dispatchTime | timestamp | 問卷派送時間
 creator | string | 建立者accountId
 updater | string | 修改者accountId
 createTime | timestamp | 建立時間
 updateTime | timestamp | 修改時間

```javascript
{
    "httpCode": 200,
    "result": {
        "data": {
            "id": "fe6be69b-630a-43cb-8ec9-f741f20a4832",
            "tenantId": "858b7fbb-3ba0-4d49-9882-c893a1ef07dc",
            "questionnaireId": "6f251e85-6a88-409b-ad89-c579a134052b",
            "targetType": "ALL",
            "targetTenantId": "858b7fbb-3ba0-4d49-9882-c893a1ef07dc",
            "isModifiable": false,
            "fillOutStartDate": 1658851200000,
            "fillOutEndDate": 1661875200000,
            "dispatchTime": 1658835000000,
            "status": "NONE",
            "dispatched": false,
            "creator": "98953ae4-b8f1-488c-b3ae-cb64d8caae15",
            "createTime": 1658834863139,
            "updateTime": 1658834863139
        }
    }
}
```

## 編輯問卷派送記錄

```url
POST /questionnaire-mgmt/dispatch/update
```

* 只允許未派送的記錄可以編輯

### Request
 欄位 | 型態  | 必填 | 長度限制 | 預設 | 說明 
 ---|---|---|---|---|---
 id | string | Y | 36 |  | 問卷派送記錄id
 questionnaireId | string | **Y**(選單一問卷時) | 36 |  | 問卷id
 groupId | string | **Y**(選問卷群組時) | 36 |  | 問卷群組id
 targetType | string | Y | 20 |  | 派送對象類別, 參閱 [派送對象類別](#派送對象類別)
 targetTenantId | string | **Y**(targetType="TENANT") | 36 |  | 派送對象-組織單位 TenantId
 targetHouseholdMemberIds | string | **Y**(targetType="MEMBER") | 36 |  | 派送對象-成員 HouseholdMemberId組成陣列 
 targetDiseaseId | string | **Y**(targetType="DISEASE") | 36 |  | 派送對象-疾病別 diseaseId
 targetDiseaseStageId | string |  | 36 |  | 派送對象-疾病別 diseaseStageId
 isModifiable | boolean | Y |  |  | 是否可以填寫修改 
 fillOutStartDate | date | Y |  |  | 問卷填寫啟始日期
 fillOutEndDate | date | Y |  |  | 問卷填寫結束日期
 dispatchTime | timestamp | Y |  |  | 問卷派送時間
 status | string | Y | 10 | NONE | 問卷派送記錄狀態, 參閱 [派送記錄狀態](#派送記錄狀態)

```javascript
{
    "id": "3b5bc656-3d53-43f7-893f-170748e138a9",
    "questionnaireId": "6f251e85-6a88-409b-ad89-c579a134052b",
    "groupId": null, 
    "targetType": "MEMBER",
    "targetTenantId": "WMT",
    "targetHouseholdMemberId": "8a9e980a-c612-4f87-af07-a97a5f0fbed5",
    "targetDiseaseId": null,
    "targetDiseaseStageId": null,
    "isModifiable": false,
    "fillOutStartDate": "2022-08-01",
    "fillOutEndDate": "2022-08-31",
    "dispatchTime": 1658840400000,
    "status": "NONE"
}
```

### Error
 httpCode | 錯誤碼 | 說明
 --- | --- | ---
 400 | API_ERROR.NOT_EXIST | 無此筆資料
 400 | API_ERROR.ARGUMENT_ERROR | 輸入參數錯誤, 可參閱 errorDesc
 403 | API_ERROR.PERMISSION_DENIED | 無此操作權限
 422 | SERVICE_ERROR.QUESTIONNAIRE_DISPATCH_UPDATE_NOT_ALLOWED | 不允許編輯已派送的問卷派送記錄


### Response
 欄位 | 型態 | 說明 
 ---  | --- | ---
 id | string | 問卷派送記錄id
 tenantId | string | 租戶id
 name | string | 問卷(群組)名稱
 questionnaireId | string | 問卷id
 groupId | string | 問卷群組id
 targetType | string | 派送對象類別, 參閱 [派送對象類別](#派送對象類別)
 targetTenantId | string | 派送對象TenantId, targetType=ALL、TENANT 時會有值
 targetHouseholdMemberId | string | 派送對象HouseholdMemberId, targetType=MEMBER 時會有值
 targetDiseaseId | string | 派送對象DiseaseId, targetType=DISEASE 時會有值
 targetDiseaseStageId | string | 派送對象DiseaseId, targetType=DISEASE 時可能會有值
 isModifiable | boolean | 是否可以填寫修改
 status | string | 問卷派送記錄狀態, 參閱 [派送記錄狀態](#派送記錄狀態)
 dispatched | boolean | 是否有執行派送過
 fillOutStartDate | date | 問卷填寫啟始日期
 fillOutEndDate | date | 問卷填寫結束日期
 dispatchTime | timestamp | 問卷派送時間
 creator | string | 建立者accountId
 updater | string | 修改者accountId
 createTime | timestamp | 建立時間
 updateTime | timestamp | 修改時間

```javascript
{
    "httpCode": 200,
    "result": {
        "data": {
            "id": "3b5bc656-3d53-43f7-893f-170748e138a9",
            "tenantId": "858b7fbb-3ba0-4d49-9882-c893a1ef07dc",
            "questionnaireId": "6f251e85-6a88-409b-ad89-c579a134052b",
            "targetType": "ALL",
            "isModifiable": false,
            "fillOutStartDate": 1659283200000,
            "fillOutEndDate": 1661875200000,
            "dispatchTime": 1658840400000,
            "status": "NONE",
            "dispatched": false,
            "creator": "98953ae4-b8f1-488c-b3ae-cb64d8caae15",
            "updater": "98953ae4-b8f1-488c-b3ae-cb64d8caae15",
            "createTime": 1658836660797,
            "updateTime": 1658836759781
        }
    }
}
```


## 編輯問卷派送記錄狀態

```url
POST /questionnaire-mgmt/dispatch/update-status
```

* 只允許將派送記錄狀態變更為已結束狀態

### Request
 欄位 | 型態  | 必填 | 長度限制 | 預設 | 說明 
 ---|---|---|---|---|---
 id | string | Y | 36 |  | 問卷派送記錄id
 status | string | Y | 10 | NONE | 問卷派送記錄狀態, 參閱 [派送記錄狀態](#派送記錄狀態)

```javascript
{
    "id": "883b3f12-4e12-4a66-96cc-7f3f830b2256",
    "status": "OFF"
}
```

### Error
 httpCode | 錯誤碼 | 說明
 --- | --- | ---
 400 | API_ERROR.NOT_EXIST | 無此筆資料
 400 | API_ERROR.ARGUMENT_ERROR | 輸入參數錯誤, 可參閱 errorDesc
 403 | API_ERROR.PERMISSION_DENIED | 無此操作權限
 422 | SERVICE_ERROR.QUESTIONNAIRE_DISPATCH_UPDATE_NOT_ALLOWED | 不允許編輯已派送的問卷派送記錄


### Response
 欄位 | 型態 | 說明 
 ---  | --- | ---
 id | string | 問卷派送記錄id
 tenantId | string | 租戶id
 name | string | 問卷(群組)名稱
 questionnaireId | string | 問卷id
 groupId | string | 問卷群組id
 targetType | string | 派送對象類別, 參閱 [派送對象類別](#派送對象類別)
 targetTenantId | string | 派送對象TenantId, targetType=ALL、TENANT 時會有值
 targetHouseholdMemberId | string | 派送對象HouseholdMemberId, targetType=MEMBER 時會有值
 targetDiseaseId | string | 派送對象DiseaseId, targetType=DISEASE 時會有值
 targetDiseaseStageId | string | 派送對象DiseaseId, targetType=DISEASE 時可能會有值
 isModifiable | boolean | 是否可以填寫修改
 status | string | 問卷派送記錄狀態, 參閱 [派送記錄狀態](#派送記錄狀態)
 dispatched | boolean | 是否有執行派送過
 fillOutStartDate | date | 問卷填寫啟始日期
 fillOutEndDate | date | 問卷填寫結束日期
 dispatchTime | timestamp | 問卷派送時間
 creator | string | 建立者accountId
 updater | string | 修改者accountId
 createTime | timestamp | 建立時間
 updateTime | timestamp | 修改時間

```javascript
{
    "httpCode": 200,
    "result": {
        "data": {
            "id": "883b3f12-4e12-4a66-96cc-7f3f830b2256",
            "tenantId": "858b7fbb-3ba0-4d49-9882-c893a1ef07dc",
            "questionnaireId": "6f251e85-6a88-409b-ad89-c579a134052b",
            "targetType": "ALL",
            "targetTenantId": "858b7fbb-3ba0-4d49-9882-c893a1ef07dc",
            "isModifiable": false,
            "fillOutStartDate": 1658851200000,
            "fillOutEndDate": 1661875200000,
            "dispatchTime": 1658836800000,
            "status": "OFF",
            "dispatched": false,
            "creator": "98953ae4-b8f1-488c-b3ae-cb64d8caae15",
            "updater": "98953ae4-b8f1-488c-b3ae-cb64d8caae15",
            "createTime": 1658835791374,
            "updateTime": 1658835873974
        }
    }
}
```


## 撤銷問卷派送記錄

```url
POST /questionnaire-mgmt/dispatch/update-mark-delete-status
```

* 針對不可刪除的派送紀錄可以透過撤銷讓此紀錄呈現和刪除相同效果. 但相關資料都還留存在資料庫內

### Request
 欄位 | 型態  | 必填 | 長度限制 | 預設 | 說明 
 ---|---|---|---|---|---
 id | string | Y | 36 |  | 問卷派送記錄id
 isMarkDelete | boolean | Y |  |  | 是否撤除派送紀錄, 目前僅允許TRUE

```javascript
{
    "id": "883b3f12-4e12-4a66-96cc-7f3f830b2256",
    "isMarkDelete": true
}
```

### Error
 httpCode | 錯誤碼 | 說明
 --- | --- | ---
 400 | API_ERROR.NOT_EXIST | 無此筆資料
 400 | API_ERROR.ARGUMENT_ERROR | 輸入參數錯誤, 可參閱 errorDesc
 403 | API_ERROR.PERMISSION_DENIED | 無此操作權限
 422 | SERVICE_ERROR.QUESTIONNAIRE_UPDATE_MARK_DELETE_STATUS_NOT_ALLOWED | 不允許修改撤銷狀態


### Response
 欄位 | 型態 | 說明 
 ---  | --- | ---
 id | string | 問卷派送記錄id
 tenantId | string | 租戶id
 name | string | 問卷(群組)名稱
 questionnaireId | string | 問卷id
 groupId | string | 問卷群組id
 targetType | string | 派送對象類別, 參閱 [派送對象類別](#派送對象類別)
 targetTenantId | string | 派送對象TenantId, targetType=ALL、TENANT 時會有值
 targetHouseholdMemberId | string | 派送對象HouseholdMemberId, targetType=MEMBER 時會有值
 targetDiseaseId | string | 派送對象DiseaseId, targetType=DISEASE 時會有值
 targetDiseaseStageId | string | 派送對象DiseaseId, targetType=DISEASE 時可能會有值
 isModifiable | boolean | 是否可以填寫修改
 status | string | 問卷派送記錄狀態, 參閱 [派送記錄狀態](#派送記錄狀態)
 dispatched | boolean | 是否有執行派送過
 fillOutStartDate | date | 問卷填寫啟始日期
 fillOutEndDate | date | 問卷填寫結束日期
 dispatchTime | timestamp | 問卷派送時間
 creator | string | 建立者accountId
 updater | string | 修改者accountId
 createTime | timestamp | 建立時間
 updateTime | timestamp | 修改時間

```javascript
{
    "httpCode": 200,
    "result": {
        "data": {
            "id": "883b3f12-4e12-4a66-96cc-7f3f830b2256",
            "tenantId": "858b7fbb-3ba0-4d49-9882-c893a1ef07dc",
            "questionnaireId": "6f251e85-6a88-409b-ad89-c579a134052b",
            "targetType": "ALL",
            "targetTenantId": "858b7fbb-3ba0-4d49-9882-c893a1ef07dc",
            "isModifiable": false,
            "fillOutStartDate": 1658851200000,
            "fillOutEndDate": 1661875200000,
            "dispatchTime": 1658836800000,
            "status": "OFF",
            "dispatched": false,
            "creator": "98953ae4-b8f1-488c-b3ae-cb64d8caae15",
            "updater": "98953ae4-b8f1-488c-b3ae-cb64d8caae15",
            "createTime": 1658835791374,
            "updateTime": 1658835873974
        }
    }
}
```
## 編輯問卷派送記錄結束日期

```url
POST /questionnaire-mgmt/dispatch/update-fill-out-end-date
```

* 只允許已派送的記錄變更填寫結束日期

### Request
 欄位 | 型態  | 必填 | 長度限制 | 預設 | 說明 
 ---|---|---|---|---|---
 id | string | Y | 36 |  | 問卷派送記錄id
 fillOutEndDate | date | Y |  |  | 問卷填寫結束日期

```javascript
{
    "id": "fe6be69b-630a-43cb-8ec9-f741f20a4832",
    "fillOutEndDate": 1661875200000
}
```

### Error
 httpCode | 錯誤碼 | 說明
 --- | --- | ---
 400 | API_ERROR.NOT_EXIST | 無此筆資料
 400 | API_ERROR.ARGUMENT_ERROR | 輸入參數錯誤, 可參閱 errorDesc
 403 | API_ERROR.PERMISSION_DENIED | 無此操作權限
 422 | SERVICE_ERROR.QUESTIONNAIRE_DISPATCH_UPDATE_NOT_ALLOWED | 不允許編輯已派送的問卷派送記錄


### Response
 欄位 | 型態 | 說明 
 ---  | --- | ---
 id | string | 問卷派送記錄id
 tenantId | string | 租戶id
 name | string | 問卷(群組)名稱
 questionnaireId | string | 問卷id
 groupId | string | 問卷群組id
 targetType | string | 派送對象類別, 參閱 [派送對象類別](#派送對象類別)
 targetTenantId | string | 派送對象TenantId, targetType=ALL、TENANT 時會有值
 targetHouseholdMemberId | string | 派送對象HouseholdMemberId, targetType=MEMBER 時會有值
 targetDiseaseId | string | 派送對象DiseaseId, targetType=DISEASE 時會有值
 targetDiseaseStageId | string | 派送對象DiseaseId, targetType=DISEASE 時可能會有值
 isModifiable | boolean | 是否可以填寫修改
 status | string | 問卷派送記錄狀態, 參閱 [派送記錄狀態](#派送記錄狀態)
 dispatched | boolean | 是否有執行派送過
 fillOutStartDate | date | 問卷填寫啟始日期
 fillOutEndDate | date | 問卷填寫結束日期
 dispatchTime | timestamp | 問卷派送時間
 creator | string | 建立者accountId
 updater | string | 修改者accountId
 createTime | timestamp | 建立時間
 updateTime | timestamp | 修改時間

```javascript
{
    "httpCode": 200,
    "result": {
        "data": {
            "id": "883b3f12-4e12-4a66-96cc-7f3f830b2256",
            "tenantId": "858b7fbb-3ba0-4d49-9882-c893a1ef07dc",
            "questionnaireId": "6f251e85-6a88-409b-ad89-c579a134052b",
            "targetType": "ALL",
            "targetTenantId": "858b7fbb-3ba0-4d49-9882-c893a1ef07dc",
            "isModifiable": false,
            "fillOutStartDate": 1658851200000,
            "fillOutEndDate": 1661875200000,
            "dispatchTime": 1658836800000,
            "status": "ON",
            "dispatched": true,
            "creator": "98953ae4-b8f1-488c-b3ae-cb64d8caae15",
            "updater": "98953ae4-b8f1-488c-b3ae-cb64d8caae15",
            "createTime": 1658835791374,
            "updateTime": 1658835873974
        }
    }
}
```


## 刪除問卷派送記錄

```url
POST /questionnaire-mgmt/dispatch/delete
```

* 未派送的問卷派送記錄才允許刪除

### Request
 欄位 | 型態  | 必填 | 長度限制 | 預設 | 說明  
 ---|---|---|---|---|---
 id | string | Y | 36 | | 問卷派送記錄id
 
```javascript
{
    "id": "fe6be69b-630a-43cb-8ec9-f741f20a4832"
}
```

### Error
 httpCode | 錯誤碼 | 說明
 --- | --- | ---
 400 | API_ERROR.NOT_EXIST | 無此筆資料
 403 | API_ERROR.PERMISSION_DENIED | 無此操作權限
 422 | SERVICE_ERROR.QUESTIONNAIRE_DISPATCH_DELETE_NOT_ALLOWED | 不允許刪除已派送的問卷派送記錄

### Response
 欄位 | 型態 | 說明 
 ---  | --- | ---
 count | int | 刪除筆數, > 0 表示成功刪除

```javascript
{
    "httpCode": 200,
    "result": {
        "data": {
            "count": 1
        }
    }
}
```


## 問卷派送統計

```url
POST /questionnaire-mgmt/dispatch/statistics
```

### Request
 欄位 | 型態  | 必填 | 長度限制 | 預設 | 說明  
 ---|---|---|---|---|---
 dispatchId | string | Y | 36 | | 問卷派送記錄id

```javascript
{
    "dispatchId": "904cbff5-6cae-4f2f-a605-4121fcc0ee8e"
}
```

### Error
 httpCode | 錯誤碼 | 說明
 --- | --- | ---
 400 | API_ERROR.NOT_EXIST | 無此筆資料
 403 | API_ERROR.PERMISSION_DENIED | 無此操作權限

### Response-問卷派送統計
 欄位 | 型態 | 說明 
 ---  | --- | ---
 dispatchRecordInfo | json | 問卷派送記錄json object, 參閱 [Response-問卷派送記錄列表](#Response-問卷派送記錄列表)
 dispatchUserInfo | json | 派送分析統計json object
 fillOutInfo | json | 問卷填寫分析json object
 groupInfo | json | 問卷群組填寫分析json object, 派送為問卷群組時才會有此欄位

#### Response-問卷派送統計-派送分析統計json object
 欄位 | 型態 | 說明 
 ---  | --- | ---
 totalCount | int | 總人數
 totalMaleCount | int | 總男性人數
 totalFemaleCount | int | 總女性人數
 totalMaleCountRate | double | 總男性人數佔比
 totalFemaleCountRate | double | 總女性人數佔比
 details | json array | 年齡統計 json array, 請參閱 [年齡統計json object](#Response-問卷派送統計-年齡統計json-object)

#### Response-問卷派送統計-問卷填寫分析json object
 欄位 | 型態 | 說明 
 ---  | --- | ---
 totalCount | int | 總人數
 totalMaleCount | int | 總男性人數
 totalFemaleCount | int | 總女性人數
 totalMaleCountRate | double | 總男性人數佔比
 totalFemaleCountRate | double | 總女性人數佔比
 fillOutRate | double | 填寫率
 details | json array | 年齡統計 json array, 請參閱 [年齡統計json object](#Response-問卷派送統計-年齡統計json-object)

#### Response-問卷派送統計-問卷群組填寫分析json object
 欄位 | 型態 | 說明 
 ---  | --- | ---
 totalCount | int | 總人數
 totalMaleCount | int | 總男性人數
 totalFemaleCount | int | 總女性人數
 totalMaleCountRate | double | 總男性人數佔比
 totalFemaleCountRate | double | 總女性人數佔比
 details | json array | 群組明細問卷填寫統計 json array, 請參閱 [群組明細問卷填寫統計json object](#Response-問卷派送統計-群組明細問卷填寫統計json-object)

#### Response-問卷派送統計-年齡統計json object
 欄位 | 型態 | 說明 
 ---  | --- | ---
 ageLevel | string | 年齡級距
 label | string | 年齡級距標示名稱
 maleCount | int | 男性人數
 femaleCount | int | 女性人數

#### Response-問卷派送統計-群組明細問卷填寫統計json object
 欄位 | 型態 | 說明 
 ---  | --- | ---
 questionnaireId | string | 群組明細問卷id
 language | string | 群組明細問卷語系, 參閱 [問卷語系](#問卷語系)
 seq | int | 群組明細排序
 maleCount | int | 男性人數
 femaleCount | int | 女性人數


```javascript
{
    "httpCode": 200,
    "result": {
        "data": {
            "dispatchRecordInfo": {
                "id": "904cbff5-6cae-4f2f-a605-4121fcc0ee8e",
                "tenantId": "WMT",
                "name": "健康行爲問卷調查",
                "groupId": "b448ec81-69e4-4513-940c-aff1e18fe39a",
                "targetType": "ALL",
                "targetTenantId": "WMT",
                "isModifiable": true,
                "status": "OFF",
                "dispatched": true,
                "fillOutStartDate": 1659283200000,
                "fillOutEndDate": 1660492800000,
                "dispatchTime": 1659682800000,
                "createTime": 1659682093094,
                "updateTime": 1659682093094,
                "dispatchCount": 3,
                "fillOutCount": 1,
                "unFillOutCount": 2,
                "targetTenantName": "Health 365健康照護平台",
                "tenantName": "Health 365健康照護平台"
            },
            "dispatchUserInfo": {
                "totalCount": 3,
                "totalMaleCount": 2,
                "totalFemaleCount": 1,
                "totalMaleCountRate": 66.7,
                "totalFemaleCountRate": 33.3,
                "details": [
                    {
                        "ageLevel": "level1",
                        "label": "30歲以下",
                        "maleCount": 1,
                        "femaleCount": 1
                    },
                    {
                        "ageLevel": "level2",
                        "label": "30-39歲",
                        "maleCount": 1,
                        "femaleCount": 0
                    },
                    {
                        "ageLevel": "level3",
                        "label": "40-49歲",
                        "maleCount": 0,
                        "femaleCount": 0
                    },
                    {
                        "ageLevel": "level4",
                        "label": "50-59歲",
                        "maleCount": 0,
                        "femaleCount": 0
                    },
                    {
                        "ageLevel": "level5",
                        "label": "60歲以上",
                        "maleCount": 0,
                        "femaleCount": 0
                    }
                ]
            },
            "fillOutInfo": {
                "totalCount": 1,
                "totalMaleCount": 1,
                "totalFemaleCount": 0,
                "totalMaleCountRate": 100.0,
                "totalFemaleCountRate": 0.0,
                "details": [
                    {
                        "ageLevel": "level1",
                        "label": "30歲以下",
                        "maleCount": 0,
                        "femaleCount": 0
                    },
                    {
                        "ageLevel": "level2",
                        "label": "30-39歲",
                        "maleCount": 1,
                        "femaleCount": 0
                    },
                    {
                        "ageLevel": "level3",
                        "label": "40-49歲",
                        "maleCount": 0,
                        "femaleCount": 0
                    },
                    {
                        "ageLevel": "level4",
                        "label": "50-59歲",
                        "maleCount": 0,
                        "femaleCount": 0
                    },
                    {
                        "ageLevel": "level5",
                        "label": "60歲以上",
                        "maleCount": 0,
                        "femaleCount": 0
                    }
                ],
                "fillOutRate": 33.3
            },
            "groupInfo": {
                "totalCount": 1,
                "totalMaleCount": 1,
                "totalFemaleCount": 0,
                "totalMaleCountRate": 100.0,
                "totalFemaleCountRate": 0.0,
                "details": [
                    {
                        "questionnaireId": "2243dcf3-1720-4ef9-bd37-2f282a332355",
                        "language": "en-US",
                        "seq": 1,
                        "maleCount": 0,
                        "femaleCount": 0
                    },
                    {
                        "questionnaireId": "e2e5cdbe-2f8d-47cd-9821-1719c21e7d30",
                        "language": "zh-CHT",
                        "seq": 2,
                        "maleCount": 0,
                        "femaleCount": 0
                    },
                    {
                        "questionnaireId": "e0b09a73-821e-4113-97b3-e941623d0c6a",
                        "language": "ja-JP",
                        "seq": 3,
                        "maleCount": 0,
                        "femaleCount": 0
                    },
                    {
                        "questionnaireId": "03b4c5b3-b37e-4f9a-af48-b2c7b49515c6",
                        "language": "th-TH",
                        "seq": 4,
                        "maleCount": 1,
                        "femaleCount": 0
                    },
                    {
                        "questionnaireId": "56054b06-0c59-4310-b24c-88727934fc49",
                        "language": "id-ID",
                        "seq": 5,
                        "maleCount": 0,
                        "femaleCount": 0
                    }
                ]
            }
        }
    }
}
```


## 匯出問卷派送統計Excel

```url
POST /questionnaire-mgmt/dispatch/export-statistics
```

### Request
 欄位 | 型態  | 必填 | 長度限制 | 預設 | 說明  
 ---|---|---|---|---|---
 dispatchId | string | Y | 36 | | 問卷派送記錄id
 questionnaireId | string | Y | 36 | | 問卷id

```javascript
{
    "dispatchId": "8f0ba708-7d14-41a3-b861-c330396e07ae",
    "questionnaireId": "8f0ba708-7d14-41a3-b861-c330396e07ae"
}
```

### Error
 httpCode | 錯誤碼 | 說明
 --- | --- | ---
 400 | API_ERROR.NOT_EXIST | 無此筆資料
 403 | API_ERROR.PERMISSION_DENIED | 無此操作權限

### Response

* httpCode 200 -Download file
```
  File name: H365_v2_匯出_問卷調查統計報表.xlsx
```


## 匯出問卷派送未填寫Excel

```url
POST /questionnaire-mgmt/dispatch/export-un-fill-out
```

### Request
 欄位 | 型態  | 必填 | 長度限制 | 預設 | 說明  
 ---|---|---|---|---|---
 dispatchId | string | Y | 36 | | 問卷派送記錄id

```javascript
{
    "dispatchId": "904cbff5-6cae-4f2f-a605-4121fcc0ee8e"
}
```

### Error
 httpCode | 錯誤碼 | 說明
 --- | --- | ---
 400 | API_ERROR.NOT_EXIST | 無此筆資料
 403 | API_ERROR.PERMISSION_DENIED | 無此操作權限

### Response

* httpCode 200 -Download file
```
  File name: H365_v2_匯出_問卷調查統計報表_未填寫名單.xlsx
```


## 取得使用者問卷調查列表

```url
POST /questionnaire/list-by-user
```

### Request
#### query (查詢條件json)
 欄位 | 型態  | 必填 | 長度限制 | 預設 | 說明  
 ---|---|---|---|---|---
 householdMemberId | string | Y | 36 | | householdMemberId
 
#### pagination (分頁json)
 欄位 | 型態  | 必填 | 預設 | 說明
 ---|---|---|---|---
 current | int | | 1 | 當前頁數 
 pageSize | int | | 10 | 每頁結果數量，-1 為顯示所有
 
#### sorter (排序json) 
 欄位 | 型態  | 必填 | 預設 | 說明
 ---|---|---|---|--- 
 field | string | | dispatchTime | 排序欄位,可排序欄位有 dispatchTime, name, language, dispatchStatus, isFillOut, fillOutTime 
 order | string | | desc | 升序或降序 

```javascript
{
    "query": {
        "householdMemberId": "8a9e980a-c612-4f87-af07-a97a5f0fbed5"
    },
    "pagination": {
        "current": 1,
        "pageSize": -1
    }, 
    "sorter": {
        "field": "dispatchTime",
        "order": "desc"
    }
}
```

### Response-取得使用者問卷調查列表
 欄位 | 型態 | 說明 
 ---  | --- | ---
 dispatchId | string | 問卷派送記錄id
 groupId | string | 問卷群組id
 questionnaireId | string | 問卷id
 name | string | 問卷(群組)名稱
 language | string | 問卷語系, 參閱 [問卷語系](#問卷語系)
 remark | string | 備註
 userRecordId | string | 使用者問卷填寫記錄id, User有填寫問卷才有值
 dispatchStatus | string | 問卷派送記錄的派送狀態, 請參閱 [派送記錄狀態](#派送記錄狀態)
 dispatchTime | timestamp | 問卷派送時間
 isFillOut | boolean | 是否已填寫問卷
 fillOutTime | timestamp | 使用者問卷填寫時間, User有填寫問卷才有值
 

```javascript
{
    "httpCode": 200,
    "result": {
        "data": [
            {
                "dispatchId": "3b5bc656-3d53-43f7-893f-170748e138a9",
                "name": "問卷標題-11",
                "userRecordId": "d8e23b7c-a6f9-46b3-afed-15609bd55d0d",
                "tenantId": "858b7fbb-3ba0-4d49-9882-c893a1ef07dc",
                "questionnaireId": "6f251e85-6a88-409b-ad89-c579a134052b",
                "dispatchTime": 1658840400000,
                "dispatchStatus": "ON",
                "fillOutTime": 1658968055377,
                "language": "zh-CHT",
                "isFillOut": true,
                "remark": "v1"
            },
            {
                "dispatchId": "883b3f12-4e12-4a66-96cc-7f3f830b2256",
                "name": "問卷標題-11",
                "tenantId": "858b7fbb-3ba0-4d49-9882-c893a1ef07dc",
                "questionnaireId": "6f251e85-6a88-409b-ad89-c579a134052b",
                "dispatchTime": 1658836800000,
                "dispatchStatus": "ON",
                "language": "zh-CHT",
                "isFillOut": false,
                "remark": "v1"
            },
            ...
        ],
        "pagination": {
            "current": 1,
            "pageSize": -1,
            "total": 4
        },
        "sorter": {
            "field": "dispatchTime",
            "order": "desc"
        },
        "total": 4
    }
}
```


## 取得使用者問卷調查明細結果

- Web端使用者可以 call /householdMember/getHouseholdMember API 取得用戶(會員)的資訊
  - 請參閱 [Get Household Member](https://hackmd.io/FTyy4D3cRGavm1kFogOGKg#10-Get-Household-Member)
- 使用者問卷調查明細結果請call /questionnaire/info API
  - 請參閱 [取得問卷明細](#取得問卷明細)


---

## 取得問卷列表

```url
POST /questionnaire/list
```

### Request
 欄位 | 型態  | 必填 | 長度限制 | 預設 | 說明  
 ---|---|---|---|---|---
 query | json | Y |  |  | 查詢條件json 

#### query (查詢條件json)
 欄位 | 型態  | 必填 | 長度限制 | 預設 | 說明  
 ---|---|---|---|---|---
 listQueryType | string | | 10 | | 問卷列表查詢類別, 參閱 [App問卷列表查詢類別](#App問卷列表查詢類別)
 

```javascript
{
    "query": {
        "listQueryType": "FILL_OUT"
    }
}
```

### Response-問卷列表
 欄位 | 型態 | 說明 
 ---  | --- | ---
 dispatchId | string | 問卷派送記錄id
 groupId | string | 問卷群組id
 questionnaireId | string | 問卷id
 name | string | 問卷(群組)名稱
 tenantName | string | 派送問卷租戶名稱
 userRecordId | string | 使用者問卷填寫記錄id, User有填寫問卷才有值
 dispatchStatus | string | 問卷派送記錄的派送狀態, 請參閱 [派送記錄狀態](#派送記錄狀態)
 isModifiable | boolean | 是否可以填寫修改
 fillOutStartDate | date | 問卷填寫啟始日期
 fillOutEndDate | date | 問卷填寫結束日期
 dispatchTime | timestamp | 問卷派送時間
 fillOutTime | timestamp | 使用者問卷填寫時間, User有填寫問卷才有值
 groupQuestionnaires | json array | 問卷群組的問卷json array
 
### Response-問卷列表-groupQuestionnaires
 欄位 | 型態 | 說明 
 ---  | --- | ---
 id | string | 問卷id
 language | string | 問卷語系, 參閱 [問卷語系](#問卷語系) 
 
 
```javascript
//listQueryType="FILL"
{
    "httpCode": 200,
    "result": {
        "data": [
            {
                "dispatchId": "e9e335ae-1e79-48f7-a51a-6b75ecbf5367",
                "name": "自訂問卷群-11",
                "tenantName": "緯緯醫學",
                "groupId": "c44c85b1-5d67-4787-bdc6-f6266656e3fd",
                "isModifiable": false,
                "fillOutStartDate": 1658678400000,
                "fillOutEndDate": 1661961599000,
                "dispatchTime": 1658748661901,
                "groupQuestionnaires": [
                    {
                        "id": "9804cb8f-6f0a-48f4-9ba2-6779bd5c0b47",
                        "language": "en-US"
                    },
                    {
                        "id": "6f251e85-6a88-409b-ad89-c579a134052b",
                        "language": "zh-CHT"
                    }
                ]
            }
        ],
        "total": 1
    }
}

//listQueryType="FILL_OUT"
{
    "httpCode": 200,
    "result": {
        "data": [
            {
                "dispatchId": "e9e335ae-1e79-48f7-a51a-6b75ecbf5367",
                "name": "自訂問卷群-11",
                "userRecordId": "baea892b-0c6f-4582-a3cf-3383ce70e29f",
                "tenantName": "緯緯醫學",
                "questionnaireId": "9804cb8f-6f0a-48f4-9ba2-6779bd5c0b47",
                "isModifiable": false,
                "fillOutStartDate": 1658678400000,
                "fillOutEndDate": 1661961599000,
                "dispatchTime": 1658748661901,
                "fillOutTime": 1658968389470
            },
            {
                "dispatchId": "3b5bc656-3d53-43f7-893f-170748e138a9",
                "name": "問卷標題-11",
                "userRecordId": "d8e23b7c-a6f9-46b3-afed-15609bd55d0d",
                "tenantName": "緯緯醫學",
                "questionnaireId": "6f251e85-6a88-409b-ad89-c579a134052b",
                "isModifiable": false,
                "fillOutStartDate": 1659283200000,
                "fillOutEndDate": 1661961599000,
                "dispatchTime": 1658840400000,
                "fillOutTime": 1658968055377
            }
        ],
        "total": 2
    }
}
```


## 取得問卷明細

```url
POST /questionnaire/info
```
- API使用權限:
  - GeneralPublic (App使用者)
  - PlatformAdmin, TenantAdmin, TenantRoleUser (web端用戶)
- 查詢條件有2種方式
  - 已填寫的問卷, 帶入userRecordId
    - Web端使用者只可以使用此種查詢條件
  - 可填寫或已結束的問卷, 帶入dispatchId 及 questionnaireId

### Request
 欄位 | 型態  | 必填 | 長度限制 | 預設 | 說明  
 ---|---|---|---|---|---
 userRecordId | string | **Y**(dispatchId及questionnaireId不填) | 36 | | 使用者問卷填寫記錄id
 dispatchId | string | **Y**(userRecordId不填) | 36 | | 問卷派送記錄id
 questionnaireId | string | **Y**(userRecordId不填) | 36 | | 問卷id
 
```javascript
{
    "userRecordId": "baea892b-0c6f-4582-a3cf-3383ce70e29f",
    "dispatchId": null,
    "questionnaireId": null
}
```

### Error
 httpCode | 錯誤碼 | 說明
 --- | --- | ---
 400 | API_ERROR.ARGUMENT_ERROR | 參數錯誤
 400 | API_ERROR.NOT_EXIST | 無此筆資料
 403 | API_ERROR.PERMISSION_DENIED | 無此操作權限
 422 | SERVICE_ERROR.QUESTIONNAIRE_INFO_OFF_STATUS | 問卷已結束, 無法讀取
 422 | SERVICE_ERROR.QUESTIONNAIRE_INFO_OVER_FILL_OUT_END_DATE | 已超過問卷填寫日期, 無法讀取

### Response-App-問卷明細
 欄位 | 型態 | 說明 
 ---  | --- | ---
 dispatchId | string | 問卷派送記錄id
 name | string | 問卷(群組)名稱
 questionnaireId | string | 問卷id
 tenantId | string | 派送問卷租戶id
 tenantName | string | 派送問卷租戶名稱
 userRecordId | string | 使用者問卷填寫記錄id, User有填寫問卷才有值
 isModifiable | boolean | 是否可以填寫修改
 fillOutStartDate | date | 問卷填寫啟始日期
 fillOutEndDate | date | 問卷填寫結束日期
 dispatchTime | timestamp | 問卷派送時間
 dispatchStatus | string | 問卷派送記錄的派送狀態, 請參閱 [派送記錄狀態](#派送記錄狀態)
 fillOutTime | timestamp | 使用者問卷填寫時間, User有填寫問卷才有值
 questionnaireInfo | json | 問卷json

#### Response-App-問卷明細-問卷-questionnaireInfo (json object)
 欄位 | 型態 | 說明 
 ---  | --- | ---
 id | string | 問卷id 
 tenantId | string | 租戶id
 tenantName | string | 租戶名稱
 tenantShortName | string | 租戶簡稱
 name | string | 問卷名稱
 language | string | 問卷語系, 參閱 [問卷語系](#問卷語系)
 description | string | 問卷說明
 remark | string | 備註
 scoreType | string | 計分方式, 參閱 [計分方式](#計分方式)
 status | string | 問卷狀態, 參閱 [問卷狀態](#問卷狀態)
 isPublic | boolean | 隱私設定, 參閱 [隱私設定](#隱私設定)
 dispatched | boolean | 派送狀態
 createTime | timestamp | 建立日期時間
 updateTime | timestamp | 更新日期時間
 sections | json array | 問卷區段json object array
 generalScoreRule | json | 不分區計分規則json object
 totalScore | double | 問卷填寫總分
 matchedScoreLevel | json | 不分區計分的得分結果json
 
#### Response-App-問卷明細-問卷區段-section (json object)
 欄位 | 型態 | 說明 
 ---  | --- | ---
 id | string | 問卷區段id
 questionnaireId | string | 問卷id
 seq | int | 排序序號
 title | string | 區段名稱
 description | string | 說明
 objectKey | string | 圖檔 objectKey
 url | string | 圖檔 url
 questionData | json array | 問題 json object array
 scoreRule | json | 分區計分規則json object
 score | double | 區段得分分數
 matchedScoreLevel | json | 區段計分的得分結果json

#### Response-App-問卷明細-問題-question (json object)
 欄位 | 型態 | 說明 
 ---  | --- | ---
 id | string | 問題id
 questionnaireId | string | 問卷id
 sectionId | string | 問卷區段id
 seq | int | 排序序號
 title | string | 問題題目
 questionType | string | 題型設定, 請參閱 [題型類別](#題型類別)
 required | boolean | 是否必填
 requireScored | boolean | 是否計分
 objectKey | string | 圖檔 objectKey
 url | string | 圖檔 url
 options | json array | 問題選項 json object array
 answers | string array | 問題回答string array, <br/>questionType="SINGLE"、"MULTIPLE"、"DROPDOWN" 時, 存放的是optionId, <br/>questionType="TEXT"、"DATE"、"TIME" 時, 存放的是自行輸入的回答,
 subAnswers | json array | 選項自帶輸入框的回答json object array, <br/>questionType="SINGLE"、"MULTIPLE" 且canInput=true 時,存放的是optionId 和自行輸入的回答

#### Response-App-問卷明細-問題選項-option (json object)
 欄位 | 型態 | 說明 
 ---  | --- | ---
 id | string | 問題選項id
 questionnaireId | string | 問卷id
 questionId | string | 問題id
 seq | int | 排序序號
 name | string | 選項名稱
 score | decimal | 選項分數
 canInput | boolean | 該選項是否自帶輸入框
 
#### Response-App-問卷明細-選項自行輸入框-subAnswers (json object)
 欄位 | 型態 | 說明 
 ---  | --- | ---
 optionId | string | 問題選項id
 subAnswer | string | 選項自帶輸入框的內容

#### Response-App-問卷明細-計分的得分結果-matchedScoreLevel (json object)
 欄位 | 型態 | 說明 
 ---  | --- | ---
 scoreRuleId | string | 規則id
 sectionId | string | 問卷區段id
 showScore | boolean | 是否顯示分數
 showLevel | boolean | 是否顯示分級
 showDescription | boolean | 是否顯示說明
 scoreLevelId | string | 規則分級id
 op | string | 規則分級條件運算子, 請參閱 [計分規則運算子](#計分規則運算子)
 leftScore | decimal | 分級條件的左邊分數
 rightScore | decimal | 分級條件的右邊分數
 level | string | 分級名稱
 description | string | 分級說明
 score | double | 得分


```javascript
{
    "httpCode": 200,
    "result": {
        "data": {
            "dispatchId": "e9e335ae-1e79-48f7-a51a-6b75ecbf5367",
            "name": "自訂問卷群-11",
            "tenantId": "858b7fbb-3ba0-4d49-9882-c893a1ef07dc",
            "tenantName": "緯緯醫學",
            "questionnaireId": "9804cb8f-6f0a-48f4-9ba2-6779bd5c0b47",
            "isModifiable": false,
            "fillOutStartDate": 1658678400000,
            "fillOutEndDate": 1661875200000,
            "dispatchTime": 1658748661901,
            "dispatchStatus": "ON",
            "userRecordId": "baea892b-0c6f-4582-a3cf-3383ce70e29f",
            "fillOutTime": 1658968389470,
            "questionnaireInfo": {
                "id": "9804cb8f-6f0a-48f4-9ba2-6779bd5c0b47",
                "tenantId": "858b7fbb-3ba0-4d49-9882-c893a1ef07dc",
                "name": "Questionnaire Title-11",
                "language": "en-US",
                "scoreType": "SECTION",
                "status": "ON",
                "tenantName": "緯緯醫學",
                "tenantShortName": "丫緯",
                "sections": [
                    {
                        "id": "037a83e4-f4a3-4d0b-8a5c-771c7b9f3a13",
                        "questionnaireId": "9804cb8f-6f0a-48f4-9ba2-6779bd5c0b47",
                        "seq": 1,
                        "title": "Section Title-1",
                        "description": "Section Description-1",
                        "objectKey": "questionnaire/878b9dad-2dda-4430-9f65-34a521080a11.jpg",
                        "questionData": [
                            {
                                "id": "ca2772ae-2736-4be6-809d-ba2514b2e089",
                                "questionnaireId": "9804cb8f-6f0a-48f4-9ba2-6779bd5c0b47",
                                "sectionId": "037a83e4-f4a3-4d0b-8a5c-771c7b9f3a13",
                                "seq": 1,
                                "title": "Question-1",
                                "questionType": "SINGLE",
                                "required": true,
                                "requireScored": true,
                                "options": [
                                    {
                                        "id": "d44a23fb-d3d9-4c2f-90fc-200f7bfb1371",
                                        "questionnaireId": "9804cb8f-6f0a-48f4-9ba2-6779bd5c0b47",
                                        "questionId": "ca2772ae-2736-4be6-809d-ba2514b2e089",
                                        "seq": 1,
                                        "name": "Option-1",
                                        "score": 1,
                                        "canInput": true
                                    },
                                    {
                                        "id": "7dd4a38a-1944-42a6-8b55-48f6671c289f",
                                        "questionnaireId": "9804cb8f-6f0a-48f4-9ba2-6779bd5c0b47",
                                        "questionId": "ca2772ae-2736-4be6-809d-ba2514b2e089",
                                        "seq": 2,
                                        "name": "Option-2",
                                        "score": 3
                                    },
                                    {
                                        "id": "2d4414df-501d-4123-b540-796dd8447391",
                                        "questionnaireId": "9804cb8f-6f0a-48f4-9ba2-6779bd5c0b47",
                                        "questionId": "ca2772ae-2736-4be6-809d-ba2514b2e089",
                                        "seq": 3,
                                        "name": "Option-3",
                                        "score": 5
                                    }
                                ],
                                "answers": [
                                    "2d4414df-501d-4123-b540-796dd8447391"
                                ]
                            },
                            {
                                "id": "2751c219-09db-49a8-bf90-8cfc7e800913",
                                "questionnaireId": "9804cb8f-6f0a-48f4-9ba2-6779bd5c0b47",
                                "sectionId": "037a83e4-f4a3-4d0b-8a5c-771c7b9f3a13",
                                "seq": 2,
                                "title": "Question-2",
                                "questionType": "TEXT",
                                "required": true,
                                "requireScored": true,
                                "answers": [
                                    "Hello....Free Stype Typing....."
                                ]
                            }
                        ],
                        "url": "http://content-service/swift/v1/questionnaire/878b9dad-2dda-4430-9f65-34a521080a11.jpg"
                    }
                ]
            }
        }
    }
}
```


## 填寫問卷

```url
POST /questionnaire/fill-out
```

- 新填寫問卷或是修改已填寫問卷, 都是呼叫此API
- 若要修改已填寫問卷, 需先確認dispatchStatus、fillOutEndDate、isModifiable 欄位
  - 修改已埴寫問卷, dispatchStatus="ON" AND now <= fillOutEndDate AND isModifiable=TRUE

### Request-填寫問卷
 欄位 | 型態  | 必填 | 長度限制 | 預設 | 說明 
 ---|---|---|---|---|---
 dispatchId | string | Y | 36 |  | 問卷派送記錄id
 questionnaireId | string | Y | 36 |  | 問卷id
 questionAnswers | json array | Y | |  | 問題答案json array

#### Request-填寫問卷-問題答案 questionAnswer (json object)
 欄位 | 型態  | 必填 | 長度限制 | 預設 | 說明 
 ---|---|---|---|---|---
 questionId | string | Y | 36 |  | 問題id
 answers | json array | Y |  | | 問題答案, 
 
#### Response-填寫問卷-選項答案-answers (json object)
 欄位 | 型態 | 說明 
 ---  | --- | ---
 optionId | string | <br/>questionType="SINGLE"、"MULTIPLE"、"DROPDOWN"時, 填入optionId, <br/>questionType="DATE", 請輸入日期,格式為"YYYY-MM-DD", <br/>questionType="TIME", 請輸入時間,格式為"HH:MM", <br/>questionType="TEXT", 自行輸入文字 
 subAnswer | string | 選項自帶輸入框的內容

```javascript
{
    "dispatchId": "e9e335ae-1e79-48f7-a51a-6b75ecbf5367",
    "questionnaireId": "9804cb8f-6f0a-48f4-9ba2-6779bd5c0b47",
    "questionAnswers": [
        {
            "questionId": "ca2772ae-2736-4be6-809d-ba2514b2e089",
            "answers": [
                {
                    "optionId": "f20deb83-dbbc-4860-b495-3e566a5c33c3",
                    "subAnswer": "answer for option"
                }
            ]
        },
        {
            "questionId": "2751c219-09db-49a8-bf90-8cfc7e800913",
            "answers": [
                {
                    "optionId": "Hello....Free Stype Typing.....",
                }
            ]
        }
    ]
}
```

### Error
 httpCode | 錯誤碼 | 說明
 --- | --- | ---
 400 | API_ERROR.ARGUMENT_ERROR | 參數錯誤
 400 | API_ERROR.NOT_EXIST | 無此筆資料
 403 | API_ERROR.PERMISSION_DENIED | 無此操作權限
 422 | SERVICE_ERROR.QUESTIONNAIRE_FILL_OUT_OFF_STATUS | 問卷已結束, 無法填寫
 422 | SERVICE_ERROR.QUESTIONNAIRE_FILL_OUT_OVER_FILL_OUT_END_DATE | 已超過問卷填寫日期, 無法填寫
 422 | SERVICE_ERROR.QUESTIONNAIRE_FILL_OUT_MODIFY_NOT_ALLOWED | 不允許修改已填寫問卷

### Response
 欄位 | 型態 | 說明 
 ---  | --- | ---
 id | string | 使用者問卷填寫記錄id
 householdMemberId | string | householdMemberId
 qdrId | string | 問卷派送記錄id
 questionnaireId | string | 問卷id
 createTime | timestamp | 建立時間
 updateTime | timestamp | 修改時間

```javascript
{
    "httpCode": 200,
    "result": {
        "data": {
            "id": "baea892b-0c6f-4582-a3cf-3383ce70e29f",
            "householdMemberId": "8a9e980a-c612-4f87-af07-a97a5f0fbed5",
            "qdrId": "e9e335ae-1e79-48f7-a51a-6b75ecbf5367",
            "questionnaireId": "9804cb8f-6f0a-48f4-9ba2-6779bd5c0b47",
            "createTime": 1658968389470,
            "updateTime": 1658968389470
        }
    }
}
```

