# 01 — 缺陷修复白盒验收(重点 D-01 根因修复) Type: task Status: resolved Blocked by: 无 ## 任务 对三个前置 effort 的缺陷修复做**代码级白盒复核**(不起服,静态审查 + 单测),产出验收核对清单: 1. **D-01 新建商机 500(opportunity-fix,重点)**: - `OpportunityIntakeImpl.applyInitialStage` 现状 = fail-fast(无发布中模板/版本无节点 → `OpportunityIntakeException` → 60001 友好错,非 500),确认**无零值兜底残留、无回归**; - `OpportunityRuleConstants.CODE_STAGE_TPL_SEED_PROTECTED = 64018` 与 `OpportunityStageTemplateServiceImpl.deleteDraft` / `disableTemplate` 预设保护在位(`OPP_STAGE_TPL_01` 不可删不可停;publish 内部 updateStatus 不走 disableTemplate 不破坏不变式); - `buildOpportunity` 组装路径与 `current_stage_id` 赋值链完整性核对(票 02 将做运行时断言,本票锁代码语义)。 2. **opportunity-bugfix D-01~D-22 逐条静态复核**:对照 `retest-verdicts.md` 裁决与 `e2e-report.md` §四终版状态,核对各修复锚点代码在位——owner 快照组件(`crm-opportunity/owner/`)、6 写端点(customer×3 / team×3)、`OpportunityActionGuard`(66003 暂缓禁写 / 66014 禁领预检)、`OpportunityViewFilter`(board viewType)、`fillEchoFields`(D-16 六字段)、bizType 四值封闭(D-21)、三族 versions DTO(D-22)、工作计划四端点(票 12)。 3. **工作区状态核对**:git status 中票 12 未 commit 代码(OpportunityWorkPlanAddDTO/UpdateDTO 等 untracked 文件)确认在位且完整;`git log` 最新 commit 与工作区差异盘点,确认「待打包进 fat jar 的增量」清单。 4. **全量单测**:`mvn test`(10 模块),基线 = 票 09 的 394/0/0 + 票 12 增量;crm-auth `ResourceServiceImplTest.save_editCatalog_noButtonFields` 既有红灯豁免记录。 ## 验收 - 验收核对清单落盘(23 条 = opportunity-fix D-01 + bugfix D-01~D-22,每条:缺陷 → 修复锚点(文件#行为)→ 代码现状 → 结论 ✅/❌); - 单测结果记录(模块 × 通过/失败,豁免项单独列); - 若发现修复缺失/回归 → 记录并按地图 fog 口径处置(少量就地修,成批开新票); - Answer 记录结论摘要 + 清单文件路径。 ## Answer **20260831 白盒验收通过:23/23 修复锚点全部在位,0 条 ❌;全量单测 873/0/0(BUILD SUCCESS)。无需修复,票 02 可直接进入 E2E 重跑。** 核对清单(23 条逐条:缺陷 → 锚点 → 现状 → 结论):`../defect-fix-audit.md`(本次产出);原始日志:`../mvn-test.log`。 ### ① 重点 D-01(opportunity-fix)五点全绿 - `applyInitialStage` fail-fast 在位:无发布中模板 / 版本无节点 → `OpportunityIntakeException` → seam 译 `BusinessErrorException`(=`ResultCodeEnum.BUSINESS_ERROR` **60001**),stage 三列零值兜底**无残留**; - 64018 预设保护在位:`disableTemplate`/`deleteDraft` 按 `templateCode=OPP_STAGE_TPL_01` 拦截(任何版本不可删/停);`publish` 内部直调 `updateStatus` 顶替旧版,编辑发布中预设模板再发布不受误拦,不变式保持; - `buildOpportunity` → `current_stage_id` 赋值链完整(三列命中后落位);L96-103 空串/0 兜底仅覆盖 7 个非 stage 字段(线索转入防御),非 D-01 兜底残留。 ### ② bugfix D-01~D-22 全锚点复核 - 19 条已修复项锚点全部在位(6 写端点+66011/12/13 三步事务、ActionGuard 66003×17 接线点/66014 claim 全量预检、三族清三毒、owner 三件套+五端点服务端解析、D-14 create+edit merged、ViewFilter 六视图、fillEchoFields 六字段、submitCard 显式两列回写、recordStatusFlowOplog ×10 流转边、bizType 四值封闭、三族 versions DTO、workplan 四端点含 finishTime 回填); - 3 条翻案项(D-08/18/19)「非缺陷形态保持」核对通过:close 不拦、surveySeq 必填、surveyDesc 非必填——与裁决一致。 ### ③ 次要瑕疵 3 处(不阻塞,不另开票) 1. `OpportunityIntakeImpl` 文档残留 ×2:`applyInitialStage` javadoc(L128-133)+ `buildOpportunity` L119 注释仍描述已撤销的「零值兜底/走法 A」旧方案,与 fail-fast 方法体矛盾 → **建议票 03 改 demo 时顺手修正**; 2. `OpportunitySubController` L36-37 `import java.util.Set;` 重复 ×1(javac 合法,纯整洁性); 3. 错误码 **64018 两族同值**(`CODE_STAGE_TPL_SEED_PROTECTED` 与 `CODE_SCHEME_TPL_INVALID`)——D-01 插码时方案卡族区间未顺延的既有债务,排查日志需按接口路径区分,不在本图修。 ### ④ 全量单测(10 模块 reactor,mvn test) | 关键 | 结果 | |---|---| | 总计 | **873/0/0**,BUILD SUCCESS,01:26 min(crm-app 无测试段;crm-opportunity 209/0/0 与票 12 一致) | | 豁免项 | **失效**——crm-auth `ResourceServiceImplTest.save_editCatalog_noButtonFields` 红灯未复现(auth-perms 票 02 已把用例改写为「perms 只读保留原值」语义并实测通过) | | 工具链 | mvn=`D:\apache-maven-3.9.9\bin\mvn.cmd`、JDK17=`C:\Users\luowj\.jdks\jdk-17.0.15`(bugfix 票面 IDEA 捆绑 mvn 路径已失效) | ### ⑤ 工作区状态核对(待打包增量清单) - **票 12 增量在位且完整**:untracked `OpportunityWorkPlanAddDTO/UpdateDTO` + `OpportunitySubController`/`OpportunitySubServiceImpl`/`IOpportunitySubService` 的 `MM` 二次未暂存修改 + SubServiceImplTest(30 用例);bugfix 主体为已暂存未 commit(HEAD=32ac292)。 - **并行 effort 混入**:crm-auth `ResourceServiceImpl(+Test)` 有 auth-perms 票 02 未暂存改动——**票 02 clean package 打包会一并带进 fat jar**(auth 域测试全绿,无冲突,知悉即可)。 - `logs/crm-app.log` 残留 `DU` unmerged 状态(已被 32ac292 停止跟踪,不影响构建,commit 时留意)。 ### 对下游票的影响 - **票 02**:零缺陷前置,直接 seed 重置 → clean package(留意 auth-perms 混入)→ 起服 → 全量 E2E; - **票 03**:顺手修 §③-1/2 两处小瑕疵(同文件触碰,不必开新票); - fog「E2E 重跑发现新缺陷的处置口径」维持不变(本轮无新缺陷线索)。