---
# System prepended metadata

title: 集點卡任務

---

# 集點卡任務

---
- 常數定義
  - [集點卡任務狀態](#集點卡任務狀態)
  - [集點卡任務類型](#集點卡任務類型)
  - [集點卡附件類型](#集點卡附件類型)
  - [集點卡兌換方式](#集點卡兌換方式)
  - [集點卡掃碼規則](#集點卡掃碼規則)
  - [集點卡掃碼間隔單位](#集點卡掃碼間隔單位)
  - [使用者集點卡狀態](#使用者集點卡狀態)
- API 清單
  - 集點卡管理[WEB]
    - [集點卡管理列表](#集點卡管理列表)
    - [取得集點卡管理明細](#取得集點卡管理明細)
    - [取得上傳網址](#取得上傳網址)
    - [新增集點卡任務](#新增集點卡任務)
    - [編輯集點卡任務](#編輯集點卡任務)
    - [編輯集點卡任務狀態](#編輯集點卡任務狀態)
    - [編輯集點卡任務是否顯示](#編輯集點卡任務是否顯示)
    - [刪除集點卡任務](#刪除集點卡任務)
    - [產生集點卡任務QRCode](#產生集點卡任務QRCode)
  - App端
    - [取得集點卡列表](#取得集點卡列表)
    - [取得集點卡明細](#取得集點卡明細)
    - [集點掃碼](#集點掃碼)
    - [兌換集點卡](#兌換集點卡)
---


## 常數定義
### 集點卡任務狀態
 欄位 | 型態  | 說明  
 ---|---|---
 status | string | 集點卡任務發佈狀態, NONE: 未啟用, ON:已啟用, OFF:停用

### 集點卡任務類型
 欄位 | 型態  | 說明  
 ---|---|---
 taskCategory | string | 集點卡任務類型, 01: 集點卡任務, 02: 定位集點任務

### 集點卡附件類型
 欄位 | 型態  | 說明  
 ---|---|---
 attachType | string | 集點卡附件類型, NONE:無, URL:連結, FILE:檔案

### 集點卡兌換方式
 欄位 | 型態  | 說明  
 ---|---|---
 redeemType | string | 集點卡兌換方式, 01: 線上兌換, 02: 線下兌換

### 集點卡掃碼規則
 欄位 | 型態  | 說明  
 ---|---|---
 qrcodeType | string | 集點卡掃碼規則, 01: 使用同一個QRCode, 02: 依集點卡點數產生不同QRCode<BR>taskCategory:02時, qrType固定為02

### 集點卡掃碼間隔單位
 欄位 | 型態  | 說明  
 ---|---|---
 scanIntervalUnit | string | 集點卡掃碼間隔單位, 01: 小時, 02: 天, 03: 分鐘, 04: 秒

### 使用者集點卡狀態
 欄位 | 型態  | 說明  
 ---|---|---
 status | string | 使用者集點卡狀態, VALID: 有效, REDEEMED: 已兌換

### AppUser集點卡任務列表查詢類型
 欄位 | 型態  | 說明  
 ---|---|---
 listType | string | 列表查詢類型, UN_START:未開始, ONGOING:進行中, FINISHED:已結束

---

# API 清單
## 集點卡管理[WEB]

### 集點卡管理列表
```url
POST /loyalty-card-mgmt/list
```

#### Request-集點卡管理列表
##### Request-集點卡管理列表-query (查詢條件json)
 欄位 | 型態  | 必填 | 長度限制 | 預設 | 說明  
 ---|---|---|---|---|---
 status | string | | 10 | | 集點卡任務狀態, 未填則表示查詢全部, 參閱 [集點卡任務狀態](#集點卡任務狀態)
 redeemType | string | | 10 | | 集點卡兌換方式, 未填則表示查詢全部, 參閱 [集點卡兌換方式](#集點卡兌換方式)
 name | string | | 50 | | 關鍵字, 查詢集點卡任務標題
 isShow | boolean | | | | 顯示控制, 未填表示全部, true:顯示, false: 隱藏
 
##### Request-集點卡管理列表-pagination (分頁json)
 欄位 | 型態  | 必填 | 預設 | 說明
 ---|---|---|---|---
 current | int | | 1 | 當前頁數 
 pageSize | int | | 10 | 每頁結果數量，-1 為顯示所有
 
##### Request-集點卡管理列表-sorter (排序json) 
 欄位 | 型態  | 必填 | 預設 | 說明
 ---|---|---|---|--- 
 field | string | | updateTime | 排序欄位,可排序欄位有 taskCategory, issueCardLimit, points, taskStartDate, taskEndDate, redeemType, redeemEndDate, status, updateTime
 order | string | | desc | 升序或降序 

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

#### Response-集點卡任務管理列表
 欄位 | 型態 | 說明 
 ---  | --- | ---
 id | string | 集點卡任務id
 tenantId | string | 租戶id
 taskCategory | string | 集點卡任務類型, 參閱 [集點卡任務類型](#集點卡任務類型)
 title | string | 集點卡任務標題 
 description | string | 集點卡任務說明
 taskStartDate | timestamp | 集點卡任務開始日期
 taskEndDate | timestamp | 集點卡任務結束日期
 thumbnailObjectKey | string | 縮圖objectKey
 positionMapThumbnailObjectKey|string|定位集點地圖縮圖objectKey
 thumbnailUrl | string | 縮圖url
 positionMapThumbnailUrl|string|定位集點地圖縮圖url
 issueCardLimit | int | 發卡數量, -1表示不限發卡數
 points | int | 每張集點卡的點數, 每張集點卡點數上限為30點
 cardsOfAccount | int | 每一帳號最多可集幾張卡
 cardsOfDayAccount | int | 每一帳號每日最多可集幾張卡
 redeemType | string | 集點卡兌換方式, 參閱 [集點卡兌換方式](#集點卡兌換方式)
 redeemHealthPoints | int | 集點卡兌換方式為01:線上兌換時, 可兌換的Health365點數
 redeemEndDate | timestamp | 兌換截止日
 status | string | 集點卡任務狀態, 參閱 [集點卡任務狀態](#集點卡任務狀態)
 qrcodeType | string | 集點卡掃碼規則, 參閱 [集點卡掃碼規則](#集點卡掃碼規則)
 isInterval | boolean | 集點卡掃碼規則為01:使用同一個QRCode時, 是否需要間隔
 scanIntervalFreq | int | 集點卡掃碼規則為01:使用同一個QRCode時, 所需間隔頻率
 scanIntervalUnit | string | 集點卡掃碼規則為01:使用同一個QRCode時, 所需間隔單位, 參閱 [集點卡掃碼間隔單位](#集點卡掃碼間隔單位)
 attachType | string | 集點卡附件類型, 參閱 [集點卡附件類型](#集點卡附件類型)
 attachObjectKey | string | attachType為FILE時, 表示storage 中的 objectKey, attachType為URL時, 表示連結的網址
 attachUrl | string | attachType為FILE時,可 download 的 url, 時效 3600 秒, attachType為URL時, 表示連結的網址
 creator | string | 建立者 account id
 updater | string | 更新者 account id
 createTime | timestamp | 建立日期時間
 updateTime | timestamp | 更新日期時間
 mapsApiCalls | int | 地圖API呼叫次數, 如果是定位集點類型, 且有呼叫過地圖API
 isShow | boolean | 顯示控制, true:顯示, false: 隱藏

```javascript
{
    "httpCode": 200,
    "result": {
        "data": [
            {
                "id": "9c06e179-25ba-4744-9c62-cbf1b8dedeb1",
                "tenantId": "858b7fbb-3ba0-4d49-9882-c893a1ef07dc",
                "taskCategory": "01",
                "title": "高雄前金健走尋寶任務-1",
                "description": "集滿10點即可兌換 Health 365照護平台健康點數100點，可兌換優惠票券！....",
                "taskStartDate": 1668528000000,
                "taskEndDate": 1670601600000,
                "thumbnailObjectKey": "loyalty_card/thumbnail/56ca1cfc-4bcb-4a0a-b079-fd08a0e75a37.png",
                "positionMapThumbnailObjectKey": "loyalty_card/thumbnail/44021b7a-d6bc-497f-91b8-0a4482b2f3db.png",
                "issueCardLimit": 20,
                "points": 10,
                "cardsOfAccount": 2,
                "cardsOfDayAccount": 1,
                "redeemType": "01",
                "redeemHealthPoints": 100,
                "redeemEndDate": 1672416000000,
                "status": "NONE",
                "qrcodeType": "01",
                "isInterval": true,
                "scanIntervalFreq": 1,
                "scanIntervalUnit": "01",
                "attachType": "FILE",
                "attachObjectKey": "loyalty_card/56ca1cfc-4bcb-4a0a-b079-fd08a0e75a38.png",
                "createTime": 1669260917092,
                "updateTime": 1669260917092,
                "creator": "98953ae4-b8f1-488c-b3ae-cb64d8caae15",
                "thumbnailUrl": "http://content-service/swift/v1/loyalty_card/thumbnail/56ca1cfc-4bcb-4a0a-b079-fd08a0e75a37.png",
                "positionMapThumbnailUrl": "http://10.31.104.23/swift/v1/AUTH_test/kmuh/loyalty_card/thumbnail/44021b7a-d6bc-497f-91b8-0a4482b2f3db.png?temp_url_sig=febcd17cfb3900550a6e867733e485729e2a3c7d&temp_url_expires=1676463927",
                "attachUrl": "http://content-service/swift/v1/loyalty_card/56ca1cfc-4bcb-4a0a-b079-fd08a0e75a38.png",
                "mapsApiCalls": 1,
                "isShow": true
            },
            ...
        ],
        "pagination": {
            "current": 1,
            "pageSize": 10
        },
        "sorter": {
            "field": "updateTime",
            "order": "desc"
        }
    }
}
```

### 取得集點卡管理明細
```url
POST /loyalty-card-mgmt/info
```

#### Request-取得集點卡管理明細
 欄位 | 型態  | 必填 | 長度限制 | 預設 | 說明  
 ---|---|---|---|---|---
 id | string | Y | 36 | | 集點卡任務id
 
```javascript
{
    "id": "9c06e179-25ba-4744-9c62-cbf1b8dedeb1"
}
```

#### Response-取得集點卡管理明細
 欄位 | 型態 | 說明 
 ---  | --- | ---
 id | string | 集點卡任務id
 tenantId | string | 租戶id
 taskCategory | string | 集點卡任務類型, 參閱 [集點卡任務類型](#集點卡任務類型)
 title | string | 集點卡任務標題 
 description | string | 集點卡任務說明
 taskStartDate | timestamp | 集點卡任務開始日期
 taskEndDate | timestamp | 集點卡任務結束日期
 thumbnailObjectKey | string | 縮圖objectKey
 positionMapThumbnailObjectKey|string|定位集點地圖縮圖objectKey
 thumbnailUrl | string | 縮圖url
 positionMapThumbnailUrl|string|定位集點地圖縮圖url
 loyaltyCardPointList|json array|點數的座標列表
 issueCardLimit | int | 發卡數量, -1表示不限發卡數
 points | int | 每張集點卡的點數, 每張集點卡點數上限為30點
 cardsOfAccount | int | 每一帳號最多可集幾張卡
 cardsOfDayAccount | int | 每一帳號每日最多可集幾張卡
 redeemType | string | 集點卡兌換方式, 參閱 [集點卡兌換方式](#集點卡兌換方式)
 redeemHealthPoints | int | 集點卡兌換方式為01:線上兌換時, 可兌換的Health365點數
 redeemEndDate | timestamp | 兌換截止日
 status | string | 集點卡任務狀態, 參閱 [集點卡任務狀態](#集點卡任務狀態)
 qrcodeType | string | 集點卡掃碼規則, 參閱 [集點卡掃碼規則](#集點卡掃碼規則)
 isInterval | boolean | 集點卡掃碼規則為01:使用同一個QRCode時, 是否需要間隔
 scanIntervalFreq | int | 集點卡掃碼規則為01:使用同一個QRCode時, 所需間隔頻率
 scanIntervalUnit | string | 集點卡掃碼規則為01:使用同一個QRCode時, 所需間隔單位, 參閱 [集點卡掃碼間隔單位](#集點卡掃碼間隔單位)
 attachType | string | 集點卡附件類型, 參閱 [集點卡附件類型](#集點卡附件類型)
 attachObjectKey | string | attachType為FILE時, 表示storage 中的 objectKey, attachType為URL時, 表示連結的網址
 attachUrl | string | attachType為FILE時,可 download 的 url, 時效 3600 秒, attachType為URL時, 表示連結的網址
 issueCount | int | 已發出的集點卡張數
 creator | string | 建立者 account id
 updater | string | 更新者 account id
 createTime | timestamp | 建立日期時間
 updateTime | timestamp | 更新日期時間
 isShow | boolean | 顯示控制, true:顯示, false: 隱藏
 historyList | json array | 狀態歷史記錄
 sport_mod | string | 集滿點後要新增的運動模式
 sportDistance | float | 集滿點後要新增的運動距離.
 sportKcal | int | 更新者 account id集滿點後要新增的消耗熱量

##### Response-loyaltyCardPointList
 欄位 | 型態  | 說明 
 ---|---|---
 seq| string |該點位序號
 latitude | string | 緯度, 範圍-90~90, 取到小數點下五位. e.g.: 35.25422
 longitude | string |經度, 範圍-180~180, 取到小數點下五位. e.g.: -135.25422
 checkDistance| string  |該點位達標距離, 單位:公尺
 positionInfoList| json array|該點位的位置資訊
 
##### Response-positionInfoList
 欄位 | 型態   | 說明 
 ---|---|---
 title | string | 位置標題
 description | string  |位置描述
 objectKey| string  |位置圖檔objectKey
 url|string|位置圖檔URL

##### Response-historyList(json)
 欄位 | 型態 | 說明 
 ---  | --- | ---
 loyaltyCardTaskId | string | 集點卡任務id
 status | string | 集點卡任務狀態, 參閱 [集點卡任務狀態](#集點卡任務狀態)
 dateTime | timestamp | 異動時間


```javascript=
// taskCategory: 01
{
    "httpCode": 200,
    "result": {
        "data": {
            "id": "04e38915-7d3a-424e-9e5a-2e9ca7a851a3",
            "tenantId": "858b7fbb-3ba0-4d49-9882-c893a1ef07dc",
            "taskCategory": "01",
            "title": "高雄前金健走尋寶任務-4",
            "description": "集滿10點即可兌換 Health 365照護平台健康點數100點，可兌換優惠票券！...",
            "taskStartDate": 1669824000000,
            "taskEndDate": 1672416000000,
            "thumbnailObjectKey": "loyalty_card/thumbnail/56ca1cfc-4bcb-4a0a-b079-fd08a0e75a37.png",
            "issueCardLimit": 10,
            "points": 5,
            "cardsOfAccount": 2,
            "cardsOfDayAccount": 1,
            "redeemType": "01",
            "redeemHealthPoints": 50,
            "redeemEndDate": 1672416000000,
            "status": "NONE",
            "qrcodeType": "01",
            "isInterval": true,
            "scanIntervalFreq": 1,
            "scanIntervalUnit": "01",
            "attachType": "FILE",
            "attachObjectKey": "loyalty_card/56ca1cfc-4bcb-4a0a-b079-fd08a0e75a38.png",
            "issueCount": 0,
            "createTime": 1670489589736,
            "updateTime": 1670489589736,
            "creator": "98953ae4-b8f1-488c-b3ae-cb64d8caae15",
            "thumbnailUrl": "http://content-service/swift/v1/loyalty_card/thumbnail/56ca1cfc-4bcb-4a0a-b079-fd08a0e75a37.png",
            "attachUrl": "http://content-service/swift/v1/loyalty_card/56ca1cfc-4bcb-4a0a-b079-fd08a0e75a38.png",
            "sportMod": "SWIMMING",
            "sportDistance": 1.5,
            "sportKcal": 342,
            "loyaltyCardPointList": [
                {
                    "seq": 1,
                    "latitude": "-76.1",
                    "longitude": "99.37777",
                    "checkDistance": 15.2,
                    "positionInfoList": []
                },
                {
                    "seq": 2,
                    "latitude": "-56.1",
                    "longitude": "129.37777",
                    "checkDistance": 50.2,
                    "positionInfoList": []
                }
            ],
            "isShow": true,
            "historyList": [
                {
                    "loyaltyCardTaskId": "2d2556ed-980f-4a53-ac52-f70f514f3169",
                    "dateTime": 1679968614701,
                    "status": "OFF"
                }
            ]
        }
    }
}
// taskCategory: 02
{
    "httpCode": 200,
    "result": {
        "data": {
            "id": "e458c035-0099-4839-a9ee-c7e7946fe73c",
            "tenantId": "5efcfd67-334e-45b3-bf49-7e52f5172891",
            "taskCategory": "02",
            "title": "123",
            "description": "2",
            "taskStartDate": 1676390400000,
            "taskEndDate": 1676390400000,
            "thumbnailObjectKey": "loyalty_card/thumbnail/44021b7a-d6bc-497f-91b8-0a4482b2f3db.png",
            "positionMapThumbnailObjectKey": "loyalty_card/thumbnail/44021b7a-d6bc-497f-91b8-0a4482b2f3db.png",
            "issueCardLimit": -1,
            "points": 2,
            "cardsOfAccount": 1,
            "cardsOfDayAccount": -1,
            "redeemType": "01",
            "redeemHealthPoints": 1,
            "redeemEndDate": 1676390400000,
            "status": "NONE",
            "qrcodeType": "02",
            "isInterval": false,
            "attachType": "NONE",
            "issueCount": 0,
            "createTime": 1678869366966,
            "updateTime": 1678869366966,
            "creator": "396bc74c-8f2a-4b0d-ba6a-c3bc2f886d26",
            "thumbnailUrl": "http://10.31.104.23/swift/v1/AUTH_test/kmuh/loyalty_card/thumbnail/44021b7a-d6bc-497f-91b8-0a4482b2f3db.png?temp_url_sig=67d3a2c50b1f4182920f8c718290b74915d1c4c7&temp_url_expires=1678876582",
            "positionMapThumbnailUrl": "http://10.31.104.23/swift/v1/AUTH_test/kmuh/loyalty_card/thumbnail/44021b7a-d6bc-497f-91b8-0a4482b2f3db.png?temp_url_sig=67d3a2c50b1f4182920f8c718290b74915d1c4c7&temp_url_expires=1678876582",
            "attachUrl": null,
            "loyaltyCardPointList": [
                {
                    "seq": 1,
                    "latitude": "-76.1",
                    "longitude": "99.37777",
                    "checkDistance": 15.2,
                    "positionInfoList": [
                        {
                            "objectKey": "loyalty_card/thumbnail/44021b7a-d6bc-497f-91b8-0a4482b2f3db.png",
                            "url": "http://10.31.104.23/swift/v1/AUTH_test/kmuh/loyalty_card/thumbnail/44021b7a-d6bc-497f-91b8-0a4482b2f3db.png?temp_url_sig=67d3a2c50b1f4182920f8c718290b74915d1c4c7&temp_url_expires=1678876582",
                            "title": "title",
                            "description": "des"
                        },
                        {
                            "title": "title2",
                            "description": "des3"
                        }
                    ]
                },
                {
                    "seq": 2,
                    "latitude": "-56.1",
                    "longitude": "129.37777",
                    "checkDistance": 50.2,
                    "positionInfoList": []
                }
            ]
        }
    }
}
```

### 取得上傳網址
```url
POST /loyalty-card-mgmt/get-upload-url
```

*  新增/編輯集點卡任務時用來上傳縮圖

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

##### Request-取得上傳網址-part(Object)
 欄位 | 型態  | 必填 | 預設 | 說明 
 ---|---|---|---|---
 chunkSize | int | Y | | 該 chunk 的大小, bytes
 md5 | string | Y | | 該 part 的 md5
 part | int | Y | | part number, 第幾塊 chunk

```javascript
// 單檔
{
    "isMultipart": false,
    "fileName": "loyalty_card_test-2",
    "fileType": "png",
    "totalPart": null,
    "parts": [
    ],
    "isThumbnail": true
}

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

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

##### Response-取得上傳網址-part
 欄位 | 型態 | 說明 
 ---  | --- | ---
 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": "loyalty_card/thumbnail/56ca1cfc-4bcb-4a0a-b079-fd08a0e75a37.png",
            "uploadId": "fb483648-25d0-4137-bb49-85c17842a95b",
            "fileName": "loyalty_card_test-2",
            "fileType": "png",
            "url": "http://swift-storage/loyalty_card/thumbnail/56ca1cfc-4bcb-4a0a-b079-fd08a0e75a37.png"
        }
    }
}
// 分塊上傳
{
    "httpCode": 200,
    "result": {
        "data": {
            "objectKey": "event/f76adf26-1e22-4b18-980d-b9a68efc5171.mp4",
            "uploadId": "53fde368-43d9-455f-a610-62091fc30be6",
            "fileName": "giphy (7)",
            "fileType": "mp4",
            "parts": [
                {
                    "chunkSize": 5242880,
                    "md5": "5AACA89868CD486D81192221CF9F9415",
                    "part": 1,
                    "url": "http://192.168.100.239:12345/v1/AUTH_test/kmuh_segments/event%2Ff76adf26-1e22-4b18-980d-b9a68efc5171.mp4%2F1?temp_url_sig=796c52b00f75b62be658533b2fadbc7f14381e36&temp_url_expires=1554263771"
                },
                {
                    "chunkSize": 3145728,
                    "md5": "5AACA89868CD486D81192221CF9F9415",
                    "part": 2,
                    "url": "http://192.168.100.239:12345/v1/AUTH_test/kmuh_segments/event%2Ff76adf26-1e22-4b18-980d-b9a68efc5171.mp4%2F2?temp_url_sig=ad71de81dfbcd94bce4a091f2630c6f1373ff3cd&temp_url_expires=1554263771"
                }
            ]
        }
    }
}
```

### 新增集點卡任務
```url
POST /loyalty-card-mgmt/add
```

* 目前集點卡任務類型有 01:集點卡任務, 02:定位集點任務
* 集點卡掃碼規則選擇 01:使用同一個QRCode時, 需設定掃碼間隔頻率

#### Request-新增集點卡任務
 欄位 | 型態  | 必填 | 長度限制 | 預設 | 說明  
 ---|---|---|---|---|---
 taskCategory | string | Y  | 10 | 01 | 集點卡任務類型, 參閱 [集點卡任務類型](#集點卡任務類型)
 title | string | Y | 30 | | 集點卡任務標題, 限制最多30字
 description | string |  | 1000 | | 集點卡任務說明, 限制最多1000字
 taskStartDate| date | Y | | | 集點卡任務開始日期
 taskEndDate  | date | Y | | | 集點卡任務結束日期
 thumbnailObjectKey | string | Y | 500 | | 縮圖objectKey, 先取得縮圖上傳網址並上傳成功，取其 objectKey。
 positionMapThumbnailObjectKey | string | N | 500 | | taskCategory: 01時為必填, 地圖縮圖objectKey, 先取得縮圖上傳網址並上傳成功，取其 objectKey。
 issueCardLimit | int | Y | | | 發卡數量, -1表示不限發卡數
 points | int | Y | | | 每張集點卡的點數, 每張集點卡點數上限為30點
 cardsOfAccount | int | Y | | 1 | 每一帳號最多可集幾張卡
 cardsOfDayAccount | int | Y | | 1 | 每一帳號每日最多可集幾張卡
 redeemType | string | Y | 10 | |  集點卡兌換方式, 參閱 [集點卡兌換方式](#集點卡兌換方式)
 redeemHealthPoints | int | | | | 集點卡兌換方式為01:線上兌換時, 可兌換的Health365點數
 redeemEndDate | date | Y | | | 兌換截止日
 status | string | Y | 10 | NONE | 集點卡任務狀態, 參閱 [集點卡任務狀態](#集點卡任務狀態)
 qrcodeType | string | N | 10 | | taskCategory: 01時為必填, 集點卡掃碼規則, 參閱 [集點卡掃碼規則](#集點卡掃碼規則)
 isInterval | boolean | **Y**(qrcodeType=01) | | | 集點卡掃碼規則為01:使用同一個QRCode時 必填, 是否需要間隔
 scanIntervalFreq | int | **Y**(qrcodeType=01 && isInterval=true) | | | 集點卡掃碼規則為01:使用同一個QRCode時, 所需間隔頻率
 scanIntervalUnit | string | **Y**(qrcodeType=01 && isInterval=true) | | | 集點卡掃碼規則為01:使用同一個QRCode時, 所需間隔單位, 參閱 [集點卡掃碼間隔單位](#集點卡掃碼間隔單位)
 loyaltyCardPointList|json array|**N** (taskCategory!=02)<br>**Y** (taskCategory==02)| 定位集點的座標點位, 點位數量必須和points相同
 isThumbnailMultipart | boolean | N | | | 縮圖上傳時是否分塊上傳，預設為 false
 thumbnailTotalPart | int | **N** (isThumbnailMultipart=false)<br>**Y** (isThumbnailMultipart=true) | | | 縮圖上傳的總分塊數量，不可小於2
 thumbnailUploadId | string | **N** (isThumbnailMultipart=false)<br>**Y** (isThumbnailMultipart=true) | | | 從 /loyalty-card-mgmt/get-upload-url 取得的 uploadId
 isPositionMapThumbnailMultipart | boolean | N | | | 地圖縮圖上傳時是否分塊上傳，預設為 false
 positionMapThumbnailTotalPart | int | **N** (isPositionMapThumbnailMultipart=false)<br>**Y** (isPositionMapThumbnailMultipart=true) | | | 縮圖上傳的總分塊數量，不可小於2
 positionMapThumbnailUploadId | string | **N** (isPositionMapThumbnailMultipart=false)<br>**Y** (isPositionMapThumbnailMultipart=true) | | | 從 /loyalty-card-mgmt/get-upload-url 取得的 uploadId
 attachType | string | Y | 10 | | 集點卡附件類型, 參閱 [集點卡附件類型](#集點卡附件類型)
 attachObjectKey | string | **Y**(attachType= URL/FILE) | 500 | | 若attachType為FILE, 先取得上傳網址並上傳成功，取其 objectKey。若attachType為URL則直接存放URL網址
 isAttachMultipart | boolean | N | |  | attachType=FILE時, 上傳的檔案是否分塊上傳，預設為 false
 attachTotalPart | int | **N** (isAttachMultipart=false)<br>**Y** (isAttachMultipart=true) | | | 總分塊數量，不可小於2
 attachUploadId | string | **N** (isAttachMultipart=false)<br>**Y** (isAttachMultipart=true) | | | 從 /loyal-card-mgmt/get-upload-url 取得的 uploadId
 sportMod | String | N | |  | 集滿點後要新增的運動模式, 只有集點任務可以設定
 sportDistance | float | N | |  | 運動距離(m).如果有設定sportMod, 和sportKcal則一必填
 sportKcal | int | N | |  | 消耗熱量(千卡).如果有設定sportMod, 和sportDistance則一必填
 
 ##### Request-loyaltyCardPointList
 欄位 | 型態  | 必填 | 預設 | 說明 
 ---|---|---|---|---
 lat | string | Y | | 緯度, 範圍-90~90, 取到小數點下五位. e.g.: 35.25422
 lng | string | Y | |經度, 範圍-180~180, 取到小數點下五位. e.g.: -135.25422
 checkDistance| string | Y | |該點位達標距離, 單位:公尺
 positionInfoList| json array|N|該點位的位置資訊
 
  ##### Request-positionInfoList
 欄位 | 型態  | 必填 | 預設 | 說明 
 ---|---|---|---|---
 title | string | N | | 位置標題
 description | string | N | |位置描述
 objectKey| string | Y | |位置圖檔objectKey

```javascript
{
    "taskCategory": "01",
    "title": "高雄前金健走尋寶任務-1",
    "description": "集滿10點即可兌換 Health 365照護平台健康點數100點，可兌換優惠票券！ ...",
    "taskStartDate": "2022-11-16",
    "taskEndDate": "2022-12-10",
    "thumbnailObjectKey": "loyalty_card/thumbnail/56ca1cfc-4bcb-4a0a-b079-fd08a0e75a37.png",
    "issueCardLimit": 20,
    "points": 10,
    "cardsOfAccount": 2,
    "cardsOfDayAccount": 1,
    "redeemEndDate": "2022-12-31",
    "redeemType": "01",
    "redeemHealthPoints": 100,
    "status": "NONE",
    "qrcodeType": "01",
    "isInterval": true,
    "scanIntervalFreq": 1,
    "scanIntervalUnit": "01",
    "isThumbnailMultipart":false,
    "thumbnailTotalPart": null,
    "thumbnailUploadId": null,
    "attachType": "FILE",
    "attachObjectKey": "loyalty_card/56ca1cfc-4bcb-4a0a-b079-fd08a0e75a38.png",
    "isAttachMultipart":false,
    "attachTotalPart": null,
    "attachUploadId": null,
    "positionMapThumbnailObjectKey": "loyalty_card/thumbnail/44021b7a-d6bc-497f-91b8-0a4482b2f3db.png",
    "sportMod": "SWIMMING",
    "sportKcal": "39",
    "sportDistance": "324"
    "positionList": [
        {
            "lat": -76.1,
            "lng": "99.37777",
            "checkDistance": 15.2,
            "positionInfoList": [
                {
                    "title": "title",
                    "description": "des",
                    "objectKey": "loyalty_card/thumbnail/44021b7a-d6bc-497f-91b8-0a4482b2f3db.png"
                }, {
                    "title": "title2",
                    "description": "des2"
                }
            ]
        },
        {
            "lat": -56.1,
            "lng": "129.37777",
            "checkDistance": 50.2
        }
    ]
}
```

#### Error-新增集點卡任務
 httpCode | 錯誤碼 | 說明
 --- | --- | ---
 400 | API_ERROR.ARGUMENT_ERROR | 輸入參數錯誤, 可參閱 errorDesc

#### Response-新增集點卡任務
 欄位 | 型態 | 說明 
 ---  | --- | ---
 id | string | 集點卡任務id
 tenantId | string | 租戶id
 taskCategory | string | 集點卡任務類型, 參閱 [集點卡任務類型](#集點卡任務類型)
 title | string | 集點卡任務標題 
 description | string | 集點卡任務說明
 taskStartDate | timestamp | 集點卡任務開始日期
 taskEndDate | timestamp | 集點卡任務結束日期
 thumbnailObjectKey | string | 縮圖objectKey
 positionMapThumbnailObjectKey | string | 地圖縮圖objectKey
 thumbnailUrl | string | 縮圖url
 issueCardLimit | int | 發卡數量, -1表示不限發卡數
 points | int | 每張集點卡的點數, 每張集點卡點數上限為30點
 cardsOfAccount | int | 每一帳號最多可集幾張卡
 cardsOfDayAccount | int | 每一帳號每日最多可集幾張卡
 redeemType | string | 集點卡兌換方式, 參閱 [集點卡兌換方式](#集點卡兌換方式)
 redeemHealthPoints | int | 集點卡兌換方式為01:線上兌換時, 可兌換的Health365點數
 redeemEndDate | timestamp | 兌換截止日
 status | string | 集點卡任務狀態, 參閱 [集點卡任務狀態](#集點卡任務狀態)
 qrcodeType | string | 集點卡掃碼規則, 參閱 [集點卡掃碼規則](#集點卡掃碼規則)
 isInterval | boolean | 集點卡掃碼規則為01:使用同一個QRCode時, 是否需要間隔
 scanIntervalFreq | int | 集點卡掃碼規則為01:使用同一個QRCode時, 所需間隔頻率
 scanIntervalUnit | string | 集點卡掃碼規則為01:使用同一個QRCode時, 所需間隔單位, 參閱 [集點卡掃碼間隔單位](#集點卡掃碼間隔單位)
 positionList|json array|**N** (taskCategory!=02)<br>**Y** (taskCategory==02)| 定位集點的座標點位, 點位數量必須和points相同
 attachType | string | 集點卡附件類型, 參閱 [集點卡附件類型](#集點卡附件類型)
 attachObjectKey | string | attachType為FILE時, 表示storage 中的 objectKey, attachType為URL時, 表示連結的網址
 creator | string | 建立者 account id
 updater | string | 更新者 account id
 createTime | timestamp | 建立日期時間
 updateTime | timestamp | 更新日期時間

```javascript
{
    "httpCode": 200,
    "result": {
        "data": {
            "id": "f9e793e5-be39-4cdd-b1e8-dede763f4ee2",
            "tenantId": "858b7fbb-3ba0-4d49-9882-c893a1ef07dc",
            "taskCategory": "01",
            "title": "高雄前金健走尋寶任務-1",
            "description": "集滿10點即可兌換 Health 365照護平台健康點數100點，可兌換優惠票券！ 高雄前金健走尋寶任務活動為期二個月，參加者只需要前往指定地點打卡集點，集滿10點就可以兌換 Health365 健康幣1000點哦～ !此為限量集點活動，動作要快！ 1.高雄市立大同醫院音樂樓梯2樓 2.高雄市中央公園水廣場 3.高雄市中央公園城市光廊 4.高雄市中央公園文學館 5.前金肉燥飯 6.高雄市區烏弄任一門市",
            "taskStartDate": 1668528000000,
            "taskEndDate": 1670601600000,
            "thumbnailObjectKey": "loyalty_card/thumbnail/56ca1cfc-4bcb-4a0a-b079-fd08a0e75a37.png",
            "positionMapThumbnailObjectKey": "loyalty_card/thumbnail/44021b7a-d6bc-497f-91b8-0a4482b2f3db.png",
            "issueCardLimit": 20,
            "points": 10,
            "cardsOfAccount": 2,
            "cardsOfDayAccount": 1,
            "redeemType": "01",
            "redeemHealthPoints": 100,
            "redeemEndDate": 1672416000000,
            "status": "NONE",
            "qrcodeType": "01",
            "isInterval": true,
            "scanIntervalFreq": 1,
            "scanIntervalUnit": "01",
            "attachType": "FILE",
            "attachObjectKey": "loyalty_card/56ca1cfc-4bcb-4a0a-b079-fd08a0e75a38.png",
            "createTime": 1669281408309,
            "updateTime": 1669281408309,
            "creator": "98953ae4-b8f1-488c-b3ae-cb64d8caae15"
        }
    }
}
```

### 編輯集點卡任務
```url
POST /loyalty-card-mgmt/update
```

* 目前集點卡任務類型有 01:集點卡任務, 02:定位集點任務
* 集點卡掃碼規則選擇 01:使用同一個QRCode時, 需設定掃碼間隔頻率
* 目前只能編輯狀態為停用, 且未超過集點卡任務結東日期的任務
* 若集點卡任務已發出集點卡(可參照issueCount已發出點集卡張數), 則只開放編輯 title, description, taskEndDate, redeemEndDate欄位

#### Request-編輯集點卡任務
 欄位 | 型態  | 必填 | 長度限制 | 預設 | 說明  
 ---|---|---|---|---|---
 id | string | Y | 36 | | 集點卡任務id
 taskCategory | string | Y  | 10 | 01 | 集點卡任務類型, 參閱 [集點卡任務類型](#集點卡任務類型)
 title | string | Y | 30 | | 集點卡任務標題, 限制最多30字
 description | string |  | 1000 | | 集點卡任務說明, 限制最多1000字
 taskStartDate| date | Y | | | 集點卡任務開始日期
 taskEndDate  | date | Y | | | 集點卡任務結束日期
 thumbnailObjectKey | string | Y | 500 | | 縮圖objectKey, 先取得縮圖上傳網址並上傳成功，取其 objectKey。
 issueCardLimit | int | Y | | | 發卡數量, -1表示不限發卡數
 points | int | Y | | | 每張集點卡的點數, 每張集點卡點數上限為30點
 cardsOfAccount | int | Y | | 1 | 每一帳號最多可集幾張卡
 cardsOfDayAccount | int | Y | | 1 | 每一帳號每日最多可集幾張卡
 redeemType | string | Y | 10 | |  集點卡兌換方式, 參閱 [集點卡兌換方式](#集點卡兌換方式)
 redeemHealthPoints | int | | | | 集點卡兌換方式為01:線上兌換時, 可兌換的Health365點數
 redeemEndDate | date | Y | | | 兌換截止日
 status | string | Y | 10 | NONE | 集點卡任務狀態, 參閱 [集點卡任務狀態](#集點卡任務狀態)
 qrcodeType | string | Y | 10 | | 集點卡掃碼規則, 參閱 [集點卡掃碼規則](#集點卡掃碼規則)
 isInterval | boolean | **Y**(qrcodeType=01) | | | 集點卡掃碼規則為01:使用同一個QRCode時, 是否需要間隔
 scanIntervalFreq | int | **Y**(qrcodeType=01 && isInterval=true) | | | 集點卡掃碼規則為01:使用同一個QRCode時, 所需間隔頻率
 scanIntervalUnit | string | **Y**(qrcodeType=01 && isInterval=true) | | | 集點卡掃碼規則為01:使用同一個QRCode時, 所需間隔單位, 參閱 [集點卡掃碼間隔單位](#集點卡掃碼間隔單位)
 isThumbnailMultipart | boolean | N | | | 縮圖上傳時是否分塊上傳，預設為 false
 thumbnailTotalPart | int | **N** (isThumbnailMultipart=false)<br>**Y** (isThumbnailMultipart=true) | | | 縮圖上傳的總分塊數量，不可小於2
 thumbnailUploadId | string | **N** (isThumbnailMultipart=false)<br>**Y** (isThumbnailMultipart=true) | | | 從 /loyalty-card-mgmt/get-upload-url 取得的 uploadId
 positionMapThumbnailTotalPart | int | **N** (isPositionMapThumbnailMultipart=false)<br>**Y** (isPositionMapThumbnailMultipart=true) | | | 縮圖上傳的總分塊數量，不可小於2
 positionMapThumbnailUploadId | string | **N** (isPositionMapThumbnailMultipart=false)<br>**Y** (isPositionMapThumbnailMultipart=true) | | | 從 /loyalty-card-mgmt/get-upload-url 取得的 uploadId
 attachType | string | Y | 10 | | 集點卡附件類型, 參閱 [集點卡附件類型](#集點卡附件類型)
 attachObjectKey | string | **Y**(attachType= URL/FILE) | 500 | | 若attachType為FILE, 先取得上傳網址並上傳成功，取其 objectKey。若attachType為URL則直接存放URL網址
 isAttachMultipart | boolean | N | |  | attachType=FILE時, 上傳的檔案是否分塊上傳，預設為 false
 attachTotalPart | int | **N** (isAttachMultipart=false)<br>**Y** (isAttachMultipart=true) | | | 總分塊數量，不可小於2
 attachUploadId | string | **N** (isAttachMultipart=false)<br>**Y** (isAttachMultipart=true) | | | 從 /loyal-card-mgmt/get-upload-url 取得的 uploadId
  sportMod | String | N | |  | 集滿點後要新增的運動模式, 只有集點任務可以設定
 sportDistance | float | N | |  | 運動距離(m).如果有設定sportMod, 和sportKcal則一必填
 sportKcal | int | N | |  | 消耗熱量(千卡).如果有設定sportMod, 和sportDistance則一必填

 ##### Request-positionList
 欄位 | 型態  | 必填 | 預設 | 說明 
 ---|---|---|---|---
 lat | int | Y | | 緯度, 範圍-90~90, 取到小數點下五位. e.g.: 35.25422
 lng | string | Y | |經度, 範圍-180~180, 取到小數點下五位. e.g.: -135.25422
 checkDistance| string | Y | |該點位達標距離, 單位:公尺
  positionInfoList| json array|N|該點位的位置資訊
 
  ##### Request-positionInfoList
 欄位 | 型態  | 必填 | 預設 | 說明 
 ---|---|---|---|---
 title | string | N | | 位置標題
 description | string | N | |位置描述
 objectKey| string | Y | |位置圖檔objectKey
```javascript
{
    "id": "f9e793e5-be39-4cdd-b1e8-dede763f4ee2",
    "title": "高雄前金健走尋寶任務-2-1",
    "description": "集滿10點即可兌換 Health 365照護平台健康點數100點，可兌換優惠票券！...",
    "taskStartDate": "2022-11-16",
    "taskEndDate": "2022-12-10",
    "thumbnailObjectKey": "loyalty_card/thumbnail/56ca1cfc-4bcb-4a0a-b079-fd08a0e75a37.png",
    "issueCardLimit": 20,
    "points": 10,
    "cardsOfAccount": 2,
    "cardsOfDayAccount": 1,
    "redeemEndDate": "2022-12-31",
    "redeemType": "01",
    "redeemHealthPoints": 100,
    "status": "NONE",
    "qrcodeType": "01",
    "isInterval": true,
    "scanIntervalFreq": 1,
    "scanIntervalUnit": "01",
    "isThumbnailMultipart":false,
    "thumbnailTotalPart": null,
    "thumbnailUploadId": null,
    "attachType": "URL",
    "attachObjectKey": "https://www.google.com",
    "isAttachMultipart":false,
    "attachTotalPart": null,
    "attachUploadId": null,
    "positionMapThumbnailObjectKey": "loyalty_card/thumbnail/44021b7a-d6bc-497f-91b8-0a4482b2f3db.png",
    "positionList": [
        {
            "lat": -76.1,
            "lng": "99.37777",
            "checkDistance": 15.2
        },
        {
            "lat": -56.1,
            "lng": "129.37777",
            "checkDistance": 50.2
        }
    ]
}
```

#### Error-編輯集點卡任務
 httpCode | 錯誤碼 | 說明
 --- | --- | ---
 400 | API_ERROR.NOT_EXIST | 無此筆資料
 400 | API_ERROR.ARGUMENT_ERROR | 輸入參數錯誤, 可參閱 errorDesc
 422 | SERVICE_ERROR.LOYALTY_CARD_MGMT_UPDATE_NOT_ALLOWED | 不允許編輯已啟用或已過期的停用集點卡任務
 422 | SERVICE_ERROR.LOYALTY_CARD_MGMT_HAD_ISSUED_UPDATE_NOT_ALLOWED | 已發出集點卡不允許編輯

#### Response-編輯集點卡任務
 欄位 | 型態 | 說明 
 ---  | --- | ---
 id | string | 集點卡任務id
 tenantId | string | 租戶id
 taskCategory | string | 集點卡任務類型, 參閱 [集點卡任務類型](#集點卡任務類型)
 title | string | 集點卡任務標題 
 description | string | 集點卡任務說明
 taskStartDate | timestamp | 集點卡任務開始日期
 taskEndDate | timestamp | 集點卡任務結束日期
 thumbnailObjectKey | string | 縮圖objectKey
 positionMapThumbnailObjectKey | string | 地圖縮圖objectKey
 thumbnailUrl | string | 縮圖url
 issueCardLimit | int | 發卡數量, -1表示不限發卡數
 points | int | 每張集點卡的點數, 每張集點卡點數上限為30點
 cardsOfAccount | int | 每一帳號最多可集幾張卡
 cardsOfDayAccount | int | 每一帳號每日最多可集幾張卡
 redeemType | string | 集點卡兌換方式, 參閱 [集點卡兌換方式](#集點卡兌換方式)
 redeemHealthPoints | int | 集點卡兌換方式為01:線上兌換時, 可兌換的Health365點數
 redeemEndDate | timestamp | 兌換截止日
 status | string | 集點卡任務狀態, 參閱 [集點卡任務狀態](#集點卡任務狀態)
 qrcodeType | string | 集點卡掃碼規則, 參閱 [集點卡掃碼規則](#集點卡掃碼規則)
 isInterval | boolean | 集點卡掃碼規則為01:使用同一個QRCode時, 是否需要間隔
 scanIntervalFreq | int | 集點卡掃碼規則為01:使用同一個QRCode時, 所需間隔頻率
 scanIntervalUnit | string | 集點卡掃碼規則為01:使用同一個QRCode時, 所需間隔單位, 參閱 [集點卡掃碼間隔單位](#集點卡掃碼間隔單位)
 attachType | string | 集點卡附件類型, 參閱 [集點卡附件類型](#集點卡附件類型)
 attachObjectKey | string | attachType為FILE時, 表示storage 中的 objectKey, attachType為URL時, 表示連結的網址
 creator | string | 建立者 account id
 updater | string | 更新者 account id
 createTime | timestamp | 建立日期時間
 updateTime | timestamp | 更新日期時間

```javascript
{
    "httpCode": 200,
    "result": {
        "data": {
            "id": "f9e793e5-be39-4cdd-b1e8-dede763f4ee2",
            "tenantId": "858b7fbb-3ba0-4d49-9882-c893a1ef07dc",
            "taskCategory": "01",
            "title": "高雄前金健走尋寶任務-1",
            "description": "集滿10點即可兌換 Health 365照護平台健康點數100點，可兌換優惠票券！ ...",
            "taskStartDate": 1668528000000,
            "taskEndDate": 1670601600000,
            "thumbnailObjectKey": "loyalty_card/thumbnail/56ca1cfc-4bcb-4a0a-b079-fd08a0e75a37.png",
            "positionMapThumbnailObjectKey": "loyalty_card/thumbnail/44021b7a-d6bc-497f-91b8-0a4482b2f3db.png",
            "issueCardLimit": 20,
            "points": 10,
            "cardsOfAccount": 2,
            "cardsOfDayAccount": 1,
            "redeemType": "01",
            "redeemHealthPoints": 100,
            "redeemEndDate": 1672416000000,
            "status": "NONE",
            "qrcodeType": "01",
            "isInterval": true,
            "scanIntervalFreq": 1,
            "scanIntervalUnit": "01",
            "attachType": "URL",
            "attachObjectKey": "https://www.google.com",
            "createTime": 1669281408309,
            "updateTime": 1669281408309,
            "creator": "98953ae4-b8f1-488c-b3ae-cb64d8caae15"
        }
    }
}
```

### 編輯集點卡任務狀態
```url
POST /loyalty-card-mgmt/update-status
```

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

#### Request-編輯集點卡任務狀態
 欄位 | 型態  | 必填 | 長度限制 | 預設 | 說明  
 ---|---|---|---|---|---
 id | string | Y | 36 | | 集點卡任務id
 status | string | Y | 10 | | 集點卡任務狀態, 參閱 [集點卡任務狀態](#集點卡任務狀態)

```javascript
{
    "id": "f9e793e5-be39-4cdd-b1e8-dede763f4ee2",
    "status": "ON"
}
```

#### Error-編輯集點卡任務狀態
 httpCode | 錯誤碼 | 說明
 --- | --- | ---
 400 | API_ERROR.NOT_EXIST | 無此筆資料
 400 | API_ERROR.ARGUMENT_ERROR | 輸入參數錯誤, 可參閱 errorDesc
 422 | SERVICE_ERROR.LOYALTY_CARD_MGMT_UPDATE_STATUS_NOT_ALLOWED | 不允許變更狀態

#### Response-編輯集點卡任務狀態
 欄位 | 型態 | 說明 
 ---  | --- | ---
 id | string | 集點卡任務id
 tenantId | string | 租戶id
 taskCategory | string | 集點卡任務類型, 參閱 [集點卡任務類型](#集點卡任務類型)
 title | string | 集點卡任務標題 
 description | string | 集點卡任務說明
 taskStartDate | timestamp | 集點卡任務開始日期
 taskEndDate | timestamp | 集點卡任務結束日期
 thumbnailObjectKey | string | 縮圖objectKey
 thumbnailUrl | string | 縮圖url
 issueCardLimit | int | 發卡數量, -1表示不限發卡數
 points | int | 每張集點卡的點數, 每張集點卡點數上限為30點
 cardsOfAccount | int | 每一帳號最多可集幾張卡
 cardsOfDayAccount | int | 每一帳號每日最多可集幾張卡
 redeemType | string | 集點卡兌換方式, 參閱 [集點卡兌換方式](#集點卡兌換方式)
 redeemHealthPoints | int | 集點卡兌換方式為01:線上兌換時, 可兌換的Health365點數
 redeemEndDate | timestamp | 兌換截止日
 status | string | 集點卡任務狀態, 參閱 [集點卡任務狀態](#集點卡任務狀態)
 qrcodeType | string | 集點卡掃碼規則, 參閱 [集點卡掃碼規則](#集點卡掃碼規則)
 isInterval | boolean | 集點卡掃碼規則為01:使用同一個QRCode時, 是否需要間隔
 scanIntervalFreq | int | 集點卡掃碼規則為01:使用同一個QRCode時, 所需間隔頻率
 scanIntervalUnit | string | 集點卡掃碼規則為01:使用同一個QRCode時, 所需間隔單位, 參閱 [集點卡掃碼間隔單位](#集點卡掃碼間隔單位)
 attachType | string | 集點卡附件類型, 參閱 [集點卡附件類型](#集點卡附件類型)
 attachObjectKey | string | attachType為FILE時, 表示storage 中的 objectKey, attachType為URL時, 表示連結的網址
 creator | string | 建立者 account id
 updater | string | 更新者 account id
 createTime | timestamp | 建立日期時間
 updateTime | timestamp | 更新日期時間

```javascript
{
    "httpCode": 200,
    "result": {
        "data": {
            "id": "f9e793e5-be39-4cdd-b1e8-dede763f4ee2",
            "tenantId": "858b7fbb-3ba0-4d49-9882-c893a1ef07dc",
            "taskCategory": "01",
            "title": "高雄前金健走尋寶任務-1",
            "description": "集滿10點即可兌換 Health 365照護平台健康點數100點，可兌換優惠票券！ ...",
            "taskStartDate": 1668528000000,
            "taskEndDate": 1670601600000,
            "thumbnailObjectKey": "loyalty_card/thumbnail/56ca1cfc-4bcb-4a0a-b079-fd08a0e75a37.png",
            "issueCardLimit": 20,
            "points": 10,
            "cardsOfAccount": 2,
            "cardsOfDayAccount": 1,
            "redeemType": "01",
            "redeemHealthPoints": 100,
            "redeemEndDate": 1672416000000,
            "status": "ON",
            "qrcodeType": "01",
            "isInterval": true,
            "scanIntervalFreq": 1,
            "scanIntervalUnit": "01",
            "attachType": "URL",
            "attachObjectKey": "https://www.google.com",
            "createTime": 1669281408309,
            "updateTime": 1669281408309,
            "creator": "98953ae4-b8f1-488c-b3ae-cb64d8caae15"
        }
    }
}
```

### 編輯集點卡任務是否顯示
```url
POST /loyalty-card-mgmt/update-show
```

* 控制集點卡任務是否要顯示在後台管理列表

#### Request-編輯集點卡任務是否顯示
 欄位 | 型態  | 必填 | 長度限制 | 預設 | 說明  
 ---|---|---|---|---|---
 id | string | Y | 36 | | 集點卡任務id
 isShow | boolean | | | | 顯示控制, true:顯示, false: 隱藏

```javascript
{
    "id": "f9e793e5-be39-4cdd-b1e8-dede763f4ee2",
    "isShow": true
}
```

#### Error-編輯集點卡任務是否顯示
 httpCode | 錯誤碼 | 說明
 --- | --- | ---
 400 | API_ERROR.NOT_EXIST | 無此筆資料
 400 | API_ERROR.ARGUMENT_ERROR | 輸入參數錯誤, 可參閱 errorDesc

#### Response-編輯集點卡任務是否顯示
 欄位 | 型態 | 說明 
 ---  | --- | ---
 id | string | 集點卡任務id
 tenantId | string | 租戶id
 taskCategory | string | 集點卡任務類型, 參閱 [集點卡任務類型](#集點卡任務類型)
 title | string | 集點卡任務標題 
 description | string | 集點卡任務說明
 taskStartDate | timestamp | 集點卡任務開始日期
 taskEndDate | timestamp | 集點卡任務結束日期
 thumbnailObjectKey | string | 縮圖objectKey
 thumbnailUrl | string | 縮圖url
 issueCardLimit | int | 發卡數量, -1表示不限發卡數
 points | int | 每張集點卡的點數, 每張集點卡點數上限為30點
 cardsOfAccount | int | 每一帳號最多可集幾張卡
 cardsOfDayAccount | int | 每一帳號每日最多可集幾張卡
 redeemType | string | 集點卡兌換方式, 參閱 [集點卡兌換方式](#集點卡兌換方式)
 redeemHealthPoints | int | 集點卡兌換方式為01:線上兌換時, 可兌換的Health365點數
 redeemEndDate | timestamp | 兌換截止日
 status | string | 集點卡任務狀態, 參閱 [集點卡任務狀態](#集點卡任務狀態)
 qrcodeType | string | 集點卡掃碼規則, 參閱 [集點卡掃碼規則](#集點卡掃碼規則)
 isInterval | boolean | 集點卡掃碼規則為01:使用同一個QRCode時, 是否需要間隔
 scanIntervalFreq | int | 集點卡掃碼規則為01:使用同一個QRCode時, 所需間隔頻率
 scanIntervalUnit | string | 集點卡掃碼規則為01:使用同一個QRCode時, 所需間隔單位, 參閱 [集點卡掃碼間隔單位](#集點卡掃碼間隔單位)
 attachType | string | 集點卡附件類型, 參閱 [集點卡附件類型](#集點卡附件類型)
 attachObjectKey | string | attachType為FILE時, 表示storage 中的 objectKey, attachType為URL時, 表示連結的網址
 creator | string | 建立者 account id
 updater | string | 更新者 account id
 createTime | timestamp | 建立日期時間
 updateTime | timestamp | 更新日期時間
 isShow | boolean | 顯示控制, true:顯示, false: 隱藏 

```javascript
{
    "httpCode": 200,
    "result": {
        "data": {
            "id": "f9e793e5-be39-4cdd-b1e8-dede763f4ee2",
            "tenantId": "858b7fbb-3ba0-4d49-9882-c893a1ef07dc",
            "taskCategory": "01",
            "title": "高雄前金健走尋寶任務-1",
            "description": "集滿10點即可兌換 Health 365照護平台健康點數100點，可兌換優惠票券！ ...",
            "taskStartDate": 1668528000000,
            "taskEndDate": 1670601600000,
            "thumbnailObjectKey": "loyalty_card/thumbnail/56ca1cfc-4bcb-4a0a-b079-fd08a0e75a37.png",
            "issueCardLimit": 20,
            "points": 10,
            "cardsOfAccount": 2,
            "cardsOfDayAccount": 1,
            "redeemType": "01",
            "redeemHealthPoints": 100,
            "redeemEndDate": 1672416000000,
            "status": "ON",
            "qrcodeType": "01",
            "isInterval": true,
            "scanIntervalFreq": 1,
            "scanIntervalUnit": "01",
            "attachType": "URL",
            "attachObjectKey": "https://www.google.com",
            "createTime": 1669281408309,
            "updateTime": 1669281408309,
            "creator": "98953ae4-b8f1-488c-b3ae-cb64d8caae15",
            "isShow": true
        }
    }
}
```


### 刪除集點卡任務
```url
POST /loyalty-card-mgmt/delete
```

* 只允許刪除未啟用, 或已停用且未被使用者集點的集點卡任務

#### Request-刪除集點卡任務
 欄位 | 型態  | 必填 | 長度限制 | 預設 | 說明  
 ---|---|---|---|---|---
 id | string | Y | 36 | | 集點卡任務id

```javascript
{
    "id": "b7d03fb8-5cd5-4d99-8ef0-e199d3a1e8ad"
}
```

#### Error-刪除集點卡任務
 httpCode | 錯誤碼 | 說明
 --- | --- | ---
 400 | API_ERROR.NOT_EXIST | 無此筆資料
 422 | SERVICE_ERROR.LOYALTY_CARD_MGMT_DELETE_NOT_ALLOWED | 該狀態不允許刪除任務

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

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

### 產生集點卡任務QRCode
```url
POST /loyalty-card-mgmt/qrcode
```

#### Request-產生集點卡任務QRCode
 欄位 | 型態  | 必填 | 長度限制 | 預設 | 說明  
 ---|---|---|---|---|---
 id | string | Y | 36 | | 集點卡任務id

```javascript
{
    "id": "3d39557f-52e5-4936-b9b8-d8f23b5c6ff3"
}
```

#### Error-產生集點卡任務QRCode
 httpCode | 錯誤碼 | 說明
 --- | --- | ---
 400 | API_ERROR.NOT_EXIST | 無此筆資料
 400 | API_ERROR.NO_DATA | 無此筆資料
 400 | API_ERROR.ARGUMENT_ERROR | 輸入參數錯誤, 可參閱 errorDesc

#### Response-產生集點卡任務QRCode
 欄位 | 型態 | 說明 
 ---  | --- | ---
 id | string | 集點卡任務id
 tenantId | string | 租戶id
 taskCategory | string | 集點卡任務類型, 參閱 [集點卡任務類型](#集點卡任務類型)
 title | string | 集點卡任務標題 
 description | string | 集點卡任務說明
 taskStartDate | timestamp | 集點卡任務開始日期
 taskEndDate | timestamp | 集點卡任務結束日期
 thumbnailObjectKey | string | 縮圖objectKey
 thumbnailUrl | string | 縮圖url
 issueCardLimit | int | 發卡數量, -1表示不限發卡數
 points | int | 每張集點卡的點數, 每張集點卡點數上限為30點
 cardsOfAccount | int | 每一帳號最多可集幾張卡
 cardsOfDayAccount | int | 每一帳號每日最多可集幾張卡
 redeemType | string | 集點卡兌換方式, 參閱 [集點卡兌換方式](#集點卡兌換方式)
 redeemHealthPoints | int | 集點卡兌換方式為01:線上兌換時, 可兌換的Health365點數
 redeemEndDate | timestamp | 兌換截止日
 status | string | 集點卡任務狀態, 參閱 [集點卡任務狀態](#集點卡任務狀態)
 qrcodeType | string | 集點卡掃碼規則, 參閱 [集點卡掃碼規則](#集點卡掃碼規則)
 isInterval | boolean | 集點卡掃碼規則為01:使用同一個QRCode時, 是否需要間隔
 scanIntervalFreq | int | 集點卡掃碼規則為01:使用同一個QRCode時, 所需間隔頻率
 scanIntervalUnit | string | 集點卡掃碼規則為01:使用同一個QRCode時, 所需間隔單位, 參閱 [集點卡掃碼間隔單位](#集點卡掃碼間隔單位)
 attachType | string | 集點卡附件類型, 參閱 [集點卡附件類型](#集點卡附件類型)
 attachObjectKey | string | attachType為FILE時, 表示storage 中的 objectKey, attachType為URL時, 表示連結的網址
 attachUrl | string | attachType為FILE時,可 download 的 url, 時效 3600 秒, attachType為URL時, 表示連結的網址
 creator | string | 建立者 account id
 updater | string | 更新者 account id
 createTime | timestamp | 建立日期時間
 updateTime | timestamp | 更新日期時間
 loyaltyCardPointList | json array | 集點卡任務點數json array

##### Response-產生集點卡任務QRCode-loyaltyCardPoint(json)
 欄位 | 型態 | 說明 
 ---  | --- | ---
 id | string | 集點卡任務點數id
 loyaltyCardTaskId | string | 集點卡任務id
 seq | int | 集點卡任務點數序號
 base64QrCode | string | QRCode base64字串

```javascript
{
    "httpCode": 200,
    "result": {
        "data": {
            "id": "3d39557f-52e5-4936-b9b8-d8f23b5c6ff3",
            "tenantId": "858b7fbb-3ba0-4d49-9882-c893a1ef07dc",
            "taskCategory": "01",
            "title": "高雄前金健走尋寶任務-3",
            "description": "集滿10點即可兌換 Health 365照護平台健康點數100點，可兌換優惠票券！...",
            "taskStartDate": 1668528000000,
            "taskEndDate": 1670601600000,
            "thumbnailObjectKey": "loyalty_card/thumbnail/56ca1cfc-4bcb-4a0a-b079-fd08a0e75a37.png",
            "issueCardLimit": 10,
            "points": 5,
            "cardsOfAccount": 1,
            "cardsOfDayAccount": 1,
            "redeemType": "01",
            "redeemHealthPoints": 100,
            "redeemEndDate": 1672416000000,
            "status": "NONE",
            "qrcodeType": "01",
            "isInterval": true,
            "scanIntervalFreq": 1,
            "scanIntervalUnit": "01",
            "attachType": "FILE",
            "attachObjectKey": "loyalty_card/56ca1cfc-4bcb-4a0a-b079-fd08a0e75a38.png",
            "createTime": 1669654908291,
            "updateTime": 1669654908291,
            "creator": "98953ae4-b8f1-488c-b3ae-cb64d8caae15",
            "thumbnailUrl": null,
            "attachUrl": null,
            "loyaltyCardPointList": [
                {
                    "id": "e4b6238d-224f-49cd-adc1-d1bdde2b57aa",
                    "loyaltyCardTaskId": "3d39557f-52e5-4936-b9b8-d8f23b5c6ff3",
                    "seq": 1,
                    "base64QrCode": "iVBORw0KGgoAAAANSUhEUgAAAZAAAAGQCAIAAAAP3aGbAAANC..."
                }
            ]
        }
    }
}
```

### 匯出任務集點報表
```url
POST /loyalty-card-mgmt/export-card-statistics
```

#### Request-匯出任務集點報表
 欄位 | 型態  | 必填 | 長度限制 | 預設 | 說明  
 ---|---|---|---|---|---
 id | string | Y | 36 | | 集點卡任務id

```javascript
{
    "id": "3d39557f-52e5-4936-b9b8-d8f23b5c6ff3"
}
```

#### Error-匯出任務集點報表
 httpCode | 錯誤碼 | 說明
 --- | --- | ---
 400 | API_ERROR.NOT_EXIST | 無此筆資料
 403 | API_ERROR.PERMISSION_DENIED | 無此操作權限
 422 | SERVICE_ERROR.LOYALTY_CARD_MGMT_EXPORT_STATUS_NOT_ALLOWED | 該狀態不允許匯出
 

#### Response-匯出任務集點報表

* httpCode 200 -Download file
```
  File name: H365_v2_匯出_任務集點報表.xlsx
```

## App端
### 取得集點卡列表
```url
POST /loyalty-card/list
```

* App User 查詢用
* 使用listType來查詢不同類型列表
  * listType=UN_START: 未開始, 查詢已上架但尚未開始的集點卡任務
  * listType=ONGOING: 進行中, 查詢進行中的集點卡任務
  * listType=FINISHED: 已結束, 查詢已結束但且有集點的集點卡任務

#### Request-取得集點卡列表
##### Request-取得集點卡列表-query (查詢條件json)
 欄位 | 型態  | 必填 | 長度限制 | 預設 | 說明  
 ---|---|---|---|---|---
 listType | string | | 10 | | 集點卡任務列表查詢類型, 參閱 [集點卡任務列表查詢類型](#AppUser集點卡任務列表查詢類型)
 
```javascript
{
    "query": {
        "listType": "ONGOING"
    }
}
```

#### Response-取得集點卡列表
 欄位 | 型態 | 說明 
 ---  | --- | ---
 id | string | 集點卡任務id
 tenantId | string | 租戶id
 tenantName | string | 租戶名稱
 taskCategory | string | 集點卡任務類型, 參閱 [集點卡任務類型](#集點卡任務類型)
 title | string | 集點卡任務標題 
 description | string | 集點卡任務說明
 taskStartDate | timestamp | 集點卡任務開始日期
 taskEndDate | timestamp | 集點卡任務結束日期
 thumbnailObjectKey | string | 縮圖objectKey
 thumbnailUrl | string | 縮圖url
 issueCardLimit | int | 發卡數量, -1表示不限發卡數
 points | int | 每張集點卡的點數, 每張集點卡點數上限為30點
 cardsOfAccount | int | 每一帳號最多可集幾張卡
 cardsOfDayAccount | int | 每一帳號每日最多可集幾張卡
 redeemType | string | 集點卡兌換方式, 參閱 [集點卡兌換方式](#集點卡兌換方式)
 redeemHealthPoints | int | 集點卡兌換方式為01:線上兌換時, 可兌換的Health365點數
 redeemEndDate | timestamp | 兌換截止日
 status | string | 集點卡任務狀態, 參閱 [集點卡任務狀態](#集點卡任務狀態)
 qrcodeType | string | 集點卡掃碼規則, 參閱 [集點卡掃碼規則](#集點卡掃碼規則)
 isInterval | boolean | 集點卡掃碼規則為01:使用同一個QRCode時, 是否需要間隔
 scanIntervalFreq | int | 集點卡掃碼規則為01:使用同一個QRCode時, 所需間隔頻率
 scanIntervalUnit | string | 集點卡掃碼規則為01:使用同一個QRCode時, 所需間隔單位, 參閱 [集點卡掃碼間隔單位](#集點卡掃碼間隔單位)
 attachType | string | 集點卡附件類型, 參閱 [集點卡附件類型](#集點卡附件類型)
 attachObjectKey | string | attachType為FILE時, 表示storage 中的 objectKey, attachType為URL時, 表示連結的網址
 attachUrl | string | attachType為FILE時,可 download 的 url, 時效 3600 秒, attachType為URL時, 表示連結的網址
 updateTime | timestamp | 更新日期時間
 earnPoints | int | 此集點卡任務已集點數

```javascript
{
    "httpCode": 200,
    "result": {
        "data": [
            {
                "id": "f9e793e5-be39-4cdd-b1e8-dede763f4ee2",
                "tenantId": "858b7fbb-3ba0-4d49-9882-c893a1ef07dc",
                "tenantName": "緯緯醫學",
                "taskCategory": "01",
                "title": "高雄前金健走尋寶任務-2-1",
                "description": "集滿10點即可兌換 Health 365照護平台健康點數100點，可兌換優惠票券！...",
                "taskStartDate": 1668528000000,
                "taskEndDate": 1670687999999,
                "thumbnailObjectKey": "loyalty_card/thumbnail/56ca1cfc-4bcb-4a0a-b079-fd08a0e75a37.png",
                "issueCardLimit": 20,
                "points": 10,
                "cardsOfAccount": 2,
                "cardsOfDayAccount": 1,
                "redeemType": "01",
                "redeemHealthPoints": 100,
                "redeemEndDate": 1672502399999,
                "status": "ON",
                "qrcodeType": "01",
                "isInterval": true,
                "scanIntervalFreq": 1,
                "scanIntervalUnit": "01",
                "attachType": "FILE",
                "attachObjectKey": "loyalty_card/56ca1cfc-4bcb-4a0a-b079-fd08a0e75a38.png",
                "updateTime": 1669282022228,
                "thumbnailUrl": "http://content-service/swift/v1/loyalty_card/thumbnail/56ca1cfc-4bcb-4a0a-b079-fd08a0e75a37.png",
                "attachUrl": "http://content-service/swift/v1/loyalty_card/56ca1cfc-4bcb-4a0a-b079-fd08a0e75a38.png",
                "earnPoints": 2
            }
        ]
    }
}
```

### 取得集點卡明細
```url
POST /loyalty-card/info
```

#### Request-取得集點卡明細
 欄位 | 型態  | 必填 | 長度限制 | 預設 | 說明  
 ---|---|---|---|---|---
 id | string | Y | 36 | | 集點卡任務id
 
```javascript
{
    "id": "f9e793e5-be39-4cdd-b1e8-dede763f4ee2"
}
```

#### Response-取得集點卡明細
 欄位 | 型態 | 說明 
 ---  | --- | ---
 id | string | 集點卡任務id
 tenantId | string | 租戶id
 tenantName | string | 租戶名稱
 taskCategory | string | 集點卡任務類型, 參閱 [集點卡任務類型](#集點卡任務類型)
 title | string | 集點卡任務標題 
 description | string | 集點卡任務說明
 taskStartDate | timestamp | 集點卡任務開始日期
 taskEndDate | timestamp | 集點卡任務結束日期
 thumbnailObjectKey | string | 縮圖objectKey
 thumbnailUrl | string | 縮圖url
 positionMapThumbnailObjectKey | string | 地圖縮圖objectKey
 positionMapThumbnailUrl | string | 地圖縮圖url
 issueCardLimit | int | 發卡數量, -1表示不限發卡數
 points | int | 每張集點卡的點數, 每張集點卡點數上限為30點
 cardsOfAccount | int | 每一帳號最多可集幾張卡
 cardsOfDayAccount | int | 每一帳號每日最多可集幾張卡
 redeemType | string | 集點卡兌換方式, 參閱 [集點卡兌換方式](#集點卡兌換方式)
 redeemHealthPoints | int | 集點卡兌換方式為01:線上兌換時, 可兌換的Health365點數
 redeemEndDate | timestamp | 兌換截止日
 status | string | 集點卡任務狀態, 參閱 [集點卡任務狀態](#集點卡任務狀態)
 qrcodeType | string | 集點卡掃碼規則, 參閱 [集點卡掃碼規則](#集點卡掃碼規則)
 isInterval | boolean | 集點卡掃碼規則為01:使用同一個QRCode時, 是否需要間隔
 scanIntervalFreq | int | 集點卡掃碼規則為01:使用同一個QRCode時, 所需間隔頻率
 scanIntervalUnit | string | 集點卡掃碼規則為01:使用同一個QRCode時, 所需間隔單位, 參閱 [集點卡掃碼間隔單位](#集點卡掃碼間隔單位)
 attachType | string | 集點卡附件類型, 參閱 [集點卡附件類型](#集點卡附件類型)
 attachObjectKey | string | attachType為FILE時, 表示storage 中的 objectKey, attachType為URL時, 表示連結的網址
 attachUrl | string | attachType為FILE時,可 download 的 url, 時效 3600 秒, attachType為URL時, 表示連結的網址
 updateTime | timestamp | 更新日期時間
 userLoyaltyCardList | json array | 使用者已集點數卡json array
 loyaltyCardPointList| json array | 定位集點點位清單

##### Response-取得集點卡明細-loyaltyCardPointList(json)
 欄位 | 型態 | 說明 
 ---  | --- | ---
 seq | int | 座標點位序號
 latitude | string | Y | | 緯度, 範圍-90~90, 取到小數點下五位. e.g.: 35.25422
 longitude | string | Y | |經度, 範圍-180~180, 取到小數點下五位. e.g.: -135.25422
 checkDistance| string | Y | |該點位達標距離, 單位:公尺
 
##### Response-取得集點卡明細-userLoyaltyCard(json)
 欄位 | 型態 | 說明 
 ---  | --- | ---
 id | string | 使用者集點卡id
 householdMemberId | string | householdMemberId
 loyaltyCardTaskId | string | 集點卡任務id
 loyaltyCardSeq | int | 此集點卡任務所領卡數序號(所用使用者)
 loyaltyCardPoints | int | 集點卡任務的可集點數, 每張集點卡點數上限為30點
 userCardSeq | int | 此集點卡任務該使用者已領卡數序號(該使用者)
 earnPoints | int | 此使用者集點卡已集點數
 issueTime | timestamp | 使用者集點卡領取時間
 status | string | 使用者集點卡狀態, 請參閱[使用者集點卡狀態](#使用者集點卡狀態)
 updateTime | timestamp | 最後更新時間
 pointList | json array | 此使用者集點卡已集點數json array

##### Response-取得集點卡明細-userLoyaltyCardPoint(json)
 欄位 | 型態 | 說明 
 ---  | --- | ---
 id | string | 使用者集點卡點數id
 householdMemberId | string | householdMemberId
 userLoyaltyCardId | string | 使用者集點卡id
 seq | int | 使用者集點卡點數集點順序
 loyaltyCardPointId | string | 集點卡任務點數id
 loyaltyCardPointSeq | int | 集點卡任務點數位置順序
 updateTime | timestamp | 最後更新時間

```javascript
{
    "httpCode": 200,
    "result": {
        "data": {
            "id": "f9e793e5-be39-4cdd-b1e8-dede763f4ee2",
            "tenantId": "858b7fbb-3ba0-4d49-9882-c893a1ef07dc",
            "tenantName": "緯緯醫學",
            "taskCategory": "01",
            "title": "高雄前金健走尋寶任務-2-1",
            "description": "集滿10點即可兌換 Health 365照護平台健康點數100點，可兌換優惠票券！...",
            "taskStartDate": 1668528000000,
            "taskEndDate": 1670687999999,
            "thumbnailObjectKey": "loyalty_card/thumbnail/56ca1cfc-4bcb-4a0a-b079-fd08a0e75a37.png",
            "issueCardLimit": 20,
            "points": 10,
            "cardsOfAccount": 2,
            "cardsOfDayAccount": 1,
            "redeemType": "01",
            "redeemHealthPoints": 100,
            "redeemEndDate": 1672502399999,
            "status": "ON",
            "qrcodeType": "01",
            "isInterval": true,
            "scanIntervalFreq": 1,
            "scanIntervalUnit": "01",
            "attachType": "FILE",
            "attachObjectKey": "loyalty_card/56ca1cfc-4bcb-4a0a-b079-fd08a0e75a38.png",
            "updateTime": 1669282022228,
            "thumbnailUrl": "http://content-service/swift/v1/loyalty_card/thumbnail/56ca1cfc-4bcb-4a0a-b079-fd08a0e75a37.png",
            "attachUrl": "http://content-service/swift/v1/loyalty_card/56ca1cfc-4bcb-4a0a-b079-fd08a0e75a38.png",
            "userLoyaltyCardList": [
                {
                    "id": "23c20c52-1d50-4ac7-a096-b8781d2d6083",
                    "householdMemberId": "150b53f5-7126-4900-9fb0-87a08b45e06b",
                    "loyaltyCardTaskId": "f9e793e5-be39-4cdd-b1e8-dede763f4ee2",
                    "loyaltyCardSeq": 1,
                    "loyaltyCardPoints": 10,
                    "userCardSeq": 1,
                    "earnPoints": 2,
                    "issueTime": 1669355582321,
                    "status": "VALID",
                    "updateTime": 1669355582321,
                    "pointList": [
                        {
                            "id": "0261a3b2-c016-4f9c-aa84-c432408759c5",
                            "householdMemberId": "150b53f5-7126-4900-9fb0-87a08b45e06b",
                            "userLoyaltyCardId": "23c20c52-1d50-4ac7-a096-b8781d2d6083",
                            "seq": 1,
                            "loyaltyCardPointId": "628d9d63-bea3-477f-be5c-1788753e43fa",
                            "loyaltyCardPointSeq": 1,
                            "updateTime": 1669352400000
                        },
                        {
                            "id": "2802032c-37f3-4481-bcf8-95e32baf38e6",
                            "householdMemberId": "150b53f5-7126-4900-9fb0-87a08b45e06b",
                            "userLoyaltyCardId": "23c20c52-1d50-4ac7-a096-b8781d2d6083",
                            "seq": 2,
                            "loyaltyCardPointId": "628d9d63-bea3-477f-be5c-1788753e43fa",
                            "loyaltyCardPointSeq": 1,
                            "updateTime": 1669356625000
                        }
                    ]
                }
            ],
            "loyaltyCardPointList": [
                {
                    "seq": 1,
                    "latitude": "-76.1",
                    "longitude": "99.37777",
                    "checkDistance": 15.2,
                    "positionInfoList": []
                },
                {
                    "seq": 2,
                    "latitude": "-56.1",
                    "longitude": "129.37777",
                    "checkDistance": 50.2,
                    "positionInfoList": []
                }
            ]
        }
    }
}
```

### 集點掃碼
```url
POST /loyalty-card/scan
```

* QRCode的內容格式為
  health365://loyalty-card/scan?taskId=<loyaltyCardTaskId>&pointId=<LoyaltyCardPointId>
  
  - taskId: 集點卡任務id
  - pointId: 集點卡任務集點點數id

#### Request-集點掃碼
 欄位 | 型態  | 必填 | 長度限制 | 預設 | 說明  
 ---|---|---|---|---|---
 loyaltyCardTaskId | string | Y | 36 | | 集點卡任務id
 loyaltyCardPointId | string | Y | 36 | | 集點卡任務集點點數id
 
```javascript
{
    "loyaltyCardTaskId": "3d39557f-52e5-4936-b9b8-d8f23b5c6ff3",
    "loyaltyCardPointId": "e4b6238d-224f-49cd-adc1-d1bdde2b57aa"
}
```

#### Error-集點掃碼
 httpCode | 錯誤碼 | 說明
 --- | --- | ---
 400 | API_ERROR.NOT_EXIST | 無此筆資料
 422 | SERVICE_ERROR.LOYALTY_CARD_SCAN_OUT_OF_ONGOING | 非集點期間不允許集點
 422 | SERVICE_ERROR.LOYALTY_CARD_SCAN_POINT_INVALID | 集點點數無效
 422 | SERVICE_ERROR.LOYALTY_CARD_SCAN_OVER_ISSUED_LIMIT | 已超過發卡上限
 422 | SERVICE_ERROR.LOYALTY_CARD_SCAN_OVER_CARDS_OF_ACCOUNT | 已超出帳號可領卡上限
 422 | SERVICE_ERROR.LOYALTY_CARD_SCAN_OVER_CARDS_OF_DAY_ACCOUNT | 已超出帳號每日可領卡上限
 422 | SERVICE_ERROR.LOYALTY_CARD_SCAN_INTERVAL_NOT_ALLOWED | 重覆掃碼(未過集點間隔時間)
 422 | SERVICE_ERROR.LOYALTY_CARD_SCAN_DUPLICATE_POINT | 重覆掃碼
 422 | SERVICE_ERROR.LOYALTY_CARD_SCAN_RACE_CONDITION | 多人同一時間掃碼，請稍候再試
 422 | SERVICE_ERROR.LOYALTY_CARD_SCAN_USER_CARD_FAIL | 掃碼時更新使用者卡片失敗

#### Response-集點掃碼
 欄位 | 型態 | 說明 
 ---  | --- | ---
 id | string | 使用者集點卡id
 householdMemberId | string | householdMemberId
 loyaltyCardTaskId | string | 集點卡任務id
 loyaltyCardSeq | int | 此集點卡任務所領卡數序號(所用使用者)
 loyaltyCardPoints | int | 集點卡任務的可集點數, 每張集點卡點數上限為30點
 userCardSeq | int | 此集點卡任務該使用者已領卡數序號(該使用者)
 earnPoints | int | 此使用者集點卡已集點數
 issueTime | timestamp | 使用者集點卡領取時間
 status | string | 使用者集點卡狀態, 請參閱[使用者集點卡狀態](#使用者集點卡狀態)
 updateTime | timestamp | 最後更新時間

```javascript
{
    "httpCode": 200,
    "result": {
        "data": {
            "id": "97b8f80c-ea8b-49e1-b12f-6b8cfd967a6e",
            "householdMemberId": "150b53f5-7126-4900-9fb0-87a08b45e06b",
            "loyaltyCardTaskId": "3d39557f-52e5-4936-b9b8-d8f23b5c6ff3",
            "loyaltyCardSeq": 1,
            "loyaltyCardPoints": 5,
            "userCardSeq": 1,
            "earnPoints": 1,
            "issueTime": 1669659595589,
            "status": "VALID",
            "createTime": 1669659595558,
            "updateTime": 1669659595558
        }
    }
}
```

### 兌換集點卡
```url
POST /loyalty-card/redeem
```

#### Request-兌換集點卡
 欄位 | 型態  | 必填 | 長度限制 | 預設 | 說明  
 ---|---|---|---|---|---
 userLoyaltyCardId | string | Y | 36 | | 使用者集點卡id
 
```javascript
{
    "userLoyaltyCardId": "97b8f80c-ea8b-49e1-b12f-6b8cfd967a6e"
}
```

#### Error-兌換集點卡
 httpCode | 錯誤碼 | 說明
 --- | --- | ---
 400 | API_ERROR.NOT_EXIST | 無此筆資料
 422 | SERVICE_ERROR.LOYALTY_CARD_REDEEM_HAD_REDEEMED | 集點卡已兌換過
 422 | SERVICE_ERROR.LOYALTY_CARD_REDEEM_POINTS_NOT_ENOUGH | 點數不足夠兌換
 422 | SERVICE_ERROR.LOYALTY_CARD_REDEEM_OVER_REDEEM_DATE | 已過兌換期限

#### Response-兌換集點卡
 欄位 | 型態 | 說明 
 ---  | --- | ---
 id | string | 使用者集點卡id
 householdMemberId | string | householdMemberId
 loyaltyCardTaskId | string | 集點卡任務id
 loyaltyCardSeq | int | 此集點卡任務所領卡數序號(所用使用者)
 loyaltyCardPoints | int | 集點卡任務的可集點數, 每張集點卡點數上限為30點
 userCardSeq | int | 此集點卡任務該使用者已領卡數序號(該使用者)
 earnPoints | int | 此使用者集點卡已集點數
 issueTime | timestamp | 使用者集點卡領取時間
 status | string | 使用者集點卡狀態, 請參閱[使用者集點卡狀態](#使用者集點卡狀態)
 updateTime | timestamp | 最後更新時間

```javascript
{
    "httpCode": 200,
    "result": {
        "data": {
            "id": "97b8f80c-ea8b-49e1-b12f-6b8cfd967a6e",
            "householdMemberId": "150b53f5-7126-4900-9fb0-87a08b45e06b",
            "loyaltyCardTaskId": "3d39557f-52e5-4936-b9b8-d8f23b5c6ff3",
            "loyaltyCardSeq": 1,
            "loyaltyCardPoints": 5,
            "userCardSeq": 1,
            "earnPoints": 1,
            "issueTime": 1669659595589,
            "status": "REDEEMED",
            "createTime": 1669659595558,
            "updateTime": 1669659595558
        }
    }
}
```

