---
# System prepended metadata

title: 運動紀錄

---

# 運動紀錄

---
- 常數定義
  - [運動類型基礎](#運動類型基礎)
  - [運動模式](#運動模式)
  - [運動紀錄狀態](#運動紀錄狀態)
  - [運動紀錄目標類型](#運動紀錄目標類型)
  - [運動紀錄資料來源](#運動紀錄資料來源)
  - [運動紀錄Summary查詢類別](#運動紀錄Summary查詢類別)
- API 清單
  - [取得運動模式列表](#取得運動模式列表)
  - [查詢用戶運動紀錄含軌跡資訊](#查詢用戶運動紀錄含軌跡資訊)
  - [根據target查詢運動紀錄總覽](#根據target查詢運動紀錄總覽)
  - [取得我當前運動紀錄](#取得我當前運動紀錄)
  - [觸發活動紀錄](#觸發活動紀錄)
  - [上傳活動軌跡](#上傳活動軌跡)
  - [暫停運動紀錄](#暫停運動紀錄)
  - [結束運動紀錄](#結束運動紀錄)
  - [編輯運動紀錄(其他)](#編輯運動紀錄其他)
  - [取得運動紀錄列表(Web端)](#取得運動紀錄列表Web端)
  - [取得運動紀錄列表(App端)](#取得運動紀錄列表App端)
  - [取得運動紀錄配速](#取得運動紀錄配速)
  - [取得運動紀錄Summary](#取得運動紀錄Summary)
  - [設定目標步數](#設定目標步數)
  - [取得建議步數](#取得建議步數)
  - [新增跑步紀錄(SportRun)](#新增跑步紀錄SportRun)
  - [查詢跑步紀錄(SportRun)](#查詢跑步紀錄SportRun)
  - [新增30分鐘健康紀錄](#新增30分鐘健康紀錄)
  - [查詢30分鐘健康紀錄](#查詢30分鐘健康紀錄)
  - [查詢30分鐘健康紀錄區間內平均結果](#查詢30分鐘健康紀錄區間內平均結果)
  - [新增每日總步數紀錄(DailySteps)](#新增每日總步數紀錄DailySteps)
  - [查詢每日總步數紀錄(DailySteps)](#查詢每日總步數紀錄DailySteps)
---

## 常數定義
### 運動類型基礎
 欄位 | 型態  | 說明  
 ---|---|---
 basedType | string | 運動類型基礎, DISTANCE_BASED: 距離制, TIME_BASED: 計時制
 
### 運動模式
 欄位 | 型態  | 說明  
 ---|---|---
 sportMod | string | 運動模式, WALK:走路, RUN:跑步, BIKE:腳踏車, STAIRS:爬樓梯, AEROBIC:有氧運動, ROPE:跳繩, YOGA:瑜珈, GOLF:高爾夫球, TENNIS:網球, SOFTBALL:壘球, BASEBALL:棒球, FOOTBALL:足球, BASKETBALL:籃球, VOLLEYBALL:排球, SWIMMING:游泳, BADMINTON:羽球, BADMINTON_MATCH:競賽羽球, WEIGHT_TRAINING:重量訓練, OTHER:其他
 
 ### 運動紀錄狀態
 欄位 | 型態  | 說明  
 ---|---|---
 status | string | 運動紀錄狀態, RECORDING:紀錄中, PAUSE:暫停, FINISH:結束
 
 ### 運動紀錄目標類型
 欄位 | 型態  | 說明  
 ---|---|---
 targetType | string | 運動紀錄目標類型, LOYALTY:定位集點, SPORT:運動記錄, LOYALTY_SPORT:集點任務, UCAREMEDI:宇康上傳

 ### 運動紀錄資料來源
 欄位 | 型態  | 說明  
 ---|---|---
 dataSource | string | LOYALTY:定位集點, LOYALTY_SPORT:集點任務, MANUAL:手動記錄, DEVICE:裝置, IOS_HEALTH:iOS健康, GOOGLE_FIT:Google Fit, UCAREMEDI:宇康, OTHER:其他

 ### 運動紀錄Summary查詢類別
 欄位 | 型態  | 說明  
 ---|---|---
 queryType | string | DAILY:天, WEEKLY:週, MONTHLY:月

---

# API 清單
## 取得運動模式列表
```url
POST /sport-track/sport-mod/list
```

* 權限: App使用者及Web端使用者


### Request-取得運動模式列表
 欄位 | 型態  | 必填 | 長度限制 | 預設 | 說明  
 ---|---|---|---|---|---

### Response-取得運動模式列表
 欄位 | 型態 | 說明 
 ---  | --- | ---
 name | string | 運動模式名稱 
 description | string | 運動模式說明
 basedType | string | 運動類型基礎, 參閱 [運動類型基礎](#運動類型基礎)
 met | double | 此運動模式的代謝當量, 用來計算運動消耗熱量


```javascript
{
    "httpCode": 200,
    "result": {
        "data": [
            {
                "name": "BIKE",
                "description": "腳踏車",
                "basedType": "DISTANCE_BASED",
                "met": 7.5
            },
            {
                "name": "STAIRS",
                "description": "爬樓梯",
                "basedType": "TIME_BASED",
                "met": 6
            },
            ...
        ]
    }
}
```


## 查詢用戶運動紀錄含軌跡資訊

```url
POST /sport-track/record/query
```
- webview使用, 不須帶token
- 查詢用戶在定位集點卡的軌跡紀錄, 可查所有集點卡或是當前集點卡軌跡

### Request-查詢用戶運動紀錄含軌跡資訊
 欄位 | 型態  | 必填 | 長度限制 | 預設 | 說明  
 ---|---|---|---|---|---
 targetType | string | Y | 20 | | 運動紀錄目標類型 [運動紀錄目標類型](#運動紀錄目標類型)
 target | string | Y(targetType=LOYALTY) | 36 | | 目標ID. targetType: LOYALTY, 對應到loyalty_card_task.id
 householdMemberId | string | Y | 36 | | 用戶ID
 partId | int | | | | 軌跡分段序號(集點卡序號)<BR> targetType=LOYALTY 時, partId和recordId都不填, 顯示最新集點卡的軌跡記錄<BR>recordId: null, 顯示該集點卡的所有軌跡
 recordId | string | | 36 | | 運動紀錄ID <BR> targetType=SPORT 時, 必需填入recordId, <BR>targetType=LOYALTY 時, partId和recordId都不填, 則顯示最新集點卡的軌跡記錄<BR>partId: null, 顯示該運動紀錄的所有軌跡
 
```javascript
{
    "targetType": "LOYALTY",
    "target": "9acb3da6-99d6-47a2-8fb8-73d22bda893e",
    "householdMemberId": "8a9e980a-c612-4f87-af07-a97a5f0fbed5",
    "partId": 1,
    "recordId": null
}
```

### Error-查詢用戶運動紀錄含軌跡資訊
 httpCode | 錯誤碼 | 說明
 --- | --- | ---

### Response-查詢用戶運動紀錄含軌跡資訊
 欄位 | 型態 | 說明 
 ---  | --- | ---
 id | string | 運動紀錄id 
 sportMod | string | 運動類型, 參閱 [運動模式](#運動模式)
 status | string | 運動紀錄狀態, 參閱 [運動紀錄狀態](#運動紀錄狀態)
 householdMemberId | string | 用戶ID
 targetType | string | 運動紀錄目標類型, 參閱 [運動紀錄目標類型](#運動紀錄目標類型)
 target | string | 目標ID. targetType: LOYALTY, 對應到loyalty_card_task.id
 sportStartTime|timestamp|運動紀錄開始時間
 createTime | timestamp | 建立日期時間
 updateTime | timestamp | 更新日期時間
 markers|json array| 定位集點的座標點和達標狀態
 partInfo|json object| 軌跡分段資訊
 goalDuration | int | 運動目標時間, 單位:秒
 goalDistance | double | 運動目標距離, 單位:公尺(m)
 latestPace | int | 最近的配速值, 單位:秒
 
#### Response-查詢用戶運動紀錄含軌跡資訊-markers (json object)
 欄位 | 型態 | 說明 
 ---  | --- | ---
 latitude | string | 緯度, 範圍-90~90. 取道小數點下五位
 longitude | string | 經度, 範圍-180~180. 取道小數點下五位
 archived | boolean | 是否已完成集點
 seq|int|點位序號

#### Response-查詢用戶運動紀錄含軌跡資訊-partInfo (json object)
 欄位 | 型態 | 說明 
 ---  | --- | ---
 partId | string | 軌跡分段序號, 對應到集點卡流水號
 distance | double | 該分段的總距離, 單位公尺
 spendTime | int | 該分段的總花費時間, 單位秒
 seq|int| 點位序號
 tracks|json array| 該分段的所有軌跡資訊
 
#### Response-查詢用戶運動紀錄含軌跡資訊-tracks (json object)
 欄位 | 型態 | 說明 
 ---  | --- | ---
 latitude | string | 緯度, 範圍-90~90. 取道小數點下五位
 longitude | string | 經度, 範圍-180~180. 取道小數點下五位


```javascript
{
    "httpCode": 200,
    "result": {
        "data": {
            "id": "137e732b-7488-4b28-baed-5f077ef96c7e",
            "sportMod": "RUN",
            "status": "RECORDING",
            "householdMemberId": "8a9e980a-c612-4f87-af07-a97a5f0fbed5",
            "targetType": "LOYALTY",
            "target": "9acb3da6-99d6-47a2-8fb8-73d22bda893e",
            "createTime": 1677819889416,
            "updateTime": 1677819889416,
            "sportStartTime": 1677819889461,
            "goalDuration": null,
            "goalDistance": null,
            "markers": [
                {
                    "latitude": "-76.1",
                    "longitude": "99.37777",
                    "archived": false,
                    "seq": 1
                },
                {
                    "latitude": "-56.1",
                    "longitude": "129.37777",
                    "archived": false,
                    "seq": 2
                }
            ],
            "partInfo": {
                "partId": "1",
                "distance": 2.67,
                "spendTime": 10000,
                "tracks": [
                    [
                        {
                            "latitude": "-76.1",
                            "longitude": "99.47787"
                        },
                        {
                            "latitude": "-76.1",
                            "longitude": "99.47797"
                        }
                    ]
                ]
            },
            "latestPace": null
        }
    }
}
```


## 根據target查詢運動紀錄總覽

```url
POST /sport-track/record/summary
```
- 在集點卡地圖任務集點時叫用
- 查詢用戶在特定定位集點卡的軌跡紀錄資訊

### Request-根據target查詢運動紀錄總覽
 欄位 | 型態  | 必填 | 長度限制 | 預設 | 說明  
 ---|---|---|---|---|---
 targetType | string | Y | 20 | | 運動紀錄目標類型 [運動紀錄目標類型](#運動紀錄目標類型)
 target | string | Y(targetType=LOYALTY) | 36 | | 目標ID. targetType: LOYALTY, 對應到loyalty_card_task.id
 partId | int | | | | 軌跡分段序號, 定位集點卡集點卡序號. 第一張集點卡, partId:1. 以此類推

 
```javascript
{
    "targetType": "LOYALTY",
    "target": "9acb3da6-99d6-47a2-8fb8-73d22bda893e",
    "partId": 1
}
```

### Error-根據target查詢運動紀錄總覽
 httpCode | 錯誤碼 | 說明
 --- | --- | ---

### Response-根據target查詢運動紀錄總覽
 欄位 | 型態 | 說明 
 ---  | --- | ---
 targetType | string | 運動紀錄目標類型, 參閱 [運動紀錄目標類型](#運動紀錄目標類型)
 target | string | 目標ID. targetType: LOYALTY, 對應到loyalty_card_task.id
 startTime|timestamp|集點卡紀錄開始時間
 endTime | timestamp | 集點卡紀錄結束時間
 distance | double | 該集點卡的總距離, 單位公尺
 spendTime | int |該集點卡的總花費時間, 單位秒
 sportRecords|json array|該集點卡的所有運動紀錄
 
#### Response-根據target查詢運動紀錄總覽-sportRecords (json object)
 欄位 | 型態 | 說明 
 ---  | --- | ---
 id|string|運動紀錄id, 可以帶給webview顯示該運動紀錄的所有軌跡
 sportMod | string | 運動類型, 參閱 [運動模式](#運動模式)
 distance | double | 該紀錄的總距離, 單位公尺
 spendTime | int |該紀錄的總花費時間, 單位秒
 startTime|timestamp|運動紀錄開始時間
 endTime | timestamp | 運動紀錄結束時間

```javascript
{
    "httpCode": 200,
    "result": {
        "data": {
            "targetType": "LOYALTY",
            "target": "70be33cd-76e4-4d2d-8e06-a4f40665ce45",
            "startTime": 1678346603508,
            "distance": 3570.4300000000003,
            "spendTime": 4981000,
            "sportRecords": [
                {
                    "id": "33849fff-8a82-4372-9feb-d82e61438e7f",
                    "sportMod": "WALK",
                    "startTime": 1678430913432,
                    "distance": 645.07,
                    "spendTime": 967000
                },
                {
                    "id": "1518eec6-69f4-492d-bd68-31abbb72f02c",
                    "sportMod": "BIKE",
                    "startTime": 1678344575018,
                    "endTime": 1678344892084,
                    "distance": 195.03,
                    "spendTime": 245000
                },...
            ]
        }
    }
}
```


## 取得我當前運動紀錄

```url
GET /sport-track/my-record
```
- 取得用戶最新一筆運動紀錄, 可用來決定接下來要記錄,暫停還是結束, 以建立時間降冪排序
- 返回結果另外加入未結束的運動紀錄

### Request-取得我當前運動紀錄
 欄位 | 型態  | 必填 | 長度限制 | 預設 | 說明  
 ---|---|---|---|---|---

### Error-取得我當前運動紀錄
 httpCode | 錯誤碼 | 說明
 --- | --- | ---

### Response-取得我當前運動紀錄
 欄位 | 型態 | 說明 
 ---  | --- | ---
 id | string | 運動紀錄id 
 sportMod | string | 運動類型, 參閱 [運動模式](#運動模式)
 status | string | 運動紀錄狀態, 參閱 [運動紀錄狀態](#運動紀錄狀態)
 householdMemberId | string | 用戶ID
 targetType | string | 運動紀錄目標類型, 參閱 [運動紀錄目標類型](#運動紀錄目標類型)
 target | string | 目標ID. targetType: LOYALTY, 對應到loyalty_card_task.id
 sportStartTime|timestamp|運動紀錄開始時間
 createTime | timestamp | 建立日期時間
 updateTime | timestamp | 更新日期時間
 sportDistance | double | 運動距離, 單位為公尺(m) 
 sportDuration | int | 運動時間長度, 單位為秒(seconds)
 kcal | int | 運動消耗的卡路里
 goalDistance | double | 運動目標距離, 單位:公尺(m)
 goalDuration | int | 運動目標時間, 單位:秒(seconds)
 dataSource | string | 運動紀錄資料來源, [運動紀錄資料來源](#運動紀錄資料來源)
 notFinishList | json array | 未結束的運動紀錄列表
 sportModOther | string | 其他運動項目, sportMod=OTHER時可查看此欄位是何種運動
 
### Response-取得我當前運動紀錄-notFinishList-json
參閱 [Response-取得我當前運動紀錄](#Response-取得我當前運動紀錄)
 
 
```javascript
// 無運動紀錄
// {
    "httpCode": 200,
    "result": {
        "data": {}
    }
}
// 有運動紀錄
{
    "httpCode": 200,
    "result": {
        "data": {
            "id": "9d718fdb-d620-4197-ae80-26ea9ffcb6f8",
            "sportMod": "RUN",
            "status": "RECORDING",
            "householdMemberId": "8a9e980a-c612-4f87-af07-a97a5f0fbed5",
            "targetType": "LOYALTY",
            "target": "9acb3da6-99d6-47a2-8fb8-73d22bda893e",
            "createTime": 1677813479035,
            "updateTime": 1677813479035,
            "sportStartTime": 1677813479452,
            "notFinishList": [
                {...}
            ]
        }
    }
}
```


## 觸發活動紀錄

```url
POST /sport-track/record
```
* 活動紀錄(targetType=LOYALTY)
  - 新增或繼續紀錄(RECORDING)/暫停(PAUSE)/結束(FINISH)
* 運動紀錄(targetType=SPORT)
  - 新增或繼續紀錄(RECORDING)運動紀錄時, 呼叫此API
  - 暫停(PAUSE)運動紀錄時, 請呼叫 [暫停運動紀錄 /sport-track/pause](#暫停運動紀錄)
  - 結束(FINISH)運動紀錄時, 請呼叫 [結束運動紀錄 /sport-track/finish](#結束運動紀錄)
* 新增其他運動紀錄(targetType=SPORT, sportMod=OTHER)時也是呼叫此API
  - sportMod=OTHER, sportModOther必填, 說明是何運動項目
  - sportData必填, 運動持續時間(sportDuration), 運動距離(sportDistance), 卡路里(sportKcal)三個欄位必需至少填一項
  - 其他運動記錄狀態只能為FINISH
  - 運動(開始/結束)時間(sportTime)必填

### Request-觸發活動紀錄
 欄位 | 型態  | 必填 | 長度限制 | 預設 | 說明  
 ---|---|---|---|---|---
 sportMod | string | Y | 15 | | 運動類型 [運動模式](#運動模式)
 status | string | Y | 15 | | 運動紀錄狀態 [運動紀錄狀態](#運動紀錄狀態)
 targetType | string | Y | 20 | | 運動紀錄目標類型 [運動紀錄目標類型](#運動紀錄目標類型)
 target | string | Y(targetType=LOYALTY) | 36 | | 目標ID. targetType: LOYALTY, 對應到loyalty_card_task.id
 createNewTrackPart | boolean | Y(targetType=LOYALTY) | | | 該筆運動紀錄是否對應新的集點卡<BR>該集點卡尚未完成任何集點時本欄位需要填上true
 recordId | string | | 36 | | 運動紀錄id, targetType=SPORT 時, 要 繼續紀錄(RECORDING)/暫停(PAUSE)/結束(FINISH) 運動紀錄時, 需填入recordId<BR/>若未填入, 則會將未結束的相同運動模式運動紀錄結束再新增運動紀錄
 goalDuration | int | | | | 目標時間, 單位:秒, 新增一般運動紀錄時, 運動類型為距離類型時填入 
 goalDistance | double | | | | 目標距離, 單位:公尺(m), 新增一般運動紀錄時, 運動類型為計時類型時填入
 sportModOther | string | Y(sportMod=OTHER) | 100 | | 其他運動項目, 當sportMod=OTHER時必填
 sportTime | timestamp | Y(sportMod=OTHER) | | | 運動(開始/結束)時間(sportTime), 當sportMod=OTHER時必填
 sportData | json | Y(sportMod=OTHER) | | | 運動統計json, 當sportMod=OTHER時必填, 運動持續時間(sportDuration), 運動距離(sportDistance), 卡路里(sportKcal)三個欄位必需至少填一項

### Request-觸發活動紀錄-sportData(json)
 欄位 | 型態  | 必填 | 長度限制 | 預設 | 說明  
 ---|---|---|---|---|---
 sportDistance | double | | | | 運動距離, 單位為公尺(m)
 sportDuration | int | | | | 運動時間長度, 單位為秒(seconds)
 sportKcal | int | | | | 運動消耗的卡路里, 單位:千卡

```javascript
{
    "sportMod": "RUN",
    "status": "RECORDING",
    "targetType": "LOYALTY",
    "target": "071b07dc-0b63-4282-9732-eb10bc44376e",
    "createNewTrackPart": true,
    "recordId": null,
    "goalDuration": null,
    "goalDistance": null,
    "sportModOther": null,
    "sportTime": null,
    "sportData": null,
}
```

### Error-觸發活動紀錄
 httpCode | 錯誤碼 | 說明
 --- | --- | ---
 422 | SERVICE_ERROR.SPORT_RECORD_STATUS_ERROR | 運動紀錄的狀態切換錯誤.<BR> RECORDING只能切換為PAUSE/FINISH<BR>PAUSE只能切換為RECORDING/FINISH

### Response-觸發活動紀錄
 欄位 | 型態 | 說明 
 ---  | --- | ---
 id | string | 運動紀錄id 
 sportMod | string | 運動類型, 參閱 [運動模式](#運動模式)
 status | string | 運動紀錄狀態, 參閱 [運動紀錄狀態](#運動紀錄狀態)
 householdMemberId | string | 用戶ID
 targetType | string | 運動紀錄目標類型, 參閱 [運動紀錄目標類型](#運動紀錄目標類型)
 target | string | 目標ID. targetType: LOYALTY, 對應到loyalty_card_task.id
 optionInfo | string | 本次運動紀錄的附屬資訊, 請附加在 上傳軌跡紀錄 API內
 createTime | timestamp | 建立日期時間
 updateTime | timestamp | 更新日期時間
 sportDistance | double | 運動距離, 單位為公尺(m) 
 sportDuration | int | 運動時間長度, 單位為秒(seconds)
 kcal | int | 運動消耗的卡路里
 goalDistance | double | 運動目標距離, 單位:公尺(m)
 goalDuration | int | 運動目標時間, 單位:秒(seconds)
 dataSource | string | 運動紀錄資料來源, 參閱[運動紀錄資料來源](#運動紀錄資料來源)
 sportModOther | string | 其他運動項目, sportMod=OTHER時可查看此欄位是何種運動

```javascript
{
    "httpCode": 200,
    "result": {
        "data": {
            "id": "526808c0-4112-49fd-a6d2-ab2ebd19a486",
            "sportMod": "RUN",
            "status": "RECORDING",
            "householdMemberId": "8a9e980a-c612-4f87-af07-a97a5f0fbed5",
            "targetType": "LOYALTY",
            "target": "071b07dc-0b63-4282-9732-eb10bc44376e",
            "createTime": 1676895957113,
            "updateTime": 1676895957113,
            "optionInfo": "[{\"id\":\"f1dbf8cf-cbb2-45fe-983f-16a15fa52d13\",\"seq\":1,\"latitude\":\"-9.1\",\"longitude\":\"-179.37777\"},{\"id\":\"1ab88565-7e94-48e5-9375-d2828340e75b\",\"seq\":2,\"latitude\":\"-51.1\",\"longitude\":\"129.37777\"},{\"id\":\"7401aa85-eab1-4cd6-819c-6203a57a55b8\",\"seq\":3,\"latitude\":\"-31.1\",\"longitude\":\"129.37777\"}]",
            "dataSource": "LOYALTY"
        }
    }
}
```


## 上傳活動軌跡

```url
POST /sport-track/add
```
- 軌跡座標取樣頻率目前暫訂三秒取一點(未來會根據不同運動類型在運動紀錄那邊提供動態取樣頻率)
- 每次上傳軌跡列表至少兩點以上, 以便計算距離

### Request-上傳活動軌跡
 欄位 | 型態  | 必填 | 長度限制 | 預設 | 說明  
 ---|---|---|---|---|---
 optionInfo | string | Y | 5000 | | 運動紀錄的附屬資訊, 請透過 sport-track/record 取得
 targetType | string | Y | 20 | | 運動紀錄目標類型 [運動紀錄目標類型](#運動紀錄目標類型)
 target | string | Y | 36 | | 目標ID. targetType: LOYALTY, 對應到loyalty_card_task.id
 trackList | json array | Y |  | | 軌跡座標列表, 至少需要有2個座標點
 recordId | string | Y(targetType=SPORT) | 36 | | 運動記錄id, targetType=SPORT 時, 需填入recordId才能新增軌跡紀錄  
 
#### Request-上傳活動軌跡-軌跡座標 (json object)
 欄位 | 型態 | 說明 
 ---  | --- | ---
 lat | string | 緯度, 範圍-90~90. 取道小數點下五位
 lng | string | 經度, 範圍-180~180. 取道小數點下五位
 timeFlag | timestamp | 座標取樣的時間戳記

```javascript
{
    "optionInfo": "[{\"id\":\"f1dbf8cf-cbb2-45fe-983f-16a15fa52d13\",\"seq\":1,\"latitude\":\"-9.1\",\"longitude\":\"-179.37777\"},{\"id\":\"1ab88565-7e94-48e5-9375-d2828340e75b\",\"seq\":2,\"latitude\":\"-51.1\",\"longitude\":\"129.37777\"},{\"id\":\"7401aa85-eab1-4cd6-819c-6203a57a55b8\",\"seq\":3,\"latitude\":\"-31.1\",\"longitude\":\"129.37777\"}]",
    "targetType": "LOYALTY",
    "target": "071b07dc-0b63-4282-9732-eb10bc44376e",
    "trackList": [
        {
            "lat": -41.1,
            "lng": 129.37776,
            "timeFlag": 1676289350949
        },
        {
            "lat": -41.1,
            "lng": 129.37776,
            "timeFlag": 1676289350949
        },
    ], 
    "recordId": null
}
```

### Error-上傳活動軌跡
 httpCode | 錯誤碼 | 說明
 --- | --- | ---
 422 | SERVICE_ERROR.SPORT_RECORD_NO_SPORT_RECORDING | 目前運動紀錄的狀態並非"RECORDING"

### Response-上傳活動軌跡
 欄位 | 型態 | 說明 
 ---  | --- | ---
 id | string | 軌跡紀錄id 
 partId | string | 軌跡分段編號
 recordId | string | 運動紀錄ID
 startPoint | json string | 軌跡的起點座標
 endPoint | json string | 軌跡的結束點座標
 allPoints | json string | 軌跡的所有座標點
 isActive | boolean | 該段軌跡是否還能繼續記錄
 createTime | timestamp | 建立日期時間
 updateTime | timestamp | 更新日期時間
 

```javascript
{
    "httpCode": 200,
    "result": {
        "data": [
            {
                "id": "9f75d2fe-ff01-4ebc-96d2-bb73d708c8db",
                "partId": "4",
                "recordId": "526808c0-4112-49fd-a6d2-ab2ebd19a486",
                "startPoint": "{\"lat\":\"-41.3\",\"lng\":\"129.37776\",\"timeFlag\":\"Feb 13, 2023 7:55:50 PM\"}",
                "endPoint": "{\"lat\":\"-41.3\",\"lng\":\"129.37776\",\"timeFlag\":\"Feb 13, 2023 7:55:50 PM\"}",
                "allPoints": "[{\"lat\":\"-41.3\",\"lng\":\"129.37776\",\"timeFlag\":\"Feb 13, 2023 7:55:50 PM\"},{\"lat\":\"-4.1\",\"lng\":\"-179.37765\",\"timeFlag\":\"Feb 13, 2023 7:55:50 PM\"},{\"lat\":\"-41.1\",\"lng\":\"129.37776\",\"timeFlag\":\"Feb 13, 2023 7:55:50 PM\"},{\"lat\":\"-41.1\",\"lng\":\"129.37776\",\"timeFlag\":\"Feb 13, 2023 7:55:50 PM\"},{\"lat\":\"-41.3\",\"lng\":\"129.37776\",\"timeFlag\":\"Feb 13, 2023 7:55:50 PM\"},{\"lat\":\"-4.1\",\"lng\":\"-179.37765\",\"timeFlag\":\"Feb 13, 2023 7:55:50 PM\"},{\"lat\":\"-41.1\",\"lng\":\"129.37776\",\"timeFlag\":\"Feb 13, 2023 7:55:50 PM\"},{\"lat\":\"-41.1\",\"lng\":\"129.37776\",\"timeFlag\":\"Feb 13, 2023 7:55:50 PM\"},{\"lat\":\"-41.3\",\"lng\":\"129.37776\",\"timeFlag\":\"Feb 13, 2023 7:55:50 PM\"},{\"lat\":\"-4.1\",\"lng\":\"-179.37765\",\"timeFlag\":\"Feb 13, 2023 7:55:50 PM\"},{\"lat\":\"-41.1\",\"lng\":\"129.37776\",\"timeFlag\":\"Feb 13, 2023 7:55:50 PM\"},{\"lat\":\"-41.1\",\"lng\":\"129.37776\",\"timeFlag\":\"Feb 13, 2023 7:55:50 PM\"},{\"lat\":\"-41.3\",\"lng\":\"129.37776\",\"timeFlag\":\"Feb 13, 2023 7:55:50 PM\"}]",
                "createTime": 1676950621103,
                "updateTime": 1677051306612,
                "isActive": true
            }
        ]
    }
}
```


## 暫停運動紀錄

```url
POST /sport-track/pause
```

* 要暫停運動記錄時, 請call 此API

### Request-暫停運動紀錄
 欄位 | 型態  | 必填 | 長度限制 | 預設 | 說明  
 ---|---|---|---|---|---
 recordId | string | Y | 36 | | 運動紀錄id
 sportData | json | | | | 本次運動的數據, 若有帶值, 會以此數據當成本筆運動記錄的運動時間, 距離, 卡路里, 若為null, 則由後端自動計算

### Request-暫停運動紀錄-sportData(json)
 欄位 | 型態  | 必填 | 長度限制 | 預設 | 說明  
 ---|---|---|---|---|---
 sportDistance | double | | | | 運動距離, 單位為公尺(m)
 sportDuration | int | | | | 運動時間長度, 單位為秒(seconds)
 sportKcal | int | | | | 運動消耗的卡路里, 單位:千卡

```javascript
{
    "recordId": "071b07dc-0b63-4282-9732-eb10bc44376e",
    "sportData": {
        "sportDistance": null,
        "sportDuration": null,
        "sportKcal": null
    }
}
```

### Error-暫停運動紀錄
 httpCode | 錯誤碼 | 說明
 --- | --- | ---
 422 | SERVICE_ERROR.SPORT_RECORD_STATUS_ERROR | 運動紀錄的狀態切換錯誤.<BR> RECORDING只能切換為PAUSE/FINISH<BR>PAUSE只能切換為RECORDING/FINISH

### Response-暫停運動紀錄
 欄位 | 型態 | 說明 
 ---  | --- | ---
 id | string | 運動紀錄id 
 sportMod | string | 運動類型, 參閱 [運動模式](#運動模式)
 status | string | 運動紀錄狀態, 參閱 [運動紀錄狀態](#運動紀錄狀態)
 householdMemberId | string | 用戶ID
 targetType | string | 運動紀錄目標類型, 參閱 [運動紀錄目標類型](#運動紀錄目標類型)
 target | string | 目標ID. targetType: LOYALTY, 對應到loyalty_card_task.id
 optionInfo | string | 本次運動紀錄的附屬資訊, 請附加在 上傳軌跡紀錄 API內
 createTime | timestamp | 建立日期時間
 updateTime | timestamp | 更新日期時間
 sportDistance | double | 運動距離, 單位為公尺(m) 
 sportDuration | int | 運動時間長度, 單位為秒(seconds)
 kcal | int | 運動消耗的卡路里
 goalDistance | double | 運動目標距離, 單位:公尺(m)
 goalDuration | int | 運動目標時間, 單位:秒(seconds)
 dataSource | string | 運動紀錄資料來源, 參閱[運動紀錄資料來源](#運動紀錄資料來源)

```javascript
{
    "httpCode": 200,
    "result": {
        "data": {
            "id": "526808c0-4112-49fd-a6d2-ab2ebd19a486",
            "sportMod": "RUN",
            "status": "PAUSE",
            "householdMemberId": "8a9e980a-c612-4f87-af07-a97a5f0fbed5",
            "targetType": "SPORT",
            "target": null,
            "createTime": 1676895957113,
            "updateTime": 1676895957113,
            "optionInfo": "",
            "dataSource": "MANUAL"
        }
    }
}
```


## 結束運動紀錄

```url
POST /sport-track/finish
```

* 要結束運動紀錄時, 請call 此API

### Request-結束運動紀錄
 欄位 | 型態  | 必填 | 長度限制 | 預設 | 說明  
 ---|---|---|---|---|---
 recordId | string | Y | 36 | | 運動紀錄id
 sportData | json | | | | 本次運動的數據, 若有帶值, 會以此數據當成本筆運動記錄的運動時間, 距離, 卡路里, 若為null, 則由後端自動計算

### Request-結束運動紀錄-sportData(json)
 欄位 | 型態  | 必填 | 長度限制 | 預設 | 說明  
 ---|---|---|---|---|---
 sportDistance | double | | | | 運動距離, 單位為公尺(m)
 sportDuration | int | | | | 運動時間長度, 單位為秒(seconds)
 sportKcal | int | | | | 運動消耗的卡路里, 單位:千卡

```javascript
{
    "recordId": "071b07dc-0b63-4282-9732-eb10bc44376e",
    "sportData": {
        "sportDistance": null,
        "sportDuration": null,
        "sportKcal": null
    }
}
```

### Error-結束運動紀錄
 httpCode | 錯誤碼 | 說明
 --- | --- | ---
 422 | SERVICE_ERROR.SPORT_RECORD_STATUS_ERROR | 運動紀錄的狀態切換錯誤.<BR> RECORDING只能切換為PAUSE/FINISH<BR>PAUSE只能切換為RECORDING/FINISH

### Response-結束運動紀錄
 欄位 | 型態 | 說明 
 ---  | --- | ---
 id | string | 運動紀錄id 
 sportMod | string | 運動類型, 參閱 [運動模式](#運動模式)
 status | string | 運動紀錄狀態, 參閱 [運動紀錄狀態](#運動紀錄狀態)
 householdMemberId | string | 用戶ID
 targetType | string | 運動紀錄目標類型, 參閱 [運動紀錄目標類型](#運動紀錄目標類型)
 target | string | 目標ID. targetType: LOYALTY, 對應到loyalty_card_task.id
 optionInfo | string | 本次運動紀錄的附屬資訊, 請附加在 上傳軌跡紀錄 API內
 createTime | timestamp | 建立日期時間
 updateTime | timestamp | 更新日期時間
 sportDistance | double | 運動距離, 單位為公尺(m) 
 sportDuration | int | 運動時間長度, 單位為秒(seconds)
 kcal | int | 運動消耗的卡路里
 goalDistance | double | 運動目標距離, 單位:公尺(m)
 goalDuration | int | 運動目標時間, 單位:秒(seconds)
 dataSource | string | 運動紀錄資料來源, 參閱[運動紀錄資料來源](#運動紀錄資料來源)

```javascript
{
    "httpCode": 200,
    "result": {
        "data": {
            "id": "526808c0-4112-49fd-a6d2-ab2ebd19a486",
            "sportMod": "RUN",
            "status": "FINISH",
            "householdMemberId": "8a9e980a-c612-4f87-af07-a97a5f0fbed5",
            "targetType": "SPORT",
            "target": null,
            "createTime": 1676895957113,
            "updateTime": 1676895957113,
            "optionInfo": "",
            "dataSource": "MANUAL"
        }
    }
}
```


## 編輯運動紀錄(其他)

```url
POST /sport-track/record/update
```
* 只允許編輯其他運動紀錄(targetType=SPORT, sportMod=OTHER)
  - sportMod=OTHER, sportModOther必填, 說明是何運動項目
  - sportData必填, 運動持續時間(sportDuration), 運動距離(sportDistance), 卡路里(sportKcal)三個欄位必需至少填一項
  - 其他運動記錄狀態只能為FINISH
  - 運動(開始/結束)時間(sportTime)必填

### Request-編輯運動紀錄(其他)
 欄位 | 型態  | 必填 | 長度限制 | 預設 | 說明  
 ---|---|---|---|---|---
 id | string | Y | 36 | | 運動紀錄id
 sportMod | string | Y | 15 | | 運動類型 [運動模式](#運動模式)
 status | string | Y | 15 | | 運動紀錄狀態 [運動紀錄狀態](#運動紀錄狀態)
 targetType | string | Y | 20 | | 運動紀錄目標類型 [運動紀錄目標類型](#運動紀錄目標類型)
 sportModOther | string | Y(sportMod=OTHER) | 100 | | 其他運動項目, 當sportMod=OTHER時必填
 sportTime | timestamp | Y(sportMod=OTHER) | | | 運動(開始/結束)時間(sportTime), 當sportMod=OTHER時必填
 sportData | json | Y(sportMod=OTHER) | | | 運動統計json, 當sportMod=OTHER時必填, 運動持續時間(sportDuration), 運動距離(sportDistance), 卡路里(sportKcal)三個欄位必需至少填一項

### Request-編輯運動紀錄(其他)-sportData(json)
 欄位 | 型態  | 必填 | 長度限制 | 預設 | 說明  
 ---|---|---|---|---|---
 sportDistance | double | | | | 運動距離, 單位為公尺(m)
 sportDuration | int | | | | 運動時間長度, 單位為秒(seconds)
 sportKcal | int | | | | 運動消耗的卡路里, 單位:千卡

```javascript
{
    "id": "e9fd30ec-051b-4b32-8ccb-3ff0af428548",
    "sportMod": "OTHER",
    "status": "FINISH",
    "targetType": "SPORT",
    "sportModOther": "全員逃走中",
    "sportTime": 1693903515000,
    "sportData": {
        "sportDuration": 2700,
        "sportDistance": null,
        "sportKcal": 1050
    }
}
```

### Error-編輯運動紀錄(其他)
 httpCode | 錯誤碼 | 說明
 --- | --- | ---
 422 | SERVICE_ERROR.SPORT_RECORD_NOT_OTHER_SPORT | 非其他運動紀錄
 422 | SERVICE_ERROR.SPORT_RECORD_OTHER_SPORT_CHANGE_MODE_NOT_ALLOWED | 其他運動模式不允許再變更成其他運動模式

### Response-編輯運動紀錄(其他)
 欄位 | 型態 | 說明 
 ---  | --- | ---
 id | string | 運動紀錄id 
 sportMod | string | 運動類型, 參閱 [運動模式](#運動模式)
 status | string | 運動紀錄狀態, 參閱 [運動紀錄狀態](#運動紀錄狀態)
 householdMemberId | string | 用戶ID
 targetType | string | 運動紀錄目標類型, 參閱 [運動紀錄目標類型](#運動紀錄目標類型)
 target | string | 目標ID. targetType: LOYALTY, 對應到loyalty_card_task.id
 optionInfo | string | 本次運動紀錄的附屬資訊, 請附加在 上傳軌跡紀錄 API內
 createTime | timestamp | 建立日期時間
 updateTime | timestamp | 更新日期時間
 sportDistance | double | 運動距離, 單位為公尺(m) 
 sportDuration | int | 運動時間長度, 單位為秒(seconds)
 kcal | int | 運動消耗的卡路里
 goalDistance | double | 運動目標距離, 單位:公尺(m)
 goalDuration | int | 運動目標時間, 單位:秒(seconds)
 dataSource | string | 運動紀錄資料來源, 參閱[運動紀錄資料來源](#運動紀錄資料來源)
 sportModOther | string | 其他運動項目, sportMod=OTHER時可查看此欄位是何種運動

```javascript
{
    "httpCode": 200,
    "result": {
        "data": {
            "id": "e9fd30ec-051b-4b32-8ccb-3ff0af428548",
            "sportMod": "OTHER",
            "status": "FINISH",
            "householdMemberId": "150b53f5-7126-4900-9fb0-87a08b45e06b",
            "targetType": "SPORT",
            "createTime": 1693910073517,
            "updateTime": 1693910808594,
            "sportStartTime": 1693903515000,
            "sportEndTime": 1693903515000,
            "sportDuration": 2700,
            "kcal": 1050,
            "dataSource": "MANUAL",
            "sportModOther": "全員逃走中"
        }
    }
}
```


## 取得運動紀錄列表(Web端)
```url
POST /sport-track/record/web-list
```
* Web端使用

### Request-取得運動紀錄列表(Web端)
#### Request-取得運動紀錄列表(Web端)-query (查詢條件json)
 欄位 | 型態  | 必填 | 長度限制 | 預設 | 說明  
 ---|---|---|---|---|---
 householdMemberId | string | Y | 36 | | householdMemberId
 startDate | string | Y |  | | 要搜尋的啟始日期, YYYY-MM-DD
 endDate | string | Y |  | | 要搜尋的結束日期, YYYY-MM-DD
 sportMod | string | | 15 | | 運動類型 [運動模式](#運動模式), 未填入表示查詢所有類型
 
#### Request-取得運動紀錄列表(Web端)-pagination (分頁json)
 欄位 | 型態  | 必填 | 預設 | 說明
 ---|---|---|---|---
 current | int | | 1 | 當前頁數 
 pageSize | int | | 10 | 每頁結果數量，-1 為顯示所有
 
#### Request-取得運動紀錄列表(Web端)-sorter (排序json) 
 欄位 | 型態  | 必填 | 預設 | 說明
 ---|---|---|---|--- 
 field | string | | sportTime | 排序欄位,可排序欄位有 sportTime, sportMod, dataSource
 order | string | | desc | 升序或降序 

```javascript
{
    "query": {
        "householdMemberId": "150b53f5-7126-4900-9fb0-87a08b45e06b",
        "startDate": "2023-04-01",
        "endDate": "2023-04-30",
        "sportMod": null
    } ,
    "pagination": {
        "current": 1,
        "pageSize": 10
    }, 
    "sorter": {
        "field": "sportTime",
        "order": "desc"
    }
}
```

### Response-取得運動紀錄列表(Web端)
 欄位 | 型態 | 說明
 ---  | --- | ---
 sportTime | timestamp | 運動時間
 sportMod | string | 運動類型 [運動模式](#運動模式)
 steps | int | 步數
 sportDistance | double | 運動距離, 單位為公尺(m) 
 sportDuration | int | 運動時間長度, 單位為秒(seconds)
 kcal | int | 運動消耗的卡路里
 dataSource | string | 運動紀錄資料來源, [運動紀錄資料來源](#運動紀錄資料來源)
 sportModOther | string | 其他運動項目, sportMod=OTHER時可查看此欄位是何種運動

```javascript
{
    "httpCode": 200,
    "result": {
        "data": [
            {
                "sportTime": 1666683673892,
                "sportMod": "RUN",
                "steps": null,
                "sportDistance": 1500,
                "sportDuration": 1800,
                "kcal": 0,
                "dataSource": "MANUAL"
            },
            ...
        ],
        "pagination": {
            "current": 1,
            "pageSize": 10,
            "total": 7
        },
        "sorter": {
            "field": "sportTime",
            "order": "desc"
        },
        "total": 7
    }
}
```


## 取得運動紀錄列表(App端)
```url
POST /sport-track/record/list
```
* Web端使用

### Request-取得運動紀錄列表(App端)
#### Request-取得運動紀錄列表(App端)-query (查詢條件json)
 欄位 | 型態  | 必填 | 長度限制 | 預設 | 說明  
 ---|---|---|---|---|---
 startDate | string | Y |  | | 要搜尋的啟始日期, YYYY-MM-DD
 endDate | string | Y |  | | 要搜尋的結束日期, YYYY-MM-DD
 
#### Request-取得運動紀錄列表(App端)-pagination (分頁json)
 欄位 | 型態  | 必填 | 預設 | 說明
 ---|---|---|---|---
 current | int | | 1 | 當前頁數 
 pageSize | int | | 10 | 每頁結果數量，-1 為顯示所有
 
#### Request-取得運動紀錄列表(App端)-sorter (排序json) 
 欄位 | 型態  | 必填 | 預設 | 說明
 ---|---|---|---|--- 
 field | string | | sportTime | 排序欄位,可排序欄位有 sportTime, sportMod, dataSource
 order | string | | desc | 升序或降序 

```javascript
{
    "query": {
        "startDate": "2023-04-01",
        "endDate": "2023-04-30"
    } ,
    "pagination": {
        "current": 1,
        "pageSize": 10
    }, 
    "sorter": {
        "field": "sportTime",
        "order": "desc"
    }
}
```

### Response-取得運動紀錄列表(App端)
 欄位 | 型態 | 說明
 ---  | --- | ---
 id | string | 運動紀錄id
 sportTime | timestamp | 運動時間
 sportMod | string | 運動類型 [運動模式](#運動模式)
 sportDistance | double | 運動距離, 單位為公尺(m) 
 sportDuration | int | 運動時間長度, 單位為秒(seconds)
 kcal | int | 運動消耗的卡路里
 dataSource | string | 運動紀錄資料來源, [運動紀錄資料來源](#運動紀錄資料來源)
 status | string | 運動紀錄狀態, 參閱 [運動紀錄狀態](#運動紀錄狀態)
 goalDistance | double | 運動目標距離, 單位:公尺(m) 
 goalDuration | int | 運動目標時間, 單位:秒(seconds)
 targetType | string | 運動紀錄目標類型, 參閱 [運動紀錄目標類型](#運動紀錄目標類型)
 sportModOther | string | 其他運動項目, sportMod=OTHER時可查看此欄位是何種運動

```javascript
{
    "httpCode": 200,
    "result": {
        "data": [
            {
                "id": "526808c0-4112-49fd-a6d2-ab2ebd19a486",
                "sportTime": 1666683673892,
                "sportMod": "RUN",
                "sportDistance": 1500,
                "sportDuration": 1800,
                "kcal": 0,
                "dataSource": "MANUAL",
                "status": "FINISH",
                "goalDistance": 5000,
                "targetType": "SPORT"
            },
            ...
        ],
        "pagination": {
            "current": 1,
            "pageSize": 10,
            "total": 7
        },
        "sorter": {
            "field": "sportTime",
            "order": "desc"
        },
        "total": 7
    }
}
```


## 取得運動紀錄配速
```url
POST /sport-track/record/pace
```

* 運動類型為距離計算型的才有配速

### Request-取得運動紀錄配速
 欄位 | 型態  | 必填 | 長度限制 | 預設 | 說明  
 ---|---|---|---|---|---
 recordId | string | Y | 36 | | 運動紀錄id

```javascript
{
    "recordId": "071b07dc-0b63-4282-9732-eb10bc44376e"
}
```

### Response-取得運動紀錄配速
 欄位 | 型態 | 說明 
 ---  | --- | ---
 km | int | 距離-第幾公里 
 pace | int | 配速, 單位:秒(seconds)
 kmh | double | 時速, 單位: 公里(km)

```javascript
{
    "httpCode": 200,
    "result": {
        "data": [
            {
                "km": 1,
                "pace": 360,
                "kmh": 8.5
            },
            ...
        ]
    }
}
```


## 取得運動紀錄Summary
```url
POST /sport-track/record/summary-list
```

* 權限: App使用者及Web端使用者


### Request-取得運動紀錄Summary
 欄位 | 型態  | 必填 | 長度限制 | 預設 | 說明  
 ---|---|---|---|---|---
 householdMemberId | string | N | | | householdMemberId, App使用者不需填,會由userToken中取得, Web使用者必填
 startDate | string | Y |  | | 要搜尋的啟始日期, YYYY-MM-DD
 endDate | string | Y |  | | 要搜尋的結束日期, YYYY-MM-DD
 summaryType | string | Y | 10 | | 運動紀錄Summary查詢類別, 參閱 [運動紀錄Summary查詢類別](#運動紀錄Summary查詢類別)

```javascript
{
    "startDate": "2023-04-30",
    "endDate": "2023-04-30",
    "summaryType": "DAILY"
}
```

### Response-取得運動紀錄Summary
 欄位 | 型態 | 說明 
 ---  | --- | ---
 kcal | int | 運動消耗的卡路里 
 sportDistance | double | 運動距離, 單位為公尺(m) 
 sportDuration | int | 運動時間長度, 單位為秒(seconds)
 steps | int | 累計步數
 avgSteps | int | 平均每日步數
 dataList | json array | summary json

### Response-取得運動紀錄Summary-dataList(json)
 欄位 | 型態 | 說明 
 ---  | --- | ---
 sportTime | timestamp | 運動時間 
 kcal | int | 運動消耗的卡路里 
 sportDistance | double | 運動距離, 單位為公尺(m) 
 sportDuration | int | 運動時間長度, 單位為秒(seconds)
 steps | int | 步數

```javascript
{
    "httpCode": 200,
    "result": {
        "data": {
            "kcal": 780,
            "sportDistance": 5500,
            "sportDuration": 1800,
            "steps": 3249,
            "avgSteps": 3249,
            "dataList": [
                {
                    "sportTime": 1666683673892,
                    "kcal": 250,
                    "sportDistance": 3500,
                    "sportDuration": 900,
                    "steps": 3249
                },
                ...
            ]
        }
    }
}
```


## 設定目標步數
```url
POST /sport/goal
```

### Request-設定目標步數
 欄位 | 型態  | 必填 | 長度限制 | 預設 | 說明  
 ---|---|---|---|---|--- 
 step | int | Y | | | 步數 

```javascript
{
    "step": 600
}
```

### Response-設定目標步數
```javascript
{
    "httpCode": 200,
    "result": {
        "data": {
            "step": "600"
        }
    }
}
```


## 取得建議步數
```url
    GET /sport/goal
```

### Request-取得建議步數

### Response-取得建議步數
 欄位 | 型態 | 說明 
 ---  | --- | ---
 id | int | 記錄id
 step | int | 建議步數
 householdMemberId | string | householdMemberId
 createAt | long | 建立時間 timestamp
 updateAt | long | 更新時間 timestamp

```javascript
{
    "httpCode": 200,
    "result": {
        "data": {
            "id": 1,
            "step": 600,
            "householdMemberId": "123",
            "createdAt": 1608285561161,
            "updatedAt": 1608286089292
        }
    }
}
```


## 新增跑步紀錄(SportRun)
```url
POST /sport/run/bulkAdd
```

### Request-新增跑步紀錄(SportRun)
 欄位 | 型態  | 必填 | 長度限制 | 預設 | 說明  
 ---|---|---|---|---|---
 startTime | timestamp | Y | | | 開始運動時間
 stopTime | timestamp | Y | | | 結束運動時間
 sportTime | int  | | | | 運動時間(秒)
 stepCount | int | | | | 步數
 sportCount | int | | | | 運動次數
 kcals | double | | | | 卡路里(千卡)
 distance | double  | | | | 距離(km)
 recordCount | int | | | | 記錄次數
 pauseCount | int | | | | 暫停次數
 pauseTime | int | | | | 暫停時間(秒)
 crc | int | Y | | | 手環運動pk
 peisu | int | | | | unknown
 oxSportTimes | int | | | | 有氧運動時間(秒)
 averRate | int | | | | 平均心率

```javascript
{
    "data": [
        {
            "startTime": 1608529808000,
            "stopTime": 1608529818000,
            "sportTime": 1,
            "stepCount": 1,
            "sportCount": 1,
            "kcals": 1.123,
            "distance": 1.321,
            "recordCount": 1,
            "pauseCount": 1,
            "pauseTime": 1,
            "crc": 1,
            "peisu": 1,
            "oxSportTimes": 1,
            "averRate": 1
        },
        {
            "startTime": 1608539808000,
            "stopTime": 1608539818000,
            "sportTime": 2,
            "stepCount": 2,
            "sportCount": 2,
            "kcals": 2,
            "distance": 2,
            "recordCount": 2,
            "pauseCount": 2,
            "pauseTime": 2,
            "crc": 1,
            "peisu": 2,
            "oxSportTimes": 2,
            "averRate": 2
        }
    ]
}
```

### Response-新增跑步紀錄(SportRun)
 欄位 | 型態 | 說明 
 ---  | --- | ---
 id | int | 記錄id
 startTime | timestamp | 開始運動時間
 stopTime | timestamp | 結束運動時間
 sportTime | int  | 運動時間(秒)
 stepCount | int | 步數
 sportCount | int | 運動次數
 kcals | double | 卡路里(千卡)
 distance | double | 距離(km)
 recordCount | int | 記錄次數
 pauseCount | int | 暫停次數
 pauseTime | int | 暫停時間(秒)
 crc | int | 手環運動pk
 peisu | int | unknown
 oxSportTimes | int | 有氧運動時間(秒)
 averRate | int | 平均心率

```javascript
{
    "httpCode": 200,
    "result": {
        "data": [
            {
                "id": 5,
                "startTime": 1608529808000,
                "stopTime": 1608529818000,
                "sportTime": 1,
                "stepCount": 1,
                "sportCount": 1,
                "kcals": 1.123,
                "distance": 1.321,
                "recordCount": 1,
                "pauseCount": 1,
                "pauseTime": 1,
                "crc": 1,
                "peisu": 1,
                "oxSportTimes": 1,
                "averRate": 1,
                "householdMemberId": "c4e79844-c6ac-483b-ae98-f5c14277dc4b",
                "createTime": 1610093208060
            },
            {
                "id": 6,
                "startTime": 1608539808000,
                "stopTime": 1608539818000,
                "sportTime": 2,
                "stepCount": 2,
                "sportCount": 2,
                "kcals": 2,
                "distance": 2,
                "recordCount": 2,
                "pauseCount": 2,
                "pauseTime": 2,
                "crc": 1,
                "peisu": 2,
                "oxSportTimes": 2,
                "averRate": 2,
                "householdMemberId": "c4e79844-c6ac-483b-ae98-f5c14277dc4b",
                "createTime": 1610093208060
            }
        ]
    }
}
```


## 查詢跑步紀錄(SportRun)
```url
POST /sport/run/list
```

### Request-查詢跑步紀錄(SportRun)
  欄位 | 型態  | 預設 | 說明  
---|---|---|---
 page | number | 1 | 當前頁數
 pageSize | number | 10 | 每頁結果數量，-1 為顯示所有
 sorter | string | startTime | 排序欄位
 startAt | number |  | 從(startTime) 
 endAt | number |  | 結束(startTime) 
 householdMemberId | String | | 如果沒有給就依照token解出來的householdMemberId  

```javascript
{
    "query": {
        "startAt": 1507990400000,
        "endAt": 1658076799000
    },
    "pagination": {
        "current": 1,
        "pageSize":-1
    },
    "sorter": {
        "field": "create_time",
        "order": "asc"
    }
}
```

### Response-查詢跑步紀錄(SportRun)
 欄位 | 型態 | 說明 
 ---  | --- | ---
 id | int | 記錄id
 startTime | timestamp | 開始運動時間
 stopTime | timestamp | 結束運動時間
 sportTime | int  | 運動時間(秒)
 stepCount | int | 步數
 sportCount | int | 運動次數
 kcals | double | 卡路里(千卡)
 distance | double | 距離(km)
 recordCount | int | 記錄次數
 pauseCount | int | 暫停次數
 pauseTime | int | 暫停時間(秒)
 crc | int | 手環運動pk
 peisu | int | unknown
 oxSportTimes | int | 有氧運動時間(秒)
 averRate | int | 平均心率

```javascript
{
    "httpCode": 200,
    "result": {
        "data": [
            {
                "id": 1,
                "startTime": 1608529808000,
                "stopTime": 1608529818000,
                "sportTime": 1,
                "stepCount": 1,
                "sportCount": 1,
                "kcals": 1,
                "distance": 1,
                "recordCount": 1,
                "pauseCount": 1,
                "pauseTime": 1,
                "crc": 1,
                "peisu": 1,
                "oxSportTimes": 1,
                "averRate": 1,
                "householdMemberId": "c4e79844-c6ac-483b-ae98-f5c14277dc4b"
            },
            {
                "id": 2,
                "startTime": 1608529808000,
                "stopTime": 1608529818000,
                "sportTime": 1,
                "stepCount": 1,
                "sportCount": 1,
                "kcals": 1,
                "distance": 1,
                "recordCount": 1,
                "pauseCount": 1,
                "pauseTime": 1,
                "crc": 1,
                "peisu": 1,
                "oxSportTimes": 1,
                "averRate": 1,
                "householdMemberId": "c4e79844-c6ac-483b-ae98-f5c14277dc4b"
            },
            ...
        ],
        "pagination": {
            "current": 1,
            "pageSize": -1,
            "total": 4
        },
        "sorter": {
            "field": "create_time",
            "order": "asc"
        }
    }
}
```


## 新增30分鐘健康紀錄
```url
POST /sport/halfHour/bulkAdd
```

### Request-新增30分鐘健康紀錄
 欄位 | 型態  | 預設 | 說明  
---|---|---|---
 exerciseTime | timestamp  | 運動時間
 stepValue | int  | 步數
 sportValue | int  | 運動時間(秒)
 disValue | double  | 距離(km)
 calValue | double  | 卡路里(卡)
 sourceType | string | O: "Osmile"、G: "Goofle Fit"、I: "IOS 健康"

```javascript
{
   "sportData":[
       {
            "exerciseTime": 1583991833330,
            "stepValue": 100,
            "sportValue": 100,
            "disValue": 100.111,
            "calValue": 100.222,
            "sourceType": "G"
       },
       {
            "exerciseTime": 1583992133330,
            "stepValue": 200,
            "sportValue": 200,
            "disValue": 200.333,
            "calValue": 200.444,
            "sourceType": "G"
       }
   ]
}
```

### Response-新增30分鐘健康紀錄
 欄位 | 型態 | 說明 
 ---  | --- | ---
 exerciseTime | timestamp | 運動時間
 stepValue | int | 步數
 sportValue | int | 運動時間(秒)
 disValue | double | 距離(km)
 calValue | double | 卡路里(卡)
 sourceType | string | O: "Osmile"、G: "Goofle Fit"、I: "IOS 健康"

```javascript
{
    "httpCode": 200,
    "result": {
        "data": [
            {
                "exerciseTime": 1583991833330,
                "stepValue": 100,
                "sportValue": 100,
                "disValue": 100.111,
                "calValue": 100.222,
                "sourceType": "G"
            },
            {
                "exerciseTime": 1583992133330,
                "stepValue": 200,
                "sportValue": 200,
                "disValue": 200.333,
                "calValue": 200.444,
                "sourceType": "G"
            }
        ]
    }
}
```


## 查詢30分鐘健康紀錄
```url
POST /sport/halfHour/list
```

### Requests-查詢30分鐘健康紀錄
  欄位 | 型態  | 預設 | 說明  
---|---|---|---
 page | number | 1 | 當前頁數
 pageSize | number | 10 | 每頁結果數量，-1 為顯示所有
 sort | string | startTime | 排序欄位
 startAt | number |  | 從(startTime)
 endAt | number |  | 結束(startTime)
 householdMemberId | string | | 如果沒有給就依照token解出來的householdMemberId  

```javascript
{
    "query": {
        "startAt": 1583991833330,
        "endAt": 1583991933330
    },
    "pagination": {
        "current": 1,
        "pageSize":-1
    },
    "sorter": {
        "field": "exerciseTime",
        "order": "asc"
    }
}
```

### Response-查詢30分鐘健康紀錄
 欄位 | 型態 | 說明 
 ---  | --- | ---
 exerciseTime | timestamp | 運動時間
 stepValue | int | 步數
 sportValue | int | 運動時間(秒)
 disValue | double | 距離(km)
 calValue | double | 卡路里(卡)
 sourceType | string | O: "Osmile"、G: "Goofle Fit"、I: "IOS 健康"

```javascript
{
    "httpCode": 200,
    "result": {
        "data": [
             {
                "exerciseTime": 1584020633330,
                "stepValue": 100,
                "sportValue": 100,
                "disValue": 100.111,
                "calValue": 100.222,
                "sourceType": "O"
             }
        ],
        "total": 2
    }
}
```


### 查詢30分鐘健康紀錄區間內平均結果

```url
POST /sport/halfHour/avg
```

### Request-查詢30分鐘健康紀錄區間內平均結果
  欄位 | 型態  | 預設 | 說明  
---|---|---|---
 startAt | number |  | 從(startTime)
 endAt | number |  | 結束(startTime)
 householdMemberId | string | | 如果沒有給就依照token解出來的householdMemberId 

```javascript
{
    "query": {
        "endAt": 1613059200000,
        "householdMemberId": "de4e7194-29c9-488a-855c-d054f26ed3e1",
        "startAt": 1612454400000
    }
}
```

### Response-查詢30分鐘健康紀錄區間內平均結果
 欄位 | 型態 | 說明 
 ---  | --- | ---
 stepValue | int | 步數
 sportValue | int | 運動時間(秒)
 disValue | double | 距離(km)
 calValue | double | 卡路里(卡)

```javascript
{
    "httpCode": 200,
    "result": {
        "data": {
            "stepValue": 14,
            "sportValue": 349,
            "disValue": 0,
            "calValue": 1
        }
    }
}
```


## 新增每日總步數紀錄(DailySteps)
```url
POST /user/daily-steps/add
```

* 只記錄每日總步數

### Request-新增每日總步數紀錄(DailySteps)

 欄位 | 型態  | 必填 | 預設 | 說明
 ---|---|---|---|---
 list | json array | Y | | 總步數記錄json array, 日期不可重覆

#### Request-新增每日總步數紀錄(DailySteps)-list(json object) 
 欄位 | 型態  | 必填 | 預設 | 說明
 ---|---|---|---|---
 stepDate | string | Y | | 記錄步數日期, 格式: YYYY-MM-DD
 steps | int | Y | | 總步數, 需 >= 0
 sourceType | string | Y | | 資料來源裝置(O:Osmile/G:Google Fit/I:IOS健康)

```javascript
{
   "list":[
       {
            "stepDate": "2022-04-24",
            "steps": 5000,
            "sourceType": "G"
       }, 
       {
            "stepDate": "2022-04-25",
            "steps": 4800,
            "sourceType": "G"
       }, 
       {
            "stepDate": "2022-04-26",
            "steps": 6600,
            "sourceType": "G"
       }
   ]
}
```

### Response-新增每日總步數紀錄(DailySteps)
欄位 | 型態 | 說明 
 ---  | --- | ---
 count | int | 新增/更新 筆數

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


## 查詢每日總步數紀錄(DailySteps)

```url
POST /user/daily-steps/list
```

### Request-查詢每日總步數紀錄(DailySteps)
#### Request-查詢每日總步數紀錄(DailySteps)-query(查詢條件json)
 欄位 | 型態  | 必填 | 預設 | 說明
 ---|---|---|---|---
 startDate | string | N | | 查詢起日, 格式 YYYY-MM-DD
 endDate | string | N | | 查詢迄日, 格式 YYYY-MM-DD
 
#### Request-查詢每日總步數紀錄(DailySteps)-pagination(分頁json)
 欄位 | 型態  | 必填 | 預設 | 說明
 ---|---|---|---|---
 current | int | | 1 | 當前頁數 
 pageSize | int | | 10 | 每頁結果數量，-1 為顯示所有
 
#### Request-查詢每日總步數紀錄(DailySteps)-sorter(排序json)
 欄位 | 型態  | 必填 | 預設 | 說明
 ---|---|---|---|--- 
 field | string | | stepDate | 排序欄位,可排序欄位有 stepDate, steps
 order | string | | asc | 升序或降序

```javascript
{
    "query": {
        "startDate": "2022-01-13",
        "endDate": "2022-01-15"
    } ,
    "pagination": {
        "current": 1,
        "pageSize": 10
    }, 
    "sorter": {
        "field": "stepDate",
        "order": "asc"
    }
}
```

### Response-查詢每日總步數紀錄(DailySteps)
 欄位 | 型態 | 說明 
 ---  | --- | ---
 id | string | 記錄id 
 householdMemberId | string | householdMemberId
 stepDate | string | 步數日期, 格式 YYYY-MM-DD
 steps | int | 步數
 sourceType | string | 資料來源裝置(O:Osmile/G:Google Fit/I:IOS健康)
 
```javascript
{
    "httpCode": 200,
    "result": {
        "data": [
            {
                "id": "7d506987-c7d0-44a8-a373-0c6d7280f0dc",
                "householdMemberId": "8a9e980a-c612-4f87-af07-a97a5f0fbed5",
                "stepDate": "2022-01-13",
                "steps": 7890,
                "sourceType": "G"
            },
            {
                "id": "85ce6c44-79f7-4641-8f88-206c8b7c4b5b",
                "householdMemberId": "8a9e980a-c612-4f87-af07-a97a5f0fbed5",
                "stepDate": "2022-01-14",
                "steps": 7890,
                "sourceType": "G"
            },
            {
                "id": "133633f4-d0f3-47eb-bcd9-cc5069ca4bb6",
                "householdMemberId": "8a9e980a-c612-4f87-af07-a97a5f0fbed5",
                "stepDate": "2022-01-15",
                "steps": 7890,
                "sourceType": "G"
            }
        ],
        "pagination": {
            "current": 1,
            "pageSize": 10,
            "total": 3
        },
        "sorter": {
            "field": "stepDate",
            "order": "asc"
        },
        "total": 3
    }
}
```

