# 08 — E2E 实测:商机规则三族配置 Type: task Status: resolved Blocked by: 05 ## Question 按 `spec-flows.md` 执行 crm-rule 商机规则三族(阶段模板 / 方案卡模板 / 公海与提醒规则)主流程实测(`e2e-rules.py`): - 每族走全 **V-CONFIG 生命周期**:新建草稿 → 编辑 → 发布(旧版停用)→ 绑定生效验证 → 复制/删除约束(仅草稿可删等); - 阶段模板:节点增删排序、`is_fixed` 保护、发布后商机绑定锁版本(发新版不迁移已绑定商机); - 方案卡模板:字段集配置(字段类型/必填/顺序)、发布、商机建卡按模板驱动动态字段; - 公海规则:五配置项、适用范围匹配(部门专用 vs 默认兜底、最低层级命中)、`remind_days < recycle_days` 约束; - **配置变更对商机侧的实际生效**(如 `allow_manual_pool` 开关对抛公海入口的控制、回收天数与 `last_valid_follow_time` 的关系)。 注意:规则配置写远程库,测试后把自建规则**停用/清理干净**(不留脏发布中规则影响他人联调)。 产出:`e2e-rules.py` + `.scratch/opportunity-e2e/report-rules.md`。只记录不修复。 ## Answer (20260828 实测完成)产出 `e2e-rules.py`(六轮迭代)+ `report-rules.md` + `e2e-rules-result.json`。三族 V-CONFIG 生命周期 + U03 配置生效全实测,最终 **✅ 39 / ⚠ 5 / ❌ 3 · 缺陷 5 条(P1×4 / P2×1)· SKIP 0**。复现:`python .scratch/opportunity-e2e/e2e-rules.py`(幂等可重跑:自建规则名带时间戳前缀防撞,跑完自动停用/删除清理)。 ### 缺陷清单(只记录不修复) 1. **[P1] 三族同构:编辑发布中生成新草稿 50001**(R01/R02/R03 各记一条)—— `VersionedConfigSupport.resolveDraft` 编辑发布中/停用分支的 `dto.toEntity()` 携带源版本 id 直接 insert → 日志 `Duplicate entry for opportunity_stage_template.PRIMARY`。**V-CONFIG 版本推进 API 全断**(编辑发布中/停用均不可用);publish 自我顶替语义因此无法实测(旁证=票 07 U02 发布禁领版时 seed 规则被顶替取消默认,同 code 发布侧路径存在) 2. **[P1] 商机 owner_dept_id 恒空** —— 创建(F01 API)/领取/分配/移交均不写部门快照,DB 直查 opportunity 全表 13/13 行 NULL。连锁失效:① 部门专用公海规则(applyScope=2)对任何商机永不命中(`OpportunityPoolRuleMatcherImpl` 按 owner_dept_id 查部门索引落空);② DataScope 部门天花板同源失效(owner_dept_id 是 deptColumn 锚点)。U03 生效层实测:发布部门专用 allowManualPool=0 规则后 release-pool 照常成功(按缺陷预期放行,证据已留) 3. **[P2] versions 端点返回实体直出** —— 出参泄露 creatorId/deleted/updaterId(违 ADR-0017 Entity 禁令,deleted 泄露) 4. **[P2] R02 编辑发布中(同构引用缺陷 1)** 5. **[P2] R03 编辑发布中(同构引用缺陷 1)** ### 验证通过(节选) - 负路径校验链全拦:阶段模板 5 连拒(64013/64017)、方案卡 3 连拒(64018/64022,含伪造 fieldKey 快照防伪造)、公海规则 5 连拒(64008 五配置项约束) - V-CONFIG 正路径:V1.0 草稿 + 节点规范化(末位系统补 OPP_STAGE_05 固定节点 + seq 重算)、草稿原位编辑(版本编码不变)、copy 独立新编码、disable 草稿拒、delete 草稿级联 - **D-01 种子保护**:disable 种子阶段模板被 64018 拒;**绑定锁版本**:发布新模板后 A1 商机阶段节点集 5 节点不变 - U03 配置层:部门专用规则发布 + deptIds 绑定回显(deptIds/deptNames 数组) - 清理闭环:三族无发布中残留,`e2e-seed公海规则`仍发布中(F14 前置未破坏),A1 领回原位 ### 契约事实(供票 10/11) - 三族 flat API 同构:save-draft(Result,反查按 name+status=1)/ publish(form 绑定完整 DTO)/ copy(params id → Result 新 id)/ disable(仅发布中)/ delete(仅草稿,级联删子表)/ versions(GET params id,实体列表) - **autoRecycleEnabled=0 时 recycleRemindEnabled 必须显式传 0** —— 省略时后端按开启处理而 remindDays 缺失 → 64008「自动回收前提醒参数非法」(64008 覆盖该校验族全部消息) - deptIds 表单绑定 = 逗号分隔字符串;detail 回显 deptIds/deptNames 数组;阶段模板 page 出参无绑定商机数字段(注释契约如此) - 方案卡 field-defs 16 项系统字段库(fieldKey 唯一引用源);字段项 fieldName/fieldType 由服务层快照写入,入参伪造无效 - sys_dept 最老 root 部门 744636475731083264 的 dept_name 是历史 mojibake 存量(规则 deptIds 配置须避开;测试取 create_time 最新部门)