feat(ai): issue verified application preview decisions

This commit is contained in:
caoxiaozhu
2026-07-14 14:37:53 +08:00
parent a662cfe6c3
commit 5b24630710
32 changed files with 1976 additions and 217 deletions

View File

@@ -8,6 +8,7 @@ from sqlalchemy import or_, select
from sqlalchemy.exc import IntegrityError
from app.api.deps import CurrentUserContext
from app.models.ai_application_preview import AIApplicationPreviewDecision
from app.models.expense_case import BusinessEvent
from app.models.financial_record import ExpenseClaim
from app.schemas.reimbursement import TravelReimbursementCalculatorRequest
@@ -646,6 +647,8 @@ class UserAgentApplicationPersistenceMixin:
*,
action_type: str,
business_event: BusinessEvent,
preview_decision: AIApplicationPreviewDecision | None = None,
action_request_id: str = "",
) -> None:
if trusted_current_user is None:
return
@@ -656,6 +659,8 @@ class UserAgentApplicationPersistenceMixin:
trusted_current_user,
action_type=action_type,
business_event=business_event,
preview_decision=preview_decision,
action_request_id=action_request_id,
)
@staticmethod
@@ -727,6 +732,8 @@ class UserAgentApplicationPersistenceMixin:
*,
submit: bool,
learning_current_user: CurrentUserContext | None = None,
learning_preview_decision: AIApplicationPreviewDecision | None = None,
learning_action_request_id: str = "",
) -> ExpenseClaim:
current_user = self._build_application_current_user(payload)
previous_status = str(claim.status or "").strip()
@@ -771,6 +778,8 @@ class UserAgentApplicationPersistenceMixin:
learning_current_user,
action_type="save_draft",
business_event=draft_event,
preview_decision=learning_preview_decision,
action_request_id=learning_action_request_id,
)
self.db.commit()
self.db.refresh(claim)
@@ -794,6 +803,8 @@ class UserAgentApplicationPersistenceMixin:
learning_current_user,
action_type="submit",
business_event=event,
preview_decision=learning_preview_decision,
action_request_id=learning_action_request_id,
)
),
)
@@ -811,6 +822,8 @@ class UserAgentApplicationPersistenceMixin:
*,
submit: bool,
learning_current_user: CurrentUserContext | None = None,
learning_preview_decision: AIApplicationPreviewDecision | None = None,
learning_action_request_id: str = "",
) -> ExpenseClaim:
current_user = self._build_application_current_user(payload)
access_policy = ExpenseClaimAccessPolicy(self.db)
@@ -885,6 +898,8 @@ class UserAgentApplicationPersistenceMixin:
learning_current_user,
action_type="save_draft",
business_event=draft_event,
preview_decision=learning_preview_decision,
action_request_id=learning_action_request_id,
)
self.db.commit()
self.db.refresh(claim)
@@ -904,6 +919,8 @@ class UserAgentApplicationPersistenceMixin:
learning_current_user,
action_type="submit",
business_event=event,
preview_decision=learning_preview_decision,
action_request_id=learning_action_request_id,
)
),
)
@@ -1286,6 +1303,8 @@ class UserAgentApplicationMixin(UserAgentApplicationSlotMixin, UserAgentApplicat
*,
risk_flags: list[str],
learning_current_user: CurrentUserContext | None = None,
learning_preview_decision: AIApplicationPreviewDecision | None = None,
learning_action_request_id: str = "",
) -> UserAgentResponse:
facts = self._resolve_expense_application_facts(payload)
step = self._resolve_expense_application_step(payload, facts)
@@ -1299,6 +1318,8 @@ class UserAgentApplicationMixin(UserAgentApplicationSlotMixin, UserAgentApplicat
editable_claim,
submit=step == "submitted",
learning_current_user=learning_current_user,
learning_preview_decision=learning_preview_decision,
learning_action_request_id=learning_action_request_id,
)
facts["application_edit_mode"] = "true"
elif step == "submitted":
@@ -1312,6 +1333,8 @@ class UserAgentApplicationMixin(UserAgentApplicationSlotMixin, UserAgentApplicat
facts,
submit=True,
learning_current_user=learning_current_user,
learning_preview_decision=learning_preview_decision,
learning_action_request_id=learning_action_request_id,
)
else:
application_claim = self._create_expense_application_record(
@@ -1319,6 +1342,8 @@ class UserAgentApplicationMixin(UserAgentApplicationSlotMixin, UserAgentApplicat
facts,
submit=False,
learning_current_user=learning_current_user,
learning_preview_decision=learning_preview_decision,
learning_action_request_id=learning_action_request_id,
)
if application_claim is not None:
facts["application_no"] = application_claim.claim_no