---
# System prepended metadata

title: 比賽系統SP

---

# 比賽系統SP

# 定時賽/人滿即開賽 狀態變化
定時賽有
1. 未報名 -> 報名,	SP:Join(0: 報名), Status : 0(已報名)
2. 報名 -> 入座,    SP:Join(1:入座), Status : 1(入座)
3. 入座 -> 報名 (離開準備房間), SP:quit(3:離開入座), Status: 0(已報名)
4. 入座 -> 未報名, SP:quit(1:直接退款), 刪除MatchPlayerRecord資料
5. 報名 -> 未報名, SP:quit(1:直接退款), 刪除MatchPlayerRecord資料
5. 入座/報名 -> 未報名, SP:quit(0:不退款), 刪除MatchPlayerRecord資料

人滿即開
1. 未報名 -> 入座, SP:Join, Status : 1(入座)
2. 入座 -> 未報名, SP:quit(1:直接退款), 刪除MatchPlayerRecord資料
3. 入座 -> 未報名, SP:quit(0:不退款), 刪除MatchPlayerRecord資料

# 玩家報名比賽 - 定時賽專用

1. 根據報名費扣款
2. 寫入一筆玩家紀錄(MatchPlayerRecord)

## SP_JoinMatch

- 資料庫: `RYContestDB`

### 輸入參數

| 參數      | 型別    | 必填 | 註解                            |
|:--------- |:------- | ---- |:------------------------------- |
| @UserID   | INTEGER | Y    | 玩家ID                          |
| @MatchID  | BIGINT  | Y    | 比賽ID                          |
| @JoinType | TINYINT | Y    | 0: 報名, 1:入座                 |
| @IsRobot  | BIT     | N    | 是否為機器人, 預設0, 0:否, 1:是 |


### 輸出參數

| 參數                 | 型別          | 註解                                                                           |
|:-------------------- |:------------- |:------------------------------------------------------------------------------ |
| @OutputResultMessage | NVARCHAR(255) | 執行結果訊息                                                                   |
| @OutputMatchStatus   | TINYINT       | 比賽狀態, 1:等待中, 2:預告中, 3:報名中, 4:準備中, 5:進行中, 6:已完成, 7:已停用 |


---

# 玩家報名比賽 - 人滿即開用

## SP_JoinFullStartMatch

- 資料庫: `RYContestDB`

### 輸入參數

| 參數      | 型別    | 必填 | 註解                            |
|:--------- |:------- | ---- |:------------------------------- |
| @UserID   | INTEGER | Y    | 玩家ID                          |
| @MatchID  | BIGINT  | Y    | 比賽ID                          |
| @IsRobot  | BIT     | N    | 是否為機器人, 預設0, 0:否, 1:是 |


### 輸出參數

| 參數                 | 型別          | 註解                                                                           |
|:-------------------- | ------------- |:------------------------------------------------------------------------------ |
| @OutputResultMessage | NVARCHAR(255) | 執行結果訊息                                                                   |
| @OutputMatchStatus   | TINYINT       | 比賽狀態, 1:等待中, 2:預告中, 3:報名中, 4:準備中, 5:進行中, 6:已完成, 7:已停用 |
| @OutputMatchID       | BIGINT        | 加入的比賽ID                                                                   |

---

# 玩家報名比賽, 分配版本 - 人滿即開用

## SP_RandomJoinFullstartMatch

- 資料庫: `RYContestDB`
- 分配方式 : 人少優先, 相同人數時隨機
### 輸入參數

| 參數                    | 型別    | 必填 | 註解                            |
|:----------------------- |:------- | ---- |:------------------------------- |
| @UserID                 | INTEGER | Y    | 玩家ID                          |
| @RegisterFeeTokenTypeID | TINYINT | Y    | 門票類型                        |
| @IsRobot                | BIT     | N    | 是否為機器人, 預設0, 0:否, 1:是 |


### 輸出參數

| 參數                 | 型別          | 註解                                                                           |
|:-------------------- | ------------- |:------------------------------------------------------------------------------ |
| @OutputResultMessage | NVARCHAR(255) | 執行結果訊息                                                                   |
| @OutputMatchStatus   | TINYINT       | 比賽狀態, 1:等待中, 2:預告中, 3:報名中, 4:準備中, 5:進行中, 6:已完成, 7:已停用 |
| @OutputMatchID       | BIGINT        | 加入的比賽ID                                                                   |

---

# 玩家退出比賽

