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.

164 lines
37 KiB

2 days ago
# A4 客户管理 Bruno 接口文档缺口普查 worklist
- 普查范围:`D:\code\crm-api-docs\A4 客户管理\` 全部 117 个端点 .bru(排除 folder.bru),2026-09-11 全量重扫
- 分类口径:(a) 占位示例(响应示例标记「非真实返回」);(b) 退化示例(标记 E2E 实测但关键载荷为空集);(c) 嵌套 DTO 未展开(含类型占位 List<F> 与扁平无前缀两种漏网形态);(d) 说明不清晰(截断/表缺字段/值域缺失)
- 模块归属 = Controller 所在模块;117 文件映射 75 个唯一端点(总览/我的/公海/联系人四个分区大量复用同一端点,修一处示例可多文件同步)
- 机器可读格式:主表每文件一行,`类型` 列为 a/b/c/d 组合(`ok`=无缺口),可直接 grep
## 逐文件 worklist(117 行)
| 文件 | 端点 | 类型 | 形态 | 建议修法 | 模块/Controller | 备注 |
| --- | --- | --- | --- | --- | --- | --- |
| 客户交割/交接记录分页.bru | `GET /api/customer/transfer/page` | c+d | c:DTO-flat | (c) content[].details List<DetailRow> 子行扁平无前缀,content[].id 与明细 id 重名歧义。修:明细行改 content[].details[].{id, customerId, customerName, assignStatus, assignUserName, assignTime};TransferDetailDTO.createTime(发起时间)有 @Schema 且实测返回里有,表缺该行。修:补一行 createTime(LocalDateTime,发起时间) | crm-customer/CustomerTransferController | |
| 客户交割/交接详情.bru | `GET /api/customer/transfer/detail` | c+d | c:DTO-flat | (c) details List<DetailRow> 子行扁平无前缀。修:改 details[]. 前缀 6 字段;同上:补 createTime 行 | crm-customer/CustomerTransferController | 错误码丢失:HEAD 版有「错误码」节本版无(重生成回退),从 git 历史回捞并入票 06 |
| 客户交割/发起交接.bru | `POST /api/customer/transfer/initiate` | a+c+d | c:DTO-flat | (a) 占位示例:E2E 采集有数据 specimen 回填(票 02 采集清单);(c) 同交接详情:details 子行扁平无前缀。修:改 details[]. 前缀;同上:补 createTime 行 | crm-customer/CustomerTransferController | |
| 客户交割/发起前客户预览.bru | `GET /api/customer/transfer/preview` | ok | | 无缺口(示例真值+结构完整+说明完整) | crm-customer/CustomerTransferController | |
| 客户交割/可分配销售列表.bru | `GET /api/customer/transfer/assignable` | a | | (a) 占位示例:E2E 采集有数据 specimen 回填(票 02 采集清单) | crm-customer/CustomerTransferController | |
| 客户交割/客户分配.bru | `POST /api/customer/transfer/assign` | b+c | b:partial | (b) failures=[](全成功)。修:补采含部分失败的分配(如非法客户 id)展示 CustomerBatchFailItem 形态;(c) failures 类型列是占位符 List<F> 且零展开。修:改 List<CustomerBatchFailItem> 并展开子行 failures[].{id, reason(枚举 CustomerBatchFailReason), message} | crm-customer/CustomerTransferController | 错误码丢失:HEAD 版有「错误码」节本版无(重生成回退),从 git 历史回捞并入票 06 |
| 客户公海/workspace 列表分页.bru | `POST /api/customer/workspace/page` | ok | | 无缺口(示例真值+结构完整+说明完整) | crm-customer/CustomerWorkspaceController | 错误码丢失:HEAD 版有「错误码」节本版无(重生成回退),从 git 历史回捞并入票 06 |
| 客户公海/上传导入文件并预校验.bru | `POST /api/customer/import/upload` | a+c | c:DTO-flat | (a) 占位示例:E2E 采集有数据 specimen 回填(票 02 采集清单);(c) rows List<Row> 子行扁平无前缀(sheetName/rowNum/identity/verdict/reason 悬挂)。修:改 rows[]. 前缀 5 字段 | crm-customer/CustomerImportController | |
| 客户公海/下载导入模板.bru | `GET /api/customer/import/template` | a | | (a) 占位示例:E2E 采集有数据 specimen 回填(票 02 采集清单) | crm-customer/CustomerImportController | |
| 客户公海/任务结果.bru | `GET /api/customer/import/result` | d | d:missing-field | ImportResultDTO.createTime(提交时间)实测返回里有,表缺该行。修:补一行 createTime(LocalDateTime,提交时间) | crm-customer/CustomerImportController | 非退化复核:仅 creatorName null(可空字段),核心计数全有值——非退化;错误码丢失:HEAD 版有「错误码」节本版无(重生成回退),从 git 历史回捞并入票 06 |
| 客户公海/保存列偏好.bru | `POST /api/preference/save` | a | | (a) 占位示例(Result<Void>/标量:E2E 采一次真值信封即可,data 结构不会再变丰富) | crm-preference/ColumnPreferenceController | |
| 客户公海/保存视图形态.bru | `POST /api/preference/view-form/save` | a | | (a) 占位示例(Result<Void>/标量:E2E 采一次真值信封即可,data 结构不会再变丰富) | crm-preference/ViewFormController | |
| 客户公海/关注客户.bru | `POST /api/customer/focus` | a | | (a) 占位示例(Result<Void>/标量:E2E 采一次真值信封即可,data 结构不会再变丰富) | crm-customer/CustomerFocusController | |
| 客户公海/分配客户.bru | `POST /api/customer/assign` | a | | (a) 占位示例(Result<Void>/标量:E2E 采一次真值信封即可,data 结构不会再变丰富) | crm-customer/CustomerOwnershipController | |
| 客户公海/取消关注客户.bru | `POST /api/customer/unfocus` | a | | (a) 占位示例(Result<Void>/标量:E2E 采一次真值信封即可,data 结构不会再变丰富) | crm-customer/CustomerFocusController | |
| 客户公海/失败疑似重复明细.bru | `GET /api/customer/import/failures` | b | b:full | (b) data=[] 空集;ImportFailDTO 5 字段形态已列但无实例。修:用含失败行/疑似重复行的 taskId 重采(fixture 造失败行) | crm-customer/CustomerImportController | 错误码丢失:HEAD 版有「错误码」节本版无(重生成回退),从 git 历史回捞并入票 06 |
| 客户公海/客户分页.bru | `POST /api/customer/page` | a | | (a) 占位示例:E2E 采集有数据 specimen 回填(票 02 采集清单) | crm-customer/CustomerController | |
| 客户公海/归档客户.bru | `POST /api/customer/archive` | a | | (a) 占位示例(Result<Void>/标量:E2E 采一次真值信封即可,data 结构不会再变丰富) | crm-customer/CustomerOwnershipController | |
| 客户公海/恢复客户.bru | `POST /api/customer/restore` | a | | (a) 占位示例(Result<Void>/标量:E2E 采一次真值信封即可,data 结构不会再变丰富) | crm-customer/CustomerOwnershipController | |
| 客户公海/批量关注客户.bru | `POST /api/customer/focus-batch` | a | | (a) 占位示例(Result<Void>/标量:E2E 采一次真值信封即可,data 结构不会再变丰富) | crm-customer/CustomerFocusController | |
| 客户公海/批量分配.bru | `POST /api/customer/assign-batch` | a+c | c:type-F | (a) 占位示例:E2E 采集有数据 specimen 回填(票 02 采集清单);(c) failures 类型列是占位符 List<F> 且零展开。修:改 List<CustomerBatchFailItem> 并展开子行 failures[].{id, reason(枚举 CustomerBatchFailReason), message} | crm-customer/CustomerOwnershipController | |
| 客户公海/批量归档.bru | `POST /api/customer/archive-batch` | a+c | c:type-F | (a) 占位示例:E2E 采集有数据 specimen 回填(票 02 采集清单);(c) failures 类型列是占位符 List<F> 且零展开。修:改 List<CustomerBatchFailItem> 并展开子行 failures[].{id, reason(枚举 CustomerBatchFailReason), message} | crm-customer/CustomerOwnershipController | |
| 客户公海/批量抛公海.bru | `POST /api/customer/release-pool-batch` | a+c | c:type-F | (a) 占位示例:E2E 采集有数据 specimen 回填(票 02 采集清单);(c) failures 类型列是占位符 List<F> 且零展开。修:改 List<CustomerBatchFailItem> 并展开子行 failures[].{id, reason(枚举 CustomerBatchFailReason), message} | crm-customer/CustomerOwnershipController | |
| 客户公海/批量领取.bru | `POST /api/customer/claim-batch` | a+c | c:type-F | (a) 占位示例:E2E 采集有数据 specimen 回填(票 02 采集清单);(c) failures 类型列是占位符 List<F> 且零展开。修:改 List<CustomerBatchFailItem> 并展开子行 failures[].{id, reason(枚举 CustomerBatchFailReason), message} | crm-customer/CustomerOwnershipController | |
| 客户公海/抛公海.bru | `POST /api/customer/release-pool` | a | | (a) 占位示例(Result<Void>/标量:E2E 采一次真值信封即可,data 结构不会再变丰富) | crm-customer/CustomerOwnershipController | |
| 客户公海/最近导入记录.bru | `GET /api/customer/import/page` | d | d:missing-field | content 元素缺 createTime 行(同 ImportResultDTO)。修:补 content[].createTime | crm-customer/CustomerImportController | |
| 客户公海/确认执行导入.bru | `POST /api/customer/import/confirm` | a | | (a) 占位示例(Result<Void>/标量:E2E 采一次真值信封即可,data 结构不会再变丰富) | crm-customer/CustomerImportController | |
| 客户公海/读取列偏好.bru | `GET /api/preference/get` | a | | (a) 占位示例:E2E 采集有数据 specimen 回填(票 02 采集清单) | crm-preference/ColumnPreferenceController | |
| 客户公海/读取视图形态.bru | `GET /api/preference/view-form/get` | a | | (a) 占位示例(Result<Void>/标量:E2E 采一次真值信封即可,data 结构不会再变丰富) | crm-preference/ViewFormController | |
| 客户公海/领取客户.bru | `POST /api/customer/claim` | a | | (a) 占位示例(Result<Void>/标量:E2E 采一次真值信封即可,data 结构不会再变丰富) | crm-customer/CustomerOwnershipController | |
| 客户总览/workspace 列表分页.bru | `POST /api/customer/workspace/page` | ok | | 无缺口(示例真值+结构完整+说明完整) | crm-customer/CustomerWorkspaceController | 错误码丢失:HEAD 版有「错误码」节本版无(重生成回退),从 git 历史回捞并入票 06 |
| 客户总览/保存列偏好.bru | `POST /api/preference/save` | a | | (a) 占位示例(Result<Void>/标量:E2E 采一次真值信封即可,data 结构不会再变丰富) | crm-preference/ColumnPreferenceController | |
| 客户总览/保存视图形态.bru | `POST /api/preference/view-form/save` | a | | (a) 占位示例(Result<Void>/标量:E2E 采一次真值信封即可,data 结构不会再变丰富) | crm-preference/ViewFormController | |
| 客户总览/分配客户.bru | `POST /api/customer/assign` | a | | (a) 占位示例(Result<Void>/标量:E2E 采一次真值信封即可,data 结构不会再变丰富) | crm-customer/CustomerOwnershipController | |
| 客户总览/客户分页.bru | `POST /api/customer/page` | a | | (a) 占位示例:E2E 采集有数据 specimen 回填(票 02 采集清单) | crm-customer/CustomerController | |
| 客户总览/归档客户.bru | `POST /api/customer/archive` | a | | (a) 占位示例(Result<Void>/标量:E2E 采一次真值信封即可,data 结构不会再变丰富) | crm-customer/CustomerOwnershipController | |
| 客户总览/恢复客户.bru | `POST /api/customer/restore` | a | | (a) 占位示例(Result<Void>/标量:E2E 采一次真值信封即可,data 结构不会再变丰富) | crm-customer/CustomerOwnershipController | |
| 客户总览/批量分配.bru | `POST /api/customer/assign-batch` | a+c | c:type-F | (a) 占位示例:E2E 采集有数据 specimen 回填(票 02 采集清单);(c) failures 类型列是占位符 List<F> 且零展开。修:改 List<CustomerBatchFailItem> 并展开子行 failures[].{id, reason(枚举 CustomerBatchFailReason), message} | crm-customer/CustomerOwnershipController | |
| 客户总览/批量归档.bru | `POST /api/customer/archive-batch` | a+c | c:type-F | (a) 占位示例:E2E 采集有数据 specimen 回填(票 02 采集清单);(c) failures 类型列是占位符 List<F> 且零展开。修:改 List<CustomerBatchFailItem> 并展开子行 failures[].{id, reason(枚举 CustomerBatchFailReason), message} | crm-customer/CustomerOwnershipController | |
| 客户总览/批量抛公海.bru | `POST /api/customer/release-pool-batch` | a+c | c:type-F | (a) 占位示例:E2E 采集有数据 specimen 回填(票 02 采集清单);(c) failures 类型列是占位符 List<F> 且零展开。修:改 List<CustomerBatchFailItem> 并展开子行 failures[].{id, reason(枚举 CustomerBatchFailReason), message} | crm-customer/CustomerOwnershipController | |
| 客户总览/批量领取.bru | `POST /api/customer/claim-batch` | a+c | c:type-F | (a) 占位示例:E2E 采集有数据 specimen 回填(票 02 采集清单);(c) failures 类型列是占位符 List<F> 且零展开。修:改 List<CustomerBatchFailItem> 并展开子行 failures[].{id, reason(枚举 CustomerBatchFailReason), message} | crm-customer/CustomerOwnershipController | |
| 客户总览/抛公海.bru | `POST /api/customer/release-pool` | a | | (a) 占位示例(Result<Void>/标量:E2E 采一次真值信封即可,data 结构不会再变丰富) | crm-customer/CustomerOwnershipController | |
| 客户总览/看板列表/看板分组汇总.bru | `POST /api/customer/workspace/board/summary` | ok | | 无缺口(示例真值+结构完整+说明完整) | crm-customer/CustomerWorkspaceController | |
| 客户总览/看板列表/看板单列卡片.bru | `POST /api/customer/workspace/board/cards` | ok | | 无缺口(示例真值+结构完整+说明完整) | crm-customer/CustomerWorkspaceController | |
| 客户总览/读取列偏好.bru | `GET /api/preference/get` | a | | (a) 占位示例:E2E 采集有数据 specimen 回填(票 02 采集清单) | crm-preference/ColumnPreferenceController | |
| 客户总览/读取视图形态.bru | `GET /api/preference/view-form/get` | a | | (a) 占位示例(Result<Void>/标量:E2E 采一次真值信封即可,data 结构不会再变丰富) | crm-preference/ViewFormController | |
| 客户总览/领取客户.bru | `POST /api/customer/claim` | a | | (a) 占位示例(Result<Void>/标量:E2E 采一次真值信封即可,data 结构不会再变丰富) | crm-customer/CustomerOwnershipController | |
| 客户查重/信用代码查重.bru | `GET /api/customer/check-credit-code` | ok | | 无缺口(示例真值+结构完整+说明完整) | crm-customer/CustomerController | 错误码丢失:HEAD 版有「错误码」节本版无(重生成回退),从 git 历史回捞并入票 06 |
| 客户查重/名称相似提示.bru | `GET /api/customer/check-name` | ok | | 无缺口(示例真值+结构完整+说明完整) | crm-customer/CustomerController | 错误码丢失:HEAD 版有「错误码」节本版无(重生成回退),从 git 历史回捞并入票 06 |
| 客户详情/关联商机/关联商机页签.bru | `GET /api/customer/opportunity/page` | ok | | 无缺口(示例真值+结构完整+说明完整) | crm-customer/CustomerDetailController | 跨模块数据:数据源 crm-opportunity(CustomerOpportunityQueryPortImpl inbound port);错误码丢失:HEAD 版有「错误码」节本版无(重生成回退),从 git 历史回捞并入票 06 |
| 客户详情/取消重点标记.bru | `POST /api/customer/unstar` | a | | (a) 占位示例(Result<Void>/标量:E2E 采一次真值信封即可,data 结构不会再变丰富) | crm-customer/CustomerFocusController | |
| 客户详情/团队成员/团队成员页签.bru | `GET /api/customer/member/list` | ok | | 无缺口(示例真值+结构完整+说明完整) | crm-customer/CustomerDetailController | 错误码丢失:HEAD 版有「错误码」节本版无(重生成回退),从 git 历史回捞并入票 06 |
| 客户详情/团队成员/添加团队成员.bru | `POST /api/customer/member/add` | a | | (a) 占位示例(Result<Void>/标量:E2E 采一次真值信封即可,data 结构不会再变丰富) | crm-customer/CustomerDetailController | |
| 客户详情/团队成员/移除团队成员.bru | `POST /api/customer/member/remove` | a | | (a) 占位示例(Result<Void>/标量:E2E 采一次真值信封即可,data 结构不会再变丰富) | crm-customer/CustomerDetailController | |
| 客户详情/客户详情.bru | `GET /api/customer/detail` | ok | | 无缺口(示例真值+结构完整+说明完整) | crm-customer/CustomerController | 非退化复核:12 个 null 均为真可选字段(母客户/等级快照/产品类等),核心全有值——非退化;错误码丢失:HEAD 版有「错误码」节本版无(重生成回退),从 git 历史回捞并入票 06 |
| 客户详情/操作日志/操作日志分页.bru | `GET /api/customer/oplog/page` | ok | | 无缺口(示例真值+结构完整+说明完整) | crm-customer/CustomerDetailController | 错误码丢失:HEAD 版有「错误码」节本版无(重生成回退),从 git 历史回捞并入票 06 |
| 客户详情/标记重点客户.bru | `POST /api/customer/star` | a | | (a) 占位示例(Result<Void>/标量:E2E 采一次真值信封即可,data 结构不会再变丰富) | crm-customer/CustomerFocusController | |
| 客户详情/编辑客户.bru | `POST /api/customer/edit` | a+c | c:DTO-zero | (a) 占位示例:E2E 采集有数据 specimen 回填(票 02 采集清单);(c) similarHits List<CustomerSimilarHitDTO> 零子行。修:展开 similarHits[].{customerId, customerName, ownerName, customerStage, archiveStatus, masked}(照 客户查重/名称相似提示 已展开版抄) | crm-customer/CustomerController | |
| 客户详情/联系人/快速添加联系人.bru | `POST /api/customer/contact/quickAdd` | b+c | b:partial | (b) failedRows=[](全成功路径)。修:补采一次含失败行提交(rowIndex/reason 形态);(c) failedRows List<FailedRow> 零子行。修:展开 failedRows[].{rowIndex, reason} | crm-customer/CustomerContactEnhanceController | 错误码丢失:HEAD 版有「错误码」节本版无(重生成回退),从 git 历史回捞并入票 06 |
| 客户详情/联系人/电话明文查看.bru | `GET /api/customer/contact/reveal` | ok | | 无缺口(示例真值+结构完整+说明完整) | crm-customer/CustomerContactEnhanceController | 错误码丢失:HEAD 版有「错误码」节本版无(重生成回退),从 git 历史回捞并入票 06 |
| 客户详情/联系人/联系人导出.bru | `POST /api/customer/contact/export` | a | | (a) 占位示例(Result<Void>/标量:E2E 采一次真值信封即可,data 结构不会再变丰富) | crm-customer/CustomerContactEnhanceController | |
| 客户详情/联系人/页内批量编辑.bru | `POST /api/customer/contact/batchEdit` | b+c | b:partial | (b) failedRows=[](全成功路径)。修:同上,与快速添加共用失败行 specimen;(c) 同上:failedRows 零子行,展开 {rowIndex, reason} | crm-customer/CustomerContactEnhanceController | 错误码丢失:HEAD 版有「错误码」节本版无(重生成回退),从 git 历史回捞并入票 06 |
| 客户详情/联系人图谱/图谱全量读.bru | `GET /api/customer/contact/graph/detail` | b+c | b:full-core | (b) nodes/edges 双空数组(首读懒建空图 specimen)。修:选有联系人+已存手动边的客户重采,nodes/edges 各≥1 条;(c) nodes List<GraphNodeDTO>/edges List<GraphEdgeDTO> 零子行。修:展开 nodes[].{contactId,name,jobTitleName,jobTitleCategory,level,levelSource,phoneMasked,isKeyContact} + edges[].{parentId,childId} | crm-customer/CustomerContactGraphController | 错误码丢失:HEAD 版有「错误码」节本版无(重生成回退),从 git 历史回捞并入票 06 |
| 客户详情/联系人图谱/图谱整体保存.bru | `POST /api/customer/contact/graph/save` | ok | | 无缺口(示例真值+结构完整+说明完整) | crm-customer/CustomerContactGraphController | 错误码丢失:HEAD 版有「错误码」节本版无(重生成回退),从 git 历史回捞并入票 06 |
| 客户详情/联系人导入/上传导入文件并预校验.bru | `POST /api/customer/contact/import/upload` | c | c:DTO-flat | (c) 同上:rows 子行扁平无前缀。修:改 rows[]. 前缀 | crm-customer/CustomerContactImportController | 错误码丢失:HEAD 版有「错误码」节本版无(重生成回退),从 git 历史回捞并入票 06 |
| 客户详情/联系人导入/下载导入模板.bru | `GET /api/customer/contact/import/template` | a | | (a) 占位示例:E2E 采集有数据 specimen 回填(票 02 采集清单) | crm-customer/CustomerContactImportController | |
| 客户详情/联系人导入/任务结果.bru | `GET /api/customer/contact/import/result` | d | d:missing-field | ContactImportResultDTO.createTime 表缺该行。修:补 createTime 行 | crm-customer/CustomerContactImportController | 非退化复核:failReason null=未失败、creatorName null 可空——非退化;错误码丢失:HEAD 版有「错误码」节本版无(重生成回退),从 git 历史回捞并入票 06 |
| 客户详情/联系人导入/失败明细与重复明细.bru | `GET /api/customer/contact/import/failures` | ok | | 无缺口(示例真值+结构完整+说明完整) | crm-customer/CustomerContactImportController | 错误码丢失:HEAD 版有「错误码」节本版无(重生成回退),从 git 历史回捞并入票 06 |
| 客户详情/联系人导入/最近导入记录.bru | `GET /api/customer/contact/import/page` | a+d | d:missing-field | (a) 占位示例:E2E 采集有数据 specimen 回填(票 02 采集清单);同上(ContactImportResultDTO):补 content[].createTime | crm-customer/CustomerContactImportController | 错误码丢失:HEAD 版有「错误码」节本版无(重生成回退),从 git 历史回捞并入票 06 |
| 客户详情/联系人导入/确认执行导入.bru | `POST /api/customer/contact/import/confirm` | ok | | 无缺口(示例真值+结构完整+说明完整) | crm-customer/CustomerContactImportController | 错误码丢失:HEAD 版有「错误码」节本版无(重生成回退),从 git 历史回捞并入票 06 |
| 客户详情/详情公共头部.bru | `GET /api/customer/detail-head` | d | d:trunc | 7 行说明被引号截断成「…显 \」 dangling(生成器引号转义 bug:原文显 "--")。修:修生成器转义并补全 7 行口径(恒 null 语义本身已在,损失的是断句后半) | crm-customer/CustomerDetailController | 非退化复核:金额/计数 7 字段恒 null 是拍板 A 占位(外部模块未接入),非采集退化——转 (d) 截断行问题;跨模块数据:金额/计数 6 字段占位恒 null,待 A5 项目/方案卡/商机/合同模块 seam;错误码丢失:HEAD 版有「错误码」节本版无(重生成回退),从 git 历史回捞并入票 06 |
| 客户详情/跟进记录/新增跟进.bru | `POST /api/customer/follow/add` | a | | (a) 占位示例(Result<Void>/标量:E2E 采一次真值信封即可,data 结构不会再变丰富) | crm-customer/CustomerDetailController | |
| 客户详情/跟进记录/跟进记录分页.bru | `GET /api/customer/follow/page` | ok | | 无缺口(示例真值+结构完整+说明完整) | crm-customer/CustomerDetailController | 错误码丢失:HEAD 版有「错误码」节本版无(重生成回退),从 git 历史回捞并入票 06 |
| 我的客户/workspace 列表分页.bru | `POST /api/customer/workspace/page` | ok | | 无缺口(示例真值+结构完整+说明完整) | crm-customer/CustomerWorkspaceController | 错误码丢失:HEAD 版有「错误码」节本版无(重生成回退),从 git 历史回捞并入票 06 |
| 我的客户/保存列偏好.bru | `POST /api/preference/save` | a | | (a) 占位示例(Result<Void>/标量:E2E 采一次真值信封即可,data 结构不会再变丰富) | crm-preference/ColumnPreferenceController | |
| 我的客户/保存视图形态.bru | `POST /api/preference/view-form/save` | a | | (a) 占位示例(Result<Void>/标量:E2E 采一次真值信封即可,data 结构不会再变丰富) | crm-preference/ViewFormController | |
| 我的客户/分配客户.bru | `POST /api/customer/assign` | a | | (a) 占位示例(Result<Void>/标量:E2E 采一次真值信封即可,data 结构不会再变丰富) | crm-customer/CustomerOwnershipController | |
| 我的客户/客户分页.bru | `POST /api/customer/page` | a | | (a) 占位示例:E2E 采集有数据 specimen 回填(票 02 采集清单) | crm-customer/CustomerController | |
| 我的客户/客户导入/上传导入文件并预校验.bru | `POST /api/customer/import/upload` | a+c | c:DTO-flat | (a) 占位示例:E2E 采集有数据 specimen 回填(票 02 采集清单);(c) 同上:rows 子行扁平无前缀。修:改 rows[]. 前缀 | crm-customer/CustomerImportController | |
| 我的客户/客户导入/下载导入模板.bru | `GET /api/customer/import/template` | a | | (a) 占位示例:E2E 采集有数据 specimen 回填(票 02 采集清单) | crm-customer/CustomerImportController | |
| 我的客户/客户导入/任务结果.bru | `GET /api/customer/import/result` | d | d:missing-field | 同上:补 createTime 行 | crm-customer/CustomerImportController | 非退化复核:同上——非退化;错误码丢失:HEAD 版有「错误码」节本版无(重生成回退),从 git 历史回捞并入票 06 |
| 我的客户/客户导入/失败疑似重复明细.bru | `GET /api/customer/import/failures` | b | b:full | (b) 同公海版:data=[]。修:同 taskId 重采含失败行 specimen;两份可共用一次采集 | crm-customer/CustomerImportController | 错误码丢失:HEAD 版有「错误码」节本版无(重生成回退),从 git 历史回捞并入票 06 |
| 我的客户/客户导入/最近导入记录.bru | `GET /api/customer/import/page` | d | d:missing-field | 同上:补 content[].createTime | crm-customer/CustomerImportController | |
| 我的客户/客户导入/确认执行导入.bru | `POST /api/customer/import/confirm` | a | | (a) 占位示例(Result<Void>/标量:E2E 采一次真值信封即可,data 结构不会再变丰富) | crm-customer/CustomerImportController | |
| 我的客户/工商信息查询.bru | `GET /api/customer/company-lookup` | a | | (a) 占位示例:E2E 采集有数据 specimen 回填(票 02 采集清单) | crm-customer/CustomerController | 跨模块数据:数据源 StubCompanyLookupPortImpl(crm-customer 内 stub,外部工商 API 未接) |
| 我的客户/归档客户.bru | `POST /api/customer/archive` | a | | (a) 占位示例(Result<Void>/标量:E2E 采一次真值信封即可,data 结构不会再变丰富) | crm-customer/CustomerOwnershipController | |
| 我的客户/快速创建客户.bru | `POST /api/customer/quick-create` | b+c | b:partial | (b) needConfirm/similarHits 双 null(直落库分支)。修:补采名称相似触发 needConfirm=true 分支的 specimen;(c) 同上:similarHits 零子行,展开 6 字段 | crm-customer/CustomerController | 错误码丢失:HEAD 版有「错误码」节本版无(重生成回退),从 git 历史回捞并入票 06 |
| 我的客户/恢复客户.bru | `POST /api/customer/restore` | a | | (a) 占位示例(Result<Void>/标量:E2E 采一次真值信封即可,data 结构不会再变丰富) | crm-customer/CustomerOwnershipController | |
| 我的客户/批量分配.bru | `POST /api/customer/assign-batch` | a+c | c:type-F | (a) 占位示例:E2E 采集有数据 specimen 回填(票 02 采集清单);(c) failures 类型列是占位符 List<F> 且零展开。修:改 List<CustomerBatchFailItem> 并展开子行 failures[].{id, reason(枚举 CustomerBatchFailReason), message} | crm-customer/CustomerOwnershipController | |
| 我的客户/批量归档.bru | `POST /api/customer/archive-batch` | a+c | c:type-F | (a) 占位示例:E2E 采集有数据 specimen 回填(票 02 采集清单);(c) failures 类型列是占位符 List<F> 且零展开。修:改 List<CustomerBatchFailItem> 并展开子行 failures[].{id, reason(枚举 CustomerBatchFailReason), message} | crm-customer/CustomerOwnershipController | |
| 我的客户/批量抛公海.bru | `POST /api/customer/release-pool-batch` | a+c | c:type-F | (a) 占位示例:E2E 采集有数据 specimen 回填(票 02 采集清单);(c) failures 类型列是占位符 List<F> 且零展开。修:改 List<CustomerBatchFailItem> 并展开子行 failures[].{id, reason(枚举 CustomerBatchFailReason), message} | crm-customer/CustomerOwnershipController | |
| 我的客户/批量更新工商信息.bru | `POST /api/customer/company-lookup/batch-update` | a | | (a) 占位示例:E2E 采集有数据 specimen 回填(票 02 采集清单) | crm-customer/CustomerController | 跨模块数据:同上 stub port |
| 我的客户/批量领取.bru | `POST /api/customer/claim-batch` | a+c | c:type-F | (a) 占位示例:E2E 采集有数据 specimen 回填(票 02 采集清单);(c) failures 类型列是占位符 List<F> 且零展开。修:改 List<CustomerBatchFailItem> 并展开子行 failures[].{id, reason(枚举 CustomerBatchFailReason), message} | crm-customer/CustomerOwnershipController | |
| 我的客户/抛公海.bru | `POST /api/customer/release-pool` | a | | (a) 占位示例(Result<Void>/标量:E2E 采一次真值信封即可,data 结构不会再变丰富) | crm-customer/CustomerOwnershipController | |
| 我的客户/新增客户.bru | `POST /api/customer/create` | a+c | c:DTO-zero | (a) 占位示例:E2E 采集有数据 specimen 回填(票 02 采集清单);(c) 同上:similarHits 零子行,展开 6 字段 | crm-customer/CustomerController | |
| 我的客户/看板列表/看板分组汇总.bru | `POST /api/customer/workspace/board/summary` | ok | | 无缺口(示例真值+结构完整+说明完整) | crm-customer/CustomerWorkspaceController | |
| 我的客户/看板列表/看板单列卡片.bru | `POST /api/customer/workspace/board/cards` | ok | | 无缺口(示例真值+结构完整+说明完整) | crm-customer/CustomerWorkspaceController | |
| 我的客户/编辑客户.bru | `POST /api/customer/edit` | a+c | c:DTO-zero | (a) 占位示例:E2E 采集有数据 specimen 回填(票 02 采集清单);(c) 同上:similarHits 零子行,展开 6 字段 | crm-customer/CustomerController | |
| 我的客户/读取列偏好.bru | `GET /api/preference/get` | a | | (a) 占位示例:E2E 采集有数据 specimen 回填(票 02 采集清单) | crm-preference/ColumnPreferenceController | |
| 我的客户/读取视图形态.bru | `GET /api/preference/view-form/get` | a | | (a) 占位示例(Result<Void>/标量:E2E 采一次真值信封即可,data 结构不会再变丰富) | crm-preference/ViewFormController | |
| 我的客户/领取客户.bru | `POST /api/customer/claim` | a | | (a) 占位示例(Result<Void>/标量:E2E 采一次真值信封即可,data 结构不会再变丰富) | crm-customer/CustomerOwnershipController | |
| 战略协议/删除战略协议.bru | `POST /api/customer/agreement/delete` | a | | (a) 占位示例(Result<Void>/标量:E2E 采一次真值信封即可,data 结构不会再变丰富) | crm-customer/CustomerAgreementController | |
| 战略协议/战略协议详情.bru | `GET /api/customer/agreement/detail` | a | | (a) 占位示例:E2E 采集有数据 specimen 回填(票 02 采集清单) | crm-customer/CustomerAgreementController | 错误码丢失:HEAD 版有「错误码」节本版无(重生成回退),从 git 历史回捞并入票 06 |
| 战略协议/战略协议页签列表.bru | `GET /api/customer/agreement/list` | a | | (a) 占位示例:E2E 采集有数据 specimen 回填(票 02 采集清单) | crm-customer/CustomerAgreementController | 错误码丢失:HEAD 版有「错误码」节本版无(重生成回退),从 git 历史回捞并入票 06 |
| 战略协议/新增战略协议.bru | `POST /api/customer/agreement/create` | a | | (a) 占位示例(Result<Void>/标量:E2E 采一次真值信封即可,data 结构不会再变丰富) | crm-customer/CustomerAgreementController | |
| 战略协议/编辑战略协议.bru | `POST /api/customer/agreement/edit` | a | | (a) 占位示例(Result<Void>/标量:E2E 采一次真值信封即可,data 结构不会再变丰富) | crm-customer/CustomerAgreementController | |
| 联系人/保存列偏好.bru | `POST /api/preference/save` | a | | (a) 占位示例(Result<Void>/标量:E2E 采一次真值信封即可,data 结构不会再变丰富) | crm-preference/ColumnPreferenceController | |
| 联系人/保存视图形态.bru | `POST /api/preference/view-form/save` | a | | (a) 占位示例(Result<Void>/标量:E2E 采一次真值信封即可,data 结构不会再变丰富) | crm-preference/ViewFormController | |
| 联系人/删除联系人.bru | `POST /api/customer/contact/delete` | a | | (a) 占位示例(Result<Void>/标量:E2E 采一次真值信封即可,data 结构不会再变丰富) | crm-customer/CustomerContactController | |
| 联系人/新增联系人.bru | `POST /api/customer/contact/create` | a | | (a) 占位示例(Result<Void>/标量:E2E 采一次真值信封即可,data 结构不会再变丰富) | crm-customer/CustomerContactController | |
| 联系人/电话软提示.bru | `GET /api/customer/contact/check-phone` | ok | | 无缺口(示例真值+结构完整+说明完整) | crm-customer/CustomerContactController | |
| 联系人/编辑联系人.bru | `POST /api/customer/contact/edit` | a | | (a) 占位示例(Result<Void>/标量:E2E 采一次真值信封即可,data 结构不会再变丰富) | crm-customer/CustomerContactController | |
| 联系人/联系人全局搜索.bru | `GET /api/customer/contact/search` | ok | | 无缺口(示例真值+结构完整+说明完整) | crm-customer/CustomerContactController | 同上 jobTitleLevel 值域缺失 |
| 联系人/联系人详情.bru | `GET /api/customer/contact/detail` | a | | (a) 占位示例:E2E 采集有数据 specimen 回填(票 02 采集清单) | crm-customer/CustomerContactController | ContactDTO.jobTitleLevel 仅「职务层级(可空)」无值域——源码 @Schema 本身没写,需补源码或文档注明取值 |
| 联系人/读取列偏好.bru | `GET /api/preference/get` | a | | (a) 占位示例:E2E 采集有数据 specimen 回填(票 02 采集清单) | crm-preference/ColumnPreferenceController | |
| 联系人/读取视图形态.bru | `GET /api/preference/view-form/get` | a | | (a) 占位示例(Result<Void>/标量:E2E 采一次真值信封即可,data 结构不会再变丰富) | crm-preference/ViewFormController | |
| 联系人/顶级联系人列表.bru | `GET /api/customer/contact/page` | ok | | 无缺口(示例真值+结构完整+说明完整) | crm-customer/CustomerContactController | 同上 jobTitleLevel 值域缺失 |
## 汇总统计
### 各类型计数(按文件,一文可多类)
| 类型 | 文件数 | 说明 |
| --- | --- | --- |
| (a) 占位示例 | 79 | 其中 Result<Void>/标量端点只需采信封真值;有载荷端点需采有数据 specimen |
| (b) 退化示例 | 7 | full×3(整载荷空)/ partial×4(关键子结构空:failures/failedRows/similarHits/nodes+edges) |
| (c) 嵌套未展开 | 26 | 类型占位 List&lt;F&gt;×13(failures)/ 具名DTO零展开×7(similarHits×4、nodes+edges×1、failedRows×2)/ 扁平无前缀×6(DetailRow×3、Row×3) |
| (d) 说明不清晰 | 10 | 引号截断行×1 文件 7 行 / 表缺 createTime 行×9 文件 / 值域薄弱备注×3 文件 |
| ok 无缺口 | 22 | 示例真值 + 结构完整 + 说明完整 |
### 按子目录分布(文件数 / 其中 a·b·c·d)
| 子目录 | 总文件 | a | b | c | d | ok |
| --- | --- | --- | --- | --- | --- | --- |
| 客户交割 | 6 | 2 | 1 | 4 | 3 | 1 |
| 客户公海 | 24 | 20 | 1 | 5 | 2 | 1 |
| 客户总览 | 17 | 14 | 0 | 4 | 0 | 3 |
| 客户查重 | 2 | 0 | 0 | 0 | 0 | 2 |
| 客户详情 | 24 | 9 | 3 | 5 | 3 | 9 |
| 我的客户 | 28 | 21 | 2 | 8 | 2 | 3 |
| 战略协议 | 5 | 5 | 0 | 0 | 0 | 0 |
| 联系人 | 11 | 8 | 0 | 0 | 0 | 3 |
### 错误码节回退(额外发现,票 06 输入)
本工作树是对 HEAD 的整体重写(117 文件全改)。对照 git 历史:HEAD 有「错误码」节的 78 文件 → 现仅 48 文件,**30 文件的错误码节在重生成时丢失**(上表备注列已逐文件标注「错误码丢失」,可 grep)。修法:从 `git show HEAD:<file>` 回捞错误码节并与现源码 @Controller 错误码枚举比对后合并。
### 模块归属
- crm-customer(/api/customer/*,13 个 Controller):101 文件
- crm-preference(/api/preference/*,ColumnPreferenceController + ViewFormController):16 文件(列偏好/视图形态读写,被 4 个分区复用)
- 跨模块数据依赖(Controller 仍在 crm-customer,但响应数据来自别处):关联商机页签 ← crm-opportunity inbound port;工商信息查询/批量更新 ← StubCompanyLookupPortImpl(stub);详情公共头部金额字段 ← A5 项目/方案卡/商机/合同 seam(恒 null 占位)