feat: 增强差旅报销审核流程与票据智能推理
优化本体解析和编排器的差旅场景处理能力,完善报销单草稿 保存和费用明细同步逻辑,前端报销创建页面增加行程推理和 票据审核交互,新增助手会话快照工具函数,补充单元测试。
This commit is contained in:
@@ -414,11 +414,11 @@ def test_semantic_ontology_service_uses_client_local_date_for_relative_time() ->
|
||||
assert result.time_range.end_date == "2026-05-12"
|
||||
|
||||
|
||||
def test_semantic_ontology_service_extracts_day_before_yesterday_from_client_local_date() -> None:
|
||||
session_factory = build_session_factory()
|
||||
with session_factory() as db:
|
||||
result = SemanticOntologyService(db).parse(
|
||||
OntologyParseRequest(
|
||||
def test_semantic_ontology_service_extracts_day_before_yesterday_from_client_local_date() -> None:
|
||||
session_factory = build_session_factory()
|
||||
with session_factory() as db:
|
||||
result = SemanticOntologyService(db).parse(
|
||||
OntologyParseRequest(
|
||||
query="我前天请客户吃饭花了200元",
|
||||
user_id="pytest",
|
||||
context_json={
|
||||
@@ -427,12 +427,77 @@ def test_semantic_ontology_service_extracts_day_before_yesterday_from_client_loc
|
||||
},
|
||||
)
|
||||
)
|
||||
|
||||
assert result.time_range.raw == "前天"
|
||||
assert result.time_range.start_date == "2026-05-11"
|
||||
assert result.time_range.end_date == "2026-05-11"
|
||||
|
||||
|
||||
|
||||
assert result.time_range.raw == "前天"
|
||||
assert result.time_range.start_date == "2026-05-11"
|
||||
assert result.time_range.end_date == "2026-05-11"
|
||||
|
||||
|
||||
def test_semantic_ontology_service_treats_status_document_text_as_query() -> None:
|
||||
session_factory = build_session_factory()
|
||||
with session_factory() as db:
|
||||
result = SemanticOntologyService(db).parse(
|
||||
OntologyParseRequest(
|
||||
query="查询草稿的单据",
|
||||
user_id="pytest",
|
||||
)
|
||||
)
|
||||
|
||||
assert result.scenario == "expense"
|
||||
assert result.intent == "query"
|
||||
assert result.permission.level == "read"
|
||||
assert any(
|
||||
item.field == "status" and item.value == "draft"
|
||||
for item in result.constraints
|
||||
)
|
||||
|
||||
|
||||
def test_semantic_ontology_service_extracts_history_query_time_and_location() -> None:
|
||||
session_factory = build_session_factory()
|
||||
with session_factory() as db:
|
||||
result = SemanticOntologyService(db).parse(
|
||||
OntologyParseRequest(
|
||||
query="我去年去北京报销的单据",
|
||||
user_id="pytest",
|
||||
context_json={
|
||||
"client_now_iso": "2026-05-21T04:00:00.000Z",
|
||||
"client_timezone_offset_minutes": -480,
|
||||
},
|
||||
)
|
||||
)
|
||||
|
||||
assert result.scenario == "expense"
|
||||
assert result.intent == "query"
|
||||
assert result.time_range.raw == "去年"
|
||||
assert result.time_range.start_date == "2025-01-01"
|
||||
assert result.time_range.end_date == "2025-12-31"
|
||||
assert any(
|
||||
item.type == "location" and item.normalized_value == "北京"
|
||||
for item in result.entities
|
||||
)
|
||||
|
||||
|
||||
def test_semantic_ontology_service_understands_last_week_claim_progress_query() -> None:
|
||||
session_factory = build_session_factory()
|
||||
with session_factory() as db:
|
||||
result = SemanticOntologyService(db).parse(
|
||||
OntologyParseRequest(
|
||||
query="我上周提交的单据报销了么?",
|
||||
user_id="pytest",
|
||||
context_json={
|
||||
"client_now_iso": "2026-05-21T04:00:00.000Z",
|
||||
"client_timezone_offset_minutes": -480,
|
||||
},
|
||||
)
|
||||
)
|
||||
|
||||
assert result.scenario == "expense"
|
||||
assert result.intent == "query"
|
||||
assert result.time_range.raw == "上周"
|
||||
assert result.time_range.start_date == "2026-05-11"
|
||||
assert result.time_range.end_date == "2026-05-17"
|
||||
|
||||
|
||||
def test_semantic_ontology_service_maps_office_supplies_to_office_expense_type() -> None:
|
||||
session_factory = build_session_factory()
|
||||
with session_factory() as db:
|
||||
|
||||
Reference in New Issue
Block a user