```
feat: 添加公司AI管理平台基础架构 添加了完整的FastAPI后端项目结构,包括: - 环境配置文件(.env.example)和项目说明文档(README.md、AGENTS.md) - Dockerfile用于容器化部署 - 核心基础设施:配置管理、数据库连接、调度器、安全认证 - 模块化设计:AI代理、审批流程、审计日志、业务台账等功能模块 - 支持多数据库连接(主库和遗留系统只读库) - AI适配器支持OpenClaw、Hermes、OpenAI兼容接口 - 飞书集成、报表生成、风险监控等企业级功能 - 完整的依赖管理和测试指南 ```
This commit is contained in:
1
app/modules/risk/__init__.py
Normal file
1
app/modules/risk/__init__.py
Normal file
@@ -0,0 +1 @@
|
||||
"""Risk detection module."""
|
||||
33
app/modules/risk/routes.py
Normal file
33
app/modules/risk/routes.py
Normal file
@@ -0,0 +1,33 @@
|
||||
from fastapi import APIRouter, Depends
|
||||
from sqlalchemy.orm import Session
|
||||
|
||||
from app.core.database import get_db
|
||||
from app.core.security import require_api_key
|
||||
from app.modules.risk.service import RiskService
|
||||
|
||||
router = APIRouter(dependencies=[Depends(require_api_key)])
|
||||
|
||||
|
||||
@router.get("/summary")
|
||||
def risk_summary(db: Session = Depends(get_db)) -> dict:
|
||||
return RiskService(db).summary()
|
||||
|
||||
|
||||
@router.get("/overdue-tasks")
|
||||
def overdue_tasks(db: Session = Depends(get_db)) -> dict:
|
||||
return {"items": RiskService(db).overdue_tasks()}
|
||||
|
||||
|
||||
@router.get("/delayed-projects")
|
||||
def delayed_projects(db: Session = Depends(get_db)) -> dict:
|
||||
return {"items": RiskService(db).delayed_projects()}
|
||||
|
||||
|
||||
@router.get("/over-budget-projects")
|
||||
def over_budget_projects(db: Session = Depends(get_db)) -> dict:
|
||||
return {"items": RiskService(db).over_budget_projects()}
|
||||
|
||||
|
||||
@router.get("/funds")
|
||||
def fund_risks(db: Session = Depends(get_db)) -> dict:
|
||||
return {"items": RiskService(db).fund_risks()}
|
||||
69
app/modules/risk/service.py
Normal file
69
app/modules/risk/service.py
Normal file
@@ -0,0 +1,69 @@
|
||||
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,
|
||||
}
|
||||
Reference in New Issue
Block a user