From df450cf79fb87f25458882312a071d6237e0abf1 Mon Sep 17 00:00:00 2001 From: caoxiaozhu Date: Tue, 12 May 2026 06:42:50 +0000 Subject: [PATCH] refactor(server): enhance expense claims resolution logic - expense_claims.py: add review_form_values fallback for expense type, employee name resolution --- server/src/app/services/expense_claims.py | 51 +++++++++++++++++++++-- 1 file changed, 47 insertions(+), 4 deletions(-) diff --git a/server/src/app/services/expense_claims.py b/server/src/app/services/expense_claims.py index 0882244..df3357e 100644 --- a/server/src/app/services/expense_claims.py +++ b/server/src/app/services/expense_claims.py @@ -44,9 +44,9 @@ class ExpenseClaimService: before_json = self._serialize_claim(claim) if claim is not None else None employee = self._resolve_employee(ontology=ontology, context_json=context_json) - amount = self._resolve_amount(ontology.entities) + amount = self._resolve_amount(ontology.entities, context_json=context_json) occurred_at = self._resolve_occurred_at(ontology, context_json=context_json) - expense_type = self._resolve_expense_type(ontology.entities) + expense_type = self._resolve_expense_type(ontology.entities, context_json=context_json) location = self._resolve_location(message=message, context_json=context_json) reason = self._resolve_reason( message=message, @@ -251,6 +251,12 @@ class ExpenseClaimService: user_id: str | None, fallback: str = "待补充", ) -> str: + review_form_values = context_json.get("review_form_values") + if isinstance(review_form_values, dict): + for key in ("reporter_name", "employee_name", "claimant_name"): + value = str(review_form_values.get(key) or "").strip() + if value: + return value for item in ontology.entities: if item.type == "employee" and item.value.strip(): return item.value.strip() @@ -291,7 +297,31 @@ class ExpenseClaimService: return None @staticmethod - def _resolve_expense_type(entities: list[OntologyEntity]) -> str | None: + def _resolve_expense_type( + entities: list[OntologyEntity], + *, + context_json: dict[str, Any], + ) -> str | None: + review_form_values = context_json.get("review_form_values") + if isinstance(review_form_values, dict): + compact = str( + review_form_values.get("expense_type") + or review_form_values.get("reimbursement_type") + or "" + ).replace(" ", "") + if compact: + if "招待" in compact or ("客户" in compact and any(word in compact for word in ("吃饭", "宴请", "请客", "用餐"))): + return "entertainment" + if any(word in compact for word in ("差旅", "出差", "机票", "行程")): + return "travel" + if any(word in compact for word in ("住宿", "酒店", "宾馆")): + return "hotel" + if any(word in compact for word in ("交通", "打车", "网约车", "出租车", "停车", "车费")): + return "transport" + if any(word in compact for word in ("餐费", "用餐", "午餐", "晚餐", "早餐", "伙食")): + return "meal" + if "会务" in compact: + return "meeting" for item in entities: if item.type == "expense_type": normalized = item.normalized_value.strip() @@ -377,7 +407,20 @@ class ExpenseClaimService: return None @staticmethod - def _resolve_amount(entities: list[OntologyEntity]) -> Decimal | None: + def _resolve_amount( + entities: list[OntologyEntity], + *, + context_json: dict[str, Any], + ) -> Decimal | None: + review_form_values = context_json.get("review_form_values") + if isinstance(review_form_values, dict): + raw_value = str(review_form_values.get("amount") or "").strip() + if raw_value: + compact = raw_value.replace("元", "").replace(",", "").strip() + try: + return Decimal(compact).quantize(Decimal("0.01")) + except (InvalidOperation, ValueError): + pass for item in entities: if item.type != "amount" or item.role == "threshold": continue