1. 根據輸入參數決定是否退款
   (比賽中自行離開 : 不退款,
    開賽前申請退出比賽 : 退款,
    開賽前, 準備時間結束後, 沒有進入準備房間 : 寄信退款)
2. 參賽紀錄(MatchPlayerRecord)更改退款資訊
3. 新增必須判斷 人滿即開-併行/非併行的例外處理

## SP_QuitMatch

- 資料庫: `RYContestDB`

### 輸入參數

| 參數          | 型別    | 必填 | 註解                                         |
|:------------- |:------- |:---- |:-------------------------------------------- |
| @UserID       | INTEGER | Y    | 玩家ID                                       |
| @MatchID      | BIGINT  | Y    | 比賽ID                                       |
| @RefundTypeID | TINYINT | Y    | 0:不退款, 1:直接退款, 2:寄信退款, 3:離開入座 |

### 輸出參數

| 參數                 | 型別          | 註解                                                                           |
|:-------------------- |:------------- |:------------------------------------------------------------------------------ |
| @OutputResultMessage | NVARCHAR(255) | 執行結果訊息                                                                   |
| @OutputMatchStatus   | TINYINT       | 比賽狀態, 1:等待中, 2:預告中, 3:報名中, 4:準備中, 5:進行中, 6:已完成, 7:已停用 |

---

# 玩家比賽復活處裡

1. 根據輪次紀錄(MatchRoundSetting)決定是否能復活, 復活費用
2. 寫入一筆復活紀錄(MatchPlayerReviveRecord)

## SP_MatchRevive

- 資料庫: `RYContestDB`

### 輸入參數

| 參數             | 型別    | 必填 | 註解                                     |
|:---------------- |:------- |:---- |:---------------------------------------- |
| @UserID          | INTEGER | Y    | 玩家ID                                   |
| @MatchID         | BIGINT  | Y    | 比賽ID                                   |
| @RoundID         | BIGINT  | Y    | 輪次ID                                   |
| @RevivePayTypeID | TINYINT | Y    | 玩家選擇用哪種資源復活, 1:金幣, 2: Token |

### 輸出參數

| 參數                 | 型別          | 註解         |
| -------------------- |:------------- | ------------ |
| @OutputResultMessage | NVARCHAR(255) | 執行結果訊息 |

---

# 比賽獎勵發放

1. SP : "更新比賽玩家紀錄" -> 更新所有玩家紀錄的最終排名, 接著呼叫
   SP : "比賽發放獎勵" -> 一次發放該比賽所有獎勵

---


# 比賽發放獎勵

1. 根據玩家排名與獎勵配置(MatchRewardSetting)發放獎勵
2. 更新玩家比賽紀錄(MatchPlayerRecord)
3. 發放完獎勵後更新 比賽資訊(Match)內的統計資料
4. 要先檢查該玩家是否已經領取過獎勵了(PlayerRecord.RewardCoin/Status)

## SP_MatchReward

- 資料庫: `RYContestDB`

### 輸入參數

| 參數     | 型別   | 必填 | 註解   |
|:-------- |:------ |:---- |:------ |
| @MatchID | BIGINT | Y    | 比賽ID |

### 輸出參數

| 參數                 | 型別          | 註解         |
| -------------------- |:------------- | ------------ |
| @OutputResultMessage | NVARCHAR(255) | 執行結果訊息 |


---


# 比賽個別發放獎勵

1. 根據玩家排名與獎勵配置(MatchRewardSetting)發放獎勵
2. 更新玩家比賽紀錄(MatchPlayerRecord)
3. 發放完獎勵後更新 比賽資訊(Match)內的統計資料
4. 要先檢查該玩家是否已經領取過獎勵了(PlayerRecord.RewardCoin/Status)

## SP_MatchRewardIndividual

- 資料庫: `RYContestDB`

### 輸入參數

| 參數     | 型別    | 必填 | 註解     |
|:-------- |:------- |:---- |:-------- |
| @MatchID | BIGINT  | Y    | 比賽ID   |
| @UserID  | INTEGER | Y    | 玩家ID   |
| @Rank    | INTEGER | Y    | 玩家排名 |

### 輸出參數

| 參數                 | 型別          | 註解         |
| -------------------- |:------------- | ------------ |
| @OutputResultMessage | NVARCHAR(255) | 執行結果訊息 |



---

# 更新比賽玩家資料

1. 比賽結束後, 整理每位玩家的排名, 並呼叫這支sp更新玩家最終排名
2. (需討論確認) PlayerInfo 可以帶入比賽中資訊, 並進行更新

