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.

97 lines
9.0 KiB

7 days ago
# 票 04 — Agent 浏览器自测报告(opportunity-acceptance)
- **执行时间**:2026-08-31 15:20 ~ 16:12(多轮:诊断 → 修复 → 复测,终轮全绿)
- **被测对象**:`.scratch/opportunity-e2e/demo/index.html`(file:// 打开,AJAX 直连 `localhost:8080`)× verify 后端(fat jar,远程 DB 8.129.84.155/crm,MinIO 凭据注入)
- **自动化**:Playwright(headless Chromium 1440×900),脚本 `accept-selftest.py`(本目录),结果 `selftest-result.json`,截图 `shots/accept-*.png`
- **终轮结果**:**31/31 PASS,0 FAIL,page_errors 0,console_errors 0**
## 一、结论
「后端修复可信、测试全绿、Demo 可演示」三条件在浏览器 UI 层面全部成立:
1. **后端修复可信**(与票 01 白盒 / 票 02 E2E 相互印证):
- D-01(opportunity-fix 口径)UI 端到端验证:新建商机 → toast 含 id → 直达详情 → **阶段进度 5 节点、落首阶段 CURRENT**(accept-22;库证 progress nodes=[CURRENT,PENDING×4]);
- 六必填(D-14)前端拦截 errbox 逐字段提示与后端 66001 同款(accept-21);
- 状态机 E4/E5:暂缓 → badge=暂缓中(accept-24),取消暂缓 → badge=推进中(accept-25),两次均有库证(oppStatus 2→3→2)。
2. **测试全绿**:31 断言全过,全程 **0 页面异常、0 console error**
3. **Demo 可演示**:列表多视图 / 看板 / 详情九子表 / 工作计划 / 规则三族 / 用户切换全功能面可操作;20260829 四修复点无回归。
## 二、自测发现并修复的 3 个 Demo 缺陷(本轮核心价值)
前序 effort(票 02 E2E 为 API 级、票 03 subapi 为 requests 直测)均未覆盖的 **UI 集成面缺陷**,本轮浏览器自测暴露,已当场修复并复测:
| # | 缺陷 | 根因 | 修复 | 复测 |
|---|------|------|------|------|
| **demo-B1** | 切视图后列表显示空页/错误页码(如公海显示「共 3 条 · 第 2 页」且无数据) | `pickView`/查询切换后 `S.total` 残留旧视图值,`loadList(1)` 用旧 total 误自动翻页 | `pickView`、`onCview`、查询按钮三处补 `S.total = 0`(查询同时重置 `S.page=1`) | accept-03 第 1 页 3 条 ✓、accept-04 筛选 2 行 ✓ |
| **demo-B2**(高危) | **全部无返回值写端点在 UI 上静默失败**:暂缓/恢复/领取/分配/关闭/重启/移交/抛公海/切阶段/关注/编辑/存视图/规则发布·停用·删除等,点击后请求成功但页面无任何反应(框不关、无成功 toast、不刷新),人工会误判为功能故障并重复点击触发业务错 | 成功判定 `await tryApi(step, fn) != null`:这些端点响应 `data=null`(实锤 `{"code":0,"success":true,"data":null}`),`api()` 返回 null → 判定 false → 成功路径被跳过 | 新增 `okApi`(「不抛错即成功」,失败 err toast),替换 19 处判定(`fix-demo-b2.py` 留档) | 暂缓/恢复 UI 闭环 ✓(accept-24/25,badge 实时变化) |
| **demo-B3** | 新增/编辑工作计划:浏览器分钟精度 deadline(`2026-09-02 10:00`)被后端拒绝(DTO `@DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")` 强制带秒),保存报错,人工演示必踩 | `doWorkPlanSave` 未补秒 | `dl.length === 16 ? dl + ':00' : dl` | accept-17~20 工作计划全闭环 ✓ |
> 修复后**全量复跑** 31/31 全绿。demo 三处修复均为前端改动,不触碰已验收的后端。
## 三、断言清单与截图索引
| # | 断言 | 结果 | 证据 |
|---|------|------|------|
| 00 | 启动自动登录(管理员罗伟健) | PASS | whoBox 文本 |
| 01 | 列表-我负责的(admin,1 条) | PASS | [accept-01](shots/accept-01-列表-我负责的.png) |
| 02 | 列表-管理全量(14→17 条,随自测新增递增) | PASS | [accept-02](shots/accept-02-列表-管理全量.png) |
| 03 | 列表-公海(3 条待领取,第 1 页) | PASS | [accept-03](shots/accept-03-列表-公海.png) |
| 04 | 关键词筛选「智慧园区」(2 行全命中) | PASS | [accept-04](shots/accept-04-列表-关键词筛选.png) |
| 05 | 看板汇总(阶段节点渲染) | PASS | [accept-05](shots/accept-05-看板汇总.png) |
| 06 | 详情总览 + **阶段进度 5 节点**(e2e-A-二期) | PASS | [accept-06](shots/accept-06-详情总览-阶段进度5节点.png) |
| 07 | 跟进子表 toolbar(20260829 修复点①) | PASS | 同 08 截图 |
| 08 | 写跟进成功 + **loadDetail 刷新最近有效跟进锚点**(修复点③;15:47:07→16:10:28 库证) | PASS | [accept-08](shots/accept-08-写跟进成功.png) |
| 09 | 勘察子表 toolbar(修复点①) | PASS | [accept-09](shots/accept-09-子表-现场勘察.png) |
| 10 | 关联客户(3 条) | PASS | [accept-10](shots/accept-10-子表-关联客户.png) |
| 11 | 团队成员(3 条) | PASS | [accept-11](shots/accept-11-子表-团队成员.png) |
| 12 | 方案卡详情 **d.fields 键值 8 项**(修复点②) | PASS | [accept-12](shots/accept-12-方案卡详情.png) |
| — | 方案卡列表(3 卡) | — | [accept-13](shots/accept-13-子表-方案卡列表.png) |
| 14 | 附件(空态文案正确) | PASS | [accept-14](shots/accept-14-子表-附件.png) |
| 15 | 操作日志**分形态渲染**(修复点④,4329 字符) | PASS | [accept-15](shots/accept-15-子表-操作日志.png) |
| 16 | 阶段历史 | PASS | [accept-16](shots/accept-16-子表-阶段历史.png) |
| 17 | 工作计划入口(票 03 接入) | PASS | 同 18 截图 |
| 18 | **工作计划三形态实时判定**(badge 逾期/临期/进行中) | PASS | [accept-17](shots/accept-17-工作计划三形态.png) |
| 19 | 登记完成 + finishTime 服务端回填 | PASS | [accept-18](shots/accept-18-工作计划登记完成.png) |
| 20 | 编辑部分更新 | PASS | [accept-19](shots/accept-19-工作计划编辑.png) |
| 21 | 删除软删(列表消失 + 库证) | PASS | [accept-20](shots/accept-20-工作计划删除.png) |
| 22 | 新建-六必填前端拦截(errbox 6 字段) | PASS | [accept-21](shots/accept-21-新建-六必填拦截.png) |
| 23 | 新建成功直达详情**落首阶段 5 节点**(D-01) | PASS | [accept-22](shots/accept-22-新建-成功直达详情.png) |
| 24 | 暂缓对话框(E4,原因下拉字典化) | PASS | [accept-23](shots/accept-23-暂缓对话框.png) |
| 25 | 暂缓成功(badge=暂缓中) | PASS | [accept-24](shots/accept-24-暂缓成功.png) |
| 26 | 取消暂缓(badge=推进中) | PASS | [accept-25](shots/accept-25-恢复成功.png) |
| 27 | 规则-公海与提醒族 | PASS | [accept-26](shots/accept-26-规则-公海与提醒.png) |
| 28 | 规则-商机阶段设置(**OPP_STAGE_TPL_01 预设模板在列**,64018 保护对象可见) | PASS | [accept-27](shots/accept-27-规则-商机阶段设置.png) |
| 29 | 规则-方案卡模板(24 行) | PASS | [accept-28](shots/accept-28-规则-方案卡模板.png) |
| 30 | 规则详情对话框(版本/状态/节点·字段明细) | PASS | [accept-29](shots/accept-29-规则详情.png) |
| 31 | 切换用户 A 赖永利(数据权限视图) | PASS | [accept-30](shots/accept-30-切换用户A.png) |
## 四、已知形态(非缺陷,人工验收预期管理)
- **阶段历史行显示原始 stageId**(`→ 7478313028`):seed 直插历史的 fromStageName/toStageName 快照为空,demo 回退显示 id——seed 数据形态,非渲染缺陷;
- **附件 Tab 空态**:上传依赖 MinIO(F08 ⚠ 外部依赖),E2E 单独验证过;
- 关联客户/团队成员的 **demo 写入口缺失**(后端六端点已修复=票 04,demo 前端未实现添加/编辑按钮,仅只读展示);
- 页面顶部 D-xx mark 徽标为**写死的过时标注**:对应后端缺陷已在 bugfix effort 全部闭环(19 修 + 3 翻案 D-08/18/19),徽标仅提示历史缺陷位置,非现存缺陷(现存问题总清单见 acceptance-checklist.md §四);
## 五、测试数据留存(无碍 E2E 基线)
- e2e-A-推进-智慧园区二期:新增 3 条 accept-自测跟进(lastValidFollowTime=最新一条,状态未动);
- demo-验收-新建闭环:wp 已清空(三形态闭环建→完成→编辑→删验证后清理);
- 新建 3 个商机:accept-自测-新建{3 个时间戳}(终轮 id=749662392819908608,暂缓→已恢复=推进中);
- 全部数据以 accept- 前缀命名,不影响 seed v2 基线与后续 E2E 重跑(seed 全量重置可清)。
## 六、复跑方式
```powershell
python -X utf8 .scratch\opportunity-acceptance\accept-selftest.py
```
前置:后端 8080 在跑(起服命令见 map.md 环境节);WP_OPP(demo-验收-新建闭环)的 wp 为空(脚本自建自清,异常中断后手工清理即可)。
## 附:过程文件
- `accept-selftest.py`:终版自测脚本(Python 轮询等待,31 断言)
- `fix-demo-b2.py`:demo-B2 修复脚本(okApi + 19 处判定替换,含替换前原文)
- `fix-wait-helpers.py`:自测脚本等待机制改造脚本(wait_for_function → Python 轮询)
- `probe-wff.py` / `check-syntax.py`:诊断与语法检查辅助
- `selftest-result.json`:终轮机器可读结果