Files
Neo-ZQYY/docs/prd/Neo_Specs/review-audit/P7-NS1-11.md
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

3.3 KiB
Raw Blame History

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_calcget_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_calcDWS 层视图)
    • get_service_records() 查询 app.v_dwd_assistant_service_logDWD 层视图)
    • 两者均通过 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() 数据来源:

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", ...)

建议

  1. 文档补充:在 NS1 或运维文档中明确说明数据新鲜度策略:
    • DWD 层服务记录ETL 执行后即时更新
    • DWS 层薪资计算ETL 执行后 delete-before-insert 重算
    • 当前为手动触发,建议说明推荐执行频率(如每日一次)
  2. 前端提示:可在绩效页面底部增加"数据更新于 YYYY-MM-DD HH:mm"提示(需后端返回 ETL 最后执行时间)。
  3. 自动调度:长期建议配置 Windows Task Scheduler 或 cron 定时执行 ETL flow确保数据每日刷新。