后端新增预算本体解析模块和风险规则评分回填服务,优化规则 生成本体对齐和提示词构建,增强费用类型关键词和本体验证, 完善报销查询和审计接口,前端预算中心页面增加对话框和本 体工具函数,重构审计页面元数据和视图模型,补充单元测试。
214 lines
16 KiB
JSON
214 lines
16 KiB
JSON
{
|
|
"schema_version": "2.0",
|
|
"rule_code": "risk.expense.travel.generated_20260526101912249313",
|
|
"name": "差旅基础字段缺失提醒",
|
|
"description": "检查差旅报销的报销事由、申报目的地、明细发生地点和明细事由是否填写完整,确保能说明出差目的、发生城市和费用内容。缺少这些字段但无其他风险迹象时标记为中风险,提示补齐。",
|
|
"enabled": true,
|
|
"requires_attachment": false,
|
|
"risk_dimension": "natural_language_rule",
|
|
"risk_category": "差旅费",
|
|
"ontology_signal": "natural_language_risk",
|
|
"evaluator": "template_rule",
|
|
"template_key": "field_required_v1",
|
|
"semantic_type": "travel_info_completeness",
|
|
"applies_to": {
|
|
"domains": [
|
|
"expense"
|
|
],
|
|
"expense_categories": [
|
|
"travel"
|
|
]
|
|
},
|
|
"inputs": {
|
|
"fields": [
|
|
{
|
|
"key": "claim.location",
|
|
"label": "申报地点",
|
|
"type": "text",
|
|
"source": "claim"
|
|
},
|
|
{
|
|
"key": "claim.reason",
|
|
"label": "报销事由",
|
|
"type": "text",
|
|
"source": "claim"
|
|
},
|
|
{
|
|
"key": "item.item_location",
|
|
"label": "明细地点",
|
|
"type": "text",
|
|
"source": "item"
|
|
},
|
|
{
|
|
"key": "item.item_reason",
|
|
"label": "明细事由",
|
|
"type": "text",
|
|
"source": "item"
|
|
}
|
|
]
|
|
},
|
|
"params": {
|
|
"template_key": "field_required_v1",
|
|
"field_keys": [
|
|
"claim.location",
|
|
"claim.reason",
|
|
"item.item_location",
|
|
"item.item_reason"
|
|
],
|
|
"condition_summary": "检查申报地点、报销事由、明细地点是否满足必填和完整性要求",
|
|
"natural_language": "差旅费报销提交时,先读取报销事由、申报目的地、费用类型、明细发生地点和明细事由;再判断这些字段是否能完整说明出差目的、发生城市和费用内容。若缺少申报目的地、明细地点或明细事由,但暂未发现票据城市冲突、金额异常或重复报销迹象,则标记为低风险,提示经办人补齐基础差旅信息后继续提交。",
|
|
"semantic_type": "travel_info_completeness",
|
|
"required_fields": [
|
|
"claim.location",
|
|
"claim.reason",
|
|
"item.item_location",
|
|
"item.item_reason"
|
|
]
|
|
},
|
|
"outcomes": {
|
|
"pass": {
|
|
"severity": "none",
|
|
"action": "continue"
|
|
},
|
|
"fail": {
|
|
"severity": "low",
|
|
"action": "manual_review",
|
|
"risk_score": 30
|
|
}
|
|
},
|
|
"metadata": {
|
|
"owner": "admin",
|
|
"stability": "generated_draft",
|
|
"source_ref": "自然语言风险规则",
|
|
"created_at": "2026-05-26T10:19:12.249313+08:00",
|
|
"created_by": "admin",
|
|
"requires_attachment": false,
|
|
"risk_score": 30,
|
|
"risk_level": "low",
|
|
"risk_level_label": "低风险",
|
|
"risk_score_model": "risk_score_v3",
|
|
"risk_score_detail": {
|
|
"score": 30,
|
|
"level": "low",
|
|
"level_label": "低风险",
|
|
"model": "risk_score_v3",
|
|
"weights": {
|
|
"impact": 0.35,
|
|
"certainty": 0.25,
|
|
"evidence": 0.15,
|
|
"exception": 0.1,
|
|
"action": 0.1,
|
|
"sensitivity": 0.05
|
|
},
|
|
"components": {
|
|
"impact": 48,
|
|
"certainty": 86,
|
|
"evidence": 62,
|
|
"exception": 35,
|
|
"action": 35,
|
|
"sensitivity": 70
|
|
},
|
|
"calibration": {
|
|
"raw_score": 58,
|
|
"rules": [
|
|
{
|
|
"name": "explicit_low_control_cap",
|
|
"score_before": 58,
|
|
"score_after": 30,
|
|
"reason": "规则语义明确为低风险,且控制动作仅为提醒、提示、补齐或补充说明。"
|
|
}
|
|
]
|
|
},
|
|
"ai_evidence": {},
|
|
"basis": {
|
|
"template_key": "field_required_v1",
|
|
"field_count": 4,
|
|
"condition_count": 0,
|
|
"expense_category": "travel",
|
|
"expense_category_label": "差旅费",
|
|
"requires_attachment": false
|
|
}
|
|
},
|
|
"rule_title": "差旅基础字段缺失提醒",
|
|
"expense_category": "travel",
|
|
"expense_category_label": "差旅费",
|
|
"natural_language": "差旅费报销提交时,先读取报销事由、申报目的地、费用类型、明细发生地点和明细事由;再判断这些字段是否能完整说明出差目的、发生城市和费用内容。若缺少申报目的地、明细地点或明细事由,但暂未发现票据城市冲突、金额异常或重复报销迹象,则标记为低风险,提示经办人补齐基础差旅信息后继续提交。",
|
|
"business_explanation": "检查差旅报销的报销事由、申报目的地、明细发生地点和明细事由是否填写完整,确保能说明出差目的、发生城市和费用内容。缺少这些字段但无其他风险迹象时标记为中风险,提示补齐。",
|
|
"condition_summary": "检查申报地点、报销事由、明细地点是否满足必填和完整性要求",
|
|
"rule_ir": {
|
|
"facts": [
|
|
"A = claim.reason (报销事由)",
|
|
"B = claim.location (申报目的地)",
|
|
"C = item.item_location (明细发生地点)",
|
|
"D = item.item_reason (明细事由)"
|
|
],
|
|
"conditions": [
|
|
{
|
|
"id": "missing_travel_info",
|
|
"operator": "not_exists_any",
|
|
"fields": [
|
|
"B",
|
|
"C",
|
|
"D"
|
|
]
|
|
}
|
|
],
|
|
"hit_logic": "missing_travel_info AND (A exists) → 低风险,提示补齐申报目的地、明细地点或明细事由"
|
|
},
|
|
"flow": {
|
|
"start": "提交差旅报销单",
|
|
"evidence": "读取申报地点、报销事由、明细地点",
|
|
"decision": "检查申报地点、报销事由、明细地点是否满足必填和完整性要求",
|
|
"pass": "所有基础差旅信息完整,无风险提示",
|
|
"fail": "缺少申报目的地/明细发生地点/明细事三者之一,标记为中风险,提示经办人补齐后继续提交"
|
|
}
|
|
},
|
|
"flow_diagram_svg": "<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"860\" height=\"360\" viewBox=\"0 0 860 360\" data-risk-flow-style=\"review-node-only\" data-risk-flow-detail=\"logic-v2\" role=\"img\" aria-labelledby=\"risk-flow-title risk-flow-desc\">\n <title id=\"risk-flow-title\">差旅基础字段缺失提醒流程说明</title>\n <desc id=\"risk-flow-desc\">风险规则只读流程图,展示字段事实、集合交集、日期范围、例外说明和命中路径。</desc>\n <defs>\n <marker id=\"arrow-neutral\" markerWidth=\"10\" markerHeight=\"7\" refX=\"9\" refY=\"3.5\" orient=\"auto\">\n <polygon points=\"0 0, 10 3.5, 0 7\" fill=\"#cbd5e1\"/>\n </marker>\n <marker id=\"arrow-risk\" markerWidth=\"10\" markerHeight=\"7\" refX=\"9\" refY=\"3.5\" orient=\"auto\">\n <polygon points=\"0 0, 10 3.5, 0 7\" fill=\"#f97316\"/>\n </marker>\n </defs>\n <rect width=\"860\" height=\"360\" fill=\"#ffffff\"/>\n <rect x=\"18\" y=\"18\" width=\"824\" height=\"324\" rx=\"8\" ry=\"8\" fill=\"none\" stroke=\"#e2e8f0\" stroke-width=\"1\" stroke-dasharray=\"4,3\"/>\n <text x=\"34\" y=\"43\" fill=\"#6e6e80\" font-family=\"-apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Helvetica Neue, 'PingFang SC', 'Microsoft YaHei', 'Microsoft JhengHei', 'SimHei', sans-serif\" font-size=\"11\" font-weight=\"500\">RULE FLOW</text>\n <g>\n <rect x=\"38\" y=\"142\" width=\"120\" height=\"62\" rx=\"7\" ry=\"7\" fill=\"#ffffff\" stroke=\"#e2e8f0\" stroke-width=\"1.2\"/>\n <rect x=\"38\" y=\"142\" width=\"3.5\" height=\"62\" rx=\"1.75\" ry=\"1.75\" fill=\"#cbd5e1\"/>\n <text x=\"98\" y=\"166\" text-anchor=\"middle\" fill=\"#0d0d0d\" font-family=\"-apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Helvetica Neue, 'PingFang SC', 'Microsoft YaHei', 'Microsoft JhengHei', 'SimHei', sans-serif\" font-size=\"13\" font-weight=\"600\">业务输入</text>\n <text x=\"98\" y=\"185\" text-anchor=\"middle\" fill=\"#6e6e80\" font-family=\"-apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Helvetica Neue, 'PingFang SC', 'Microsoft YaHei', 'Microsoft JhengHei', 'SimHei', sans-serif\" font-size=\"11\" font-weight=\"400\">提交差旅报销单</text>\n </g>\n <g>\n <rect x=\"196\" y=\"64\" width=\"240\" height=\"128\" rx=\"7\" ry=\"7\" fill=\"#ffffff\" stroke=\"#e2e8f0\" stroke-width=\"1.2\"/>\n <text x=\"212\" y=\"90\" fill=\"#0d0d0d\" font-family=\"-apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Helvetica Neue, 'PingFang SC', 'Microsoft YaHei', 'Microsoft JhengHei', 'SimHei', sans-serif\" font-size=\"13\" font-weight=\"650\">字段事实</text>\n <text x=\"212\" y=\"112\" fill=\"#0d0d0d\" font-family=\"-apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Helvetica Neue, 'PingFang SC', 'Microsoft YaHei', 'Microsoft JhengHei', 'SimHei', sans-serif\" font-size=\"11\" font-weight=\"400\">A=申报地点[claim.location]</text>\n <text x=\"212\" y=\"130\" fill=\"#0d0d0d\" font-family=\"-apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Helvetica Neue, 'PingFang SC', 'Microsoft YaHei', 'Microsoft JhengHei', 'SimHei', sans-serif\" font-size=\"11\" font-weight=\"400\">B=报销事由[claim.reason]</text>\n <text x=\"212\" y=\"148\" fill=\"#0d0d0d\" font-family=\"-apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Helvetica Neue, 'PingFang SC', 'Microsoft YaHei', 'Microsoft JhengHei', 'SimHei', sans-serif\" font-size=\"11\" font-weight=\"400\">C=明细地点[item.item_location]</text>\n <text x=\"212\" y=\"166\" fill=\"#0d0d0d\" font-family=\"-apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Helvetica Neue, 'PingFang SC', 'Microsoft YaHei', 'Microsoft JhengHei', 'SimHei', sans-serif\" font-size=\"11\" font-weight=\"400\">D=明细事由[item.item_reason]</text>\n </g>\n <g>\n <rect x=\"196\" y=\"216\" width=\"382\" height=\"104\" rx=\"7\" ry=\"7\" fill=\"#ffffff\" stroke=\"#e2e8f0\" stroke-width=\"1.2\"/>\n <text x=\"212\" y=\"242\" fill=\"#0d0d0d\" font-family=\"-apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Helvetica Neue, 'PingFang SC', 'Microsoft YaHei', 'Microsoft JhengHei', 'SimHei', sans-serif\" font-size=\"13\" font-weight=\"650\">判断条件</text>\n <text x=\"212\" y=\"264\" fill=\"#0d0d0d\" font-family=\"-apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Helvetica Neue, 'PingFang SC', 'Microsoft YaHei', 'Microsoft JhengHei', 'SimHei', sans-serif\" font-size=\"11\" font-weight=\"400\">检查申报地点、报销事由、明细地点是否满足必填和完整性要求</text>\n </g>\n <g>\n <polygon points=\"555.0,80 616,141.0 555.0,202 494,141.0\" fill=\"#ffffff\" stroke=\"#e2e8f0\" stroke-width=\"1.25\"/>\n <text x=\"555\" y=\"131\" text-anchor=\"middle\" fill=\"#0d0d0d\" font-family=\"-apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Helvetica Neue, 'PingFang SC', 'Microsoft YaHei', 'Microsoft JhengHei', 'SimHei', sans-serif\" font-size=\"12.5\" font-weight=\"600\">命中逻辑</text>\n <text x=\"555\" y=\"152\" text-anchor=\"middle\" fill=\"#6e6e80\" font-family=\"-apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Helvetica Neue, 'PingFang SC', 'Microsoft YaHei', 'Microsoft JhengHei', 'SimHei', sans-serif\" font-size=\"10.2\" font-weight=\"400\">检查申报地点、报</text>\n <text x=\"555\" y=\"167\" text-anchor=\"middle\" fill=\"#6e6e80\" font-family=\"-apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Helvetica Neue, 'PingFang SC', 'Microsoft YaHei', 'Microsoft JhengHei', 'SimHei', sans-serif\" font-size=\"10.2\" font-weight=\"400\">销事由、明细地…</text>\n </g>\n <g>\n <rect x=\"688\" y=\"76\" width=\"122\" height=\"60\" rx=\"7\" ry=\"7\" fill=\"#ffffff\" stroke=\"#e2e8f0\" stroke-width=\"1.2\"/>\n <rect x=\"688\" y=\"76\" width=\"3.5\" height=\"60\" rx=\"1.75\" ry=\"1.75\" fill=\"#cbd5e1\"/>\n <text x=\"749\" y=\"100\" text-anchor=\"middle\" fill=\"#0d0d0d\" font-family=\"-apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Helvetica Neue, 'PingFang SC', 'Microsoft YaHei', 'Microsoft JhengHei', 'SimHei', sans-serif\" font-size=\"13\" font-weight=\"600\">继续流转</text>\n <text x=\"749\" y=\"119\" text-anchor=\"middle\" fill=\"#6e6e80\" font-family=\"-apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Helvetica Neue, 'PingFang SC', 'Microsoft YaHei', 'Microsoft JhengHei', 'SimHei', sans-serif\" font-size=\"11\" font-weight=\"400\">所有基础差旅信息完…</text>\n </g>\n <g>\n <rect x=\"688\" y=\"226\" width=\"122\" height=\"68\" rx=\"7\" ry=\"7\" fill=\"#fff7ed\" stroke=\"#fed7aa\" stroke-width=\"1.2\"/>\n <rect x=\"688\" y=\"226\" width=\"3.5\" height=\"68\" rx=\"1.75\" ry=\"1.75\" fill=\"#f97316\"/>\n <text x=\"749\" y=\"250\" text-anchor=\"middle\" fill=\"#0d0d0d\" font-family=\"-apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Helvetica Neue, 'PingFang SC', 'Microsoft YaHei', 'Microsoft JhengHei', 'SimHei', sans-serif\" font-size=\"13\" font-weight=\"600\">进入复核</text>\n <text x=\"749\" y=\"269\" text-anchor=\"middle\" fill=\"#6e6e80\" font-family=\"-apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Helvetica Neue, 'PingFang SC', 'Microsoft YaHei', 'Microsoft JhengHei', 'SimHei', sans-serif\" font-size=\"11\" font-weight=\"400\">缺少申报目的地/明…</text>\n </g>\n <path d=\"M 158 173 H 176 V 128 H 196\" fill=\"none\" stroke=\"#cbd5e1\" stroke-width=\"1.45\" stroke-linecap=\"round\" stroke-linejoin=\"round\" marker-end=\"url(#arrow-neutral)\"/>\n <line x1=\"316\" y1=\"192\" x2=\"316\" y2=\"216\" stroke=\"#cbd5e1\" stroke-width=\"1.45\" stroke-linecap=\"round\" marker-end=\"url(#arrow-neutral)\"/>\n <path d=\"M 436 128 H 466 V 141 H 494\" fill=\"none\" stroke=\"#cbd5e1\" stroke-width=\"1.45\" stroke-linecap=\"round\" stroke-linejoin=\"round\" marker-end=\"url(#arrow-neutral)\"/>\n <line x1=\"555\" y1=\"216\" x2=\"555\" y2=\"202\" stroke=\"#cbd5e1\" stroke-width=\"1.35\" stroke-linecap=\"round\" marker-end=\"url(#arrow-neutral)\"/>\n <path d=\"M 616 125 H 648 V 106 H 688\" fill=\"none\" stroke=\"#cbd5e1\" stroke-width=\"1.35\" stroke-linecap=\"round\" stroke-linejoin=\"round\" marker-end=\"url(#arrow-neutral)\"/>\n <text x=\"651\" y=\"119\" text-anchor=\"middle\" fill=\"#6e6e80\" font-family=\"-apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Helvetica Neue, 'PingFang SC', 'Microsoft YaHei', 'Microsoft JhengHei', 'SimHei', sans-serif\" font-size=\"10.5\" font-weight=\"500\">否</text>\n <path d=\"M 616 166 H 648 V 260 H 688\" fill=\"none\" stroke=\"#f97316\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\" marker-end=\"url(#arrow-risk)\"/>\n <text x=\"651\" y=\"214\" text-anchor=\"middle\" fill=\"#c2410c\" font-family=\"-apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Helvetica Neue, 'PingFang SC', 'Microsoft YaHei', 'Microsoft JhengHei', 'SimHei', sans-serif\" font-size=\"10.5\" font-weight=\"700\">是</text>\n</svg>",
|
|
"severity": "low",
|
|
"risk_score": 30,
|
|
"risk_level": "low",
|
|
"risk_level_label": "低风险",
|
|
"risk_score_detail": {
|
|
"score": 30,
|
|
"level": "low",
|
|
"level_label": "低风险",
|
|
"model": "risk_score_v3",
|
|
"weights": {
|
|
"impact": 0.35,
|
|
"certainty": 0.25,
|
|
"evidence": 0.15,
|
|
"exception": 0.1,
|
|
"action": 0.1,
|
|
"sensitivity": 0.05
|
|
},
|
|
"components": {
|
|
"impact": 48,
|
|
"certainty": 86,
|
|
"evidence": 62,
|
|
"exception": 35,
|
|
"action": 35,
|
|
"sensitivity": 70
|
|
},
|
|
"calibration": {
|
|
"raw_score": 58,
|
|
"rules": [
|
|
{
|
|
"name": "explicit_low_control_cap",
|
|
"score_before": 58,
|
|
"score_after": 30,
|
|
"reason": "规则语义明确为低风险,且控制动作仅为提醒、提示、补齐或补充说明。"
|
|
}
|
|
]
|
|
},
|
|
"ai_evidence": {},
|
|
"basis": {
|
|
"template_key": "field_required_v1",
|
|
"field_count": 4,
|
|
"condition_count": 0,
|
|
"expense_category": "travel",
|
|
"expense_category_label": "差旅费",
|
|
"requires_attachment": false
|
|
}
|
|
}
|
|
}
|