feat: 添加飞书表格模块支持排班人员信息获取

- 新增 src/feishu_v2.py: 飞书表格API客户端,支持数据库存储和2026年全年排班表
- 新增 src/schedule_database.py: 排班信息数据库模块,用于缓存排班数据
- 新增 docs/feishu_data_flow.md: 飞书数据流文档
- 新增 plans/feishu_scheduling_plan.md: 飞书排班表模块设计文档
- 更新 src/report.py: 使用新的飞书模块获取排班人员信息
- 更新 src/gui.py: 启动时自动获取新数据,添加auto_fetch_data方法
- 更新 .env.example: 添加飞书配置示例
- 更新 AGENTS.md: 更新项目文档
- 更新 main.py: 集成飞书模块

功能特性:
1. 支持从飞书表格获取排班人员信息
2. 支持2025年月度表格和2026年全年排班表
3. 使用SQLite数据库缓存,减少API调用
4. 自动检测表格更新
5. GUI启动时自动获取最新数据
6. 日报中正确显示次日班次人员信息
This commit is contained in:
2025-12-31 00:03:34 +08:00
parent 272d0156bb
commit dc2a55bbf4
10 changed files with 1908 additions and 13 deletions

View File

@@ -6,11 +6,15 @@ from datetime import datetime, timedelta
from typing import Dict, List, Optional
import sys
import os
import logging
# 添加项目根目录到 Python 路径
sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
from src.database import DailyLogsDatabase
from src.feishu_v2 import FeishuScheduleManagerV2 as FeishuScheduleManager
logger = logging.getLogger(__name__)
class DailyReportGenerator:
@@ -96,14 +100,49 @@ class DailyReportGenerator:
}
def get_shift_personnel(self, date: str) -> Dict:
"""获取班次人员(从日志文本中解析,需要配合 parser 使用)"""
# 目前数据库中没有人员信息,返回空
# 可以后续扩展添加人员追踪功能
return {
'day_shift': '',
'night_shift': '',
'duty_phone': '13107662315'
}
"""
获取班次人员(从飞书排班表获取)
注意:日报中显示的是次日的班次人员,所以需要获取 date+1 的排班
例如:生成 12/29 的日报,显示的是 12/30 的人员
"""
try:
# 初始化飞书排班管理器
manager = FeishuScheduleManager()
# 计算次日日期(日报中显示的是次日班次)
parsed_date = datetime.strptime(date, '%Y-%m-%d')
tomorrow = (parsed_date + timedelta(days=1)).strftime('%Y-%m-%d')
logger.info(f"获取 {date} 日报的班次人员,对应排班表日期: {tomorrow}")
# 获取次日的排班信息(使用缓存)
schedule = manager.get_schedule_for_date(tomorrow)
# 如果从飞书获取到数据,使用飞书数据
if schedule.get('day_shift') or schedule.get('night_shift'):
return {
'day_shift': schedule.get('day_shift', ''),
'night_shift': schedule.get('night_shift', ''),
'duty_phone': '13107662315'
}
# 如果飞书数据为空,返回空值
logger.warning(f"无法从飞书获取 {tomorrow} 的排班信息")
return {
'day_shift': '',
'night_shift': '',
'duty_phone': '13107662315'
}
except Exception as e:
logger.error(f"获取排班信息失败: {e}")
# 降级处理:返回空值
return {
'day_shift': '',
'night_shift': '',
'duty_phone': '13107662315'
}
def generate_report(self, date: str = None) -> str:
"""生成日报"""