## SP_UpdateMatchPlayerRecord

- 資料庫: `RYContestDB`

### 輸入參數

| 參數             | 型別          | 必填 | 註解               |
|:---------------- |:------------- |:---- |:------------------ |
| @MatchID         | BIGINT        | Y    | 比賽ID             |
| @PlayerInfo      | NVARCHAR(Max) | Y    | 玩家比賽資料, json |

```
@PlayerInfo
[
   {
     "UserID":10010,
     "Rank":1,            --> 最終排名, 比賽結束後的整體最終排名
   },
   {
     "UserID":10011,
     "Rank":1,            --> 最終排名, 比賽結束後的整體最終排名
   }
]

```

### 輸出參數

| 參數                 | 型別          | 註解         |
| -------------------- |:------------- |:------------ |
| @OutputResultMessage | NVARCHAR(255) | 執行結果訊息 |

---

# 更新輪次紀錄

1. 每輪結束後, 呼叫這支sp做個紀錄

## SP_UpdateMatchRoundRecord

- 資料庫: `RYContestDB`

### 輸入參數

| 參數            | 型別          | 必填 | 註解                         |
|:--------------- |:------------- |:---- |:---------------------------- |
| @MatchID        | BIGINT        | Y    | 比賽ID                       |
| @MatchRound     | INTEGER       | Y    | 輪次, 目前第幾輪             |
| @TotalPlayer    | INTEGER       | Y    | 本輪參賽總人數               |
| @TotalPromotion | INTEGER       | Y    | 本輪晉級人數(不包含復活晉級) |
| @TotalRevive    | INTEGER       | Y    | 本輪復活人數                 |
| @StartedAt      | DATETIME      | Y    | 本輪開始時間                 |
| @EndedAt        | DATETIME      | Y    | 本輪結束時間                 |


### 輸出參數

| 參數                 | 型別          | 註解         |
| -------------------- |:------------- | ------------ |
| @OutputResultMessage | NVARCHAR(255) | 執行結果訊息 |


---

# 更新輪次桌紀錄

1. 每局結束後, 呼叫這支sp做個紀錄
2. 記得同時去更新 MatchPlayerRecord 內的 目前輪數, 局數, 桌排名

## SP_UpdateMatchRoundTableRecord

- 資料庫: `RYContestDB`

### 輸入參數

| 參數             | 型別          | 必填 | 註解               |
|:---------------- |:------------- |:---- |:------------------ |
| @MatchID         | BIGINT        | Y    | 比賽ID             |
| @MatchRound      | INTEGER       | Y    | 輪次, 目前第幾輪   |
| @MatchRoundTable | INTEGER       | Y    | 局數, 目前第幾局   |
| @RoundTableInfo  | NVARCHAR(Max) | Y    | 玩家比賽資料, json |

```
@RoundInfo
[
    {
      "UserID": 10010,                    --> 玩家ID
      "TableID": 1,                       --> 桌子號
      "ChairID": 2,                       --> 椅子號
      "IsRobot": 0,                       --> 是否為機器人 0:否, 1:是
      "BetScore": 100,                    --> 下注分
      "WinScore": 100,                    --> 贏分
      "Rank": 3,                          --> 最終桌排名
      "StartedAt":"2024-07-25 00:00:00",  --> 本局開始時間
      "EndedAt": "2024-07-25 01:00:00",   --> 本局結束時間      
    }
]


```

### 輸出參數

| 參數                 | 型別          | 註解         |
| -------------------- |:------------- | ------------ |
| @OutputResultMessage | NVARCHAR(255) | 執行結果訊息 |

---

# 玩家復活取消

## SP_MatchReviveCancel

- 資料庫: `RYContestDB`

### 輸入參數

| 參數        | 型別    | 必填 | 註解             |
|:----------- |:------- | ---- |:---------------- |
| @MatchID    | BIGINT  | Y    | 比賽ID           |
| @MatchRound | INTEGER | Y    | 要取消復活的輪次 |
| @UserID     | INTEGER | Y    | 玩家ID           |



### 輸出參數

| 參數                 | 型別          | 註解         |
|:-------------------- | ------------- |:------------ |
| @OutputResultMessage | NVARCHAR(255) | 執行結果訊息 |


---

# 新增機器人帳號

- 新增AccountDB.AccountsInfo
- 新增RecordDB.GameScoreInfo
- 新增ContestDB.MatchRobot

