mirror of
https://devops.liangqichi.top/qichi.liang/Orbitin.git
synced 2026-02-10 15:41:31 +08:00
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:
91
src/gui.py
91
src/gui.py
@@ -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("正在统计...")
|
||||
|
||||
Reference in New Issue
Block a user