# 计划执行 — 通知配置功能

> 版本：1.0 ｜ 日期：2026-07-21 ｜ 关联 PRD：PRD_需求文档_通知配置.md

---

## 执行步骤

### 步骤 1：后端 notification_service.py

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

**改动**：
1. 数据模型：`notifications.json` 结构定义
2. `get_config()` — 读取配置（敏感字段解密）
3. `save_config(data)` — 保存配置（敏感字段加密）
4. `test_email()` — 发送测试邮件（smtplib）
5. `test_dingtalk()` — 发送测试钉钉消息（requests + HMAC 签名）
6. `test_wecom()` — 发送测试企业微信消息（requests）
7. `send_notification(report, report_url)` — 根据配置发送通知
8. `_build_email_content(report)` — 构建邮件内容
9. `_build_dingtalk_content(report)` — 构建钉钉消息
10. `_build_wecom_content(report)` — 构建企业微信消息

**依赖**：
- `smtplib` + `email` — 标准库，无需安装
- `requests` — 已有依赖

**验证**：Python 语法检查

---

### 步骤 2：更新 paths.py

**文件**：`skill/code/web/service_monitor/utils/paths.py`

**改动**：
```python
NOTIFICATIONS_FILE = DATA_DIR / "notifications.json"
```

---

### 步骤 3：路由层 routes.py 新增接口

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

**改动**：
1. 新增 `page_notification()` — 配置页面路由
2. 新增 `api_get_notification()` — 获取配置 API
3. 新增 `api_save_notification()` — 保存配置 API（管理员）
4. 新增 `api_test_email()` — 测试邮件 API（管理员）
5. 新增 `api_test_dingtalk()` — 测试钉钉 API（管理员）
6. 新增 `api_test_wecom()` — 测试企业微信 API（管理员）

---

### 步骤 4：前端 notification.html

**文件**：`skill/code/web/templates/service_monitor/notification.html`

**改动**：
1. 继承 `base.html`
2. 三个通知渠道卡片：邮件 / 钉钉 / 企业微信
3. 每个卡片有启用开关 + 配置表单 + 测试按钮
4. 触发条件配置区域
5. 保存按钮
6. JS：加载配置、保存配置、发送测试请求

---

### 步骤 5：更新 base.html 左侧菜单

**文件**：`skill/code/web/templates/service_monitor/base.html`

**改动**：
在"定时任务"和"目标管理"之间增加"通知配置"菜单项：
```html
<a href="/service-monitor/notification" class="nav-item {{ 'active' if active_menu == 'notification' }}">
    <span class="nav-icon">🔔</span>
    <span>通知配置</span>
</a>
```

---

### 步骤 6：集成到巡检流程

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

**改动**：
在 `run_inspection_sync()` 完成后调用通知服务：
```python
# 发送通知（定时任务触发的巡检）
from . import notification_service
report = report_service.get_report(report_id)
report_url = f"http://request.host/service-monitor/report/{report_id}"
notification_service.send_notification(report, report_url)
```

---

### 步骤 7：部署验证

1. 部署到 5.60
2. 浏览器访问通知配置页面
3. 配置邮件通知，发送测试邮件
4. 配置钉钉/企业微信，发送测试消息
5. 创建定时任务，等待执行，验证通知发送

---

## 风险与兜底

| 风险 | 兜底方案 |
|------|----------|
| SMTP 连接失败 | 测试接口返回具体错误信息，帮助用户排查 |
| 钉钉签名错误 | 提供 webhook 和 secret 填写说明，测试验证 |
| 企业微信 webhook 失效 | 测试按钮验证配置有效性 |
| 通知发送阻塞巡检 | 通知发送用 try-except 包裹，失败不影响报告保存 |

---

## 文件清单

| 文件 | 操作 |
|------|------|
| `service_monitor/services/notification_service.py` | 新增 |
| `service_monitor/utils/paths.py` | 修改（增加 NOTIFICATIONS_FILE） |
| `service_monitor/routes.py` | 修改（增加 6 个路由） |
| `templates/service_monitor/notification.html` | 新增 |
| `templates/service_monitor/base.html` | 修改（增加菜单项） |
| `service_monitor/services/runner_service.py` | 修改（集成通知调用） |