refactor(server): enhance expense claims resolution logic
- expense_claims.py: add review_form_values fallback for expense type, employee name resolution
This commit is contained in:
@@ -44,9 +44,9 @@ class ExpenseClaimService:
|
|||||||
before_json = self._serialize_claim(claim) if claim is not None else None
|
before_json = self._serialize_claim(claim) if claim is not None else None
|
||||||
|
|
||||||
employee = self._resolve_employee(ontology=ontology, context_json=context_json)
|
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)
|
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)
|
location = self._resolve_location(message=message, context_json=context_json)
|
||||||
reason = self._resolve_reason(
|
reason = self._resolve_reason(
|
||||||
message=message,
|
message=message,
|
||||||
@@ -251,6 +251,12 @@ class ExpenseClaimService:
|
|||||||
user_id: str | None,
|
user_id: str | None,
|
||||||
fallback: str = "待补充",
|
fallback: str = "待补充",
|
||||||
) -> 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:
|
for item in ontology.entities:
|
||||||
if item.type == "employee" and item.value.strip():
|
if item.type == "employee" and item.value.strip():
|
||||||
return item.value.strip()
|
return item.value.strip()
|
||||||
@@ -291,7 +297,31 @@ class ExpenseClaimService:
|
|||||||
return None
|
return None
|
||||||
|
|
||||||
@staticmethod
|
@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:
|
for item in entities:
|
||||||
if item.type == "expense_type":
|
if item.type == "expense_type":
|
||||||
normalized = item.normalized_value.strip()
|
normalized = item.normalized_value.strip()
|
||||||
@@ -377,7 +407,20 @@ class ExpenseClaimService:
|
|||||||
return None
|
return None
|
||||||
|
|
||||||
@staticmethod
|
@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:
|
for item in entities:
|
||||||
if item.type != "amount" or item.role == "threshold":
|
if item.type != "amount" or item.role == "threshold":
|
||||||
continue
|
continue
|
||||||
|
|||||||
Reference in New Issue
Block a user