# 实现计划：ETL 全流程前后端联调（etl-fullstack-integration）

## 概述

基于 `admin-web-console` 已完成的前后端代码，进行端到端联调验证。全程使用 Playwright 浏览器模拟真实用户操作（登录、配置、提交、监控），不直接调用 API。通过管理后台 UI 提交 api_full 全流程 ETL 任务（自定义窗口 2025-11-01~当前时间，30天切分，force-full，全选常用任务），实时监控执行过程，收集性能数据，执行黑盒数据一致性测试（全链路检查器 `scripts/ops/etl_consistency_check.py` + FlowRunner 内置 `ConsistencyChecker`），最终生成综合报告。

## 任务

- [x] 1. 服务启动与健康检查
  - [x] 1.1 启动后端服务（`apps/backend/`，uvicorn :8000），确认 API 可达
    - 使用 `controlPwshProcess` 启动 `uvicorn app.main:app --host 0.0.0.0 --port 8000`，cwd 为 `apps/backend/`
    - 等待服务就绪，验证 `http://localhost:8000/docs` 可访问
    - _Requirements: 1.1_

  - [x] 1.2 启动前端服务（`apps/admin-web/`，pnpm dev :5173），确认页面可访问
    - 使用 `controlPwshProcess` 启动 `pnpm dev`，cwd 为 `apps/admin-web/`
    - 等待 Vite 就绪，验证 `http://localhost:5173` 可访问
    - _Requirements: 1.2_

  - [x] 1.3 浏览器登录与健康检查
    - 使用 Playwright 打开 `http://localhost:5173`，应自动跳转到 `/login`
    - 在登录表单中输入用户名 `admin`、密码 `admin123`，点击登录按钮
    - 验证登录成功后跳转到任务配置页面（`/`）
    - 确认侧边栏导航菜单正常渲染（任务配置、任务管理、ETL 状态、数据库、日志、环境配置、运维面板）
    - _Requirements: 1.3, 1.4, 1.5_

- [-] 2. 浏览器操作：任务配置与提交
  - [x] 2.1 在任务配置页面填写全流程参数
    - 在任务配置页面（`/`），选择 Flow 为 `api_full`（API → ODS → DWD → DWS → INDEX）
    - 选择处理模式为 `full_window`（全窗口）
    - 设置时间窗口模式为"自定义"，填入开始时间 `2025-11-01`、结束时间 当前时间
    - 设置窗口切分为"按天"，切分天数为 `30`
    - 勾选 `force_full`（强制全量）
    - 在任务选择区域，全选 `is_common=True` 的常用任务（共 41 个）
    - 确认 CLI 命令预览区域显示完整参数（--flow api_full --processing-mode full_window --window-start ... --window-end ... --window-split day --window-split-days 30 --force-full --tasks ...）
    - _Requirements: 2.1_

  - [x] 2.2 通过浏览器提交任务执行
    - 点击"直接执行"按钮（SendOutlined 图标），触发 `POST /api/execution/run`
    - 确认页面显示任务提交成功的提示消息
    - 记录返回的 execution_id（从页面响应或跳转中获取）
    - _Requirements: 2.2, 2.4_

- [x] 3. 浏览器操作：执行监控与 DEBUG
  - [x] 3.1 在任务管理页面监控执行状态
    - 导航到"任务管理"页面（`/task-manager`），点击侧边栏"任务管理"菜单
    - 在"队列"Tab 中确认刚提交的任务状态为 `running`
    - 点击 running 状态的任务行，打开 WebSocket 实时日志流抽屉
    - 持续观察日志输出，每 30 秒检查一次页面状态
    - 检测日志中的 ERROR / CRITICAL / Traceback / Exception / WARNING 关键字
    - 如果连续 30 分钟无新日志输出，报告超时警告
    - 任务完成（success/failed/cancelled）时停止监控
    - _Requirements: 3.1, 3.2, 3.3, 3.4, 3.5_

  - [x] 3.2 对执行过程中发现的错误/警告进行 DEBUG 分析
    - 从日志流中收集所有 ERROR 和 WARNING 日志行及其上下文
    - 分析错误类型：API 超时、数据库连接、数据质量、配置问题等
    - 如果任务失败，切换到"历史"Tab 查看完整执行详情和日志
    - 记录 DEBUG 发现到报告中
    - _Requirements: 3.2, 3.5_

- [x] 4. 性能计时与报告生成
  - [x] 4.1 从浏览器获取执行日志，提取精细计时数据
    - 在"任务管理"→"历史"Tab 中，点击已完成的任务查看执行详情
    - 通过 `GET /api/execution/{id}/logs` 获取完整日志（可通过浏览器或 API 辅助）
    - 从日志中提取每个窗口切片（30天）的开始/结束时间
    - 计算每个切片的耗时
    - 识别 ODS / DWD / DWS / INDEX 各阶段的耗时
    - 标注 Top-5 耗时最长的阶段/任务
    - _Requirements: 4.1, 4.2, 4.3, 4.4_

  - [x] 4.2 生成综合联调报告，输出到 SYSTEM_LOG_ROOT
    - 报告包含：执行概要（参数、时间、退出码）
    - 报告包含：性能报告（各切片耗时对比、Top-5 瓶颈）
    - 报告包含：DEBUG 报告（如有错误/警告）
    - 黑盒测试结果摘要将在任务 5.3 中追加
    - 输出路径：`{SYSTEM_LOG_ROOT}/{date}__etl_integration_report.md`
    - 路径通过 `SYSTEM_LOG_ROOT` 环境变量获取，缺失时报错
    - _Requirements: 6.1, 6.2, 6.4, 6.5_

