# 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|unstar` | `POST /api/customer/focus?id=` 等(PATH_OP 扁平化) | F-09 | | `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` 绑定,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 报告对账附录如实记录覆盖面即可;若用户要求扩,另起票