- 新增全套考试卷、评估卷、参考答案与考试培训包模板 - 修正slidev培训课件:调整模块标题、链路图缩放,替换工单示例为通用业务对象 - 修正课堂红线表述为证据红线,将小组作业调整为个人作业要求 - 新增权限、状态流转、审计日志、看板指标四类可复用业务规则块 - 整理AI工程技能交付包,迁移旧资产至客户专属交付包并统一术语 - 新增考试输出模板与TRAE使用记录文档
8.7 KiB
项目实操:公务用车取消派车影响分析与实际验证记录
案例来自当前 JeecgBoot 项目已接入的“公务用车”模块,不代表客户提出过这一条具体业务需求。培训中设置的改造要求是:取消已派车任务时,取消原因必须由后端校验为非空;前端必填不能替代后端业务保护。
可直接发送给 TRAE 的提示词
请基于当前打开的 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.vuejeecgboot-vue3/src/views/official/vehicle/dispatch/DispatchModal.vuejeecgboot-vue3/src/views/official/vehicle/dispatch/dispatch.data.tsjeecgboot-vue3/src/api/official/vehicle/dispatch.tsjeecg-boot/jeecg-boot-module/jeecg-module-officialvehicle/src/main/java/org/jeecg/modules/officialvehicle/controller/OfficialVehicleDispatchController.javajeecg-boot/jeecg-boot-module/jeecg-module-officialvehicle/src/main/java/org/jeecg/modules/officialvehicle/service/impl/OfficialVehicleDispatchServiceImpl.javajeecg-boot/jeecg-boot-module/jeecg-module-officialvehicle/src/main/java/org/jeecg/modules/officialvehicle/vo/OfficialVehicleCancelDispatchVo.javajeecg-boot/jeecg-boot-module/jeecg-module-officialvehicle/src/main/java/org/jeecg/modules/officialvehicle/entity/OfficialVehicleDispatch.javajeecg-boot/jeecg-boot-module/jeecg-module-officialvehicle/src/test/java/org/jeecg/modules/officialvehicle/controller/OfficialVehicleDispatchControllerTest.javajeecg-boot/jeecg-boot-module/jeecg-module-officialvehicle/pom.xmljeecg-boot/jeecg-boot-module/pom.xmljeecg-boot/db/officialvehicle/official_vehicle_mvp_mysql.sql
已确认事实
-
公务用车为项目现有模块,而非
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 行。
- 依据:
-
前端仅当用户具有
vehicle:dispatch:cancel权限、且派车状态为DISPATCHED时显示“取消派车”操作。- 依据:
DispatchList.vue第 26 至 30 行。
- 依据:
-
取消弹窗的
cancelReason已配置required: true,提交时会调用前端 API 的cancelDispatch。- 依据:
dispatch.data.ts第 72 至 75 行;DispatchModal.vue第 28 至 36 行。
- 依据:
-
前端 API 只是向
POST /official/vehicle/dispatch/cancel提交dispatchId和cancelReason,因此直接调用接口不经过页面必填校验。- 依据:
src/api/official/vehicle/dispatch.ts第 4 至 12 行。
- 依据:
-
后端 Controller 有
@AutoLog和@RequiresPermissions("vehicle:dispatch:cancel"),但只将 VO 中两个字段转交给 Service,没有参数校验注解。- 依据:
OfficialVehicleDispatchController.java第 55 至 61 行;OfficialVehicleCancelDispatchVo.java第 14 至 20 行。
- 依据:
-
原有 Service 会校验派车任务存在且状态为
DISPATCHED,随后把状态改为CANCELLED、写入cancelReason,并把关联车辆状态改为AVAILABLE;原实现没有非空或空白校验。- 依据:改造前
OfficialVehicleDispatchServiceImpl.java第 84 至 96 行。
- 依据:改造前
-
cancel_reason在official_vehicle_dispatch表中允许为空,因此仅靠当前表结构不能保证取消原因留痕。- 依据:
official_vehicle_mvp_mysql.sql第 82 至 105 行。
- 依据:
-
模块已有 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
执行命令:
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响应。 - 浏览器中取消弹窗的必填提示和成功取消路径。
人工待确认事项
- 取消原因是否仅要求非空,还是需要最小长度、枚举原因或特殊角色豁免。
Assert.hasText抛出的异常在当前服务中的错误码、HTTP 状态和前端提示是否符合统一约定。- 正常取消后派车状态、车辆状态和审计记录的集成环境回归结果。
- 是否存在项目外系统直接调用取消接口,以及它们对空原因的历史依赖。