# 实战业务培训 — 功能需求

## 1. 文档说明

| 项 | 说明 |
| --- | --- |
| 模块名称 | 实战业务培训（科技平台与服务） |
| 目标 | 在业务后台维护实战类培训活动信息，控制发布与报名时段，展示报名进展，支撑牧业相关实战培训的发布、运营与台账管理 |
| 关联系统 | 业务后台；学员在线报名、签到、评价等若由其他模块承担，**本模块**侧重培训主档的**维护、发布控制与报名状态展示** |
| 修订依据 | 同目录 `实战业务培训-草稿.md`、界面原型（`实战业务培训.png`） |

本文档仅描述**功能需求与业务规则**，不涉及库表结构、接口路径、请求体字段命名、HTTP 报文及技术栈选型。

---

## 2. 术语与枚举

### 2.1 实战培训（一条记录）

- 表示一场可对外（或对内）开放报名的**实战业务培训活动**。  
- 包含培训基本信息、报名时段、计划规模、可选封面与预期成果等。  
- 通过 **发布状态**（§2.2）控制是否对外生效；通过 **培训状态** `training_status`（§2.3）反映当前报名阶段（由系统按时间与人数**自动计算并入库**，用户不可手工改状态）。

### 2.2 发布状态

| 状态 | 含义概要 |
| --- | --- |
| **未发布** | 新建「仅保存」、或下架回流后的状态；可编辑、可删除、可执行发布 |
| **已发布** | 已对外生效的培训；**不可修改**、**不可删除**；可查看、在满足条件下可下架 |

**发布日期**：执行「发布」成功当日，记录为自然日 **YYYY-MM-DD**；未发布时列表展示「—」或空。下架后**建议保留**上次发布日期供审计（是否清空由产品确认，默认保留）。

### 2.3 培训状态（`training_status`，自动计算入库）

字典父编码 `006`：`006001` 未开始、`006002` 报名中、`006003` 已报满、`006004` 已截止。

在**已发布**前提下，按**当前系统时间**、**报名开始/截止时间**、**计划人数**与**实际报名人数**判定；**未发布**时为 `006001`（未开始）。

判定优先级（满足即停）：

| 优先级 | 条件 | 状态 |
| --- | --- | --- |
| 1 | 发布状态为 **未发布** | `006001` 未开始 |
| 2 | 当前时间 **≥** 报名截止时间 | `006004` 已截止 |
| 3 | 当前时间 **＜** 报名开始时间 | `006001` 未开始 |
| 4 | 实际报名人数 **≥** 计划人数 | `006003` 已报满 |
| 5 | 报名开始时间 **≤** 当前时间 **＜** 报名截止时间 | `006002` 报名中 |

**实际报名人数**：统计 `biz_practical_training_member` 中 `enroll_status=0`（已报名）的记录数，写入主表 `actual_enrolled_count`；小程序用户可在 **报名中** 执行报名/取消报名并触发状态刷新。

### 2.4 时间字段关系（全局约束）

以下比较均基于 **YYYY-MM-DD HH:mm:ss**（界面 datetime 选择器）：

```
报名开始时间 < 报名截止时间 < 培训时间
```

- **培训时间**：培训举办时点（必填）。  
- **报名开始时间**：开放报名起点（必填）。  
- **报名截止时间**：开放报名终点（必填）。  

保存、发布前均须满足上述链式关系；任一不满足则拒绝提交并提示。

### 2.5 列表筛选项与字段关系

| 筛选项 | 与记录字段关系 |
| --- | --- |
| 培训主题 | 与「培训主题」**完全一致**（精确匹配）；空则不过滤 |
| 培训日期 | 按「培训时间」的**日期部分**筛选；区间为闭区间（起止日均计入） |

---

## 3. 功能范围

**本期实现：**

| 能力 | 说明 |
| --- | --- |
| 培训列表 | 培训主题精确、培训日期区间筛选；分页；见 **§5.2** |
| 新增培训 | 录入业务字段与封面；见 **§5.1** |
| 修改培训 | 仅未发布可改；见 **§5.3** |
| 查看详情 | 只读；见 **§5.5** |
| 删除培训 | 仅未发布；见 **§5.4** |
| 发布 / 下架 | 见 **§5.6** |
| 报名状态展示 | 列表/详情按 **§2.3** 展示 `training_status` |
| 小程序报名/取消 | 登录用户对 **报名中** 培训报名或取消，回写人数与状态 |

**本期不实现（除非后续单独立项）：**

- 排队候补  
- 培训签到、考核、证书、评价  
- 消息通知（短信/站内信提醒报名开始或报满）  
- 培训地点地图选点、直播链接自动校验  
- 批量导入培训、复制上一场培训  

---

## 4. 业务流程概览

```mermaid
flowchart TD
    A[新增实战培训] --> B{保存方式}
    B -->|确定/仅保存| C[未发布]
    B -->|发布| D[已发布并记录发布日期]
    C --> E[列表查询/筛选]
    D --> E
    E --> F[查看详情]
    E --> G[修改]
    E --> H[删除]
    E --> I[发布]
    E --> J[下架]
    G --> C
    H --> E
    I --> D
    J --> C
    C --> I
    D --> J
    F --> E
```