## SP_AddRobotAccounts

- 資料庫: `RYContestDB`

### 輸入參數

| 參數      | 型別    | 必填 | 註解       |
|:--------- |:------- |:---- |:---------- |
| @RobotNum | INTEGER | Y    | 機器人數量 |

### 輸出參數

| 參數                 | 型別          | 註解         |
| -------------------- |:------------- | ------------ |
| @OutputResultMessage | NVARCHAR(255) | 執行結果訊息 |

---

# 機器人參加比賽
- 還要檢查該比賽是否處於可報名的狀態
- 可指定數量
- 會有一個Table紀錄機器人資訊及狀態
- 先從機器人的Table中拿出空閒的機器人
- 空閒的不夠就呼叫 SP_AddRobotAccounts 新增
- 將空閒的機器人加入比賽
- 更新機器人Table的狀態

## SP_RobotJoinMatch

- 資料庫: `RYContestDB`

### 輸入參數

| 參數      | 型別    | 必填 | 註解       |
|:--------- |:------- |:---- |:---------- |
| @MatchID  | BIGINT  | Y    | 比賽ID     |
| @RobotNum | INTEGER | Y    | 機器人數量 |

### 輸出參數

| 參數                 | 型別           | 註解               |
|:-------------------- |:-------------- |:------------------ |
| @OutputResultMessage | NVARCHAR(255)  | 執行結果訊息       |

---

# 機器人比賽入座

## SP_RobotTakeSeatMatch

- 資料庫: `RYContestDB`

### 輸入參數

| 參數      | 型別    | 必填 | 註解                                            |
|:--------- |:------- |:---- |:----------------------------------------------- |
| @MatchID  | BIGINT  | Y    | 比賽ID                                          |
| @RobotNum | INTEGER | Y    | 機器人數量, RobotNum = 0 時, 代表全部機器人入座 |

### 輸出參數

| 參數                 | 型別          | 註解         |
| -------------------- |:------------- | ------------ |
| @OutputResultMessage | NVARCHAR(255) | 執行結果訊息 |

---

# 機器人退出比賽 

- 還要檢查該比賽是否在比賽中
- 會有一個Table紀錄機器人資訊及狀態
- 先從機器人的Table中拿出參與該比賽的機器人
- 修改機器人的PlayerRecord Status
- 修改機器人的Table中參與該比賽的機器人狀態


## SP_RobotQuitMatch

- 資料庫: `RYContestDB`

### 輸入參數

| 參數      | 型別    | 必填 | 註解                                                   |
|:--------- |:------- |:---- |:------------------------------------------------------ |
| @MatchID  | BIGINT  | Y    | 比賽ID                                                 |
| @RobotNum | INTEGER | Y    | 機器人數量, RobotNum = 0時, 代表該場比賽全部機器人離開 |

### 輸出參數

| 參數                 | 型別           | 註解               |
| -------------------- |:-------------- | ------------------ |
| @OutputResultMessage | NVARCHAR(255)  | 執行結果訊息       |



---
# 人滿即開輪替
## SP_RotateFullStartMatch

1. 呼叫這支sp的時間點 
    1. 比賽開賽時, 
    2. 比賽結束時
2. 傳入的MatchID為 "現在場" 的 MatchID, 即MatchModeID=2的那筆

- 資料庫: `RYContestDB`

### 輸入參數

| 參數     | 型別   | 必填 | 註解   |
|:-------- |:------ |:---- |:------ |
| @MatchID | BIGINT | Y    | 比賽ID |

---

# 領取信件物品

## SP_ClaimUserItem

- 資料庫: `RYTreasureDB`

### 輸入參數

| 參數        | 型別    | 必填 | 註解                             |
|:----------- |:------- | ---- |:-------------------------------- |
| @UserID     | INTEGER | Y    | 玩家ID                           |
| @UserItemID | BIGINT  | Y    | 領取物品ID                       |
| @IsCliamAll | BIT     | N    | 預設為0，1為領取該玩家ID全部物品 |



### 輸出參數

| 參數                  | 型別          | 註解                 |
|:--------------------- |:------------- |:-------------------- |
| @OutputResultMessage  | NVARCHAR(255) | 執行結果訊息         |
| @OutputClaimedContent | NVARCHAR(Max) | 領取的物品內容(總計) |

@OutputClaimedContent 範例
```
[{"tokenTypeId":1,"value":12},{"tokenTypeId":3,"value":6},{"tokenTypeId":99,"value":1012000}]

```

---


