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.
 
 
 
 
 

14 KiB

22 条缺陷复测裁决(retest-verdicts.md)

票 02 产出(20260829)。判定优先级:原型 v29 > PRD > 问用户。 原型证据均出自 .scratch/opportunity-bugfix/lanhu-pages/(v29 文本库,票 01),引用格式 页名 · 批注小节;PRD 引用 .scratch/opportunity-module/商机业务-PRD.md 节号。 裁决汇总: 确认 19 / ⚠ 翻案 3(D-08、D-18、D-19)/ 0。 翻案 3 ≤ 5,符合票 02 验收预期。

P1(13 条)

D-01 关联客户添加端点 404 — 确认

  • 原型证据A3-1-1-2-4 添加关联客户(弹窗全景:客户查询区 + 搜索结果表 8 列 + 关联信息设置区 + 确认/取消/+ 快速创建客户);A3-1-1-1-2 客户信息 · 验收标准 6:「点击"添加关联客户"后,可以正常添加新的关联客户」;交互说明 2:「确认后,系统将该客户关联到当前商机,刷新客户信息列表」。
  • 修复方向OpportunitySubControllerPOST /api/opportunity/customer/add(flat 风格),按 ADR-0017 请求 DTO;域规则照 crm-opportunity/CONTEXT.md(一商机多客户、customerRole/isPrimaryIntended、无删除动作)。

D-02 客户搜索端点 404 — 确认

  • 原型证据A3-1-1-2-4 · 详细说明 3/5:「客户查询区:支持按客户名称、联系人、联系电话及客户类型查询客户」「客户搜索结果区:以表格形式展示…并支持单选」;表格列头(选择/客户名称/客户类型/地区/联系人/联系电话/客户负责人)。
  • 修复方向:补 POST /api/opportunity/customer/search,按名称/联系人/电话/类型过滤 + 分页,数据范围限当前用户可见客户。

D-03 设为主要意向端点 404 — 确认

  • 原型证据A3-1-1-1-2 · 交互说明 4:「点击"设为主要"后,将该客户设置为当前商机的主要意向客户。设置成功后,关系标记需同步更新」;业务规则 2:「同一商机原则上只能有一个主要意向客户。当用户将某客户设为主要后,原主要客户需自动变更为普通关联客户」;变更记录:「设为主要:二次确认后将唯一的主要意向客户替换至选中行」。
  • 修复方向:补 POST /api/opportunity/customer/set-primary,切主三步事务(旧主降普通 + 新主置主 + 快照回写,见 CONTEXT.md)。

D-04 团队成员添加端点 404 — 确认

  • 原型证据A3-1-1-1-8 团队成员:「+ 添加成员」按钮 + 成员表 7 列 + 8 行样例;A3-1-1-2-8 添加团队成员&一键拉群 整页。
  • 修复方向:补 POST /api/opportunity/team/add;行级授权白名单语义照 CONTEXT.md。

D-05 团队成员移除端点 404 — 确认

  • 原型证据A3-1-1-1-8 · 批注 u474:「操作列根据成员身份进行权限区分。普通成员提供"编辑"和"移除"入口」;「移除」按钮 ×4(u367-370)。
  • 修复方向:补 POST /api/opportunity/team/delete;商机负责人行不可移除(只能移交,原型 u474「商机负责人额外提供移交入口」)。

D-06 团队成员角色编辑端点 404 — 确认

  • 原型证据A3-1-1-1-8 · 批注 u474:「普通成员提供"编辑"和"移除"入口」;「编辑」按钮 ×5(u362-366)+「移交」(u417)。
  • 修复方向:补 POST /api/opportunity/team/update(项目角色/职责编辑);移交 handover 已存在(E9),其 team 表同步语义(grill 拍板)已实现,勿重复动。

D-07 暂缓态可编辑 — 确认

  • 依据:PRD §3.3:「暂缓中(3):允许 E5/E6/E9;推进节点/转项目受限(需先取消暂缓);一切编辑操作全禁,必须先取消暂缓回到推进中才能写(写跟进/子表写同禁,P1-7 拍板)」。原型 A3-1-1-2-6 · 验收标准 10:「暂缓期间,推进节点、推送方案、转项目等受限操作需按规则隐藏、置灰或给出提示」——不与 PRD 冲突(原型未细列编辑,PRD 明文全禁)。
  • 修复方向:edit/写跟进/子表写路径加暂缓态守卫(opp_status=3 拒绝,抛 CODE_STATUS_NOT_ALLOWED 族错误码,对称 ADR-0021 两级口径)。

D-08 暂缓态可直接关闭 — ⚠ 翻案(e2e 期望写反)

  • 翻案理由:PRD §3.2 E6 关闭边明文「起始态 2,3→4」;§3.3 暂缓中「允许 E5/E6/E9」。暂缓态关闭是 PRD 定义的合法迁移边。原型 A3-1-1-2-6 · 到期处理规则:「负责人需人工确认恢复推进、继续暂缓或关闭商机」——关闭在暂缓语境下原型亦认可。e2e 报告 D-08 所引「§3.3 状态机无 3→4 出边」与现行 PRD 原文不符。
  • 动作:e2e 报告该条状态改「行为正确」;票 05 若含「拦截暂缓态关闭」子项则剔除;回归脚本 F14 相关断言反转(3→4 应成功)。

