# 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 层视图）
   - 两者均通过 FDW（postgres_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，确保数据每日刷新。
