feat(server): 新增编排器和报销单API接口,扩展服务编排和报销管理端点

This commit is contained in:
caoxiaozhu
2026-05-14 15:42:22 +00:00
parent af98acceb3
commit fad583ee7c
2 changed files with 39 additions and 0 deletions

View File

@@ -49,12 +49,14 @@ def get_latest_conversation(
user_id: Annotated[str, Query(min_length=1, description="当前用户 ID。")], user_id: Annotated[str, Query(min_length=1, description="当前用户 ID。")],
db: DbSession, db: DbSession,
session_type: Annotated[str | None, Query(description="会话类型,例如 expense / knowledge。")] = None, session_type: Annotated[str | None, Query(description="会话类型,例如 expense / knowledge。")] = None,
prefer_recoverable: Annotated[bool, Query(description="是否优先返回最近一条可恢复的会话。")] = False,
) -> ConversationLookupResponse: ) -> ConversationLookupResponse:
service = AgentConversationService(db) service = AgentConversationService(db)
conversation = service.get_latest_conversation_for_user( conversation = service.get_latest_conversation_for_user(
user_id=user_id, user_id=user_id,
source="user_message", source="user_message",
session_type=session_type, session_type=session_type,
prefer_recoverable=prefer_recoverable,
) )
if conversation is None: if conversation is None:
return ConversationLookupResponse(found=False, conversation=None) return ConversationLookupResponse(found=False, conversation=None)

View File

@@ -272,6 +272,43 @@ def get_expense_claim_item_attachment_meta(
return ExpenseClaimAttachmentRead(**payload) return ExpenseClaimAttachmentRead(**payload)
@router.get(
"/claims/{claim_id}/items/{item_id}/attachment/preview",
response_class=FileResponse,
summary="读取费用明细附件预览资源",
description="优先返回票据预览图;若无单独预览图,则回退到原附件内容。",
responses={
status.HTTP_404_NOT_FOUND: {
"model": ErrorResponse,
"description": "报销单、费用明细或附件预览不存在。",
},
},
)
def get_expense_claim_item_attachment_preview(
claim_id: str,
item_id: str,
db: DbSession,
current_user: CurrentUser,
) -> FileResponse:
service = ExpenseClaimService(db)
try:
payload = service.get_claim_item_attachment_preview_content(
claim_id=claim_id,
item_id=item_id,
current_user=current_user,
)
except LookupError as error:
raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail=str(error)) from error
except FileNotFoundError as error:
raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail=str(error)) from error
if payload is None:
raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail="Claim not found")
file_path, media_type, filename = payload
return FileResponse(file_path, media_type=media_type, filename=filename)
@router.get( @router.get(
"/claims/{claim_id}/items/{item_id}/attachment", "/claims/{claim_id}/items/{item_id}/attachment",
response_class=FileResponse, response_class=FileResponse,