feat: 增强风险规则生成引擎与预算中心页面

后端拆分风险规则生成为解释器、语义分析、本体对齐等子模块,
优化模板执行和流程图生成,完善员工种子数据和导入逻辑,增强
报销单权限策略和草稿持久化,前端新增预算中心视图和趋势图
组件,重构审计页面和风险规则测试对话框交互,完善文档中心
和报销创建页面细节,补充单元测试覆盖。
This commit is contained in:
caoxiaozhu
2026-05-26 09:15:14 +08:00
parent d0e946cf47
commit 0e861d8fa6
150 changed files with 14953 additions and 4099 deletions

View File

@@ -11,88 +11,89 @@ ORGANIZATION_DEFINITIONS = [
"manager_name": "李文静",
},
{
"unit_code": "EXEC-OFFICE",
"name": "总经办",
"unit_code": "TECH-DEPT",
"name": "技术部",
"unit_type": "department",
"parent_code": "ORG-ROOT",
"cost_center": "CC-1001",
"location": "上海",
"manager_name": "李文静",
},
{
"unit_code": "FIN-SSC",
"name": "财务共享中心",
"unit_type": "department",
"parent_code": "ORG-ROOT",
"cost_center": "CC-2108",
"location": "上海",
"manager_name": "张晓晴",
},
{
"unit_code": "HR-OD",
"name": "人力与组织",
"unit_type": "department",
"parent_code": "ORG-ROOT",
"cost_center": "CC-3206",
"location": "杭州",
"manager_name": "陈硕",
},
{
"unit_code": "SALES-SOUTH",
"name": "华南销售部",
"unit_type": "department",
"parent_code": "ORG-ROOT",
"cost_center": "CC-4102",
"location": "深圳",
"manager_name": "陈嘉",
},
{
"unit_code": "SALES-EAST",
"name": "华东销售部",
"unit_type": "department",
"parent_code": "ORG-ROOT",
"cost_center": "CC-4108",
"location": "上海",
"manager_name": "秦墨然",
},
{
"unit_code": "MKT-BRAND",
"name": "市场品牌部",
"unit_type": "department",
"parent_code": "ORG-ROOT",
"cost_center": "CC-5203",
"location": "北京",
"manager_name": "刘思雨",
},
{
"unit_code": "RND-CENTER",
"name": "产品研发中心",
"unit_type": "department",
"parent_code": "ORG-ROOT",
"cost_center": "CC-6105",
"cost_center": "CC-6100",
"location": "北京",
"manager_name": "吴磊",
},
{
"unit_code": "OPS-ADMIN",
"name": "行政采购",
"unit_code": "MARKET-DEPT",
"name": "市场",
"unit_type": "department",
"parent_code": "ORG-ROOT",
"cost_center": "CC-7204",
"cost_center": "CC-4100",
"location": "上海",
"manager_name": "刘思雨",
},
{
"unit_code": "FINANCE-DEPT",
"name": "财务部",
"unit_type": "department",
"parent_code": "ORG-ROOT",
"cost_center": "CC-2100",
"location": "上海",
"manager_name": "张晓晴",
},
{
"unit_code": "HR-DEPT",
"name": "人力资源部",
"unit_type": "department",
"parent_code": "ORG-ROOT",
"cost_center": "CC-3200",
"location": "杭州",
"manager_name": "陈硕",
},
{
"unit_code": "PRODUCTION-DEPT",
"name": "生产部",
"unit_type": "department",
"parent_code": "ORG-ROOT",
"cost_center": "CC-7200",
"location": "南京",
"manager_name": "梁雨辰",
},
{
"unit_code": "AUDIT-RISK",
"name": "风控与审计部",
"unit_code": "PRESIDENT-OFFICE",
"name": "总裁办",
"unit_type": "department",
"parent_code": "ORG-ROOT",
"cost_center": "CC-8102",
"cost_center": "CC-1000",
"location": "上海",
"manager_name": "顾承宇",
"manager_name": "李文静",
},
]
CANONICAL_DEPARTMENT_CODES = (
"TECH-DEPT",
"MARKET-DEPT",
"FINANCE-DEPT",
"HR-DEPT",
"PRODUCTION-DEPT",
"PRESIDENT-OFFICE",
)
LEGACY_ORGANIZATION_UNIT_CODE_MAP = {
"RND-CENTER": "TECH-DEPT",
"SALES-SOUTH": "MARKET-DEPT",
"SALES-EAST": "MARKET-DEPT",
"MKT-BRAND": "MARKET-DEPT",
"FIN-SSC": "FINANCE-DEPT",
"AUDIT-RISK": "FINANCE-DEPT",
"HR-OD": "HR-DEPT",
"OPS-ADMIN": "PRODUCTION-DEPT",
"EXEC-OFFICE": "PRESIDENT-OFFICE",
}
def normalize_organization_unit_code(unit_code: str | None) -> str | None:
if not unit_code:
return unit_code
return LEGACY_ORGANIZATION_UNIT_CODE_MAP.get(unit_code, unit_code)
EMPLOYEE_PROFILE_REPAIRS = [
{
"employee_no": "E90919",
@@ -101,7 +102,7 @@ EMPLOYEE_PROFILE_REPAIRS = [
"location": "武汉",
"position": "财务智能化产品经理",
"grade": "P5",
"organization_unit_code": "RND-CENTER",
"organization_unit_code": "TECH-DEPT",
"manager_employee_no": "E11745",
"finance_owner_name": "研发财务BP",
"cost_center": "CC-6112",