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.

60 lines
7.4 KiB

2 days ago
# 05 a7-heavy 补码成果 Demo E2E(浏览器级冒烟)
Type: task
4 hours ago
Status: resolved
2 days ago
Blocked by: 01, 02, 03
4 hours ago
> Claimed 2026-09-08 wayfinder session(handoff-a7-heavy-05 换机续接收尾),同日 resolved(见下 Answer)。
2 days ago
## Question
参照一期 [13-e2e-demo-smoke](../../a7-parity/issues/13-e2e-demo-smoke.md) 模式,对票 01–03 落地的二期补码成果做浏览器级 e2e 验证。底座**复用 a7-parity demo**(CSS / uid 直登 / toast / 弹窗 / api helper / 步骤面板 JS 模式,沿用 v2 修订后形态——`outBox/logLine` 助手收裸 id 走 `document.getElementById`),**新建** `.scratch/a7-heavy/demo/index.html`(不改动一期 demo),tab 仅覆盖二期三域;TS 经 URL `?ts=` 注入对齐脚本侧。
1. **同步任务(票 01)**
- 发起同步任务化:POST /sync/dingtalk 返任务编号(`SYNC-MMDD-序号` 格式断言)。⚠️ verify 环境钉钉凭据可达性票内核实——同步失败亦应有任务行(执行状态=失败+失败明细结构完整),demo 两态容忍(任务化契约验证为主,不预设同步成功)。
- tasks/page 筛选(任务编号/触发方式/执行状态)+ 时间倒序断言;tasks/detail 结构(执行结果/失败对象/接口错误/处理结果/进度)。
- settings 查询默认值 → 保存合法值 → 边界校验拒绝(重试间隔<1min次数<1断言新错误码)→ **还原设置**不污染环境)。
- users/stats.lastSyncTime 数据源切换验证(口径=任务表最新成功行;环境同步失败则无值,断言策略票内定)。
- 自动调度(@Scheduled 每日触发)不进 e2e(时间不可控,单测覆盖);仅验 settings 出参「下次执行时间」推导。
2. **全局日志(票 02)**
- 采集验证:demo 内做写操作(建/删演示角色)→ operation/page 按操作人筛选出现记录;覆盖端点以票 02 落地清单为准(map 纪律「不追求全端点全采」)。
- 登录日志:⚠️ debug/token 是否落登录日志票内核实(调试端点可能不走正常登录采集点);不落则备选 /auth/login 真实登录一次,或降级为仅验 page 端点+筛选结构。
- 批量日志:LeadPool 导入+导出各一次(复用一期 xlsx 构造与 free_depts 错位取部门)→ batch/page 出现记录(result 含成功/部分成功态)+ /batch/file?id= 下载(ZIP 魔数断言)+ /batch/download ids[] 打包下载。
- 90 天过期不进 e2e(时间不可控,单测覆盖过期分支);e2e 验不存在文件 id 的错误处理(65001 或 404 形态)。
- 权限口径:非管理员 uid(如 BUDDY)调三 page 期望权限拒绝。
- 三 page 筛选逐字段(所属组织模糊/操作人模糊/时间范围/opType 枚举/批量 result 三态)。
3. **公海绑定数(票 03)**
- 建演示部门专用公海规则 → 发布 → 该部门建商机(`POST /api/opportunity/edit`,六必填+省市 code 入参照 opportunity-e2e demo 先例)→ detail `boundOppCount`=1;再建一商机 → =2。
- 默认规则兜底口径断言(按票 03 拍板口径:不命中部门专用规则的商机才入默认规则计数);公海态商机是否计入按票 03 落地口径核。
- 清理:删演示商机/规则(API 正门)。
4. 新建 `demo_smoke.py`(复用一期骨架):pre_clean 幂等清理(演示规则/商机/角色残留;**任务行与日志行为审计数据留存不删**;设置还原)+ 分步断言(run_step 按 `data-tab` 切页 + 分容器断言)+ console/page error 零容忍 + 网络层零 PUT/DELETE/路径变量断言 + 截图落 `shots/` + 结果写 `demo-smoke-result.json`
5. 运行至全 PASS(两轮幂等重跑);发现真实缺陷当场修复需复验(改码后 `clean package` 重打 fat jar 重跑——fat jar 增量静默跳过坑见 opportunity-e2e 环境事实)。
运行环境:同一期(verify profile + MinIO env 起服 fat jar,完整命令见一期 `demo_smoke.py` 头注)。
验收基线:全 PASS 两轮幂等重跑 + console/page error 双零 + 网络层零旧契约形态(零 PUT/DELETE、零路径变量)。
4 hours ago
## Answer
2026-09-08 执行落地。22 步浏览器级冒烟最终**两轮 ALL_PASS**,验收基线全部达成(全 PASS 两轮幂等 + console/page error 双零 + 网络层零旧契约形态:47 请求零 PUT/DELETE、零路径变量)。
**交付物**:`.scratch/a7-heavy/demo/index.html`(3 tab:同步任务/全局日志/公海绑定数,复用一期 demo 底座)+ `demo_smoke.py`(22 步 + pre_clean 幂等 + 截图 shots/ + 结果落 demo-smoke-result.json)。
**轮次轨迹**:首轮 13 PASS / 9 FAIL → 探针定位 5 根因全修 → 21 PASS / 1 FAIL(暴露环境根因,见下)→ 注入 MinIO 凭据 + demo 断言收紧 → 22/22 两轮 ALL_PASS。
**缺陷修复 5 根因(探针轮)**:
1. 源码:`OpLogAspect.resolveOpType` 补 `saveorupdate` 特判(必须先于 update 子串判定),`/api/roles/saveOrUpdate` 由误采「修改」纠正为「新增」。
2. demo:登录日志行断言字段 result → status;`batch/file?id=` 收日志行主键(requireBatchLog→row.fileId,非 fileId 本身);`batch/download` 改 POST(GET 405 且无 CORS 头);`opp-pool-rule/publish` 四旗标全必传(补 recycleRemindEnabled=0,缺则 64008)。
3. smoke:BUDDY 403 的浏览器 console error("status of 403")按预期拒绝豁免,豁免后仍要求真零。
**收尾会话(handoff-a7-heavy-05 换机续接)两段新事实**:
1. **fat jar 重打**:旧 `.jar.original`(9/6 构建)挡 repackage rename → 删除后重打;首次构建遇 JVM C2 原生 OOM(`Chunk::new`,机器 15.4G 物理内存当时仅余 0.4G)→ `MAVEN_OPTS=-Xmx512m -XX:TieredStopAtLevel=1` 关 C2 限堆重试,BUILD SUCCESS 56s,jar 时间戳确认更新(规避增量静默跳过坑)。
2. **第 6 步复跑仍 FAIL(91 字节非 ZIP)→ 根因在环境非代码**:本机起服从未注入 MinIO 凭据(application.yml 兜底 minioadmin ≠ 远程真凭据,启动横幅无报错、直到文件类操作才炸),留档结果文件上传/下载全挂——连带发现第 7 步「打包下载 22 字节 PASS」实为**空 ZIP 误报**(仅 end-of-central-dir 恰 22 字节且魔数合法)。对策:起服注入 `CRM_MINIO_AK` / `CRM_MINIO_SK`(凭据用户实锤,见 customer-e2e 换机环境事实 memory,不落任何仓库文件);demo 第 7 步断言收紧为 `isZip + ≥100 字节`。修复后导出留档真实落库(fileId 对应 4205 字节 ZIP)、单文件下载 4205 字节、打包下载 3661 字节;两轮 ALL_PASS(boundOppCount base 12→14→16,增量口径跨轮安全;pre_clean 每轮清上轮 e2d-导入池;SYNC-0908-01 运行中任务复用走 61023 态,两态容忍设计如约生效)。
**清理**:`probe_once.py` 已删;`/api/roles/page?roleName=e2d-probe` 无残留(角色表仅内置「管理员」)。
**换机后本机环境事实(沉淀)**:构建通道 = IDEA bundled maven + JBR(PATH 无 mvn/java);smoke 解释器 = `.scratch/customer-e2e/.venv10` 的 python -X utf8(playwright + openpyxl,chromium-1234 走默认缓存 `%LOCALAPPDATA%\ms-playwright`);**本机起服完整前提 = verify profile + MinIO AK/SK 环境变量**——此为本票新增硬前提,缺则票 02 全部文件类断言(file/download/ZIP 魔数)必挂且失败形态是 91 字节 JSON 错误信封,极易误判为 demo 缺陷。