# 覆盖对账矩阵(票 01 产出) > 目标:把 brief 三族(核心域/重流程/规则族)拆成 Demo 必须实现的**每一个可见入口**,逐项对账:端点 → 契约源 → 现有 demo 覆盖 → 缺口动作 → 依据。 > 审计基线:现有 demo `.scratch/customer-e2e/demo/index.html`(2264 行,下引行号=L);契约权威 `.scratch/customer-module/API-SUMMARY.md`(下称 **AS**);原型树 `.scratch/api-docs-reorg/lanhu-tree-v29.md`(下称 **TREE**);页面映射 `.scratch/customer-frontend-handover/mapping-a4-pages.md`(下称 **MAP**);缺口台账 `.scratch/customer-frontend-handover/gap-report.md`(下称 **GR**);豁免补充 `.scratch/customer-demo-ref/map.md` Out of scope(下称 **MAP-OS**)。 > Bruno 仓:`D:\code\crm-api-docs\`(下引 `.bru` 均相对该根)。 > 审计方法:demo 全部 64 处 fetch 逐一归位(与 GR §一「零缺接口」一致),叠加 UI 元素清单(HTML L153-433 + 渲染函数)逐入口核对。 ## 图例 - **缺口动作**:`无缺口` / `改造`(入口在、行为或字段不全) / `新增`(入口缺失需新建) / `豁免`(台账划出,须引依据) / `待0X票`(契约事实由姊妹票收口,矩阵先挂入口)。 - **契约源缩写**:`[DTO:x]` = `crm-customer/src/main/java/com/crm/customer/domain/dto/x.java`;`[PARAM:x]` = 同树 `domain/param/x.java`;`[PORT:x]` = `.../crm/customer/port/x.java`;crm-rule 源 = `crm-rule/src/main/java/com/crm/rule/`。 ## 口径核实(票面点名的两个口径) 1. **详情页签数量**:原型/TREE A4-4 = **8 页签**(信息/联系人/跟进/关联商机/关联项目/战略协议/团队成员/操作日志);后端 AS §2.5 同 8;现有 demo = **7 页签**(L217-225,缺「关联项目」)。brief「6 页签」清单少计了关联项目(恒"--")与战略协议(返工票 12 已上线)。**矩阵口径:8 页签为权威**,demo 需补页签 5 占位。 2. **「换负责人」**:AS 85 端点内无 change-owner 类端点(CustomerController 11 端点 + Ownership 9 端点逐一核对);归属变更由 `assign`(公海→人)、`transfer`(总监级整批)承载。brief 提及的独立「换负责人」入口**无契约源 → 豁免**。 --- ## 一、核心域 ### 1.1 三 workspace 列表(TREE A4-1[2] / A4-2[3] / A4-3-1) | # | 入口(Demo 可见元素) | 端点 | 契约源 | 现有 demo | 缺口动作 | 依据 | |---|---|---|---|---|---|---| | 1 | workspace 切换:我的客户 / 客户总览 / 客户公海 | POST `/api/customer/workspace/page` | `我的客户\workspace 列表分页.bru`(总览/公海同名)+[PARAM:CustomerWorkspacePageParam]+[DTO:CustomerListRowDTO] | ✅ 三按钮 L176-178,switchWs L537 | 无缺口 | AS §2.1;MAP §1-3 | | 2 | 内置视图下拉(我负责的/我协同的/待跟进/我关注的/最近访问) | 同上(`viewType`) | AS §2.1 viewType 适配矩阵 | ⚠️ 仅 ASSIGNED/COLLABORATING/FOCUSED 三项(L180-184),缺 FOLLOW_UP_DUE、RECENT | **改造**:补两选项(注意 pool 越界视图 SQL 空集不硬拒;RECENT 不接 saved-view) | AS §2.1 入参表;TREE A4-3-1 | | 3 | keyword 搜索框 + 查询按钮 | 同上(`keyword`) | 同 1 | ✅ L185-186 | 无缺口 | AS §2.1 | | 4 | 分页器(上一页/下一页/页码) | 同上(`current/size`,BaseParam) | AS §0 | ✅ L193-195 | 无缺口 | AS §0 | | 5 | 列筛选器:阶段/客户星级/关系星级/类型/行业/省份 | 同上(`customerStage/customerStarLevel/relationStarLevel/customerType/industryCode/provinceCode`) | [PARAM:CustomerWorkspacePageParam] | ❌ 无任何列筛选 UI | **改造**:补筛选控件(公海按 D29 另有「检索:类型/行业」) | AS §2.1 入参表;AS §2.2 尾注 | | 6 | 归档态切换(有效/已归档,A4-4-1 已归档客户态入口) | 同上(`archiveStatus`) | AS §2.1;TREE A4-4-1 已归档页 | ❌ 未传(恒默认 1) | **改造**(低):列表加归档态开关,详情头部已有已归档 badge(L1070) | AS §2.1;D19 归档=删除语义 | | 7 | saved-view 下拉(自定义视图叠加/新建/设默认/删除) | `/api/preference/view/list\|save\|delete\|set-default` + page 传 `savedViewId` | AS §2.14;[PARAM:CustomerSavedViewFilter](query 包,消费侧已实现);.bru **A4 无自定义视图文档**(仅 `A3 商机管理\销售机会\自定义视图\*.bru` 4 件) | ❌ 完全未接(P3-2) | **新增**(P3-2 翻正为主缺口);scopeKey=`customer.mine/overview/pool`;RECENT 不接;唯一 JSON 例外端点 | AS §2.14;GR P3-2;待04票收契约细节 | | 8 | 形态偏好切换(列表/分屏/看板,持久化) | GET/POST `/api/preference/view-form/get\|save` | AS §2.14;`.bru`:我的客户\保存视图形态.bru 等三 workspace+联系人共 8 件 | ❌ 无切换 UI、无持久化(P3-1) | **新增**;pool 仅 list/split 的拒绝行为**不可依赖**(I-06 漂移) | AS §2.14 ⚠;GR P3-1;待04票 | | 9 | 看板视图(分组列+卡片拖列;分组列 stage/star/关系星级) | POST `/api/customer/workspace/board/summary` + POST `.../board/cards` | `.bru`:我的客户\看板列表\看板分组汇总.bru+看板单列卡片.bru(总览同名 2 件;**公海无看板 .bru**);[DTO:CustomerBoardSummaryDTO] | ⚠️ board/summary 被挪用作列表「汇总卡」(L586);board/cards **零调用**;无看板 UI | **新增**看板视图(mine/overview);pool 看板 67001 拒绝=文档口径,jar 实测 code=0=漂移 → **待04票** | AS §2.1 看板边界;GR §六.1;MAP §1-2 | | 10 | 卡片视图 / 分屏视图渲染形态 | 同 1(列表行子集) | AS §2.14 view-form 三值;MAP §2 | ❌ 仅列表形态(P3-1) | **改造**(P3 后置):至少分屏占位;卡片=列表行子集 | GR P3-1;TREE A4-2[3] | | 11 | 列表列:关注★/名称/编号/阶段/星级/负责人/部门/商机数/项目数/最近跟进/操作 | 同 1 出参 | [DTO:CustomerListRowDTO](opportunityCount 真算、projectCount 恒 null、focusFlag 已补) | ✅ 11 列(L189-192、rowHtml L563-578);项目数恒"--"已对 | **改造**(字段级→07票):原型另有 类型/行业/战略协议等级/VIP 等级/进入公海时间(公海)等列未渲染 | MAP §1 行「含 focusFlag·strategicAgreementLevel·vipCustomerLevel·enterPoolTime」;AS §2.1 出参行 | | 12 | 列表「汇总卡」 | (demo 借 board/summary) | [DTO:CustomerBoardSummaryDTO] | ✅ L197、loadSummary L582-591 | **改造**(口径随05票):A4 原型列表页无独立统计卡(线索域才有视图统计卡片.bru)——保留为看板预览或移除,二选一 | TREE A4-1/A4-2/A4-3 页名无统计卡;对照 `A2 线索管理\*\视图统计卡片.bru` | ### 1.2 归属与批量动作 | # | 入口 | 端点 | 契约源 | 现有 demo | 缺口动作 | 依据 | |---|---|---|---|---|---|---| | 13 | 行内关注★/☆切换 | POST `/api/customer/focus?id=` / `unfocus?id=` | `.bru` 客户公海\关注客户.bru+取消关注客户.bru;[DTO]— | ✅ L567、toggleFocus L1016-1022 | 无缺口 | AS §2.9 | | 14 | 批量关注 | POST `focus-batch?ids=` | 客户公海\批量关注客户.bru | ✅ L205、L1015 | 无缺口 | AS §2.9 | | 15 | 分配给销售(弹窗,单条) | POST `assign?id=&userId=` | 三 workspace 均「分配客户.bru」;错误 67012 | ⚠️ 只取勾选**第一条**(dlgAssign L1023-1032) | **改造**:接 `assign-batch`(见 16),弹窗支持整批 | AS §2.2 | | 16 | 批量分配 | POST `assign-batch?ids=&userId=` | 三 workspace 均「批量分配.bru」 | ❌ 无调用 | **新增**:批量面板加「批量分配」按钮 | AS §2.2;`.bru` 批量分配.bru×3 | | 17 | 批量领取 / 批量抛公海 / 批量归档 | POST `claim-batch` / `release-pool-batch` / `archive-batch` | 客户公海\批量领取.bru 等 | ✅ L202-204、L1012-1014 | 无缺口 | AS §2.2/§2.10 | | 18 | 单条领取/抛公海/归档/恢复(详情头部按钮族) | POST `claim/release-pool/archive/restore?id=` | 客户公海\领取客户.bru、抛公海.bru、归档客户.bru、恢复客户.bru | ✅ 详情头 L1081-1082;oneBy L1002-1007 | 无缺口(守卫码 67004/67006/67007 提示已有 toast 通道) | AS §2.2/§2.10 | | 19 | 重点客户标记/取消 | POST `star?id=` / `unstar?id=` | `.bru` 客户详情\标记重点客户.bru+取消重点标记.bru | ✅ 详情头 L1080 | 无缺口(幂等两态;不写 oplog) | AS §2.9 | | 20 | 换负责人(独立入口) | —(无端点) | — | ❌ 无 | **豁免**:85 端点无契约源;归属变更由 assign/transfer 承载 | AS §2 全集;本文件「口径核实 2」 | ### 1.3 新增 / 编辑 / 查重(TREE A4-3-3,查重流) | # | 入口 | 端点 | 契约源 | 现有 demo | 缺口动作 | 依据 | |---|---|---|---|---|---|---| | 21 | 「+ 新建客户」按钮 + 表单(12 字段) | POST `/api/customer/create` | 我的客户\新增客户.bru;[DTO:CustomerCreateDTO] | ✅ header L162、dlgCreate L927-949 | 无缺口 | AS §2.3 | | 22 | 名称相似查重确认流(needConfirm→similarHits→confirmSimilar 重发) | GET `check-name?name=&excludeId=` + create 带 `confirmSimilar` | 客户查重\名称相似提示.bru;[DTO:CustomerSaveResultDTO/CustomerSimilarHitDTO](masked 脱敏) | ✅ doCreate L950-961 相似命中确认流;设置页试玩 L370 | 无缺口(similarHits 的 masked 展示形态→07票) | AS §2.3 查重弹窗结构;AS §0 脱敏现状 | | 23 | 信用代码查重(L3 硬拦) | GET `check-credit-code?creditCode=` | 客户查重\信用代码查重.bru;[DTO:CreditCodeCheckDTO] | ✅ 内建于 create(67003 toast)+ 试玩 L371 | 无缺口(系统强制无开关) | AS §2.3/§2.13 | | 24 | 新建表单工商联想输入 | GET `company-lookup?companyName=`(注意参数名 companyName) | 我的客户\工商信息查询.bru | ❌ create 表单无联想输入(仅批量 F6 已接) | **改造**(低):表单联想接线,stub 恒 NO_HIT 即现象呈现 | AS §2.3;GR 豁免台账「企查查真实源」(真实源豁免、seam 接线不豁免) | | 25 | 编辑客户(CAS version 带回) | POST `edit?id=` + GET `detail?id=` 回显 | 我的客户\编辑客户.bru;[DTO:CustomerUpdateDTO] | ✅ dlgEdit L963-992(已带 version+isBizNegotiated+isChild,D-05 口径) | 无缺口 | AS §2.3 edit 行注 | | 26 | OCR 快捷新增(A4-3-3-4) | — | — | ❌ | **豁免**:customer-module D5 划出 | GR 豁免台账;MAP §1 行 a4-3-3-4 | | 27 | 附件上传位(新增/编辑/协议/日志) | — | — | ❌(协议仅 fileFileId 文本框 L1248) | **豁免**:customer-module D2 | GR 豁免台账 | | 28 | A4-6 独立查重页(卡片/列表)+ 客户合并 + 「已被合并」态 | — | — | ❌ | **豁免**:chart D4/D6/D19;MAP-OS 同 | GR 豁免台账;MAP §1 行 a4-6-x | ### 1.4 详情头部 + 8 页签(TREE A4-4[12]) | # | 入口 | 端点 | 契约源 | 现有 demo | 缺口动作 | 依据 | |---|---|---|---|---|---|---| | 29 | 详情公共头部(名称/编号/阶段/星级/归档态/负责人/跟进摘要/下次跟进/计数) | GET `detail-head?id=`(副作用 upsert customer_view_log) | 客户详情\详情公共头部.bru;[DTO:CustomerDetailHeadDTO] | ✅ loadHead L1061-1084 | **改造**(低,P3-6):金额汇总卡 4 张未渲染(wonProjectAmount/planEstimateAmount/ongoingOpportunityAmount/contractAmount/paidAmount 恒 null 显 "--",渲染即现象呈现) | AS §2.5 公共头部行;GR P3-6 | | 30 | 页签1 客户信息(16 字段栅格) | GET `detail?id=` | 客户详情\客户详情.bru;[DTO:CustomerDetailDTO] | ✅ L1098-1100、grid L1124-1135 | **改造**(字段级→07票):G4 系统信息四件套恒"--"(DTO 未暴露,记档);creditCode 等脱敏分档 V1 划出 | GR P2-G4;AS §5.4 | | 31 | 页签2 联系人——列表(keyword/内外部筛选、8 列) | GET `contacts?customerId=`(列表数据源=旧端点) | 客户详情\联系人\*.bru;[DTO:ContactDTO] | ✅ L229-253、renderContactsList L864 | 无缺口(G5 联系人负责人缺列=字段级→07票) | GR P2-G5;AS §2.4/§2.7b | | 32 | 页签2 联系人——图谱视图(定级/连线/删边/公司边派生) | GET `contact/graph/detail?customerId=` + POST `contact/graph/save` | 客户详情\联系人图谱\图谱全量读.bru+图谱整体保存.bru;[DTO:GraphDTO/GraphNodeDTO/GraphEdgeDTO];[PARAM:GraphSaveParam] | ✅ 完整(修订⑧口径,L244-281、save L1599) | 无缺口 | AS §2.7b 图谱组;contact-graph D-G1 | | 33 | 页签2 联系人——批量编辑(页内原子批) | POST `contact/batchEdit` | 客户详情\联系人\页内批量编辑.bru;[PARAM:ContactBatchEditParam] | ✅ L235-237、L1986 | 无缺口(空串清空语义豁免=D-G1) | AS §2.7b;GR 豁免台账 | | 34 | 页签2 联系人——电话明文查看(单点/全部) | GET `contact/reveal?id=` | 客户详情\联系人\电话明文查看.bru | ✅ L238、L1852 | 无缺口 | AS §2.7b | | 35 | 页签2 联系人——导出 xlsx | POST `contact/export?customerId=` | 客户详情\联系人\联系人导出.bru | ✅ L239、L2206(apiDownload) | 无缺口 | AS §2.7b | | 36 | 页签2 联系人——导入三段式弹窗(模板/上传预检/确认/结果/失败) | `contact/import/*` 六端点 | 客户详情\联系人导入\*.bru 六件;[DTO:ContactImport*DTO] | ✅ cimp 弹窗 L397-426、L2131-2186 | 无缺口(注:GR 豁免台账「联系人子表导入划出 V1」已被 contact-graph 票 05 实现推翻,以 AS §2.7b 为准) | AS §2.7b 导入组 | | 37 | 页签2 联系人——快速添加多行 | POST `contact/quickAdd` | 客户详情\联系人\快速添加联系人.bru;[PARAM:ContactQuickAddParam] | ✅ L241、L2097 | 无缺口 | AS §2.7b | | 38 | 页签2 联系人——新建/编辑弹窗、删除 | POST `contact/create` / `contact/edit?id=` / `contact/delete?id=` | 联系人\新增联系人.bru+编辑联系人.bru+删除联系人.bru;[DTO:ContactDTO] | ✅ dlgContact L1142-1159、delContact L1160-1168 | 无缺口(扩展档案字段豁免=V1 收窄) | AS §2.7;GR 豁免台账 | | 39 | 页签2 联系人——电话软提示 | GET `contact/check-phone?phone=&excludeId=` | 联系人\电话软提示.bru | ✅ dlgCheckPhone L1169-1176 + 试玩 L372 | 无缺口(受查重设置电话开关控制) | AS §2.7 D26 | | 40 | 页签3 跟进记录——日期分组列表 + 写跟进弹窗 | GET `follow/page?id=` + POST `follow/add?id=` | 客户详情\跟进记录\跟进记录分页.bru+新增跟进.bru;[PARAM:FollowPageParam];[DTO:FollowCreateDTO] | ✅ L1101-1103、dlgFollow L1188-1200 | **改造**(低):筛选器未接(followWay/时间范围,[PARAM:FollowPageParam] 已支持);G1 操作人筛选后端无参=P2 记档,demo 侧豁免 | AS §2.5 写跟进注;GR P2-G1;GR §六 D-02 现象已标注(L220、L1192) | | 41 | 页签4 关联商机(5 列渲染) | GET `opportunity/page?id=`(port 反查) | 客户详情\关联商机\关联商机页签.bru;[PORT:CustomerOpportunityQueryPort].OpportunityItem | ⚠️ 仅 5 列(L1107-1108);原型 13 列、契约 7 字段 | **改造 + 待03票**:列清单以 03 票实现实返为准(G2 挂账跨模块) | GR P2-G2;issues-07 §C 收窄口径 | | 42 | 页签5 关联项目(恒"--") | —(A5 未建) | 客户详情\关联项目\关联项目页签.bru | ❌ 页签整体缺失 | **新增**(占位页签,内容恒"--") | AS §2.5 页签 5 行、§5.3;TREE A4-4-5 | | 43 | 页签6 战略协议(列表卡+新增/编辑/删除/详情弹窗) | `agreement/*` 五端点 | 战略协议\*.bru 五件;[DTO:AgreementDTO] | ✅ L1109-1113、L1234-1270(快照联动提示 L1240) | 无缺口(附件位豁免,fileFileId 文本框保留) | AS §2.6 | | 44 | 页签7 团队成员(列表+添加/移除) | GET `member/list?id=` + POST `member/add?id=` + `member/remove?id=&memberUserId=` | 客户详情\团队成员\*.bru 三件;[DTO:CustomerMemberDTO/MemberAddDTO] | ✅ L1114-1117、L1202-1221 | **改造**(字段级→07票):G3 职务/加入时间两列缺(DTO 未暴露,记档) | GR P2-G3 | | 45 | 页签8 操作日志(日期分组叙事流) | GET `oplog/page?id=` | 客户详情\操作日志\操作日志分页.bru;[PARAM:OplogPageParam](action 17 种值域) | ✅ L1118-1120、oplogHtml L1223 | **改造**(低):筛选器未接(action/keyword/时间范围);**豁免**:导出按钮(P3-4 原型有、无端点) | AS §2.5 页签 8、§3 action 值域;GR P3-4 | | 46 | 详情头动作族:编辑/写跟进/+快速添加/+成员/关注/取关/重点/领取/抛公海/归档/恢复 | 见各条目 | — | ✅ L1076-1082 | 无缺口(入口聚合正确) | AS §2.5 | ### 1.5 商机侧硬依赖(brief 核心域尾项) | # | 入口 | 端点 | 契约源 | 现有 demo | 缺口动作 | 依据 | |---|---|---|---|---|---|---| | 47 | 商机弹窗快建客户(最小集+confirmSimilar 透传) | POST `/api/customer/quick-create` | 我的客户\快速创建客户.bru;[DTO:CustomerQuickCreateDTO] | ❌ 无调用 | **新增 + 待03票**:演示入口形态(模拟商机弹窗场景)由 03 票定 | AS §2.4 | | 48 | 商机侧客户搜索(名称/联系人/电话三维+类型) | POST `/api/customer/search` | [PARAM:CustomerSearchParam];[DTO:CustomerSearchItemDTO];.bru 在 A3 侧(新建商机流程) | ❌ 无调用 | **新增 + 待03票**(同上,演示商机选客户场景) | AS §2.4 | | 49 | 商机详情带出联系人(port 消费面) | GET `contacts?customerId=` | 同 31 | ✅(联系人页签数据源即此端点,L1811) | 无缺口(复用即可,03 票核对消费方视角) | AS §2.4 | ### 1.6 联系人独立菜单(TREE A4-5[7]) | # | 入口 | 端点 | 契约源 | 现有 demo | 缺口动作 | 依据 | |---|---|---|---|---|---|---| | 50 | 联系人列表页(顶级联系人列表,keyword 匹配姓名/电话/客户名) | GET `contact/page` | 联系人\顶级联系人列表.bru;[PARAM:ContactPageParam] | ❌ 无独立菜单(联系人只作为客户详情页签存在) | **新增**:独立页签(含 scopeKey=`contact.list` 列偏好+形态偏好接线) | AS §2.7;TREE A4-5-1 | | 51 | 联系人详情页(A4-5-5) | GET `contact/detail?id=` | 联系人\联系人详情.bru | ❌ 无调用(编辑弹窗直接用行数据 L1143) | **新增**(可与 50 合并为详情弹窗,回显走 detail 端点) | AS §2.7;TREE A4-5-5 | | 52 | 联系人全局搜索 | GET `contact/search?keyword=&limit=` | 联系人\联系人全局搜索.bru | ❌ 无调用 | **新增 + 待03票**(商机「关键联系人」数据源演示场景) | AS §2.7 | | 53 | 联系人操作日志页签(A4-5-6) | —(CustomerOplog 无 contact 维度列) | — | ❌ | **新增**(空态占位;G6 后端加列为挂账,demo 先空态) | GR P2-G6;MAP §1 行 a4-5-6 | | 54 | 联系人图谱节点展开折叠/跨客户人脉 | — | — | ❌ | **豁免**:原型本期暂不支持 | GR 豁免台账 | --- ## 二、重流程 ### 2.1 客户交割两段式(TREE A4-7[4]) | # | 入口 | 端点 | 契约源 | 现有 demo | 缺口动作 | 依据 | |---|---|---|---|---|---|---| | 55 | 发起交割面板:预览按钮/原因三选/接收总监/备注/发起 | GET `transfer/preview` + POST `transfer/initiate` | 客户交割\发起前客户预览.bru+发起交接.bru;[DTO:TransferPreviewDTO/TransferInitiateDTO] | ✅ L313-328、L1331-1355 | 无缺口(reason=resign 自动推导 D22 已有提示) | AS §2.11 | | 56 | 交接单列表(编号 JG*/发起人/接收总监/原因/状态/进度) | GET `transfer/page` | 客户交割\交接记录分页.bru;[PARAM:TransferPageParam] | ✅ L329-336、L1356-1374 | 无缺口 | AS §2.11 | | 57 | 交接单详情弹层(明细行+处置态) | GET `transfer/detail?id=` | 客户交割\交接详情.bru;[DTO:TransferDetailDTO] | ✅ L337、L1375-1388 | 无缺口 | AS §2.11 | | 58 | 明细分配(单行选人)+ 可分配销售列表 | POST `transfer/assign?id=&customerIds=&assignUserId=` + GET `transfer/assignable?id=` | 客户交割\客户分配.bru+可分配销售列表.bru;[DTO:AssignableUserDTO] | ✅ dlgAssignOne L1389-1397、loadAssignable L1398-1409 | 无缺口(D-07 已修复 0.42s 实证,assignable 可正常拉取) | AS §2.11;AS §5.6 | | 59 | 交割入口(列表批量面板「发起交割」按钮) | (跳转) | — | ✅ L207、dlgTransferEntry L1033 | 无缺口 | TREE A4-7 | ### 2.2 客户导入三段式(TREE A4-3-2;实现=upload→confirm→result 两段式+结果轮询) | # | 入口 | 端点 | 契约源 | 现有 demo | 缺口动作 | 依据 | |---|---|---|---|---|---|---| | 60 | 下载模板(V1 双 sheet) | GET `import/template` | 我的客户\客户导入\下载导入模板.bru | ✅ tplLink L290(apiDownload 同源拼接 L2255) | 无缺口 | AS §2.12 | | 61 | 上传预检(模式三选×重复策略二选×文件) | POST `import/upload`(multipart file/importMode/duplicateStrategy) | 我的客户\客户导入\上传导入文件并预校验.bru;[DTO:ImportPreviewDTO] | ✅ L291-301、impUpload L1275 | 无缺口(INSERT 行必填前移 P1-1 已修复,预计数=执行) | AS §2.12 F8;GR §二 P1-1 | | 62 | 确认执行 / 任务结果 / 失败明细 | POST `import/confirm?taskId=` + GET `import/result?taskId=` + `import/failures?taskId=` | 我的客户\客户导入\确认执行导入.bru+任务结果.bru+失败疑似重复明细.bru;[DTO:ImportResultDTO/ImportFailDTO] | ✅ L1307-1330 | 无缺口 | AS §2.12 | | 63 | 导入任务列表(最近导入记录) | GET `import/page` | 我的客户\客户导入\最近导入记录.bru;[PARAM:ImportPageParam] | ✅ L305-309、loadImportPage L1289 | **改造**(低):status/importMode 过滤未接(Param 已支持) | AS §2.12 | | 64 | 「触发校验规则后确认执行」复选框 | —(原型控件幻影) | — | ❌ 未实现(正确) | **豁免**:P3-3 幻影控件,实现语义=确认即执行 | GR P3-3、§一 幻影语义行 | | 65 | 客户导出按钮 | —(无端点) | — | ❌ | **豁免**:API-SUMMARY §5.4 定稿划出 | GR 豁免台账 | ### 2.3 联系人导入三段式(contact-graph 票 05;镜像客户导入) 见条目 36(✅ cimp 三步弹窗全覆盖:模板/上传预检/预览确认/结果失败明细;六端点全部接线)。无缺口。 ### 2.4 超期提醒配置(TREE A7-3-3-1) | # | 入口 | 端点 | 契约源 | 现有 demo | 缺口动作 | 依据 | |---|---|---|---|---|---|---| | 66 | 超期提醒表单(总开关/首次触发天数/二次提醒间隔+各自开关)+ 刷新/保存 | GET `/api/rule/customer/reminder` + POST `/api/rule/customer/reminder/save` | `A7 后台管理\业务规则\客户规则\客户管理设置(超期未跟进提醒)\当前提醒规则.bru`+保存提醒规则.bru;crm-rule `CustomerReminderRuleController` | ✅ L342-353、loadReminder/saveReminder L1410-1433 | 无缺口(契约细节核实归02票) | AS §2.13 | --- ## 三、规则族 | # | 入口 | 端点 | 契约源 | 现有 demo | 缺口动作 | 依据 | |---|---|---|---|---|---|---| | 67 | 查重设置表单(总开关/名称查重/匹配方式/相似阈值/电话查重) | GET `/api/rule/customer/dedup` + POST `.../dedup/save` | `A7 后台管理\业务规则\客户规则\客户管理设置(客户查重设置)\读取查重设置.bru`+保存查重设置.bru;crm-rule `CustomerDedupRuleController` | ✅ L354-366、loadDedup/saveDedup L1434-1457 | 无缺口(64023 校验、信用代码恒开无配置已标注;细节核实归02票) | AS §2.13/§3 | | 68 | 查重消费侧试玩(check-name/check-credit-code/check-phone 三按钮) | 见 22/23/39 | — | ✅ L367-375(demo 特有辅助面板,非原型入口) | 无缺口(建议保留:验收查重设置生效最短路径) | AS §2.13 消费侧注 | | 69 | 公海池配置(客户规则,brief 规则族点名) | ??(后端疑似不存在) | crm-rule 控制器面仅 `CustomerDedupRuleController`+`CustomerReminderRuleController`(客户域);**无 CustomerPool*Controller**;`.bru` 客户规则下无公海池(`线索规则\公海池*.bru` 7 件属线索域,不适用客户) | ❌ 无 | **待02票**:确认原型依据页与后端实现边界;若确认未实现 → Demo 只读占位+现象标注(现象设计归06票) | AS §2.13 仅两单例;crm-rule controller 目录实测;`.bru` 目录实测 | ### 豁免台账引用汇总(demo 侧不再展开的入口) | 豁免项 | 依据 | |---|---| | A4-6 独立查重页(卡片/列表)+ 客户合并 + 已被合并客户态 | GR 豁免台账(chart D4/D6/D19)+MAP-OS | | 附件上传位(新增/编辑/协议/日志) | GR 豁免台账(D2) | | OCR 快捷新增 | GR 豁免台账(D5) | | 企查查真实源(company-lookup stub 恒 NO_HIT) | GR 豁免台账(seam 接线不豁免,见条目 24) | | 联系人扩展档案字段(性别/生日/微信/邮件/地址) | GR 豁免台账(V1 档案收窄) | | 联系人图谱节点展开折叠/跨客户人脉 | GR 豁免台账 | | batchEdit 空串清空语义 | GR 豁免台账(contact-graph D-G1) | | 客户导出 | GR 豁免台账(AS §5.4) | | 联系人子表导入划出 V1 | **已失效**——contact-graph 票 05 已实现六端点(AS §2.7b),demo 已覆盖(条目 36);本矩阵不改判其他豁免 | | 换负责人(独立入口) | 本矩阵口径核实 2(85 端点无契约源) | | 操作日志导出按钮 | GR P3-4(原型有、无端点) | | 「显示完整金额」开关 | GR P3-5(敏感信息三档脱敏定稿划出) | | 「触发校验规则后确认执行」复选框 | GR P3-3(原型控件幻影) | | P2 记档四件(G1 操作人筛选/G2 商机 13 列/G3 成员两列/G4 四件套/G5 联系人负责人) | GR §三——字段级挂账,demo 侧按现状渲染,随07票定展示口径 | --- ## 缺口汇总表 统计口径:上表 69 条入口中,「无缺口」33 条;**新增 9**、**改造 16**(含字段级挂 07 票 4 条)、**豁免 14**(含台账引用汇总中 5 条未占独立行号项)、**待姊妹票 4**(待02×1、待03×3——待03 的 3 条同时挂「新增」)。个别条目带复合动作(如 41=改造+待03、45=改造+豁免),按主动作计入并加注。 ### 新增入口(9 条) | # | 入口 | 一句话缺口 | |---|---|---| | 7 | saved-view 下拉 | 偏好视图四端点+savedViewId 全未接,demo 无自定义视图 UI(P3-2) | | 8 | 形态偏好切换 | list/split/board 持久化四端点未接(P3-1);pool·board 漂移不可依赖(待04) | | 9 | 看板视图 | board/summary 被挪用为汇总卡、board/cards 零调用、无看板 UI;pool 看板支持存疑(待04) | | 16 | 批量分配按钮 | assign-batch 端点有契约无入口,现 dlgAssign 只处理勾选第一条 | | 42 | 页签5 关联项目占位 | 原型/后端均有此页签(恒"--"),demo 整页签缺失 | | 47 | 商机弹窗快建演示入口 | quick-create 零调用(待03 定形态) | | 48 | 商机侧客户搜索演示入口 | search 零调用(待03 定形态) | | 50 | 联系人独立菜单页 | contact/page+contact.list scopeKey 未接,联系人仅作为详情页签存在 | | 51+53 | 联系人详情/操作日志空态 | contact/detail 零调用;A4-5-6 页签无(空态占位,G6) | ### 改造入口(16 条) | # | 入口 | 一句话缺口 | |---|---|---| | 2 | 视图下拉 | 缺 FOLLOW_UP_DUE/RECENT 两内置视图选项 | | 5 | 列筛选器 | 六个共用列筛选参数全部无 UI | | 6 | 归档态开关 | archiveStatus 未传,看不到已归档客户列表 | | 10 | 分屏/卡片渲染 | 仅列表形态(P3-1 后置) | | 11 | 列表补列 | 类型/行业/协议等级/VIP/进入公海时间未渲染(字段级→07) | | 12 | 汇总卡口径 | board/summary 挪用,与原型对不齐,随05定去留 | | 24 | 工商联想输入 | 单条 company-lookup 未接(stub 显 NO_HIT 即现象) | | 29 | 头部金额汇总卡 | 4 张金额卡未渲染(5 字段恒 null 显"--",P3-6) | | 30 | 信息页签四件套 | 创建/更新时间·人恒"--"(G4→07) | | 31 | 联系人负责人列 | G5→07 | | 40 | 跟进筛选器 | followWay/时间范围参数无 UI | | 41 | 关联商机列对齐 | 5 列 vs 原型 13 列(G2→07+待03) | | 44 | 成员两列 | 职务/加入时间(G3→07) | | 45 | 日志筛选器 | action/keyword/时间参数无 UI(导出豁免) | | 63 | 导入任务过滤 | status/importMode 无 UI | | — | (并入 16)分配弹窗整批化 | dlgAssign 单条语义 → 批量 | ### 豁免入口(14 项,见豁免台账引用汇总) 换负责人、A4-6 独立查重页×3 态、OCR、客户导出、日志导出、完整金额开关、导入触发校验复选框、附件位、企查查真实源、图谱展开折叠/跨客户人脉、联系人扩展档案字段、batchEdit 空串语义、P2 记档五件的 demo 侧豁免(G1/G3/G4/G5 字段级挂 07,G6 已列新增空态)。 ### 待姊妹票(4 条) - **待02票**(1 条):#69 公海池配置——后端 crm-rule 无客户公海池控制器、`.bru` 客户规则下无公海池文档,疑似「brief 点名但未实现」;02 票确认后若坐实,Demo 侧做只读占位+「未实现」现象标注(现象文案设计交 06 票)。 - **待03票**(3 条):#41 关联商机列清单(以实现实返为准收口 G2)、#47 quick-create、#48/#52 商机选客户演示形态。 - **待04票**(2 条交叉):#8/#9 pool·board 形态与看板的实现实态(I-06 漂移的 jar 实测结论)。 --- ## 对 05 号票(基线策略)的输入要点 1. **覆盖度**:现有 demo 69 个入口中 33 条无缺口,且 GR 实测 59 唯一路径零缺接口、零幻影端点——骨架(fetch 层/登录/五页签/弹窗件)与图谱修订⑧、批量编辑/快速添加/联系人导入、协议五端点、双导入、交割、设置双单例均为已验证实现,**沉没成本高,支持方案 A(fork 演化)**。 2. **改造面集中在四块**:偏好三件套 UI(#7/#8,全新)、看板视图 UI(#9,把 #12 的挪用拆开)、联系人独立菜单(#50-53,新页签)、筛选器补齐(#5/#40/#45/#63,Param 均已支持,纯接线)。 3. **迁移风险清单**:(a) #12 汇总卡挪用 board/summary 需在看板落地时拆分;(b) #15 dlgAssign 单条语义改批量时勿破坏原 toast/BatchResult 呈现;(c) #2 补视图选项时 pool 越界视图 SQL 空集不硬拒、RECENT 不接 savedViewId;(d) F6 工商更新 stub 按钮按「只测不修」保留并明示 NO_HIT;(e) fork 后 API_BASE 默认值与 `?api=` 覆盖、debug token 登录逻辑原样搬运;(f) I-06 漂移未收口前,形态切换 UI 不得断言 pool+board 被拒。 4. **建议文件落点**:本 effort 目录 `demo/index.html`(fork 起点=现 index.html 原样复制),矩阵行号引用均基于原文件,fork 后行号可平移对照。 ## 对 07 号票(字段对齐清单)的输入要点 1. **圈定范围**:本矩阵「缺口动作≠豁免」入口即 07 的展开对象;豁免行不展开。 2. **字段级挂账先行**:G2(关联商机 7 vs 13 列,待03 收口后才有定稿列清单)、G3(成员两列)、G4(四件套)、G5(联系人负责人)——07 票按「现状值域 + 定稿口径」两栏写,避免和后端挂账票冲突。 3. **脱敏口径清单**(demo 已实现的呈现需断言):similarHits.masked(CustomerSimilarHitDTO)、图谱 phoneMasked、reveal 明文(列表/图谱共享 revealed 态)、联系人导出电话同列表脱敏口径;「--」位置:projectCount、页签5、金额卡 5 字段、detail 四件套。 4. **字典枚举核对点**:demo 内置硬编码枚举需对 Bruno/字典树核对——customer_stage(STAGE)、follow_way 5 值(dlgFollow L1190)、contact_source 4 值(dlgContact L1151 硬编码 code)、job_title 两级树(ensureDicts L625-630 动态拉取✅)。 5. **契约源优先级**:`.bru` 出参 > DTO 源码 > AS 条目;A4 无 saved-view `.bru`(仅 A3 有 4 件),该块契约源只能引 AS §2.14 + 平台实现,07 票注意标注「文档缺口」。 ## 结论一句话 端点级零缺口(GR 已证),缺口全部在**入口呈现层**:9 新增 + 16 改造 + 14 豁免 + 4 待姊妹票;豁免全部有台账依据,待决项已分别挂 02/03/04 票,无新增后端需求(除 G2/G3/G4/G5/G6 既有挂账外)。