- [x] 5. 黑盒数据一致性测试
  - [x] 5.1 运行全链路检查器，执行 API→ODS→DWD→DWS 四层数据一致性检查
    - 运行 `uv run python scripts/ops/etl_consistency_check.py`（cwd 为项目根目录 `C:\Project\NeoZQYY`）
    - 脚本自动从 `LOG_ROOT` 找到最近一次 ETL 日志，解析本次执行的任务列表
    - 脚本自动从 `FETCH_ROOT` 读取 API JSON 落盘文件
    - 脚本连接数据库（`PG_DSN`），逐表逐字段比对：
      - API JSON vs ODS：字段完整性 + 值采样比对（随机 5 条记录），`ETL_META_COLS` 白名单列排除
      - ODS vs DWD：行数对比 + 字段映射 + 值比对（含 EX 表合并），`SCD2_COLS` 白名单列排除
      - DWD vs DWS：聚合表行数非空检查 + 数值列健全性（NULL 率、负值、min/max）
    - 白名单处理：API 空字符串 `""` vs DB `None` 视为等价，标记为 whitelist，不计入失败
    - 报告自动输出到 `ETL_REPORT_ROOT`（环境变量，缺失时报错）
    - 备选触发方式：可通过 `etl-data-consistency` Hook 手动触发（效果等同）
    - _Requirements: 5.1, 5.2, 5.3, 5.4, 5.5_

  - [x] 5.2 检查 FlowRunner 内置一致性报告
    - FlowRunner 在 ETL 执行完成后已自动调用 `_run_post_consistency_check()` 生成报告到 `ETL_REPORT_ROOT`
    - 确认内置报告已生成，检查 API vs ODS 和 ODS vs DWD 的通过/失败统计
    - 内置检查使用 `ODS_META_COLUMNS` 白名单（含 `record_index`）和 `KNOWN_NO_SOURCE` 按表白名单
    - 对比两份报告的结论是否一致（全链路检查器 vs FlowRunner 内置检查）
    - _Requirements: 5.1, 5.2, 5.3_

  - [x] 5.3 将黑盒测试结果摘要写入综合联调报告
    - 在任务 4.2 生成的联调报告中追加"黑盒测试报告"章节
    - 包含：API vs ODS 通过数/总数、ODS vs DWD 通过数/总数、DWD vs DWS 表概览
    - 包含：白名单差异数量统计、失败表清单
    - 引用全链路检查报告的完整路径
    - _Requirements: 6.3_

- [x] 6. 服务清理
  - [x] 6.1 关闭浏览器，停止后端和前端服务，清理资源
    - 关闭 Playwright 浏览器实例
    - 停止 uvicorn 后端进程（`controlPwshProcess` stop）
    - 停止 pnpm dev 前端进程（`controlPwshProcess` stop）
    - 报告联调完成状态

## 说明

- 本 Spec 为运维联调任务，不涉及新功能代码开发
- 不编写属性测试或单元测试，联调本身即为集成验证
- **全程使用 Playwright 浏览器模拟真实用户操作**：登录、页面导航、表单填写、按钮点击、日志查看等均通过浏览器完成
- **黑盒测试使用两套工具**：
  - 全链路检查器 `scripts/ops/etl_consistency_check.py`：覆盖 API→ODS→DWD→DWS 四层，联调主要使用
  - FlowRunner 内置 `ConsistencyChecker`（`quality/consistency_checker.py`）：ETL 执行后自动运行，覆盖 API→ODS + ODS→DWD
- **白名单机制**：`ETL_META_COLS`（ODS 元数据列）、`SCD2_COLS`（SCD2 管理列）排除在值比对之外；API 空字符串 `""` vs DB `None` 视为等价
- **`etl-data-consistency` Hook**（`.kiro/hooks/etl-data-consistency.kiro.hook`）可作为手动触发全链路检查的替代方式
- 黑盒测试在 ETL 全流程执行完成后、服务清理前执行，确保数据库中有最新数据可供对比
- 全选常用任务 = 任务注册表中 `is_common=True` 的所有任务（共 41 个）
- "全部门店"：当前系统仅有 site_id=1（默认管理员绑定），如需多门店需逐个执行
- 监控允许空闲等待，最长 30 分钟无新日志才报超时
- 报告输出路径遵循 export-paths 规范：全链路检查报告输出到 `ETL_REPORT_ROOT`，联调综合报告输出到 `SYSTEM_LOG_ROOT`
- 全链路检查器需要 `PG_DSN`、`FETCH_ROOT`、`LOG_ROOT`、`ETL_REPORT_ROOT` 环境变量，缺失时报错
