feat: 新增风险图谱算法与系统仪表盘及操作反馈体系

后端新增风险图谱算法模块、风险观察与反馈服务、规则 DSL
校验器和可解释性引擎,完善系统仪表盘和财务仪表盘统计,
优化 agent 运行和编排执行链路,清理旧开发文档,前端新增
系统趋势、负载热力图等多种仪表盘图表组件,完善操作反馈
对话框和工作台日期选择器,优化报销创建和审批详情交互,
补充单元测试覆盖。
This commit is contained in:
caoxiaozhu
2026-05-30 15:46:51 +08:00
parent 4c59941ec6
commit 7989f3a159
314 changed files with 30073 additions and 20626 deletions

View File

@@ -40,7 +40,8 @@ def build_risk_rule_compiler_messages(
"id": "稳定英文标识",
"operator": (
"exists_any | exists_all | in_scope | not_in_scope | overlap | "
"not_overlap | date_outside_range | contains_any | not_contains_any"
"not_overlap | date_outside_range | numeric_compare | duplicate_value | "
"contains_any | not_contains_any"
),
"fields": ["exists/contains 类操作使用"],
"left_fields": ["集合比较左侧字段"],
@@ -48,6 +49,8 @@ def build_risk_rule_compiler_messages(
"date_fields": ["日期字段"],
"range_start_fields": ["日期范围开始字段"],
"range_end_fields": ["日期范围结束字段"],
"compare": "numeric_compare 使用gt | gte | lt | lte | eq",
"threshold": "numeric_compare 可选固定阈值;若与预算余额比较,应使用 right_fields",
"keywords": ["例外或风险词"],
}
],
@@ -74,8 +77,20 @@ def build_risk_rule_compiler_messages(
"fail": "命中时说明",
},
}
response_schema = {
"semantic_plan": {
"rule_intent": "用业务语言复述规则意图",
"scope": "适用业务域、环节、费用领域",
"required_fields": "字段本体映射,必须来自 available_fields",
"judgment_steps": "逐步判断链,先事实、再条件、再例外、最后动作",
"exception_conditions": "例外说明或豁免条件,不得当作风险关键词",
"risk_action": "命中后的业务动作与评分证据",
},
"dsl": schema,
}
guardrails = [
"只能输出 JSON 对象,不能输出 Markdown 或解释。",
"输出结构必须包含 semantic_plan 和 dslsemantic_plan 先解释业务判断链dsl 再承载可执行规则。",
"必须区分业务环节:费用申请是事前风控,费用报销是事后核验;不要把二者的字段和流程语义混用。",
"费用申请阶段更关注预算余额、申请金额、申请事由、预计行程、预计费用科目、是否超预算或缺少前置审批。",
"费用报销阶段更关注真实票据、报销明细、发生日期、附件识别结果和申请/行程/票据一致性。",
@@ -84,7 +99,10 @@ def build_risk_rule_compiler_messages(
"城市/地点/路线一致性必须用 field_compare_v1 或 semantic_type=travel_route_city_consistency。",
"涉及多个字段、日期范围、金额范围、集合关系、例外说明的规则必须使用 composite_rule_v1。",
"日期字段必须区分事实日期、票据日期和业务期间;如果只能拿到替代字段,要在 rule_ir 中说明这是 fallback evidence。",
"composite_rule_v1 只能使用受控 operatorexists_any、exists_all、in_scope、not_in_scope、overlap、not_overlap、date_outside_range、contains_any、not_contains_any。",
"composite_rule_v1 只能使用受控 operatorexists_any、exists_all、in_scope、not_in_scope、overlap、not_overlap、date_outside_range、numeric_compare、duplicate_value、contains_any、not_contains_any。",
"预算、金额、阈值和超标规则必须用 numeric_compare例如 claim.amount GT budget.remaining_amount不得写成金额风险关键词匹配。",
"人均超标规则必须优先使用字段本体中的人均金额字段,例如 claim.per_capita_amount GT 固定阈值,参与人数作为解释事实字段保留。",
"重复发票、同一票据号、重复报销等规则必须用 duplicate_value例如 attachment.invoice_no 在本次附件或明细中出现重复,不得写成重复风险关键词匹配。",
"差旅路线规则中,交通票行程城市和住宿发票城市属于附件城市集合。",
"申报目的地和明细发生地点属于申报行程城市集合。",
"员工常驻地/出发地如可用,属于合理起终点集合,不等同于申报目的地。",
@@ -167,7 +185,7 @@ def build_risk_rule_compiler_messages(
"expense_category_label": expense_category_label,
"natural_language": natural_language,
"available_fields": available_fields,
"required_json_shape": schema,
"required_json_shape": response_schema,
"examples": examples,
},
ensure_ascii=False,