Files
Neo 6f8f12314f feat: 累积功能变更 — 聊天集成、租户管理、小程序更新、ETL 增强、迁移脚本
包含多个会话的累积代码变更:
- backend: AI 聊天服务、触发器调度、认证增强、WebSocket、调度器最小间隔
- admin-web: ETL 状态页、任务管理、调度配置、登录优化
- miniprogram: 看板页面、聊天集成、UI 组件、导航更新
- etl: DWS 新任务(finance_area_daily/board_cache)、连接器增强
- tenant-admin: 项目初始化
- db: 19 个迁移脚本(etl_feiqiu 11 + zqyy_app 8)
- packages/shared: 枚举和工具函数更新
- tools: 数据库工具、报表生成、健康检查
- docs: PRD/架构/部署/合约文档更新

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-06 00:03:48 +08:00

76 lines
3.3 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# P7→NS1/RNS1 缺失项 #11绩效数据的刷新频率说明
## 简要结论
- 状态:⚠️ 部分解决
- 风险等级:🟡 低
- 后端直接查询 ETL 库 DWS/DWD 视图(通过 FDW无应用层缓存数据新鲜度取决于 ETL 执行频率。ETL 为手动触发CLI无自动定时调度但代码中无数据新鲜度说明文档。
## 详细审查
### 审查范围
- `apps/backend/app/services/performance_service.py` — 数据来源和查询方式
- `apps/backend/app/services/fdw_queries.py` — FDW 查询函数(`get_salary_calc``get_service_records`
- `apps/etl/connectors/feiqiu/orchestration/` — 调度配置
- `apps/etl/connectors/feiqiu/cli/main.py` — CLI 入口
- `apps/etl/connectors/feiqiu/tasks/dws/assistant_salary_task.py` — DWS 薪资任务
### 发现
1. **后端无缓存,直接查 FDW 视图**
- `get_salary_calc()` 查询 `app.v_dws_assistant_salary_calc`DWS 层视图)
- `get_service_records()` 查询 `app.v_dwd_assistant_service_log`DWD 层视图)
- 两者均通过 FDWpostgres_fdw从 ETL 库只读访问
- 无 Redis/内存缓存层,每次请求直接查库
2. **ETL 为手动 CLI 触发,无自动定时调度**
- `cli/main.py` 提供 `--flow``--tasks` 等参数手动执行
- `orchestration/scheduler.py` 已标记为弃用(`ETLScheduler 已弃用`
- 无 cron/定时任务配置文件
- 无 Windows Task Scheduler 或 systemd timer 配置
3. **DWS 薪资表使用 delete-before-insert 策略**`assistant_salary_task.py` 中有 `_delete_by_month()` 方法,符合 DWS 层幂等策略。
4. **无数据新鲜度文档**NS1/RNS1 未定义数据刷新频率,前端也未展示"数据更新时间"提示。
### 证据
fdw_queries.py 中 `get_salary_calc()` 数据来源:
```python
cur.execute("""
SELECT salary_month, assistant_level_name, tier_id, ...
FROM app.v_dws_assistant_salary_calc
WHERE assistant_id = %s AND salary_month = %s::date
""", (assistant_id, calc_month))
```
fdw_queries.py 中 `get_service_records()` 数据来源:
```python
cur.execute("""
SELECT sl.assistant_service_id, dm.nickname AS customer_name, ...
FROM app.v_dwd_assistant_service_log sl
LEFT JOIN app.v_dim_member dm ON ...
WHERE sl.site_assistant_id = %s AND sl.is_delete = 0
AND sl.create_time >= %s::timestamptz
AND sl.create_time < %s::timestamptz
ORDER BY sl.create_time DESC
LIMIT %s OFFSET %s
""", ...)
```
ETL 调度器弃用标记orchestration/scheduler.py
```python
class ETLScheduler:
"""调度器薄包装层(已弃用)。"""
def __init__(self, config, logger):
warnings.warn("ETLScheduler 已弃用,请直接使用 TaskExecutor 和 FlowRunner", ...)
```
### 建议
1. **文档补充**:在 NS1 或运维文档中明确说明数据新鲜度策略:
- DWD 层服务记录ETL 执行后即时更新
- DWS 层薪资计算ETL 执行后 delete-before-insert 重算
- 当前为手动触发,建议说明推荐执行频率(如每日一次)
2. **前端提示**:可在绩效页面底部增加"数据更新于 YYYY-MM-DD HH:mm"提示(需后端返回 ETL 最后执行时间)。
3. **自动调度**:长期建议配置 Windows Task Scheduler 或 cron 定时执行 ETL flow确保数据每日刷新。