D-09 禁领规则(allowFreeClaim=0)未生效 — 确认

  • 原型证据A7-3-2-5-2 公海与提醒规则(新增/编辑页) · 交互说明 7:「用户勾选"允许适用范围内的销售自由领取商机"后…可从公海主动领取商机。取消勾选后,不提供自由领取入口,商机需通过其他授权方式进行分配」;业务规则 7:「启用自由领取后,仅适用范围内且具备对应公海权限的销售人员可以领取商机」;A3-3-1-1-2 领取 · 交互说明 4:「确认后,系统校验当前商机是否仍处于可领取状态」。
  • 修复方向:claim 路径接入 PoolRuleMatcher.loadPublished()(现仅回收 Job 消费):按商机匹配生效规则版本,allowFreeClaim=0 时 claim 拒绝(业务错误码,提示走分配)。

D-10 阶段模板编辑发布中生新草稿 50001 — 确认(实现 bug,与原型无关)

  • 原型证据A7-3-2-5-2 · 业务规则 1(三族同构语义):「同一规则同一时间仅允许存在一个草稿版本和一个发布中版本。新版本发布成功后,原发布中版本自动调整为已停用」——版本化编辑流是原型明确语义。
  • 根因OpportunityStageTemplateServiceImpl.resolveDraft 编辑分支 dto.toEntity() 携带源版本 id 直接 save() → 主键冲突(同构同因)。
  • 修复方向toEntity()setId(null)(三族同改:Stage/SchemeCard/PoolRule 的 resolveDraft),复测「编辑发布中→生成新草稿(版本号递增)」。

D-11 方案卡模板同构 50001 — 确认

  • 同 D-10,OpportunitySchemeCardTemplateServiceImpl.resolveDraft 同改。

D-12 公海规则同构 50001 — 确认

  • 同 D-10,OpportunityPoolRuleServiceImpl.resolveDraft 同改。

D-13 owner_dept_id 恒空 — 确认

  • 原型证据A7-3-2-5-2 · 适用对象:「适用对象(仅'对应部门专用'时才选择)」——部门专用规则是原型明确功能,其匹配锚点即商机归属部门;详情页头部展示「所属部门:粤疆战队-广东15部」(A3-1-1-1-8 u239-240 等各详情页头);PRD E1:「设 owner + 部门/姓名快照」、E9:「owner_dept_id 换为移交对象部门」。
  • 修复方向:四处写快照——创建=创建人部门;领取/分配=新负责人部门;移交=新负责人部门(E9 已定语义)。落点 OpportunityCreateServiceImpl(现注释「ownerDeptId 传 null」)+ OpportunityTransitionImpl(现依赖前端传 cmd.ownerDeptId,改为服务端按负责人解析,不信任前端)。

P2(9 条)

D-14 新建必填校验 500 类返回 — 确认(双缺失)

  • 原型证据A3-1-1-2-1 新增/编辑商机 表单星号必填 13 个:商机名称/商机来源/商机行业/商机类型/项目阶段/招标形式/项目详细地址/项目区域/项目属地/甲方是否明确/关联客户/客户类型/是否主要客户(项目金额无星号=选填)。后端仅 2 必填 + 缺失时返回 500 类「系统内部错误」而非参数错误。
  • 修复方向:create/edit DTO 校验对齐必填集(至少核心 6 项:名称/来源/阶段/招标形式/区域/属地——客户区字段与 D-01 端点联动,随票 04 一并落地);错误码改参数错误族。

D-15 PUBLIC_POOL 看板 summary 未过滤 — 确认

  • 依据:PRD §6.8:「三种展示形态与『哪个视图/检索』正交——同一份列表数据三种渲染,后端列表接口不变(同一查询、同一 DataScope、同一分页)」;看板「列头带共 N 条计数」。summary 与 cards 必须同口径;实测 summary=7 vs 视图内公海态 2 违反同口径原则。
  • 修复方向board/summary 加与 cards 相同的视图状态过滤(viewType 参数,票 11 已坐实两端点源码均无 viewType)。

D-16 detail 六联动字段 null — 确认(范围收窄至 4 字段,2 字段翻案)

  • 确认 4方案卡状态(概览批注:「方案卡摘要:展示当前最新方案卡的关键信息」)、方案预算(详情头部「方案预算:418.90 万元」展示)、是否关注(列表页「我的关注」视图为一级入口,A3-1-1 u75/u543)、最近跟进时间(概览交互说明 3:「保存成功后…同步更新最近跟进时间」)。
  • 翻案 2节点停留天数下阶段名 —— v29 原型概览页与 PRD 全文均无此二字段展示要求(e2e 报告引「PRD §7.9」实为 view_log 节,引用失准)。
  • 修复方向:detail 聚合补回显 schemeCardStatus/schemeBudget/followed/lastFollowTime 四字段;不做停留天数与下阶段名。

