修复盯盘bug

This commit is contained in:
oficcejo
2025-10-09 11:47:54 +08:00
parent db935809bd
commit ad21672786
7 changed files with 840 additions and 23 deletions
+276
View File
@@ -0,0 +1,276 @@
# 通知问题排查指南
## 问题现象
监测股票到价格了,但没有收到消息(包括网页和邮件)
## 快速诊断
### 步骤1:运行诊断工具
```bash
python test_notification_debug.py
```
这个工具会检查:
- ✅ 数据库中的通知记录
- ✅ 邮件配置状态
- ✅ 邮件发送测试
- ✅ 股票价格和触发条件
- ✅ 待发送通知
### 步骤2:检查常见问题
#### 问题1:价格已不在触发区间
**症状**:股票价格曾经到达过,但现在已经超出区间
**示例**
- 进场区间:44.87 - 46.48
- 当前价格:47.99(已超出)
- 结果:不会触发新通知
**解决**
- 查看"通知历史"确认是否之前已触发过
- 如需重新监测,调整进场区间
#### 问题260分钟防重复机制
**症状**:价格在区间内,但不发送通知
**原因**:同一触发条件60分钟内只发送一次,避免重复
**查看方法**
```bash
python test_notification_debug.py
```
会显示:"⚠️ 最近60分钟内已发送过XX通知"
**解决**
- 等待60分钟后会自动重新发送
- 或者清空数据库通知记录(会导致历史丢失)
#### 问题3:网页通知显示问题
**症状**:有通知但网页看不到
**原因**
1. 之前的显示逻辑只显示"未发送"的通知
2. 通知发送后被标记为"已发送"就不显示了
**已修复**
- 现在显示所有最近通知(包括已发送和未发送)
- 显示发送状态:"✅ 已发送" 或 "⏳ 待发送"
#### 问题4:邮件配置问题
**检查清单**
```env
# .env 文件
EMAIL_ENABLED=true # 必须是 true
SMTP_SERVER=smtp.qq.com # QQ邮箱或其他
SMTP_PORT=587 # 587(TLS) 或 465(SSL)
EMAIL_FROM=your_email@qq.com # 发件邮箱
EMAIL_PASSWORD=xxxxxx # 授权码(不是登录密码!)
EMAIL_TO=receiver@example.com # 收件邮箱
```
**测试方法**
1. 在网页界面:监测管理 → 通知管理 → 发送测试邮件
2. 或运行:`python test_notification_debug.py`
**常见错误**
- ❌ 使用邮箱登录密码而非授权码
- ❌ EMAIL_ENABLED 设置为 false
- ❌ 端口号不正确(QQ邮箱用587或465)
## 完整排查流程
### 1. 确认监测服务运行
```
网页界面 → 监测管理
查看状态:🟢 运行中
```
如果显示"🔴 已停止",点击"▶️ 启动监测"
### 2. 查看通知历史
```
网页界面 → 监测管理 → 通知历史
```
应该能看到:
- 所有触发的通知(新版本已修复)
- 每条通知的发送状态
- 触发时间
### 3. 检查股票状态
运行诊断工具查看详细信息:
```bash
python test_notification_debug.py
```
关注输出中的:
```
📊 股票代码 - 股票名称
当前价格: XX.XX
进场区间: XX.XX - XX.XX
🟢 当前价格在进场区间内
⚠️ 但最近60分钟内已发送过进场通知
```
### 4. 查看终端日志
监测服务运行时会输出详细日志:
**正常流程**
```
正在更新股票 300832 的价格...
✅ 300832 当前价格: ¥66.5
==================================================
开始发送通知,共 1 条
==================================================
处理通知: 300832 - entry
📧 正在发送邮件...
- 收件人: xxx@qq.com
- 主题: 股票监测提醒 - 300832
- 使用 SMTP+TLS 连接 smtp.qq.com:587
- 正在登录...
- 正在发送...
✅ 邮件发送成功: 300832
✅ 通知已成功发送并标记
```
**配置问题**
```
⚠️ 邮件配置不完整,使用界面通知
- SMTP服务器: 未配置
- 发件人: 未配置
- 收件人: 未配置
- 密码: 未配置
```
**发送失败**
```
邮件发送失败: [Errno 11001] getaddrinfo failed
使用界面通知作为备用方案
```
### 5. 手动测试通知
如果想立即测试通知(不等待价格触发):
```python
# 创建测试脚本 test_manual_notification.py
from monitor_db import monitor_db
from notification_service import notification_service
# 添加一条测试通知
monitor_db.add_notification(
stock_id=1, # 你的股票ID
notification_type='entry',
message='这是一条测试通知'
)
# 立即发送
notification_service.send_notifications()
```
## 修复后的改进
### 1. 网页通知显示增强 ✅
- 显示所有最近通知(不只是待发送的)
- 显示发送状态标识
- 显示待发送通知数量警告
### 2. 日志输出增强 ✅
- 详细的邮件发送过程日志
- 配置检查提示
- 错误堆栈跟踪
### 3. 防重复机制 ✅
- 60分钟内同类型通知只发送一次
- 避免价格波动导致的重复通知
### 4. 监测频率优化 ✅
- 5分钟循环检查
- 按设定间隔更新每只股票
- 股票间3秒延迟,避免API限流
## 预期效果
当股票价格满足条件时:
1. **数据库记录**
```
notifications 表中新增记录
sent = FALSE
```
2. **发送通知** ✅
```
调用 notification_service.send_notifications()
尝试发送邮件
标记 sent = TRUE
```
3. **邮件到达** ✅
```
收件箱收到邮件
主题:股票监测提醒 - XXX
```
4. **网页显示** ✅
```
监测管理 → 通知历史
显示:[✅ 已发送] 股票 XXX ...
```
## 常见场景答疑
### Q1: 价格到了但没收到通知
**检查**
1. 是否60分钟内已发送过?→ 查看通知历史
2. 邮件配置是否正确?→ 发送测试邮件
3. 监测服务是否运行?→ 查看状态
4. 通知是否被禁用?→ 检查股票的"通知启用"开关
### Q2: 测试邮件能收到,但监测邮件收不到
**可能原因**
1. 触发条件未满足(价格不在区间)
2. 60分钟防重复
3. 监测服务未启动
4. 代码更新前的旧版本问题
**解决**
1. 运行 `test_notification_debug.py` 全面检查
2. 查看终端日志确认是否真的触发
3. 确保使用的是修复后的代码
### Q3: 网页看不到通知
**已修复**:旧版本只显示待发送通知,新版本显示所有通知
**刷新界面**:点击"🔄 刷新状态"
### Q4: 想立即重新发送通知
**方法**
1. 清空通知记录(会丢失历史)
2. 或等待60分钟
3. 或调整价格区间让其重新触发
## 技术支持
如果问题仍未解决:
1. **提供诊断报告**
```bash
python test_notification_debug.py > diagnosis.txt
```
2. **提供终端日志**
复制运行 Streamlit 的终端输出
3. **检查文件**
- `.env` 配置(隐藏密码)
- `stock_monitor.db` 是否存在
- 监测股票列表截图
4. **描述问题**
- 什么时候开始的?
- 做了什么操作?
- 预期行为 vs 实际行为