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.
 
 
 
 
 

6.0 KiB

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,仅有跨模块桩 ConvertToProjectCmdProjectOwnerSyncPortProjectUserTransferPortImplProjectRule(crm-rule)在等它落地。
  • Plan-not-do:本 Map 只产决策/规格,不写业务代码。

Decisions so far

  • upstream-seam-contract — 项目与商机同表(opp_status=5切域);crm-project 须实现两个 Port(ConvertToProjectCmd 回调接收者、ProjectOwnerSyncPort owner同步);ProjectRule 由 crm-rule 管 crm-project 只读;ProjectUserTransferPortImpl 已在 crm-opportunity 里实现无需新增

  • stage-model-facts — 阶段单轴线性7步(冲突待处理→方案设计→商务报价→招投标准备→商务跟进→赢单/输单→结项)+随时可关闭;冲突待处理是独立阶段;赢单/输单是同一阶段两出口;"报备审批"只写日志不做页签;列表12列;看板按阶段分列

  • schemecard-decouple — 项目关联方案卡必填(推翻 CONTEXT.md L90 选填口径);方案卡解耦选 A 就地改列oppIdownerType+ownerId(商机/项目两 owner),表名/模块不动,唯一键加 ownerType,仅改 2 个类;ConvertToProjectCmd 暂不翻转;CONTEXT.md L90/L118 待交付时改写留痕

  • stage-machine-decision — 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 — 视图/端点定稿: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 — ProjectRule 消费定稿:读取走 Port/接口 ProjectRuleQueryPort(crm-rule 暴露 inbound,返结构化 DTO,project→rule);crm-project 纯读方。五区块消费边界:①阶段别名 + ⑤标底等级判定 本期做;②拉群人员/③冲突拉群/④阶段提醒 + ⑤分成计算 spin-out(依赖企微群/通知推送/薪酬模块),Port 签名预留、实现留桩

  • deliverable-spec 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 无强依赖。