seaislee1209 90707005ed
All checks were successful
Build and Deploy Backend / build-and-deploy (push) Successful in 1m27s
Build and Deploy Web / build-and-deploy (push) Successful in 54s
feat: V2功能增强 — 里程碑系统+圆环进度图+损耗修复+AI服务+报告系统
- 项目详情页三阶段里程碑管理(前期/制作/后期)
- 制作卡片改用180px ECharts圆环进度图+右侧数据列表
- 修复损耗率双重计算bug(测试秒数不再重复计入超产)
- 新增飞书推送服务、豆包AI风险分析、APScheduler定时报告
- 项目列表页增强(筛选/排序/批量操作/废弃功能)
- 成员详情页产出时间轴+效率对比
- 成本页固定开支管理

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-13 18:36:44 +08:00

108 lines
3.3 KiB
Python

"""AI 报告路由 —— 手动触发报告生成与飞书推送"""
from fastapi import APIRouter, Depends
from sqlalchemy.orm import Session
from database import get_db
from models import User
from auth import require_permission
router = APIRouter(prefix="/api/reports", tags=["AI报告"])
@router.post("/daily")
async def trigger_daily_report(
db: Session = Depends(get_db),
current_user: User = Depends(require_permission("dashboard:view")),
):
"""手动触发日报生成并推送飞书"""
from services.report_service import generate_daily_report
from services.feishu_service import feishu
report = generate_daily_report(db)
push_result = await feishu.send_report_to_all(report["title"], report["content"])
return {
"message": "日报生成并推送完成",
"title": report["title"],
"content": report["content"],
"push_result": push_result,
}
@router.post("/weekly")
async def trigger_weekly_report(
db: Session = Depends(get_db),
current_user: User = Depends(require_permission("dashboard:view")),
):
"""手动触发周报生成并推送飞书"""
from services.report_service import generate_weekly_report
from services.feishu_service import feishu
report = generate_weekly_report(db)
push_result = await feishu.send_report_to_all(report["title"], report["content"])
return {
"message": "周报生成并推送完成",
"title": report["title"],
"content": report["content"],
"push_result": push_result,
}
@router.post("/monthly")
async def trigger_monthly_report(
db: Session = Depends(get_db),
current_user: User = Depends(require_permission("dashboard:view")),
):
"""手动触发月报生成并推送飞书"""
from services.report_service import generate_monthly_report
from services.feishu_service import feishu
report = generate_monthly_report(db)
push_result = await feishu.send_report_to_all(report["title"], report["content"])
return {
"message": "月报生成并推送完成",
"title": report["title"],
"content": report["content"],
"push_result": push_result,
}
@router.post("/preview/{report_type}")
async def preview_report(
report_type: str,
db: Session = Depends(get_db),
current_user: User = Depends(require_permission("dashboard:view")),
):
"""预览报告内容(不推送飞书)"""
from services.report_service import (
generate_daily_report, generate_weekly_report, generate_monthly_report,
)
generators = {
"daily": generate_daily_report,
"weekly": generate_weekly_report,
"monthly": generate_monthly_report,
}
generator = generators.get(report_type)
if not generator:
return {"error": f"不支持的报告类型: {report_type},可选: daily, weekly, monthly"}
report = generator(db)
return {
"title": report["title"],
"content": report["content"],
"data": report.get("data"),
}
@router.get("/risks")
def get_project_risks(
db: Session = Depends(get_db),
current_user: User = Depends(require_permission("dashboard:view")),
):
"""获取当前所有项目风险预警"""
from services.report_service import analyze_project_risks
return analyze_project_risks(db)