306 lines
6.0 KiB
Markdown
306 lines
6.0 KiB
Markdown
# 赛程编排系统后端部署指南
|
|
|
|
## 📋 部署步骤
|
|
|
|
### 1. 数据库初始化
|
|
|
|
执行数据库表创建脚本:
|
|
|
|
```bash
|
|
mysql -u root -p martial_competition < database/martial-db/create_schedule_tables.sql
|
|
```
|
|
|
|
或者在MySQL客户端中直接执行 `database/martial-db/create_schedule_tables.sql`
|
|
|
|
### 2. 导入测试数据(可选)
|
|
|
|
如果需要测试编排功能,可以导入测试数据:
|
|
|
|
```bash
|
|
# 在前端项目的test-data目录下
|
|
mysql -u root -p martial_competition < test-data/create_100_team_participants.sql
|
|
```
|
|
|
|
这将创建:
|
|
- 100个集体项目队伍(500人)
|
|
- 5个集体项目类型
|
|
- 配合原有个人项目,总计1500人
|
|
|
|
### 3. 编译后端项目
|
|
|
|
```bash
|
|
cd martial-master
|
|
mvn clean package -DskipTests
|
|
```
|
|
|
|
### 4. 启动后端服务
|
|
|
|
```bash
|
|
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. 获取编排结果
|
|
|
|
```http
|
|
GET /api/martial/schedule/result?competitionId={id}
|
|
```
|
|
|
|
**响应示例**:
|
|
|
|
```json
|
|
{
|
|
"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. 保存并锁定编排
|
|
|
|
```http
|
|
POST /api/martial/schedule/save-and-lock
|
|
Content-Type: application/json
|
|
|
|
{
|
|
"competitionId": 200
|
|
}
|
|
```
|
|
|
|
**响应示例**:
|
|
|
|
```json
|
|
{
|
|
"code": 200,
|
|
"success": true,
|
|
"msg": "编排已保存并锁定"
|
|
}
|
|
```
|
|
|
|
### 3. 手动触发自动编排(测试用)
|
|
|
|
```http
|
|
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. 准备测试数据
|
|
|
|
```bash
|
|
# 执行测试数据脚本
|
|
mysql -u root -p martial_competition < test-data/create_100_team_participants.sql
|
|
```
|
|
|
|
### 2. 手动触发编排
|
|
|
|
使用API测试工具(Postman/Apifox)调用:
|
|
|
|
```http
|
|
POST http://localhost/api/martial/schedule/auto-arrange
|
|
Content-Type: application/json
|
|
|
|
{
|
|
"competitionId": 200
|
|
}
|
|
```
|
|
|
|
### 3. 查看编排结果
|
|
|
|
```http
|
|
GET http://localhost/api/martial/schedule/result?competitionId=200
|
|
```
|
|
|
|
### 4. 前端测试
|
|
|
|
访问前端页面:
|
|
|
|
```
|
|
http://localhost:3000/martial/schedule?competitionId=200
|
|
```
|
|
|
|
应该能看到:
|
|
- 竞赛分组Tab: 按时间段显示分组
|
|
- 场地Tab: 按场地显示分组
|
|
- 集体项目按单位分组显示
|
|
- 个人项目直接列出参赛者
|
|
|
|
### 5. 保存并锁定
|
|
|
|
在前端页面点击"保存编排"按钮,或调用API:
|
|
|
|
```http
|
|
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: 场地容量不足
|
|
|
|
**原因**:
|
|
- 参赛人数过多
|
|
- 时间段容量不够
|
|
|
|
**解决**:
|
|
- 增加比赛天数
|
|
- 增加场地数量
|
|
- 调整时间段容量配置
|
|
|
|
---
|
|
|
|
## 📝 注意事项
|
|
|
|
1. **定时任务执行频率**: 默认每10分钟执行一次,可以根据需要调整Cron表达式
|
|
|
|
2. **锁定机制**: 一旦保存并锁定,定时任务将不再自动编排该赛事
|
|
|
|
3. **容量检查**: 编排算法会自动检查时间段容量,超出容量的分组会报警
|
|
|
|
4. **项目类型**:
|
|
- type=1: 个人项目
|
|
- type=2: 双人项目
|
|
- type=3: 集体项目
|
|
|
|
5. **时间段容量**:
|
|
- 上午(08:30-11:30): 150分钟
|
|
- 下午(13:30-17:30): 210分钟
|
|
|
|
---
|
|
|
|
## 🚀 性能优化建议
|
|
|
|
1. **数据库索引**: 已自动创建必要索引,无需额外优化
|
|
|
|
2. **批量插入**: Service层使用批量插入,提升性能
|
|
|
|
3. **缓存**: 可以考虑使用Redis缓存编排结果(可选)
|
|
|
|
4. **并发控制**: PowerJob任务设置最大实例数为1,避免并发冲突
|
|
|
|
---
|
|
|
|
**版本**: v1.0
|
|
**创建时间**: 2025-12-08
|
|
**维护人**: 开发团队
|