init: 项目初始提交 - NeoZQYY Monorepo 完整代码
This commit is contained in:
@@ -0,0 +1,58 @@
|
||||
# etl_cursor 任务游标表
|
||||
|
||||
> 生成时间:2026-02-13
|
||||
|
||||
## 表信息
|
||||
|
||||
| 属性 | 值 |
|
||||
|------|-----|
|
||||
| Schema | etl_admin |
|
||||
| 表名 | etl_cursor |
|
||||
| 主键 | cursor_id |
|
||||
| 唯一约束 | (task_id, store_id) |
|
||||
| 外键 | task_id → etl_task(task_id) ON DELETE CASCADE |
|
||||
| 记录数 | 44 |
|
||||
| 说明 | 记录每个任务/门店的增量窗口水位及最后一次运行 ID,是增量正确性的关键表 |
|
||||
|
||||
## 字段说明
|
||||
|
||||
| 序号 | 字段名 | 类型 | 可空 | 默认值 | 说明 |
|
||||
|------|--------|------|------|--------|------|
|
||||
| 1 | cursor_id | BIGINT | NO | BIGSERIAL | 自增主键 |
|
||||
| 2 | task_id | BIGINT | NO | | 关联 etl_task.task_id,标识所属任务 |
|
||||
| 3 | store_id | BIGINT | NO | | 门店/租户粒度 |
|
||||
| 4 | last_start | TIMESTAMPTZ | YES | | 上次窗口开始时间(含重叠偏移),下次增量从此时间点继续 |
|
||||
| 5 | last_end | TIMESTAMPTZ | YES | | 上次窗口结束时间 |
|
||||
| 6 | last_id | BIGINT | YES | | 上次处理的最大主键/游标值(可选),用于基于 ID 的增量模式 |
|
||||
| 7 | last_run_id | BIGINT | YES | | 上次运行 ID,对应 etl_run.run_id |
|
||||
| 8 | extra | JSONB | YES | '{}'::jsonb | 附加游标信息 JSON,可存放任务特有的水位数据 |
|
||||
| 9 | created_at | TIMESTAMPTZ | YES | now() | 创建时间 |
|
||||
| 10 | updated_at | TIMESTAMPTZ | YES | now() | 更新时间 |
|
||||
|
||||
## 使用说明
|
||||
|
||||
```sql
|
||||
-- 查询所有任务的当前游标水位
|
||||
SELECT t.task_code, c.store_id, c.last_start, c.last_end, c.last_run_id
|
||||
FROM etl_admin.etl_cursor c
|
||||
JOIN etl_admin.etl_task t ON c.task_id = t.task_id
|
||||
ORDER BY t.task_code;
|
||||
|
||||
-- 查询指定任务的游标详情
|
||||
SELECT *
|
||||
FROM etl_admin.etl_cursor
|
||||
WHERE task_id = (SELECT task_id FROM etl_admin.etl_task WHERE task_code = 'FETCH_ORDERS' LIMIT 1);
|
||||
|
||||
-- 重置某任务的游标(用于重跑历史数据)
|
||||
UPDATE etl_admin.etl_cursor
|
||||
SET last_start = '2024-01-01 00:00:00+08', last_end = NULL, last_id = NULL, updated_at = now()
|
||||
WHERE task_id = (SELECT task_id FROM etl_admin.etl_task WHERE task_code = 'FETCH_ORDERS' LIMIT 1);
|
||||
```
|
||||
|
||||
## 可回溯性
|
||||
|
||||
| 项目 | 说明 |
|
||||
|------|------|
|
||||
| 可回溯 | ✅ 完全可回溯(created_at / updated_at 记录变更时间,last_run_id 可追溯到具体运行记录) |
|
||||
| 数据来源 | 由调度器(orchestration)在每次任务运行后自动更新 |
|
||||
| 关联表 | etl_task(通过 task_id 关联)、etl_run(通过 last_run_id 关联) |
|
||||
@@ -0,0 +1,79 @@
|
||||
# etl_run 运行记录表
|
||||
|
||||
> 生成时间:2026-02-13
|
||||
|
||||
## 表信息
|
||||
|
||||
| 属性 | 值 |
|
||||
|------|-----|
|
||||
| Schema | etl_admin |
|
||||
| 表名 | etl_run |
|
||||
| 主键 | run_id |
|
||||
| 外键 | task_id → etl_task(task_id) ON DELETE CASCADE |
|
||||
| 记录数 | 8726 |
|
||||
| 说明 | 记录每次任务执行的窗口参数、运行状态、处理计数与日志路径,是 ETL 运维排查的核心表 |
|
||||
|
||||
## 字段说明
|
||||
|
||||
| 序号 | 字段名 | 类型 | 可空 | 默认值 | 说明 |
|
||||
|------|--------|------|------|--------|------|
|
||||
| 1 | run_id | BIGINT | NO | BIGSERIAL | 自增主键 |
|
||||
| 2 | run_uuid | TEXT | NO | | 本次调度的唯一标识(UUID 格式),用于跨系统关联 |
|
||||
| 3 | task_id | BIGINT | NO | | 关联 etl_task.task_id,标识所属任务 |
|
||||
| 4 | store_id | BIGINT | NO | | 门店/租户粒度 |
|
||||
| 5 | status | TEXT | NO | | 运行状态。**枚举值**: `SUCC` = 成功, `FAIL` = 失败, `PARTIAL` = 部分成功 |
|
||||
| 6 | started_at | TIMESTAMPTZ | YES | now() | 开始时间 |
|
||||
| 7 | ended_at | TIMESTAMPTZ | YES | | 结束时间 |
|
||||
| 8 | window_start | TIMESTAMPTZ | YES | | 本次窗口开始时间 |
|
||||
| 9 | window_end | TIMESTAMPTZ | YES | | 本次窗口结束时间 |
|
||||
| 10 | window_minutes | INTEGER | YES | | 窗口跨度(分钟) |
|
||||
| 11 | overlap_seconds | INTEGER | YES | | 窗口重叠秒数 |
|
||||
| 12 | fetched_count | INTEGER | YES | 0 | 抓取/读取的记录数 |
|
||||
| 13 | loaded_count | INTEGER | YES | 0 | 插入的记录数 |
|
||||
| 14 | updated_count | INTEGER | YES | 0 | 更新的记录数 |
|
||||
| 15 | skipped_count | INTEGER | YES | 0 | 跳过的记录数 |
|
||||
| 16 | error_count | INTEGER | YES | 0 | 错误记录数 |
|
||||
| 17 | unknown_fields | INTEGER | YES | 0 | 未知字段计数(清洗阶段发现的未定义字段) |
|
||||
| 18 | export_dir | TEXT | YES | | 抓取/导出目录路径 |
|
||||
| 19 | log_path | TEXT | YES | | 日志文件路径 |
|
||||
| 20 | request_params | JSONB | YES | '{}'::jsonb | 请求参数 JSON,记录本次运行使用的 API 请求参数 |
|
||||
| 21 | manifest | JSONB | YES | '{}'::jsonb | 运行产出清单/统计 JSON,记录处理结果摘要 |
|
||||
| 22 | error_message | TEXT | YES | | 错误信息(若失败时记录具体原因) |
|
||||
| 23 | extra | JSONB | YES | '{}'::jsonb | 附加字段,保留扩展 |
|
||||
|
||||
## 使用说明
|
||||
|
||||
```sql
|
||||
-- 查询最近 10 次运行记录
|
||||
SELECT r.run_id, t.task_code, r.status, r.started_at, r.ended_at,
|
||||
r.fetched_count, r.loaded_count, r.error_count
|
||||
FROM etl_admin.etl_run r
|
||||
JOIN etl_admin.etl_task t ON r.task_id = t.task_id
|
||||
ORDER BY r.started_at DESC
|
||||
LIMIT 10;
|
||||
|
||||
-- 查询失败的运行记录及错误信息
|
||||
SELECT r.run_id, t.task_code, r.started_at, r.error_message
|
||||
FROM etl_admin.etl_run r
|
||||
JOIN etl_admin.etl_task t ON r.task_id = t.task_id
|
||||
WHERE r.status = 'FAIL'
|
||||
ORDER BY r.started_at DESC;
|
||||
|
||||
-- 统计各任务的运行成功率
|
||||
SELECT t.task_code,
|
||||
COUNT(*) AS total_runs,
|
||||
COUNT(*) FILTER (WHERE r.status = 'SUCC') AS success_count,
|
||||
ROUND(100.0 * COUNT(*) FILTER (WHERE r.status = 'SUCC') / COUNT(*), 1) AS success_rate
|
||||
FROM etl_admin.etl_run r
|
||||
JOIN etl_admin.etl_task t ON r.task_id = t.task_id
|
||||
GROUP BY t.task_code
|
||||
ORDER BY success_rate;
|
||||
```
|
||||
|
||||
## 可回溯性
|
||||
|
||||
| 项目 | 说明 |
|
||||
|------|------|
|
||||
| 可回溯 | ✅ 完全可回溯(每次运行独立记录,含完整窗口参数、计数和错误信息) |
|
||||
| 数据来源 | 由调度器(orchestration)在任务执行过程中自动写入和更新 |
|
||||
| 关联表 | etl_task(通过 task_id 关联)、etl_cursor(通过 last_run_id 反向关联) |
|
||||
@@ -0,0 +1,59 @@
|
||||
# etl_task 任务注册表
|
||||
|
||||
> 生成时间:2026-02-13
|
||||
|
||||
## 表信息
|
||||
|
||||
| 属性 | 值 |
|
||||
|------|-----|
|
||||
| Schema | etl_admin |
|
||||
| 表名 | etl_task |
|
||||
| 主键 | task_id |
|
||||
| 唯一约束 | (task_code, store_id) |
|
||||
| 记录数 | 49 |
|
||||
| 说明 | 调度依据的任务清单,与代码中 task_registry 的任务码对应;按门店粒度管理任务参数 |
|
||||
|
||||
## 字段说明
|
||||
|
||||
| 序号 | 字段名 | 类型 | 可空 | 默认值 | 说明 |
|
||||
|------|--------|------|------|--------|------|
|
||||
| 1 | task_id | BIGINT | NO | BIGSERIAL | 自增主键 |
|
||||
| 2 | task_code | TEXT | NO | | 任务编码,需与代码中的任务码一致(如 `FETCH_ORDERS`、`DWD_LOAD_FROM_ODS`) |
|
||||
| 3 | store_id | BIGINT | NO | | 门店/租户粒度,区分多门店执行 |
|
||||
| 4 | enabled | BOOLEAN | YES | true | 是否启用此任务 |
|
||||
| 5 | cursor_field | TEXT | YES | | 增量游标字段名(可选),用于标识增量抽取的时间/ID 字段 |
|
||||
| 6 | window_minutes_default | INTEGER | YES | 30 | 默认时间窗口(分钟),控制每次增量抽取的时间跨度 |
|
||||
| 7 | overlap_seconds | INTEGER | YES | 120 | 窗口重叠秒数,用于防止因时间精度导致的数据遗漏 |
|
||||
| 8 | page_size | INTEGER | YES | 200 | 默认分页大小,控制 API 单次请求返回的记录数 |
|
||||
| 9 | retry_max | INTEGER | YES | 3 | API 重试次数上限 |
|
||||
| 10 | params | JSONB | YES | '{}'::jsonb | 任务级自定义参数 JSON,可存放端点特有配置 |
|
||||
| 11 | created_at | TIMESTAMPTZ | YES | now() | 创建时间 |
|
||||
| 12 | updated_at | TIMESTAMPTZ | YES | now() | 更新时间 |
|
||||
|
||||
## 使用说明
|
||||
|
||||
```sql
|
||||
-- 查询所有已启用的任务
|
||||
SELECT task_code, store_id, window_minutes_default, overlap_seconds
|
||||
FROM etl_admin.etl_task
|
||||
WHERE enabled = TRUE
|
||||
ORDER BY task_code;
|
||||
|
||||
-- 查询指定门店的任务配置
|
||||
SELECT *
|
||||
FROM etl_admin.etl_task
|
||||
WHERE store_id = 2790685415443269 AND enabled = TRUE;
|
||||
|
||||
-- 修改某任务的时间窗口和重叠秒数
|
||||
UPDATE etl_admin.etl_task
|
||||
SET window_minutes_default = 60, overlap_seconds = 300, updated_at = now()
|
||||
WHERE task_code = 'FETCH_ORDERS' AND store_id = 2790685415443269;
|
||||
```
|
||||
|
||||
## 可回溯性
|
||||
|
||||
| 项目 | 说明 |
|
||||
|------|------|
|
||||
| 可回溯 | ✅ 完全可回溯(created_at / updated_at 记录变更时间) |
|
||||
| 数据来源 | 系统初始化时由 seed 脚本或 CLI 注册写入 |
|
||||
| 关联表 | etl_cursor(通过 task_id 关联)、etl_run(通过 task_id 关联) |
|
||||
Reference in New Issue
Block a user