包含多个会话的累积代码变更: - 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>
3.3 KiB
3.3 KiB
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 薪资任务
发现
-
后端无缓存,直接查 FDW 视图:
get_salary_calc()查询app.v_dws_assistant_salary_calc(DWS 层视图)get_service_records()查询app.v_dwd_assistant_service_log(DWD 层视图)- 两者均通过 FDW(postgres_fdw)从 ETL 库只读访问
- 无 Redis/内存缓存层,每次请求直接查库
-
ETL 为手动 CLI 触发,无自动定时调度:
cli/main.py提供--flow、--tasks等参数手动执行orchestration/scheduler.py已标记为弃用(ETLScheduler 已弃用)- 无 cron/定时任务配置文件
- 无 Windows Task Scheduler 或 systemd timer 配置
-
DWS 薪资表使用 delete-before-insert 策略:
assistant_salary_task.py中有_delete_by_month()方法,符合 DWS 层幂等策略。 -
无数据新鲜度文档:NS1/RNS1 未定义数据刷新频率,前端也未展示"数据更新时间"提示。
证据
fdw_queries.py 中 get_salary_calc() 数据来源:
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() 数据来源:
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):
class ETLScheduler:
"""调度器薄包装层(已弃用)。"""
def __init__(self, config, logger):
warnings.warn("ETLScheduler 已弃用,请直接使用 TaskExecutor 和 FlowRunner", ...)
建议
- 文档补充:在 NS1 或运维文档中明确说明数据新鲜度策略:
- DWD 层(服务记录):ETL 执行后即时更新
- DWS 层(薪资计算):ETL 执行后 delete-before-insert 重算
- 当前为手动触发,建议说明推荐执行频率(如每日一次)
- 前端提示:可在绩效页面底部增加"数据更新于 YYYY-MM-DD HH:mm"提示(需后端返回 ETL 最后执行时间)。
- 自动调度:长期建议配置 Windows Task Scheduler 或 cron 定时执行 ETL flow,确保数据每日刷新。