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.
 
 
 
 
 

143 lines
15 KiB

== 客户核心域 E2E(r2 契约改写版)== e2c 客户 17 个
== F-01 三 workspace 列表 ==
pass [F-01] overview 分页返回 content/total — total=37 e2c行=14
pass [F-01] 行字段齐(编号/名称/阶段/双星级/负责人/关联业务计数) — 缺列=[]
pass [F-01] admin(data_scope=4)可见 stage2 样例 — id=750844474023739392
pass [F-01] mine ASSIGNED 含交割-甲/乙/丙(admin 负责人) — e2c命中=['e2c-交割-丙', 'e2c-交割-乙', 'e2c-交割-甲', 'e2c-全字段-科技', 'e2c-恒信达科技有限公司', 'e2c-恒信达科技有限责任公司', 'e2c-成员-样例', 'e2c-提醒-超期', 'e2c-星级-五星', 'e2c-跟进-待办', 'e2c-阶段-成交-丙', 'e2c-阶段-潜在-甲', 'e2c-阶段-重潜-乙']
pass [F-01] mine ASSIGNED 排除协同样例(owner≠当前用户) — 协同样例 owner=曾偲青
pass [F-01] COLLABORATING 视图命中协同样例(admin 是协同人) — e2c命中=['e2c-协同-样例']
pass [F-01] FOLLOW_UP_DUE 视图命中提醒-超期(next_follow_time 已过) — e2c命中=['e2c-全字段-科技', 'e2c-提醒-超期', 'e2c-跟进-待办']
pass [F-01] 公海列表 e2c 2 条且 enterPoolTime 有值(可排序) — e2c公海=2 enterPoolTime全有值=True
pass [F-01] keyword 检索「恒信达」命中相似对 — 命中=['e2c-恒信达科技有限公司', 'e2c-恒信达科技有限责任公司']
warn [F-01] customerStage=2 精确过滤 — 命中=['东莞松山湖精密制造有限公司', '成都熊猫慢递文化传播有限公司', '广州珠江光电科技有限公司', '武汉江城物流股份有限公司', '深圳蓝湾冷链供应链有限公司', 'e2c-阶段-重潜-乙']
pass [F-01] archiveStatus 缺省=1 默认排除已归档(D19)
pass [F-01] archiveStatus=2 可见已归档
== F-02 看板三分组 ==
pass [F-02] board/summary groupColumn=stage(阶段)返回有数据分组 — groups=[1, 2, 3] sum=37
pass [F-02] 阶段 三列齐(潜在/重潜/已成交)
pass [F-02] board/summary groupColumn=star(客户星级)返回有数据分组 — groups=[1, 2, 3, 4, 5] sum=37
pass [F-02] board/summary groupColumn=relation(关系星级)返回有数据分组 — groups=[1, 2, 3, 4, 5] sum=37
pass [F-02] summary 总数与 page total 自洽(同 WHERE 口径) — summary=37 page=37
pass [F-02] board/cards stage=2 取卡命中重潜样例 — 卡片=['东莞松山湖精密制造有限公司', '成都熊猫慢递文化传播有限公司', '广州珠江光电科技有限公司', '武汉江城物流股份有限公司', '深圳蓝湾冷链供应链有限公司', 'e2c-阶段-重潜-乙']
pass [F-02] groupColumn 越界静默忽略(不炸)
== F-03 saved-view 自定义检索 ==
pass [F-03] list scopeKey=customer.mine(互不影响) — 现有 0 个
pass [F-03] list scopeKey=customer.overview(互不影响) — 现有 0 个
pass [F-03] list scopeKey=customer.pool(互不影响) — 现有 0 个
pass [F-03] save customer.mine → e2c-视图-未跟进 — viewId=625b526d4f614683954926afcd8c5a5e
pass [F-03] save customer.overview → e2c-视图-五星 — viewId=e5b66ee7fdfb45bab8882b8f98c7d653
pass [F-03] save customer.pool → e2c-视图-公海甲 — viewId=eb6be87525c84b84910ce925f088b569
pass [F-03] savedViewId 应用生效(过滤叠加,DataScope 不变) — 命中=['e2c-提醒-超期']
pass [F-03] set-default 图钉(单值互斥)
pass [F-03] delete 视图
pass [F-03] 删除后应用已删视图:不炸(静默/报错均可接受) — code=0
== F-04 新增客户 + 三层查重 ==
pass [F-04] check-name 精确名命中 — 返回 [{'customerId': '750844478243209216', 'customerName': 'e2c-恒信达科技有限公司', 'ownerName': '罗伟健', 'customer
pass [F-04] check-name 无命中返回空 — 返回 []
pass [F-04] check-credit-code 命中全字段样例 — 返回 {'exists': True, 'masked': False, 'customerId': '750844477165273088', 'customerName': 'e2c-全字段-科技',
pass [F-04] company-lookup stub 不炸(D5 划出仅 seam;参数名 companyName) — code=0
pass [F-04] 名称相似 → needConfirm=true + similarHits(未落库) — needConfirm=True hits=[{'customerId': '750844478243209216', 'customerName': 'e2c-恒信达科技有限公司', 'ownerName': '罗伟健', 'customerStage': 1, 'archiveS
pass [F-04] confirmSimilar=true「仍要创建」落库回 id+customerNo — id=753581909333770240 no=KH202609110007
pass [F-04] similarHits 命中行含编号/名称/负责人/阶段(admin 全可见未脱敏) — 首个hit={'customerId': '750844478243209216', 'customerName': 'e2c-恒信达科技有限公司', 'ownerName': '罗伟健', 'customerStage': 1, 'archiveStatus': 1, 'masked':
pass [F-04] 信用代码已存在 → 67003 硬拦(无仍要创建) — code=67003 如预期
pass [F-04] 客户编号格式 KH+yyyyMMdd+4位 — no=KH202609110007
== F-05 编辑客户 ==
pass [F-05] GET /detail 全字段回显(含字典名/version) — 缺=[] version=9
pass [F-05] CAS version 缺失 → 67005(spec D-06) — code=67005
pass [F-05] edit 带 version 编辑成功 — code=0 msg=success
pass [F-05] oplog UPDATE 字段级「旧→新」叙事(D13) — detail=把人脉关系单位从["\u6807\u6746\u5ba2\u6237", "\u540c\u884c\u63a8\u8350"]修改为空;把公司决策人从王总修改为空;把合作系统从OA对接修改为空;把是否参加总裁班从1修改为空;把总裁班参加人从王总修改为空;把总裁班参加人电话从13
pass [F-05] 改信用代码撞 simA → 67003 — code=67003 如预期
== F-06 联系人 CRUD + 搜索 + 电话软提示 ==
pass [F-06] 电话非手机号格式被拒 — code=67001 msg=联系电话须为手机号格式
pass [F-06] 所属客户不存在 → 67002 — code=67002 如预期
pass [F-06] 联系人分页 keyword 命中 — total=1
pass [F-06] 全局搜索按电话命中 2 条(商机侧数据源) — 命中=['王重复', '张关键']
pass [F-06] 搜索带出所属公司名(customerName) — 样本={'id': '750844500779204608', 'createTime': '2026-09-03 22:27:59', 'customerId': '750844477165273088', 'name': '李普通', 'jo
pass [F-06] check-phone 跨客户命中(D26 只提示不阻断) — 命中 2 条
pass [F-06] W-01 source 字段回显(contact_source 字典组缺失,创建不校验) — source=contact_source_01
pass [F-06] edit 编辑联系人
pass [F-06] delete 软删后列表不含 — tmp id=753581921547583488
== F-07 详情公共头部 + 8 页签 ==
pass [F-07] 头部关键项齐(阶段只读条/星级/协议VIP快照/负责人/跟进摘要/待跟进提醒/关联计数) — 缺=[]
pass [F-07] 汇总卡 5 字段恒 null(占位契约) — 非null=[]
pass [F-07] projectCount 恒 null(A5 seam 未接入显 --) — projectCount=None
pass [F-07] D-01 复验:交割-甲 opportunityCount==1(修复后真值) — opportunityCount=1
pass [F-07] 关联商机页签 port 反查命中 e2c-联动-交割 — 商机=['e2c-联动-交割']
pass [F-07] oplog action 值域 ⊆ 17 种白名单(CONTACT_*/AGREEMENT_* 已入域) — 实际=['CONTACT_ADD', 'CONTACT_DELETE', 'CONTACT_EDIT', 'FOLLOW', 'MEMBER_ADD', 'MEMBER_REMOVE', 'UPDATE']
pass [F-07] 已归档客户详情可开(档案状态=已归档) — archiveStatus=2
pass [F-07] 详情客户不存在 → 67002 — code=67002 如预期
== F-08 跟进写入 + 跟进页签 ==
pass [F-08] 跟进内容空 → 67009 — code=67009 如预期
pass [F-08] nextFollowTime 早于当前 → 67009(spec) — code=67009
pass [F-08] 正常写入返回跟进 id — id=753581932498911232 way=follow_way_01
pass [F-08] customer_follow 行落库(append-only)
pass [F-08] D25 锚点 last_valid_follow_time 刷新 — 2026-09-11 00:03:12 → 2026-09-11 11:45:34
pass [F-08] 跟进页签时间倒序含新记录 — 首条=['e2c-F08 跟进实测:电话沟通年度合作意向']
pass [F-08] followWay 筛选生效 — way=follow_way_01
pass [F-08] 30s 内同内容重复提交 → 67009 — code=67009 如预期
pass [F-08] 头部最近跟进摘要联动最新一条 — summary=e2c-F08 跟进实测:电话沟通年度合作意向
pass [F-08] 待跟进提醒 nextFollowTime 非空(seed 明天回访) — next=2026-09-12 00:02:50
✘ : HTTP 404 {"code":40401,"success":false,"message":"接口不存在:api/customer/follow/edit","data":null}
pass [F-08] append-only:跟进无编辑口(follow/edit 未注册,非 0 即过) — code=404
== F-09 关注/重点标记(一行两态)==
pass [F-09] focus 幂等:两次关注仍单行 — 行数=1
pass [F-09] star 未关注自动建行 starred=1 — [{'id': 753581942510714880, 'starred': 1}]
pass [F-09] unstar 保留行仅 starred=0 — [{'id': 753581942510714880, 'starred': 0}]
pass [F-09] focus-batch 3 客户各建 1 行 — 行数合计=3
pass [F-09] pool FOCUSED 视图命中关注的公海客户 — 命中=['e2c-公海-甲', 'e2c-公海-乙']
pass [F-09] 列表行 focusFlag=1(focus 后,票 01 列) — 甲=1 五星=1
pass [F-09] unfocus 物理删行(连带清 starred) — 剩余=0
pass [F-09] 关注动作不写 oplog — actions=['CLAIM', 'CREATE', 'POOL', 'TRANSFER']
pass [F-09] 列表行 focusFlag=0(unfocus 清扫后,票 01 列) — 甲=0 五星=0
== F-10 团队成员 ==
pass [F-10] 负责人在首位(ROLE_OWNER 快照;字段 roleType→role) — 首行={'userId': '739564171091247104', 'userName': '罗伟健', 'deptName': '广东保伦电子股份有限公司', 'role': 'OWNER'}
pass [F-10] 名单空被拒(67016/绑定拒) — code=67016
pass [F-10] 含负责人 → 67016 — code=67016 如预期
pass [F-10] 添加协同人 BUDDY — code=0
pass [F-10] team_member 行在(delete_key=0) — [{'id': 750851822075248640, 'delete_key': 750851822075248640}, {'id': 750851827313934336, 'delete_key': 750851827313934336}, {'id': 750853215641141248, 'delete_key': 750853215641141248}, {'id': 750853220749803520, 'delete_key': 750853220749803520}, {'id': 750854095941664768, 'delete_key': 750854095941664768}, {'id': 750854100916109312, 'delete_key': 750854100916109312}, {'id': 750854417284071424, 'delete_key': 750854417284071424}, {'id': 750854422451453952, 'delete_key': 750854422451453952}, {'id': 751570838662152192, 'delete_key': 751570838662152192}, {'id': 751570843007451136, 'delete_key': 751570843007451136}, {'id': 751573193801596928, 'delete_key': 751573193801596928}, {'id': 751573198776041472, 'delete_key': 751573198776041472}, {'id': 751728502109110272, 'delete_key': 751728502109110272}, {'id': 751728505900761088, 'delete_key': 751728505900761088}, {'id': 753404628795654144, 'delete_key': 753404628795654144}, {'id': 753404634105643008, 'delete_key': 753404634105643008}, {'id': 753405202056347648, 'delete_key': 753405202056347648}, {'id': 753405207483777024, 'delete_key': 753405207483777024}, {'id': 753581964581142528, 'delete_key': 0}]
pass [F-10] 重复加入 → 67016(整批拒绝) — code=67016 如预期
pass [F-10] oplog MEMBER_ADD — actions=['MEMBER_ADD', 'FOLLOW', 'CONTACT_DELETE', 'CONTACT_ADD', 'CONTACT_EDIT', 'UPDATE']
pass [F-10] 移除软删(delete_key>0) — [{'delete_key': 750851822075248640}, {'delete_key': 750851827313934336}, {'delete_key': 750853215641141248}, {'delete_key': 750853220749803520}, {'delete_key': 750854095941664768}, {'delete_key': 750854100916109312}, {'delete_key': 750854417284071424}, {'delete_key': 750854422451453952}, {'delete_key': 751570838662152192}, {'delete_key': 751570843007451136}, {'delete_key': 751573193801596928}, {'delete_key': 751573198776041472}, {'delete_key': 751728502109110272}, {'delete_key': 751728505900761088}, {'delete_key': 753404628795654144}, {'delete_key': 753404634105643008}, {'delete_key': 753405202056347648}, {'delete_key': 753405207483777024}, {'delete_key': 753581964581142528}]
pass [F-10] oplog MEMBER_REMOVE
pass [F-10] 移除后可重加(delete_key 复用键)
== F-11 归属动作 ==
pass [F-11] 领取公海客户 → 当前用户(owner+快照) — code=0
pass [F-11] 领取后 D25 锚点赋当下(last_valid_follow_time 非空) — t=2026-09-03 22:55:18
pass [F-11] 重复领取失败(非公海态) — code=67004 msg=客户已被领取,不在公海
pass [F-11] 观察点:BUDDY(无角色)领取被拒 — code=67004 msg=客户已被领取,不在公海
pass [F-11] 分配给本人 → 67012 — code=67012 如预期
pass [F-11] 分配给 BUDDY 成功(owner 换绑+快照) — code=0 owner=744842318024015872
pass [F-11] 实验后 DB 还原 stage1 归属(assign 回本人被 67012 拦)
pass [F-11] 有进行中商机抛公海 → 67007 — code=67007 如预期
pass [F-11] 抛公海清 owner、部门锚点保留 — owner=None dept=744841292348915712
pass [F-11] claim 还原 stage1(owner=admin) — code=0
pass [F-11] 归属动作 oplog(TRANSFER/POOL/CLAIM 齐——assign 写 TRANSFER) — actions=['CLAIM', 'CREATE', 'POOL', 'TRANSFER']
pass [F-11] 有进行中商机归档 → 67006 — code=67006 如预期
pass [F-11] archive-batch 整批预检:含阻断户整批不执行(star5 仍有效) — star5 archive_status=1 resp={'code': 67006, 'success': False, 'message': '客户存在进行中商机,不可归档', 'data': None}
pass [F-11] 归档 star5(archive_status=2) — st=2
pass [F-11] 已归档 detail-head archiveStatus=2
pass [F-11] 恢复 star5(archive_status=1) — st=1
pass [F-11] 还原:pool1 抛回公海(owner 空且 enter_pool_time 有值) — owner=None enter=2026-09-11 11:45:49
== F-12 商机侧硬依赖(quick-create/search/contacts)==
pass [F-12] quick-create 最小集落库回 id+customerNo — {'id': '753581999150596096', 'needConfirm': None, 'similarHits': None, 'customerNo': 'KH202609110008', 'customerName': '
pass [F-12] 默认值:owner=当前用户 / is_child=否 / isBizNegotiated=否 — owner=739564171091247104 is_child=0 is_biz=0
pass [F-12] confirmSimilar 透传:确认后落库(返工票 04 销 round-1 缺口,断言翻转) — 首次needConfirm=True 确认重发needConfirm=False 新id=753582002359238656
pass [F-12] search 名称模糊命中 simA/simB — 命中=['e2c-恒信达科技有限公司', 'e2c-恒信达科技有限公司', 'e2c-恒信达科技有限公司', 'e2c-恒信达科技有限公司', 'e2c-恒信达科技有限公司', 'e2c-恒信达科技有限公司', 'e2c-恒信达科技有限公司', 'e2c-恒信达科技有限公司', 'e2c-恒信达科技有限公司', 'e2c-恒信达科技有限公司', 'e2c-恒信达科技有限公司', 'e2c-恒信达科技有限公司', 'e2c-恒信达科技有限公司', 'e2c-恒信达科技有限公司', 'e2c-恒信达科技有限公司', 'e2c-恒信达科技股份有限447414公司', 'e2c-恒信达科技股份有限447414公司', 'e2c-恒信达科技有限公司', 'e2c-恒信达科技有限责任公司']
pass [F-12] search 类型精确过滤 — total=19 ctype=customer_type_01
pass [F-12] search excludeCustomerIds 排除 simA(按 id 判,同名 tmp 不干扰) — 命中id数=18
pass [F-12] contacts 按客户带出(张关键/李普通/王重复;参数 customerId) — 名单=['李普通', '王重复', '张关键']
== 汇总 == ✅113 ⚠1 ❌0 耗时 32s specimens=42
✔ 落盘 e2e-core-r2-checks.json / specimens-core-r2.json