Type: grilling Status: resolved Blocked by: 03 ## Question crm-rule 里已存在的 `ProjectRule`(项目规则)如何被 crm-project 消费?它约束什么(阶段超期提醒?公海回收?负责人分配?)现有字段是什么、Initializer 种了哪些默认值、权限点如何挂。定清 crm-project → crm-rule 的读取接缝,避免重复造规则域。 依赖 03(状态机定后才知道规则挂在哪些阶段)。用 /grilling,先读 crm-rule 的 ProjectRule 实体与 Initializer。 ## Answer (resolved) ### crm-project 消费 ProjectRule 五区块定稿 #### 读取方式 = 选项1 Port/接口 crm-rule 暴露 inbound port `ProjectRuleQueryPort`(返回结构化 DTO,非裸 JSON),crm-project 依赖接口注入。依赖方向 project→rule 清晰、类型安全。crm-project 是**纯读方**,写方=crm-rule(单例行 id=1,`ProjectRuleInitializer` 植入骨架)。 #### 五区块消费边界(本期做 vs spin-out) | 区块 | JSON 列 | 消费点 | 本期 | 说明 | |---|---|---|---|---| | ①阶段别名 | `stageAliasJson` | 列表/看板列头、详情阶段名展示 | ✅ **做** | 纯读展示,`loadStageAlias()`;看板列头别名优先、空回退 stage 字典名(对齐 opportunity `custom_node_name` 范式) | | ②拉群人员 | `poolMemberJson` | 项目建群拉 7 角色 | ⚠️ **spin-out** | 依赖企微群能力(同 06 群聊详情 Tab),本期无集成,Port 契约预留 | | ③冲突拉群 | `conflictPullJson` | stage 0 冲突待处理拉群 + 2 触发条件(≥2方/异地报备) | ⚠️ **spin-out** | 同上,拉群依赖企微;冲突**检测/入 stage 0 做**,但**拉群动作** spin-out | | ④阶段提醒 | `stageRemindJson` | 阶段流转发提醒 | ⚠️ **spin-out** | 依赖通知推送能力,本期未定 | | ⑤标底认定 | `bidConfigJson` | 招投标/赢单登记算标底等级+分成 | 🤔 **部分做** | **等级判定(A+~SQ)本期做**(招投标准备/赢单页字段,纯读规则);**分成%计算 spin-out**(依赖薪酬/绩效模块) | **本期实际落地** = ①阶段别名 + ⑤标底等级判定(读侧);②③④拉群/提醒 + ⑤分成计算 = spin-out,Port 方法签名先留、实现留桩。 #### Port 契约草案(06 细化) ``` interface ProjectRuleQueryPort { List loadStageAlias(); // ① 本期 BidConfigDTO loadBidConfig(String bidType); // ⑤ 等级判定本期;分成字段留 DTO 不消费 // 以下 spin-out,签名预留: List loadPoolMembers(); // ② ConflictPullDTO loadConflictPull(); // ③ List loadStageRemind(); // ④ } ``` #### 遗留给 06(不阻塞 05) - ProjectRuleQueryPort 归 crm-rule inbound 包的具体位置 + DTO 定义 → 06 落。 - 冲突检测逻辑(触发条件判定)在 crm-project 哪一层做(建项目时 or 方案卡回调时)→ 06。 - spin-out 区块的桩实现策略(Noop vs 抛未实现)→ 06。