在前后端开发联调前 的提交20260223

This commit is contained in:
Neo
2026-02-23 23:02:20 +08:00
parent 254ccb1e77
commit fafc95e64c
1142 changed files with 10366960 additions and 36957 deletions

View File

@@ -0,0 +1,170 @@
- [P20260221-195105] 2026-02-21 19:51:05 +0800
- summary: CONTEXT TRANSFER: We are continuing a conversation that had gotten too long. Here is a summary: --- ## TASK 1: 前后端联调 — a…
- prompt:
```text
CONTEXT TRANSFER: We are continuing a conversation that had gotten too long. Here is a summary:
---
## TASK 1: 前后端联调 — admin-web 任务配置、提交、执行、验证
**STATUS**: in-progress
**USER QUERIES**: All queries in this conversation are continuations of the same task from previous context transfers.
**SHORT DESCRIPTION**: 前后端联调:通过 admin-web 浏览器配置 ETL 任务api_full, full_window, 2025-11-01~2026-02-20, 30天窗口切分, force-full, 31个任务提交执行修复发现的 BUG做回归测试和数据检验输出详细文档。
**DETAILS**:
### 第一次执行(已完成)
- execution_id: `dbf0c29a-253a-4705-a1ef-35cd71243d48`
- 结果: 10 成功, 31 失败, 耗时 590.7s
- 根因: `DWS_ASSISTANT_DAILY` SQL 字段引用错误 → 已修复 4 处改动
- 文档已导出: `export/SYSTEM/LOGS/2026-02-21__etl_run_result.md`, `export/SYSTEM/LOGS/2026-02-21__dws_assistant_daily_bug_fix.md`
### 第二次执行(已完成分析)
- execution_id: `e21e1935-5abf-434f-9984-69c492402db7`
- 结果: status=success, exit_code=0, 耗时 150.4s, 31 个任务
- `DWS_ASSISTANT_DAILY` ✅ 修复验证通过
- `DWS_ASSISTANT_MONTHLY` ❌ UniqueViolation → 已修复
- `DWS_ASSISTANT_CUSTOMER` ❌ UndefinedColumn site_id → 已修复
- 其余 28 个任务 ❌ InFailedSqlTransaction 级联失败
- 文档已导出: `export/SYSTEM/LOGS/2026-02-21__etl_run_result_v2.md`
### 已修复的 BUG 1第一次执行发现第二次验证通过
**文件**: `apps/etl/connectors/feiqiu/tasks/dws/assistant_daily_task.py`4 处改动:
1. `_extract_trash_records` — SQL 字段名修正
2. `_extract_service_records` — 新增 LEFT JOIN `dwd_assistant_service_log_ex` 取 `is_trash`
3. `_build_trash_index` — key 改为 `assistant_trash_event_id`
4. `_aggregate_by_assistant_date` — 废除判断改用 `is_trash` 字段
### 已修复的 BUG 2第二次执行发现已修复待第三次验证
**文件**: `apps/etl/connectors/feiqiu/tasks/dws/assistant_monthly_task.py`
- **问题**: `_extract_daily_aggregates` 的 SQL `GROUP BY` 包含了 `assistant_nickname, assistant_level_code, assistant_level_name`,当助教月内改名/升级时产出多条同 `(assistant_id, stat_month)` 记录,导致 `bulk_insert` 违反 `uk_dws_assistant_monthly` 唯一约束
- **修复**: GROUP BY 去掉 nickname/level 维度字段,改用 `MAX()` 聚合函数取值。只按 `assistant_id, DATE_TRUNC('month', stat_date)` 分组
- **修复位置**: `_extract_daily_aggregates` 方法(约 line 265-295已添加 CHANGE 注释
### 已修复的 BUG 3第二次执行发现已修复待第三次验证
**文件**: `apps/etl/connectors/feiqiu/tasks/dws/assistant_customer_task.py`
- **问题**: `_extract_member_info` 方法 SQL 中 `WHERE site_id = %s` 引用了不存在的字段(`dwd.dim_member` 表没有 `site_id` 字段,只有 `register_site_id` 和 `tenant_id`
- **修复**: 改为 `WHERE register_site_id = %s AND scd2_is_current = 1`
- **修复位置**: `_extract_member_info` 方法(约 line 246-265已添加 CHANGE 注释
### 第三次执行(正在运行中)
- execution_id: `abc94b2d-615f-42ea-83cc-ce687524a6ea`
- 提交脚本: `scripts/ops/resubmit_v3.py`
- 轮询脚本: `scripts/ops/poll_v3.py`(进程 17后台运行
- 最后检查时已运行 ~7 分钟status=running比前两次长可能因为修复后更多任务实际处理数据而非级联失败
- 日志将自动保存到 `export/SYSTEM/LOGS/2026-02-21__etl_run_raw_v3.json`
**NEXT STEPS**:
1. **检查第三次执行结果** — 查看进程 17 的输出,确认 execution 是否完成
2. **分析第三次执行日志** — 读取 `export/SYSTEM/LOGS/2026-02-21__etl_run_raw_v3.json`,逐任务分析成功/失败
3. **验证 BUG 2 修复** — 确认 `DWS_ASSISTANT_MONTHLY` 不再报 UniqueViolation
4. **验证 BUG 3 修复** — 确认 `DWS_ASSISTANT_CUSTOMER` 不再报 UndefinedColumn
5. **导出第三次执行结果报告** — 类似 v1/v2 的 markdown 报告
6. **导出 BUG 2+3 修复报告** — 类似 `dws_assistant_daily_bug_fix.md` 的格式
7. **运行 /audit** — 3 个 `tasks/` 文件的修改命中高风险路径,需要审计
### 认证信息:
- refresh_token7 天有效,到 2026-02-28: `eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxIiwic2l0ZV9pZCI6Mjc5MDY4NTQxNTQ0MzI2OSwidHlwZSI6InJlZnJlc2giLCJleHAiOjE3NzIyNjM0NjN9.XYoda5lfxNtTSAGWoLlYhS9cA-hTK9iqK0SqUyn2KV4`
- 刷新 API: `POST http://localhost:8000/api/auth/refresh` body: `{"refresh_token": "..."}`
- access_token 缓存在 `scripts/ops/.monitor_token`30 分钟有效)
- 后端 API: `http://localhost:8000/api/execution/run` (POST), `/api/execution/history` (GET), `/api/execution/{id}/logs` (GET)
### 提交执行的正确配置:
```python
config = {
"tasks": [...],
"flow": "api_full",
"processing_mode": "full_window",
"window_mode": "custom",
"window_start": "2025-11-01",
"window_end": "2026-02-20",
"window_split": "month",
"window_split_days": 30,
"force_full": True,
"dry_run": False,
"lookback_hours": 24,
"overlap_seconds": 600,
}
```
### DWD 表结构速查:
- `dwd.dim_member`: `member_id` BIGINT, `system_member_id`, `tenant_id`, `register_site_id` (注意:无 `site_id` 字段), `mobile`, `nickname`, `member_card_grade_code`, `member_card_grade_name`, `create_time`, `update_time`, SCD2 字段。PK: `(member_id, scd2_start_time)`
- `dwd.dim_assistant`: 有 `site_id` 字段, `assistant_id`, `nickname`, `level`, `entry_time`, SCD2 字段
- `dws.dws_assistant_monthly_summary`: UK `(site_id, assistant_id, stat_month)`
- `dws.dws_assistant_daily_detail`: 有 `site_id`, `assistant_id`, `stat_date`, `assistant_nickname`, `assistant_level_code`, `assistant_level_name`
### ETL 执行流程关键信息:
- `base_task.py``execute` 方法:按窗口段循环调用 extract → transform → load → commit失败则 rollback
- `_delete_by_months``bulk_insert` 都用 `self.db.conn.cursor()`,同一事务
- `_filter_months_for_schedule` 默认只允许当前月份(和月初宽限期内的上月),除非 `allow_history=True`
**RUNNING PROCESSES**:
- 进程 6: `pnpm dev` in `apps/admin-web`(前端 dev server, port 5173
- 进程 17: `python poll_v3.py` in `scripts/ops`(轮询第三次执行结果,正在运行)
- 后端 uvicorn PID 3644通过 Start-Process 启动, port 8000, 非 Kiro 管理)
**BROWSER STATE**:
- Playwright 浏览器在 http://localhost:5173/(任务配置页面)
**FILEPATHS**:
- `apps/etl/connectors/feiqiu/tasks/dws/assistant_daily_task.py` — 已修复 BUG 1验证通过
- `apps/etl/connectors/feiqiu/tasks/dws/assistant_monthly_task.py` — 已修复 BUG 2待验证
- `apps/etl/connectors/feiqiu/tasks/dws/assistant_customer_task.py` — 已修复 BUG 3待验证
- `apps/etl/connectors/feiqiu/tasks/dws/base_dws_task.py` — bulk_insert 方法所在
- `apps/etl/connectors/feiqiu/tasks/base_task.py` — execute 方法(窗口切分+E/T/L 流程)
- `apps/backend/app/schemas/tasks.py` — TaskConfigSchema 定义
- `apps/backend/app/routers/execution.py` — 后端执行 API
- `apps/backend/app/services/cli_builder.py` — CLI 命令构建
- `scripts/ops/resubmit_v3.py` — 第三次执行提交脚本
- `scripts/ops/poll_v3.py` — 第三次执行轮询脚本(进程 17
- `scripts/ops/resubmit_failed.py` — 第二次执行提交脚本
- `scripts/ops/_env_paths.py` — 共享路径工具
- `scripts/ops/_check_token.py` — token 检查工具
- `scripts/ops/_fetch_logs.py` — 日志获取工具
- `export/SYSTEM/LOGS/2026-02-21__etl_run_result.md` — 第一次执行结果报告
- `export/SYSTEM/LOGS/2026-02-21__dws_assistant_daily_bug_fix.md` — BUG 1 修复报告
- `export/SYSTEM/LOGS/2026-02-21__etl_run_result_v2.md` — 第二次执行结果报告
- `export/SYSTEM/LOGS/2026-02-21__etl_run_raw_v2.json` — 第二次原始数据
- `export/SYSTEM/LOGS/2026-02-21__etl_run_raw_v3.json` — 第三次原始数据(待生成)
- `db/etl_feiqiu/schemas/dwd.sql` — DDL 参考
- `db/etl_feiqiu/schemas/dws.sql` — DDL 参考
## USER CORRECTIONS AND INSTRUCTIONS:
- 所有输出文件必须写入 `export/` 目录体系,通过 `.env` 环境变量控制路径export-paths.md 强制规范)
- `scripts/ops/` 脚本通过 `_env_paths.get_output_path("变量名")` 读取输出路径
- 测试必须使用完整 `.env` 加载cwd 与正式运行一致testing-env.md 强制规范)
- 所有说明性文字使用简体中文language-zh.md 强制规范)
- 脚本级任务优先编写 Python 脚本执行,避免 PowerShell 复杂逻辑
- 一次性运维脚本放 `scripts/ops/`
- 高风险路径变更需审计(`tasks/` 目录下的修改需要审计)
- `window_split` 参数有效值是 `none/day/week/month`,不是 `split`
- 提交执行前需要用 refresh_token 刷新 access_token30 分钟过期)
## Files to read
- `export/SYSTEM/LOGS/2026-02-21__etl_run_raw_v3.json` — 第三次执行原始日志(最重要,需要分析结果)
- `apps/etl/connectors/feiqiu/tasks/dws/assistant_monthly_task.py` — 已修复 BUG 2
- `apps/etl/connectors/feiqiu/tasks/dws/assistant_customer_task.py` — 已修复 BUG 3
- `scripts/ops/poll_v3.py` — 轮询脚本,检查进程 17 是否完成
- `scripts/ops/_env_paths.py` — 共享路径工具
- `export/SYSTEM/LOGS/2026-02-21__etl_run_result_v2.md` — 第二次执行结果(对比参考)
USER QUERIES(most recent first):
1. Output:
Command executed successfully with no output.
Exit Code: 0
2. Output:
Command executed successfully with no output.
Exit Code: 0
---
METADATA:
The previous conversation had 2 messages.
INSTRUCTIONS:
Continue working until the user query has been fully addressed. Do not ask for clarification - proceed with the work based on the context provided.
IMPORTANT: you need to read from the files to Read section
```