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

@@ -187,8 +187,8 @@ class OrbitInGUI:
self.log_message("=" * 50)
self.log_message("按 Ctrl+Enter 快速获取数据")
# 默认显示今日日报
self.generate_today_report()
# 启动时自动获取新数据
self.root.after(100, self.auto_fetch_data)
def log_message(self, message, is_error=False):
"""输出日志消息"""
@@ -413,6 +413,93 @@ class OrbitInGUI:
self.log_message(f"错误: {e}", is_error=True)
self.set_status("错误")
def auto_fetch_data(self):
"""自动获取新数据GUI启动时调用"""
self.set_status("正在自动获取新数据...")
self.log_message("GUI启动开始自动获取新数据...")
try:
# 1. 检查飞书配置,如果配置完整则刷新排班信息
from dotenv import load_dotenv
load_dotenv()
feishu_token = os.getenv('FEISHU_TOKEN')
feishu_spreadsheet_token = os.getenv('FEISHU_SPREADSHEET_TOKEN')
if feishu_token and feishu_spreadsheet_token:
try:
self.log_message("正在刷新排班信息...")
from src.feishu_v2 import FeishuScheduleManagerV2
feishu_manager = FeishuScheduleManagerV2()
# 只刷新未来7天的排班减少API调用
feishu_manager.refresh_all_schedules(days=7)
self.log_message("排班信息刷新完成")
except Exception as e:
self.log_message(f"刷新排班信息时出错: {e}", is_error=True)
self.log_message("将继续处理其他任务...")
else:
self.log_message("飞书配置不完整,跳过排班信息刷新")
# 2. 尝试获取最新的作业数据
self.log_message("正在尝试获取最新作业数据...")
base_url = os.getenv('CONFLUENCE_BASE_URL')
token = os.getenv('CONFLUENCE_TOKEN')
content_id = os.getenv('CONFLUENCE_CONTENT_ID')
if base_url and token and content_id:
try:
# 获取 HTML
self.log_message("正在从 Confluence 获取 HTML...")
from src.confluence import ConfluenceClient
client = ConfluenceClient(base_url, token)
html = client.get_html(content_id)
if html:
self.log_message(f"获取成功,共 {len(html)} 字符")
# 提取文本
self.log_message("正在提取布局文本...")
from src.extractor import HTMLTextExtractor
extractor = HTMLTextExtractor()
layout_text = extractor.extract(html)
# 解析数据
self.log_message("正在解析日志数据...")
from src.parser import HandoverLogParser
parser = HandoverLogParser()
logs = parser.parse(layout_text)
if logs:
# 保存到数据库
self.log_message("正在保存到数据库...")
db = DailyLogsDatabase()
count = db.insert_many([log.to_dict() for log in logs])
db.close()
self.log_message(f"已保存 {count} 条新记录")
else:
self.log_message("未解析到新记录")
else:
self.log_message("未获取到 HTML 内容,跳过数据获取")
except Exception as e:
self.log_message(f"获取作业数据时出错: {e}", is_error=True)
else:
self.log_message("Confluence 配置不完整,跳过数据获取")
# 3. 显示今日日报
self.log_message("正在生成今日日报...")
self.generate_today_report()
self.set_status("就绪")
self.log_message("自动获取完成GUI已就绪")
except Exception as e:
self.log_message(f"自动获取过程中出现错误: {e}", is_error=True)
self.log_message("将继续显示GUI界面...")
self.set_status("就绪")
# 即使出错也显示今日日报
self.generate_today_report()
def show_stats(self):
"""显示数据库统计"""
self.set_status("正在统计...")