{ "ts": "172728", "console_errors": [ "Access to fetch at 'http://localhost:8080/api/log/batch/download?ids=752581017469976576&ids=752581021928521728' from origin 'null' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.", "Failed to load resource: net::ERR_FAILED", "Failed to load resource: the server responded with a status of 403 ()", "Failed to load resource: the server responded with a status of 403 ()", "Failed to load resource: the server responded with a status of 403 ()" ], "page_errors": [], "results": [ { "step": "登录 debug/token + /auth/me", "ok": true, "note": "" }, { "step": "同步任务 launch(任务编号格式 + 61023 两态容忍)", "ok": true, "note": "61023 并发占位生效:已有同步任务运行中,请稍后再试 (已有任务运行中——复用运行中任务验证任务化结构,契约两态容忍)" }, { "step": "同步记录分页 + 开始时间倒序", "ok": true, "note": "rows=1 desc=True first=2026-09-08 16:38:00" }, { "step": "任务详情五块结构(含 failDetails 失败明细)", "ok": true, "note": "详情五块结构在位:taskNo=SYNC-0908-01,status=同步中,进度=5%,失败明细 0 条" }, { "step": "同步设置回显(派生 plan/nextExecuteTime/lastModifierName)", "ok": true, "note": "设置回显:autoSyncEnabled=true,dailyTime=02:00,retryIntervalMinutes=10,retryMaxTimes=2,concurrency=1 派生:当前计划=每日 02:00(运行中),下次" }, { "step": "设置保存回显(interval=2 次数=3 并发=1)", "ok": true, "note": "合法设置保存并回显:interval=2,次数=3,并发=1(autoSyncEnabled/dailyTime 保留原值不污染调度)" }, { "step": "设置边界 61022 双路(间隔<1min / 次数<1 拒)", "ok": true, "note": "61022 边界校验两路生效:间隔<1min 拒(重试间隔不能小于 1 分钟);次数<1 拒(重试次数不能小于 1 次)" }, { "step": "设置还原(不污染调度原值)", "ok": true, "note": "设置已还原(interval=10,次数=2,并发=1,dailyTime=02:00)" }, { "step": "lastSyncTime 切表口径 + 下次执行时间推导", "ok": true, "note": "lastSyncTime 验证:无成功任务行 → lastSyncTime 为空(口径自洽) 下次执行时间推导:autoSyncEnabled=true,nextExecuteTime=2026-09-09 02:00:00(推导一致)" }, { "step": "AOP 写端点采集素材(建/删演示角色)", "ok": true, "note": "写操作完成:建/删演示角色 e2d-日志演示角色-172728(等待采集落库后断言)" }, { "step": "操作日志分页(新增/删除行命中 + 时间范围逐字段)", "ok": false, "note": "失败: AOP 采集行未命中: 新增=false 删除=true" }, { "step": "登录日志「退出」行(内联埋点 + token 重铸)", "ok": false, "note": "失败: 登录日志「退出」行未命中(operatorName=罗伟健)" }, { "step": "批量日志「导出」行(result+fileId+ZIP 魔数)", "ok": true, "note": "导出留档行命中:page=线索设置,result=成功,countDetail=成功导出 2 条公海池,fileId=752581016106827776 (导出字节 4204,ZIP 魔数 ✓)" }, { "step": "批量日志「导入」行(BatchResult 计数)", "ok": true, "note": "导入行命中:result=成功,countDetail=成功导入 1,导入失败 0,fileId=(无失败明细→无错误报告文件,合理) BatchResult: total=1,success=1,fail=0" }, { "step": "结果文件下载 /api/log/batch/file(ZIP 魔数)", "ok": false, "note": "失败: 结果文件非 ZIP(xlsx):102 字节" }, { "step": "打包下载 /api/log/batch/download ids[](ZIP 魔数)", "ok": false, "note": "失败: Failed to fetch" }, { "step": "不存在文件 id 错误形态(40401/66001/404)", "ok": false, "note": "失败: 不存在的文件 id 竟返回 96 字节——未被拦截" }, { "step": "BUDDY 三 page 权限拒绝(ADMIN 门禁)", "ok": true, "note": "非管理员权限口径生效(ADMIN 门禁): page=拒绝 ✓(HTTP 403) page=拒绝 ✓(HTTP 403) page=拒绝 ✓(HTTP 403)" }, { "step": "公海规则发布(部门专用)+ boundOppCount 基线", "ok": false, "note": "失败: 无可用发布中部门专用规则(含本部门)" }, { "step": "商机 A → boundOppCount=base+1(match 语义)", "ok": false, "note": "失败: 先执行步骤1" }, { "step": "商机 B → boundOppCount=base+2(动态统计非快照)", "ok": false, "note": "失败: 先执行步骤1" }, { "step": "默认规则兜底口径(无默认规则降级提示)", "ok": true, "note": "当前无发布中默认规则 → 兜底口径断言降级为提示(口径已由 crm-rule 单测覆盖:默认计数=不命中发布中专用规则的商机数,排除集=发布中专用规则部门并集)" }, { "step": "清理(商机 close 正门 + 规则停用)", "ok": true, "note": "清理完成:关停演示商机 0/0(close 终态;已关闭仍计数,仅 opp_status=5 排除——增量口径跨轮安全);无本轮规则" }, { "step": "网络层零旧契约形态", "ok": true, "note": "bad_method=[] old_style=[] (共55请求)" } ], "all_pass": false }