# 赛程编排系统后端部署指南

## 📋 部署步骤

### 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
**维护人**: 开发团队
