You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
48 lines
4.7 KiB
48 lines
4.7 KiB
|
1 week ago
|
# 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<Void>,反查按 name+status=1)/ publish(form 绑定完整 DTO)/ copy(params id → Result<Long> 新 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 最新部门)
|