# 夢⼯廠遊戲 - 單機遊戲序號兌換功能需求
## Database
- **序號儲存表**
- *活動編號:為通用編號,代表平日正常活動*
- *活動開始日期*
- *活動結束日期*
- *活動權限*
- *0 => 不與其他活動搭配*
- *1 => 與其他活動搭配*
- *搭配活動編號: 輸入內容為其他活動編號的文字組合*
- *兌換產品編號: 顯⽰兌換的產品編號*
- *兌換產品內容: 顯⽰對應的兌換產品內容*
- **兌換用序號: 加密後的序號內容**
- **發出時間: 呼叫 web api 時間**
- **兌換時間: 符合活動資格且已被兌換時間**
- **是否已經兌換: 顯⽰是否已經被兌換**
- **是否已經過期: 顯⽰兌換時間是否超出活動時間**
- **活動儲存表**
- *活動編號*
- *活動開始日期*
- *活動結束日期*
- *活動權限*
- *0: 不與其他活動搭配*
- *1: 與其他活動搭配*
- *搭配活動編號: 輸入內容為其他活動編號的文字組合*
- *兌換產品編號: 輸入此產品的編號*
- *兌換產品名稱: 兌換活動的產品名稱*
- **全部數量: 全部可以被兌換的產品數量**
- **已兌換數量: 目前已經被兌換的產品數量**
### 序號儲存表
|活動<br>編號|活動<br>開始<br>日期|活動<br>結束<br>日期|活動<br>權限|搭配<br>活動<br>編號|==兌換用<br>序號==|發出<br>時間|兌換<br>時間|是否<br>已經<br>兌換|是否<br>已經<br>過期|兌換<br>產品<br>內容|兌換<br>產品<br>編號|
|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|
|-1|null|null|0|null|null|null|null|false|false|null|null|
### 活動儲存表
|活動<br>編號|活動<br>開始<br>日期|活動<br>結束<br>日期|活動<br>權限|搭配<br>活動<br>編號|兌換<br>產品<br>編號|兌換<br>產品<br>名稱|全部<br>數量|已兌換<br>數量|
|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|
|-1|null|null|0|null|-1|null|-1|-1|
## API
- 對遊戲端
- 產生`序號`:產生`活動`需要的兌換商品`序號`,此`序號`只能唯一;並將兌換商品`序號`儲存至 database
- 對兌換序號網⾴端
- 輸入`序號`:用戶將`序號`由網⾴輸入進⾏兌換,並與 database 溝通後,判斷`序號`是否過期或未兌換。如果未兌換`序號`則將更新資訊存到 database。最後將結果輸出至網⾴端
- 對後台
- `活動`輸入:維護端將`活動`內容輸入至 database,以提供`序號`比對相對應的`活動`內容
---
## Implementation
### system generate new serial no for player
- generate an unique `serial_no`, then insert one new row on `SerialNo` table, and the final respond the `serial_no`.
|||
|:-:|:-:|
|request<br>method|`post`|
|API|`/api/redeem`|
|body|`{}`|
|response|`serial_no`|
### player input the serial no for the redeem
- find the row on `SerialNo` table with `serial_no`
- not found => serial no is wrong
- found, then check if
- redeemed
- expired
- out of stock
|||
|:-:|:-|
|request<br>method|`get`|
|API|`/api/verify`|
|body|`{`<br>`serial_no`<br>`}`|
|response|`wrong_serialno/redeemed/expired/outofstock/success`|
### add more events
- create/modify/delete a event, according to the request method and the `event_no`
|||
|:-:|:-|
|request<br>method|`post/patch/delete`|
|API|`/event`|
|body|`{`<br>`[event_no]`<br>`event_start`<br>`event_end`<br>`event_auth`<br>`event_others`<br>`redeem_no`<br>`redeem_title`<br>`redeem_total_amount`<br>`redeemed_amount`<br>`}`|
|response|`execution status`|
## QnA
- ~~`活動儲存表`中的大部分欄位與`序號儲存表`對應? 是否能改以 foreign key 對應?~~
- `序號`是否有限制格式, 多少位數, 純數字, 純英文或數英混合?
- 呼叫產生`序號`的 API 時, 系統需要在`序號儲存表`新增一筆資料, 這筆資料中的`活動`相關資料要以誰為準?
- 呼叫核對`序號`的 API 時, 系統除了回復`已經兌換`, `已經到期`, 還會有其他可能的核對結果? 例如, `數量不足`
- `活動編號` 是流水號嗎? 還是由維護端填入?