docs: 更新TRA编程培训课程材料、课件与AI技能交付包

- 新增全套考试卷、评估卷、参考答案与考试培训包模板
- 修正slidev培训课件:调整模块标题、链路图缩放,替换工单示例为通用业务对象
- 修正课堂红线表述为证据红线,将小组作业调整为个人作业要求
- 新增权限、状态流转、审计日志、看板指标四类可复用业务规则块
- 整理AI工程技能交付包,迁移旧资产至客户专属交付包并统一术语
- 新增考试输出模板与TRAE使用记录文档
This commit is contained in:
smart
2026-08-08 11:00:36 +08:00
parent e7d6db93c3
commit 67837df8d0
169 changed files with 6618 additions and 2887 deletions
@@ -0,0 +1,133 @@
# 项目实操:公务用车取消派车影响分析与实际验证记录
> 案例来自当前 JeecgBoot 项目已接入的“公务用车”模块,不代表客户提出过这一条具体业务需求。培训中设置的改造要求是:**取消已派车任务时,取消原因必须由后端校验为非空;前端必填不能替代后端业务保护。**
## 可直接发送给 TRAE 的提示词
```text
请基于当前打开的 JeecgBoot 项目,且只基于你实际读取到的源码,完成一次变更影响分析;不要修改代码,不要猜测项目外逻辑。
训练改造目标:取消已派车任务时,取消原因必须为非空文本。前端表单已设为必填,但后端也必须拒绝空值和全空白值,避免直接调用接口绕过页面校验。
已知入口:
- 前端列表:jeecgboot-vue3/src/views/official/vehicle/dispatch/DispatchList.vue
- 前端弹窗与表单:jeecgboot-vue3/src/views/official/vehicle/dispatch/DispatchModal.vue、dispatch.data.ts
- 前端 API:jeecgboot-vue3/src/api/official/vehicle/dispatch.ts
- 后端接口:POST /official/vehicle/dispatch/cancel
- 后端 Controller:OfficialVehicleDispatchController.java
- 后端 Service:OfficialVehicleDispatchServiceImpl.java
请再读取取消参数 VO、派车实体、现有测试、模块 pom 和必要的数据库初始化 SQL,并按以下结构输出:
1. 已读取的源码。
2. 已确认事实,每条附文件和行号依据。
3. 必须检查的文件或模块,以及为什么。
4. 可能受影响的接口、数据、权限、状态、配置和测试。
5. 本次明确不应修改的内容。
6. 不超过 4 步的最小改动计划:修改目标、完成证据、验证方式、回退条件。
7. 人工待确认事项。
要求:
- 事实与推测分开;无源码证据的内容标记为“待确认”。
- 不要编造测试结果、全局异常语义、权限链路或项目外调用方。
- 不要直接实施修改。
```
## 本次实际核对记录
以下结论来自本地实际读取的源码、训练分支 diff 和实际 Maven 命令结果。没有执行过的数据库、接口和浏览器验证均明确标记为未执行。
### 已读取的源码
- `jeecgboot-vue3/src/views/official/vehicle/dispatch/DispatchList.vue`
- `jeecgboot-vue3/src/views/official/vehicle/dispatch/DispatchModal.vue`
- `jeecgboot-vue3/src/views/official/vehicle/dispatch/dispatch.data.ts`
- `jeecgboot-vue3/src/api/official/vehicle/dispatch.ts`
- `jeecg-boot/jeecg-boot-module/jeecg-module-officialvehicle/src/main/java/org/jeecg/modules/officialvehicle/controller/OfficialVehicleDispatchController.java`
- `jeecg-boot/jeecg-boot-module/jeecg-module-officialvehicle/src/main/java/org/jeecg/modules/officialvehicle/service/impl/OfficialVehicleDispatchServiceImpl.java`
- `jeecg-boot/jeecg-boot-module/jeecg-module-officialvehicle/src/main/java/org/jeecg/modules/officialvehicle/vo/OfficialVehicleCancelDispatchVo.java`
- `jeecg-boot/jeecg-boot-module/jeecg-module-officialvehicle/src/main/java/org/jeecg/modules/officialvehicle/entity/OfficialVehicleDispatch.java`
- `jeecg-boot/jeecg-boot-module/jeecg-module-officialvehicle/src/test/java/org/jeecg/modules/officialvehicle/controller/OfficialVehicleDispatchControllerTest.java`
- `jeecg-boot/jeecg-boot-module/jeecg-module-officialvehicle/pom.xml`
- `jeecg-boot/jeecg-boot-module/pom.xml`
- `jeecg-boot/db/officialvehicle/official_vehicle_mvp_mysql.sql`
### 已确认事实
1. 公务用车为项目现有模块,而非 `demo` 示例:聚合模块 `jeecg-boot-module/pom.xml` 包含 `jeecg-module-officialvehicle`,数据库脚本同时提供菜单、权限和演示数据。
- 依据:`jeecg-boot/jeecg-boot-module/pom.xml` 第 18 行;`db/officialvehicle/official_vehicle_mvp_mysql.sql` 第 134 至 218 行。
2. 前端仅当用户具有 `vehicle:dispatch:cancel` 权限、且派车状态为 `DISPATCHED` 时显示“取消派车”操作。
- 依据:`DispatchList.vue` 第 26 至 30 行。
3. 取消弹窗的 `cancelReason` 已配置 `required: true`,提交时会调用前端 API 的 `cancelDispatch`。
- 依据:`dispatch.data.ts` 第 72 至 75 行;`DispatchModal.vue` 第 28 至 36 行。
4. 前端 API 只是向 `POST /official/vehicle/dispatch/cancel` 提交 `dispatchId` 和 `cancelReason`,因此直接调用接口不经过页面必填校验。
- 依据:`src/api/official/vehicle/dispatch.ts` 第 4 至 12 行。
5. 后端 Controller 有 `@AutoLog` 和 `@RequiresPermissions("vehicle:dispatch:cancel")`,但只将 VO 中两个字段转交给 Service,没有参数校验注解。
- 依据:`OfficialVehicleDispatchController.java` 第 55 至 61 行;`OfficialVehicleCancelDispatchVo.java` 第 14 至 20 行。
6. 原有 Service 会校验派车任务存在且状态为 `DISPATCHED`,随后把状态改为 `CANCELLED`、写入 `cancelReason`,并把关联车辆状态改为 `AVAILABLE`;原实现没有非空或空白校验。
- 依据:改造前 `OfficialVehicleDispatchServiceImpl.java` 第 84 至 96 行。
7. `cancel_reason` 在 `official_vehicle_dispatch` 表中允许为空,因此仅靠当前表结构不能保证取消原因留痕。
- 依据:`official_vehicle_mvp_mysql.sql` 第 82 至 105 行。
8. 模块已有 JUnit 基座和 Controller 测试;原有取消测试只验证带“计划变更”原因时 Controller 转交 Service,未覆盖空白原因。
- 依据:模块 `pom.xml` 的 Surefire 配置;`OfficialVehicleDispatchControllerTest.java` 第 48 至 59 行。
### 最小改动及实际完成证据
| 步骤 | 实际改动 | 完成证据 | 验证状态 | 回退条件 |
|---|---|---|---|---|
| 1 | 在 Service 的 `cancel` 首行加入 `Assert.hasText(cancelReason, "取消原因不能为空")` | 空值或全空白值在读取派车单、改变状态、释放车辆前被拒绝 | 已执行单元测试 | 若业务确认允许无原因取消,撤回该校验并重新定义留痕方式 |
| 2 | 新增 `OfficialVehicleDispatchServiceImplTest`,传入全空白原因并断言抛出 `IllegalArgumentException` | 测试直接调用 Service,不依赖前端表单 | 已执行 | 若异常约定需要调整,更新断言及统一异常验证 |
| 3 | 保持前端必填、Controller 权限/审计、派车状态流转和数据库表结构不变 | `main...training/require-cancel-reason` 仅含上述两个后端文件 | 已核对 diff | 若接口回归显示兼容问题,只回退提交 `d357de7` |
### 本次明确不应修改
- `official_vehicle_dispatch` 的字段、索引和初始化 SQL。
- 派车、取消派车后的车辆可用状态处理、申请状态流转和行程模块。
- 已存在的 `vehicle:dispatch:cancel` 权限和 `@AutoLog` 审计注解。
- 前端弹窗、路由、菜单和无关页面。前端已经有必填规则,本次不重复实现。
- 未读取到源码依据的全局异常、数据权限、网关、审批或外部调用方逻辑。
### 可能受影响的内容
| 维度 | 结论 | 当前状态 |
|---|---|---|
| 接口 | 空值、`""` 或全空白 `cancelReason` 将不再被正常取消流程接受 | 已通过 Service 单测验证 |
| 数据 | 被拒绝的请求不会进入派车状态和车辆状态更新;表字段仍允许空值 | 代码顺序与单测已验证;数据库级验证未执行 |
| 权限与审计 | 原有权限和 `@AutoLog` 保持不变 | 已读取源码,未做运行环境验证 |
| 正常取消 | 非空原因仍应按原有流程取消并释放车辆 | 未做数据库/API 回归 |
| 统一响应 | `Assert` 的异常如何映射 HTTP/`Result` 取决于项目全局异常处理 | 待确认 |
### 实际验证结果
训练分支:`training/require-cancel-reason`
提交:`d357de7 fix: require reason when cancelling dispatch`
执行命令:
```bash
mvn -pl jeecg-boot-module/jeecg-module-officialvehicle -am \
-DskipTests=false \
-Dtest=OfficialVehicleDispatchServiceImplTest \
-Dsurefire.failIfNoSpecifiedTests=false test
```
实际结果:2026-08-06 再次执行完成,`BUILD SUCCESS`;`OfficialVehicleDispatchServiceImplTest` 共 1 项,`Failures: 0`、`Errors: 0`、`Skipped: 0`。
未执行且不能写成已通过:
- 已派车数据提交非空取消原因后的数据库状态、车辆状态和审计记录。
- 直接调用取消接口时空值/全空白值的 HTTP/`Result` 响应。
- 浏览器中取消弹窗的必填提示和成功取消路径。
### 人工待确认事项
1. 取消原因是否仅要求非空,还是需要最小长度、枚举原因或特殊角色豁免。
2. `Assert.hasText` 抛出的异常在当前服务中的错误码、HTTP 状态和前端提示是否符合统一约定。
3. 正常取消后派车状态、车辆状态和审计记录的集成环境回归结果。
4. 是否存在项目外系统直接调用取消接口,以及它们对空原因的历史依赖。