**典型运营顺序：**

1. 运营人员**新增**培训，填写主题、培训时间、简介、计划人数、地点、报名时段等，上传封面（可选）。  
2. 可先**仅保存**为未发布，经内部核对后再**发布**；或在新增表单直接**发布**。  
3. 发布后对外生效，列表展示**报名状态**与**实际报名人数**；到达报名开始后**不可下架**（**§5.6**）。  
4. 报名截止或报满后，状态自动变为 **已截止** 或 **已报满**；如需调整内容须**下架**（若仍允许）→ 修改 → 再发布。

---

## 5. 详细功能需求

### 5.1 新增实战培训

#### 5.1.1 业务字段

| 字段 | 必填 | 规则摘要 |
| --- | --- | --- |
| 培训主题 | 是 | **1～20** 个字符（与草稿「限制 20 字」一致） |
| 培训时间 | 是 | datetime；打开表单时**默认当前时刻**（可改）；须 **晚于** 报名截止时间 |
| 培训简介 | 是 | 多行文本；去除首尾空白后非空；长度上限宜 **500** 字（评审可调整） |
| 计划人数 | 是 | 正整数；单位 **人** |
| 培训地点 | 是 | 文本；长度宜 **1～200** 字 |
| 预期成果 | 否 | 多行文本；选填 |
| 报名开始时间 | 是 | datetime；须 **早于** 报名截止时间且 **早于** 培训时间 |
| 报名截止时间 | 是 | datetime；须 **晚于** 报名开始且 **早于** 培训时间 |
| 封面 | 否 | **单张**图片；后缀 `jpg`、`jpeg`、`png`（可扩展 `webp`）；单文件 ≤ **10 MB** |

#### 5.1.2 保存方式（与原型一致）

| 操作 | 行为 |
| --- | --- |
| **确定** | 校验通过后保存，**发布状态为未发布**；不写入发布日期 |
| **发布**（表单内，如橙色按钮） | 校验通过后保存，**发布状态为已发布**，**发布日期**为操作当日 |
| **取消** | 关闭表单，不保存 |

#### 5.1.3 校验摘要

| 规则 | 说明 |
| --- | --- |
| 时间链 | **报名开始 < 报名截止 < 培训时间**（**§2.4**） |
| 计划人数 | 正整数，≥ 1 |
| 封面 | 类型、大小不符时拒绝上传或拒绝保存 |
| 必填 | 任一必填为空或仅空白时拒绝保存 |

---

### 5.2 查询实战培训列表

#### 5.2.1 筛选

| 条件 | 规则 |
| --- | --- |
| 培训主题 | 选填；**精确**匹配；空则不过滤 |
| 培训日期 | 选填；**日期区间**（开始～结束，含起止日）；按**培训时间**的日期部分匹配；开始日晚于结束日时提示修正 |

#### 5.2.2 列表规则

- 默认每页 **20** 条；默认排序：**培训时间倒序**（或 **创建时间倒序**，产品择一，全文一致）。  
- 工具栏：**搜索**、**重置**、**新增**。

#### 5.2.3 展示列（与原型一致）

培训主题、培训时间、计划人数（人）、培训地点、报名开始时间、报名截止时间、**发布日期**、**报名状态**、**实际报名人数**（人）、操作。

| 列 | 展示说明 |
| --- | --- |
| 发布日期 | 未发布显示「—」 |
| 报名状态 | **§2.3** 中文标签；宜配颜色区分（报名中/已报满/已截止等） |
| 实际报名人数 | 无报名模块时为 **0** 或「—」；不得超过计划人数展示异常时需产品约定 |

#### 5.2.4 操作列（与 §6 一致）

| 发布状态 | 行内操作 |
| --- | --- |
| 未发布 | 查看、发布、编辑、删除 |
| 已发布 | 查看、下架（满足 **§5.6** 下架前置时显示或可点） |

---

### 5.3 修改实战培训

| 项 | 要求 |
| --- | --- |
| 状态约束 | 仅 **未发布** 可进入编辑并保存 |
| 已发布 | **不可修改**；须先 **下架**（若允许） |
| 可改范围 | **§5.1.1** 全部字段（含替换封面） |
| 校验 | 同 **§5.1.3** |
| 编辑表单按钮 | 通常 **确定**（保持未发布）、**取消**；是否提供 **发布** 与新增一致 |

---

### 5.4 删除实战培训

| 项 | 要求 |
| --- | --- |
| 允许删除 | **未发布** 且具备删除权限 |
| 不允许删除 | **已发布**；须先下架 |
| 删除方式 | 建议 **逻辑删除**（与项目其他业务台账一致）：列表不可见，数据可审计 |
| 确认 | 删除前二次确认；**本期不提供**批量删除（若实现须单独说明） |
| 关联 | 删除时宜清理封面文件；已有关联报名数据时是否禁止删除，由报名模块评审（**默认：有报名记录则禁止删除未发布培训**） |

---

### 5.5 查看实战培训详情

