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.
 
 
 
 
 
 

8.7 KiB

r2 套件改写 · 矩阵刷新表 + 缺陷用例处置表(票 01 产出)

日期:2026-09-05 | 产物:e2e-core-r2.py(884 行)/ e2e-heavy-r2.py(910 行),原地复制 r2 版本于 .scratch/customer-e2e/,结果落 customer-e2e-r2/ 契约权威:.scratch/customer-module/API-SUMMARY.md(73 端点);映射坑位复用 demo 票 10 对照表 静态对账:calls-r2.json(55 调用端点 = 54 命中基准 + 1 预期例外,零未命中)

一、改写映射总表(round-1 → r2)

URL / method 层(34 处调用形态变更)

round-1 旧形态 r2 新形态 所在流程
POST /api/customer/workspace/{ws}/page POST /api/customer/workspace/page + 表单字段 workspace F-01/F-02/F-03/F-09/F-15
POST .../workspace/{ws}/board/summary/board/cards POST .../workspace/board/summary/board/cards + 表单 workspace F-02
POST /api/customer(新建)×3 POST /api/customer/create F-04/F-16
GET /api/customer/{id}(详情回显) GET /api/customer/detail?id= F-05
PUT /api/customer/{id} ×3 POST /api/customer/edit?id=(CAS:version+isBizNegotiated+isChild) F-05
GET /api/customer/{id}/oplog/page ×6 GET /api/customer/oplog/page?id= F-05/F-07/F-09/F-10/F-11
POST /api/customer/contact ×3 POST /api/customer/contact/create F-06
PUT /api/customer/contact/{cid} POST /api/customer/contact/edit?id= F-06
DELETE /api/customer/contact/{cid} POST /api/customer/contact/delete?id= F-06
GET /api/customer/{id}/detail-head ×6 GET /api/customer/detail-head?id= F-07/F-08/F-11
GET /api/customer/{id}/opportunities GET /api/customer/opportunity/page?id= F-07
POST /api/customer/{id}/follow ×5 POST /api/customer/follow/add?id= F-08/F-15
GET /api/customer/{id}/follow/page ×2 GET /api/customer/follow/page?id= F-08
PUT /api/customer/{id}/follow/{fid}(append-only 探测) POST /api/customer/follow/edit?id=(未注册端点,断言非 0) F-08
`POST /api/customer/{id}/focus unfocus star
GET /api/customer/{id}/members GET /api/customer/member/list?id= F-10
POST /api/customer/{id}/members ×4 POST /api/customer/member/add?id= + memberUserIds 数组表单 F-10
DELETE /api/customer/{id}/members/{uid} ×2 POST /api/customer/member/remove?id=&memberUserId= F-10
GET /api/customer/transfer/{tid} ×2 GET /api/customer/transfer/detail?id= F-13
GET /api/customer/transfer/{tid}/assignable GET /api/customer/transfer/assignable?id=(D-07 缺陷模式) F-13
POST /api/customer/transfer/{tid}/assign ×5(form 多值) POST /api/customer/transfer/assign?id=&customerIds=&assignUserId=(params 多值,List<Long> 绑定,Controller 签名实核) F-13
POST /api/customer/import/{taskId}/confirm POST /api/customer/import/confirm?taskId= F-14
GET /api/customer/import/{taskId} GET /api/customer/import/result?taskId= F-14
GET /api/customer/import/{taskId}/failures GET /api/customer/import/failures?taskId= F-14
PUT /api/rule/customer/reminder(@RequestBody JSON)×5 POST /api/rule/customer/reminder/save(表单五字段) F-15

参数 / 出参层(4 处语义变更)

round-1 r2 依据
company-lookup 参数名 keyword companyName API-SUMMARY §2.3 钉死
联系人必填 create 可缺 phone 补齐 phone(幽灵/待删用例) ContactDTO 必填 name/jobTitleName/phone(返工冒烟实测)
members 出参 role 字段 roleType(探测式断言) role(显式断言,值 OWNER/COLLABORATOR) CustomerMemberDTO 改名(demo 票 10 实测)
restart_service JVM 钉死 IDEA JBR 路径 候选列表 + PATH java 兜底 换机容错
import _upload 固定 importMode duplicate_strategy 可选形参(默认不传) 票 02 F8 增量用例 seam

同形不改(4 族)

  • Ownership 族:claim / claim-batch / assign / release-pool / archive / archive-batch / restore(返工前已扁平)
  • preference saved-view 族:view/list、view/save(全平台唯一 @RequestBody JSON 例外,§2.14)、set-default、delete
  • check 族:check-name、check-credit-code、contact/check-phone、contact/page、contact/search
  • import upload / template / page、transfer preview / initiate / page

二、断言语义变更记录(7 处)

用例 round-1 断言 r2 断言 变更原因
F-07 oplog 白名单 ⊆ 11 种 17 种(+CONTACT_×3 / AGREEMENT_×3) 返工 F10 + 票 12(API-SUMMARY §3,OplogPageParam @Schema 描述仍写 11 种系代码侧滞后,以 17 种真值为准)
F-08 append-only PUT /{id}/follow/{fid} 不成功 POST /follow/edit?id=(未注册)非 0 端点族形态变化;语义等价强化——任何 follow 编辑口成功 = append-only 被破坏
F-10 负责人首位 roleType 探测 role 显式 字段改名
F-12 confirmSimilar 缺口复现 「无 confirmSimilar 无法仍要创建」(needConfirm 卡死=预期) 翻转:needConfirm 后带 confirmSimilar=true 重发 → 落库回 id 返工票 04 销缺口(CustomerQuickCreateDTO.confirmSimilar 已透传)
F-16 16.5 查重单例 「单例未落地,出厂默认兜底」 「单例已落地(返工票 04),RuleBackedCustomerDedupSettingProvider @Primary 读单例」;配置面 get/save 归票 02 返工票 04 改变前提
F-06 幽灵客户 缺 phone 直发(若必填校验先行会 67001 干扰) 补 phone,断言聚焦 67002 存在性语义 必填实测
D-08(原 round-1 core F-11 越权观察点登记 D-02) 编号 D-02 改编 D-08 round-1 core 内 D-02 与 heavy F-08 跟进过期 D-02 编号冲突占用;r2 续编消歧(聚合报告归票 06 处理历史编号)

三、缺陷用例处置表

缺陷 状态 r2 用例 r2 预期
D-01(P1 关联商机计数) round-1 后已修 core F-07 复验断言原样 预期转绿(opportunityCount==1)
D-02(P2 跟进过期未拦截) 维持原状 core F-08 双分支保留(67009→pass / 0→warn+defect) 可能复现(warn 不阻断)
D-03(P2 编辑缺 version 报 67001) 维持原状 core F-05 分支保留(67005→pass / 67001+乐观锁→warn+defect) 可能复现
D-04(P2 fail_reason 超长) 维持原状 heavy F-14 伴随 D-05 观测 复现不单独断言
D-05(P1 is_biz_negotiated NOT NULL) 维持原状(API-SUMMARY §5.7) heavy F-14.11-14.13 缺陷验证模式(FAILED→warn+defect,r1 文案收敛为「复现」) 预期复现,不阻断
D-06(P1 导入分页查不到本人任务) 维持原状 heavy F-14.14 缺陷验证模式 预期复现,不阻断
D-07(P1 assignable 超时) 维持原状 heavy F-13.10 缺陷验证模式(30s×2 双试,超时→warn+defect;票 04 现场定 heavy 执行深度) 预期复现,不阻断
新缺陷 D-xx 从 D-08 续编 只报告不修复

四、静态验收(票 01 要点 4)——PASS

  1. grep 零旧契约残留:'PUT'|'DELETE' 方法字面量 0;sess.put|sess.delete 0;URL f-string 路径拼接(/api/customer/{{cid} 等)0(7 处初筛命中均为注释与 check detail 文案,非调用形态)
  2. 调用×端点对账:55 调用端点 = 54 命中 dump_api_out.txt + 1 预期例外(POST /api/customer/follow/edit,append-only 断言的故意未注册端点);零未命中calls-r2.json
  3. 客户域 73 端点未覆盖 19 个,其中 10 个 = 票 02 增量范围(agreement×5、dedup get/save、view-form get/save、company-lookup 的 batch-update),9 个为 round-1 即未覆盖的维持项(ping、POST /api/customer/page、contact/detail、列偏好 get/save、claim/assign/release-pool 批量三兄弟、reminder 读端点——旧套件 PUT 读写一体,返工拆分后未补读)——票 06 对账附录显式列出
  4. 语法:两脚本 py_compile PASS;UTF-8 无 BOM

五、遗留与移交

  • 票 02:上述 10 端点新用例 + upload duplicateStrategy 变体 + detail-head viewTouch 副作用断言 + oplog action 值域断言;core F-12 已含 confirmSimilar 主断言,票 02 可引用或细化
  • 票 04:core→heavy→增量执行顺序;heavy 六轮执行深度(D-07 计时)现场定
  • 未覆盖维持 9 端点是否补测:不进票 02 票面(超出 charting 拍板范围),票 06 报告对账附录如实记录覆盖面即可;若用户要求扩,另起票