# Map: crm-project 项目管理模块选型与规格锁定 ## Destination 锁定新模块 `crm-project`(原型 a5 项目管理)**可交付给一个实现会话开工的规格**:模块边界、阶段状态机、与上游 crm-opportunity/crm-customer 的接缝契约、三视图/详情页页签的接口清单、以及 crm-rule 里已存在的 ProjectRule 如何被消费。到达点=一份实现会话读完即可动手的 spec,而不是把 a5 写完。 ## Notes - 领域:Java / Spring Boot 3.3 多模块单仓,MyBatis-Plus + JPA 建表;参照 README.md 的模块模板与 AGENTS.md 的「新模块接口接入 checklist」。 - **对称参照模块**:动手前先读 crm-opportunity(双轴状态机 + 四视图 + 8 controller)与 crm-lead——a5 与 a3 高度同构,不另起风格。 - 每个 ticket 用 `/grilling` + `/domain-modeling` 推进;需要读原型页时走 AGENTS.md「Reading Lanhu prototype pages」路径(读 `axure_extract_bade4454_screenshots/*.txt`,OCR 兜底)。 - 已核实的现状:a2/a3/a4/a7 已建;a5 项目**零实体/零表/零 controller**,仅有跨模块桩 `ConvertToProjectCmd`、`ProjectOwnerSyncPort`、`ProjectUserTransferPortImpl`、`ProjectRule`(crm-rule)在等它落地。 - Plan-not-do:本 Map 只产决策/规格,不写业务代码。 ## Decisions so far - [upstream-seam-contract](issues/01-upstream-seam-contract.md) — 项目与商机**同表**(opp_status=5切域);crm-project 须实现两个 Port(ConvertToProjectCmd 回调接收者、ProjectOwnerSyncPort owner同步);ProjectRule 由 crm-rule 管 crm-project 只读;ProjectUserTransferPortImpl 已在 crm-opportunity 里实现无需新增 - [stage-model-facts](issues/02-stage-model-facts.md) — 阶段单轴线性7步(冲突待处理→方案设计→商务报价→招投标准备→商务跟进→赢单/输单→结项)+随时可关闭;冲突待处理是独立阶段;赢单/输单是同一阶段两出口;"报备审批"只写日志不做页签;列表12列;看板按阶段分列 - [schemecard-decouple](issues/07-schemecard-decouple.md) — 项目关联方案卡**必填**(推翻 CONTEXT.md L90 选填口径);方案卡解耦选 **A 就地改列**:`oppId`→`ownerType+ownerId`(商机/项目两 owner),表名/模块不动,唯一键加 ownerType,仅改 2 个类;ConvertToProjectCmd 暂不翻转;CONTEXT.md L90/L118 待交付时改写留痕 - [stage-machine-decision](issues/03-stage-machine-decision.md) — crm-project 状态机定稿:**双轴**——轴1 `project_stage` 线性7值(0冲突待处理→1方案设计→2商务报价→3招投标准备→4商务跟进→5赢单输单→6结项);轴2 `project_status` 3值(1进行中/2已关闭/3已结项)。冲突待处理=stage 0(所有项目起点);赢/输单不新增status、由 `bid_result` 字段区分、均落已结项;报备独立字段 `filing_status`(0未报备/1审核中/2通过/3驳回)。命名无孤立单大写,无需@Column钉列 - [views-workspaces-endpoints](issues/04-views-workspaces-endpoints.md) — 视图/端点定稿:**2 平铺菜单**(项目管理 @DataScope / 我的项目 owner),**无内置视图/自定义视图**(比 opportunity 简);三形态(看板/分屏/列表),看板固定按 `project_stage` 分列(无模板);端点 `GET /project/list`(scope=manage\|mine, 列表分屏共用) + `/project/board` + `/project/detail`,Tab 每个独立小端点(对齐 opportunity sub.);通用 Tab **项目自建子表**(project_follow/project_attachment,选 B 避反向依赖,文件走 crm-file) - [projectrule-consumption](issues/05-projectrule-consumption.md) — ProjectRule 消费定稿:读取走 **Port/接口** `ProjectRuleQueryPort`(crm-rule 暴露 inbound,返结构化 DTO,project→rule);crm-project 纯读方。五区块消费边界:**①阶段别名 + ⑤标底等级判定 本期做**;②拉群人员/③冲突拉群/④阶段提醒 + ⑤分成计算 **spin-out**(依赖企微群/通知推送/薪酬模块),Port 签名预留、实现留桩 - [deliverable-spec](issues/06-deliverable-spec.md) ✅ **DESTINATION** — 交付 spec 产出于 `deliverable-spec.md`(235行9节),收敛 01–07 全决策;实现会话据 §9 推进、§8 两岔口(建模甲/乙、独立建项目客户前置)先 grill ## Not yet specified - **方案卡脱离商机的解耦**(03 暴露,已升级为 ticket 07):项目独立新建要求方案卡必填,但方案卡现挂商机;解耦方式/归属域/26处引用迁移待 07 拍板。它会反过来决定 03 状态机的**起点入口**(有无来源商机、冲突检测是否所有项目都走),故 03 现被 07 阻塞。 - 详情页各页签(方案设计/商务报价/招投标准备/商务跟进/赢单输单/结项)的字段与写端点——待「阶段状态机」ticket 定稿后才切得清。 - 项目金额/中标时间/品牌等列表字段与 param 过滤——待「实体字段清单」ticket 后。 - 与 crm-file(附件/标书)、crm-log(操作日志页签)的接缝——待主体规格定后。 - a6 数据看板对项目数据的读取契约——**很可能超出本 Map 目的地**,若确认则移入 Out of scope。 - **独立建项目的客户前置**(07/D1 暴露):方案卡必填 + 卡需 customerId,独立项目无商机来源,故须定"独立建项目时客户是否必填、从客户目录选还是可新建"。喂给 03(新建入口)与 07(卡的客户来源)。 - **CONTEXT.md 口径留痕**(07/D1 暴露):crm-opportunity/CONTEXT.md L90「方案卡选填」、L118「无孤立方案卡」被 D1 推翻,须由 /domain-modeling 在 07 定稿后改写并记 ADR;本 effort 交付 spec 时附带这条 CONTEXT 变更。 ## Out of scope - a6 数据看板(运营/客户/营销)本身的实现——它是 crm-project 的下游消费者,另起 effort。 - a1/a1x 工作台/工作计划/消息中心——独立域,与 a5 无强依赖。