feat: 添加公司AI管理平台基础架构 添加了完整的FastAPI后端项目结构,包括: - 环境配置文件(.env.example)和项目说明文档(README.md、AGENTS.md) - Dockerfile用于容器化部署 - 核心基础设施:配置管理、数据库连接、调度器、安全认证 - 模块化设计:AI代理、审批流程、审计日志、业务台账等功能模块 - 支持多数据库连接(主库和遗留系统只读库) - AI适配器支持OpenClaw、Hermes、OpenAI兼容接口 - 飞书集成、报表生成、风险监控等企业级功能 - 完整的依赖管理和测试指南 ```
70 lines
2.5 KiB
Python
70 lines
2.5 KiB
Python
from datetime import date
|
|
from decimal import Decimal
|
|
from typing import Any
|
|
|
|
from sqlalchemy import select
|
|
from sqlalchemy.orm import Session
|
|
|
|
from app.modules.business.models import FundAccount, Project, WorkTask
|
|
from app.modules.business.service import serialize_model
|
|
|
|
|
|
class RiskService:
|
|
"""Evaluate rule-based business risk signals from internal ledgers."""
|
|
|
|
def __init__(self, db: Session):
|
|
self.db = db
|
|
|
|
def overdue_tasks(self) -> list[dict[str, Any]]:
|
|
stmt = select(WorkTask).where(
|
|
WorkTask.due_date.is_not(None),
|
|
WorkTask.due_date < date.today(),
|
|
WorkTask.status.notin_(["完成", "已完成", "关闭"]),
|
|
)
|
|
return [serialize_model(item) for item in self.db.execute(stmt).scalars()]
|
|
|
|
def delayed_projects(self) -> list[dict[str, Any]]:
|
|
stmt = select(Project).where(
|
|
Project.due_date.is_not(None),
|
|
Project.due_date < date.today(),
|
|
Project.status.notin_(["验收", "已完成", "复盘", "归档", "关闭"]),
|
|
)
|
|
return [serialize_model(item) for item in self.db.execute(stmt).scalars()]
|
|
|
|
def over_budget_projects(self) -> list[dict[str, Any]]:
|
|
stmt = select(Project).where(
|
|
Project.budget_amount > 0,
|
|
Project.actual_amount > Project.budget_amount,
|
|
)
|
|
return [serialize_model(item) for item in self.db.execute(stmt).scalars()]
|
|
|
|
def fund_risks(self) -> list[dict[str, Any]]:
|
|
stmt = select(FundAccount).where(FundAccount.current_balance < FundAccount.safety_line)
|
|
return [serialize_model(item) for item in self.db.execute(stmt).scalars()]
|
|
|
|
def summary(self) -> dict[str, Any]:
|
|
overdue_tasks = self.overdue_tasks()
|
|
delayed_projects = self.delayed_projects()
|
|
over_budget_projects = self.over_budget_projects()
|
|
fund_risks = self.fund_risks()
|
|
risk_score = (
|
|
len(overdue_tasks) * 1
|
|
+ len(delayed_projects) * 3
|
|
+ len(over_budget_projects) * 4
|
|
+ len(fund_risks) * 5
|
|
)
|
|
if risk_score >= 15:
|
|
level = "high"
|
|
elif risk_score >= 5:
|
|
level = "medium"
|
|
else:
|
|
level = "low"
|
|
return {
|
|
"risk_level": level,
|
|
"risk_score": Decimal(risk_score),
|
|
"overdue_tasks": overdue_tasks,
|
|
"delayed_projects": delayed_projects,
|
|
"over_budget_projects": over_budget_projects,
|
|
"fund_risks": fund_risks,
|
|
}
|