---
# System prepended metadata

title: 夢⼯廠遊戲 - 單機遊戲序號兌換功能需求

---

# 夢⼯廠遊戲 - 單機遊戲序號兌換功能需求

## 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 時, 系統除了回復`已經兌換`, `已經到期`, 還會有其他可能的核對結果? 例如, `數量不足`
- `活動編號` 是流水號嗎? 還是由維護端填入?