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.

54 lines
4.6 KiB

5 days ago
# 12 — demo 同步 opp-create-fields + 看板泳道卡片
Type: task
Status: resolved
Blocked by: -
> 【背景】opp-create-fields(提交 acd0d94)补齐商机新建接口 7 类字段后,demo/index.html 新建对话框未同步;用户追加要求顺带体现看板努力的展示名取卡能力(board/cards 泳道视图)。用户将人工重新验收。
## Question
同步 `.scratch/opportunity-e2e/demo/index.html` 至后端最近行为,供用户重新验收:
1. **新建商机对话框补 7 类字段**(spec:`.scratch/opportunity-create-fields/spec.md`,已提交 acd0d94):
- 项目区域省/市/区三级级联,区/县折叠进 cityCode(不新增 districtCode)
- 项目金额 projectAmount、项目详细地址 address
- 客户区块:搜索选客户(customerId)+ 客户类型 customerRole + 是否主要客户 isPrimaryIntended(=0 提示允许零主要意向客户、主表冗余留空)
- 商机关键联系人快照三件套(keyContactId 留空,名/公司手输快照——A4 未建)
- 「备注」label 改「项目概况」
- 前端必填校验对齐:customerId 非空时 customerRole/isPrimaryIntended 必填
2. **看板泳道卡片**:tab1 看板区在 stage-summary 汇总条之上增加泳道列,每列按展示名调 `POST /board/cards`(form: viewType/stageName/offset/limit,offset+limit 滚动翻页、返回 < limit 到底),卡片渲染 oppName/金额/负责人/状态点击开详情依赖工作树未提交的看板代码 起服产物须重新 package注意 fat jar 增量构建跳过陷阱)。
3. Playwright 自测一轮 + 截图落 `demo/`,然后交用户人工验收。
## Answer
## Answer
(20260901 完成并自测通过)demo 同步两块 + 踩实并修复两个平台级缺陷:
1. **新建商机对话框补齐 opp-create-fields 7 类字段**(对齐 A3-1-1-2-1 / acd0d94):
项目区域省→市→区县三级级联(区县码折叠进 cityCode,不单建 districtCode,region API parentId 递归实测 17 区县可选);
项目金额 / 项目详细地址 / 关键联系人快照(姓名+公司手输,keyContactId 按 spec 边界留空);
「备注」label 改「项目概况」;前端必填校验对齐(填了客户 ID 则客户类型/是否主要必填,与后端 66001 同款)。
**客户区块实测修正**:customer/search 的 oppId 必填(传 0 稳定 66002「商机不存在: 0」),新建场景不可用 →
demo 改手输 customerId+customerName(引用 id + 名快照走法,与 DTO javadoc 一致)。
2. **看板泳道卡片**:tab1 新增泳道面板(summary 5 列展示名),每列调 POST /board/cards(form: viewType/stageName/offset/limit,
每列先拉 5 条,「更多」按钮 offset 递增续拉,返回 < limit 渲染到底滚动翻页实测无重复卡
卡片含 oppName/负责人快照/金额/状态徽标,点击开详情。
3. **踩实缺陷 D-23(P1,平台级,已修)**:crm-base `MybatisPlusConfig` 从未注册 `OptimisticLockerInnerInterceptor`
Opportunity `@Version` 预埋失效,且 `updateById(et)` 的 OPTLOCK 占位符与参数注入脱节 →
真实 DB 稳定抛 `BindingException: Parameter 'MP_OPTLOCK_VERSION_ORIGINAL' not found`(HTTP 500/50001)。
opp-create-fields 的 =1 创建分支(intake `linkPrimaryCustomer` 回写主表)是全项目**第一个真实调用**
`oppMapper.updateById` 的路径(set-primary 等全走 LambdaUpdateWrapper 逃过),验收首日即踩爆。
修复:注册拦截器(@Version 语义同时就位,票 13 切主/CAS 受益);修复后 =1 创建 200、
primaryCustomerId/snapshot 正确回写。全项目影响面仅此 1 处调用。
4. **踩实缺陷 D-24(P2,已修)**:`OpportunityDTO`(detail 出参)漏带 address + keyContactId/keyContactNameSnapshot/
keyContactCompanySnapshot,新建成功但详情回显 None。修复:DTO 补 4 同名字段(fromEntity 走
BeanUtils.copyProperties 自动拷贝)。
**自测(Playwright,selftest-12.py)**:泳道 5 列/翻页到底 ✓、对话框 20 字段 ✓、三级级联 ✓、
=1 主要意向路径创建成功 + detail 断言 10 项全绿(880000.5/地址/概况/110101/主客户冗余 99001+名/王工+甲方Y公司)、
=0 普通关联路径创建成功、console/page errors: 0、failed requests: 0;6 张截图落 demo/shot-12-*.png。
回归:crm-opportunity 单测 233/233 全绿;BOM 扫描 0。远程库新增演示数据:demo-12-*/750036429899300864 等 5 条。
**验收入口**:双击 `.scratch/opportunity-e2e/demo/index.html`(后端已按本票产物起服:verify profile + MinIO 凭据)。