| 项 | 要求 |
| --- | --- |
| 展示内容 | **§5.1.1** 全部字段、封面预览、**发布状态**、**发布日期**、**报名状态**、**实际报名人数**；宜含创建/修改审计信息 |
| 未发布 | 只读；可提供 **编辑**、**发布**、**删除**（与列表等价） |
| 已发布 | 只读；可提供 **下架**（满足条件时）；**不提供编辑、删除** |
| 培训简介/预期成果 | 全文展示，保留换行 |

---

### 5.6 发布与下架

#### 发布

| 项 | 说明 |
| --- | --- |
| 入口 | 列表「发布」、详情「发布」、新增表单「发布」 |
| 前置 | **未发布**；**§5.1.3** 校验通过 |
| 结果 | **已发布**；**发布日期** = 操作当日（YYYY-MM-DD） |
| 重复 | 已发布不可再次发布 |

#### 下架

| 项 | 说明 |
| --- | --- |
| 入口 | 列表「下架」、详情「下架」 |
| 前置 | **已发布**；且当前时间 **早于** 报名开始时间（**「开始报名后不允许下架」**） |
| 不满足前置 | 当前时间 **≥** 报名开始时间时，**不展示**或**禁用**下架，并提示原因（如「报名已开始，不可下架」） |
| 结果 | **未发布**；对外展示结束；记录与封面保留；可再编辑、再发布 |
| 已报满/已截止 | 若仍早于报名开始才可下架；报名开始后一律不可下架（与草稿一致） |

---

## 6. 状态与操作矩阵（汇总）

在**已授权**前提下：

| 当前发布状态 | 查看 | 新增 | 修改 | 发布 | 下架 | 删除 |
| --- | --- | --- | --- | --- | --- | --- |
| 未发布 | ✓ | — | ✓ | ✓ | — | ✓ |
| 已发布（且当前时间＜报名开始） | ✓ | — | ✗ | — | ✓ | ✗ |
| 已发布（且当前时间≥报名开始） | ✓ | — | ✗ | — | ✗ | ✗ |
| 列表/global | — | ✓ | — | — | — | — |

下架成功后按 **未发布** 行权限处理。

---

## 7. 报名状态计算示例（自查）

| 发布 | 当前时间 vs 报名时段 | 实际报名 vs 计划 | 报名状态 |
| --- | --- | --- | --- |
| 未发布 | 任意 | 任意 | 未开始 |
| 已发布 | ＜ 报名开始 | 任意 | 未开始 |
| 已发布 | 在 [开始, 截止] 内 | ＜ 计划 | 报名中 |
| 已发布 | 在 [开始, 截止] 内 | ≥ 计划 | 已报满 |
| 已发布 | ＞ 报名截止 | 任意 | 已截止 |

---

## 8. 错误与提示约定

面向使用方的提示宜语义明确，例如：

| 场景 | 提示方向（示例） |
| --- | --- |
| 必填项缺失 | 标明字段（如「请填写培训简介」） |
| 培训主题超长 | 「培训主题不能超过 20 字」 |
| 时间链不满足 | 「报名截止时间须早于培训时间」等分项提示 |
| 计划人数非法 | 「计划人数须为正整数」 |
| 封面类型/大小不符 | 「仅支持 jpg、png 格式」「封面不能超过 10MB」 |
| 已发布不可编辑/删除 | 「已发布培训须先下架后再修改」 |
| 报名开始后不可下架 | 「报名已开始，不允许下架」 |
| 删除确认取消 | 不执行删除 |

本文档**不约定** HTTP 状态码、错误码字段名及接口报文结构。

---

## 9. 非功能需求（建议）

| 类别 | 建议 |
| --- | --- |
| 权限 | 查询、新增、修改、删除、发布、下架宜分按钮权限 |
| 审计 | 新增、修改、删除、发布、下架记操作日志 |
| 性能 | 列表分页；报名状态宜服务端计算，避免前后端口径不一致 |
| 封面 | 上传鉴权、访问控制；替换时清理旧文件 |
| 双语 | 界面 i18n（汉语 + 藏文，若适用） |

---

## 10. 相对草稿的修订说明

| 草稿内容 | 处理 |
| --- | --- |
| 技术栈、MySQL、RuoYi | 已移除 |
| `code`、`msg`、`data` | 已移除 |
| 报名状态四条规则 | 整理为 **§2.3** 含优先级与未发布特例 |
| 下架与「开始报名后」 | 明确为 **当前时间 ≥ 报名开始** 不可下架（**§5.6**） |
| 操作列 发布前/后 | 汇总为 **§5.2.4、§6** |
| 仅罗列字段 | 补充流程、矩阵、时间链、删除策略、范围边界 |
| 实际报名人数来源 | 说明本模块展示、报名功能另模块（**§2.3**） |

---

## 11. 需求追溯

| 能力 | 章节 |
| --- | --- |
| 新增与字段校验 | §5.1 |
| 列表筛选 | §5.2 |
| 修改 / 删除 | §5.3、§5.4 |
| 查看 | §5.5 |
| 发布 / 下架 | §5.6 |
| 报名状态 | §2.3、§7 |
| 操作流程 | §4 |
