# 计划执行 — 定时任务与巡检报告交互优化

> 版本：1.0 ｜ 日期：2026-07-21 ｜ 关联：PRD_问题处理_定时任务与报告优化.md

---

## 步骤 1：修复定时任务不执行（P0）

### 1.1 server.py — 避免 reloader 重复初始化

**文件**：`skill/code/web/service_monitor/services/schedule_service.py`

`init_scheduler()` 增加 reloader 防护：
```python
def init_scheduler(app) -> None:
    global _scheduler
    with _scheduler_lock:
        if _scheduler is not None:
            return
        # Werkzeug reloader 防护：仅在主进程或非 reloader 模式下初始化
        import os
        if os.environ.get('WERKZEUG_RUN_MAIN') != 'true':
            # debug 模式下父进程是 reloader 监控进程，跳过避免双进程
            # 生产模式(debug=False)此判断不影响，因为没有 reloader
            ...
```

**更稳妥方案**：用 `use_reloader=False` 替代 debug 控制，或确保 reloader 子进程初始化。

实际采用：检测 `WERKZEUG_RUN_MAIN == 'true'`（子进程）或 debug=False 时才初始化。

### 1.2 systemd 服务配置

**文件**：`config/troubleshoot.service`（或部署时远程写入）

增加：
```
Environment=FLASK_DEBUG=0
```

---

## 步骤 2：编辑保存提示（P2）

**文件**：`templates/service_monitor/schedule.html`

`saveSchedule()` 成功后：
```javascript
if (d.success) {
    alert('保存成功');
    closeModal();
    location.reload();
}
```

---

## 步骤 3：定时任务执行状态显示（P2）

### 3.1 后端 schedule_service.py

`_execute_scheduled_job` 开始时更新 `running` 状态：
```python
def _execute_scheduled_job(schedule_id):
    update_run_status_partial(schedule_id, status="running")  # 新增
    ...
```

新增字段 `current_status`（idle/running/success/failed）。

### 3.2 前端 schedule.html

- 列表增加"执行状态"列，用颜色 badge 显示
- 页面每 30 秒自动轮询刷新（仅当有 running 任务时）

---

## 步骤 4：批量删除报告（P2）

### 4.1 后端 routes.py

新增：
```python
@bp.route('/api/service-monitor/reports/batch', methods=['DELETE'])
def api_batch_delete_reports():
    ids = request.json.get('ids', [])
    deleted = [rid for rid in ids if report_service.delete_report(rid)]
    return jsonify({"success": True, "deleted": len(deleted)})
```

### 4.2 前端 reports.html

- 每行 checkbox
- 表头全选 checkbox
- "删除选中"按钮

---

## 步骤 5：部署验证

1. 修改 systemd 配置重启服务
2. 验证 APScheduler 在服务进程中正常初始化
3. 创建一个 2 分钟后的定时任务，验证到点执行并生成报告
4. 验证编辑提示、执行状态显示、批量删除

---

## 风险与兜底

| 风险 | 兜底 |
|------|------|
| reloader 防护判断错误导致 scheduler 不初始化 | 同时用 systemd FLASK_DEBUG=0 双保险 |
| 轮询刷新消耗资源 | 仅当有 running 任务时轮询，30 秒间隔 |
| 批量删除误删 | 前端二次确认 |
