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.

39 lines
4.1 KiB

1 day ago
# 08 方案推送规则模块(crm-rule 全缺码补齐)
Type: task
Status: resolved(2026-09-07)
Blocked by: 06
## Question
按 gap-report 拍板 P0,新建方案推送规则模块(素材 [matrix-a7-3-upper.md](../matrix-a7-3-upper.md) §推送规则,端点族同构 OpportunityStageTemplate):
1. `/api/rule/opp-push-rule` 下 8 端点:page / detail / save-draft / publish / copy / disable / delete / versions——版本化状态机复用既有实现模式(同族唯一草稿+唯一发布中、发布后原版转停用、复制=独立新编码 V1.0 草稿、仅草稿可删)。
2. DTO 字段(截图提取):ruleCode PUSH_RULE_XX / ruleName / versionNo / status / applyScope(两档+条件式档可选)/ ruleDesc + 4 步骤配置 JSON:
- ①基础推送信息:推送节点名称、方案卡模板引用(锁定模板版本)
- ②字段校验:规则列表[{字段名称/字段来源/字段类型/校验规则/失败处理方式}]
- ③字段映射:[{字段名称/对应字段/推送方式}]
- ④创建/关联项目:创建方式(自动/交互/关联已有)、重复规则引用(**引用查重规则并锁定版本**,为票 09 的引用来源)、名称规则、备注变量
3. Controller tag 直接写对:「A7 后台管理/业务规则/商机规则/方案推送规则」。
4. bruno-sync.config.json 不需加 sourceRoots(crm-rule 已含);确认 menuBindings。
## Answer
**resolved(2026-09-07)**。8 端点全落地,V-CONFIG 第四实例(extends {@link VersionedConfigSupport} 同款状态机)。
**落地清单(crm-rule,10 文件)**:
- 实体 `OpportunityPushRule`(表 opportunity_push_rule:rule_code/rule_name/version_no/status/apply_scope/condition_type/condition_value/is_default/rule_desc/push_config text)+ Mapper
- DTO(内嵌 `PushConfig` 4 步骤结构化对象:BasicInfo/FieldValidationItem/FieldMappingItem/ProjectCreation)/ VersionDTO(D-22 剥审计)/ PageParam
- `IOpportunityPushRuleService` + Impl(无运行时查询缝:执行侧未建)
- Controller `/api/rule/opp-push-rule` 8 端点(page/detail/save-draft/publish/copy/disable/delete/versions)+ 深 tag「A7 后台管理/业务规则/商机规则/方案推送规则」
- `OpportunityPushRulePermissionInitializer`(@Order(21) 仅菜单,「商机管理/方案推送规则」)
- `OpportunityRuleConstants` 追加:前缀 PUSH_RULE_ / 适用范围 1,2 / 创建方式三值 / 错误码 64025–64030
**关键裁决与语义偏差存证**:
1. **适用范围两档 = 1全部商机 / 2条件式**(非阶段模板的部门档语义):条件式档必填 conditionType+conditionValue(原型示例「项目阶段='投标阶段'」存 condition_value;条件字段值域归前端配置器,服务层不强校验字典)。
2. **推送配置 4 步骤单 push_config JSON 列(无子表)**:DTO 结构化出入参 ⇄ 服务层 ObjectMapper 序列化;序列化失败拒绝保存、反序列化失败防御为空不阻塞浏览;page 不回显(大 JSON 不进列表,明细走 detail);方案卡引用锁版本行 id(V-CONFIG 11 同款)、查重规则引用 dedupRuleId 为票 09 引用来源(票 09 落地后补存在性校验)。
3. **发布校验**:步骤①必配 + 方案卡模板引用版本行存在 + 同名称发布中唯一(跨规则编码族——原型「同族同名单版本间不可重复」的落地解读,64029)+ 创建方式三值域(64030)。
4. **默认顶替分组收敛**:同 applyScope(条件式含同 conditionType+conditionValue)内发布中默认唯一,异于阶段模板全局唯一(原型「同适用范围中设默认」)。
5. **执行次数不出参**:按版本累计、执行侧归商机域未建(同构票 06「绑定商机」列已知裁决),执行侧落地后补统计源与运行时查询缝。
6. bruno-sync:crm-rule 已在 sourceRoots(未动);menuBindings 无商机规则条目(同阶段模板/方案卡模板口径,未加)。
7. 验收:BOM 117 文件 0 / compile EXIT=0 / crm-rule 175 测试全绿(新增 `OpportunityPushRuleServiceImplTest` 23 个规格验证)/ 未提交 git。