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.

87 lines
5.0 KiB

5 days ago
## Answer
**Status: resolved**
### A. 客户详情页骨架(定稿)
**公共头部**(8 页签共享):客户名称 / 客户阶段(只读条) / 客户星级 / 关系星级 / 战略协议等级(快照) / 已成交VIP等级(快照) / 客户档案状态 / 销售负责人+部门 / 最近跟进摘要 / 待跟进提醒(下次跟进时间) / 关联业务计数(1商机/1项目)。
**汇总卡片**(4 张,均外部模块提供,接口失败显"--"+重试,不显 0):已中标项目总额(A5) / 跟进中方案预估总额(方案卡) / 进行中商机总额(crm-opportunity) / 合同总额·累计回款(预留占位显"--")。
**8 页签**(默认进「客户信息」;首次打开才加载,切回保留条件/分页):
| # | 页签 | 数据源 | 本图 |
|---|---|---|---|
| 1 | 客户信息 | 主表(票 02) | ✅ |
| 2 | 联系人 | `GET /api/customer/{id}/contacts`(票 06) | ✅ |
| 3 | 跟进记录 | `customer_follow`(B) | ✅ |
| 4 | 关联商机 | 反查 crm-opportunity(C) | ✅ |
| 5 | 关联项目 | A5 项目模块 | ❌ 骨架显"--" |
| 6 | 战略协议 | 战略协议子域 | ❌ 骨架显"--" |
| 7 | 团队成员 | 负责人+协同人(D) | ✅ |
| 8 | 操作日志 | `customer_oplog`(E) | ✅ |
### B. 跟进记录 `customer_follow`(定稿)
| Java 字段 | 列名 | 类型 | 必填 | 说明 |
|---|---|---|---|---|
| id | id | bigint | | 主键 |
| customerId | customer_id | bigint | ✅ | 客户 ID |
| followWay | follow_way | varchar(20) | ✅ | 跟进方式字典 `follow_way`:微信/拜访/电话/邮件/会议 |
| followContent | follow_content | text | ✅ | 跟进内容 |
| nextFollowTime | next_follow_time | datetime | | 下次跟进时间(有则进"待跟进"筛选) |
| followBy / followByName / followDeptName | follow_by / follow_by_name / follow_dept_name | — | | 跟进人快照(对称商机跟进范式) |
| createTime | create_time | — | | 跟进时间(=创建时间,不可改) |
> 无孤立单大写字母陷阱。`nextFollowTime`→`next_follow_time` ✅。
**约束**:
- 提交后**不可修改/删除**;纠错 = 新增补充记录(原型 7 明文)。
- 提交中禁止重复提交(原型公共规则)。
- **写库副作用(关键)**:`customer.last_valid_follow_time = now`(超期提醒锚点刷新,票 10 回填);更新"待跟进"状态。
**契约**:
```
POST /api/customer/{id}/follow 新增跟进(刷新 last_valid_follow_time)
GET /api/customer/{id}/follow/page 跟进记录分页(时间倒序 + 日期分组;按 follow_way/关键字/时间范围过滤)
```
### C. 关联商机页签(定稿,只读反查)
- 数据源:**反查 crm-opportunity**(按 `customer_id` 查该客户全部商机)。
- 列:商机名称 / 商机编号 / 阶段 / 预计金额 / 销售负责人 / 最近更新;点商机名跳 crm-opportunity 商机详情(新窗口)。
- **只读**,不在客户详情内做商机写操作(对称:商机详情反查客户也只是带出)。
- 接口失败显"--" + 重试,不显 0 条。
### D. 团队成员页签(定稿)
- 数据:销售负责人(owner_user_id 快照)+ 协同人列表(团队成员关联表)。
- 展示:姓名 / 部门 / 角色(负责人/协同人);`GET /api/customer/{id}/members`。
### E. 操作日志 `customer_oplog`(定稿,对称商机 oplog 范式)
| Java 字段 | 列名 | 类型 | 说明 |
|---|---|---|---|
| id | id | bigint | 主键 |
| customerId | customer_id | bigint | 客户 ID |
| action | action | varchar(50) | 动作类型:CREATE/UPDATE/FOLLOW/ARCHIVE/RESTORE/TRANSFER/CLAIM/POOL/STAGE_CHANGE |
| detail | detail | varchar(1000) | 变更描述,形态 `把 {字段} 从 {旧} 修改为 {新}`(原型 8 明文) |
| operatorId / operatorName / operatorDeptName | operator_id / operator_name / operator_dept_name | — | 操作人快照 |
| createTime | create_time | — | 操作时间 |
- **只追加、不可改删**;`GET /api/customer/{id}/oplog/page`(时间倒序 + 日期分组 + 关键字/时间范围过滤)。
- **保留策略(§5.5 拍板 A,20260902)**:`customer_oplog` **无限期保留**(审计日志,不设保留期/清理/归档;不做冷热分离)。依据:原型 L250「日志生成后不可修改或删除」= append-only 审计;字段级日志量可控。
- **写 oplog 的动作**(回填各票):新增/编辑(票 02)/ 归属迁移·归档·恢复·领取·分配·抛公海(票 03)/ 阶段变化 operator=系统(票 05)/ 交割(票 08)。
### F. 回填 / 下游
- **票 02**:`last_valid_follow_time` 已含(B 刷新)。
- **票 03**:归属迁移写 oplog(E)。
- **票 05**:阶段变化写 oplog(operator=系统)。
- **票 10**:跟进刷新锚点 → 超期提醒计时重启(B 副作用)。
- **crm-dict**:新增 `follow_way` 分组(微信/拜访/电话/邮件/会议)。
### G. 挂号 — 已随 grill 全部销号
1. ~~汇总卡片占位渲染~~ **已拍板(grill Q18)**:一律渲染卡片,值显"--"(不显 0/不留白),保持布局稳定。