feat: 报销审批流重构与管家计划全链路贯通
- 重构报销状态注册表、审批流路由与平台风险标记 - 完善管家意图规划器与模型计划构建器全链路 - 新增 OCR Worker 脚本、数据库会话管理与通知状态 - 优化文档中心、日志视图、预算中心与员工管理交互 - 增强工作台摘要、图标资源与全局主题样式 - 补充审批路由、状态注册、OCR 服务与管家规划器测试覆盖
This commit is contained in:
@@ -93,6 +93,38 @@ class EntertainmentFunctionCallingIntentAgent:
|
||||
)
|
||||
|
||||
|
||||
class ApplicationFunctionCallingIntentAgent:
|
||||
def detect(self, request, *, base_date, canonical_fields):
|
||||
return StewardIntentAgentResult(
|
||||
payload={
|
||||
"thinking_events": [
|
||||
{
|
||||
"stage": "task_split",
|
||||
"title": "识别出差申请",
|
||||
"content": "模型识别到用户要发起北京出差申请,并且后续还有报销事项。",
|
||||
}
|
||||
],
|
||||
"tasks": [
|
||||
{
|
||||
"task_type": "expense_application",
|
||||
"title": "北京出差申请",
|
||||
"summary": "明天前往北京出差3天,支撑国网仿生产部署。",
|
||||
"confidence": 0.94,
|
||||
"ontology_fields": {
|
||||
"time_range": "明天",
|
||||
"location": "北京",
|
||||
"expense_type": "差旅",
|
||||
"reason": "支撑国网仿生产部署",
|
||||
},
|
||||
"missing_fields": [],
|
||||
}
|
||||
],
|
||||
"attachment_groups": [],
|
||||
},
|
||||
model_call_traces=[],
|
||||
)
|
||||
|
||||
|
||||
def test_steward_planner_uses_llm_function_calling_plan_when_available() -> None:
|
||||
payload = StewardPlanRequest(
|
||||
message="我要报销昨天客户现场沟通的交通费",
|
||||
@@ -136,6 +168,22 @@ def test_steward_planner_normalizes_llm_business_entertainment_expense_type() ->
|
||||
assert result.tasks[0].ontology_fields["time_range"] == "2026-06-03"
|
||||
|
||||
|
||||
def test_steward_planner_enforces_application_transport_gap_after_function_calling() -> None:
|
||||
payload = StewardPlanRequest(
|
||||
message="明天出差北京3天,支撑国网仿生产部署",
|
||||
client_now_iso="2026-06-04T09:30:00+08:00",
|
||||
)
|
||||
|
||||
result = StewardPlannerService(intent_agent=ApplicationFunctionCallingIntentAgent()).build_plan(payload)
|
||||
|
||||
assert result.planning_source == "llm_function_call"
|
||||
assert result.tasks[0].missing_fields == ["transport_mode"]
|
||||
gap_events = [event for event in result.thinking_events if event.stage == "business_gap_check"]
|
||||
assert gap_events
|
||||
assert "没有说明出行方式" in gap_events[0].content
|
||||
assert "火车、飞机或轮船" in gap_events[0].content
|
||||
|
||||
|
||||
def test_steward_planner_falls_back_to_rules_when_function_calling_is_unavailable() -> None:
|
||||
payload = StewardPlanRequest(
|
||||
message="我要报销昨天的交通费",
|
||||
@@ -197,6 +245,10 @@ def test_steward_planner_treats_future_travel_without_apply_word_as_application(
|
||||
assert result.tasks[0].ontology_fields["location"] == "北京"
|
||||
assert result.tasks[0].ontology_fields["expense_type"] == "travel"
|
||||
assert result.tasks[0].ontology_fields["reason"] == "支撑国网仿生产部署"
|
||||
assert result.tasks[0].missing_fields == ["transport_mode"]
|
||||
gap_events = [event for event in result.thinking_events if event.stage == "business_gap_check"]
|
||||
assert gap_events
|
||||
assert "没有说明出行方式" in gap_events[0].content
|
||||
assert result.tasks[1].assigned_agent == "reimbursement_assistant"
|
||||
assert result.tasks[1].ontology_fields["time_range"] == "2026-06-03"
|
||||
assert result.tasks[1].ontology_fields["expense_type"] == "entertainment"
|
||||
|
||||
Reference in New Issue
Block a user