# 模块 2、4、5 用户输入错误评分实现计划 > **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking. **目标:** 为发行、兑换、支付三个可恢复实训模块补齐与模块一一致的用户输入错误记录和评分扣分。 **架构:** 每个模块新增独立成绩服务,复用 `stu_module_score_details` 表;动作服务只在用户输入校验路径捕获并以 `REQUIRES_NEW` 记录错误,顺序门禁和系统异常继续原样返回。前端不新增本地评分逻辑。 **技术栈:** Java 8、Spring Boot 2.7、MyBatis-Plus、JUnit 5、Mockito;前端 Vue 3/Vite 仅做构建回归验证。 --- ### 任务 1:先写三个模块成绩服务的失败测试 **文件:** - 新建:`src/test/java/com/yau/digitalrmb/issuance/application/service/IssuanceScoreServiceTest.java` - 新建:`src/test/java/com/yau/digitalrmb/exchange/application/service/ExchangeScoreServiceTest.java` - 新建:`src/test/java/com/yau/digitalrmb/payment/application/service/PaymentScoreServiceTest.java` - [ ] **步骤 1:** 用 Mockito 构造 mapper 和成绩实体,分别断言首次错误创建明细、重复错误累加、完成步骤后得分按进度折算、空用户不写入。 - [ ] **步骤 2:** 运行三个测试,确认在成绩服务不存在时按预期失败。 ### 任务 2:实现三个模块成绩服务 **文件:** - 新建:`src/main/java/com/yau/digitalrmb/issuance/application/service/IssuanceScoreService.java` - 新建:`src/main/java/com/yau/digitalrmb/exchange/application/service/ExchangeScoreService.java` - 新建:`src/main/java/com/yau/digitalrmb/payment/application/service/PaymentScoreService.java` - [ ] **步骤 1:** 按模块名称、步骤总数和模块序号创建成绩明细,默认每次错误扣 0.50 分。 - [ ] **步骤 2:** 为 `recordError` 标注 `REQUIRES_NEW`,实现错误数、进度和得分更新。 - [ ] **步骤 3:** 实现 `markStepCompleted` 和 `detail`,保持错误数不被进度更新覆盖。 - [ ] **步骤 4:** 运行任务 1 测试,确认全部通过。 ### 任务 3:接入发行动作的输入错误计分 **文件:** - 修改:`src/main/java/com/yau/digitalrmb/issuance/application/service/IssuanceTrainingActionService.java` - 新建:`src/test/java/com/yau/digitalrmb/issuance/application/service/IssuanceTrainingActionServiceScoringTest.java` - [ ] **步骤 1:** 测试发行申请金额/面额校验失败调用 `recordError`,越级动作不调用。 - [ ] **步骤 2:** 在动作工作函数中捕获仅属于用户输入的 `BusinessException`,记录错误序号后保留原业务消息。 - [ ] **步骤 3:** 运行发行动作测试和既有发行测试。 ### 任务 4:接入兑换和支付动作的输入错误计分 **文件:** - 修改:`src/main/java/com/yau/digitalrmb/exchange/application/service/ExchangeTrainingActionService.java` - 修改:`src/main/java/com/yau/digitalrmb/payment/application/service/PaymentTrainingActionService.java` - 新建:对应动作服务评分测试文件。 - [ ] **步骤 1:** 分别测试钱包/银行卡/金额和付款钱包/收款钱包/金额/备注错误会计分。 - [ ] **步骤 2:** 确认顺序门禁和缺少业务上下文不会计分。 - [ ] **步骤 3:** 运行后端完整测试。 ### 任务 5:回归前端错误展示和构建 **文件:** - 检查:`ecny-lab-web/src/views/training/steps/IssueCurrency/**` - 检查:`ecny-lab-web/src/views/training/steps/CurrencyExchange/**` - 检查:`ecny-lab-web/src/views/training/steps/CurrencyPayment/**` - [ ] **步骤 1:** 确认三个模块按钮继续调用动作链并展示后端业务错误。 - [ ] **步骤 2:** 运行 `yarn build:prod`,确认无编译错误。