feat(zy): 实现比赛报名和自动分组功能

- 新增比赛报名逻辑,支持单双打和团队赛
- 实现自动分组算法,根据比赛规则生成对阵表
- 添加下一轮对阵安排功能,支持淘汰赛制
- 优化比赛结果处理,自动计算排名和得分
- 新增参赛人员列表接口,支持多种查询条件
This commit is contained in:
2025-05-30 16:29:57 +08:00
parent 6e655c6121
commit be7ee40690
8 changed files with 328 additions and 135 deletions

View File

@@ -1,6 +1,8 @@
<?php
namespace format;
use app\admin\model\zy\game\Game;
/*
赛制文件
@@ -17,12 +19,128 @@ interface GameInterface
// 赛制说明
public function describe(): string;
// 首轮对阵安排
public function match($game, $users): array;
// 下一轮对阵安排
public function next($game, $math): array;
/**首轮对阵安排
*
入参:
$game = Array
(
[id] => 1 //比赛id
[pid] => 0 //主比赛id
[act_id] => 1 //活动id
[gym_id] => 1 //球馆id
[club_id] => 4 //俱乐部id
[name] => 聚点第八届年终团体赛 //比赛名称
[team_type] => 1 //团队类型1双打2单打3团队
[rule_type] => 7 //规则类型1八人转2超八转3混双转4固搭转5固定擂6活动擂7转转8分区转9擂台赛10守擂赛11追分赛12固搭追分赛13大循环群内赛14两队PK赛15战队淘汰赛16单项淘汰赛17分区循环淘汰赛
[date] => 2025-05-17 //比赛日期
[week] => 2 //周几
[start_time] => 09:00:00 //开始时间
[end_time] => 12:30:00 //结束时间
[public_time] => 2025-05-02 09:00:00 //公布时间
[join_start_time] => 2025-05-03 09:00:00 //报名开始时间
[join_end_time] => 2025-05-04 09:00:00 //报名结束时间
[quit_time] => 2025-05-04 08:00:00 //免费退坑时间
[game_time] => 3.5 //比赛时长
[address] => 泰新路88号 //地址
[field] => 22 //场地号
[position] => //位置
[cost] => {"type":"1","man":"84","woman":"56","extra":"10","server":"1"} //费用
[limit_num] => 30 //报名人数限制
[join_num] => 0 //已报名人数
[attention] => 0 //关注人数
[status] => 0 //状态,-1取消0未开始1报名中2进行中3已结束
[describe] => 活动介绍 //介绍
[img] => /assets/img/qrcode.png //图片
[game_rule] => 比赛规则 //规则
[is_public] => 1 //是否公开0否1是
[bring_num] => 2 //可带人数
[is_bring] => 1 //是否可带人0否1是
[referee] => 1,2 //裁判用户id
[create_time] => 2025-04-30 10:45:58
[update_time] => 2025-05-26 10:34:14
)
$users = Array(
[
[id] => 1 // 比赛参与id
[user_id] => 1 //用户id
[name] => Yam Lai Yan //昵称
[avatar] => /assets/img/qrcode.png //头像
[gender] => 0 //性别0女1男
[game_join_id] => 1 //报名记录id
[game_id] => 1 //比赛id
[team] => //本次比赛团队
[order] => 1 //本次比赛顺序
[rank] => 0 //本次比赛排名
[mark] => //备注
[status] => 1 //状态0候补1正常2退坑
[signin] => 0 //签到状态0未签到1已签到
[score] => 0 //得分
[net_score] => 0 //净得分
[win] => 0 //胜局
[create_time] => 2025-04 - 24 05: 35:00
[update_time] => 2025-05 - 26 15:08: 55
],
)
出参:
return $math = Array(
[
[gym_id] => 1 //球馆id
[club_id] => 4 //俱乐部id
[act_id] => 1 //活动id
[game_id] => 1 //比赛id
[level] => 1 //轮次
[turn] => 1 //场次
[teamA] => {"name":"team01","user":[{"user_id":1,"gender":0,"avatar":"\/assets\/img\/qrcode.png","name":"Yam Lai Yan"},{"user_id":2,"gender":1,"avatar":"\/assets\/img\/qrcode.png","name":"Yuen Wai San"}]} //队伍A
[teamB] => {"name":"team23","user":[{"user_id":3,"gender":0,"avatar":"xjgH6E5VkQ","name":"Mo Ming Sze"},{"user_id":4,"gender":1,"avatar":"hSuH5AZVxt","name":"Chan Ka Keung"}]} //队伍B
],
)
*/
public function match(Game $game, array $users): array;
/**下一轮对阵安排
*
入参:
$maths = Array(
[
[id] => 1
[gym_id] => 1
[club_id] => 4
[act_id] => 1
[game_id] => 1
[level] => 1
[turn] => 1
[teamA] => {"name":"team01","user":[{"user_id":1,"gender":0,"avatar":"\/assets\/img\/qrcode.png","name":"admin1"},{"user_id":2,"gender":1,"avatar":"\/assets\/img\/qrcode.png","name":"admin2"}]}
[teamB] => {"name":"team23","user":[{"user_id":3,"gender":0,"avatar":"\/assets\/img\/qrcode.png","name":"admin3"},{"user_id":4,"gender":1,"avatar":"\/assets\/img\/qrcode.png","name":"admin4"}]}
[round1] => {"addedA":"3","addedB":"0","scoreA":"15","scoreB":"24"}
[round2] => {"addedA":"3","addedB":"0","scoreA":"15","scoreB":"24"}
[round3] => {"addedA":"3","addedB":"0","scoreA":"15","scoreB":"24"}
[scoreA] => 0
[scoreB] => 3
[winner] => {"name":"team23","user":[{"user_id":3,"gender":0,"avatar":"\/assets\/img\/qrcode.png","name":"admin3"},{"user_id":4,"gender":1,"avatar":"\/assets\/img\/qrcode.png","name":"admin4"}]}
[create_time] => 2025-05-30 15:24:28
[update_time] => 2025-05-30 15:54:34
],
)
$level 设定为第几轮数
出参:
return $math = Array(
[
[gym_id] => 1 //球馆id
[club_id] => 4 //俱乐部id
[act_id] => 1 //活动id
[game_id] => 1 //比赛id
[level] => 1 //轮次
[turn] => 1 //场次
[teamA] => {"name":"team01","user":[{"user_id":1,"gender":0,"avatar":"\/assets\/img\/qrcode.png","name":"Yam Lai Yan"},{"user_id":2,"gender":1,"avatar":"\/assets\/img\/qrcode.png","name":"Yuen Wai San"}]} //队伍A
[teamB] => {"name":"team23","user":[{"user_id":3,"gender":0,"avatar":"xjgH6E5VkQ","name":"Mo Ming Sze"},{"user_id":4,"gender":1,"avatar":"hSuH5AZVxt","name":"Chan Ka Keung"}]} //队伍B
],
)
如return $math 为空则比赛结束
*/
public function nextLevel(Game $game, array $maths, int $level): array;
// 奖金分配
public function prize($rank): array;
public function prize(array $rank): array;
}