6.0 KiB
6.0 KiB
赛程编排系统后端部署指南
📋 部署步骤
1. 数据库初始化
执行数据库表创建脚本:
mysql -u root -p martial_competition < database/martial-db/create_schedule_tables.sql
或者在MySQL客户端中直接执行 database/martial-db/create_schedule_tables.sql
2. 导入测试数据(可选)
如果需要测试编排功能,可以导入测试数据:
# 在前端项目的test-data目录下
mysql -u root -p martial_competition < test-data/create_100_team_participants.sql
这将创建:
- 100个集体项目队伍(500人)
- 5个集体项目类型
- 配合原有个人项目,总计1500人
3. 编译后端项目
cd martial-master
mvn clean package -DskipTests
4. 启动后端服务
java -jar target/martial-master.jar
5. 配置PowerJob定时任务
5.1 访问PowerJob控制台
默认地址: http://localhost:7700
5.2 创建定时任务
在PowerJob控制台中配置:
- 任务名称: 赛程自动编排
- 任务描述: 每10分钟自动编排未锁定的赛事
- 执行类型: BASIC
- 处理器:
org.springblade.job.processor.ScheduleAutoArrangeProcessor - Cron表达式:
0 */10 * * * ?(每10分钟执行一次) - 最大实例数: 1 (避免并发)
- 运行超时时间: 600000 (10分钟)
5.3 启动任务
在PowerJob控制台中启动该任务
🔧 API接口说明
1. 获取编排结果
GET /api/martial/schedule/result?competitionId={id}
响应示例:
{
"code": 200,
"success": true,
"data": {
"scheduleStatus": 1,
"lastAutoScheduleTime": "2025-12-08 10:00:00",
"totalGroups": 45,
"totalParticipants": 1500,
"scheduleGroups": [
{
"id": 1,
"groupName": "太极拳集体 成年组",
"projectType": 2,
"displayOrder": 1,
"totalParticipants": 10,
"totalTeams": 2,
"organizationGroups": [
{
"organization": "少林寺武校",
"participants": [
{"playerName": "张三"},
{"playerName": "李四"}
],
"scheduleDetails": [
{
"venueId": 1,
"venueName": "一号场地",
"scheduleDate": "2025-11-06",
"timeSlot": "08:30",
"timePeriod": "morning"
}
]
}
]
}
]
}
}
2. 保存并锁定编排
POST /api/martial/schedule/save-and-lock
Content-Type: application/json
{
"competitionId": 200
}
响应示例:
{
"code": 200,
"success": true,
"msg": "编排已保存并锁定"
}
3. 手动触发自动编排(测试用)
POST /api/martial/schedule/auto-arrange
Content-Type: application/json
{
"competitionId": 200
}
📊 数据库表说明
1. martial_schedule_group (编排分组表)
存储自动分组结果,包括集体项目和个人项目的分组信息。
2. martial_schedule_detail (编排明细表)
存储场地时间段分配结果,记录每个分组被分配到哪个场地和时间段。
3. martial_schedule_participant (参赛者关联表)
存储参赛者与编排的关联关系,记录每个参赛者的出场顺序。
4. martial_schedule_status (编排状态表)
存储每个赛事的编排状态:
- 0: 未编排
- 1: 编排中
- 2: 已保存锁定
🧪 测试流程
1. 准备测试数据
# 执行测试数据脚本
mysql -u root -p martial_competition < test-data/create_100_team_participants.sql
2. 手动触发编排
使用API测试工具(Postman/Apifox)调用:
POST http://localhost/api/martial/schedule/auto-arrange
Content-Type: application/json
{
"competitionId": 200
}
3. 查看编排结果
GET http://localhost/api/martial/schedule/result?competitionId=200
4. 前端测试
访问前端页面:
http://localhost:3000/martial/schedule?competitionId=200
应该能看到:
- 竞赛分组Tab: 按时间段显示分组
- 场地Tab: 按场地显示分组
- 集体项目按单位分组显示
- 个人项目直接列出参赛者
5. 保存并锁定
在前端页面点击"保存编排"按钮,或调用API:
POST http://localhost/api/martial/schedule/save-and-lock
Content-Type: application/json
{
"competitionId": 200
}
锁定后,定时任务将不再自动编排该赛事。
🔍 故障排查
问题1: 编排结果为空
原因:
- 赛事没有参赛者
- 赛事没有配置场地
- 赛事时间未设置
解决:
- 检查
martial_athlete表是否有该赛事的参赛者 - 检查
martial_venue表是否有该赛事的场地 - 检查
martial_competition表的competition_start_time和competition_end_time
问题2: 定时任务未执行
原因:
- PowerJob服务未启动
- 任务未启动
- Worker未连接
解决:
- 检查PowerJob控制台任务状态
- 查看Worker日志
- 确认Cron表达式正确
问题3: 场地容量不足
原因:
- 参赛人数过多
- 时间段容量不够
解决:
- 增加比赛天数
- 增加场地数量
- 调整时间段容量配置
📝 注意事项
-
定时任务执行频率: 默认每10分钟执行一次,可以根据需要调整Cron表达式
-
锁定机制: 一旦保存并锁定,定时任务将不再自动编排该赛事
-
容量检查: 编排算法会自动检查时间段容量,超出容量的分组会报警
-
项目类型:
- type=1: 个人项目
- type=2: 双人项目
- type=3: 集体项目
-
时间段容量:
- 上午(08:30-11:30): 150分钟
- 下午(13:30-17:30): 210分钟
🚀 性能优化建议
-
数据库索引: 已自动创建必要索引,无需额外优化
-
批量插入: Service层使用批量插入,提升性能
-
缓存: 可以考虑使用Redis缓存编排结果(可选)
-
并发控制: PowerJob任务设置最大实例数为1,避免并发冲突
版本: v1.0 创建时间: 2025-12-08 维护人: 开发团队