# 10 项目规则模块 + LeadPool 补齐(crm-rule 杂项) Type: task Status: resolved Blocked by: 06 ## Question 按 gap-report 拍板 P0,补齐 crm-rule 剩余轻量缺口(素材 [matrix-a7-3-lower.md](../matrix-a7-3-lower.md) §五 / [matrix-a7-3-upper.md](../matrix-a7-3-upper.md) §线索规则): 1. **项目规则模块**(全缺码,归属 crm-rule——票 06 拍板 2):`/api/rule/project-rule` 下 GET /current(聚合 5 区块回显)+ 5 分区全量表单保存:POST /stage-alias/save(7 阶段×显示别名)、POST /pool-member/save(7 角色×是否拉入开关)、POST /conflict-pull/save(5 行角色规则+2 触发条件复选)、POST /stage-remind/save(8 行提醒规则;原型自注「待补充」,按通用行结构落表)、POST /bid-config/save(9 标底类型×名称/说明/标底方%/中标方%/申请类型)。单例聚合配置模式(参照 CustomerReminderRule current+save)。 2. **LeadPool 补「部门成员」**(票 06 拍板项 2 默认值:显式成员表):PoolMemberStore role_type 增 DEPT_MEMBER 枚举;LeadPoolDTO 增 memberUserIds(与 ownerUserId/collaboratorUserIds 并列的显式成员列);保存/回显走既有 PoolMemberStore 拆写模式。 3. **LeadPool 导入导出 2 端点**:POST /import(Excel 模板批量)、GET /export(导出当前筛选结果)——走 crm-file 既有文件通路。 4. **阶段模板 applyScope 条件式档**:OpportunityStageTemplateDTO.applyScope 增 3=条件式 + scopeCondition JSON(字段/操作符/值,如「招标形式=ZC」);随 DTO 顺手。 5. Controller tag 直接写对:「A7 后台管理/业务规则/项目规则」「A7 后台管理/业务规则/线索规则」。 6. 遵守 ADR-0017 / UTF-8 无 BOM / 孤立单大写字母 @Column 钉名 checklist。 ## Answer 已实施(2026-09-07),全部 6 子项落地,验收=mvn test -pl crm-rule -am BUILD SUCCESS(crm-rule 212 全绿)+BOM 0: 1. **项目规则模块**:新建 ProjectRule 单例行(id=1,5 个 JSON text 列:stageAlias/poolMember/conflictPull/stageRemind/bidConfig)+ ProjectRuleDTO(5 区块结构化嵌套)+ IProjectRuleService/Impl(GET /current 聚合回显 + 5 分区保存,分区覆盖仅写对应列互不覆盖;行键非空/不重复/比例 0-100/触发复选 0/1 校验,失败 64036)。单例聚合模式对称 CustomerReminderRule(ProjectRuleInitializer @Order(23) 植入空骨架行;后端不编造字典键占位)。权限种子 ProjectRulePermissionInitializer @Order(24)(菜单「商机管理/项目规则」)。 2. **LeadPool 部门成员**:RuleConstants 增 MEMBER_ROLE_DEPT_MEMBER=3;PoolMemberStore.replace 增第 4 参 memberUserIds(load 同步回填三类);去重优先级 负责人 > 协作人 > 部门成员(uk_pool_member 唯一约束池内一人一行)。 3. **LeadPool 导入导出**:POST /import(EasyExcel 读 12 列模板,文件级守门 64035:空文件/扩展名/解析/无数据行;逐行走 self.savePool 部分成功,BatchResult 行号+池名+文案)+ GET /export(导出筛选结果,ID 列+名称参考列同集闭环——无名称反查基建,模板以 ID 为准)。 4. **阶段模板条件式档**:applyScope 增 3=条件式 + scopeCondition varchar(500);校验「条件式必填 scopeCondition」+沿用「仅所有商机可设默认」泛化为 scope != ALL 不可设默认;copy 同步复制。运行时查询缝(choose 按条件筛模板)不动——执行侧未建,按需扩展。 5. **tag**:ProjectRuleController=「A7 后台管理/业务规则/项目规则」;LeadPoolController 5 端点=「A7 后台管理/业务规则/线索规则」。 6. **纪律**:UTF-8 无 BOM(全模块扫描 0);无孤立单大写字母字段(memberUserIds/scopeCondition 均安全形态);写端点表单绑定/读端点 GET(ADR-0017)。 裁决存证:①区块行结构选 5 JSON text 列而非 5 张子行表——行是前端固定骨架渲染、后端全量覆盖(票 09 wizardConfig 同款范式);②导入模板以 ID 列为准——ISysDeptService/IAuthUserService 无名称反查且部门/用户名可重复;③导入部分成功自写逐行循环而非 BatchRunner——其输入定型 List 不适配行对象;④条件式不可设默认沿用阶段模板既有「仅 ALL 可设默认」约束而非推送规则的分组默认顶替——刻意差异。