# 实战业务培训 — 移动端接口说明

## 1. 概述

| 项 | 说明 |
| --- | --- |
| Base Path | `/app/practicalTraining` |
| 数据表 | `biz_practical_training`、`biz_practical_training_member` |
| 鉴权 | 需登录（`SecurityUtils.getUserId()`） |
| 公开展示 | 农技课堂 `GET /app/agriculturalCourse/list?type={006001–006004}` |

## 2. 培训状态（`training_status`）

| 编码 | 含义 |
| --- | --- |
| `006001` | 未开始 |
| `006002` | 报名中 |
| `006003` | 已报满 |
| `006004` | 已截止 |

## 3. 我的报名

### 3.1 分页列表

`GET /app/practicalTraining/myEnroll/list`

- 关联 `biz_practical_training_member`（`enroll_status=0`）与 `biz_practical_training`（已发布、未删除）。
- 仅当前登录用户有效报名记录；按 `enroll_time` 倒序。
- 支持 `pageNum` / `pageSize`。

**列表行主要字段**：`id`、`trainingTopic`、`trainingTime`、`trainingIntro`、`coverFileUrl`、`trainingStatus`、`trainingStatusName`、`actualEnrolledCount`、`plannedHeadCount`、`registrationEndTime`、`enrollTime`。

### 3.2 详情

`GET /app/practicalTraining/myEnroll/{id}`

- `{id}` 为培训主表 `biz_practical_training.id`。
- 须存在当前用户对该培训的有效报名，否则返回「未找到您的报名记录」。
- **详情字段**：培训完整信息 + `enrollTime` + `trainingStatus` / `trainingStatusName` + **`canCancel`**（是否允许取消报名）。

**`canCancel`**：`training_status != 006004`（已截止）时为 `true`。

## 4. 报名 / 取消报名

### 4.1 立即报名（农技课堂等入口）

`POST /app/practicalTraining/{id}/enroll`

- 仅 `training_status=006002` 且用户未报名时可成功。

### 4.2 取消报名

`POST /app/practicalTraining/{id}/cancelEnroll`

- 用户须已报名（`enroll_status=0`）。
- **`training_status=006004`（已截止）时不允许取消**，提示「报名已截止，不允许取消报名」。
- 未截止时（未开始 / 报名中 / 已报满）允许取消。
- 成功后回写 `actual_enrolled_count` 与 `training_status`。

## 5. 错误示例

| 场景 | 提示 |
| --- | --- |
| 无报名记录查详情 | 未找到您的报名记录 |
| 已截止取消 | 报名已截止，不允许取消报名 |
| 未报名取消 | 您未报名该培训 |
| 非报名中报名 | 当前培训不可报名 |
