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.
89 lines
8.4 KiB
89 lines
8.4 KiB
|
3 days ago
|
# 票 04 — 客户核心域实测报告(F-01..F-12)
|
||
|
|
|
||
|
|
- 执行:`e2e-core.py`(112 用例,23.2s,2026-09-03 23:07 终轮)
|
||
|
|
- 服务:本地 8080(jar 20260903 22:02 打包,verify profile)+ 远程共享库 8.129.84.155
|
||
|
|
- 数据:票 03 seed(e2c- 17 客户 KH202609030006-0022 + 2 商机 + 4 联系人);操作人 admin(罗伟健,唯一角色 ROLE_ADMIN data_scope=4)/ BUDDY(曾偲青,无任何角色)
|
||
|
|
- 明细:`e2e-core-checks.json`(逐用例);示例请求/响应:`specimens-core.json`(45 端点,按 METHOD+归一化路径去重,票 06 注入素材)
|
||
|
|
|
||
|
|
## 一、结论概览
|
||
|
|
|
||
|
|
| 结论 | 数量 |
|
||
|
|
|---|---|
|
||
|
|
| ✅ 通过 | **110** |
|
||
|
|
| ⚠ 行为不符(缺陷已登记) | **2** |
|
||
|
|
| ❌ 缺失/阻断 | **0** |
|
||
|
|
|
||
|
|
**核心域 12 流程全部走通**:三 workspace 列表/看板/saved-view、新增+三层查重、编辑、联系人、详情头部+页签、跟进、关注/重点、团队成员、归属动作、商机侧硬依赖三端点。0 阻断。
|
||
|
|
|
||
|
|
## 二、缺陷登记(票 04 新增 D-02 / D-03)
|
||
|
|
|
||
|
|
> D-01(P0,pool/page 500)已在票 02 顺手修复并于本票 F-01/F-07 复验通过(公海 200 + 交割-甲 opportunityCount==1)。
|
||
|
|
|
||
|
|
### D-02(P2)跟进 nextFollowTime 早于当前未拦截
|
||
|
|
|
||
|
|
- **接口**:`POST /api/customer/{id}/follow`(CustomerFollowController → CustomerDetailController /{id}/follow)
|
||
|
|
- **现象**:`nextFollowTime=2026-09-01T10:00:00`(已过去)返回 code=0 落库成功;该客户随即进入 FOLLOW_UP_DUE 视图(实测 e2c-全字段-科技 被命中),且因 append-only 无改删口,**提醒永远无法消除**
|
||
|
|
- **期望**:spec F-08「nextFollowTime 早于本次 → 67009」
|
||
|
|
- **复现**:e2e-core.py f08 用例「nextFollowTime 早于当前 → 67009」;content 空/30s 防重两个 67009 校验均正常,唯独过去时间未校验
|
||
|
|
- **建议**:addFollow 入口补 `nextFollowTime > now` 校验(对称 content 空校验位置)
|
||
|
|
|
||
|
|
### D-03(P2)编辑缺 version 报 67001,spec 约定 67005
|
||
|
|
|
||
|
|
- **接口**:`PUT /api/customer/{id}`
|
||
|
|
- **现象**:必填齐全但缺 `version` → 返回 **code=67001**「缺少乐观锁版本号」;spec D-06 定义 CAS 缺失为 **67005**
|
||
|
|
- **语义**:可达(message 明确),但错误码与 spec 不符——前端若按 code 分流提示(67005=请刷新重试)会踩坑
|
||
|
|
- **复现**:e2e-core.py f05 用例「CAS version 缺失 → 67005」
|
||
|
|
- **建议**:补专用错误码 67005,或 spec/前端文档按 67001 口径修正(二选一对齐)
|
||
|
|
|
||
|
|
## 三、已知缺口复现(预登记,不算新缺陷)
|
||
|
|
|
||
|
|
| 缺口 | 实测确认 | 用例 |
|
||
|
|
|---|---|---|
|
||
|
|
| QuickCreateDTO 无 confirmSimilar | 命中相似返回 needConfirm=true,带 `confirmSimilar=true` 重发**仍 needConfirm**(表单字段不存在被忽略)→ 商机弹窗快创遇相似名无解,只能改名 | f12 |
|
||
|
|
| 详情汇总卡 5 字段恒 null(不符④拍板 A 占位) | wonProjectAmount/planEstimateAmount/ongoingOpportunityAmount/contractAmount/paidAmount 全 null;projectCount 同 | f07 |
|
||
|
|
| company-lookup 为 stub | 返回 code=40001 空实现(D5 划出仅 seam),不炸 | f04 |
|
||
|
|
|
||
|
|
## 四、契约发现(票 06 Bruno 文档直接消费)
|
||
|
|
|
||
|
|
1. **LocalDateTime form 绑定 = ISO `T` 分隔**(`2026-09-10T10:00:00`);空格分隔 400。全工程一致(seed 已证)。
|
||
|
|
2. **Long→String 序列化**:id/total/opportunityCount/cnt 等长数值字段均为字符串数字(`"750844488313733120"`、`"23"`)——前端比较/判断需 int() 转换。
|
||
|
|
3. **board/summary 计数字段名 = `cnt`**(字符串数字),行结构 `{"groupValue": 1, "cnt": "16"}`。
|
||
|
|
4. **PUT 编辑 = 全量覆盖语义**:只提交部分字段会把未提交的可空字段**清空**(oplog 叙事「把人脉关系单位从[标杆客户,同行推荐]修改为空…」)。前端编辑页必须全量回显提交;文档需显式标注。
|
||
|
|
5. **assign 的 oplog action = `TRANSFER`**(非 ASSIGN);11 种 action 白名单实测确认(CREATE/UPDATE/FOLLOW/ARCHIVE/RESTORE/TRANSFER/CLAIM/POOL/STAGE_CHANGE/MEMBER_ADD/MEMBER_REMOVE)。
|
||
|
|
6. **customer_team_member.delete_key 语义**:活跃=0;软删行 delete_key=被删行自身 id(复用键,重加后旧行不复活、新行 delete_key=0)。
|
||
|
|
7. **公海生命周期写 enter_pool_time**:创建即公海、抛公海均落当下时间(实测 23:06:12);领取清空。claim 的 D25 锚点(last_valid_follow_time)为空时赋当下。
|
||
|
|
8. **批量归档 = 整批预检整体拒绝**:archive-batch 含阻断户(有进行中商机)时直接抛 67006 整批不执行(非 BatchResult 部分成功);claim/assign/release 批量为逐条独立事务。
|
||
|
|
9. **归属校验顺序**:公海态校验(67004「客户已被领取,不在公海」)先于权限语义——BUDDY(无角色)领取已被领客户得到 67004 而非 403;单设备/权限对写动作的拦截面票 05 交割流程再观察。
|
||
|
|
10. **debug/token 瞬时故障会返回非 200**(远程 Redis Connection reset)——调用方必须重试;脚本已内置 3 次重试 + fail fast。
|
||
|
|
11. **saved-view 应用 = 过滤叠加不改 DataScope**(f03 实测:mine 视图 contains「超期」命中仅 e2c-提醒-超期);删除后应用已删 viewId 不炸(静默按无视图处理)。
|
||
|
|
12. **名称相似算法对「仅数字段不同」判相似**(e2c-快创-447762 vs e2c-快创-448xxx 命中 needConfirm),对「核心词 + 长后缀」(恒信达科技股份有限XXXX公司)不命中——测试造名与前端演示需避开数字尾巴。
|
||
|
|
|
||
|
|
## 五、分流程结果
|
||
|
|
|
||
|
|
| 流程 | 用例 | 结论 | 要点 |
|
||
|
|
|---|---|---|---|
|
||
|
|
| F-01 三 workspace 列表 | 12 | ✅ 全过 | overview/mine(三视图)/pool 分页字段齐;keyword/阶段/归档过滤;D19 默认排除已归档;公海 enterPoolTime 有值 |
|
||
|
|
| F-02 看板三分组 | 7 | ✅ 全过 | stage 三列齐;summary 与 page total 自洽(23==23);cards 取卡命中;越界 groupColumn 静默 |
|
||
|
|
| F-03 saved-view | 10 | ✅ 全过 | 三 scope 互不影响;save(JSON body)/应用/set-default/delete;删除后应用不炸 |
|
||
|
|
| F-04 新增+三层查重 | 9 | ✅ 全过 | L1 check-name/credit-code;L2 needConfirm 弹窗(未落库)→ confirmSimilar 落库;L3 67003 硬拦;编号 KH+8+4 |
|
||
|
|
| F-05 编辑 | 5 | ⚠ D-03 | 回显/version 缺失→67001(偏差);正常编辑+oplog 旧→新叙事;改信用代码撞 simA 67003 |
|
||
|
|
| F-06 联系人 | 9 | ✅ 全过 | 非法手机号 67001;67002;page/search 电话命中 2 条;check-phone 跨客户 2 条;W-01 source 回显;PUT/DELETE |
|
||
|
|
| F-07 详情头部+页签 | 8 | ✅ 全过 | 头部项齐;汇总卡 5 null 占位;**D-01 复验 opportunityCount==1**;opportunities port 反查;oplog 值域白名单;67002 |
|
||
|
|
| F-08 跟进 | 12 | ⚠ D-02 | 空 content 67009;过去 next 未拦(D-02);写入+D25 锚点刷新;倒序/筛选;30s 防重 67009;摘要联动;append-only 无编辑口 |
|
||
|
|
| F-09 关注/重点 | 7 | ✅ 全过 | focus 幂等单行;star 建行 starred=1;unstar 保行置 0;focus-batch×3;FOCUSED 视图命中;unfocus 物理删连带清标;不写 oplog |
|
||
|
|
| F-10 团队成员 | 10 | ✅ 全过 | OWNER 在前;名单空/含负责人/重复 67016 整批拒;添加/软删(delete_key=id)/重加复用;MEMBER_ADD/REMOVE 留痕 |
|
||
|
|
| F-11 归属动作 | 17 | ✅ 全过 | claim+D25;重复领 67004;assign 本人 67012、正常换绑;67007/67006 阻断;抛公海清 owner 保部门锚点;archive-batch 整批拒;archive/restore |
|
||
|
|
| F-12 商机侧硬依赖 | 7 | ✅ 全过 | quick-create 七必填+默认值;已知缺口复现;search 三维/类型/排除(按 id 验证生效);contacts 带出 |
|
||
|
|
|
||
|
|
## 六、观察点(维持挂账)
|
||
|
|
|
||
|
|
- **W-01**(票 03 起):contact_source 字典组缺失但联系人创建不校验 source,回显原值 `contact_source_01`——联调时前端下拉将无数据源,等字典补种或口径拍板。
|
||
|
|
- **跨用户权限语义**:环境仅一个角色(ROLE_ADMIN),RBAC 多角色矩阵无法实测;本票仅确认 BUDDY(无角色)走业务校验路径(67004),完整越权矩阵留给联调环境。
|
||
|
|
- **PUT 全量覆盖语义**(契约发现 4):非缺陷(编辑页全量回显即安全),但前端联调高发坑,demo 与 Bruno 文档将显式标注。
|
||
|
|
|
||
|
|
## 七、产物
|
||
|
|
|
||
|
|
- `e2e-core.py` — 112 用例可重跑(幂等:F-12 自清历史快创;F-11 自还原归属/归档态)
|
||
|
|
- `e2e-core-checks.json` — 逐用例三档明细
|
||
|
|
- `specimens-core.json` — 45 端点真实请求/响应(票 06 按端点注入)
|