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.
50 lines
5.8 KiB
50 lines
5.8 KiB
|
1 week ago
|
# 06: P2 修复批 — D-14~D-22 按裁决结果修复
|
||
|
|
|
||
|
|
`Type: task`
|
||
|
|
`Status: resolved`
|
||
|
|
`Blocked by: 02`
|
||
|
|
|
||
|
|
## 任务
|
||
|
|
|
||
|
|
范围以票 02 裁决为准(翻案的剔除、存疑的等用户答复)。默认范围(按上轮 e2e 报告):
|
||
|
|
|
||
|
|
- **D-14 必填校验 500 类**:新建商机必填字段缺失时返回 500/堆栈 → 改为 Bean Validation 400 类业务码(逐字段提示)。原型新建页必填项以 v29 批注「3、字段说明」为准对齐必填集(原型 12 必填 vs 后端 2 必填的对照已在上轮 demo 子表实测答过——按裁决口径收敛,若裁决「后端只保底必填」则只修错误形态不扩必填集)。
|
||
|
|
- **D-15 公海看板 summary 未过滤**:board 两端点无 viewType 参数 → 公海视图的 summary 卡片混入非公海数据。加 viewType/过滤参数或按公海语义过滤。
|
||
|
|
- **D-16 detail 六联动字段 null**:详情接口招标形式/责任人/所属团队/所属部门等联动字段不回填 → 服务端关联查询补齐(详情页头原型有这些字段,本 session 原型提取已证实)。
|
||
|
|
- **D-17 方案卡提交后主表未回显**:方案卡提交后详情头部(方案预算等)不刷新 → 提交事务里同步回写主表快照字段。
|
||
|
|
- **D-18 surveySeq / D-19 勘察说明**:上轮实测与拍板相反(surveySeq 要调用方传、说明不必填),票 02 大概率翻案或改口径;确认后才修。
|
||
|
|
- **D-20 oplog 流转不留痕**:状态流转操作不写操作日志 → 流转事务里补 oplog 记录(原型操作日志 Tab 含流转记录类型则修,按裁决)。
|
||
|
|
- **D-21 bizType 契约矛盾**:文档/实现/原型三口径不一 → 按裁决统一口径(大概率是修文档/注释而非代码)。
|
||
|
|
- **D-22 versions 实体直出泄露**:creatorId/deleted/updaterId 泄露 → 输出 DTO 化(ADR-0017),三族 versions 端点一起改。
|
||
|
|
|
||
|
|
## 验收
|
||
|
|
|
||
|
|
- 每条修复项有专项实测断言(可用 Python requests 脚本,**中文 body 一律 Python 不用 PS**)。
|
||
|
|
- 修完跑 `e2e-core.py` + `e2e-rules.py` 全量回归,⚠/❌ 计数显著下降且无新增回归。
|
||
|
|
- D-22 三族 versions 响应不再含 deleted/updaterId/creatorId。
|
||
|
|
|
||
|
|
## Answer
|
||
|
|
|
||
|
|
**七项修复全部落地并验证(20260830)**:
|
||
|
|
|
||
|
|
- **D-14**:create 6 核心必填(名称/来源/招标形式/省/市/属地)逐字段 66001「X不能为空」(阶段由 Intake 落位天然非空不入参);edit 用 merged(dto,existing) 合并校验(null=保留原值,空白改空被拒),不破坏部分更新语义。
|
||
|
|
- **D-15**:新建 `query/OpportunityViewFilter` 组件作视图条件单一事实源(六视图 switch + providesStatusCondition);ViewQueryImpl 委托重构,board 两端点加 viewType;PUBLIC_POOL 的 status 条件由视图分支提供、调用方跳过状态叠加(避恒假 AND)。
|
||
|
|
- **D-16**:detail 回显 followed(focus exists)/lastFollowTime(follow 最新 create_time,deleteKey=0)/schemeCardStatus/schemeBudget——方案卡两字段主表 C4 快照优先、存量空兜底实时查主客户最新卡(不回写),无卡置 0。
|
||
|
|
- **D-17**:submitCard 事务内仅主客户卡回写主表 C4 快照列(scheme_card_status/scheme_budget)。
|
||
|
|
- **D-20**:E1-E10 全部迁移边落 opportunity_oplog(opKind=FIELD_CHANGE/logType=STATUS_FLOW/fieldName=opp_status/opDesc 用状态 label);MANUAL/SYSTEM 归因(E10 recycle=0L+SYSTEM);E9 自环边也记旧=新保审计连续。
|
||
|
|
- **D-21**:attachment/add bizType required=false 统一 66001 + 四值封闭 OPP/FOLLOW_UP/SITE_SURVEY/SCHEME_CARD(Set.of contains(null) 抛 NPE 需先判空——实测踩坑)。
|
||
|
|
- **D-22**:三族 versions DTO 白名单化(fromEntity+BeanUtils),剥 creatorId/updaterId/deleted,保留业务字段+createTime/updateTime。
|
||
|
|
|
||
|
|
**附带实锤并修复两个存量缺陷(验证过程发现)**:
|
||
|
|
|
||
|
|
1. **D-17 首版 updateById(新实体) 炸 MyBatisSystemException**——Opportunity 带乐观锁实体同票 04 编辑先例:改 LambdaUpdateWrapper 显式 set 两列。
|
||
|
|
2. **edit 清字段存量 bug(Y2 对照实验实锤)**:Opportunity 实体 8 个 String 字段 `= ""` 初始化 + MP NOT_NULL 策略 → `update(实体)` 把未传字段一并 SET 成空串(实验:edit 只传 oppName,另 5 字段全被清);edit 改 wrapper 显式 set(update(null,wrapper)+显式刷 update_time,顺带消除实体默认 version=0 的假乐观锁 WHERE)。
|
||
|
|
|
||
|
|
**验证**:单测 196/196(crm-opportunity)+134/134(crm-rule);`t06-verify.py` 运行时专项 32/32 全绿(BOM 208 文件无 BOM;jarcheck NEW-JAR-WITH-T06);e2e 回归 core ✅71/⚠16/❌3 + rules ✅44/⚠3/❌0(缺陷 0),快照 `-t06-regression`。
|
||
|
|
|
||
|
|
**回归甄别:0 条代码回归**。唯一「变差」F14 暂缓 E4 = 复用商机轮间状态残留(上轮末批量关闭未恢复,本轮开头 status=4;同 flow 其余状态机断言全绿含 CAS)→ 票 11 重置后复测。新增非✅ 均为:① t05 基线精简未收录的既有 seed 数据类 ⚠(F02/F04/F06/F08/F11/F13);② F05 编辑回写 ❌ = D-14 预期拦截(seed 省市空串全量回传,且 e2e 用旧 key `opportunityName` 绑不上 DTO 真名 `oppName`)→ 票 09 断言反转;③ F10 两 ⚠ = D-18/19 翻案后 e2e 断言未同步 → 票 09 反转;④ F09 seed 卡被票 05 cleanup 软删 → 票 11 刷新。rules 侧 R01/R02「编辑发布中→生新草稿 V1.1」由 t05 时代 ❌ 转 ✅(D-10~12 修复确认)。
|
||
|
|
|
||
|
|
**契约口径(票 10 bruno 同步用)**:edit 入参 DTO 属性真名 `oppName`(create 才是 `opportunityName`);bizType 四值封闭旧 `biz_type_01` 形态作废;board 两端点新增可选 `viewType`(默认 MINE)。
|
||
|
|
|
||
|
|
脚本:`t06-verify.py`(C/A/D/S/O/B/V/CLEANUP 八段)/ `t06-jarcheck.py` / `t06-e2ediff.py`(基线对比)/ `t06-exp.py`+`t06-probe4.py`(清字段实验)。
|