D-17 方案卡提交后主表未回显 — 确认

  • 原型证据:同 D-16 方案卡摘要(概览需展示最新方案卡关键信息);提交流程草稿→提交 cardStatus 1→2 已实测 ,缺的是主表回写。
  • 修复方向:方案卡 submit 事务内回写主表 scheme_budget/scheme_card_status(与 D-16 回显同根因族,一并修)。

D-18 surveySeq 需调用方传 — ⚠ 翻案(v29 原型推翻上轮拍板 P1-2)

  • 翻案理由A3-1-1-2-10 新增现场勘察 · 字段说明 2:「勘察次数:字段类型:下拉选择框。记录当前商机第几次进行现场勘察。字段规则:必填;例如第一次、第二次、第三次等」+ 表单控件 *勘察次数(带星号)。原型口径=用户必填下拉选次数,非系统自动生成。上轮拍板 P1-2「次数自动生成」与 v29 相悖,按优先级原型胜。实测「不传 surveySeq 被拒」符合原型。
  • 动作:行为正确,无需修复;上轮拍板 P1-2 记录为「被 v29 推翻」;e2e 断言维持。

D-19 勘察补充说明未强制必填 — ⚠ 翻案(同上)

  • 翻案理由A3-1-1-2-10 · 字段说明 10:「勘察补充说明…字段规则:建议必填,支持较长文本录入」+ 表单控件无星号(对比 *勘察次数/*现场勘察日期);验收标准 6 只要求「未填写必填字段…不得提交」(必填集=申请方式/勘察次数/现场勘察日期/工程师)。「建议必填」=前端引导,非后端强制。实测「空说明成功」符合原型。上轮拍板 P1-3 被推翻。
  • 动作:行为正确,无需修复;拍板 P1-3 同记「被 v29 推翻」。

D-20 oplog 流转不留痕 — 确认

  • 原型证据A3-1-1-1-9 操作日志 · 开发说明:「操作日志用于记录…关键操作、字段变更、状态流转、附件上传、方案推送等行为」;字段说明 4:「字段名称…例如:商机状态、当前工作节点、方案预算、附件名称等」;u510 批注:「包含系统自动触发流转与人工执行操作的归因…需明确区分系统行为与人工操作」。实测 6 种流转仅 2 条 ROW_CHANGE 且 fieldName=null 直接违反。
  • 修复方向:每条迁移边(E1-E10)统一落 opportunity_oplog(fieldName=opp_status、旧值→新值、操作人=操作者或「系统」(E10 回收),对齐 PRD §3.4「审计切面记状态流转」双轨设计)。

D-21 attachment/add bizType 契约矛盾 — 确认(代码实锤)

  • 代码证据OpportunitySubController.addAttachment @RequestParam(value="bizType", required=false) vs OpportunityAttachment 实体 varchar(32) **not null** 无默认值 → 不传必 50001。
  • 修复方向required=true + 参数校验注解限定值域 OPP/FOLLOW_UP/SITE_SURVEY/SCHEME_CARD(对齐 ADR-0017 显式契约)。

D-22 versions 实体直出泄露 — 确认

  • 代码证据:三族 versions 端点返回 Result<List<OpportunityStageTemplate|OpportunityPoolRule|OpportunitySchemeCardTemplate>> 实体直出(含 creatorId/deleted/updaterId),违反 ADR-0017 Entity 禁令。
  • 修复方向:三族 versions 出参换 VO/DTO(剥离审计字段),同构三处一起改。

给修复票的范围结论

  • 票 03(V-CONFIG + dept):D-10/11/12(三族 setId(null))+ D-13(四处快照)——范围不变。
  • 票 04(6 端点):D-01~06——范围不变;D-14 必填集的「客户区字段」与 D-01 联动,实现时对齐。
  • 票 05(状态拦截 + 规则):D-07(暂缓编辑全禁)+ D-09(禁领接 claim)——剔除 D-08(翻案)。
  • 票 06(P2 批):D-14/15/16(收窄 4 字段)/17/20/21/22——剔除 D-18/19(翻案)。
  • 回归注意:D-08/18/19 三处 e2e 断言需反转为「行为正确」断言(票 09 时处理)。

升级用户项

无强制拍板项。两项供知悉(不阻塞开工):

  1. D-08/18/19 三条翻案均已按「原型 > 拍板」纪律裁定,若你不同意某条翻案请在票 03-06 开工前提出。
  2. D-07 的 PRD 依据是 P1-7 拍板(编辑全禁)而 v29 原型批注只列「推进类受限」——按 PRD 从严执行;若产品意图是「暂缓态允许编辑基础信息」,需在票 05 开工前纠偏。