feat: 重构报销单AI预审流程并添加平台风险规则引擎

- 将AI验审改为AI预审,高风险不再拦截而是随单流转给审批人复核
- 新增平台风险规则评估引擎,支持事由过短、票据异常、重复发票等多种评估器
- 用户上下文增加部门信息(department_name),认证流程同步关联组织架构
- 规则scenario_json改为中文标签(差旅/费用科目),统一场景分类
- 新增orchestrator审核流程测试用例
- 前端更新审计视图、差旅报销等相关页面
This commit is contained in:
caoxiaozhu
2026-05-20 09:36:01 +08:00
parent 2574bc81d1
commit 57957d11a0
23 changed files with 2109 additions and 553 deletions

View File

@@ -31,6 +31,7 @@ class AuthenticatedUser:
username: str
name: str
role: str
department: str
position: str
grade: str
role_codes: list[str]
@@ -78,6 +79,7 @@ class AuthService:
username=admin_username or admin_email,
name=display_name,
role="管理员",
department="",
position="系统管理员",
grade="",
role_codes=["manager"],
@@ -94,7 +96,7 @@ class AuthService:
stmt = (
select(Employee)
.options(selectinload(Employee.roles))
.options(selectinload(Employee.organization_unit), selectinload(Employee.roles))
.where(func.lower(Employee.email) == identifier.lower())
)
employee = self.db.execute(stmt).scalars().first()
@@ -120,6 +122,7 @@ class AuthService:
username=employee.email,
name=employee.name,
role=ROLE_LABELS.get(primary_role_code, "使用者"),
department=employee.organization_unit.name if employee.organization_unit is not None else "",
position=employee.position,
grade=employee.grade,
role_codes=role_codes or ["user"],
@@ -134,6 +137,8 @@ class AuthService:
username=user.username,
name=user.name,
role=user.role,
department=user.department,
departmentName=user.department,
position=user.position,
grade=user.grade,
roleCodes=user.role_codes,