# 序號交換
## 異動專案
- re-api
- re-admin
- 合作廠商序號管理
- 新增RE序號
- RE序號使用查看
- 新增合作廠商序號
- open-api-portal
- 查詢兌換紀錄
- 帳單查詢
- bill
- 兌換計費
- headquarter
## Table
- re
-
- re.finance_rcoin_account_history_type
```sql
INSERT INTO `re`.`finance_rcoin_account_history_type` (`id`, `name`, `code`, `date_created`)
VALUES (UUID(), '點數兌換轉出', 'point_exchange_rcoin_send_out', now());
```
- headquarter
- headquarter_point_exchange_provider
- headquarter_id
- point_exchange_provider_id
- date_created
- date_updated
- point_exchange
- provider
- id
- name
- enabled_exchange_out
- enabled_exchange_in
- date_created
- date_updated
- exchange_type
- id
- 'issue-serial-number' 序號
- 'api-realtime'
- name
- '序號兌換'
- 'API 即時兌換'
- provider_activity `合作廠商的活動`
- id
- name
- provider_id
- date_start
- date_end
- date_created
- date_updated
- provider_product `合作廠商的兌換商品`
- id
- name
- exchange_type_id
- 'issue-serial-number'
- 'api-realtime'
- direction (in / out)
- in
- out
- exchange_rate
- exchange_platform `兌換平台`
- re
- provider
- is_static_exchange
- rcoin
- rcoin_currency_code
- provider_points
- date_created
- date_updated
- provider_activity_product `合作廠商活動下的商品`
- id
- provider_activity_id
- provider_product_id
- date_created
- date_updated
- provider_assigned_serial_number `合作廠商配發的RE序號`
- id
- provider_activity_id
- provider_id
- publish_record_id
- date_created
- date_updated
- provider_issue_serial_number `合作廠商發行的折價券`
- id
- provider_activity_product_id
- provider_activity_id
- provider_product_id
- provider_id
- sno
- amount
- date_start
- date_end
- date_issued
- is_issued
- date_used
- issued_re_member_id
- is_used
- date_created
- date_updated
## Action
#### 取得sno兌換紀錄
- action `re-sno.getSnoRecipientHistory`
- paramSample:
```json
{"id": "b43e3ca4-52f1-4e5c-8273-da1e91b6018b"}
```
- response:
```json
{
"id": "b43e3ca4-52f1-4e5c-8273-da1e91b6018b",
"snoId": "test",
"recipientId": "69bb28a0-4835-11e8-b039-497fe912643e",
"recipientType": 1, //
"isRewardDispatched": 1,
"isLimit": 0,
"limitationType": 0,
"dateCreated": "2020-05-07T08:44:02.000Z",
"reSno": {
"id": "test",
"code": "test123",
"codeType": 3,
"dateCreated": "2019-08-01T08:27:46.000Z",
"dateUpdated": "2019-08-01T08:27:56.000Z",
"profile": {
"snoId": "test",
"aliasId": "test-alias",
"publishAmount": 1000,
"datePublished": "2019-08-01T02:30:35.000Z",
"publishRecordId": null,
"dateCreated": "2019-08-01T02:30:35.000Z",
"dateUpdated": "2019-10-18T08:10:54.000Z"
}
}
}
```
```javascript=
export enum ReSnoAmountLimitationType {
EveryDay = 1,
TimeLimitation = 2,
NoLimitation = 3,
}
export enum ReSnoRecipientType {
ReMember = 1,
StoreId = 2,
AffiliateId = 3,
}
/** 命名規則 */
export enum ReSnoCodeType {
/** 含有日期 */
DateTime = 1,
/** 隨機 */
Random = 2,
/** 流水號碼 */
SerialNumber = 3,
}
export enum ReSnoFrequencyLimitationType {
EveryDay = 1,
TimeLimitation = 2,
NoLimitation = 3,
}
```
#### 以code取得sno
- action: getReSnoByCodeAndAlias
- paramSample
```json
{
"code":"rPiMOJHYEs"
}
```
- responseSample
```jsonld=
{
"id": "163ddfa8-0443-4972-9178-e098538e3c0f",
"code": "rPiMOJHYEs",
"codeType": 3,
"dateCreated": "2020-03-10T06:29:53.000Z",
"dateUpdated": "2020-03-10T06:29:53.000Z",
"profile": {
"snoId": "163ddfa8-0443-4972-9178-e098538e3c0f",
"aliasId": "281e86f4-c557-4d8c-836a-65fd603c607a",
"publishAmount": 1,
"datePublished": "2020-03-10T06:29:53.000Z",
"publishRecordId": null,
"dateCreated": "2020-03-10T06:29:53.000Z",
"dateUpdated": "2020-03-10T06:29:53.000Z",
"alias": {
"id": "281e86f4-c557-4d8c-836a-65fd603c607a",
"name": "RND20200310",
"dateCreated": "2020-03-10T06:29:53.000Z",
"dateUpdated": "2020-03-10T06:29:53.000Z"
}
},
"status": {
"snoId": "163ddfa8-0443-4972-9178-e098538e3c0f",
"snoLimitationId": "0cf4ce20-c3a6-48f0-8dd0-66f37654041c",
"amount": 1,
"enabled": true,
"isOut": 0,
"dateCreated": "2020-03-10T06:29:53.000Z",
"dateUpdated": "2020-03-10T06:29:53.000Z",
"limitation": {
"id": "0cf4ce20-c3a6-48f0-8dd0-66f37654041c",
"dateCreated": "2020-03-10T06:29:53.000Z",
"dateUpdated": "2020-03-10T06:29:53.000Z",
"frequencyLimitation": {
"snoLimitationId": "0cf4ce20-c3a6-48f0-8dd0-66f37654041c",
"type": 2,
"frequency": 1,
"dateCreated": "2020-03-10T06:29:53.000Z",
"dateUpdated": "2020-03-10T06:29:53.000Z"
},
"timeLimitation": {
"snoLimitationId": "0cf4ce20-c3a6-48f0-8dd0-66f37654041c",
"dateStart": "2020-03-10T06:29:53.000Z",
"dateEnd": null,
"isAlways": true,
"dateCreated": "2020-03-10T06:29:53.000Z",
"dateUpdated": "2020-03-10T06:29:53.000Z"
},
"amountLimitation": {
"snoLimitationId": "0cf4ce20-c3a6-48f0-8dd0-66f37654041c",
"type": 3,
"amount": 1,
"dateCreated": "2020-03-10T06:29:53.000Z",
"dateUpdated": "2020-03-10T06:29:53.000Z"
}
}
},
"rewards": [
{
"id": "d603318b-241d-4f42-8b00-8e036e08aadf",
"type": 1,
"rcoin": 5,
"currency": "TWD",
"dateCreated": "2020-03-10T06:29:52.000Z",
"dateUpdated": "2020-03-10T06:29:52.000Z"
}
]
}
```
#### 以code取得sno
- action: checkCodeAvailable
- paramSample
```
{
"code":"rPiMOJHYEs"
}
```
- response
```json
{
"isExist": true, // code 是否存在
"isAmountEnough": true, // 數量是否足夠
"isDateAvailable": true, // 時間是否通過驗證
"reSno": {{同getReSno Response}}
}
```
#### 批次建立sno
- action `re-sno.publishMultipleReSno`
- paramSample
```json
{
"codeList": [],
"codeAmount": 2,
"totalPublishAmount": 10,
"publishAmount": 1,
"datePublish": "2020-05-07 17:12:00",
"isAutoGenerate": true, //是否自動產生
"codeType": 1,
"alias": {
"name": "0507測試多組",
"languages": []
},
"timeLimit": {
"dateStart": "2020-05-27 10:42:00",
"dateEnd": null,
"isAlways": true
},
"frequencyLimit": {
"type": 2,
"frequency": 1
},
"amountLimit": {
"type": 2,
"amount": 1
},
"reward": {
"type": 1,
"currency": "TWD",
"rcoin": 100
}
}
```
- response
```json
{
"codes": [
"NEgoxL03fH",
"r5rB9tMdHA"
],
"publishRecordId": "242453f6-c77f-426d-8585-cd3d7dc28cf0"
}
```
#### 批次建立sno
- action `re-sno.getSnoListByParameter`
- paramSample
```json
{
"publishRecordId": "test-alias",
"page":{
"index":1,
"size":100
}
}
```
- response
```json
{
"items": [
{
"id": "test",
"code": "test123",
"codeType": 3,
"dateCreated": "2019-08-01T08:27:46.000Z",
"dateUpdated": "2019-08-01T08:27:56.000Z",
"profile": {
"snoId": "test",
"aliasId": "test-alias",
"publishAmount": 1000,
"datePublished": "2019-08-01T02:30:35.000Z",
"publishRecordId": "test-alias",
"dateCreated": "2019-08-01T02:30:35.000Z",
"dateUpdated": "2020-05-11T08:55:17.000Z"
},
"status": {
"snoId": "test",
"snoLimitationId": "test-limit",
"amount": 913,
"enabled": true,
"isOut": 0,
"dateCreated": "2019-08-01T02:30:56.000Z",
"dateUpdated": "2020-05-07T08:44:02.000Z"
},
"snoRecipientHistory": { // 若未領取則為 null
"id": "0103b0af-bc2e-4dc4-881b-d45d341f3e1e",
"snoId": "test",
"recipientId": "6dcf8d40-4fd0-11e7-8b7e-f1929b90c782",
"recipientType": 1,
"isRewardDispatched": true,
"isLimit": false,
"limitationType": 0,
"dateCreated": "2019-10-21T04:56:52.000Z"
}
}
],
"page": {
"pagesAmount": 1,
"dataAmount": 1
}
}
```
## Event
#### 已經建立sno兌換紀錄
- eventString `reSno.snoRecipientHistoryCreated`
- payload
```json
{"snoRecipientHistoryId":""}
```
## Vars
```sql
INSERT INTO `re`.`vars` (`id`, `name`, `description`, `key`, `meta_str_1`, `meta_str_2`, `meta_str_long`, `meta_int_1`, `meta_int_2`, `meta_float_1`, `meta_float_2`, `meta_boolean_1`, `meta_boolean_2`, `meta_date_1`, `meta_date_2`, `type`) VALUES (NULL, 'TW 是否要出現點數兌換功能', 'meta_boolean_1 = 是否出現在 RE APP 中', 're-cms-display-point-exchange-tw', '', '', ' ', '0', '0', '0', '0', '1', '0', '2020-06-01 15:40:00', '2020-06-01 15:40:00', 're');
INSERT INTO `re`.`vars` (`name`, `description`, `key`, `meta_str_1`, `meta_str_2`, `meta_str_long`, `meta_int_1`, `meta_int_2`, `meta_float_1`, `meta_float_2`, `meta_boolean_1`, `meta_boolean_2`, `meta_date_1`, `meta_date_2`, `type`) VALUES ('MY 是否要出現點數兌換功能', 'meta_boolean_1 = 是否出現在 RE APP 中', 're-cms-display-point-exchange-my', '', '', ' ', '0', '0', '0', '0', '0', '0', '2020-06-01 15:40:00', '2020-06-01 15:40:00', 're');
```
# 新增 provider 的順序
```sql
ALTER TABLE `point_exchange`.`provider`
ADD COLUMN `sort` INT NOT NULL DEFAULT 0 AFTER `enabled_exchange_in`;
```