From 8f6566180936d55b04e44f1fff8db5e96d2070d3 Mon Sep 17 00:00:00 2001 From: caoxiaozhu Date: Thu, 21 May 2026 09:28:33 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E5=A2=9E=E5=8A=A0=E5=B7=AE=E6=97=85?= =?UTF-8?q?=E6=8A=A5=E9=94=80=E6=A0=87=E5=87=86=E6=B5=8B=E7=AE=97=E5=92=8C?= =?UTF-8?q?=E8=B4=A2=E5=8A=A1=E7=BB=88=E5=AE=A1=E6=B5=81=E7=A8=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 新增差旅报销测算接口及 Spreadsheet 规则解析,审批流程拆分 直属领导审批与财务终审两阶段并细分权限,修复 PDF 文本层 缺失时自动回退 OCR,提交后清理关联会话,前端适配审批流 交互并补充单元测试。 --- docker-compose.yml | 22 +- .../app/api/v1/endpoints/reimbursements.py | 32 +- server/src/app/models/financial_record.py | 4 + server/src/app/schemas/reimbursement.py | 31 + .../src/app/services/agent_conversations.py | 55 +- .../src/app/services/document_intelligence.py | 2 +- server/src/app/services/expense_claims.py | 378 +++++++-- .../src/app/services/expense_rule_runtime.py | 442 ++++++++++- server/src/app/services/ocr.py | 112 ++- .../travel_reimbursement_calculator.py | 593 ++++++++++++++ server/src/app/services/user_agent.py | 735 ++++++++++++++++-- .../2月23_上海-武汉.pdf | Bin 0 -> 24940 bytes .../2月23_上海-武汉.pdf.meta.json | 90 +++ .../2月23_上海-武汉.preview.png | Bin 0 -> 137722 bytes .../2月20_武汉-上海.pdf | Bin 0 -> 24995 bytes .../2月20_武汉-上海.pdf.meta.json | 90 +++ .../2月20_武汉-上海.preview.png | Bin 0 -> 136681 bytes server/storage/font-test-after-install.png | Bin 0 -> 137722 bytes server/storage/knowledge/.index.json | 6 +- server/tests/test_agent_asset_service.py | 126 ++- server/tests/test_document_intelligence.py | 21 + server/tests/test_expense_claim_service.py | 234 +++++- server/tests/test_ocr_service.py | 77 ++ server/tests/test_orchestrator_review_flow.py | 5 + server/tests/test_reimbursement_endpoints.py | 8 + server/tests/test_user_agent_service.py | 509 +++++++++++- .../travel-reimbursement-create-view.css | 221 +++--- web/src/composables/useRequests.js | 30 +- web/src/services/reimbursements.js | 7 + web/src/utils/accessControl.js | 11 +- web/src/utils/approvalInbox.js | 14 +- web/src/utils/requestViewModel.js | 22 +- .../views/TravelReimbursementCreateView.vue | 142 ++-- web/src/views/TravelRequestDetailView.vue | 16 +- .../scripts/TravelReimbursementCreateView.js | 412 ++++++++-- .../views/scripts/TravelRequestDetailView.js | 83 +- web/tests/accessControl.test.mjs | 40 +- web/tests/requestProgressSteps.test.mjs | 92 +++ web/tests/requestViewModel.test.mjs | 14 + ...eimbursement-review-drawer-switch.test.mjs | 75 ++ ...el-request-detail-leader-approval.test.mjs | 12 +- ...travel-request-detail-risk-advice.test.mjs | 7 + ...vel-request-detail-submit-confirm.test.mjs | 6 + 43 files changed, 4366 insertions(+), 410 deletions(-) create mode 100644 server/src/app/services/travel_reimbursement_calculator.py create mode 100644 server/storage/expense_claims/08f51e80-512e-498e-bcd6-50ca5d0becfc/1170b632-ad59-46c0-9876-7230d9d97e30/2月23_上海-武汉.pdf create mode 100644 server/storage/expense_claims/08f51e80-512e-498e-bcd6-50ca5d0becfc/1170b632-ad59-46c0-9876-7230d9d97e30/2月23_上海-武汉.pdf.meta.json create mode 100644 server/storage/expense_claims/08f51e80-512e-498e-bcd6-50ca5d0becfc/1170b632-ad59-46c0-9876-7230d9d97e30/2月23_上海-武汉.preview.png create mode 100644 server/storage/expense_claims/08f51e80-512e-498e-bcd6-50ca5d0becfc/62fe16f9-ad9f-4f96-948f-0b31a427a81d/2月20_武汉-上海.pdf create mode 100644 server/storage/expense_claims/08f51e80-512e-498e-bcd6-50ca5d0becfc/62fe16f9-ad9f-4f96-948f-0b31a427a81d/2月20_武汉-上海.pdf.meta.json create mode 100644 server/storage/expense_claims/08f51e80-512e-498e-bcd6-50ca5d0becfc/62fe16f9-ad9f-4f96-948f-0b31a427a81d/2月20_武汉-上海.preview.png create mode 100644 server/storage/font-test-after-install.png diff --git a/docker-compose.yml b/docker-compose.yml index 7a0f87a..608dec7 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -30,10 +30,24 @@ services: - /bin/sh - -lc - > - apt-get update && - DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends - python3 python3-pip python3-venv && - mkdir -p /run/sshd && /usr/sbin/sshd && + apt-get update && + DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends + python3 python3-pip python3-venv fontconfig fonts-noto-cjk fonts-noto-cjk-extra && + printf '%s\n' + '' + '' + '' + ' SimSunNoto Serif CJK SC' + ' NSimSunNoto Serif CJK SC' + ' KaiTiNoto Serif CJK SC' + ' FangSongNoto Serif CJK SC' + ' SimHeiNoto Sans CJK SC' + ' DengXianNoto Sans CJK SC' + ' Microsoft YaHeiNoto Sans CJK SC' + '' + > /etc/fonts/local.conf && + fc-cache -f && + mkdir -p /run/sshd && /usr/sbin/sshd && printf '%s\n' 'cd /app >/dev/null 2>&1 || true' > /etc/profile.d/zz-x-financial-app-dir.sh && chmod 644 /etc/profile.d/zz-x-financial-app-dir.sh && touch /root/.bashrc /root/.profile && diff --git a/server/src/app/api/v1/endpoints/reimbursements.py b/server/src/app/api/v1/endpoints/reimbursements.py index 42af4f0..727f5d2 100644 --- a/server/src/app/api/v1/endpoints/reimbursements.py +++ b/server/src/app/api/v1/endpoints/reimbursements.py @@ -20,9 +20,12 @@ from app.schemas.reimbursement import ( ExpenseClaimReturnPayload, ReimbursementCreate, ReimbursementRead, + TravelReimbursementCalculatorRequest, + TravelReimbursementCalculatorResponse, ) from app.services.expense_claims import ExpenseClaimService from app.services.reimbursement import ReimbursementService +from app.services.travel_reimbursement_calculator import TravelReimbursementCalculatorService router = APIRouter() DbSession = Annotated[Session, Depends(get_db)] @@ -50,6 +53,29 @@ def create_reimbursement(payload: ReimbursementCreate, db: DbSession) -> Reimbur return ReimbursementService(db).create_reimbursement(payload) +@router.post( + "/travel-calculator", + response_model=TravelReimbursementCalculatorResponse, + summary="差旅报销标准测算", + description="根据规则中心的差旅报销表、当前员工职级、出差天数与地点测算住宿和补贴参考金额。", + responses={ + status.HTTP_400_BAD_REQUEST: { + "model": ErrorResponse, + "description": "测算入参或规则匹配失败。", + } + }, +) +def calculate_travel_reimbursement( + payload: TravelReimbursementCalculatorRequest, + db: DbSession, + current_user: CurrentUser, +) -> TravelReimbursementCalculatorResponse: + try: + return TravelReimbursementCalculatorService(db).calculate(payload, current_user) + except ValueError as error: + raise HTTPException(status_code=status.HTTP_400_BAD_REQUEST, detail=str(error)) from error + + @router.get( "/claims", response_model=list[ExpenseClaimRead], @@ -463,8 +489,8 @@ def return_expense_claim( @router.post( "/claims/{claim_id}/approve", response_model=ExpenseClaimRead, - summary="直属领导审批通过报销单", - description="当前审批人确认报销信息无误后,将报销单从直属领导审批流转到财务审批。", + summary="审批通过报销单", + description="直属领导审批通过后流转到财务审批;财务终审通过后进入归档入账。", responses={ status.HTTP_404_NOT_FOUND: { "model": ErrorResponse, @@ -497,7 +523,7 @@ def approve_expense_claim( "/claims/{claim_id}", response_model=ExpenseClaimActionResponse, summary="删除报销单", - description="普通用户仅可删除草稿或待补充报销单;财务人员和高级管理人员可删除可见报销单。", + description="申请人仅可删除自己的草稿、待补充或退回单据;高级管理人员可删除可见单据,财务人员没有删除权限。", responses={ status.HTTP_404_NOT_FOUND: { "model": ErrorResponse, diff --git a/server/src/app/models/financial_record.py b/server/src/app/models/financial_record.py index 5607b26..19468df 100644 --- a/server/src/app/models/financial_record.py +++ b/server/src/app/models/financial_record.py @@ -93,6 +93,10 @@ class ExpenseClaimItem(Base): claim = relationship("ExpenseClaim", back_populates="items") + @property + def is_system_generated(self) -> bool: + return str(self.item_type or "").strip().lower() in {"travel_allowance"} + class AccountsReceivableRecord(Base): __tablename__ = "accounts_receivable" diff --git a/server/src/app/schemas/reimbursement.py b/server/src/app/schemas/reimbursement.py index 06f9ec8..97e206c 100644 --- a/server/src/app/schemas/reimbursement.py +++ b/server/src/app/schemas/reimbursement.py @@ -41,6 +41,7 @@ class ExpenseClaimItemRead(BaseModel): item_location: str item_amount: Decimal invoice_id: str | None + is_system_generated: bool = False created_at: datetime updated_at: datetime @@ -157,11 +158,41 @@ class ExpenseClaimApprovalPayload(BaseModel): opinion: str | None = Field(default=None, max_length=500) +class TravelReimbursementCalculatorRequest(BaseModel): + days: int = Field(ge=1, le=365) + location: str = Field(min_length=1, max_length=120) + grade: str | None = Field(default=None, max_length=30) + + +class TravelReimbursementCalculatorResponse(BaseModel): + days: int + location: str + matched_city: str + city_tier: str + grade: str + grade_band: str + grade_band_label: str + hotel_rate: Decimal + hotel_amount: Decimal + allowance_region: str + meal_allowance_rate: Decimal + basic_allowance_rate: Decimal + total_allowance_rate: Decimal + allowance_amount: Decimal + total_amount: Decimal + rule_name: str + rule_version: str + formula_text: str + summary_text: str + + class ExpenseClaimAttachmentActionResponse(BaseModel): message: str claim_id: str item_id: str invoice_id: str | None = None + item_amount: Decimal | None = None + claim_amount: Decimal | None = None attachment: ExpenseClaimAttachmentRead | None = None diff --git a/server/src/app/services/agent_conversations.py b/server/src/app/services/agent_conversations.py index 45843ed..9bc93ad 100644 --- a/server/src/app/services/agent_conversations.py +++ b/server/src/app/services/agent_conversations.py @@ -39,6 +39,7 @@ class AgentConversationService: normalized_id = str(conversation_id or "").strip() normalized_user_id = str(user_id or "").strip() or None incoming_session_type = str(context_json.get("session_type") or "").strip() or "expense" + incoming_draft_claim_id = self._resolve_draft_claim_id(context_json) conversation = self.get_conversation(normalized_id) if normalized_id else None if conversation is not None and conversation.user_id != normalized_user_id: normalized_id = "" @@ -56,6 +57,7 @@ class AgentConversationService: source=source, entry_source=str(context_json.get("entry_source") or "").strip() or None, title=self._resolve_title(context_json), + draft_claim_id=incoming_draft_claim_id or None, state_json=self._extract_state_json(context_json), ) self.db.add(conversation) @@ -69,6 +71,8 @@ class AgentConversationService: conversation.entry_source = str(context_json.get("entry_source") or "").strip() or None if not conversation.title: conversation.title = self._resolve_title(context_json) + if incoming_draft_claim_id: + conversation.draft_claim_id = incoming_draft_claim_id conversation.state_json = self._merge_state_json( conversation.state_json, self._extract_state_json(context_json), @@ -354,6 +358,38 @@ class AgentConversationService: self.db.commit() return len(conversations) + def delete_conversations_for_draft_claim( + self, + *, + claim_id: str | None, + source: str | None = "user_message", + session_type: str | None = "expense", + ) -> int: + normalized_claim_id = str(claim_id or "").strip() + if not normalized_claim_id: + return 0 + + stmt = select(AgentConversation).where(AgentConversation.draft_claim_id == normalized_claim_id) + if source: + stmt = stmt.where(AgentConversation.source == source) + conversations = list(self.db.scalars(stmt).all()) + normalized_session_type = str(session_type or "").strip() + if normalized_session_type: + conversations = [ + conversation + for conversation in conversations + if (str((conversation.state_json or {}).get("session_type") or "").strip() or "expense") + == normalized_session_type + ] + if not conversations: + return 0 + + for conversation in conversations: + self.db.delete(conversation) + + self.db.commit() + return len(conversations) + def delete_conversation( self, *, @@ -478,11 +514,28 @@ class AgentConversationService: continue state_json[key] = value - draft_claim_id = str(context_json.get("draft_claim_id") or "").strip() + draft_claim_id = AgentConversationService._resolve_draft_claim_id(context_json) if draft_claim_id: state_json["draft_claim_id"] = draft_claim_id return state_json + @staticmethod + def _resolve_draft_claim_id(context_json: dict[str, Any]) -> str: + draft_claim_id = str((context_json or {}).get("draft_claim_id") or "").strip() + if draft_claim_id: + return draft_claim_id + + request_context = (context_json or {}).get("request_context") + if isinstance(request_context, dict): + return str( + request_context.get("claim_id") + or request_context.get("claimId") + or request_context.get("draft_claim_id") + or request_context.get("draftClaimId") + or "" + ).strip() + return "" + @staticmethod def _merge_state_json( current_state: dict[str, Any] | None, diff --git a/server/src/app/services/document_intelligence.py b/server/src/app/services/document_intelligence.py index 4f116a8..e36e42e 100644 --- a/server/src/app/services/document_intelligence.py +++ b/server/src/app/services/document_intelligence.py @@ -86,7 +86,7 @@ DOCUMENT_RULES: tuple[DocumentRule, ...] = ( scene_code="travel", scene_label="差旅票据", expense_type="travel", - keywords=("高铁", "火车", "动车", "铁路", "车次", "检票", "二等座", "一等座"), + keywords=("铁路电子客票", "电子客票", "高铁", "火车", "动车", "铁路", "车次", "检票", "二等座", "一等座", "票价"), score_bias=0.32, ), DocumentRule( diff --git a/server/src/app/services/expense_claims.py b/server/src/app/services/expense_claims.py index ca917c8..9e66b7a 100644 --- a/server/src/app/services/expense_claims.py +++ b/server/src/app/services/expense_claims.py @@ -57,6 +57,7 @@ EXPENSE_TYPE_LABELS = { PRIVILEGED_CLAIM_ROLE_CODES = {"finance", "executive"} APPROVAL_VISIBLE_CLAIM_ROLE_CODES = {"manager", "approver"} +CLAIM_DELETE_ROLE_CODES = {"executive"} MAX_DRAFT_CLAIMS_PER_USER = 3 EDITABLE_CLAIM_STATUSES = ("draft", "supplement", "returned") LOCATION_REQUIRED_EXPENSE_TYPES = { @@ -542,14 +543,19 @@ class ExpenseClaimService: [(normalized_name, content, media_type or "application/octet-stream")] ) documents = list(ocr_result.documents or []) - if documents: - ocr_document = documents[0] - ocr_status = "recognized" - document_info = self._build_attachment_document_info(ocr_document) - requirement_check = self._build_attachment_requirement_check( - item=item, - document_info=document_info, - ) + if documents: + ocr_document = documents[0] + ocr_status = "recognized" + document_info = self._build_attachment_document_info(ocr_document) + self._backfill_item_amount_from_attachment( + item=item, + document=ocr_document, + document_info=document_info, + ) + requirement_check = self._build_attachment_requirement_check( + item=item, + document_info=document_info, + ) attachment_analysis = self._build_attachment_analysis( document=ocr_document, item=item, @@ -615,13 +621,15 @@ class ExpenseClaimService: after_json=self._serialize_claim(claim), ) - return { - "message": f"{normalized_name} 已上传并关联到当前费用明细。", - "claim_id": claim.id, - "item_id": item.id, - "invoice_id": item.invoice_id, - "attachment": self._build_attachment_payload(item), - } + return { + "message": f"{normalized_name} 已上传并关联到当前费用明细。", + "claim_id": claim.id, + "item_id": item.id, + "invoice_id": item.invoice_id, + "item_amount": item.item_amount, + "claim_amount": claim.amount, + "attachment": self._build_attachment_payload(item), + } def get_claim_item_attachment_meta( self, @@ -739,16 +747,18 @@ class ExpenseClaimService: self.db.commit() self.db.refresh(claim) - self.audit_service.log_action( - actor=current_user.name or current_user.username, - action="expense_claim.submit", - resource_type="expense_claim", - resource_id=claim.id, - before_json=before_json, - after_json=self._serialize_claim(claim), - ) - - return claim + self.audit_service.log_action( + actor=current_user.name or current_user.username, + action="expense_claim.submit", + resource_type="expense_claim", + resource_id=claim.id, + before_json=before_json, + after_json=self._serialize_claim(claim), + ) + if str(claim.status or "").strip().lower() == "submitted": + self._delete_submitted_claim_assistant_sessions(claim.id) + + return claim def save_or_submit_from_ontology( self, @@ -858,8 +868,10 @@ class ExpenseClaimService: if claim is None: return None - if not self._has_privileged_claim_access(current_user): + if not self._has_claim_delete_access(current_user): self._ensure_draft_claim(claim) + if not self._is_claim_owned_by_current_user(claim, current_user): + raise ValueError("只有高级管理人员可以删除非本人单据,申请人仅可删除自己的草稿、待补充或退回单据。") before_json = self._serialize_claim(claim) resource_id = claim.id @@ -903,7 +915,7 @@ class ExpenseClaimService: raise ValueError("已完成单据不允许退回。") before_json = self._serialize_claim(claim) - operator = current_user.name or current_user.username + operator = self._resolve_current_user_display_name(current_user) previous_status = str(claim.status or "").strip() previous_stage = str(claim.approval_stage or "").strip() or "未标记审批环节" previous_stage_key = self._normalize_return_stage_key(previous_stage) @@ -987,29 +999,43 @@ class ExpenseClaimService: if claim is None: return None - if not self._can_approve_claim(current_user, claim): - raise ValueError("只有当前直属领导审批人可以审批通过该报销单。") - normalized_status = str(claim.status or "").strip().lower() if normalized_status != "submitted": raise ValueError("只有审批中的报销单可以审批通过。") previous_stage = str(claim.approval_stage or "").strip() - if previous_stage != "直属领导审批": - raise ValueError("当前节点不是直属领导审批,不能执行领导审批通过。") + if previous_stage == "直属领导审批": + if not self._can_approve_claim(current_user, claim): + raise ValueError("只有当前直属领导审批人可以审批通过该报销单。") + approval_source = "manual_approval" + event_type = "expense_claim_approval" + label = "领导审批通过" + next_status = "submitted" + next_stage = "财务审批" + default_message = "{operator} 已审批通过,流转至{next_stage}。" + elif previous_stage == "财务审批": + if not self._can_approve_claim(current_user, claim): + raise ValueError("只有财务人员可以完成财务终审。") + approval_source = "finance_approval" + event_type = "expense_claim_finance_approval" + label = "财务审核通过" + next_status = "approved" + next_stage = "归档入账" + default_message = "{operator} 已完成财务审核,进入归档入账。" + else: + raise ValueError("当前节点不支持审批通过。") before_json = self._serialize_claim(claim) - operator = current_user.name or current_user.username - leader_opinion = str(opinion or "").strip() - next_stage = "财务审批" + operator = self._resolve_current_user_display_name(current_user) + approval_opinion = str(opinion or "").strip() approval_flag = { - "source": "manual_approval", - "event_type": "expense_claim_approval", + "source": approval_source, + "event_type": event_type, "approval_event_id": str(uuid.uuid4()), "severity": "info", - "label": "领导审批通过", - "message": leader_opinion or f"{operator} 已审批通过,流转至{next_stage}。", - "opinion": leader_opinion, + "label": label, + "message": approval_opinion or default_message.format(operator=operator, next_stage=next_stage), + "opinion": approval_opinion, "operator": operator, "operator_username": current_user.username, "operator_role_codes": [ @@ -1024,7 +1050,7 @@ class ExpenseClaimService: "created_at": datetime.now(UTC).isoformat(), } - claim.status = "submitted" + claim.status = next_status claim.approval_stage = next_stage if claim.submitted_at is None: claim.submitted_at = datetime.now(UTC) @@ -2205,16 +2231,89 @@ class ExpenseClaimService: meta_path = self._attachment_meta_path(file_path) meta_path.write_text(json.dumps(payload, ensure_ascii=False, indent=2), encoding="utf-8") - def _read_attachment_meta(self, file_path: Path) -> dict[str, Any]: - meta_path = self._attachment_meta_path(file_path) - if not meta_path.exists(): - return {} + def _read_attachment_meta(self, file_path: Path) -> dict[str, Any]: + meta_path = self._attachment_meta_path(file_path) + if not meta_path.exists(): + return {} try: payload = json.loads(meta_path.read_text(encoding="utf-8")) except (json.JSONDecodeError, OSError): - return {} - return payload if isinstance(payload, dict) else {} + return {} + return payload if isinstance(payload, dict) else {} + + def _repair_pdf_text_layer_metadata_if_needed( + self, + *, + file_path: Path, + metadata: dict[str, Any], + item: ExpenseClaimItem | None = None, + ) -> dict[str, Any]: + if not metadata: + return metadata + + media_type = str(metadata.get("media_type") or self._resolve_attachment_media_type(file_path.name)).strip() + if media_type != "application/pdf": + return metadata + + ocr_text = str(metadata.get("ocr_text") or "") + ocr_summary = str(metadata.get("ocr_summary") or "") + if OcrService._placeholder_ratio(f"{ocr_summary}\n{ocr_text}") < 0.12: + return metadata + + text_layer = OcrService(self.db)._extract_pdf_text_layer(file_path) + repaired_text, used_text_layer = OcrService._choose_document_text( + ocr_text=ocr_text, + text_layer=text_layer, + ) + if not used_text_layer or not repaired_text: + return metadata + + repaired_summary = OcrService._summarize_text(repaired_text) + document = SimpleNamespace( + filename=str(metadata.get("file_name") or file_path.name), + text=repaired_text, + summary=repaired_summary, + avg_score=float(metadata.get("ocr_avg_score") or 0.0), + line_count=int(metadata.get("ocr_line_count") or 0), + document_type="", + document_type_label="", + scene_code="", + scene_label="", + document_fields=[], + warnings=[str(value) for value in list(metadata.get("ocr_warnings") or []) if str(value).strip()], + ) + document_info = self._build_attachment_document_info(document) + document.document_type = document_info.get("document_type", "") + document.document_type_label = document_info.get("document_type_label", "") + document.scene_code = document_info.get("scene_code", "") + document.scene_label = document_info.get("scene_label", "") + document.document_fields = list(document_info.get("fields") or []) + + metadata["ocr_text"] = repaired_text + metadata["ocr_summary"] = repaired_summary + metadata["document_info"] = document_info + metadata["previewable"] = True + metadata["preview_kind"] = "pdf" + metadata["preview_storage_key"] = str(metadata.get("storage_key") or self._to_attachment_storage_key(file_path)) + metadata["preview_media_type"] = "application/pdf" + metadata["preview_file_name"] = str(metadata.get("file_name") or file_path.name) + + if item is not None: + requirement_check = self._build_attachment_requirement_check( + item=item, + document_info=document_info, + ) + metadata["requirement_check"] = requirement_check + metadata["analysis"] = self._build_attachment_analysis( + document=document, + item=item, + document_info=document_info, + requirement_check=requirement_check, + ) + + self._write_attachment_meta(file_path, metadata) + return metadata def _build_attachment_preview_meta( self, @@ -2262,12 +2361,17 @@ class ExpenseClaimService: "preview_file_name": "", } - def _resolve_item_attachment_preview_content(self, item: ExpenseClaimItem) -> tuple[Path, str, str]: - file_path, media_type, filename = self._resolve_item_attachment_content(item) - metadata = self._read_attachment_meta(file_path) - preview_storage_key = str(metadata.get("preview_storage_key") or "").strip() - preview_file_name = str(metadata.get("preview_file_name") or "").strip() - preview_media_type = str(metadata.get("preview_media_type") or "").strip() + def _resolve_item_attachment_preview_content(self, item: ExpenseClaimItem) -> tuple[Path, str, str]: + file_path, media_type, filename = self._resolve_item_attachment_content(item) + metadata = self._read_attachment_meta(file_path) + metadata = self._repair_pdf_text_layer_metadata_if_needed( + file_path=file_path, + metadata=metadata, + item=item, + ) + preview_storage_key = str(metadata.get("preview_storage_key") or "").strip() + preview_file_name = str(metadata.get("preview_file_name") or "").strip() + preview_media_type = str(metadata.get("preview_media_type") or "").strip() if preview_storage_key: preview_path = self._resolve_attachment_path(preview_storage_key) @@ -2284,10 +2388,15 @@ class ExpenseClaimService: raise FileNotFoundError("Attachment preview not found") - def _build_attachment_payload(self, item: ExpenseClaimItem) -> dict[str, Any]: - file_path, media_type, filename = self._resolve_item_attachment_content(item) - metadata = self._read_attachment_meta(file_path) - uploaded_at_value = metadata.get("uploaded_at") + def _build_attachment_payload(self, item: ExpenseClaimItem) -> dict[str, Any]: + file_path, media_type, filename = self._resolve_item_attachment_content(item) + metadata = self._read_attachment_meta(file_path) + metadata = self._repair_pdf_text_layer_metadata_if_needed( + file_path=file_path, + metadata=metadata, + item=item, + ) + uploaded_at_value = metadata.get("uploaded_at") uploaded_at = None if isinstance(uploaded_at_value, str) and uploaded_at_value.strip(): try: @@ -2402,11 +2511,11 @@ class ExpenseClaimService: return normalized_next - def _build_attachment_document_info(self, document: Any) -> dict[str, Any]: - insight = build_document_insight( - filename=str(getattr(document, "filename", "") or ""), - summary=str(getattr(document, "summary", "") or ""), - text=str(getattr(document, "text", "") or ""), + def _build_attachment_document_info(self, document: Any) -> dict[str, Any]: + insight = build_document_insight( + filename=str(getattr(document, "filename", "") or ""), + summary=str(getattr(document, "summary", "") or ""), + text=str(getattr(document, "text", "") or ""), ) raw_fields = list(getattr(document, "document_fields", []) or []) normalized_fields: list[dict[str, str]] = [] @@ -2463,14 +2572,35 @@ class ExpenseClaimService: "document_type_label": document_type_label, "scene_code": scene_code, "scene_label": scene_label, - "fields": normalized_fields, - } - - def _build_attachment_requirement_check( - self, - *, - item: ExpenseClaimItem, - document_info: dict[str, Any], + "fields": normalized_fields, + } + + def _backfill_item_amount_from_attachment( + self, + *, + item: ExpenseClaimItem, + document: Any, + document_info: dict[str, Any], + ) -> None: + current_amount = Decimal(item.item_amount or Decimal("0.00")).quantize(Decimal("0.01")) + if current_amount > Decimal("0.00"): + return + + amount = self._resolve_document_item_amount( + { + "document_fields": document_info.get("fields") or [], + "summary": str(getattr(document, "summary", "") or ""), + "text": str(getattr(document, "text", "") or ""), + } + ) + if amount is not None and amount > Decimal("0.00"): + item.item_amount = amount + + def _build_attachment_requirement_check( + self, + *, + item: ExpenseClaimItem, + document_info: dict[str, Any], ) -> dict[str, Any]: expense_type = str(item.item_type or "").strip().lower() or "other" policy = self._get_expense_scene_policy(expense_type) @@ -2932,8 +3062,17 @@ class ExpenseClaimService: def _ensure_draft_claim(self, claim: ExpenseClaim) -> None: if not self._is_editable_claim_status(claim.status): raise ValueError("只有草稿、待补充或退回待提交状态的报销单才允许执行该操作。") - - def _run_ai_submission_review(self, claim: ExpenseClaim) -> dict[str, Any]: + + def _delete_submitted_claim_assistant_sessions(self, claim_id: str | None) -> None: + from app.services.agent_conversations import AgentConversationService + + AgentConversationService(self.db).delete_conversations_for_draft_claim( + claim_id=claim_id, + source="user_message", + session_type="expense", + ) + + def _run_ai_submission_review(self, claim: ExpenseClaim) -> dict[str, Any]: base_flags = list(claim.risk_flags_json or []) attachment_flags = [ flag @@ -4593,7 +4732,7 @@ class ExpenseClaimService: return str(expense_type or "").strip().lower() in LOCATION_REQUIRED_EXPENSE_TYPES return bool(policy.location_required) - @staticmethod + @staticmethod def _has_privileged_claim_access(current_user: CurrentUserContext) -> bool: if current_user.is_admin: return True @@ -4604,6 +4743,17 @@ class ExpenseClaimService: } return bool(role_codes & PRIVILEGED_CLAIM_ROLE_CODES) + @staticmethod + def _has_claim_delete_access(current_user: CurrentUserContext) -> bool: + if current_user.is_admin: + return True + role_codes = { + str(item).strip().lower() + for item in current_user.role_codes + if str(item).strip() + } + return bool(role_codes & CLAIM_DELETE_ROLE_CODES) + def _can_return_claim(self, current_user: CurrentUserContext, claim: ExpenseClaim) -> bool: if self._has_privileged_claim_access(current_user): return True @@ -4636,7 +4786,41 @@ class ExpenseClaimService: return self._resolve_claim_manager_name(claim) == approver_name def _can_approve_claim(self, current_user: CurrentUserContext, claim: ExpenseClaim) -> bool: - return self._can_return_claim(current_user, claim) + stage = str(claim.approval_stage or "").strip() + if stage == "直属领导审批": + return self._is_current_direct_manager_approver(current_user, claim) + if stage == "财务审批": + role_codes = self._normalize_role_codes(current_user) + return current_user.is_admin or "finance" in role_codes + return False + + def _is_current_direct_manager_approver(self, current_user: CurrentUserContext, claim: ExpenseClaim) -> bool: + role_codes = self._normalize_role_codes(current_user) + if not (role_codes & APPROVAL_VISIBLE_CLAIM_ROLE_CODES): + return False + if str(claim.status or "").strip().lower() != "submitted": + return False + if str(claim.approval_stage or "").strip() != "直属领导审批": + return False + + current_employee = self._resolve_current_employee(current_user) + if current_employee is not None and str(claim.employee_id or "").strip() == current_employee.id: + return False + + claim_employee = claim.employee + if current_employee is not None and claim_employee is not None: + if claim_employee.manager_id == current_employee.id: + return True + if claim_employee.manager is not None and claim_employee.manager.id == current_employee.id: + return True + + approver_name = str( + current_employee.name if current_employee is not None and current_employee.name else current_user.name or "" + ).strip() + if not approver_name: + return False + + return self._resolve_claim_manager_name(claim) == approver_name @staticmethod def _normalize_role_codes(current_user: CurrentUserContext) -> set[str]: @@ -4654,6 +4838,44 @@ class ExpenseClaimService: ] ) + def _resolve_current_user_display_name(self, current_user: CurrentUserContext) -> str: + current_employee = self._resolve_current_employee(current_user) + if current_employee is not None and str(current_employee.name or "").strip(): + return str(current_employee.name).strip() + + for candidate in (current_user.name, current_user.username): + normalized = str(candidate or "").strip() + if normalized and not self._is_email_like(normalized): + return normalized + + return str(current_user.username or current_user.name or "anonymous").strip() or "anonymous" + + def _is_claim_owned_by_current_user(self, claim: ExpenseClaim, current_user: CurrentUserContext) -> bool: + current_employee = self._resolve_current_employee(current_user) + if current_employee is not None: + if str(claim.employee_id or "").strip() == current_employee.id: + return True + identity_values = { + str(current_employee.name or "").strip(), + str(current_employee.email or "").strip(), + str(current_employee.employee_no or "").strip(), + } + else: + identity_values = set() + + identity_values.update( + { + str(current_user.username or "").strip(), + str(current_user.name or "").strip(), + } + ) + identity_values.discard("") + return str(claim.employee_name or "").strip() in identity_values + + @staticmethod + def _is_email_like(value: str) -> bool: + return bool(re.match(r"^[^@\s]+@[^@\s]+\.[^@\s]+$", str(value or "").strip())) + def _resolve_claim_employee_for_backfill(self, claim: ExpenseClaim) -> Employee | None: if claim.employee is not None: employee = self.db.scalar( @@ -4850,8 +5072,14 @@ class ExpenseClaimService: return conditions def _apply_approval_claim_scope(self, stmt: Any, current_user: CurrentUserContext) -> Any: - if self._has_privileged_claim_access(current_user): + role_codes = self._normalize_role_codes(current_user) + if current_user.is_admin or "executive" in role_codes: return stmt.where(ExpenseClaim.status == "submitted") + if "finance" in role_codes: + return stmt.where( + ExpenseClaim.status == "submitted", + ExpenseClaim.approval_stage == "财务审批", + ) conditions = self._build_approval_claim_conditions(current_user) if not conditions: diff --git a/server/src/app/services/expense_rule_runtime.py b/server/src/app/services/expense_rule_runtime.py index a96a249..7bc8609 100644 --- a/server/src/app/services/expense_rule_runtime.py +++ b/server/src/app/services/expense_rule_runtime.py @@ -6,12 +6,17 @@ from dataclasses import dataclass, field from decimal import Decimal from typing import Any, Literal +from openpyxl import load_workbook from pydantic import BaseModel, Field, ValidationError from sqlalchemy import select from sqlalchemy.orm import Session from app.core.agent_enums import AgentAssetDomain, AgentAssetStatus, AgentAssetType from app.models.agent_asset import AgentAsset, AgentAssetVersion +from app.services.agent_asset_spreadsheet import ( + COMPANY_TRAVEL_EXPENSE_RULE_CODE, + AgentAssetSpreadsheetManager, +) EXPENSE_RULE_CODE_BLOCK_PATTERN = re.compile(r"```expense-rule\s*(\{.*?\})\s*```", re.DOTALL) @@ -351,6 +356,11 @@ class TravelPolicyConfig(BaseModel): band_labels: dict[str, str] = Field(default_factory=dict) city_tiers: dict[str, str] = Field(default_factory=dict) hotel_limits: dict[str, dict[str, Decimal]] = Field(default_factory=dict) + hotel_city_limits: dict[str, dict[str, Decimal]] = Field(default_factory=dict) + allowance_limits: dict[str, dict[str, Decimal]] = Field(default_factory=dict) + standard_rule_code: str = "" + standard_rule_name: str = "" + standard_rule_version: str = "" transport_limits: dict[str, dict[str, int]] = Field(default_factory=dict) flight_classes: list[TravelClassConfig] = Field(default_factory=list) train_classes: list[TravelClassConfig] = Field(default_factory=list) @@ -576,17 +586,35 @@ class ExpenseRuleRuntimeService: ).all() ) if not assets: - return catalog + assets = [] + asset_ids = {asset.id for asset in assets} + travel_spreadsheet_asset = self.db.scalar( + select(AgentAsset) + .where(AgentAsset.asset_type == AgentAssetType.RULE.value) + .where(AgentAsset.domain == AgentAssetDomain.EXPENSE.value) + .where(AgentAsset.code == COMPANY_TRAVEL_EXPENSE_RULE_CODE) + .order_by(AgentAsset.updated_at.desc(), AgentAsset.created_at.desc()) + .limit(1) + ) + if travel_spreadsheet_asset is not None and travel_spreadsheet_asset.id not in asset_ids: + assets.append(travel_spreadsheet_asset) + + spreadsheet_assets: list[tuple[AgentAsset, AgentAssetVersion]] = [] for asset in assets: version = self._get_current_version(asset) if version is None: continue + is_travel_spreadsheet_asset = ( + str(asset.code or "").strip() == COMPANY_TRAVEL_EXPENSE_RULE_CODE + and str((asset.config_json or {}).get("detail_mode") or "").strip() == "spreadsheet" + ) runtime_payload = self._extract_runtime_payload( markdown_content=str(version.content or ""), config_json=asset.config_json, ) if not isinstance(runtime_payload, dict): + spreadsheet_assets.append((asset, version)) continue self._apply_runtime_payload( catalog, @@ -594,6 +622,15 @@ class ExpenseRuleRuntimeService: asset=asset, version=version, ) + if is_travel_spreadsheet_asset: + spreadsheet_assets.append((asset, version)) + + for asset, version in spreadsheet_assets: + self._apply_spreadsheet_runtime_payload( + catalog, + asset=asset, + version=version, + ) return catalog @@ -658,3 +695,406 @@ class ExpenseRuleRuntimeService: ) except ValidationError: return + + def _apply_spreadsheet_runtime_payload( + self, + catalog: ExpenseRuleCatalog, + *, + asset: AgentAsset, + version: AgentAssetVersion, + ) -> None: + if str(asset.code or "").strip() != COMPANY_TRAVEL_EXPENSE_RULE_CODE: + return + if str((asset.config_json or {}).get("detail_mode") or "").strip() != "spreadsheet": + return + + manager = AgentAssetSpreadsheetManager() + metadata = manager.parse_version_markdown(str(version.content or "")) + rule_document = (asset.config_json or {}).get("rule_document") + if not isinstance(rule_document, dict): + rule_document = {} + storage_key = str(metadata.storage_key if metadata is not None else "").strip() + if storage_key: + try: + workbook_path = manager.resolve_storage_path(storage_key) + except FileNotFoundError: + workbook_path = None + if workbook_path is not None and not workbook_path.exists(): + workbook_path = None + else: + workbook_path = None + + if workbook_path is None: + fallback_storage_key = str(rule_document.get("storage_key") or "").strip() + if not fallback_storage_key: + return + try: + workbook_path = manager.resolve_storage_path(fallback_storage_key) + except FileNotFoundError: + return + if not workbook_path.exists(): + return + + try: + workbook = load_workbook( + workbook_path, + read_only=True, + data_only=True, + ) + except (FileNotFoundError, OSError): + return + + try: + standards = self._extract_travel_amount_standards_from_workbook(workbook) + hotel_city_limits = self._extract_hotel_city_limits_from_workbook(workbook) + allowance_limits = self._extract_travel_allowance_limits_from_workbook(workbook) + transport_limits = self._extract_transport_class_limits_from_workbook(workbook) + finally: + workbook.close() + + standard_rule_version = str( + rule_document.get("asset_version") or asset.current_version or version.version + ).strip() + if (hotel_city_limits or allowance_limits or transport_limits) and catalog.travel_policy is not None: + payload = catalog.travel_policy.model_dump() + payload["standard_rule_code"] = asset.code + payload["standard_rule_name"] = asset.name + payload["standard_rule_version"] = standard_rule_version + if hotel_city_limits: + payload["hotel_city_limits"] = { + **payload.get("hotel_city_limits", {}), + **hotel_city_limits, + } + if allowance_limits: + payload["allowance_limits"] = { + **payload.get("allowance_limits", {}), + **allowance_limits, + } + if transport_limits: + payload["transport_limits"] = { + **payload.get("transport_limits", {}), + **transport_limits, + } + catalog.travel_policy = RuntimeTravelPolicy(**payload) + + for expense_type, amount in standards.items(): + current = catalog.scene_policies.get(expense_type) + if current is None: + continue + limit_attr = "item_amount_limit" if expense_type == "transport" else "claim_amount_limit" + base_limit = getattr(current, limit_attr, None) + next_limit = self._replace_amount_limit_warn_amount( + base_limit, + amount=amount, + metric_label=self._spreadsheet_metric_label(expense_type), + ) + payload = current.model_dump() + payload["rule_code"] = asset.code + payload["rule_name"] = asset.name + payload["rule_version"] = standard_rule_version + payload[limit_attr] = next_limit.model_dump() + catalog.scene_policies[expense_type] = ExpenseScenePolicy(**payload) + + @staticmethod + def _extract_travel_amount_standards_from_workbook(workbook: Any) -> dict[str, Decimal]: + standards: dict[str, Decimal] = {} + for sheet in workbook.worksheets: + rows = list(sheet.iter_rows(values_only=True)) + if not rows: + continue + header_index = -1 + category_index = -1 + standard_index = -1 + for index, row in enumerate(rows[:8]): + values = [str(value or "").strip() for value in row] + if "费用分类" in values and "报销标准" in values: + header_index = index + category_index = values.index("费用分类") + standard_index = values.index("报销标准") + break + if header_index < 0: + continue + + for row in rows[header_index + 1 :]: + category = str(row[category_index] or "").strip() if len(row) > category_index else "" + standard_text = str(row[standard_index] or "").strip() if len(row) > standard_index else "" + amount = ExpenseRuleRuntimeService._extract_first_standard_amount(standard_text) + if not category or amount is None: + continue + normalized_type = ExpenseRuleRuntimeService._map_spreadsheet_category_to_expense_type(category) + if normalized_type: + standards[normalized_type] = amount + return standards + + @staticmethod + def _extract_hotel_city_limits_from_workbook(workbook: Any) -> dict[str, dict[str, Decimal]]: + city_limits: dict[str, dict[str, Decimal]] = {} + for sheet in workbook.worksheets: + rows = list(sheet.iter_rows(values_only=True)) + if not rows: + continue + + header_index = -1 + city_index = -1 + band_indexes: dict[str, int] = {} + for index, row in enumerate(rows[:10]): + values = [str(value or "").strip() for value in row] + for candidate in ("地区(城市)", "城市", "地区"): + if candidate in values: + city_index = values.index(candidate) + break + if city_index < 0: + continue + for column_index, header in enumerate(values): + compact = re.sub(r"\s+", "", header) + if any(keyword in compact for keyword in ("P1-P3", "其他员工")): + band_indexes["junior"] = column_index + if any(keyword in compact for keyword in ("P4-P6", "基层经理", "中层经理")): + band_indexes["mid"] = column_index + band_indexes["senior"] = column_index + if any(keyword in compact for keyword in ("P7", "高层经理", "公司级管理")): + band_indexes["manager"] = column_index + band_indexes["executive"] = column_index + if band_indexes: + header_index = index + break + + if header_index < 0: + continue + + for row in rows[header_index + 1 :]: + raw_city = str(row[city_index] or "").strip() if len(row) > city_index else "" + cities = ExpenseRuleRuntimeService._extract_city_names_from_cell(raw_city) + if not cities: + continue + for city in cities: + city_entry = city_limits.setdefault(city, {}) + for band, column_index in band_indexes.items(): + amount = ExpenseRuleRuntimeService._coerce_decimal_cell( + row[column_index] if len(row) > column_index else None + ) + if amount is not None: + city_entry[band] = amount + return city_limits + + @staticmethod + def _extract_travel_allowance_limits_from_workbook(workbook: Any) -> dict[str, dict[str, Decimal]]: + allowance_limits: dict[str, dict[str, Decimal]] = {} + for sheet in workbook.worksheets: + rows = list(sheet.iter_rows(values_only=True)) + if not rows: + continue + + header_index = -1 + type_index = -1 + region_indexes: dict[str, int] = {} + for index, row in enumerate(rows[:10]): + values = [str(value or "").strip() for value in row] + if "补助类型" not in values: + continue + header_index = index + type_index = values.index("补助类型") + for column_index, header in enumerate(values): + if column_index <= type_index: + continue + normalized = str(header or "").strip() + if not normalized or normalized == "项目": + continue + region_indexes[normalized] = column_index + break + + if header_index < 0 or type_index < 0 or not region_indexes: + continue + + for row in rows[header_index + 1 :]: + raw_type = str(row[type_index] or "").strip() if len(row) > type_index else "" + allowance_key = ExpenseRuleRuntimeService._map_allowance_type_to_key(raw_type) + if not allowance_key: + continue + + entry: dict[str, Decimal] = {} + for region_label, column_index in region_indexes.items(): + amount = ExpenseRuleRuntimeService._coerce_decimal_cell( + row[column_index] if len(row) > column_index else None + ) + if amount is not None: + entry[region_label] = amount + if entry: + allowance_limits[allowance_key] = entry + return allowance_limits + + @staticmethod + def _map_allowance_type_to_key(value: str) -> str: + normalized = re.sub(r"\s+", "", str(value or "")) + if "伙食" in normalized or "餐" in normalized: + return "meal" + if "基本" in normalized: + return "basic" + if "合计" in normalized or "总计" in normalized: + return "total" + return "" + + @staticmethod + def _extract_transport_class_limits_from_workbook(workbook: Any) -> dict[str, dict[str, int]]: + limits: dict[str, dict[str, int]] = {} + for sheet in workbook.worksheets: + rows = list(sheet.iter_rows(values_only=True)) + if not rows: + continue + + employee_index = -1 + flight_index = -1 + train_index = -1 + for row_index, row in enumerate(rows[:10]): + values = [str(value or "").strip() for value in row] + if "员工职级" in values: + employee_index = values.index("员工职级") + for next_row in rows[row_index + 1 : row_index + 4]: + next_values = [str(value or "").strip() for value in next_row] + if "飞机" in next_values: + flight_index = next_values.index("飞机") + if "火车" in next_values: + train_index = next_values.index("火车") + if flight_index >= 0 and train_index >= 0: + break + break + + if employee_index < 0 or (flight_index < 0 and train_index < 0): + continue + + for row in rows: + employee_text = str(row[employee_index] or "").strip() if len(row) > employee_index else "" + bands = ExpenseRuleRuntimeService._map_transport_grade_row_to_bands(employee_text) + if not bands: + continue + flight_level = ( + ExpenseRuleRuntimeService._transport_class_level_for_text( + row[flight_index] if len(row) > flight_index else None, + kind="flight", + ) + if flight_index >= 0 + else None + ) + train_level = ( + ExpenseRuleRuntimeService._transport_class_level_for_text( + row[train_index] if len(row) > train_index else None, + kind="train", + ) + if train_index >= 0 + else None + ) + for band in bands: + entry = limits.setdefault(band, {}) + if flight_level is not None: + entry["flight"] = flight_level + if train_level is not None: + entry["train"] = train_level + return limits + + @staticmethod + def _map_transport_grade_row_to_bands(value: str) -> list[str]: + normalized = re.sub(r"\s+", "", str(value or "").upper()) + if not normalized or normalized.startswith("注"): + return [] + bands: list[str] = [] + if any(keyword in normalized for keyword in ("P1", "P2", "P3", "P4", "其他员工", "基层经理", "P4及以下")): + bands.extend(["junior", "mid"]) + if any(keyword in normalized for keyword in ("P5", "P6", "P7", "P5及以上", "中层经理", "高层经理", "公司级")): + bands.extend(["mid", "senior", "manager", "executive"]) + return list(dict.fromkeys(bands)) + + @staticmethod + def _transport_class_level_for_text(value: Any, *, kind: str) -> int | None: + normalized = re.sub(r"\s+", "", str(value or "")) + if not normalized: + return None + if kind == "flight": + if any(keyword in normalized for keyword in ("头等舱",)): + return 4 + if any(keyword in normalized for keyword in ("公务舱", "商务舱")): + return 3 + if any(keyword in normalized for keyword in ("超级经济舱", "高端经济舱", "明珠经济舱")): + return 2 + if "经济舱" in normalized: + return 1 + if kind == "train": + if "商务座" in normalized: + return 3 + if any(keyword in normalized for keyword in ("一等座", "软卧")): + return 2 + if any(keyword in normalized for keyword in ("二等座", "二等软座", "硬卧", "硬座", "硬席")): + return 1 + return None + + @staticmethod + def _extract_city_names_from_cell(value: str) -> list[str]: + normalized = re.sub(r"[;;,,、/]+", "、", str(value or "").strip()) + if not normalized: + return [] + names: list[str] = [] + for part in normalized.split("、"): + cleaned = re.sub(r"\s+", "", part) + cleaned = re.sub(r"[((].*?[))]", "", cleaned) + if not cleaned or any(keyword in cleaned for keyword in ("不含", "中心城区", "新区")): + continue + if len(cleaned) <= 12: + names.append(cleaned) + return list(dict.fromkeys(names)) + + @staticmethod + def _coerce_decimal_cell(value: Any) -> Decimal | None: + if value is None: + return None + try: + return Decimal(str(value).strip()).quantize(Decimal("0.01")) + except (ArithmeticError, ValueError): + return None + + @staticmethod + def _extract_first_standard_amount(text: str) -> Decimal | None: + match = re.search(r"([0-9]+(?:\.[0-9]{1,2})?)\s*/\s*(?:天|人|晚|次|笔)", str(text or "")) + if match is None: + match = re.search(r"([0-9]+(?:\.[0-9]{1,2})?)", str(text or "")) + if match is None: + return None + try: + return Decimal(match.group(1)).quantize(Decimal("0.01")) + except (ArithmeticError, ValueError): + return None + + @staticmethod + def _map_spreadsheet_category_to_expense_type(category: str) -> str: + normalized = re.sub(r"\s+", "", str(category or "")) + if any(keyword in normalized for keyword in ("市内交通", "打车", "网约车", "出租车")): + return "transport" + if "招待" in normalized and "餐" in normalized: + return "entertainment" + if "餐补" in normalized or normalized == "餐费": + return "meal" + return "" + + @staticmethod + def _spreadsheet_metric_label(expense_type: str) -> str: + return { + "transport": "单笔交通金额", + "meal": "差旅餐补金额", + "entertainment": "人均招待餐费", + }.get(expense_type, "金额") + + @staticmethod + def _replace_amount_limit_warn_amount( + base_limit: AmountLimitConfig | None, + *, + amount: Decimal, + metric_label: str, + ) -> AmountLimitConfig: + if base_limit is None: + return AmountLimitConfig( + warn_amount=amount, + block_amount=None, + metric_label=metric_label, + ) + payload = base_limit.model_dump() + payload["warn_amount"] = amount + payload["metric_label"] = metric_label + return AmountLimitConfig(**payload) diff --git a/server/src/app/services/ocr.py b/server/src/app/services/ocr.py index c2e38cf..e975c72 100644 --- a/server/src/app/services/ocr.py +++ b/server/src/app/services/ocr.py @@ -2,6 +2,7 @@ from __future__ import annotations import base64 import json +import re import shutil import subprocess from dataclasses import dataclass, field @@ -27,6 +28,7 @@ class PreparedOcrInput: page_index: int | None = None preview_kind: str = "" preview_data_url: str = "" + text_layer: str = "" @dataclass(slots=True) @@ -38,6 +40,7 @@ class AggregatedOcrDocument: model: str = "PP-OCRv5_mobile" summary_fragments: list[str] = field(default_factory=list) text_fragments: list[str] = field(default_factory=list) + text_layer_fragments: list[str] = field(default_factory=list) score_values: list[float] = field(default_factory=list) warnings: list[str] = field(default_factory=list) lines: list[OcrRecognizeLineRead] = field(default_factory=list) @@ -112,12 +115,14 @@ class OcrService: if suffix == ".pdf": try: + text_layer = self._extract_pdf_text_layer(temp_path) prepared_inputs.extend( self._prepare_pdf_inputs( pdf_path=temp_path, filename=normalized_name, media_type=resolved_media_type, cleanup_paths=cleanup_paths, + text_layer=text_layer, ) ) except RuntimeError as exc: @@ -261,6 +266,7 @@ class OcrService: filename: str, media_type: str, cleanup_paths: list[Path], + text_layer: str = "", ) -> list[PreparedOcrInput]: output_dir = pdf_path.with_suffix("") output_dir.mkdir(parents=True, exist_ok=True) @@ -283,10 +289,33 @@ class OcrService: page_index=page_index, preview_kind="image" if page_index == 0 else "", preview_data_url=preview_data_url if page_index == 0 else "", + text_layer=text_layer if page_index == 0 else "", ) ) return descriptors + def _extract_pdf_text_layer(self, pdf_path: Path) -> str: + try: + completed = subprocess.run( + [ + "pdftotext", + "-layout", + str(pdf_path), + "-", + ], + capture_output=True, + text=True, + timeout=self.settings.ocr_timeout_seconds, + check=False, + ) + except (OSError, subprocess.SubprocessError, UnicodeError): + return "" + + if completed.returncode != 0: + return "" + + return self._normalize_extracted_text(completed.stdout) + def _convert_pdf_to_images(self, *, pdf_path: Path, output_dir: Path) -> list[Path]: prefix = output_dir / "page" completed = subprocess.run( @@ -367,6 +396,8 @@ class OcrService: aggregated.preview_kind = descriptor.preview_kind if descriptor.preview_data_url and not aggregated.preview_data_url: aggregated.preview_data_url = descriptor.preview_data_url + if descriptor.text_layer and descriptor.text_layer not in aggregated.text_layer_fragments: + aggregated.text_layer_fragments.append(descriptor.text_layer) page_summary = str(payload.get("summary", "") or "").strip() if page_summary: @@ -401,6 +432,20 @@ class OcrService: aggregated = aggregated_by_source.get(source_key) if aggregated is None: first_descriptor = descriptors[0] + text_layer = self._collect_descriptor_text_layer(descriptors) + if text_layer: + fallback = AggregatedOcrDocument( + filename=first_descriptor.filename, + media_type=first_descriptor.media_type, + source_key=first_descriptor.source_key, + page_count=max(1, len(descriptors)), + preview_kind=first_descriptor.preview_kind, + preview_data_url=first_descriptor.preview_data_url, + warnings=["OCR worker 未返回该文件的识别结果,已使用 PDF 文本层。"], + ) + fallback.text_layer_fragments.append(text_layer) + documents.append(self._finalize_document(fallback)) + continue documents.append( OcrRecognizeDocumentRead( filename=first_descriptor.filename, @@ -416,6 +461,13 @@ class OcrService: return documents + @staticmethod + def _collect_descriptor_text_layer(descriptors: list[PreparedOcrInput]) -> str: + for descriptor in descriptors: + if descriptor.text_layer: + return descriptor.text_layer + return "" + @staticmethod def _build_lines( items: list[dict], @@ -451,13 +503,26 @@ class OcrService: return summary def _finalize_document(self, aggregated: AggregatedOcrDocument) -> OcrRecognizeDocumentRead: - full_text = "\n".join(fragment for fragment in aggregated.text_fragments if fragment).strip() + ocr_text = "\n".join(fragment for fragment in aggregated.text_fragments if fragment).strip() + text_layer = "\n".join(fragment for fragment in aggregated.text_layer_fragments if fragment).strip() + full_text, used_text_layer = self._choose_document_text(ocr_text=ocr_text, text_layer=text_layer) summary = self._truncate_summary(aggregated.summary_fragments or aggregated.text_fragments) + if used_text_layer or self._placeholder_ratio(summary) >= 0.12: + summary = self._summarize_text(full_text) + preview_kind = aggregated.preview_kind + preview_data_url = aggregated.preview_data_url + if ( + used_text_layer + and aggregated.media_type == "application/pdf" + and self._placeholder_ratio(ocr_text) >= 0.12 + ): + preview_kind = "" + preview_data_url = "" insight = self.document_intelligence_service.build_document_insight( filename=aggregated.filename, summary=summary, text=full_text, - preview_data_url=aggregated.preview_data_url, + preview_data_url=preview_data_url, ) warnings = list(aggregated.warnings) for warning in insight.warnings: @@ -493,8 +558,8 @@ class OcrService: ) for field in insight.fields ], - preview_kind=aggregated.preview_kind, - preview_data_url=aggregated.preview_data_url, + preview_kind=preview_kind, + preview_data_url=preview_data_url, warnings=warnings, lines=sorted( aggregated.lines, @@ -502,6 +567,45 @@ class OcrService: ), ) + @classmethod + def _choose_document_text(cls, *, ocr_text: str, text_layer: str) -> tuple[str, bool]: + normalized_ocr_text = cls._normalize_extracted_text(ocr_text) + normalized_text_layer = cls._normalize_extracted_text(text_layer) + if not normalized_text_layer: + return normalized_ocr_text, False + if not normalized_ocr_text: + return normalized_text_layer, True + if cls._placeholder_ratio(normalized_ocr_text) >= 0.12 and cls._meaningful_char_count(normalized_text_layer) >= 8: + return normalized_text_layer, True + if cls._meaningful_char_count(normalized_text_layer) > cls._meaningful_char_count(normalized_ocr_text) * 1.3: + return normalized_text_layer, True + return normalized_ocr_text, False + + @staticmethod + def _normalize_extracted_text(value: str) -> str: + lines = [re.sub(r"[ \t]+", " ", line).strip() for line in str(value or "").replace("\r", "\n").split("\n")] + return "\n".join(line for line in lines if line).strip() + + @staticmethod + def _summarize_text(value: str) -> str: + lines = [line.strip() for line in str(value or "").splitlines() if line.strip()] + summary = ";".join(lines[:3]) + if len(summary) > 180: + return f"{summary[:177]}..." + return summary + + @staticmethod + def _meaningful_char_count(value: str) -> int: + return len(re.findall(r"[0-9A-Za-z\u4e00-\u9fff]", str(value or ""))) + + @staticmethod + def _placeholder_ratio(value: str) -> float: + chars = [char for char in str(value or "") if not char.isspace()] + if not chars: + return 0.0 + placeholder_count = sum(1 for char in chars if char in {"□", "�"}) + return placeholder_count / len(chars) + @staticmethod def _cleanup_temp_paths(paths: list[Path]) -> None: for path in reversed(paths): diff --git a/server/src/app/services/travel_reimbursement_calculator.py b/server/src/app/services/travel_reimbursement_calculator.py new file mode 100644 index 0000000..951f350 --- /dev/null +++ b/server/src/app/services/travel_reimbursement_calculator.py @@ -0,0 +1,593 @@ +from __future__ import annotations + +import re +from decimal import Decimal + +from sqlalchemy import func, or_, select +from sqlalchemy.orm import Session + +from app.api.deps import CurrentUserContext +from app.core.agent_enums import AgentAssetType +from app.models.employee import Employee +from app.schemas.reimbursement import ( + TravelReimbursementCalculatorRequest, + TravelReimbursementCalculatorResponse, +) +from app.services.agent_assets import AgentAssetService +from app.services.expense_claims import ExpenseClaimService +from app.services.expense_rule_runtime import RuntimeTravelPolicy, ExpenseRuleRuntimeService + +OTHER_REGION_LOCATION_KEYWORDS = { + "河北", + "石家庄", + "唐山", + "秦皇岛", + "邯郸", + "邢台", + "保定", + "张家口", + "承德", + "沧州", + "廊坊", + "衡水", + "山西", + "太原", + "大同", + "长治", + "晋城", + "晋中", + "运城", + "临汾", + "吕梁", + "内蒙古", + "呼和浩特", + "包头", + "赤峰", + "通辽", + "鄂尔多斯", + "辽宁", + "鞍山", + "抚顺", + "本溪", + "丹东", + "锦州", + "营口", + "盘锦", + "吉林", + "长春", + "吉林市", + "四平", + "通化", + "白山", + "松原", + "延边", + "黑龙江", + "哈尔滨", + "齐齐哈尔", + "牡丹江", + "佳木斯", + "大庆", + "江苏", + "常州", + "南通", + "连云港", + "淮安", + "盐城", + "扬州", + "镇江", + "泰州", + "宿迁", + "浙江", + "温州", + "嘉兴", + "湖州", + "绍兴", + "金华", + "衢州", + "舟山", + "台州", + "丽水", + "安徽", + "芜湖", + "蚌埠", + "淮南", + "马鞍山", + "淮北", + "铜陵", + "安庆", + "黄山", + "滁州", + "阜阳", + "宿州", + "六安", + "亳州", + "池州", + "宣城", + "福建", + "泉州", + "漳州", + "莆田", + "三明", + "南平", + "龙岩", + "宁德", + "江西", + "南昌", + "景德镇", + "萍乡", + "九江", + "新余", + "鹰潭", + "赣州", + "吉安", + "宜春", + "抚州", + "上饶", + "山东", + "淄博", + "枣庄", + "东营", + "烟台", + "潍坊", + "济宁", + "泰安", + "威海", + "日照", + "临沂", + "德州", + "聊城", + "滨州", + "菏泽", + "河南", + "洛阳", + "开封", + "平顶山", + "安阳", + "鹤壁", + "新乡", + "焦作", + "濮阳", + "许昌", + "漯河", + "三门峡", + "南阳", + "商丘", + "信阳", + "周口", + "驻马店", + "湖北", + "黄石", + "十堰", + "宜昌", + "襄阳", + "鄂州", + "荆门", + "孝感", + "荆州", + "黄冈", + "咸宁", + "随州", + "恩施", + "湖南", + "株洲", + "湘潭", + "衡阳", + "邵阳", + "岳阳", + "常德", + "张家界", + "益阳", + "郴州", + "永州", + "怀化", + "娄底", + "湘西", + "广东", + "惠州", + "江门", + "湛江", + "茂名", + "肇庆", + "梅州", + "汕尾", + "河源", + "阳江", + "清远", + "潮州", + "揭阳", + "云浮", + "广西", + "南宁", + "柳州", + "桂林", + "梧州", + "北海", + "防城港", + "钦州", + "贵港", + "玉林", + "百色", + "贺州", + "河池", + "来宾", + "崇左", + "海南", + "儋州", + "四川", + "自贡", + "攀枝花", + "泸州", + "德阳", + "绵阳", + "广元", + "遂宁", + "内江", + "乐山", + "南充", + "眉山", + "宜宾", + "广安", + "达州", + "雅安", + "巴中", + "资阳", + "阿坝", + "甘孜", + "凉山", + "贵州", + "贵阳", + "遵义", + "六盘水", + "安顺", + "毕节", + "铜仁", + "黔东南", + "黔南", + "黔西南", + "云南", + "曲靖", + "玉溪", + "保山", + "昭通", + "丽江", + "普洱", + "临沧", + "楚雄", + "红河", + "文山", + "西双版纳", + "大理", + "德宏", + "怒江", + "迪庆", + "陕西", + "宝鸡", + "咸阳", + "铜川", + "渭南", + "延安", + "汉中", + "榆林", + "安康", + "商洛", + "甘肃", + "兰州", + "嘉峪关", + "金昌", + "白银", + "天水", + "武威", + "张掖", + "平凉", + "酒泉", + "庆阳", + "定西", + "陇南", + "临夏", + "甘南", + "青海", + "西宁", + "海东", + "海北", + "黄南", + "海南州", + "果洛", + "玉树", + "海西", + "宁夏", + "银川", + "石嘴山", + "吴忠", + "固原", + "中卫", +} + +OTHER_REGION_PROVINCE_KEYWORDS = { + "河北", + "山西", + "内蒙古", + "辽宁", + "吉林", + "黑龙江", + "江苏", + "浙江", + "安徽", + "福建", + "江西", + "山东", + "河南", + "湖北", + "湖南", + "广东", + "广西", + "海南", + "四川", + "贵州", + "云南", + "陕西", + "甘肃", + "青海", + "宁夏", + "新疆", + "西藏", + "台湾", + "香港", + "澳门", +} + +AMBIGUOUS_PROVINCE_CITY_NAMES = {"吉林"} + + +class TravelReimbursementCalculatorService: + def __init__(self, db: Session) -> None: + self.db = db + + def calculate( + self, + payload: TravelReimbursementCalculatorRequest, + current_user: CurrentUserContext, + ) -> TravelReimbursementCalculatorResponse: + days = max(1, int(payload.days)) + location = str(payload.location or "").strip() + if not location: + raise ValueError("请先填写出差地点。") + + policy = self._load_travel_policy() + grade = self._resolve_grade(payload.grade, current_user) + if not grade: + raise ValueError("未识别到当前员工职级,请在个人信息中维护职级后再计算。") + + grade_band = ExpenseClaimService._resolve_travel_policy_band(grade) + if not grade_band: + raise ValueError(f"当前职级 {grade} 暂未匹配到差旅报销档位。") + + matched_city = self._resolve_city(location, policy) + matched_other_region = "" if matched_city else self._resolve_other_region(location) + if not matched_city and not matched_other_region: + raise ValueError(f"出差地点“{location}”未识别为有效出差地区,请按真实省市或规则表地点重新填写。") + city_tier = policy.city_tiers.get(matched_city, "tier_3") if matched_city else "tier_3" + hotel_rate = self._resolve_hotel_rate(policy, grade_band, matched_city, city_tier) + allowance_region = self._resolve_allowance_region(location, matched_city or matched_other_region) + meal_rate = self._resolve_allowance_rate(policy, "meal", allowance_region) + basic_rate = self._resolve_allowance_rate(policy, "basic", allowance_region) + total_allowance_rate = self._resolve_total_allowance_rate(policy, allowance_region, meal_rate, basic_rate) + + hotel_amount = hotel_rate * Decimal(days) + allowance_amount = total_allowance_rate * Decimal(days) + total_amount = hotel_amount + allowance_amount + band_label = policy.band_labels.get(grade_band, grade_band) + rule_name = policy.standard_rule_name or policy.rule_name or "公司差旅费报销规则" + rule_version = policy.standard_rule_version or policy.rule_version or "" + display_city = matched_city or self._format_other_region_display(matched_other_region) + formula_text = ( + f"住宿 {self._format_money(hotel_rate)} × {days} 天 + " + f"补贴 {self._format_money(total_allowance_rate)} × {days} 天 = " + f"{self._format_money(total_amount)}" + ) + summary_text = ( + f"按《{rule_name}》{f'({rule_version})' if rule_version else ''}测算:" + f"当前职级 {grade} 对应 {band_label} 档,出差地点“{location}”匹配为“{display_city}”," + f"住宿标准 {self._format_money(hotel_rate)} 元/天,补贴区域为“{allowance_region}”," + f"补贴标准 {self._format_money(total_allowance_rate)} 元/天" + f"(伙食 {self._format_money(meal_rate)} + 基本 {self._format_money(basic_rate)})。" + f"按 {days} 天计算,住宿合计 {self._format_money(hotel_amount)} 元," + f"补贴合计 {self._format_money(allowance_amount)} 元," + f"参考可报销总金额为 {self._format_money(total_amount)} 元。" + ) + + return TravelReimbursementCalculatorResponse( + days=days, + location=location, + matched_city=display_city, + city_tier=city_tier, + grade=grade, + grade_band=grade_band, + grade_band_label=band_label, + hotel_rate=hotel_rate, + hotel_amount=hotel_amount, + allowance_region=allowance_region, + meal_allowance_rate=meal_rate, + basic_allowance_rate=basic_rate, + total_allowance_rate=total_allowance_rate, + allowance_amount=allowance_amount, + total_amount=total_amount, + rule_name=rule_name, + rule_version=rule_version, + formula_text=formula_text, + summary_text=summary_text, + ) + + def _load_travel_policy(self) -> RuntimeTravelPolicy: + AgentAssetService(self.db).list_assets(asset_type=AgentAssetType.RULE.value) + policy = ExpenseRuleRuntimeService(self.db).load_catalog().travel_policy + if policy is None: + raise ValueError("规则中心暂未配置差旅报销规则。") + return policy + + def _resolve_grade( + self, + grade: str | None, + current_user: CurrentUserContext, + ) -> str: + normalized_grade = str(grade or "").strip() + if normalized_grade: + return normalized_grade + + employee = self._resolve_current_employee(current_user) + if employee is not None and str(employee.grade or "").strip(): + return str(employee.grade).strip() + return "" + + @staticmethod + def _resolve_other_region(location: str) -> str: + normalized = re.sub(r"\s+", "", str(location or "").strip()) + if not normalized: + return "" + if any(keyword in normalized for keyword in ("国外", "境外", "海外")): + return "国外" + for keyword in ("香港", "澳门", "台湾", "港澳台", "西藏", "拉萨", "新疆", "乌鲁木齐"): + if keyword in normalized: + return keyword + city_matches = [] + province_matches = [] + for keyword in OTHER_REGION_LOCATION_KEYWORDS: + if not keyword or keyword not in normalized: + continue + if keyword in OTHER_REGION_PROVINCE_KEYWORDS: + province_matches.append(keyword) + else: + city_matches.append(keyword) + candidates = city_matches or province_matches + if candidates: + return sorted(candidates, key=len, reverse=True)[0] + return "" + + @staticmethod + def _format_other_region_display(region: str) -> str: + normalized = str(region or "").strip() + if not normalized: + return "" + if normalized in {"国外", "香港", "澳门", "台湾", "港澳台", "西藏", "拉萨", "新疆", "乌鲁木齐"}: + return normalized + return f"{normalized}(其他地区)" + + def _resolve_current_employee(self, current_user: CurrentUserContext) -> Employee | None: + candidates = [ + str(current_user.username or "").strip(), + str(current_user.name or "").strip(), + ] + normalized_candidates = [ + item + for item in dict.fromkeys(candidate for candidate in candidates if candidate) + if item + ] + if not normalized_candidates: + return None + + for candidate in normalized_candidates: + employee = self.db.scalar( + select(Employee) + .where( + or_( + func.lower(Employee.email) == candidate.lower(), + func.lower(Employee.employee_no) == candidate.lower(), + ) + ) + .limit(1) + ) + if employee is not None: + return employee + + for candidate in normalized_candidates: + matches = list( + self.db.scalars( + select(Employee) + .where(Employee.name == candidate) + .limit(2) + ).all() + ) + if len(matches) == 1: + return matches[0] + return None + + @staticmethod + def _resolve_city(location: str, policy: RuntimeTravelPolicy) -> str: + normalized = str(location or "").strip() + if not normalized: + return "" + city_names = set(policy.city_tiers.keys()) + city_names.update(policy.hotel_city_limits.keys()) + for city in sorted(city_names, key=lambda item: len(item), reverse=True): + if city in AMBIGUOUS_PROVINCE_CITY_NAMES and normalized != city and f"{city}市" not in normalized: + continue + if city and city in normalized: + return city + compact = re.sub(r"(省|市|区|县|自治州|特别行政区)$", "", normalized) + for city in sorted(city_names, key=lambda item: len(item), reverse=True): + if city in AMBIGUOUS_PROVINCE_CITY_NAMES and compact != city and f"{city}市" not in normalized: + continue + if city and city in compact: + return city + return "" + + @staticmethod + def _resolve_hotel_rate( + policy: RuntimeTravelPolicy, + grade_band: str, + matched_city: str, + city_tier: str, + ) -> Decimal: + city_limits = policy.hotel_city_limits.get(matched_city, {}) if matched_city else {} + if city_limits.get(grade_band) is not None: + return Decimal(city_limits[grade_band]) + + band_limits = policy.hotel_limits.get(grade_band, {}) + if band_limits.get(city_tier) is not None: + return Decimal(band_limits[city_tier]) + if band_limits.get("tier_3") is not None: + return Decimal(band_limits["tier_3"]) + return Decimal("0") + + @staticmethod + def _resolve_allowance_region(location: str, matched_city: str) -> str: + text = f"{location} {matched_city}".strip() + if any(keyword in text for keyword in ("国外", "境外", "海外")): + return "国外" + if any(keyword in text for keyword in ("香港", "澳门", "台湾", "港澳台")): + return "港澳台" + if "乌鲁木齐" in text: + return "新疆-乌鲁木齐" + if "新疆" in text: + return "新疆-其他" + if "西藏" in text or "拉萨" in text: + return "西藏" + if any(keyword in text for keyword in ("北京", "上海", "天津", "重庆", "深圳", "珠海", "汕头", "厦门")): + return "直辖市/特区" + return "其他地区" + + @staticmethod + def _resolve_allowance_rate(policy: RuntimeTravelPolicy, allowance_key: str, region: str) -> Decimal: + limits = policy.allowance_limits.get(allowance_key, {}) + if limits.get(region) is not None: + return Decimal(limits[region]) + if limits.get("其他地区") is not None: + return Decimal(limits["其他地区"]) + return Decimal("0") + + def _resolve_total_allowance_rate( + self, + policy: RuntimeTravelPolicy, + region: str, + meal_rate: Decimal, + basic_rate: Decimal, + ) -> Decimal: + total_limits = policy.allowance_limits.get("total", {}) + if total_limits.get(region) is not None: + return Decimal(total_limits[region]) + if total_limits.get("其他地区") is not None: + return Decimal(total_limits["其他地区"]) + return meal_rate + basic_rate + + @staticmethod + def _format_money(value: Decimal | int | float | str) -> str: + return f"{Decimal(str(value)).quantize(Decimal('0.01'))}" diff --git a/server/src/app/services/user_agent.py b/server/src/app/services/user_agent.py index c110368..ff7fe8a 100644 --- a/server/src/app/services/user_agent.py +++ b/server/src/app/services/user_agent.py @@ -34,6 +34,7 @@ from app.schemas.user_agent import ( from app.services.agent_assets import AgentAssetService from app.services.agent_foundation import AgentFoundationService from app.services.expense_claims import ExpenseClaimService +from app.services.expense_rule_runtime import ExpenseRuleRuntimeService, RuntimeTravelPolicy, resolve_document_type_label from app.services.risk_ontology_bridge import resolve_rule_codes_for_risk_check from app.services.runtime_chat import RuntimeChatService @@ -185,6 +186,7 @@ DOCUMENT_AMOUNT_PATTERN = re.compile( r"[::\s¥¥人民币]*([0-9]+(?:[.,][0-9]{1,2})?)" ) DOCUMENT_CURRENCY_AMOUNT_PATTERN = re.compile(r"[¥¥]\s*([0-9]+(?:[.,][0-9]{1,2})?)") +TRAVEL_REVIEW_HOTEL_NIGHT_PATTERN = re.compile(r"(\d+)\s*(?:晚|间夜)") SOURCE_LABELS = { "user_text": "用户描述", @@ -197,6 +199,8 @@ SOURCE_LABELS = { "system": "系统判断", } +DEPRECATED_REVIEW_RISK_TITLE_KEYWORDS = ("历史报销画像", "用户画像", "制度注意事项", "制度注意") + SCENE_REQUIRED_SLOT_KEYS = { "hotel": {"merchant_name"}, "meeting": {"location"}, @@ -2193,8 +2197,8 @@ class UserAgentService: for reason in self._resolve_submission_blocked_reasons(payload): briefs.append( UserAgentReviewRiskBrief( - title="AI预审未通过", - level="high", + title="提交风险提示", + level=self._resolve_submission_blocked_risk_level(reason), content=reason, detail=( "该项属于提交审批前的阻断条件。系统会先要求补齐基础字段、附件或业务说明," @@ -2204,6 +2208,14 @@ class UserAgentService: ) ) + briefs.extend( + self._build_travel_policy_precheck_briefs( + payload, + document_cards=document_cards, + claim_groups=claim_groups, + ) + ) + employee = self._resolve_employee_profile(payload) employee_name = ( str(employee.name).strip() @@ -2211,7 +2223,10 @@ class UserAgentService: else self._collect_entity_values(payload).get("employee_name") or str(payload.context_json.get("name") or "").strip() ) - if employee_name: + current_amount = self._resolve_amount_value(payload) or sum( + self._extract_amount_from_card(card) for card in document_cards + ) + if employee_name and current_amount > 0: since = datetime.now(UTC) - timedelta(days=90) claim_identity_conditions = [ExpenseClaim.employee_name == employee_name] if employee is not None: @@ -2228,57 +2243,27 @@ class UserAgentService: stmt = select(ExpenseClaim).where(or_(*claim_identity_conditions), ExpenseClaim.occurred_at >= since) recent_claims = list(self.db.scalars(stmt).all()) if recent_claims: - risky_count = sum(1 for item in recent_claims if item.risk_flags_json) - draft_count = sum(1 for item in recent_claims if item.status == "draft") - briefs.append( - UserAgentReviewRiskBrief( - title="历史报销画像", - level="info", - content=( - f"{employee_name} 最近 90 天共有 {len(recent_claims)} 笔报销," - f"其中 {risky_count} 笔带风险标记,{draft_count} 笔仍处于草稿态。" - ), - detail=( - "该画像来自员工近 90 天报销记录,用于辅助判断是否存在频繁草稿、" - "历史风险或异常重复报销倾向,不会单独阻断审批。" - ), - suggestion="如历史记录中存在风险标记,本次提交时建议主动补充业务背景和票据说明。", - ) + duplicate_count = sum( + 1 + for item in recent_claims + if abs(float(item.amount) - current_amount) < 0.01 ) - current_amount = self._resolve_amount_value(payload) - if current_amount > 0: - duplicate_count = sum( - 1 - for item in recent_claims - if abs(float(item.amount) - current_amount) < 0.01 - ) - if duplicate_count: - briefs.append( - UserAgentReviewRiskBrief( - title="金额重复预警", - level="warning", - content=( - f"近 90 天发现 {duplicate_count} 笔金额相同的报销记录," - "提交前建议核对是否为重复报销或拆分不当。" - ), - detail=( - "系统将当前金额与近 90 天历史报销金额进行比对。金额完全一致不一定违规," - "但在交通、餐饮、办公采购等场景中可能提示重复票据或拆分报销。" - ), - suggestion="核对历史单据与当前票据是否对应同一业务;如不是重复,请在事由中说明差异。", - ) + if duplicate_count: + briefs.append( + UserAgentReviewRiskBrief( + title="金额重复预警", + level="warning", + content=( + f"近 90 天发现 {duplicate_count} 笔金额相同的报销记录," + "提交前建议核对是否为重复报销或拆分不当。" + ), + detail=( + "系统将当前金额与近 90 天历史报销金额进行比对。金额完全一致不一定违规," + "但在交通、餐饮、办公采购等场景中可能提示重复票据或拆分报销。" + ), + suggestion="核对历史单据与当前票据是否对应同一业务;如不是重复,请在事由中说明差异。", ) - - if citations: - briefs.append( - UserAgentReviewRiskBrief( - title="制度注意事项", - level="info", - content=citations[0].excerpt or f"请先核对 {citations[0].title} 的制度要求。", - detail=f"本条来自规则或知识库引用:{citations[0].title}。提交前应确认当前单据符合该条口径。", - suggestion="如当前场景与制度口径存在差异,请补充审批说明或选择更准确的报销分类。", - ) - ) + ) warning_count = sum(len(item.warnings) for item in document_cards) if warning_count: @@ -2296,14 +2281,635 @@ class UserAgentService: briefs.append( UserAgentReviewRiskBrief( title="建议拆单", - level="high", + level="warning", content=f"系统检测到 {len(claim_groups)} 类费用场景,建议拆成多张报销单后再提交。", detail="同一批附件中包含多类费用场景时,混在一张报销单里会影响规则匹配、附件核验和审批归口。", suggestion="按费用场景拆成多张报销单,分别确认金额、事由和附件归属。", ) ) - return briefs[:4] + return self._filter_deprecated_review_risk_briefs(briefs) + + @staticmethod + def _resolve_submission_blocked_risk_level(reason: str) -> str: + normalized = re.sub(r"\s+", "", str(reason or "")) + amount_keywords = ("金额", "超标", "费用", "价款", "票面金额", "单价", "合计") + return "high" if any(keyword in normalized for keyword in amount_keywords) else "warning" + + @staticmethod + def _filter_deprecated_review_risk_briefs( + briefs: list[UserAgentReviewRiskBrief], + ) -> list[UserAgentReviewRiskBrief]: + filtered: list[UserAgentReviewRiskBrief] = [] + for brief in briefs: + title = str(brief.title or "").strip() + if any(keyword in title for keyword in DEPRECATED_REVIEW_RISK_TITLE_KEYWORDS): + continue + filtered.append(brief) + return filtered + + def _build_travel_policy_precheck_briefs( + self, + payload: UserAgentRequest, + *, + document_cards: list[UserAgentReviewDocumentCard], + claim_groups: list[UserAgentReviewClaimGroup], + ) -> list[UserAgentReviewRiskBrief]: + if not document_cards or not self._is_travel_review_context(payload, document_cards, claim_groups): + return [] + + rule_catalog = ExpenseRuleRuntimeService(self.db).load_catalog() + policy = rule_catalog.travel_policy + if policy is None: + return [] + + employee = self._resolve_employee_profile(payload) + grade = self._resolve_review_employee_grade(payload, employee=employee) + grade_band = ExpenseClaimService._resolve_travel_policy_band(grade) + band_label = policy.band_labels.get(grade_band or "", grade or "当前职级") + declared_city = self._resolve_declared_travel_city(payload, policy) + reason_corpus = self._build_review_reason_corpus(payload) + has_exception_note = self._text_contains_any(reason_corpus, policy.standard_exception_keywords) + standard_rule_name = str(getattr(policy, "standard_rule_name", "") or policy.rule_name) + standard_rule_version = str(getattr(policy, "standard_rule_version", "") or policy.rule_version) + + briefs: list[UserAgentReviewRiskBrief] = [] + amount_measurement_lines: list[str] = [] + seen_keys: set[str] = set() + + def append_once(key: str, brief: UserAgentReviewRiskBrief) -> None: + if key in seen_keys: + return + seen_keys.add(key) + briefs.append(brief) + + for card in document_cards: + document_type = str(card.document_type or "").strip().lower() + suggested_type = str(card.suggested_expense_type or "").strip().lower() + card_text = self._build_review_document_card_text(card) + document_type_label = resolve_document_type_label(document_type) + amount = self._extract_amount_decimal_from_card(card) + + if self._is_review_hotel_card(card): + hotel_city = self._extract_policy_city_from_text(card_text, policy) or declared_city + city_tier = policy.city_tiers.get(hotel_city, "tier_3") + city_tier_label = self._format_travel_city_tier(city_tier) + + if amount is None: + amount_measurement_lines.append( + f"{card.filename}:识别为{document_type_label},但未识别到可核算金额,无法完成住宿差标测算。" + ) + append_once( + f"hotel-amount-missing-{card.index}", + UserAgentReviewRiskBrief( + title="住宿金额待补充", + level="warning", + content=f"{card.filename} 已识别为{document_type_label},但未识别到可核算的住宿金额。", + detail=( + f"依据《{standard_rule_name}》({standard_rule_version}),住宿票据需要按员工职级、城市级别和每晚金额进行差标核算。" + "当前票据缺少金额,系统无法判断是否超出差旅标准。" + ), + suggestion="请在票据识别结果中补充或更正住宿金额,再继续核对报销单。", + ), + ) + continue + + if grade_band is None: + amount_measurement_lines.append( + f"{card.filename}:识别住宿金额 {amount:.2f} 元,但缺少员工职级,无法匹配住宿标准。" + ) + append_once( + f"hotel-grade-missing-{card.index}", + UserAgentReviewRiskBrief( + title="职级信息待确认", + level="warning", + content=f"{card.filename} 已识别住宿金额 {amount:.2f} 元,但当前员工职级缺失,无法匹配住宿标准。", + detail=( + f"依据《{standard_rule_name}》({standard_rule_version}),住宿标准按职级档位和城市级别配置。" + "当前未能识别员工职级,因此无法完成创建前差标核算。" + ), + suggestion="请确认员工档案或页面上下文中的职级信息,再重新进行差旅规则预检。", + ), + ) + continue + + cap = self._resolve_review_hotel_cap( + policy, + grade_band=grade_band, + city=hotel_city, + city_tier=city_tier, + ) + if cap <= Decimal("0.00"): + continue + night_count = self._extract_review_hotel_night_count(card) + nightly_amount = (amount / Decimal(max(night_count, 1))).quantize(Decimal("0.01")) + amount_measurement_lines.append( + f"{card.filename}:识别为{document_type_label},金额 {amount:.2f} 元," + f"按 {night_count} 晚折算 {nightly_amount:.2f} 元/晚;" + f"适用标准为 {band_label}{city_tier_label} {cap:.2f} 元/晚," + f"{'超出标准' if nightly_amount > cap else '测算通过'}。" + ) + if nightly_amount <= cap: + continue + + basis = ( + f"依据《{standard_rule_name}》({standard_rule_version}),{band_label} 在{city_tier_label}" + f"住宿标准为 {cap:.2f} 元/晚;{card.filename} 识别为{document_type_label}," + f"金额 {amount:.2f} 元,按 {night_count} 晚折算约 {nightly_amount:.2f} 元/晚。" + ) + append_once( + f"hotel-over-limit-{card.index}", + UserAgentReviewRiskBrief( + title="住宿超标待说明" if not has_exception_note else "住宿超标提醒", + level="high", + content=( + f"{card.filename} 住宿金额约 {nightly_amount:.2f} 元/晚," + f"超过 {band_label} {city_tier_label}标准 {cap:.2f} 元/晚。" + ), + detail=( + basis + + ( + "当前未识别到超标说明,创建单据前需要先补充原因。" + if not has_exception_note + else "当前已识别到例外说明,后续仍需审批人重点复核。" + ) + ), + suggestion="补充超标说明、协议酒店满房/会议高峰等原因,或调整住宿金额后再继续。", + ), + ) + continue + + if document_type == "meal_receipt": + allowance = self._resolve_review_travel_allowance_standard( + policy, + declared_city=declared_city, + card_text=card_text, + ) + if allowance is not None: + region_label, standard_amount = allowance + if amount is None: + amount_measurement_lines.append( + f"{card.filename}:识别为{document_type_label},但未识别到可核算金额,无法按{region_label}伙食补助标准测算。" + ) + append_once( + f"travel-meal-amount-missing-{card.index}", + UserAgentReviewRiskBrief( + title="差旅餐饮金额待补充", + level="high", + content=f"{card.filename} 已识别为{document_type_label},但未识别到可核算金额。", + detail=( + f"依据《{standard_rule_name}》({standard_rule_version}),差旅餐饮票据优先按出差补助标准中的伙食补助进行测算。" + f"当前匹配区域为{region_label},但票据缺少金额,系统无法判断是否超出补助标准。" + ), + suggestion="请在票据识别结果中补充或更正餐饮金额,再继续创建报销单。", + ), + ) + continue + + amount_measurement_lines.append( + f"{card.filename}:识别为{document_type_label},金额 {amount:.2f} 元;" + f"适用《{standard_rule_name}》{region_label}伙食补助标准 {standard_amount:.2f} 元/天," + f"{'超出标准' if amount > standard_amount else '测算通过'}。" + ) + if amount > standard_amount: + append_once( + f"travel-meal-allowance-over-limit-{card.index}", + UserAgentReviewRiskBrief( + title="差旅餐饮金额超出伙食补助标准", + level="high", + content=( + f"{card.filename} 识别金额 {amount:.2f} 元," + f"超过{region_label}伙食补助标准 {standard_amount:.2f} 元/天。" + ), + detail=( + f"依据《{standard_rule_name}》({standard_rule_version})的出差补助标准," + f"{region_label}伙食补助为 {standard_amount:.2f} 元/天;" + f"当前票据类型识别为{document_type_label},识别金额 {amount:.2f} 元。" + "首轮上传阶段按单张票据先行测算,后续可结合出差天数和实际餐补口径复核。" + ), + suggestion="如该票据属于差旅餐补,请调整金额或补充超标/拆分说明;如属于业务招待或普通餐费,请改为对应费用类型后再提交。", + ), + ) + continue + + scene_code = self._resolve_review_amount_scene_code(card, payload) + scene_policy = rule_catalog.get_scene_policy(scene_code) + scene_limit = self._resolve_review_scene_amount_limit(scene_policy) + if scene_policy is not None and scene_limit is not None: + metric_label = str(getattr(scene_limit, "metric_label", "") or scene_policy.label or "金额").strip() + standard_amount = self._resolve_scene_standard_amount(scene_limit) + if amount is None: + amount_measurement_lines.append( + f"{card.filename}:识别为{document_type_label},但未识别到可核算金额,无法按{metric_label}测算。" + ) + append_once( + f"{scene_code}-amount-missing-{card.index}", + UserAgentReviewRiskBrief( + title=f"{scene_policy.label}金额待补充", + level="warning", + content=f"{card.filename} 已识别为{document_type_label},但未识别到可核算金额。", + detail=( + f"依据《{scene_policy.rule_name}》({scene_policy.rule_version})," + f"{scene_policy.label}需要按{metric_label}进行金额审核。当前票据缺少金额,系统无法判断是否合规。" + ), + suggestion="请在票据识别结果中补充或更正金额,再继续核对报销单。", + ), + ) + continue + + if standard_amount is not None: + amount_measurement_lines.append( + f"{card.filename}:识别为{document_type_label},金额 {amount:.2f} 元;" + f"适用《{scene_policy.rule_name}》{metric_label}标准 {standard_amount:.2f} 元," + f"{'超出标准' if amount > standard_amount else '测算通过'}。" + ) + + amount_risk = self._evaluate_review_scene_amount( + amount=amount, + limit_config=scene_limit, + reason_text=reason_corpus, + ) + if amount_risk is not None: + severity, threshold = amount_risk + append_once( + f"{scene_code}-amount-over-limit-{card.index}", + UserAgentReviewRiskBrief( + title=f"{scene_policy.label}金额超标待说明", + level="high" if severity == "high" else "warning", + content=( + f"{card.filename} 识别金额 {amount:.2f} 元," + f"超过{metric_label}标准 {threshold:.2f} 元。" + ), + detail=( + f"依据《{scene_policy.rule_name}》({scene_policy.rule_version})," + f"{scene_policy.label}按{metric_label}审核,当前票据类型识别为{document_type_label}," + f"识别金额 {amount:.2f} 元,标准阈值 {threshold:.2f} 元。" + ), + suggestion="请补充超标原因或拆分到更准确的费用类型;如属于例外场景,请在事由中写明业务背景。", + ), + ) + continue + + transport_class = self._detect_review_transport_class(card, policy) + if transport_class and grade_band is not None: + transport_kind, class_label, class_level = transport_class + allowed_level = policy.transport_limits.get(grade_band, {}).get(transport_kind) + if allowed_level is not None and class_level > allowed_level: + append_once( + f"transport-class-over-limit-{card.index}-{class_label}", + UserAgentReviewRiskBrief( + title="交通舱位超标待说明" if not has_exception_note else "交通舱位超标提醒", + level="warning", + content=f"{card.filename} 识别为 {class_label},{band_label} 当前默认不可报销该舱位/席别。", + detail=( + f"依据《{standard_rule_name}》({standard_rule_version}),{band_label} 的交通席别标准" + f"未覆盖 {class_label};票据类型识别为{document_type_label}。" + + ( + "当前未识别到例外说明,创建单据前需要补充原因。" + if not has_exception_note + else "当前已识别到例外说明,后续仍需审批人重点复核。" + ) + ), + suggestion="补充无直达、临时改签、行程变更等例外说明,或更换为符合标准的票据。", + ), + ) + continue + + if document_type == "meal_receipt" and self._is_travel_review_context(payload, document_cards, claim_groups): + if amount is not None: + amount_measurement_lines.append( + f"{card.filename}:识别为{document_type_label},金额 {amount:.2f} 元;需确认按餐补、餐费或业务招待口径归口。" + ) + append_once( + f"travel-meal-card-{card.index}", + UserAgentReviewRiskBrief( + title="差旅餐饮票据待归口", + level="warning", + content=f"{card.filename} 已识别为餐饮票据,当前差旅报销单需要确认是否允许并入差旅费用。", + detail=( + f"依据《{standard_rule_name}》({standard_rule_version})的差旅票据预检口径,系统优先核算交通、住宿等差旅核心票据。" + "餐饮票据可能需要按餐费或业务招待场景拆分,并补充同行人员或客户信息。" + ), + suggestion="如属于差旅餐补,请补充制度允许口径;如属于招待或普通餐费,建议拆成对应费用类型单据。", + ), + ) + continue + + if suggested_type in {"travel", "hotel", "transport"} and document_type in {"other", "travel_ticket"}: + append_once( + f"travel-type-uncertain-{card.index}", + UserAgentReviewRiskBrief( + title="差旅票据类型待确认", + level="warning", + content=f"{card.filename} 归入差旅场景,但票据类型仍需确认。", + detail=( + f"依据《{standard_rule_name}》({standard_rule_version}),差旅预检需要先明确票据是机票、火车票、住宿票据、打车票等," + "再匹配对应的金额或舱位规则。当前类型识别不够稳定。" + ), + suggestion="请在附件识别结果中更正票据类型,或重新上传更清晰的附件后再继续。", + ), + ) + + if amount_measurement_lines: + briefs.insert( + 0, + UserAgentReviewRiskBrief( + title="附件金额测算结果", + level="info", + content="系统已根据首轮上传附件识别金额,并匹配当前可执行的报销标准进行测算。", + detail=";".join(dict.fromkeys(amount_measurement_lines)), + suggestion="如测算结果超标,请补充超标说明、调整金额或更正票据类型后再继续。", + ), + ) + + return briefs + + def _is_travel_review_context( + self, + payload: UserAgentRequest, + document_cards: list[UserAgentReviewDocumentCard], + claim_groups: list[UserAgentReviewClaimGroup], + ) -> bool: + entity_expense_type = self._collect_entity_values(payload).get("expense_type_code", "") + review_form_values = self._resolve_review_form_values(payload) + form_expense_type = str(review_form_values.get("expense_type") or "").strip() + message_context = " ".join( + [ + str(payload.message or ""), + str(payload.context_json.get("user_input_text") or ""), + str(payload.context_json.get("expense_type") or ""), + form_expense_type, + ] + ) + if entity_expense_type in {"travel", "hotel", "transport"}: + return True + if any(group.group_code == "travel" or group.expense_type in {"travel", "hotel", "transport"} for group in claim_groups): + return True + if any(card.suggested_expense_type in {"travel", "hotel", "transport"} for card in document_cards): + return True + return any(keyword in message_context for keyword in ("差旅", "出差", "机票", "火车", "高铁", "酒店", "住宿")) + + def _resolve_review_travel_allowance_standard( + self, + policy: RuntimeTravelPolicy, + *, + declared_city: str, + card_text: str, + ) -> tuple[str, Decimal] | None: + meal_limits = getattr(policy, "allowance_limits", {}).get("meal", {}) + if not meal_limits: + return None + + region_label = self._resolve_review_travel_allowance_region( + " ".join([declared_city or "", card_text or ""]) + ) + amount = meal_limits.get(region_label) + if amount is None and region_label != "其他地区": + amount = meal_limits.get("其他地区") + region_label = "其他地区" + if amount is None: + return None + return region_label, Decimal(amount).quantize(Decimal("0.01")) + + @staticmethod + def _resolve_review_travel_allowance_region(text: str) -> str: + normalized = re.sub(r"\s+", "", str(text or "")) + if not normalized: + return "其他地区" + if any(keyword in normalized for keyword in ("境外", "国外", "海外")): + return "国外" + if any(keyword in normalized for keyword in ("香港", "澳门", "台湾", "港澳台")): + return "港澳台" + if "乌鲁木齐" in normalized: + return "新疆-乌鲁木齐" + if "新疆" in normalized: + return "新疆-其他" + if any(keyword in normalized for keyword in ("西藏", "拉萨")): + return "西藏" + if any(keyword in normalized for keyword in ("北京", "上海", "天津", "重庆", "深圳", "珠海", "汕头", "厦门")): + return "直辖市/特区" + return "其他地区" + + def _resolve_review_amount_scene_code( + self, + card: UserAgentReviewDocumentCard, + payload: UserAgentRequest, + ) -> str: + document_type = str(card.document_type or "").strip().lower() + suggested_type = str(card.suggested_expense_type or "").strip().lower() + if document_type in {"taxi_receipt", "parking_toll_receipt", "transport_receipt"}: + return "transport" + if document_type == "meal_receipt": + entity_values = self._collect_entity_values(payload) + if suggested_type == "entertainment" or entity_values.get("expense_type_code") == "entertainment": + return "entertainment" + return "meal" + if document_type == "hotel_invoice" or suggested_type == "hotel": + return "hotel" + if suggested_type in { + "travel", + "transport", + "meal", + "entertainment", + "office", + "meeting", + "training", + "communication", + "welfare", + "other", + }: + return suggested_type + return self._collect_entity_values(payload).get("expense_type_code") or "other" + + @staticmethod + def _resolve_review_scene_amount_limit(scene_policy: Any | None) -> Any | None: + if scene_policy is None: + return None + return getattr(scene_policy, "item_amount_limit", None) or getattr(scene_policy, "claim_amount_limit", None) + + @staticmethod + def _resolve_scene_standard_amount(limit_config: Any | None) -> Decimal | None: + if limit_config is None: + return None + warn_amount = getattr(limit_config, "warn_amount", None) + block_amount = getattr(limit_config, "block_amount", None) + amount = warn_amount if warn_amount is not None else block_amount + if amount is None: + return None + try: + return Decimal(amount).quantize(Decimal("0.01")) + except (InvalidOperation, ValueError): + return None + + @staticmethod + def _evaluate_review_scene_amount( + *, + amount: Decimal, + limit_config: Any, + reason_text: str, + ) -> tuple[str, Decimal] | None: + block_amount = getattr(limit_config, "block_amount", None) + warn_amount = getattr(limit_config, "warn_amount", None) + exception_keywords = list(getattr(limit_config, "exception_keywords", []) or []) + has_exception = UserAgentService._text_contains_any(reason_text, exception_keywords) + + if block_amount is not None and amount > Decimal(block_amount): + return ("high", Decimal(block_amount).quantize(Decimal("0.01"))) + if warn_amount is not None and amount > Decimal(warn_amount): + return ("high", Decimal(warn_amount).quantize(Decimal("0.01"))) + return None + + def _resolve_review_employee_grade(self, payload: UserAgentRequest, *, employee: Employee | None) -> str: + if employee is not None and employee.grade: + return str(employee.grade).strip() + review_form_values = self._resolve_review_form_values(payload) + for source in ( + review_form_values, + payload.context_json, + payload.tool_payload, + ): + for key in ("employee_grade", "grade", "user_grade", "position_grade"): + value = str(source.get(key) or "").strip() if isinstance(source, dict) else "" + if value: + return value + return "" + + def _build_review_reason_corpus(self, payload: UserAgentRequest) -> str: + review_form_values = self._resolve_review_form_values(payload) + parts = [ + str(payload.message or ""), + str(payload.context_json.get("user_input_text") or ""), + str(review_form_values.get("reason") or ""), + str(review_form_values.get("business_reason") or ""), + str(review_form_values.get("location") or ""), + str(review_form_values.get("business_location") or ""), + ] + return "\n".join(part.strip() for part in parts if part and part.strip()) + + def _resolve_declared_travel_city(self, payload: UserAgentRequest, policy: RuntimeTravelPolicy) -> str: + review_form_values = self._resolve_review_form_values(payload) + candidates = [ + str(review_form_values.get("business_location") or ""), + str(review_form_values.get("location") or ""), + self._resolve_location_value(payload), + str(payload.message or ""), + ] + for candidate in candidates: + city = self._extract_policy_city_from_text(candidate, policy) + if city: + return city + return "" + + @staticmethod + def _build_review_document_card_text(card: UserAgentReviewDocumentCard) -> str: + field_text = " ".join(f"{field.label}:{field.value}" for field in card.fields) + return " ".join( + [ + str(card.filename or ""), + str(card.document_type or ""), + str(card.scene_label or ""), + str(card.summary or ""), + field_text, + ] + ).strip() + + @staticmethod + def _is_review_hotel_card(card: UserAgentReviewDocumentCard) -> bool: + document_type = str(card.document_type or "").strip().lower() + suggested_type = str(card.suggested_expense_type or "").strip().lower() + scene_label = str(card.scene_label or "").strip() + return document_type == "hotel_invoice" or suggested_type == "hotel" or "住宿" in scene_label + + @staticmethod + def _extract_amount_decimal_from_card(card: UserAgentReviewDocumentCard) -> Decimal | None: + for field in card.fields: + if field.label != "金额": + continue + normalized = str(field.value or "").replace("元", "").replace("¥", "").replace("¥", "").replace(",", "").strip() + try: + amount = Decimal(normalized).quantize(Decimal("0.01")) + except (InvalidOperation, ValueError): + continue + if amount > Decimal("0.00"): + return amount + return None + + @staticmethod + def _extract_review_hotel_night_count(card: UserAgentReviewDocumentCard) -> int: + text = f"{card.summary or ''} {' '.join(f'{field.label}:{field.value}' for field in card.fields)}" + match = TRAVEL_REVIEW_HOTEL_NIGHT_PATTERN.search(text) + if not match: + return 1 + try: + return max(1, int(match.group(1))) + except (TypeError, ValueError): + return 1 + + @staticmethod + def _extract_policy_city_from_text(text: str, policy: RuntimeTravelPolicy) -> str: + normalized = str(text or "").strip() + if not normalized: + return "" + city_names = set(policy.city_tiers.keys()) + city_names.update(getattr(policy, "hotel_city_limits", {}).keys()) + for city in sorted(city_names, key=lambda item: len(item), reverse=True): + if city in normalized: + return city + return "" + + @staticmethod + def _format_travel_city_tier(city_tier: str) -> str: + return { + "tier_1": "一线城市", + "tier_2": "重点城市", + "tier_3": "其他城市", + }.get(str(city_tier or "").strip(), "当前城市") + + @staticmethod + def _resolve_review_hotel_cap( + policy: RuntimeTravelPolicy, + *, + grade_band: str, + city: str, + city_tier: str, + ) -> Decimal: + normalized_city = str(city or "").strip() + if normalized_city and getattr(policy, "hotel_city_limits", None): + city_limits = policy.hotel_city_limits.get(normalized_city, {}) + city_cap = city_limits.get(grade_band) + if city_cap is not None: + return Decimal(city_cap).quantize(Decimal("0.01")) + return Decimal(policy.hotel_limits.get(grade_band, {}).get(city_tier, Decimal("0.00"))).quantize( + Decimal("0.01") + ) + + def _detect_review_transport_class( + self, + card: UserAgentReviewDocumentCard, + policy: RuntimeTravelPolicy, + ) -> tuple[str, str, int] | None: + document_type = str(card.document_type or "").strip().lower() + text = re.sub(r"\s+", "", self._build_review_document_card_text(card)) + if not text: + return None + + if document_type == "flight_itinerary" or any(keyword in text for keyword in ("机票", "航班", "登机牌")): + for config in policy.flight_classes: + label = str(config.keyword or "").strip() + if label and label in text: + return "flight", label, int(config.level) + + if document_type == "train_ticket" or any(keyword in text for keyword in ("火车", "高铁", "动车", "铁路")): + for config in policy.train_classes: + label = str(config.keyword or "").strip() + if label and label in text: + return "train", label, int(config.level) + return None + + @staticmethod + def _text_contains_any(text: str, keywords: list[str] | tuple[str, ...]) -> bool: + compact = re.sub(r"\s+", "", str(text or "")) + return bool(compact) and any(str(keyword or "").strip() and str(keyword).strip() in compact for keyword in keywords) @staticmethod def _resolve_submission_blocked_reasons(payload: UserAgentRequest) -> list[str]: @@ -2543,6 +3149,14 @@ class UserAgentService: "系统检测到你已有可用草稿,请先选择关联到现有草稿,或单独建立一张新的报销单。" ) + blocked_reasons = self._resolve_submission_blocked_reasons(payload) + if blocked_reasons: + reason_text = ";".join(dict.fromkeys(reason.strip("。;;") for reason in blocked_reasons if reason)) + return ( + f"AI预审未通过:{reason_text}。" + "请先根据风险提示补充原因、调整金额或更换附件,整改后再继续提交。" + ) + review_payload = UserAgentReviewPayload( intent_summary="", body_message="", @@ -3460,7 +4074,18 @@ class UserAgentService: evidence="来源于用户修改后的结构化表单。", ) - merchant_value = self._extract_document_merchant_name(ocr_documents[0]) if ocr_documents else "" + merchant_value = "" + for document in ocr_documents: + if str(document.get("document_type") or "").strip().lower() != "hotel_invoice": + continue + merchant_value = self._extract_document_merchant_name(document) + if merchant_value: + break + if not merchant_value: + for document in ocr_documents: + merchant_value = self._extract_document_merchant_name(document) + if merchant_value: + break if merchant_value: return self._build_slot_value( value=merchant_value, diff --git a/server/storage/expense_claims/08f51e80-512e-498e-bcd6-50ca5d0becfc/1170b632-ad59-46c0-9876-7230d9d97e30/2月23_上海-武汉.pdf b/server/storage/expense_claims/08f51e80-512e-498e-bcd6-50ca5d0becfc/1170b632-ad59-46c0-9876-7230d9d97e30/2月23_上海-武汉.pdf new file mode 100644 index 0000000000000000000000000000000000000000..d516ecb6c81e7a6ff153948daf85ee1226df4da8 GIT binary patch literal 24940 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 literal 0 HcmV?d00001 diff --git a/server/storage/expense_claims/08f51e80-512e-498e-bcd6-50ca5d0becfc/1170b632-ad59-46c0-9876-7230d9d97e30/2月23_上海-武汉.pdf.meta.json b/server/storage/expense_claims/08f51e80-512e-498e-bcd6-50ca5d0becfc/1170b632-ad59-46c0-9876-7230d9d97e30/2月23_上海-武汉.pdf.meta.json new file mode 100644 index 0000000..b2e8892 --- /dev/null +++ b/server/storage/expense_claims/08f51e80-512e-498e-bcd6-50ca5d0becfc/1170b632-ad59-46c0-9876-7230d9d97e30/2月23_上海-武汉.pdf.meta.json @@ -0,0 +1,90 @@ +{ + "file_name": "2月23_上海-武汉.pdf", + "storage_key": "08f51e80-512e-498e-bcd6-50ca5d0becfc/1170b632-ad59-46c0-9876-7230d9d97e30/2月23_上海-武汉.pdf", + "media_type": "application/pdf", + "size_bytes": 24940, + "uploaded_at": "2026-05-20T13:48:38.616319+00:00", + "previewable": true, + "preview_kind": "image", + "preview_storage_key": "08f51e80-512e-498e-bcd6-50ca5d0becfc/1170b632-ad59-46c0-9876-7230d9d97e30/2月23_上海-武汉.preview.png", + "preview_media_type": "image/png", + "preview_file_name": "2月23_上海-武汉.preview.png", + "analysis": { + "severity": "medium", + "label": "中风险", + "headline": "AI提示:附件存在明显待整改项", + "summary": "当前附件可见部分内容,但金额、用途、日期或附件类型仍有缺失或不一致。", + "points": [ + "用途字段:用户填写用途“业务发生时间:2026-02-20 至 2026”与票据内容不一致,当前附件更像交通相关材料。" + ], + "suggestion": "建议根据风险点补齐清晰票据,或修正金额、日期、费用说明后再提交。" + }, + "document_info": { + "document_type": "train_ticket", + "document_type_label": "火车/高铁票", + "scene_code": "travel", + "scene_label": "差旅票据", + "fields": [ + { + "key": "amount", + "label": "金额", + "value": "354元" + }, + { + "key": "date", + "label": "日期", + "value": "2026-05-18" + }, + { + "key": "merchant_name", + "label": "商户", + "value": "中国铁路" + }, + { + "key": "invoice_number", + "label": "票据号码", + "value": "26319166100006175398" + }, + { + "key": "route", + "label": "行程", + "value": "上海-武汉" + } + ] + }, + "requirement_check": { + "matches": true, + "current_expense_type": "travel", + "current_expense_type_label": "差旅费", + "allowed_scene_labels": [ + "差旅" + ], + "allowed_document_type_labels": [ + "机票/航班行程单", + "火车/高铁票" + ], + "recognized_scene_code": "travel", + "recognized_scene_label": "差旅票据", + "recognized_document_type": "train_ticket", + "recognized_document_type_label": "火车/高铁票", + "mismatch_severity": "high", + "rule_code": "rule.expense.scene_submission_standard", + "rule_name": "报销场景提交与附件标准", + "message": "当前费用项目为差旅费,已识别为火车/高铁票,符合当前差旅费场景的附件要求。" + }, + "ocr_status": "recognized", + "ocr_error": "", + "ocr_text": "电子发票\n(铁路电子客票)\n州\n国家税务总局\n发票号码:26319166100006175398\n开票日期:2026年05月18日\n上海市税务局\n上海虹桥站\n武汉站\nG456\nShanghaihongqiao\nWuhan\n2026年02月23日\n13:54开\n12车08B号\n二等座\n票价:¥354.00\n4201061987****1615\n曹笑竹\n电子客票号:6610061086021394837402026\n购买方名称:曹笑竹\n统一社会信用代码:\n买票请到12306发货请到95306\n中国铁路祝您旅途愉快", + "ocr_summary": "电子发票;(铁路电子客票);州", + "ocr_avg_score": 0.9620026834309101, + "ocr_line_count": 24, + "ocr_classification_source": "rule", + "ocr_classification_confidence": 0.88, + "ocr_classification_evidence": [ + "铁路电子客票", + "电子客票", + "铁路", + "二等座" + ], + "ocr_warnings": [] +} \ No newline at end of file diff --git a/server/storage/expense_claims/08f51e80-512e-498e-bcd6-50ca5d0becfc/1170b632-ad59-46c0-9876-7230d9d97e30/2月23_上海-武汉.preview.png b/server/storage/expense_claims/08f51e80-512e-498e-bcd6-50ca5d0becfc/1170b632-ad59-46c0-9876-7230d9d97e30/2月23_上海-武汉.preview.png new file mode 100644 index 0000000000000000000000000000000000000000..099413e4ce18f4f2918bf8b613e4a7f695e2aee4 GIT binary patch literal 137722 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

RS_$qKD#Z?SU+5P&t+%29Me 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 z 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 PK3lRG@BRM^Qx!D! literal 0 HcmV?d00001 diff --git a/server/storage/expense_claims/08f51e80-512e-498e-bcd6-50ca5d0becfc/62fe16f9-ad9f-4f96-948f-0b31a427a81d/2月20_武汉-上海.pdf b/server/storage/expense_claims/08f51e80-512e-498e-bcd6-50ca5d0becfc/62fe16f9-ad9f-4f96-948f-0b31a427a81d/2月20_武汉-上海.pdf new file mode 100644 index 0000000000000000000000000000000000000000..b2207b8ad799b9ba771c6d9d2c21f7c2c9be6221 GIT binary patch literal 24995 zcmc$G1z1$wy8jRog0wIO4H617LpMlwH%O-fLw8C^NSCxU2-1Sm9g2W}lz?=1m;Cn_ z-{*JFcmB`0_nhb6ftlHR?RUNFt@W<8e{1cbRTLFxf-!U6xK8`BvSakdbr=Pd0&ev9 z#&teEh@7dTp^2fRAq6W?s7wKoH?%f&pkRgmI8!t<2hP}joT$3lnnFYXS}VA@fWVFG zrZy(uxv>1k?xB;T1>Bzg+Z9LzBnc7&$umGi>`e_FE#WqzhK{E6qC6~677i#oj0?)i z$^vC&fXKm3{>c>uaZwgPbXiLydbpVhi>-;7m8B7cg&D@o!paQgf^jm#*jP9jAd2>I z6DMQS@2#qUoIoxhQ;-$#M*&g*iGxIeZ(|S~WCL;r%I!gpz_C5U@A4xw|78wYQyX(f z3knWaR)~s|kt0H5O*vV}ch!HHNREB^h zO?iN0L@|Vl;ya1s6Mm|Phzk^&a*7lpaC=hj0FPa zg0QeM!B}~qh<_@9>l74x_9kXL%A(>wTLI4asVp2FZFwLN7Z(?17glDty*UKN&CLyg zvOri^m;eeU2R9o>Lsupn2kP%UesU2tbuhNKv_*LFCpQ!0KbYA%*;{>QWnv65wKBCf zwQ+QSz?fkOHGb%4ZTknYjRW&{U73yH)(}@iTYwPy2O;3$zb6DP0EDc65CZm-llyzp zUp%d?|DXnH11A2d`dS;wzgK5#^2)@ z0@UJz{CNp5HR8pGV8)}OAp*B?Hno?sF@p=RvhpE_|4Zq2dOirE!Qbrq-DBSi0hb9} z=Y#waB?5m&8PMbSsa${<`ri3|Md7c0i0G!j;#dUkWaCHygUDE#IOtGteDA=IeuVM& zKK*+udP>47i1&r%^C5SjX5a2%#IVf0u&;qP96^tI68Y8$#S;Ht;epZySW}#sDQBweT z{n3ZT0Wbd0{%5^E`><51?MntnN93fXb3<(G53cY0r*w=^xE~zhxf1e* zrJ?o+2!2ynG76zBV&K@2Lax6KRlWD z@&2|m?=r(DOa6^p3jfhlpIE1pQjMW)^86t<9rvyKF)@~(q^~o?XT&+~hKXeTv5cKjoJE~&uyc2lO&A*dg zrn4UPjuG1{*uBXto62jdRr@c;Vqyk*bt`GF1Zzqc76KilepU8z5R1ii8w@5Q1sk`Fvku959- zfD(+^rx1tuIex{;W^CU>qIherSIwuKB5Y|?k!>#OAyge*kjZy zP>5T#!ywLb&B~?KQf<$^Bc zk1D^y-p(u;;ziO5#>l8FtH8o3v<*yQx1^I1ZhqxBo$sZ017E-U=Ex!~`NYvlI`Kg( zlU88l!{`y=5pSf<=7g7W1^uhhMzS*Mi}=cMX_C>n@OWHcVA)f|CmdQqn0JI#hMt#!4KS5bviV-f5+Gfz&zDvo z^z6a#Xda+ff@&{y4*i{%R{Yg`vV!DKj)A7+Wh76)MB@}Dnt`hh7W0UcqKQw&meV?`5q-D;Oj>jghEX zRzRUs*}F^hF0A`CX;p6|WejdB8ZjGV_k^QS=P^cZ>y5&kF1(QY-N#xx1r!b{ew)4M z&pu2%e02e)a-*v)zoQNkvgz zIR4IZ`Z`>*tdL@IQq>9PmqwmM^5vN-4?ouwZr#nKYVv11g^BKICrvmEFxM~~IAY!! ziBWUMj;cu zwYQ3EORker#LWD#%E^6*Q7dvq2@dHWf{APDeNc_!w0OsM#-X#*lE|T!DP6B{+GpYkf(bXac=&l)9Z~lV9?>@c@<|A|QisuKL0?{4mPjcS4 zIR}8BG9P{2*o$g^JJI~g7uyC@7=ibxI%zCmg7`+r>*_;pQsG`E%0+zP-s=@je4QQX z;6VAj#@3(N15X(zinde(d9%Eg(Rj^)Ct$-8lOYmMxpPt{iCdW~7B2Wwg(o0DM>zmU zDS=Zn>fV0Q(InHW6HV?p7~6QtWRy7@WsLEUJ*qGsj(i)T&iO)sC@U5%xIoVKN%FDv zc9M@IT1+VJr4EQgQRg3Cpb)Z=G=&e^bQdo?PAuF_xm=(R+5dP3A52Bqn9oy5|Oa_I5S>!!n0GKOA6 zmcU?;FkII%rR0ryc~neB`9!;7g^V;d@8-um_sdG?GTWrSM}VV_FhU?&Z-1>)AGD=Z z)AJ{PNJ*(!`&opVAr zFiVR`UaV(!zwuR-z*yz^@OYhFv8{f{%4ZW_+2*@3gNlbMx$r7jx>uiEtwjU*RSjUt zVzM2tp9v%_K7>F&&Cb!eJ_ z&O+tcNHp%)p#{XBM=8lnG^U5^%+ViY-Ov<^e2D+NRc#uRTg~<`eH^JH6zxIGWgC@w zpn{WR@C-&-s1!O;4_ed;j6RE?DerXx^rAIDO`695-@2I*U`T(_GfbIUlX4v(}XWbO7yr_jG67EUn$j%6rLPBZuzQ0OGb#oeix{#?JLq zGgB-=U;SP!?B9^PNe5jr`tluuI_s=)S^^bVmPibpl#%OEBRr#Q~%33p<;O;Gz5> zUNDjET`=*A&y-yCs+j->MQqcl$Z^$e-;z4ZQJdE3b=_il#d2azoOPRzpbD~^AF8f@ zWh#9lh;mq|3Gmt3bF=YYrT6L9R>Rd2*<08fOQGLH&2Ug5>e=EqOcT5&5+#Tf7CE>R zf~$}pe4MXA!frSKYq-Mv=yr9Ulb=||lf%|_U>ZOOQ zd#Fu&Sdu+!s^06*O_$Y4RR!Rf$KIoApOv=CM zrU5&4*ZW1MmzbVi`FtVaaZ5qOZKu2T4Py1za66SAr({fbjRqQxP%h+a>?kR&!*6ML zBqU>%D z3iZ6zGZyGHC$_^{t#VA6-u%sue8Lr4m0SbP2tz$`C*MxE#gNMxre9fWrN8Q!rrX2N zMVWcKgBCxpgPN+RNMt9|oLFV*n5Pa=abPh?ZE=@`CUui81d8Erz_MpUgFeNza*a9NETrM} zq43g}q=<$5(Y%`N5`i$PMAO^A&)&slxB4dBc5k;*aqTcmpWt@BzqX3=ju1NBwtTj> zwDE@9|0S`WWA}^j8V84&tMeh;rn}t|iT(=p%L%I@cTGzkL3q_i_S7PYkDfiadhS%N zuCU@x>m${$<0O4%a6+?<86fx#i+$uoIAEl$>sox=2Dbz-h}HJ!~G+5 z^tU}*USOA@ZOG6`6ko3FGxO$6 z3MMcYTFfjXaKE*DlZGpa99KRee!)H(HeOT4m<~Cp3HE5XU>doPEnC@wko3M(%5E4dK2NDrUOgJ$zXlto=pX^QofS zdDrJv*Bf0gM@rOq1D8tOtdJ1xzMJ_Z>hp5Nj2%1d7y0!(;f}gPoqFg+99#8G zIXj??+NPW~98J97Ob1QRIvexgrt0YXcXH;94|#$E^mon-tQ{1OA*V%wq1LbbMs59wpwaY|Ale zap7QX$&7AwFzE3nbN`wMcl`YPgLxb@{tV9~FM6aGOp&1dyb$@ImN4A4R-Vi8dsRvn zL=#eNoUx-i!5%@4>-1D)$E};@D-iF|)rJ|X^sN`XPmqbf8grg_2YuA0O@*ZpiFBB6 z6+2P6!r#3-Nw2jRx%K+9>ow}_VO~jFLGQEKWre11d%HCmJ}2=`FdsXA!8$Yh@S$~s zZ!waKDzBb3=~X&NQW_>DJXe`M@50NTqUSHjnvg~*I4*o5kDyn7qCJ*yXY-VB`9hRZU6Vn^H8a@2(Znzq=B{IrdV`8y& zspQjTafI6`o$oUZrI*NeHzQ_CbTmDOBQ<;Xw(b*0pfg zJcRuNJ7l#kRl~B<{agDLQov;L!@mV?5a7k1z>SR~ z0zsqriGPUL!)746ihHSC;~e(2Y_{!?;zL@n2m{z1GvTo z;9gKx7@|G^v;hr?8(LdhxzT?Yp5c250+j!$41z%8M-yy76H)*gZ)yC{#@q_wPZdW~ zYxQ4#MNs|%7~%GRk^XnYUih!Z5|I*BadQCpAP`IdT~n|(F|`LwL@yx>V*r3Yb4vhr zbff={OEUnb0&vmqkS_(>PkissCMjSDD*i^ueoZr3vU7dgM><{68bL~%U z{v*Eq3!3}Ow?7;Bk2?3~s?fjSTo@N8;9PD1)cptN{+{~&t8@S8of?)l4{aPQ|2P-7 zw0Ce6u`sm%)t!Eixt}>s*6=3@2ge`rr)uwH`h6wm`^S&ivovwE08#=w6ag~-*S|kY ze;gq`|JC%Tl8r8pN+5e>|`<_bv?cDKu!vEc4K;HW^pZ;@?vHwVbzkBS*@&M!y zkHKJ^|EkM=xaEga{%Y{Qp8cZxYboOF&ntf({Z94QQpDM>_b;kH&;O(aj{fTI--ojQ zxx0ac$^>KQpy1}__`9S6xZt;>@*i>c_qCUQ7*~OGf^av&iGLYbS^n*TmE}J(u>Q9U z^;4VwME3n|fPZGL|77<4Zl`}~Xl3Ex29hrjH2;u%zb~f!gRr8&3b>}F;opp{EdTb{ z%JO$(D-8P2rcErYu)m!)!PtO)z`_p9n_%p~>LNSqU*=7}6!@(x{3`m-bcw$mVgG32 zKkDUwd5mQNrcQ|WKRWp@Bdn#PgQBUu2;ABhZu5Q43K4-@!R=LmT@0o`cXqZkHdU4o z{=4PgpVL}k@5Zl{Ul^2)o8^y0EoBXC75U2&D?|e^wgOT?f1mqrKEiY$?E36=brtNX zww;Si`PCO`5)3tf>S+2)jkScC&3IhC^PtgsL;Gd()g-I*>TvtboGp)!{6iX*#}~_j z4gRTU1~TVc)4neW+h`4Bv7NCG)Z@uB`pI;Xng>E=3844Tc+uQn^+xuaM>5G8thC!= zf(iXeQ5w`1yOt}vi0?rijcQTDLs}yIri=FG_s5N~2*ErsUF6PogDxSs+Uf4;MtLA6 zb{d!&$=ImOIJ2hc;>7c4tQ9p#9y`$&1{;HY%^^ntZ`dka;Eh)rKkJet1QUwX6M6`$ z_3`KN*W>@66xKB`dMNn9W~EN?afd^YGG)M1elV}wpA^)v3>g&Z(0rK<9nm`vEF}fi zm;!Qz(!ij10fVIAp?u0q)oQ#1WG5rg3W2zbfow+5fy#)m=Jo$J6Z)-(V|DB%kKdC? zCr^ALlivUs{~wiIGwh;Bo*=-Wzz?FFaz-a;89y&9f-fmpW1>c3v_;v}p@e(|#2ew< z&wqo8EE!-ZSu^D)YJ22ew3c$JqJxY?(+bU*+!CVV0-So-cTvdX2O=;8f3kL=z)x++ zC^|FyHk=>?3V~v;zTu6+_&BYg=EdssScbw^6ddF@Nh*nIUK8ny1Wz{rQB%X;qJ-2h zM)+v~Et-y3=opwRFu71f*L;CN!vJ0nbeyrm!|NAuX!a6#(ag$^RpL$G+W>1$HDCNh zr|r9%9{^%iSdBA5Spb5lZk;V~QU}mr0#n^Jaq($;bON{cq$rhR=Y_o$rZvso0D%w{ z{H?J8ah=!MG{_M?ZvRlnIc&N}`EHAJNLUO?D%_cE<*>R&3({J*% z=%tX1kwb_(a>?@E3I#ooR&Gub$`Z3H47OyBq6~{6g5Ha=P|{s9OvWmc4_?CVHJO%TmB*UO_#?FQgl+a*1hi`$K@o-TIc!QL{E9wMjyy7m{2G7uu zLrB}`u^sPY`jck!qCwkH{MsW7iO}A~2ed>ClA-`A2^n=kucJ&!w;FVLWr_f-S-Ug3-Ju4R-wwkfBd^NaC)0+@Wjjpou;Eoy7ZNU0r#7HRZe zkZb0?0IG@Kae@%N&(_qw^Xvgq;6Zip)$+G71~|g&f}th$veVGt$BjF)GWl168C79`p$x z)EFI6DKHb-6%2%hDn^np->FvY8UDnP@_s_X7BdHZj39|i_a@pq(+o#40N{9@h1Mz3+oH>Wm|H76~MA%V?o?wT#$+IdneNqDG+YSd1=eaz8UPX0d)5 z%d1V88GCLp?`v)NEITRmHH_E5CIu~$IZgl1df!x}=Cvv4A}Hijxmf01jkvuEJm+*s zi&FX2*vFkk<>dU|j8_mZrE=*q#`xldd|dO+BA&2^TD;06osQ*|^%Q?}_tmxP`|(Ll z*4%d?q}SwBrCz)+8^>SOowaW8pnjS^UNUS0R1?T09u}x4E3vQ5peZ0)IC)FOy5!a; ziwX65=}XX1aCOUuh^pn7ix)bdYWwjP`KC)@gzmN-X0&oe*QyHxO3ONBb|KM-!A1Yu zbIgq`Ytr#9N26`^$2FqFQ*Zg4#j9q8Ax~8tbl-!Ou5M>&uu$t)6UCdnxV1KK>S)45 zB`&~zSeJK3fAaE7G(+yDL@;*Nls^HA^14~7x9J1UYgv@ypk&L$ItLf{dbdCxp+}8! z9c{(B0FSNW9T5B0;XvuVkBJHHQDKr0dx}Lr1AWvhn#IHiUN6i`i}pyf$#X84J0kPW zQfc8~2bSr4O8QEBa=of#P1@$6%*F>ETJ;Q-=4%j2nDKJ$H@?I#Q|~-!!}oT@!L4sW{Bx zLZwdO6oK64bUGKQ(Hx!5CVt@~mmY^6k;6Kf9WE6n{4(2WBljsAYb0*SuB@1$GpLX!EXs^< zhS=O2YzV?msJ7iolHZt;-b}D~e0-E#`ptdsK~z+@qWFFJ?7VNud8KVDcHk-8`R8nP zw{uC_7M^~)qklJm#D7QnuKs8>9^8C)h-W5#A=sqcia^Qh)qV*}Q#5Ug)=|mQECElYK-Sm8(&aNWO#07ouFsC+MLqnBmVKFpHM_EAQTweI*(+T!Z z!6Wg^0eKCM>M_cs_@#lfeQhlz4}5wS8+kx4vodu_CFpd$d*0{!+cL?&9vR`G<-Lde zB>ve^L_@YRSiiFNiQPawN$L_m*fDu1ANT*6_oFM4Fjr zVe!y+#n&J9_ABEA=uzDxq?GZ}!3VaHuQI(~&T=Qt)lqU6EY(+h=^U#JtFL&Y5hj@Z z_!6phi$vZ_*CyaoCi6|H4jg%WfXVRn$p7LSA=!0u|Wdt;L#7>n-b6)l57RYh0DESl-ckf)E(aa&O zFEKK32~Uz&Zn$+#mRw|cw~ih=?~5)Q<8}Ue8TRzp4d>(%@fJA-K}n^mw)kYauVXtl zBib1(1m#4V4C8)URF5z`U9ZsKM%BmhG?9mf?Bnb+OYewXIhcb(x)y=>^_Ds^{K-2c zn1s!2$|C>%)1=E>1+6#HxvvHdL_$l?RzDmK5A76YyulmBKfsj|l(M5g^;^)VIe)Oq zsYM>jx2PpQl!+nG864T>U#C?ywEz)2RO2|$npO$RDHqtn^Yq-|Q^Io8!g?LE(dN#2 zJxL(w<4}L~WijzV{E7&}%<}kizDLh-w^!`sgZfXO&03GGkq4Tb*SpE}Zn89}nAH?{ zmh^J=9yrGf6vrmYo$=si(D>KQ&XOzb=-k%-7`yJ~Nk__8P&sN^p+lm7h?eDrp<1@f zYWH4SC_W%AE*A7YN$5i+&#CTY)nwUZ19i1h_rc}OJ-O&d8r4x`KxTja{$W*(n&e(} z5BbtyHCt_JZj;7%Jl~_9>{q*A%>>4Jvo{$VHE2@Q+)Ez39zK&DmP|XIA%L`(Q1G73&NC5CaHMt__(zO>IS6~ zn#KESSf&-pq*l^Lk3NaRi6lj|I>bEsm9vf_k`HWHY6U|2%IxdM|DDq;L2mZqKpUzT95vy|3mYnx7(LyrSn+68OT~N*;JTwpn-< z@IaMmXV76Nnv_hSTuiK{#30>O9+2;oh>P zt;FUg(V+AjpAzsF%eiH(6F#{NvGI)a;L;q6eiARHw&y$z@pK9SJdFu2xwVQEVy+8E zew1E~6*HUNq{a;?3Z&Onh>?)hug9vDm1Bak%Al!q;dDJVoH)FOo%qh$5^*OX760Ay zvgSP81ruE_WDcqI+4aMWIHj(_W76oyBP!9gzA0|D1)Sfp+>y9-rG)dk2&wew!r%XS zeSOAf-r!jWFMj#a)<~+cf|x!UH|c|E`4({WrmxL`KDYZ`)1@29ru+-Z*aJhN653Ui z&MUGJ;VJL_TrT%A3oWd&@YGiKbsKWRXRET6PhQ@e>D}|vtM3gpcRS4~ARq0UFB(&l zsNJ27e^9R+Fe>St5_kORK)qut-il848Xd|BJeQtGQwZFbzQs*U0k;f`m7&t3H zV2ZvuH4)cf?wPpm^{qy^k-1`W&_Ik7i>O6z+)Cy&KTe_0Q*t4!>I-|IqNI1`W6I~R zgL@jJFZx8SY&u!1Gb00K*t_38IN*b3O`XrK)uz0^q^Y|j_9~CqS&nI8$@1M`{jH1I zB~zv`(*?PvSVqCE@tV}2qqiJ~+16X4pExNMQfqBX@5T?}%6b#C6eN2dsQP3&M}0boq;Gun=0S|5tJdJ;TurV>+La4Q@i7v=lAIX>H5Tcnv0?(LUWaU(`;zfJFGbk3FPvXMEMage*Fs zcbob-n9R0YbW{4~;!P(_rqerxjkLir_hJHKJmZD+r3Vtrv@!*A3csaZMa{vhA7L0d zZCnhbs>q>oRzs&HlKF)22H08J@N@+0p0Bn?;D6R@;&d)hau?kVaif-F2q(|7^a*t; zr;+tk*e6xHrgb#K_7*SrzL;mE2E^j@LD;s&B1-3UGCw)1ITR~-$vagKC##yTL2iDM ztyb!(8o`Vrd(6TebpQ1=a6Jx($vfKEy2aUdk2x?#(RQ`ttcgc5*e|lH3xRWQ` z?)A9ZzdvIB{I(S5tNStWPzWh?af3H}LovHui91{`(BLRCKlP)p#s;XAwbHC-K>eBjydda6(pAM8CSrheL7S}7R zoy(mB%f8;(v1hLpE(&(5j#XFKI}?+;dbuIAQel)`_ok4~Jp_{+-n7)nB`>{DqNK7jdta3l|EaMCVZ5* zaf5{X@teuArWa#`XEs7C-l^tBWbYG10v@P=pyvuPSNGF z2P>_DHyflX+zZh7Zg>-(=Fx2T`Mo(?qgLP;Ugp!K+zs-cmIx}kUi*dQ%yQ*17Yc~{ zkr8j6trpgs4f!G{hz)?MS{fOug~SOvYUWQJ(gdZRR#P>0_D;rJF|F$7=)K>=QmbZM zRPjQJ@V-C9sdVxH%qKNelQYe!Fc)s7ws>CQDTJPw>@V}+ZQFY3*+HRz|CvZU2+LbT zf7RdO4V;6%aF#vRKBM>=_byomkmo9R3tK@0^aipX$M@t%_LV4yvxPB+x!}DdT8?$k zY}m%tlBYhiQba@K8lugb5=KJfmRw(m=bRYmhBJDrQ$10bj>L>ce%qxI@=uvS`YXE@?-fEc>bUfk5u~ z`>bza_G(z%)(0hpd3TRYok}s8)zA|y-}R+v3Z9fIXx&I&Abt*sS~0pg^{M~i&S2p4 z^1L2xyjY%Kh)BQ!PSr<&-<@COvOSEFHs2QTP-#QlUt+dpYR7F zpN>ozmeO8ITP(`9n5V*~=RJ zj?t8bCbmRSo=|Ut=P4n3U=k`4Wztjcn=DpOS~kYw0vbzW*wwJkij@w92fhp= zD@hEPR!n?;`q&^MPXTl8%!#H=i&o(?vexIPH_jCVj!`J;yj;poH?c|RIBw9+2RmIV z+~vo`c~fa2Fd#nxsU1%UoXi8Z#dV zd2)-fdWP*<9;VuKjvrD?vu$gEN1w7))~+z9jnJFA<1`dUZO1<5#r)j6lkh-4CAO+a zNRygS1#8{(!ULFn(bNQ9Fq_!C-dg3X#dnunX?&5%VmV_#rLZN$^rXdk%)quqt*?Q1 zY&n~=NB&E3iMNx?z1U>3xIQw<@)t;Iy+P7md8#9=X@P3O z#7rM9QW!$o?C*!!#JWnTlYeNx9Vh*%I|)F`Ic2KPiKe<^J@SYvj`~)^(cMlNAXkR& z9z<1eX!Lt+uI;jxuTNhkd$^SKpPDeq)|V#?Q(3#Vi{_cHvp{y)Q1sZpk(s+>Z>Zz( z59jNRTZF1G_XXU%5zVd?{DFni9D*hn~jrC9UY0_xt8K)1%8CAB=9_Gc#)74CjNyCR(1*Khv0>Lo3W! z8*jGAdh*Z#&*AG1L;sr!E2j6Q%N=qKnCA)%`qHPVY?Eh5H4Dzk)*2)Cg#{vAVk7kJ zQufR^Jw)6w&hd=|!QOk^Xd1z=%{pHEG;i*>Z}}6T74BINxzEEIiZz;^ za%r?@z^Obijp4(2dhX%j61!jt-dgc!LO*V8Nzjh5sH4|gsqtBRd(wNvy+-Ils}+8Y zbBuR}2>`getA3cculU+Kg)kC3S7SU~bzZ^8A_m@74y{=+p3?8@44t{3`8>~(anHu% zr#(a$Kkk#8m}h{TJEU)j zULB37rx}-+Mt!>e&ef>HeBg%vu8n}56{EoELCC)iUku!UKP2E zy*fU_W-JWQJ{UHf@8JlN7++EfOfIkWnhsWS=v7symis^(e#8XdR3`I~n2e^sEc5Ts zwDoV;pK4{G4wv-+4>i^i4u)$(1vlIU^K<%q2ZUx)7*Sa(yIIBQu`s8WH-!38KFi}s zEe;lr?@rx5D_@%!7M{Ry;xEsEl8`@p;b?HOG@#5R+{9PK?RHhvSwU>Yy7rk6xS4i_ z-?9uZmECuyTR!QpCd+bk-Id?jy=K)C32D`>k9yu%>QRgL$aP+NHg>SPN9w~zH7tkj zOQLs=?Bq9&benU0mHjrRSw3;8W9==lTC^!xcyNkOZm8bGP{A!oil1f+gCQm-ZgrMijHujp z;V`GV%%;QSb34bnxzw@Ex4u$Hxya)UrfjVXNu?4sta6VIz+}%IIFct;PFTJOHgkXyBiEkYtb{Ifq z=sIuP5kQXa>mflP7s0lJC zL(!RNW4Jd!n8}Epy%FLYQ@=P}LJ8hzPB^j+#XLYQxZXzZL6u1Zf9vuD1C6&Vmp|1A znIEaB722DQLEoeEKVzMAvod&f(gnQ&Ww4FSubF};veLX9#p&bPmfX!CZwg*Kepx~c z?5uq*4`N=$<>IYrRl}A4J!1F$AfCZ;~*`12>SBg-SgW?2{?Qs;(x4Cn5&_C%Y292fKxu-su4 z5{)k|8@_ck=Lg&D@EBTc4~%9&!!M&17YD;&?u!ytAdX%~fuCY7y9`R6$%u$Scw+)>1)8jQmS-9x5k-I~Wo-*$EW{HTl9Dn%g z^KKnkIPDlN!kc_`<7MEz!ll#_#P(x^c^TmD|8&w z!NJ_Sc?Y$7OO8OXp3}f2z_5aFY3bvI?<{82R0>U|E4;ZIqs@fwLtok{QX3&f9jBDg z?zC?-eo&8mQVQ=rN)R287h`h6fpd+Gz8)z=nRXe!a!5DPWU_U&~e>9=1X4!Z0cI1L)HDtGk3? zOJEcYsWI<*7BU+HEZ45`N*$tvvjIkLpR6=)Z@29UX_!1n%Q-_5PX-)4w>b_oGOAr@ zpSC`eSH1*M%K>iPJ=y?rfv&yLHis8op|@}JJs@;kJ)Fan0J+LtQW|4b1)C)SZ_Cy5 z^NP!2C#H_o$<0U=ksIV-0>L<)PD*_bPqc0NSd(74~KahXS3R?c{d)6s_D=@(qzjphT`Sc9R`r;X1%9!D9T zTj)a0z$)6tbQ!&+^OH3GA9vNfP%pqVnsID()gRL@=`zldqDYej0QWqQPM*>>@1H)s zo_3w?(t#ZJh{0h6QPeNm%n+amiTH}jPx&E3zgjZ^`-lD~O!0$0(k7gY z&R-#A+x6xC?ITVszdr}?&!3;-v9PePv9WL5xPgO%gNuuchlhuck552AKuAbPL_~D+=1pQ^ViFP( zFc^I6)~(yOZ{N9d=kDFRq@<)|WMt&z={DJv_hsHmu_s;a4}sjI7NXlQ6^YHDd|X=`ii=;-L` z>OOk(NKa2sUtizAz`)SZ(8$Qh*x1;_#KhFp)XdDx+}zy4!ot$h^6}%xPo6xnva+(a zwzjdcfy3dpwzhV5cJ}u64h{~Ej*d=FPR`EGz%OOFy1Kf#xw*T$dw6(wdU|?!d3k$# z`}p|y`uh6$`8|F5)ZgDfARr(xFfb@6C^$Iy*|TRMAt9lmp+va+(XvvYECa&vR@^78WY^9u?J3JVL1ii%#ndR1IpTvAf<`t|G5($ccBvhwos zii(QL%F3#$s_N?MH*en5)YR10*1moF_T9U8b#-<1_4N%64ULVBO-)VB&CM+>Ev>Ds zZEbDs?d=^M9i5$>U0q$>-Q7JsJ-xlX@87@w@Zm#WU*E@%AN%|J2L=WP2M0fW`ZP2& zG(0>!GBWb{^XJjg(Xp|y@$vDAiHXU{$uD2NOifKqPfyRx%zXX&b#``kZfzJYinzJdwXYRXLomZZ*OmZfB)d%;PCM9 z=;-M9`1s`H$i-K(D)q1m}%e{6*2`t2E`f4UDE*tE|1dmrAMQi_@2Are!H zJ;miI9HuT^MYGa+$MZ((397Atb76p=eiP8W|06H1N>i;*5Tvh_OkqSQqD<1*QPp2^ z^)Z_BwHqayhr?QZHUJ6v@o(EF_HxMK-4$WCxKc z?f^N|W0s=>M4I;jmP8(2azJ&52g=w{ZA=(-q*8}t_7)0nuKZy7JQ`HDp z5kzFc3`iM1VlTJx6gjhXB7^R2CWwAn5j*PhZGZ|~(tuEGI08=w)~wh!+I|eQ*-TL< zy@7Py*Y7A1Xbx>$!-#|k)V6_Lt^#X@*2w^Z_-`PLgFW~SVL7O#0wAtIz!pN>{B%5C zB9!m}4S@N|XD4nu1)zDy6?f;>La>4Fx9=odcy$?|m0^9Od?Q~0YUz#9P$ZrMeZm>s z4sGnR{v?D1-u}`XMPP#_KZNp+(Bj8{+NFk+N1$uX^2P`WHpRV+ToAmgZfha<@CPLT zvO0qiN{t!XBJ4N5f@m$f{HIdRDBmjPwZewrSYKs3gU2pWg;Jg(2x3DKpZ+m`1%&*c z;%;mqnv@Hb-cZCY(^5ldR#`+)mkAmxcmSBHOvy0hks`=S$yv@5VT0m=lkpHZlYEny zZ}uyua&i=8O$~h`CN$Sl4g~eM$}XC;L0n~dF=HOgJdg7%D|x$${qs{?KZdB}~O-mW+< zezxW(VSA`VO_UeHU1&iVgMT9J(^rRJz1gF6I{ z{p6Lr9n6Kj34pxc(#1!?#L&nB+pZ?)A(n=Q78d%zLlY8nK_^(Eok(j2+`bGts#e>; zLfybX9k}T|vnmyABIqOp*dd%1bJkAx&X+b9IKIDY!*Qn7wJ&tnm~9AMZtx(YZS9tq zo(sw~J3r{HoD@@C`ev;rmx^PNW>r?>64t2YFBA)8x7=S=_vOm^fTEq+r>iPd)vY9q zEI-eF_~E?bQ=5*%3krBNomsY2}6vx&hz26Hia}t$46DX+i6iRa$JPd^Bfl zW)lUs~n}%j5!`KRMppb@rx69jaTz*c3j2@!+o>kw=!gOIkNc^|nns!xh{% zOGont-$w?2mAR|u9SY+9Ie*^Fmqi}ibM~f)CO^wwr<{JN;P-}jkD`oIf1;(FA8JgP zJ++5d^UZdXz!teAou)19hRYw{>rgmTZJz42q3v}AOR>afrccqg*j|_Zy0q+;v9|4M zy+d5-M~<&+uKBsPUqM&J^FV6!qMc=1bIjLdEzRrdk6j&}m3GuHk6~SM%9V*4Rv%ey z1!c-pGw!Z=5q8&bli~3bYkEw=uXh>*Np3ISFXGuIu%W}r+_u2i@Rh{P1<4-S*9Ap0 z%Ut(b{XOrgGR=WoGcW#HcHPVH_4i`u*zK?Q_UP4D{r`Wzp53p%f1llNTiKf5!A3u> z7(QE}bs>zw){oQeo|&E6iRRx7tm+ASuDae6e6l;RV#e$PkF3`Dgm>0(?KqJet)-}c zC**Cqji}boUF;h2_kF$i*xVM07Dzd++<5z5?xW{VHqBUYYLBF0i(<0n>YWu|%c_cv z)^E`$P!SS*WbxqS&a;WJ^Y-ohqkQ*uWH{>`=~HJD=Kh=YM1PUu0j@nF6PKQ`ICSzr z){FXof4+UXd-Ln}=hN-?oeP@pdPa4BS`YKYzX==@7Vm1vVTSe1LOV1q^p&)D*xZT`tox3cl*_g)Y{5rxk?PAZ+herr!fS(&iyUBx3dLW%!4E-e17^Ivg6C9iv&;K?a_0=VqH1aL5Y zytT!2dx)m^*%0eVQ}Ti|jD_?Bzb)J^R-4&3x2}CrqlMu?E2$_(yW2tU#4|XnzV+0* z{IJ@dTI3(5yE#tOe@@V0qq9*fb$Bmn7yrw;^DUf-yF>LrZ`E7jj~iEo-C{5*XT8n3 z^X%hK?VnfQkBj+RweHVS_gm&1?2STK!rrh>{9}2A^&`8-H9hg{ty}Kuwk@CNxM%)t z$M;<+VrSi?+!w0Fh<^H)vO92#xA2xlcc<*Se7}2zxrqMLJ#V7}zG|ks*7Q6*e8pZt zj>&Ph)5Yqi%BfEkynpR@AN=vjgzJhSK|dW9SR89n+{gLhBHK6fJxes}M2gr>`sMvv zvxh$`{*S{#_w4xKljk|U*E^(5lfhb4f{*%!?E-eqO-coJl~aHt5uj7RA?J4>pT+?e zf~f|d6&?*b?At&ScoYNpun&}N?_e>QYF9U4+3KcX1ljHnIxPgGvxp&)A(J5L-+ z6nsQ?JcAK~0T7!3NmB+x1`D7(h-U&MErEP9pr{2<4g!rB%z->pAPG{f$56qL%aEf9 zJzoUmkAl=>{ZKa>H{ke!fq}V^fq@xtm#mqkfq^NI52DSDp%}Pr-wcRBYCv+pQr`e5 z1)x+HLu2HVQ1FZuSs>R+n>VgMaW+uHTUYDcne&@Njjk961bLkG zKIeb(jQ93XEnUycTLU(2f4r&C$Md8Pqn78HLQfsfEt?BZ`s@Vp;%y=IthHnRX7oP%nIxdEnI%#BPi{9z6pcEiwXZi3+ta|=^o zenqvz!oUQW!qCKwKxcBJi5Y{+3^XxQ(3lCDn7IMEKMXC6G2+e0z{mhS&Vi$drs(lz zWNd1I?q(xnGthD0DE0!y%+bT%2$(yO)Rhz^0t<#B@C68IbFmW_7c64&JGzFfKZtCV{VrfTM1-M)+E=epZ Vfn*pX6GKxA;EfEbuKsSkTmb6uqc#8l literal 0 HcmV?d00001 diff --git a/server/storage/expense_claims/08f51e80-512e-498e-bcd6-50ca5d0becfc/62fe16f9-ad9f-4f96-948f-0b31a427a81d/2月20_武汉-上海.pdf.meta.json b/server/storage/expense_claims/08f51e80-512e-498e-bcd6-50ca5d0becfc/62fe16f9-ad9f-4f96-948f-0b31a427a81d/2月20_武汉-上海.pdf.meta.json new file mode 100644 index 0000000..496127b --- /dev/null +++ b/server/storage/expense_claims/08f51e80-512e-498e-bcd6-50ca5d0becfc/62fe16f9-ad9f-4f96-948f-0b31a427a81d/2月20_武汉-上海.pdf.meta.json @@ -0,0 +1,90 @@ +{ + "file_name": "2月20_武汉-上海.pdf", + "storage_key": "08f51e80-512e-498e-bcd6-50ca5d0becfc/62fe16f9-ad9f-4f96-948f-0b31a427a81d/2月20_武汉-上海.pdf", + "media_type": "application/pdf", + "size_bytes": 24995, + "uploaded_at": "2026-05-20T13:48:21.652497+00:00", + "previewable": true, + "preview_kind": "image", + "preview_storage_key": "08f51e80-512e-498e-bcd6-50ca5d0becfc/62fe16f9-ad9f-4f96-948f-0b31a427a81d/2月20_武汉-上海.preview.png", + "preview_media_type": "image/png", + "preview_file_name": "2月20_武汉-上海.preview.png", + "analysis": { + "severity": "medium", + "label": "中风险", + "headline": "AI提示:附件存在明显待整改项", + "summary": "当前附件可见部分内容,但金额、用途、日期或附件类型仍有缺失或不一致。", + "points": [ + "用途字段:用户填写用途“业务发生时间:2026-02-20 至 2026”与票据内容不一致,当前附件更像交通相关材料。" + ], + "suggestion": "建议根据风险点补齐清晰票据,或修正金额、日期、费用说明后再提交。" + }, + "document_info": { + "document_type": "train_ticket", + "document_type_label": "火车/高铁票", + "scene_code": "travel", + "scene_label": "差旅票据", + "fields": [ + { + "key": "amount", + "label": "金额", + "value": "354元" + }, + { + "key": "date", + "label": "日期", + "value": "2026-05-18" + }, + { + "key": "merchant_name", + "label": "商户", + "value": "中国铁路" + }, + { + "key": "invoice_number", + "label": "票据号码", + "value": "26429165800002785705" + }, + { + "key": "route", + "label": "行程", + "value": "武汉-上海" + } + ] + }, + "requirement_check": { + "matches": true, + "current_expense_type": "travel", + "current_expense_type_label": "差旅费", + "allowed_scene_labels": [ + "差旅" + ], + "allowed_document_type_labels": [ + "机票/航班行程单", + "火车/高铁票" + ], + "recognized_scene_code": "travel", + "recognized_scene_label": "差旅票据", + "recognized_document_type": "train_ticket", + "recognized_document_type_label": "火车/高铁票", + "mismatch_severity": "high", + "rule_code": "rule.expense.scene_submission_standard", + "rule_name": "报销场景提交与附件标准", + "message": "当前费用项目为差旅费,已识别为火车/高铁票,符合当前差旅费场景的附件要求。" + }, + "ocr_status": "recognized", + "ocr_error": "", + "ocr_text": "电子发票\n(铁路电子客票)\n州\n国家税务总局\n发票号码:26429165800002785705\n湖北省税务局\n开票日期:2026年05月18日\n武汉站\n上海虹桥站\nG458\nWuhan\nShanghaihongqiao\n2026年02月20日\n07:55开\n06车01B号\n二等座\n票价:¥354.00\n4201061987****1615\n曹笑竹\n电子客票号:6580061086021391007342026\n购买方名称:曹笑竹\n统一社会信用代码:\n买票请到12306发货请到95306\n中国铁路祝您旅途愉快", + "ocr_summary": "电子发票;(铁路电子客票);州", + "ocr_avg_score": 0.9580968717734019, + "ocr_line_count": 24, + "ocr_classification_source": "rule", + "ocr_classification_confidence": 0.88, + "ocr_classification_evidence": [ + "铁路电子客票", + "电子客票", + "铁路", + "二等座" + ], + "ocr_warnings": [] +} \ No newline at end of file diff --git a/server/storage/expense_claims/08f51e80-512e-498e-bcd6-50ca5d0becfc/62fe16f9-ad9f-4f96-948f-0b31a427a81d/2月20_武汉-上海.preview.png b/server/storage/expense_claims/08f51e80-512e-498e-bcd6-50ca5d0becfc/62fe16f9-ad9f-4f96-948f-0b31a427a81d/2月20_武汉-上海.preview.png new file mode 100644 index 0000000000000000000000000000000000000000..0bdfb91ed399259b563c3e3570ff1bb0bffb6348 GIT binary patch literal 136681 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 zл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

RS_$qKD#Z?SU+5P&t+%29Me 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 z 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 PK3lRG@BRM^Qx!D! literal 0 HcmV?d00001 diff --git a/server/storage/knowledge/.index.json b/server/storage/knowledge/.index.json index 9e38834..4f7185f 100644 --- a/server/storage/knowledge/.index.json +++ b/server/storage/knowledge/.index.json @@ -20,7 +20,7 @@ "ingest_document_name": "远光《公司支出管理办法(2024)》.pdf", "ingest_document_updated_at": "2026-05-17T09:28:28.999515+00:00", "ingest_document_sha256": "67a74538bce0dec71ccbb947256cc2c9c0e672d148de49406b967ae1379dbece", - "ingest_agent_run_id": "run_8b0ead1e3c734a53" + "ingest_agent_run_id": "run_3a0b0ecb941b4c8e" }, { "id": "a8f8465df08e455ebe133351721d49f8", @@ -36,12 +36,12 @@ "uploaded_by": "admin", "version_number": 1, "ingest_status": 4, - "ingest_status_updated_at": "2026-05-19T16:00:57.418443+00:00", + "ingest_status_updated_at": "2026-05-20T16:00:02.515903+00:00", "ingest_completed_at": "", "ingest_document_name": "", "ingest_document_updated_at": "", "ingest_document_sha256": "", - "ingest_agent_run_id": "run_57f2d8727aaa4374" + "ingest_agent_run_id": "run_3a0b0ecb941b4c8e" } ] } \ No newline at end of file diff --git a/server/tests/test_agent_asset_service.py b/server/tests/test_agent_asset_service.py index caf0ff4..a5b75fc 100644 --- a/server/tests/test_agent_asset_service.py +++ b/server/tests/test_agent_asset_service.py @@ -7,7 +7,7 @@ from pathlib import Path import pytest from openpyxl import Workbook, load_workbook -from sqlalchemy import create_engine +from sqlalchemy import create_engine, select from sqlalchemy.orm import Session, sessionmaker from sqlalchemy.pool import StaticPool @@ -24,11 +24,14 @@ from app.core.agent_enums import ( ) from app.core.config import SERVER_DIR from app.db.base import Base +from app.models.agent_asset import AgentAsset +from app.models.employee import Employee from app.schemas.agent_asset import ( AgentAssetCreate, AgentAssetReviewCreate, AgentAssetVersionCreate, ) +from app.schemas.reimbursement import TravelReimbursementCalculatorRequest from app.services.agent_asset_spreadsheet import ( COMPANY_COMMUNICATION_EXPENSE_RULE_CODE, COMPANY_COMMUNICATION_EXPENSE_RULE_FILENAME, @@ -41,6 +44,7 @@ from app.services.agent_runs import AgentRunService from app.services.audit import AuditLogService from app.services.expense_rule_runtime import ExpenseRuleRuntimeService from app.services.settings import OnlyOfficeRuntimeConfig +from app.services.travel_reimbursement_calculator import TravelReimbursementCalculatorService @pytest.fixture(autouse=True) @@ -618,6 +622,126 @@ def test_agent_asset_service_returns_travel_policy_rule_detail() -> None: assert "住宿标准、飞机舱位和火车席别" in str(detail.current_version_content) +def test_expense_rule_runtime_reads_amount_standards_from_travel_spreadsheet() -> None: + with build_session() as db: + AgentAssetService(db).list_assets(asset_type=AgentAssetType.RULE.value) + travel_spreadsheet_rule = db.scalar( + select(AgentAsset).where(AgentAsset.code == COMPANY_TRAVEL_EXPENSE_RULE_CODE) + ) + assert travel_spreadsheet_rule is not None + travel_spreadsheet_rule.status = AgentAssetStatus.REVIEW.value + db.commit() + + catalog = ExpenseRuleRuntimeService(db).load_catalog() + + assert catalog.travel_policy is not None + assert catalog.travel_policy.standard_rule_code == COMPANY_TRAVEL_EXPENSE_RULE_CODE + assert catalog.travel_policy.standard_rule_name == "公司差旅费报销规则" + assert catalog.travel_policy.hotel_city_limits["北京"]["mid"] == 450 + assert catalog.travel_policy.hotel_city_limits["北京"]["junior"] == 450 + assert catalog.travel_policy.hotel_city_limits["北京"]["manager"] == 500 + assert catalog.travel_policy.allowance_limits["meal"]["直辖市/特区"] == 65 + assert catalog.travel_policy.allowance_limits["meal"]["其他地区"] == 55 + assert catalog.travel_policy.allowance_limits["total"]["其他地区"] == 90 + assert catalog.travel_policy.transport_limits["senior"]["flight"] == 1 + assert catalog.travel_policy.transport_limits["executive"]["train"] == 1 + + +def test_travel_reimbursement_calculator_uses_finance_spreadsheet_amounts() -> None: + with build_session() as db: + db.add( + Employee( + employee_no="E9001", + name="测试员工", + email="traveler@example.com", + position="产品经理", + grade="P4", + ) + ) + db.commit() + + result = TravelReimbursementCalculatorService(db).calculate( + TravelReimbursementCalculatorRequest(days=3, location="北京市朝阳区"), + CurrentUserContext( + username="traveler@example.com", + name="测试员工", + role_codes=[], + is_admin=False, + ), + ) + + assert result.rule_name == "公司差旅费报销规则" + assert result.grade == "P4" + assert result.grade_band == "mid" + assert result.matched_city == "北京" + assert result.hotel_rate == 450 + assert result.hotel_amount == 1350 + assert result.allowance_region == "直辖市/特区" + assert result.total_allowance_rate == 100 + assert result.allowance_amount == 300 + assert result.total_amount == 1650 + assert "住宿 450.00 × 3 天 + 补贴 100.00 × 3 天 = 1650.00" == result.formula_text + assert "参考可报销总金额为 1650.00 元" in result.summary_text + + +def test_travel_reimbursement_calculator_uses_other_region_for_known_unlisted_location() -> None: + with build_session() as db: + db.add( + Employee( + employee_no="E9002", + name="其他地区员工", + email="other-region@example.com", + position="产品经理", + grade="P4", + ) + ) + db.commit() + + result = TravelReimbursementCalculatorService(db).calculate( + TravelReimbursementCalculatorRequest(days=2, location="吉林延边"), + CurrentUserContext( + username="other-region@example.com", + name="其他地区员工", + role_codes=[], + is_admin=False, + ), + ) + + assert result.matched_city == "延边(其他地区)" + assert result.city_tier == "tier_3" + assert result.hotel_rate == 380 + assert result.hotel_amount == 760 + assert result.allowance_region == "其他地区" + assert result.total_allowance_rate == 90 + assert result.allowance_amount == 180 + assert result.total_amount == 940 + + +def test_travel_reimbursement_calculator_rejects_unrecognized_location() -> None: + with build_session() as db: + db.add( + Employee( + employee_no="E9003", + name="无效地点员工", + email="invalid-location@example.com", + position="产品经理", + grade="P4", + ) + ) + db.commit() + + with pytest.raises(ValueError, match="未识别为有效出差地区"): + TravelReimbursementCalculatorService(db).calculate( + TravelReimbursementCalculatorRequest(days=2, location="背景"), + CurrentUserContext( + username="invalid-location@example.com", + name="无效地点员工", + role_codes=[], + is_admin=False, + ), + ) + + def test_agent_run_service_lists_seeded_trace_data() -> None: with build_session() as db: service = AgentRunService(db) diff --git a/server/tests/test_document_intelligence.py b/server/tests/test_document_intelligence.py index 69c4b26..514c644 100644 --- a/server/tests/test_document_intelligence.py +++ b/server/tests/test_document_intelligence.py @@ -51,6 +51,27 @@ def test_document_intelligence_extracts_larger_decimal_amount_from_multiple_cand assert any(field.label == "金额" and field.value == "13.4元" for field in insight.fields) +def test_document_intelligence_prefers_train_ticket_for_railway_e_ticket_invoice_text() -> None: + insight = build_document_insight( + filename="铁路电子客票.pdf", + summary="电子发票(铁路电子客票)", + text=( + "电子发票(铁路电子客票)\n" + "发票号码:26319166100006175398\n" + "上海虹桥站\n" + "武汉站\n" + "G456\n" + "二等座\n" + "票价:¥354.00" + ), + ) + + assert insight.document_type == "train_ticket" + assert insight.document_type_label == "火车/高铁票" + assert insight.scene_code == "travel" + assert any(field.label == "金额" and field.value == "354元" for field in insight.fields) + + def test_document_intelligence_service_keeps_rule_fields_without_model_correction() -> None: engine = create_engine( "sqlite+pysqlite:///:memory:", diff --git a/server/tests/test_expense_claim_service.py b/server/tests/test_expense_claim_service.py index beedf1d..2f25967 100644 --- a/server/tests/test_expense_claim_service.py +++ b/server/tests/test_expense_claim_service.py @@ -16,6 +16,7 @@ from app.models.organization import OrganizationUnit from app.schemas.ontology import OntologyParseRequest from app.schemas.ocr import OcrRecognizeBatchRead, OcrRecognizeDocumentRead from app.schemas.reimbursement import ExpenseClaimItemCreate, ExpenseClaimItemUpdate +from app.services.agent_conversations import AgentConversationService from app.services.expense_claims import ExpenseClaimService from app.services.ontology import SemanticOntologyService from app.services.ocr import OcrService @@ -722,6 +723,82 @@ def test_update_claim_item_reanalyzes_existing_attachment(monkeypatch, tmp_path) assert any("附件类型要求" in point for point in refreshed_meta["analysis"]["points"]) +def test_upload_train_ticket_attachment_backfills_item_amount(monkeypatch, tmp_path) -> None: + current_user = CurrentUserContext( + username="emp-1", + name="张三", + role_codes=[], + is_admin=False, + ) + + def fake_recognize( + self, + files: list[tuple[str, bytes, str | None]], + ) -> OcrRecognizeBatchRead: + return OcrRecognizeBatchRead( + total_file_count=1, + success_count=1, + documents=[ + OcrRecognizeDocumentRead( + filename="train-ticket.png", + media_type="image/png", + text="中国铁路电子客票 广州南-北京南 二等座 票价:¥354.00", + summary="铁路电子客票,票价 354 元。", + avg_score=0.98, + line_count=1, + page_count=1, + document_type="train_ticket", + document_type_label="火车/高铁票", + scene_code="travel", + scene_label="差旅费", + document_fields=[ + {"key": "fare", "label": "票价", "value": "¥354.00"}, + ], + ) + ], + ) + + monkeypatch.setattr(OcrService, "recognize_files", fake_recognize) + monkeypatch.setattr(ExpenseClaimService, "_get_attachment_storage_root", lambda self: tmp_path) + + with build_session() as db: + claim = build_claim(expense_type="travel", location="北京") + claim.amount = Decimal("0.00") + claim.invoice_count = 0 + claim.items[0].item_amount = Decimal("0.00") + claim.items[0].invoice_id = None + db.add(claim) + db.commit() + + service = ExpenseClaimService(db) + updated = service.upload_claim_item_attachment( + claim_id=claim.id, + item_id=claim.items[0].id, + filename="train-ticket.png", + content=b"fake-image-bytes", + media_type="image/png", + current_user=current_user, + ) + + assert updated is not None + assert updated["item_amount"] == Decimal("354.00") + assert updated["claim_amount"] == Decimal("354.00") + db.refresh(claim) + assert claim.items[0].item_amount == Decimal("354.00") + assert claim.amount == Decimal("354.00") + uploaded_meta = service.get_claim_item_attachment_meta( + claim_id=claim.id, + item_id=claim.items[0].id, + current_user=current_user, + ) + assert uploaded_meta is not None + assert uploaded_meta["document_info"]["document_type"] == "train_ticket" + assert any( + field["label"] == "票价" and field["value"] == "¥354.00" + for field in uploaded_meta["document_info"]["fields"] + ) + + def test_delete_claim_item_removes_row_and_attachment_files(monkeypatch, tmp_path) -> None: current_user = CurrentUserContext( username="emp-1", @@ -1502,7 +1579,7 @@ def test_list_claims_allows_executive_to_view_all_records() -> None: assert {claim.claim_no for claim in claims} == {"EXP-EXE-101", "EXP-EXE-102"} -def test_privileged_user_can_return_and_delete_submitted_claim() -> None: +def test_finance_can_return_but_cannot_delete_submitted_claim() -> None: current_user = CurrentUserContext( username="finance@example.com", name="财务", @@ -1545,10 +1622,46 @@ def test_privileged_user_can_return_and_delete_submitted_claim() -> None: for flag in returned.risk_flags_json ) - deleted = service.delete_claim(claim_id, current_user) + with pytest.raises(ValueError, match="只有高级管理人员可以删除"): + service.delete_claim(claim_id, current_user) + + assert db.get(ExpenseClaim, claim_id) is not None + + +def test_executive_can_delete_submitted_claim() -> None: + current_user = CurrentUserContext( + username="executive-delete@example.com", + name="高管", + role_codes=["executive"], + is_admin=False, + ) + + with build_session() as db: + claim = ExpenseClaim( + claim_no="EXP-DEL-EXEC-101", + employee_name="张三", + department_name="市场部", + project_code="PRJ-A", + expense_type="travel", + reason="差旅报销", + location="上海", + amount=Decimal("120.00"), + currency="CNY", + invoice_count=1, + occurred_at=datetime(2026, 5, 11, 9, 0, tzinfo=UTC), + submitted_at=datetime(2026, 5, 11, 10, 0, tzinfo=UTC), + status="submitted", + approval_stage="财务审批", + risk_flags_json=[], + ) + db.add(claim) + db.commit() + claim_id = claim.id + + deleted = ExpenseClaimService(db).delete_claim(claim_id, current_user) assert deleted is not None - assert deleted.claim_no == "EXP-RET-101" + assert deleted.claim_no == "EXP-DEL-EXEC-101" assert db.get(ExpenseClaim, claim_id) is None @@ -1675,6 +1788,56 @@ def test_direct_manager_can_approve_subordinate_claim_to_finance_review() -> Non ) +def test_finance_can_approve_claim_to_archive_stage() -> None: + current_user = CurrentUserContext( + username="finance-approve@example.com", + name="财务复核", + role_codes=["finance"], + is_admin=False, + ) + + with build_session() as db: + claim = ExpenseClaim( + claim_no="EXP-FIN-APP-201", + employee_name="张三", + department_name="市场部", + project_code="PRJ-A", + expense_type="transport", + reason="交通报销", + location="上海", + amount=Decimal("66.00"), + currency="CNY", + invoice_count=1, + occurred_at=datetime(2026, 5, 12, 9, 0, tzinfo=UTC), + submitted_at=datetime(2026, 5, 12, 10, 0, tzinfo=UTC), + status="submitted", + approval_stage="财务审批", + risk_flags_json=[], + ) + db.add(claim) + db.commit() + claim_id = claim.id + + approved = ExpenseClaimService(db).approve_claim( + claim_id, + current_user, + opinion="票据与明细一致,同意入账。", + ) + + assert approved is not None + assert approved.status == "approved" + assert approved.approval_stage == "归档入账" + assert any( + isinstance(flag, dict) + and flag.get("source") == "finance_approval" + and flag.get("event_type") == "expense_claim_finance_approval" + and flag.get("opinion") == "票据与明细一致,同意入账。" + and flag.get("previous_approval_stage") == "财务审批" + and flag.get("next_approval_stage") == "归档入账" + for flag in approved.risk_flags_json + ) + + def test_return_claim_rejects_already_returned_claim_without_adding_event() -> None: current_user = CurrentUserContext( username="finance-returned@example.com", @@ -1836,6 +1999,16 @@ def test_submit_returned_claim_preserves_manual_return_events() -> None: claim.risk_flags_json = [return_flag] db.add_all([manager, employee, claim]) db.commit() + conversation = AgentConversationService(db).get_or_create_conversation( + conversation_id=None, + user_id=current_user.username, + source="user_message", + context_json={ + "session_type": "expense", + "draft_claim_id": claim.id, + }, + ) + conversation_id = conversation.conversation_id submitted = ExpenseClaimService(db).submit_claim(claim.id, current_user) @@ -1848,6 +2021,7 @@ def test_submit_returned_claim_preserves_manual_return_events() -> None: and flag.get("return_event_id") == "return-event-submit" for flag in list(submitted.risk_flags_json or []) ) + assert AgentConversationService(db).get_conversation(conversation_id) is None def test_manager_personal_claims_exclude_subordinate_pending_approval_claims() -> None: @@ -2001,3 +2175,57 @@ def test_list_approval_claims_allows_direct_manager_to_view_pending_claims_for_a assert len(claims) == 1 assert claims[0].claim_no == "EXP-MGR-201" + + +def test_list_approval_claims_limits_finance_to_finance_stage_claims() -> None: + current_user = CurrentUserContext( + username="finance-approval-list@example.com", + name="财务", + role_codes=["finance"], + is_admin=False, + ) + + with build_session() as db: + db.add_all( + [ + ExpenseClaim( + claim_no="EXP-FIN-LIST-201", + employee_name="张三", + department_name="市场部", + project_code="PRJ-FIN", + expense_type="transport", + reason="直属领导待审", + location="上海", + amount=Decimal("66.00"), + currency="CNY", + invoice_count=1, + occurred_at=datetime(2026, 5, 12, 9, 0, tzinfo=UTC), + submitted_at=datetime(2026, 5, 12, 10, 0, tzinfo=UTC), + status="submitted", + approval_stage="直属领导审批", + risk_flags_json=[], + ), + ExpenseClaim( + claim_no="EXP-FIN-LIST-202", + employee_name="李四", + department_name="销售部", + project_code="PRJ-FIN", + expense_type="meal", + reason="财务待审", + location="杭州", + amount=Decimal("188.00"), + currency="CNY", + invoice_count=1, + occurred_at=datetime(2026, 5, 12, 12, 0, tzinfo=UTC), + submitted_at=datetime(2026, 5, 12, 13, 0, tzinfo=UTC), + status="submitted", + approval_stage="财务审批", + risk_flags_json=[], + ), + ] + ) + db.commit() + + claims = ExpenseClaimService(db).list_approval_claims(current_user) + + assert [claim.claim_no for claim in claims] == ["EXP-FIN-LIST-202"] diff --git a/server/tests/test_ocr_service.py b/server/tests/test_ocr_service.py index 8141050..0717b8d 100644 --- a/server/tests/test_ocr_service.py +++ b/server/tests/test_ocr_service.py @@ -177,3 +177,80 @@ def test_ocr_service_converts_pdf_to_images_and_returns_image_preview( assert any(field.label == "车次/航班" and field.value == "G1234" for field in recognized.document_fields) assert recognized.lines[0].page_index == 0 assert recognized.lines[1].page_index == 1 + + +def test_ocr_service_prefers_pdf_text_layer_when_rendered_ocr_is_placeholder_heavy( + monkeypatch, + tmp_path: Path, +) -> None: + def fake_convert_pdf_to_images(self, *, pdf_path: Path, output_dir: Path) -> list[Path]: + page = output_dir / "page-1.png" + page.write_bytes(b"fake-page") + return [page] + + def fake_invoke_worker( + self, + *, + python_bin: str, + worker_path: str, + input_paths: list[Path], + ) -> dict: + return { + "engine": "paddleocr_mobile", + "model": "PP-OCRv5_mobile", + "documents": [ + { + "input_path": str(input_paths[0]), + "engine": "paddleocr_mobile", + "model": "PP-OCRv5_mobile", + "text": "□□□□□□\n□□□□:26319166100006175398\nG456\n□□:□354.00", + "summary": "□□□□□□;□□□□:26319166100006175398", + "avg_score": 0.88, + "line_count": 4, + "page_count": 1, + "warnings": [], + "lines": [ + { + "text": "□□□□□□", + "score": 0.88, + "box": [[1, 2], [10, 2], [10, 8], [1, 8]], + } + ], + } + ], + } + + monkeypatch.setenv("STORAGE_ROOT_DIR", str(tmp_path / "storage")) + monkeypatch.setattr(OcrService, "_resolve_python_bin", lambda self: "python") + monkeypatch.setattr(OcrService, "_resolve_worker_path", lambda self: "worker.py") + monkeypatch.setattr(OcrService, "_convert_pdf_to_images", fake_convert_pdf_to_images) + monkeypatch.setattr(OcrService, "_invoke_worker", fake_invoke_worker) + monkeypatch.setattr( + OcrService, + "_extract_pdf_text_layer", + lambda self, pdf_path: ( + "电子发票(铁路电子客票)\n" + "发票号码:26319166100006175398\n" + "上海虹桥站\n" + "武汉站\n" + "G456\n" + "票价:¥354.00" + ), + ) + get_settings.cache_clear() + try: + result = OcrService().recognize_files( + [ + ("train-ticket.pdf", b"%PDF-1.4 fake", "application/pdf"), + ] + ) + finally: + get_settings.cache_clear() + + recognized = result.documents[0] + assert "电子发票(铁路电子客票)" in recognized.text + assert "上海虹桥站" in recognized.text + assert "□□□□" not in recognized.summary + assert recognized.document_type == "train_ticket" + assert recognized.preview_kind == "" + assert recognized.preview_data_url == "" diff --git a/server/tests/test_orchestrator_review_flow.py b/server/tests/test_orchestrator_review_flow.py index fdbc00f..3969803 100644 --- a/server/tests/test_orchestrator_review_flow.py +++ b/server/tests/test_orchestrator_review_flow.py @@ -11,6 +11,7 @@ from app.db.base import Base from app.models.employee import Employee from app.models.financial_record import ExpenseClaim, ExpenseClaimItem from app.schemas.orchestrator import OrchestratorRequest +from app.services.agent_conversations import AgentConversationService from app.services.orchestrator import OrchestratorService @@ -96,6 +97,8 @@ def test_review_next_step_run_submits_existing_claim_and_returns_draft_payload( assert claim.status == "submitted" assert claim.approval_stage == "直属领导审批" assert claim.submitted_at is not None + assert response.conversation_id + assert AgentConversationService(db).get_conversation(response.conversation_id) is None def test_review_next_step_blocked_returns_reasons_and_removes_next_step_action( @@ -165,6 +168,8 @@ def test_review_next_step_blocked_returns_reasons_and_removes_next_step_action( assert response.status == "succeeded" assert result["draft_payload"]["status"] == "draft" + assert response.conversation_id + assert AgentConversationService(db).get_conversation(response.conversation_id) is not None assert "AI预审暂未通过" in result["answer"] assert "所属部门未完善" in result["answer"] assert "next_step" not in actions diff --git a/server/tests/test_reimbursement_endpoints.py b/server/tests/test_reimbursement_endpoints.py index 5693478..b5138db 100644 --- a/server/tests/test_reimbursement_endpoints.py +++ b/server/tests/test_reimbursement_endpoints.py @@ -345,9 +345,17 @@ def test_approve_claim_endpoint_routes_direct_manager_claim_to_finance_review() assert any( item["source"] == "manual_approval" and item["opinion"] == "情况属实,同意报销。" + and item["operator"] == "李经理" and item["next_approval_stage"] == "财务审批" for item in payload["risk_flags_json"] ) + approval_events = [ + item + for item in payload["risk_flags_json"] + if item["source"] == "manual_approval" + ] + assert approval_events[0]["operator"] == "李经理" + assert "manager-approve-api@example.com" not in approval_events[0]["message"] def test_claim_item_pdf_attachment_preview_returns_generated_image(monkeypatch, tmp_path) -> None: diff --git a/server/tests/test_user_agent_service.py b/server/tests/test_user_agent_service.py index 70c3afd..d407c9a 100644 --- a/server/tests/test_user_agent_service.py +++ b/server/tests/test_user_agent_service.py @@ -1,16 +1,21 @@ -from __future__ import annotations - -from datetime import UTC, datetime, timedelta - -from sqlalchemy import create_engine -from sqlalchemy.orm import Session, sessionmaker -from sqlalchemy.pool import StaticPool - -from app.db.base import Base -from app.schemas.ontology import OntologyParseRequest -from app.schemas.user_agent import UserAgentRequest -from app.services.ontology import SemanticOntologyService -from app.services.user_agent import UserAgentService +from __future__ import annotations + +from datetime import UTC, datetime, timedelta +from decimal import Decimal + +from sqlalchemy import create_engine +from sqlalchemy.orm import Session, sessionmaker +from sqlalchemy.pool import StaticPool + +from app.db.base import Base +from app.models.employee import Employee +from app.models.financial_record import ExpenseClaim +from app.core.agent_enums import AgentAssetType +from app.schemas.ontology import OntologyParseRequest +from app.schemas.user_agent import UserAgentCitation, UserAgentRequest, UserAgentReviewRiskBrief +from app.services.agent_assets import AgentAssetService +from app.services.ontology import SemanticOntologyService +from app.services.user_agent import UserAgentService def build_session_factory() -> sessionmaker[Session]: @@ -1096,11 +1101,11 @@ def test_user_agent_prefers_larger_decimal_amount_from_ocr_text_candidates() -> assert slot_map["amount"].value == "13.40元" -def test_user_agent_review_payload_keeps_document_preview_data() -> None: - session_factory = build_session_factory() - with session_factory() as db: - ontology = SemanticOntologyService(db).parse( - OntologyParseRequest( +def test_user_agent_review_payload_keeps_document_preview_data() -> None: + session_factory = build_session_factory() + with session_factory() as db: + ontology = SemanticOntologyService(db).parse( + OntologyParseRequest( query="我上传了打车票据,帮我生成报销草稿", user_id="pytest", context_json={ @@ -1147,15 +1152,465 @@ def test_user_agent_review_payload_keeps_document_preview_data() -> None: ) assert response.review_payload is not None - assert response.review_payload.document_cards[0].preview_kind == "image" - assert response.review_payload.document_cards[0].preview_data_url.startswith("data:image/png;base64,") - - -def test_user_agent_prompts_existing_draft_association_choice_for_multi_documents() -> None: - session_factory = build_session_factory() - with session_factory() as db: - ontology = SemanticOntologyService(db).parse( - OntologyParseRequest( + assert response.review_payload.document_cards[0].preview_kind == "image" + assert response.review_payload.document_cards[0].preview_data_url.startswith("data:image/png;base64,") + + +def test_user_agent_review_payload_prechecks_travel_receipts_against_policy_and_hides_old_briefs( + monkeypatch, +) -> None: + session_factory = build_session_factory() + with session_factory() as db: + employee = Employee( + employee_no="E-TRAVEL-001", + name="张三", + email="pytest-travel@example.com", + position="实施顾问", + grade="P4", + ) + db.add(employee) + db.flush() + db.add( + ExpenseClaim( + claim_no="EXP-HISTORY-001", + employee_id=employee.id, + employee_name=employee.name, + department_name="交付部", + expense_type="travel", + reason="历史差旅记录", + location="北京", + amount=Decimal("680.00"), + invoice_count=1, + occurred_at=datetime.now(UTC) - timedelta(days=7), + status="draft", + risk_flags_json=[{"label": "历史风险"}], + ) + ) + db.commit() + + query = "我去北京出差住酒店,上传了北京酒店发票,帮我生成差旅费报销草稿" + context = { + "name": "张三", + "attachment_names": ["北京酒店发票.png"], + "attachment_count": 1, + "ocr_documents": [ + { + "filename": "北京酒店发票.png", + "document_type": "hotel_invoice", + "summary": "北京中心酒店 住宿 1 晚 金额 680 元", + "text": "北京中心酒店 住宿 1 晚 金额 680 元", + "avg_score": 0.96, + "document_fields": [ + {"key": "amount", "label": "金额", "value": "680"}, + {"key": "merchant", "label": "酒店", "value": "北京中心酒店"}, + ], + "warnings": [], + } + ], + } + ontology = SemanticOntologyService(db).parse( + OntologyParseRequest( + query=query, + user_id="pytest-travel@example.com", + context_json=context, + ) + ) + service = UserAgentService(db) + monkeypatch.setattr( + service, + "_build_citations", + lambda payload: [ + UserAgentCitation( + source_type="rule", + code="rule.expense.travel_risk_control_standard", + title="差旅报销风险管控制度", + version="v1.1.0", + excerpt="住宿费按职级和城市分级限额执行。", + ) + ], + ) + + response = service.respond( + UserAgentRequest( + run_id=ontology.run_id, + user_id="pytest-travel@example.com", + message=query, + ontology=ontology, + context_json=context, + tool_payload={"draft_only": True}, + ) + ) + + assert response.review_payload is not None + titles = [item.title for item in response.review_payload.risk_briefs] + assert "历史报销画像" not in titles + assert "制度注意事项" not in titles + hotel_brief = next(item for item in response.review_payload.risk_briefs if "住宿超标" in item.title) + combined = f"{hotel_brief.title}\n{hotel_brief.content}\n{hotel_brief.detail}\n{hotel_brief.suggestion}" + assert "北京酒店发票.png" in combined + assert "P4-P5" in combined + assert "680.00" in combined + assert "450.00" in combined + assert "公司差旅费报销规则" in combined + assert "补充超标说明" in combined + slot_map = {item.key: item for item in response.review_payload.slot_cards} + assert slot_map["merchant_name"].value == "北京中心酒店" + + +def test_user_agent_review_payload_prefers_hotel_invoice_for_hotel_name() -> None: + session_factory = build_session_factory() + with session_factory() as db: + query = "我去北京出差,上传了火车票和酒店发票,帮我生成差旅费报销草稿" + context = { + "name": "张三", + "attachment_names": ["北京南站火车票.png", "北京中心酒店发票.png"], + "attachment_count": 2, + "ocr_documents": [ + { + "filename": "北京南站火车票.png", + "document_type": "train_ticket", + "summary": "广州南至北京南 高铁二等座 金额 560 元", + "text": "广州南至北京南 高铁二等座 金额 560 元", + "avg_score": 0.95, + "document_fields": [ + {"key": "amount", "label": "金额", "value": "560"}, + ], + "warnings": [], + }, + { + "filename": "北京中心酒店发票.png", + "document_type": "hotel_invoice", + "summary": "北京中心酒店 住宿 1 晚 金额 450 元", + "text": "北京中心酒店 住宿 1 晚 金额 450 元", + "avg_score": 0.96, + "document_fields": [ + {"key": "amount", "label": "金额", "value": "450"}, + {"key": "merchant", "label": "酒店名称", "value": "北京中心酒店"}, + ], + "warnings": [], + }, + ], + } + ontology = SemanticOntologyService(db).parse( + OntologyParseRequest( + query=query, + user_id="pytest-travel-hotel-name@example.com", + context_json=context, + ) + ) + + response = UserAgentService(db).respond( + UserAgentRequest( + run_id=ontology.run_id, + user_id="pytest-travel-hotel-name@example.com", + message=query, + ontology=ontology, + context_json=context, + tool_payload={"draft_only": True}, + ) + ) + + assert response.review_payload is not None + slot_map = {item.key: item for item in response.review_payload.slot_cards} + assert slot_map["merchant_name"].value == "北京中心酒店" + + +def test_user_agent_review_payload_prechecks_taxi_amount_against_rule_standard() -> None: + session_factory = build_session_factory() + with session_factory() as db: + query = "我去北京出差,上传了一张打车票,帮我生成差旅费报销草稿" + context = { + "name": "张三", + "grade": "P4", + "attachment_names": ["北京打车票.png"], + "attachment_count": 1, + "ocr_documents": [ + { + "filename": "北京打车票.png", + "document_type": "taxi_receipt", + "summary": "北京网约车 打车票 支付金额 360 元", + "text": "北京网约车 打车票 支付金额 360 元", + "avg_score": 0.95, + "document_fields": [ + {"key": "amount", "label": "支付金额", "value": "360"}, + ], + "warnings": [], + } + ], + } + ontology = SemanticOntologyService(db).parse( + OntologyParseRequest( + query=query, + user_id="pytest", + context_json=context, + ) + ) + + response = UserAgentService(db).respond( + UserAgentRequest( + run_id=ontology.run_id, + user_id="pytest", + message=query, + ontology=ontology, + context_json=context, + tool_payload={"draft_only": True}, + ) + ) + + assert response.review_payload is not None + amount_brief = next(item for item in response.review_payload.risk_briefs if "交通费金额超标" in item.title) + combined = f"{amount_brief.title}\n{amount_brief.content}\n{amount_brief.detail}\n{amount_brief.suggestion}" + assert "北京打车票.png" in combined + assert "360.00" in combined + assert "300.00" in combined + assert "单笔交通金额" in combined + assert "报销场景提交与附件标准" in combined + assert amount_brief.level == "high" + assert any(item.title == "附件金额测算结果" for item in response.review_payload.risk_briefs) + + +def test_user_agent_review_payload_uses_finance_spreadsheet_hotel_amount_standard() -> None: + session_factory = build_session_factory() + with session_factory() as db: + AgentAssetService(db).list_assets(asset_type=AgentAssetType.RULE.value) + employee = Employee( + employee_no="E-TRAVEL-XLSX-001", + name="测算员工", + email="pytest-travel-xlsx@example.com", + position="基层经理", + grade="P4", + ) + db.add(employee) + db.commit() + + query = "测算员工去北京出差住宿,上传了北京酒店发票,帮我生成差旅费报销草稿" + context = { + "name": "测算员工", + "attachment_names": ["北京酒店发票.png"], + "attachment_count": 1, + "ocr_documents": [ + { + "filename": "北京酒店发票.png", + "document_type": "hotel_invoice", + "summary": "北京酒店 住宿 1 晚 金额 480 元", + "text": "北京酒店 住宿 1 晚 金额 480 元", + "avg_score": 0.96, + "document_fields": [ + {"key": "amount", "label": "金额", "value": "480"}, + ], + "warnings": [], + } + ], + } + ontology = SemanticOntologyService(db).parse( + OntologyParseRequest( + query=query, + user_id="pytest-travel-xlsx@example.com", + context_json=context, + ) + ) + + response = UserAgentService(db).respond( + UserAgentRequest( + run_id=ontology.run_id, + user_id="pytest-travel-xlsx@example.com", + message=query, + ontology=ontology, + context_json=context, + tool_payload={"draft_only": True}, + ) + ) + + assert response.review_payload is not None + hotel_brief = next(item for item in response.review_payload.risk_briefs if "住宿超标" in item.title) + combined = f"{hotel_brief.content}\n{hotel_brief.detail}" + assert "480.00" in combined + assert "450.00" in combined + assert "公司差旅费报销规则" in combined + + +def test_user_agent_review_payload_uses_spreadsheet_city_hotel_standard_not_default_tier() -> None: + session_factory = build_session_factory() + with session_factory() as db: + AgentAssetService(db).list_assets(asset_type=AgentAssetType.RULE.value) + + query = "我去张家口出差住宿,上传了张家口酒店发票,帮我生成差旅费报销草稿" + context = { + "name": "张三", + "grade": "P4", + "attachment_names": ["张家口酒店发票.png"], + "attachment_count": 1, + "ocr_documents": [ + { + "filename": "张家口酒店发票.png", + "document_type": "hotel_invoice", + "summary": "张家口酒店 住宿 1 晚 金额 320 元", + "text": "张家口酒店 住宿 1 晚 金额 320 元", + "avg_score": 0.96, + "document_fields": [ + {"key": "amount", "label": "金额", "value": "320"}, + ], + "warnings": [], + } + ], + } + ontology = SemanticOntologyService(db).parse( + OntologyParseRequest( + query=query, + user_id="pytest-travel-city@example.com", + context_json=context, + ) + ) + + response = UserAgentService(db).respond( + UserAgentRequest( + run_id=ontology.run_id, + user_id="pytest-travel-city@example.com", + message=query, + ontology=ontology, + context_json=context, + tool_payload={"draft_only": True}, + ) + ) + + assert response.review_payload is not None + hotel_brief = next(item for item in response.review_payload.risk_briefs if "住宿超标" in item.title) + combined = f"{hotel_brief.content}\n{hotel_brief.detail}" + assert "320.00" in combined + assert "300.00" in combined + assert "公司差旅费报销规则" in combined + + +def test_user_agent_review_payload_uses_finance_spreadsheet_meal_allowance_standard() -> None: + session_factory = build_session_factory() + with session_factory() as db: + AgentAssetService(db).list_assets(asset_type=AgentAssetType.RULE.value) + + query = "我去北京出差,上传了一张餐饮发票,帮我生成差旅费报销草稿" + context = { + "name": "张三", + "grade": "P4", + "attachment_names": ["北京餐饮发票.png"], + "attachment_count": 1, + "ocr_documents": [ + { + "filename": "北京餐饮发票.png", + "document_type": "meal_receipt", + "summary": "北京餐饮发票 金额 90 元", + "text": "北京餐饮发票 金额 90 元", + "avg_score": 0.96, + "document_fields": [ + {"key": "amount", "label": "金额", "value": "90"}, + ], + "warnings": [], + } + ], + } + ontology = SemanticOntologyService(db).parse( + OntologyParseRequest( + query=query, + user_id="pytest-travel-meal@example.com", + context_json=context, + ) + ) + + response = UserAgentService(db).respond( + UserAgentRequest( + run_id=ontology.run_id, + user_id="pytest-travel-meal@example.com", + message=query, + ontology=ontology, + context_json=context, + tool_payload={"draft_only": True}, + ) + ) + + assert response.review_payload is not None + meal_brief = next(item for item in response.review_payload.risk_briefs if "伙食补助标准" in item.title) + combined = f"{meal_brief.title}\n{meal_brief.content}\n{meal_brief.detail}\n{meal_brief.suggestion}" + assert "北京餐饮发票.png" in combined + assert "90.00" in combined + assert "65.00" in combined + assert "直辖市/特区" in combined + assert "公司差旅费报销规则" in combined + assert meal_brief.level == "high" + measurement = next(item for item in response.review_payload.risk_briefs if item.title == "附件金额测算结果") + assert "伙食补助标准 65.00" in measurement.detail + + +def test_user_agent_filters_deprecated_review_risk_briefs() -> None: + filtered = UserAgentService._filter_deprecated_review_risk_briefs( + [ + UserAgentReviewRiskBrief(title="历史报销画像", level="info", content="旧画像"), + UserAgentReviewRiskBrief(title="用户画像", level="info", content="旧画像"), + UserAgentReviewRiskBrief(title="制度注意事项", level="info", content="旧制度提示"), + UserAgentReviewRiskBrief(title="住宿超标待说明", level="high", content="保留"), + ] + ) + + assert [item.title for item in filtered] == ["住宿超标待说明"] + + +def test_user_agent_submission_blocked_risk_level_only_marks_amount_reasons_high() -> None: + assert UserAgentService._resolve_submission_blocked_risk_level("住宿金额超出当前职级差标") == "high" + assert UserAgentService._resolve_submission_blocked_risk_level("缺少直属领导或参与人员信息") == "warning" + + +def test_user_agent_review_payload_shows_ai_precheck_failure_in_main_message() -> None: + session_factory = build_session_factory() + with session_factory() as db: + query = "我去北京出差住酒店,帮我生成差旅费报销草稿并进入下一步提交" + context = { + "name": "张三", + "attachment_names": ["北京酒店发票.png"], + "attachment_count": 1, + "ocr_documents": [ + { + "filename": "北京酒店发票.png", + "document_type": "hotel_invoice", + "summary": "北京酒店 住宿 1 晚 金额 680 元", + "text": "北京酒店 住宿 1 晚 金额 680 元", + "avg_score": 0.94, + } + ], + } + ontology = SemanticOntologyService(db).parse( + OntologyParseRequest( + query=query, + user_id="pytest", + context_json=context, + ) + ) + + response = UserAgentService(db).respond( + UserAgentRequest( + run_id=ontology.run_id, + user_id="pytest", + message=query, + ontology=ontology, + context_json=context, + tool_payload={ + "submission_blocked": True, + "submission_blocked_reasons": ["住宿金额超出当前职级差标,且未补充超标说明。"], + }, + ) + ) + + assert response.review_payload is not None + assert response.answer == response.review_payload.body_message + assert response.answer.startswith("AI预审未通过:住宿金额超出当前职级差标") + assert "整改后再继续提交" in response.answer + assert response.review_payload.can_proceed is False + blocked_brief = next(item for item in response.review_payload.risk_briefs if item.title == "提交风险提示") + assert blocked_brief.level == "high" + assert not any(item.title == "AI预审未通过" for item in response.review_payload.risk_briefs) + + +def test_user_agent_prompts_existing_draft_association_choice_for_multi_documents() -> None: + session_factory = build_session_factory() + with session_factory() as db: + ontology = SemanticOntologyService(db).parse( + OntologyParseRequest( query="我上传了两张票据,帮我生成报销草稿", user_id="pytest", ) diff --git a/web/src/assets/styles/views/travel-reimbursement-create-view.css b/web/src/assets/styles/views/travel-reimbursement-create-view.css index 5850952..5788ccb 100644 --- a/web/src/assets/styles/views/travel-reimbursement-create-view.css +++ b/web/src/assets/styles/views/travel-reimbursement-create-view.css @@ -813,6 +813,24 @@ color: #1d4ed8; } +.message-meta-chip.high { + background: #fef2f2; + color: #dc2626; + border: 1px solid #fecaca; +} + +.message-meta-chip.medium { + background: #fffbeb; + color: #b45309; + border: 1px solid #fde68a; +} + +.message-meta-chip.low { + background: #eff6ff; + color: #1d4ed8; + border: 1px solid #bfdbfe; +} + .risk-chip, .message-risk-chip { background: #fff1f2; @@ -1262,6 +1280,10 @@ position: relative; } +.travel-calculator-anchor { + position: relative; +} + .tool-btn.composer-side-btn.active { border-color: rgba(59, 130, 246, 0.42); background: rgba(239, 246, 255, 0.96); @@ -1286,6 +1308,84 @@ 0 4px 12px rgba(15, 23, 42, 0.06); } +.travel-calculator-popover { + position: absolute; + bottom: calc(100% + 10px); + left: 0; + z-index: 30; + width: min(300px, calc(100vw - 48px)); + display: grid; + gap: 12px; + padding: 14px; + border: 1px solid rgba(203, 213, 225, 0.92); + border-radius: 16px; + background: rgba(255, 255, 255, 0.98); + box-shadow: + 0 18px 40px rgba(15, 23, 42, 0.16), + 0 4px 12px rgba(15, 23, 42, 0.06); +} + +.travel-calculator-mini-head { + display: grid; + gap: 3px; +} + +.travel-calculator-mini-head strong { + color: #0f172a; + font-size: 13px; + font-weight: 900; +} + +.travel-calculator-mini-head span { + color: #64748b; + font-size: 11px; + font-weight: 750; +} + +.travel-calculator-form { + display: grid; + grid-template-columns: 92px minmax(0, 1fr); + gap: 8px; +} + +.travel-calculator-field { + display: grid; + gap: 6px; + min-width: 0; +} + +.travel-calculator-field span { + color: #64748b; + font-size: 11px; + font-weight: 800; +} + +.travel-calculator-field input { + width: 100%; + min-height: 36px; + padding: 0 10px; + border: 1px solid rgba(203, 213, 225, 0.92); + border-radius: 10px; + background: #fff; + color: #0f172a; + font-size: 12px; + font-weight: 700; +} + +.travel-calculator-field input:focus { + border-color: rgba(59, 130, 246, 0.46); + box-shadow: 0 0 0 3px rgba(59, 130, 246, 0.1); + outline: none; +} + +.travel-calculator-error { + margin: 0; + color: #dc2626; + font-size: 11px; + font-weight: 750; + line-height: 1.5; +} + .composer-date-mode-tabs { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); @@ -1984,6 +2084,11 @@ transition: border-color 0.18s ease, background 0.18s ease, transform 0.18s ease; } +.review-side-metric-card.wide { + grid-column: 1 / -1; + min-height: 104px; +} + .review-side-metric-card.invalid { border-color: rgba(239, 68, 68, 0.34); background: rgba(254, 242, 242, 0.72); @@ -2038,6 +2143,14 @@ font-weight: 700; } +.review-inline-textarea { + min-height: 82px; + padding: 9px 10px; + resize: vertical; + line-height: 1.55; + font-family: inherit; +} + .review-inline-input.invalid { border-color: rgba(239, 68, 68, 0.4); color: #b91c1c; @@ -2225,16 +2338,6 @@ background: linear-gradient(180deg, rgba(255, 255, 255, 0.84) 0%, rgba(255, 249, 238, 0.8) 100%); } -.review-side-risk-score { - color: #f97316; - font-size: 13px; - font-weight: 900; -} - -.review-side-risk-score.empty { - color: #94a3b8; -} - .review-side-risk-summary { margin: 0; color: #334155; @@ -2281,7 +2384,7 @@ font-size: 16px; } -.review-side-risk-item.warning .review-side-risk-icon { +.review-side-risk-item.medium .review-side-risk-icon { background: rgba(245, 158, 11, 0.14); color: #b45309; } @@ -2291,6 +2394,11 @@ color: #dc2626; } +.review-side-risk-item.low .review-side-risk-icon { + background: rgba(14, 165, 233, 0.12); + color: #0284c7; +} + .review-side-risk-copy { min-width: 0; display: grid; @@ -4201,93 +4309,6 @@ flex: 1 1 168px; } -.review-risk-detail-modal { - width: min(560px, calc(100vw - 40px)); - max-height: min(760px, calc(100vh - 48px)); - display: grid; - grid-template-rows: auto minmax(0, 1fr); - overflow: hidden; - border-radius: 24px; - border: 1px solid #e7eef6; - background: - radial-gradient(circle at top right, rgba(245, 158, 11, 0.10), transparent 28%), - linear-gradient(180deg, #fbfdff 0%, #f6f9fc 100%); - box-shadow: - 0 24px 80px rgba(15, 23, 42, 0.22), - 0 2px 12px rgba(15, 23, 42, 0.08); -} - -.review-risk-detail-head { - display: flex; - align-items: flex-start; - justify-content: space-between; - gap: 16px; - padding: 22px 24px 18px; - border-bottom: 1px solid #eef2f7; -} - -.review-risk-detail-head h3 { - margin: 12px 0 0; - color: #0f172a; - font-size: 21px; - font-weight: 900; - line-height: 1.35; -} - -.review-risk-detail-body { - min-height: 0; - display: grid; - gap: 14px; - padding: 18px 24px 24px; - overflow-y: auto; -} - -.review-risk-detail-level { - width: fit-content; - display: inline-flex; - align-items: center; - gap: 8px; - min-height: 30px; - padding: 0 11px; - border-radius: 999px; - background: rgba(14, 165, 233, 0.12); - color: #0284c7; - font-size: 12px; - font-weight: 900; -} - -.review-risk-detail-level.warning { - background: rgba(245, 158, 11, 0.14); - color: #b45309; -} - -.review-risk-detail-level.high { - background: rgba(239, 68, 68, 0.12); - color: #dc2626; -} - -.review-risk-detail-section { - display: grid; - gap: 8px; - padding: 14px; - border: 1px solid rgba(226, 232, 240, 0.92); - border-radius: 16px; - background: rgba(255, 255, 255, 0.72); -} - -.review-risk-detail-section strong { - color: #0f172a; - font-size: 13px; - font-weight: 900; -} - -.review-risk-detail-section p { - margin: 0; - color: #475569; - font-size: 13px; - line-height: 1.7; -} - .review-edit-modal { max-height: min(860px, calc(100vh - 48px)); display: grid; @@ -4723,6 +4744,10 @@ min-height: 32px; } + .travel-calculator-form { + grid-template-columns: 1fr; + } + .dialog-toolbar { padding: 16px 16px 12px; } diff --git a/web/src/composables/useRequests.js b/web/src/composables/useRequests.js index b748943..841523b 100644 --- a/web/src/composables/useRequests.js +++ b/web/src/composables/useRequests.js @@ -21,7 +21,7 @@ const LOCATION_REQUIRED_EXPENSE_TYPES = new Set([ ]) const REIMBURSEMENT_PROGRESS_LABELS = [ - '保存草稿', + '创建单据', '待提交', 'AI预审', '直属领导审批', @@ -270,6 +270,21 @@ function normalizeText(value) { return String(value || '').trim() } +function isEmailLike(value) { + return /^[^@\s]+@[^@\s]+\.[^@\s]+$/.test(normalizeText(value)) +} + +function resolveDisplayName(...values) { + for (const value of values) { + const normalized = normalizeText(value) + if (normalized && !isEmailLike(normalized)) { + return normalized + } + } + + return '' +} + function getRiskFlags(claim) { return Array.isArray(claim?.risk_flags_json) ? claim.risk_flags_json : [] } @@ -344,7 +359,7 @@ function buildCompletedStepMeta(claim, label) { const stepLabel = normalizeText(label) const employeeName = normalizeText(claim?.employee_name) || '申请人' - if (stepLabel === '保存草稿') { + if (stepLabel === '创建单据') { const createdAt = formatDateTime(claim?.created_at) return buildProgressStepMeta(`${employeeName}创建`, createdAt) } @@ -362,7 +377,12 @@ function buildCompletedStepMeta(claim, label) { if (stepLabel === '直属领导审批' || stepLabel === '财务审批') { const approvalEvent = findApprovalEventForStep(claim, stepLabel) if (approvalEvent) { - const operator = normalizeText(approvalEvent.operator) || (stepLabel === '财务审批' ? '财务' : '审批人') + const operator = resolveDisplayName( + approvalEvent.operator, + approvalEvent.operator_name, + approvalEvent.operatorName, + stepLabel === '直属领导审批' ? claim?.manager_name : '' + ) || (stepLabel === '财务审批' ? '财务' : '直属领导') const approvedAt = formatDateTime(approvalEvent.created_at || approvalEvent.createdAt) return buildProgressStepMeta(`${operator}通过`, approvedAt, `${operator}审批通过 ${approvedAt}`.trim()) } @@ -383,7 +403,7 @@ function buildCompletedStepMeta(claim, label) { function resolveCurrentStepStartedAt(claim, label) { const stepLabel = normalizeText(label) - if (stepLabel === '保存草稿') { + if (stepLabel === '创建单据') { return claim?.created_at } if (stepLabel === '待提交') { @@ -539,7 +559,7 @@ export function mapExpenseClaimToRequest(claim) { employeeName: String(claim?.employee_name || '').trim() || '待补充', employeePosition: String(claim?.employee_position || '').trim(), employeeGrade: String(claim?.employee_grade || '').trim(), - managerName: String(claim?.manager_name || '').trim(), + managerName: resolveDisplayName(claim?.manager_name), roleLabels: Array.isArray(claim?.role_labels) ? claim.role_labels.filter(Boolean) : [], entity: '', typeCode, diff --git a/web/src/services/reimbursements.js b/web/src/services/reimbursements.js index 9c6ef09..a4773d3 100644 --- a/web/src/services/reimbursements.js +++ b/web/src/services/reimbursements.js @@ -12,6 +12,13 @@ export function fetchExpenseClaimDetail(claimId) { return apiRequest(`/reimbursements/claims/${encodeURIComponent(String(claimId || '').trim())}`) } +export function calculateTravelReimbursement(payload = {}) { + return apiRequest('/reimbursements/travel-calculator', { + method: 'POST', + body: JSON.stringify(payload) + }) +} + export function createExpenseClaimItem(claimId, payload = {}) { return apiRequest(`/reimbursements/claims/${encodeURIComponent(String(claimId || '').trim())}/items`, { method: 'POST', diff --git a/web/src/utils/accessControl.js b/web/src/utils/accessControl.js index 7e34978..5d3325e 100644 --- a/web/src/utils/accessControl.js +++ b/web/src/utils/accessControl.js @@ -19,8 +19,9 @@ const VIEW_ROLE_RULES = { employees: ['manager'], settings: ['manager'] } -const CLAIM_MANAGER_ROLE_CODES = new Set(['finance', 'executive']) +const CLAIM_MANAGER_ROLE_CODES = new Set(['executive']) const CLAIM_RETURN_ROLE_CODES = new Set(['finance', 'executive', 'manager', 'approver']) +const CLAIM_LEADER_APPROVAL_ROLE_CODES = new Set(['manager', 'approver']) function normalizedRoleCodes(user) { if (!user) { @@ -60,6 +61,14 @@ export function canReturnExpenseClaims(user) { return normalizedRoleCodes(user).some((roleCode) => CLAIM_RETURN_ROLE_CODES.has(roleCode)) } +export function canApproveLeaderExpenseClaims(user) { + if (Boolean(user?.isAdmin)) { + return true + } + + return normalizedRoleCodes(user).some((roleCode) => CLAIM_LEADER_APPROVAL_ROLE_CODES.has(roleCode)) +} + export function canAccessAppView(user, viewId) { if (!viewId || !user) { return false diff --git a/web/src/utils/approvalInbox.js b/web/src/utils/approvalInbox.js index 102019b..961ad78 100644 --- a/web/src/utils/approvalInbox.js +++ b/web/src/utils/approvalInbox.js @@ -1,5 +1,9 @@ import { mapExpenseClaimToRequest } from '../composables/useRequests.js' -import { canManageExpenseClaims } from './accessControl.js' +import { + canApproveLeaderExpenseClaims, + canManageExpenseClaims, + isFinanceUser +} from './accessControl.js' export function canProcessApprovalRequest(request, currentUser) { const node = String(request?.workflowNode || '').trim() @@ -14,12 +18,18 @@ export function canProcessApprovalRequest(request, currentUser) { return true } - return ( + if (isFinanceUser(currentUser) && node.includes('财务')) { + return true + } + + const isLeaderApprovalNode = ( node.includes('直属领导') || node.includes('领导审批') || node.includes('部门负责人') || node.includes('负责人审批') ) + + return canApproveLeaderExpenseClaims(currentUser) && isLeaderApprovalNode } export function listPendingApprovalRequests(claimsPayload, currentUser) { diff --git a/web/src/utils/requestViewModel.js b/web/src/utils/requestViewModel.js index ceae2af..ebb5199 100644 --- a/web/src/utils/requestViewModel.js +++ b/web/src/utils/requestViewModel.js @@ -181,6 +181,21 @@ function normalizeRoleLabels(value) { return text ? [text] : [] } +function isEmailLike(value) { + return /^[^@\s]+@[^@\s]+\.[^@\s]+$/.test(String(value || '').trim()) +} + +function resolveDisplayName(...values) { + for (const value of values) { + const normalized = String(value || '').trim() + if (normalized && !isEmailLike(normalized)) { + return normalized + } + } + + return '' +} + export function normalizeRequestForUi(request) { if (!request) { return null @@ -255,7 +270,12 @@ export function normalizeRequestForUi(request) { String(request.profilePosition || request.employeePosition || request.employee_position || request.position || '').trim() || '待补充', profileGrade: String(request.profileGrade || request.employeeGrade || request.employee_grade || request.grade || '').trim() || '待补充', - profileManager: String(request.profileManager || request.managerName || request.manager_name || request.manager || '').trim() || '待补充', + profileManager: resolveDisplayName( + request.profileManager, + request.managerName, + request.manager_name, + request.manager + ) || '待补充', roleLabels, profileAvatar: String(request.person || request.applicant || request.employeeName || '申').trim().slice(0, 1) || '申' diff --git a/web/src/views/TravelReimbursementCreateView.vue b/web/src/views/TravelReimbursementCreateView.vue index 694b3a9..c2924c3 100644 --- a/web/src/views/TravelReimbursementCreateView.vue +++ b/web/src/views/TravelReimbursementCreateView.vue @@ -121,7 +121,14 @@

- {{ item }} + + {{ item }} +
@@ -548,6 +555,72 @@
+
+ + +
@@ -783,7 +856,8 @@ :class="{ editable: item.editor, editing: reviewInlineEditorKey === item.key, - invalid: Boolean(reviewInlineErrors[item.key]) + invalid: Boolean(reviewInlineErrors[item.key]), + wide: item.wide }" @click="openInlineReviewEditor(item.key)" > @@ -831,6 +905,19 @@ @keydown.enter.prevent="commitInlineReviewEditor" /> + @@ -1222,41 +1305,6 @@ @confirm="confirmCancelReview" /> - -
-
-
-
- {{ reviewRiskDetailDialog.item?.sourceLabel || 'AI预审' }} -

{{ reviewRiskDetailDialog.item?.title || '风险提示' }}

-
- -
- -
-
- - {{ reviewRiskDetailDialog.item?.levelLabel || '提示' }} -
-
- 提示情况 -

{{ reviewRiskDetailDialog.item?.summary }}

-
-
- 详细解释 -

{{ reviewRiskDetailDialog.item?.detail }}

-
-
- 处理建议 -

{{ reviewRiskDetailDialog.item?.suggestion }}

-
-
-
-
-
-
diff --git a/web/src/views/TravelRequestDetailView.vue b/web/src/views/TravelRequestDetailView.vue index dc67f0e..6d880b6 100644 --- a/web/src/views/TravelRequestDetailView.vue +++ b/web/src/views/TravelRequestDetailView.vue @@ -375,15 +375,15 @@
-

领导意见

+

{{ approvalOpinionTitle }}

- 审批通过后将流转至财务审批。 + {{ approvalOpinionHint }} {{ leaderOpinion.length }}/500
@@ -620,10 +620,10 @@
下一节点 - 财务审批 + {{ approvalNextStage }}
- 领导意见 + {{ approvalOpinionTitle }} {{ leaderOpinion.trim() || '未填写' }}
diff --git a/web/src/views/scripts/TravelReimbursementCreateView.js b/web/src/views/scripts/TravelReimbursementCreateView.js index c9959b2..fb20314 100644 --- a/web/src/views/scripts/TravelReimbursementCreateView.js +++ b/web/src/views/scripts/TravelReimbursementCreateView.js @@ -15,6 +15,7 @@ import { TRANSPORT_KEYWORD_PATTERN } from '../../utils/reimbursementTextInference.js' import { + calculateTravelReimbursement, fetchExpenseClaimAttachmentAsset, fetchExpenseClaimDetail, fetchExpenseClaimItemAttachmentMeta, @@ -55,15 +56,15 @@ const REVIEW_RISK_LEVEL_META = { icon: 'mdi mdi-alert-octagon-outline', suggestion: '建议先处理该项,再提交审批;如果属于合理业务场景,请补充说明或附件。' }, - warning: { - label: '需关注', + medium: { + label: '中风险', icon: 'mdi mdi-alert-circle-outline', suggestion: '提交前建议核对业务真实性、附件完整性和规则口径。' }, - info: { - label: '提示', + low: { + label: '低风险', icon: 'mdi mdi-information-outline', - suggestion: '该项主要用于辅助判断,可结合当前单据情况继续核对。' + suggestion: '该项主要用于辅助判断,可结合当前单据情况简单核对。' } } @@ -310,6 +311,7 @@ const FLOW_MISSING_SLOT_LABELS = { participants: '参与人员', attachments: '票据附件' } +const DEPRECATED_REVIEW_RISK_TITLE_KEYWORDS = ['历史报销画像', '用户画像', '制度注意事项', '制度注意'] let messageSeed = 0 function nowTime() { @@ -1317,6 +1319,7 @@ function createEmptyInlineReviewState() { return { occurred_date: '', amount: '', + transport_type: '', scene_label: '', reason_value: '', customer_name: '', @@ -1330,6 +1333,67 @@ function createEmptyInlineReviewState() { } } +function isTravelReviewPayload(reviewPayload, inlineState = createEmptyInlineReviewState()) { + const expenseType = resolveExpenseTypeCode( + inlineState?.expense_type || + buildReviewSlotMap(reviewPayload).expense_type?.normalized_value || + buildReviewSlotMap(reviewPayload).expense_type?.value || + '' + ) + if (['travel', 'hotel', 'transport'].includes(expenseType)) { + return true + } + + return (Array.isArray(reviewPayload?.document_cards) ? reviewPayload.document_cards : []).some((item) => { + const documentType = String(item?.document_type || '').trim().toLowerCase() + const suggestedType = resolveExpenseTypeCode(item?.suggested_expense_type || item?.scene_label || '') + return ( + ['flight_itinerary', 'train_ticket', 'hotel_invoice', 'taxi_receipt', 'transport_receipt'].includes(documentType) || + ['travel', 'hotel', 'transport'].includes(suggestedType) + ) + }) +} + +function resolveReviewTravelTransportType(reviewPayload, fallbackText = '') { + const documents = Array.isArray(reviewPayload?.document_cards) ? reviewPayload.document_cards : [] + const labels = [] + + const appendLabel = (label) => { + if (label && !labels.includes(label)) { + labels.push(label) + } + } + + for (const item of documents) { + const documentType = String(item?.document_type || '').trim().toLowerCase() + const text = [ + item?.filename, + item?.summary, + item?.scene_label, + item?.suggested_expense_type, + ...(Array.isArray(item?.fields) ? item.fields.map((field) => `${field?.label || ''}${field?.value || ''}`) : []) + ].join(' ') + const compact = text.replace(/\s+/g, '') + + if (documentType === 'flight_itinerary' || /飞机|机票|航班|登机牌/.test(compact)) { + appendLabel('飞机') + } else if (documentType === 'train_ticket' || /火车|高铁|动车|铁路|车票/.test(compact)) { + appendLabel('火车/高铁') + } else if (documentType === 'taxi_receipt' || /打车|网约车|出租车|滴滴|的士/.test(compact)) { + appendLabel('打车/网约车') + } + } + + const fallback = String(fallbackText || '').replace(/\s+/g, '') + if (!labels.length) { + if (/飞机|机票|航班/.test(fallback)) appendLabel('飞机') + if (/火车|高铁|动车|铁路/.test(fallback)) appendLabel('火车/高铁') + if (/打车|网约车|出租车|滴滴|的士/.test(fallback)) appendLabel('打车/网约车') + } + + return labels.join('、') +} + function buildClientTimeContext() { const now = new Date() const locale = @@ -1434,7 +1498,11 @@ function resolveReviewMissingSlotCards(reviewPayload) { } function resolveReviewRiskBriefs(reviewPayload) { - return Array.isArray(reviewPayload?.risk_briefs) ? reviewPayload.risk_briefs : [] + if (!Array.isArray(reviewPayload?.risk_briefs)) return [] + return reviewPayload.risk_briefs.filter((item) => { + const title = String(item?.title || '').trim() + return !DEPRECATED_REVIEW_RISK_TITLE_KEYWORDS.some((keyword) => title.includes(keyword)) + }) } function formatConfidenceLabel(value) { @@ -1792,7 +1860,7 @@ function buildReviewAlertChips(reviewPayload) { chips.push({ key: item.key, label: buildReviewAlertLabel(item.key, expenseTypeLabel), - tone: item.key === 'attachments' ? 'danger' : 'warning' + tone: 'warning' }) } @@ -1830,7 +1898,7 @@ function buildReviewTodoItems(reviewPayload) { title: config.title || item.label, hint: item.hint || config.hint || `请补充${item.label}`, status: config.status || '待补充', - tone: item.key === 'attachments' ? 'danger' : 'warning' + tone: 'warning' } }) } @@ -2075,6 +2143,9 @@ function buildInlineReviewState(reviewPayload) { editFieldMap.reason?.value || slotMap.reason?.raw_value || slotMap.reason?.value || '' ).trim() const sceneLabel = inferPresetSceneFromReview(reviewPayload, reasonValue, expenseType) + const transportType = String( + editFieldMap.transport_type?.value || resolveReviewTravelTransportType(reviewPayload, reasonValue) + ).trim() return { occurred_date: String( @@ -2083,6 +2154,7 @@ function buildInlineReviewState(reviewPayload) { amount: normalizeAmountValue( String(editFieldMap.amount?.value || slotMap.amount?.normalized_value || slotMap.amount?.value || '').trim() ), + transport_type: transportType, scene_label: sceneLabel, reason_value: sceneLabel === REVIEW_SCENE_OTHER_OPTION @@ -2129,6 +2201,56 @@ function buildReviewFactCards(reviewPayload, inlineState = createEmptyInlineRevi : totalAttachmentCount > 0 ? `已上传 ${totalAttachmentCount} 份` : buildReviewAttachmentStatus(reviewPayload) + if (isTravelReviewPayload(reviewPayload, inlineState)) { + return [ + { + key: 'occurred_date', + label: '发生时间', + value: String(inlineState.occurred_date || '').trim() || '待补充', + icon: 'mdi mdi-calendar-month-outline', + editor: 'date', + modelKey: 'occurred_date', + placeholder: `例如 ${DATE_INPUT_FORMAT}` + }, + { + key: 'amount', + label: '金额', + value: formatAmountDisplay(inlineState.amount) || '待补充', + icon: 'mdi mdi-cash', + editor: 'amount', + modelKey: 'amount', + placeholder: '例如 200.00' + }, + { + key: 'transport_type', + label: '交通类型', + value: String(inlineState.transport_type || '').trim() || '待确认', + icon: 'mdi mdi-train-car', + editor: 'text', + modelKey: 'transport_type', + placeholder: '例如 火车/高铁、飞机' + }, + { + key: 'hotel_name', + label: '酒店名称', + value: String(inlineState.merchant_name || '').trim() || '待补充', + icon: 'mdi mdi-bed-outline', + editor: 'text', + modelKey: 'merchant_name', + placeholder: '请输入酒店名称' + }, + { + key: 'travel_purpose', + label: '出差事宜', + value: String(inlineState.reason_value || '').trim() || '待补充', + icon: 'mdi mdi-briefcase-edit-outline', + editor: 'textarea', + modelKey: 'reason_value', + placeholder: '请填写本次出差的具体工作内容或业务意图', + wide: true + } + ] + } const cards = [ { key: 'occurred_date', @@ -2319,14 +2441,6 @@ function buildReviewPanelConfidence(reviewPayload, inlineState = createEmptyInli ) } -function buildReviewRiskScore(reviewPayload) { - const score = Number(reviewPayload?.risk_score) - if (!Number.isFinite(score) || score <= 0) { - return null - } - return Math.max(0, Math.min(100, Math.round(score))) -} - function buildMissingRiskLine(slotKey, expenseTypeLabel = '') { if (slotKey === 'customer_name') { return expenseTypeLabel === '业务招待费' @@ -2353,17 +2467,30 @@ function buildMissingRiskLine(slotKey, expenseTypeLabel = '') { function buildReviewRiskSummary(reviewPayload) { if (resolveReviewRiskBriefs(reviewPayload).length) { - return '当前识别到了合规提醒,提交前建议逐项核对。' + return '当前识别到了风险提示,点击任一风险点会在主对话中展开规则依据和整改建议。' } - return '当前版本暂未生成风险评分结果。' + return '当前没有需要额外处理的结构化风险点。' } function normalizeReviewRiskLevel(level) { const normalized = String(level || '').trim().toLowerCase() if (normalized === 'danger' || normalized === 'error' || normalized === 'critical') return 'high' - if (normalized === 'warn' || normalized === 'medium') return 'warning' - if (normalized === 'high' || normalized === 'warning' || normalized === 'info') return normalized - return 'info' + if (normalized === 'warn' || normalized === 'warning' || normalized === 'medium') return 'medium' + if (normalized === 'info' || normalized === 'notice' || normalized === 'low') return 'low' + if (normalized === 'high') return normalized + return 'low' +} + +function normalizeReviewRiskTitle(title, fallbackTitle) { + const normalized = String(title || '').trim() + const fallback = String(fallbackTitle || '风险提示').trim() || '风险提示' + if (!normalized) return fallback + const cleaned = normalized + .replace(/AI\s*预审\s*(暂未通过|未通过|不通过)?/g, '风险提示') + .replace(/(高风险|中风险|低风险)/g, '') + .replace(/^[::\-—\s]+|[::\-—\s]+$/g, '') + .trim() + return cleaned || fallback } function buildReviewRiskItems(reviewPayload) { @@ -2374,9 +2501,9 @@ function buildReviewRiskItems(reviewPayload) { const detail = String(brief?.detail || '').trim() const suggestion = String(brief?.suggestion || '').trim() const level = normalizeReviewRiskLevel(brief?.level) - const meta = REVIEW_RISK_LEVEL_META[level] || REVIEW_RISK_LEVEL_META.info + const meta = REVIEW_RISK_LEVEL_META[level] || REVIEW_RISK_LEVEL_META.low const fallbackTitle = content ? `风险提示 ${index + 1}` : '风险提示' - const normalizedTitle = title || fallbackTitle + const normalizedTitle = normalizeReviewRiskTitle(title, fallbackTitle) const summary = content || normalizedTitle if (!normalizedTitle && !summary) return null @@ -2389,12 +2516,30 @@ function buildReviewRiskItems(reviewPayload) { level, levelLabel: meta.label, icon: meta.icon, - sourceLabel: title === '历史报销画像' ? '历史记录' : 'AI预审', + sourceLabel: meta.label, suggestion: suggestion || meta.suggestion } }) .filter(Boolean) - .slice(0, 6) +} + +function buildReviewRiskConversationText(item) { + const title = String(item?.title || '风险提示').trim() + const summary = String(item?.summary || '').trim() + const detail = String(item?.detail || '').trim() + const suggestion = String(item?.suggestion || '').trim() + const lines = [`${title}`] + + if (summary) { + lines.push('', `风险点:${summary}`) + } + if (detail && detail !== summary) { + lines.push('', `规则依据:${detail}`) + } + if (suggestion) { + lines.push('', `修改建议:${suggestion}`) + } + return lines.join('\n') } function resolveInlineReviewSlotValue(slotKey, inlineState = createEmptyInlineReviewState()) { @@ -2489,6 +2634,7 @@ function normalizeInlineReviewComparableState(state) { return { occurred_date: String(source.occurred_date || '').trim(), amount: String(source.amount || '').trim(), + transport_type: String(source.transport_type || '').trim(), scene_label: String(source.scene_label || '').trim(), reason_value: String(source.reason_value || '').trim(), customer_name: String(source.customer_name || '').trim(), @@ -2512,6 +2658,9 @@ function buildInlineReviewChangedLines(baseState, nextState, pendingFiles = []) if (base.amount !== next.amount) { lines.push(`金额 ${formatAmountDisplay(next.amount) || '待补充'}`) } + if (base.transport_type !== next.transport_type) { + lines.push(`交通类型 ${next.transport_type || '待确认'}`) + } if (base.scene_label !== next.scene_label) { lines.push(`场景 ${next.scene_label || '待补充'}`) } @@ -2543,6 +2692,7 @@ function buildInlineReviewChangePhrases(baseState, nextState, pendingFiles = []) const fieldConfigs = [ { key: 'occurred_date', label: '发生时间', format: (value) => value || '待补充' }, { key: 'amount', label: '金额', format: (value) => formatAmountDisplay(value) || '待补充' }, + { key: 'transport_type', label: '交通类型', format: (value) => value || '待确认' }, { key: 'scene_label', label: '场景', format: (value) => value || '待补充' }, { key: 'customer_name', label: '关联客户', format: (value) => value || '待补充' }, { key: 'location', label: '业务地点', format: (value) => value || '待补充' }, @@ -2611,6 +2761,7 @@ function mergeInlineReviewFields(baseFields, inlineState) { const merged = cloneReviewEditFields(baseFields) const updateMap = { expense_type: inlineState.expense_type, + transport_type: inlineState.transport_type, occurred_date: inlineState.occurred_date, amount: inlineState.amount, customer_name: inlineState.customer_name, @@ -2699,7 +2850,7 @@ function buildReviewRiskHint(reviewPayload) { if (!riskBriefs.length) { return '' } - return '这些是我根据当前场景和历史记录给你的提醒,提交前建议顺手核对一下。' + return '这些是我根据当前单据信息、票据识别结果和规则口径给出的风险提示,提交前建议顺手核对一下。' } function buildReviewActionHint(reviewPayload) { @@ -2839,6 +2990,14 @@ export default { const composerRangeEndDate = ref(formatDateInputValue()) const composerBusinessTimeTags = ref([]) const composerBusinessTimeDraftTouched = ref(false) + const travelCalculatorOpen = ref(false) + const travelCalculatorBusy = ref(false) + const travelCalculatorError = ref('') + const travelCalculatorResult = ref(null) + const travelCalculatorForm = ref({ + days: '1', + location: '' + }) const attachedFiles = ref([]) const composerFilesExpanded = ref(false) const submitting = ref(false) @@ -2882,10 +3041,6 @@ export default { const activeReviewDocumentIndex = ref(0) const reviewDrawerMode = ref(REVIEW_DRAWER_MODE_REVIEW) const insightPanelCollapsed = ref(false) - const reviewRiskDetailDialog = ref({ - open: false, - item: null - }) const documentPreviewDialog = ref({ open: false, filename: '', @@ -2921,6 +3076,11 @@ export default { && composerRangeStartDate.value <= composerRangeEndDate.value ) }) + const travelCalculatorCanSubmit = computed(() => + !travelCalculatorBusy.value + && Number(travelCalculatorForm.value.days) >= 1 + && Boolean(String(travelCalculatorForm.value.location || '').trim()) + ) const isKnowledgeSession = computed(() => activeSessionType.value === SESSION_TYPE_KNOWLEDGE) const completedFlowStepCount = computed( () => flowSteps.value.filter((step) => step.status === FLOW_STEP_STATUS_COMPLETED).length @@ -3040,10 +3200,9 @@ export default { ).length > 0 ) const reviewPanelConfidence = computed(() => buildReviewPanelConfidence(activeReviewPayload.value, reviewInlineForm.value)) - const reviewRiskScore = computed(() => buildReviewRiskScore(activeReviewPayload.value)) const reviewRiskSummary = computed(() => buildReviewRiskSummary(activeReviewPayload.value)) const reviewRiskItems = computed(() => buildReviewRiskItems(activeReviewPayload.value)) - const reviewRiskEmpty = computed(() => reviewRiskScore.value === null && !reviewRiskItems.value.length) + const reviewRiskEmpty = computed(() => !reviewRiskItems.value.length) const reviewDocumentDrawerAvailable = computed(() => reviewDocumentCount.value > 0) const reviewRiskDrawerAvailable = computed(() => !reviewRiskEmpty.value) const reviewFlowDrawerAvailable = computed(() => flowSteps.value.length > 0) @@ -3301,7 +3460,9 @@ export default { activeReviewDocumentIndex.value = nextDocumentDrafts.length ? Math.min(activeReviewDocumentIndex.value, nextDocumentDrafts.length - 1) : 0 - reviewDrawerMode.value = REVIEW_DRAWER_MODE_REVIEW + reviewDrawerMode.value = resolveReviewRiskBriefs(payload).length + ? REVIEW_DRAWER_MODE_RISK + : REVIEW_DRAWER_MODE_REVIEW reviewInlinePendingFiles.value = [] reviewInlineEditorKey.value = '' reviewInlineErrors.value = {} @@ -3975,6 +4136,9 @@ export default { function toggleComposerDatePicker() { composerDatePickerOpen.value = !composerDatePickerOpen.value + if (composerDatePickerOpen.value) { + travelCalculatorOpen.value = false + } } function closeComposerDatePicker() { @@ -3998,13 +4162,21 @@ export default { } function handleComposerDatePickerOutside(event) { - if (!composerDatePickerOpen.value) { + if (!composerDatePickerOpen.value && !travelCalculatorOpen.value) { return } if (event.target instanceof Element && event.target.closest('.composer-date-anchor')) { return } - composerDatePickerOpen.value = false + if (event.target instanceof Element && event.target.closest('.travel-calculator-anchor')) { + return + } + if (composerDatePickerOpen.value) { + composerDatePickerOpen.value = false + } + if (travelCalculatorOpen.value && !travelCalculatorBusy.value) { + travelCalculatorOpen.value = false + } } async function applyComposerDateSelection() { @@ -4026,6 +4198,142 @@ export default { composerTextareaRef.value?.focus() } + function resolveTravelCalculatorInitialDays() { + const businessTimeContext = buildComposerBusinessTimeContext() + if (!businessTimeContext) { + return 1 + } + const startDate = businessTimeContext.start_date + const endDate = businessTimeContext.end_date || startDate + if (!isValidIsoDateString(startDate) || !isValidIsoDateString(endDate) || startDate > endDate) { + return 1 + } + const startAt = Date.parse(`${startDate}T00:00:00Z`) + const endAt = Date.parse(`${endDate}T00:00:00Z`) + if (!Number.isFinite(startAt) || !Number.isFinite(endAt)) { + return 1 + } + return Math.max(1, Math.round((endAt - startAt) / 86400000) + 1) + } + + function resolveTravelCalculatorInitialLocation() { + const slotMap = buildReviewSlotMap(activeReviewPayload.value) + const candidates = [ + reviewInlineForm.value.location, + slotMap.business_location?.normalized_value, + slotMap.business_location?.value, + slotMap.location?.normalized_value, + slotMap.location?.value, + currentUser.value?.location + ] + return String(candidates.find((item) => String(item || '').trim()) || '').trim() + } + + function openTravelCalculator() { + closeComposerDatePicker() + travelCalculatorError.value = '' + travelCalculatorResult.value = null + travelCalculatorForm.value = { + days: String(resolveTravelCalculatorInitialDays()), + location: resolveTravelCalculatorInitialLocation() + } + travelCalculatorOpen.value = true + } + + function toggleTravelCalculator() { + if (travelCalculatorOpen.value) { + closeTravelCalculator() + return + } + openTravelCalculator() + } + + function closeTravelCalculator() { + if (travelCalculatorBusy.value) { + return + } + travelCalculatorOpen.value = false + } + + function formatTravelCalculatorMoney(value) { + const amount = Number(value) + if (!Number.isFinite(amount)) { + return String(value || '0') + } + return amount.toFixed(2) + } + + function buildTravelCalculatorResultText(result) { + const days = Number(result?.days) || 1 + const location = String(result?.location || '').trim() || '未填写地点' + const matchedCity = String(result?.matched_city || location).trim() + const grade = String(result?.grade || '').trim() || '当前职级' + const gradeBandLabel = String(result?.grade_band_label || result?.grade_band || '').trim() || '对应档位' + const allowanceRegion = String(result?.allowance_region || '').trim() || '默认区域' + const ruleName = String(result?.rule_name || '').trim() || '公司差旅费报销规则' + const ruleVersion = String(result?.rule_version || '').trim() + const hotelRate = formatTravelCalculatorMoney(result?.hotel_rate) + const hotelAmount = formatTravelCalculatorMoney(result?.hotel_amount) + const mealRate = formatTravelCalculatorMoney(result?.meal_allowance_rate) + const basicRate = formatTravelCalculatorMoney(result?.basic_allowance_rate) + const allowanceRate = formatTravelCalculatorMoney(result?.total_allowance_rate) + const allowanceAmount = formatTravelCalculatorMoney(result?.allowance_amount) + const totalAmount = formatTravelCalculatorMoney(result?.total_amount) + const ruleVersionText = ruleVersion ? `(${ruleVersion})` : '' + const user = currentUser.value || {} + const displayName = String(user.name || user.display_name || user.username || '').trim() + const greeting = displayName ? `您好,${displayName},` : '您好,' + + return [ + `${greeting}根据您输入的地点和天数,我匹配到您要出差的地区为:**${matchedCity}**,出差天数为:**${days} 天**,我根据公司的报销文件给您预估金额如下:`, + '', + `**参考可报销合计:${totalAmount} 元**`, + '', + '| 项目 | 标准口径 | 天数 | 小计 |', + '| --- | --- | ---: | ---: |', + `| 住宿费 | ${matchedCity} / ${grade}(${gradeBandLabel})标准:${hotelRate} 元/天 | ${days} | ${hotelAmount} 元 |`, + `| 出差补贴 | ${allowanceRegion}:伙食 ${mealRate} 元 + 基本 ${basicRate} 元 = ${allowanceRate} 元/天 | ${days} | ${allowanceAmount} 元 |`, + '', + '**计算过程**', + `1. 住宿费:${hotelRate} × ${days} = ${hotelAmount} 元`, + `2. 出差补贴:(${mealRate} + ${basicRate}) × ${days} = ${allowanceRate} × ${days} = ${allowanceAmount} 元`, + `3. 合计:${hotelAmount} + ${allowanceAmount} = ${totalAmount} 元`, + '', + `**规则依据**:${ruleName}${ruleVersionText}。出差地点“${location}”匹配为“${matchedCity}”,当前职级“${grade}”匹配“${gradeBandLabel}”档。`, + '', + '这个结果是提交前的规则测算参考,最终仍以实际票据、审批意见和财务复核口径为准。' + ].join('\n') + } + + async function submitTravelCalculator() { + if (!travelCalculatorCanSubmit.value) { + travelCalculatorError.value = '请填写出差天数和地点后再计算。' + return + } + + travelCalculatorBusy.value = true + travelCalculatorError.value = '' + try { + const user = currentUser.value || {} + const payload = await calculateTravelReimbursement({ + days: Math.max(1, Number.parseInt(String(travelCalculatorForm.value.days || '1'), 10) || 1), + location: String(travelCalculatorForm.value.location || '').trim(), + grade: String(user.grade || '').trim() + }) + travelCalculatorResult.value = payload + messages.value.push(createMessage('assistant', buildTravelCalculatorResultText(payload), [], { + meta: ['差旅计算器'], + metaTone: 'low' + })) + travelCalculatorOpen.value = false + nextTick(scrollToBottom) + } catch (error) { + travelCalculatorError.value = error?.message || '差旅金额测算失败,请稍后重试。' + } finally { + travelCalculatorBusy.value = false + } + } + function rememberFilePreviews(filePreviews) { reviewFilePreviews.value = mergeFilePreviews(reviewFilePreviews.value, filePreviews) } @@ -4378,6 +4686,7 @@ export default { ...reviewInlineForm.value, occurred_date: String(reviewInlineForm.value.occurred_date || '').trim(), amount: String(reviewInlineForm.value.amount || '').trim(), + transport_type: String(reviewInlineForm.value.transport_type || '').trim(), customer_name: String(reviewInlineForm.value.customer_name || '').trim(), location: String(reviewInlineForm.value.location || '').trim(), merchant_name: String(reviewInlineForm.value.merchant_name || '').trim(), @@ -4473,19 +4782,13 @@ export default { }) } - function openReviewRiskDetail(item) { + function appendReviewRiskBriefToConversation(item) { if (!item) return - reviewRiskDetailDialog.value = { - open: true, - item - } - } - - function closeReviewRiskDetail() { - reviewRiskDetailDialog.value = { - ...reviewRiskDetailDialog.value, - open: false - } + messages.value.push(createMessage('assistant', buildReviewRiskConversationText(item), [], { + meta: [item.sourceLabel || item.levelLabel || '风险提示'], + metaTone: item.level || 'low' + })) + nextTick(scrollToBottom) } function goReviewDocument(direction) { @@ -5267,11 +5570,9 @@ export default { REVIEW_OTHER_CATEGORY_OPTIONS, workbenchVisible, reviewPanelConfidence, - reviewRiskScore, reviewRiskSummary, reviewRiskItems, reviewRiskEmpty, - reviewRiskDetailDialog, recognizedNarratives, reviewRecognitionNotes, reviewDocumentSummaries, @@ -5281,6 +5582,12 @@ export default { reviewCancelDialogOpen, reviewEditDialogOpen, uploadDecisionDialogOpen, + travelCalculatorOpen, + travelCalculatorBusy, + travelCalculatorError, + travelCalculatorResult, + travelCalculatorForm, + travelCalculatorCanSubmit, deleteSessionDialogOpen, reviewActionBusy, deleteSessionBusy, @@ -5331,6 +5638,10 @@ export default { resolveFlowStepStatusLabel, resolveFlowStepDetail, toggleInsightPanel, + openTravelCalculator, + toggleTravelCalculator, + closeTravelCalculator, + submitTravelCalculator, switchToReviewOverviewDrawer, toggleReviewDocumentDrawer, toggleReviewRiskDrawer, @@ -5357,8 +5668,7 @@ export default { selectReviewCategory, selectReviewOtherCategory, queryDraftByClaimNo, - openReviewRiskDetail, - closeReviewRiskDetail, + appendReviewRiskBriefToConversation, goReviewDocument, openActiveReviewDocumentPreview, closeDocumentPreview, diff --git a/web/src/views/scripts/TravelRequestDetailView.js b/web/src/views/scripts/TravelRequestDetailView.js index fc21e00..931646a 100644 --- a/web/src/views/scripts/TravelRequestDetailView.js +++ b/web/src/views/scripts/TravelRequestDetailView.js @@ -17,7 +17,12 @@ import { uploadExpenseClaimItemAttachment, updateExpenseClaimItem } from '../../services/reimbursements.js' -import { canManageExpenseClaims, canReturnExpenseClaims } from '../../utils/accessControl.js' +import { + canApproveLeaderExpenseClaims, + canManageExpenseClaims, + canReturnExpenseClaims, + isFinanceUser +} from '../../utils/accessControl.js' import { normalizeRequestForUi } from '../../utils/requestViewModel.js' import { buildAiAdviceViewModel, @@ -82,7 +87,7 @@ function resolveLocationDisplay(value, expenseType) { function buildFallbackProgressSteps() { return [ - { index: 1, label: '保存草稿', time: '已完成', done: true, active: true }, + { index: 1, label: '创建单据', time: '已完成', done: true, active: true }, { index: 2, label: '待提交', time: '进行中', active: true, current: true }, { index: 3, label: 'AI预审', time: '待处理' }, { index: 4, label: '直属领导审批', time: '待处理' }, @@ -486,20 +491,51 @@ export default { const node = String(request.value.node || request.value.approvalStage || '').trim() return node === '直属领导审批' }) - const showLeaderApprovalPanel = computed(() => - Boolean(props.approvalMode) - && request.value.approvalKey === 'in_progress' - && isDirectManagerApprovalStage.value - && Boolean(request.value.claimId) - ) + const isFinanceApprovalStage = computed(() => { + const node = String(request.value.node || request.value.approvalStage || '').trim() + return node === '财务审批' + }) const canReturnRequest = computed(() => canReturnExpenseClaims(currentUser.value) && request.value.approvalKey === 'in_progress' && Boolean(request.value.claimId) ) const canApproveRequest = computed(() => - showLeaderApprovalPanel.value - && canReturnExpenseClaims(currentUser.value) + Boolean(props.approvalMode) + && request.value.approvalKey === 'in_progress' + && Boolean(request.value.claimId) + && ( + ( + isDirectManagerApprovalStage.value + && canApproveLeaderExpenseClaims(currentUser.value) + ) + || ( + isFinanceApprovalStage.value + && isFinanceUser(currentUser.value) + ) + ) + ) + const showLeaderApprovalPanel = computed(() => canApproveRequest.value) + const approvalOpinionTitle = computed(() => (isFinanceApprovalStage.value ? '财务意见' : '领导意见')) + const approvalOpinionPlaceholder = computed(() => + isFinanceApprovalStage.value + ? '请输入财务终审意见,可补充票据核验、金额一致性或入账关注点。' + : '请输入审批意见,可补充核实情况、费用合理性或后续财务关注点。' + ) + const approvalOpinionHint = computed(() => + isFinanceApprovalStage.value ? '审核通过后将进入归档入账。' : '审批通过后将流转至财务审批。' + ) + const approvalConfirmBadge = computed(() => (isFinanceApprovalStage.value ? '财务终审' : '领导审批')) + const approvalConfirmDescription = computed(() => + isFinanceApprovalStage.value + ? '确认后该报销单会完成财务终审并进入归档入账,请确认票据、金额与财务意见无误。' + : '确认后该报销单会从直属领导审批流转到财务审批,请确认申请信息与领导意见无误。' + ) + const approvalNextStage = computed(() => (isFinanceApprovalStage.value ? '归档入账' : '财务审批')) + const approvalSuccessToast = computed(() => + isFinanceApprovalStage.value + ? `${request.value.id} 已完成财务终审,进入归档入账。` + : `${request.value.id} 已审批通过,流转至财务审批。` ) const deleteActionLabel = computed(() => (isDraftRequest.value ? '删除草稿' : '删除单据')) const deleteDialogTitle = computed(() => `确认${deleteActionLabel.value} ${request.value.id} 吗?`) @@ -564,7 +600,7 @@ export default { }, { key: 'date', - label: '日期', + label: '单据申请日期', value: request.value.applyTime || request.value.occurredDisplay, icon: 'mdi mdi-calendar-month-outline', valueClass: '' @@ -1011,12 +1047,23 @@ export default { try { const payload = await uploadExpenseClaimItemAttachment(request.value.claimId, item.id, file) expenseAttachmentMeta[item.id] = payload?.attachment || null - applyLocalExpenseItemPatch(item.id, { + const recognizedItemAmount = Number(payload?.item_amount ?? payload?.itemAmount) + const itemPatch = { invoiceId: String(payload?.invoice_id || '').trim(), attachmentHint: String(payload?.attachment?.file_name || file.name || '').trim() + } + if (Number.isFinite(recognizedItemAmount) && recognizedItemAmount > 0) { + itemPatch.itemAmount = recognizedItemAmount + itemPatch.amount = formatCurrency(recognizedItemAmount) + } + applyLocalExpenseItemPatch(item.id, { + ...itemPatch }) if (editingExpenseId.value === item.id) { expenseEditor.invoiceId = String(payload?.invoice_id || '').trim() + if (Number.isFinite(recognizedItemAmount) && recognizedItemAmount > 0) { + expenseEditor.itemAmount = String(recognizedItemAmount) + } } emit('request-updated', { claimId: request.value.claimId }) @@ -1322,7 +1369,7 @@ export default { } if (!canApproveRequest.value) { - toast('当前节点不支持领导审批通过。') + toast('当前节点暂不支持审批通过。') return } @@ -1345,7 +1392,7 @@ export default { } if (!canApproveRequest.value) { - toast('当前节点不支持领导审批通过。') + toast('当前节点暂不支持审批通过。') approveConfirmDialogOpen.value = false return } @@ -1357,7 +1404,7 @@ export default { }) approveConfirmDialogOpen.value = false leaderOpinion.value = '' - toast(`${request.value.id} 已审批通过,流转至财务审批。`) + toast(approvalSuccessToast.value) emit('request-updated', { claimId: request.value.claimId }) } catch (error) { toast(error?.message || '审批通过失败,请稍后重试。') @@ -1396,6 +1443,12 @@ export default { attachmentPreviewUrl, approveBusy, approveConfirmDialogOpen, + approvalConfirmBadge, + approvalConfirmDescription, + approvalNextStage, + approvalOpinionHint, + approvalOpinionPlaceholder, + approvalOpinionTitle, canDeleteRequest, canManageCurrentClaim, canNavigateAttachmentPreview, diff --git a/web/tests/accessControl.test.mjs b/web/tests/accessControl.test.mjs index bc7fc6a..5c88b24 100644 --- a/web/tests/accessControl.test.mjs +++ b/web/tests/accessControl.test.mjs @@ -1,7 +1,12 @@ import assert from 'node:assert/strict' import test from 'node:test' -import { canManageExpenseClaims, canReturnExpenseClaims } from '../src/utils/accessControl.js' +import { + canApproveLeaderExpenseClaims, + canManageExpenseClaims, + canReturnExpenseClaims +} from '../src/utils/accessControl.js' +import { canProcessApprovalRequest } from '../src/utils/approvalInbox.js' test('direct approvers can return claims without receiving delete permissions', () => { const managerUser = { roleCodes: ['manager'] } @@ -9,13 +14,42 @@ test('direct approvers can return claims without receiving delete permissions', assert.equal(canReturnExpenseClaims(managerUser), true) assert.equal(canReturnExpenseClaims(approverUser), true) + assert.equal(canApproveLeaderExpenseClaims(managerUser), true) + assert.equal(canApproveLeaderExpenseClaims(approverUser), true) assert.equal(canManageExpenseClaims(managerUser), false) assert.equal(canManageExpenseClaims(approverUser), false) }) -test('finance and executives can return and manage claims', () => { +test('finance can return and final approve, but only executives can manage delete permissions', () => { assert.equal(canReturnExpenseClaims({ roleCodes: ['finance'] }), true) - assert.equal(canManageExpenseClaims({ roleCodes: ['finance'] }), true) + assert.equal(canApproveLeaderExpenseClaims({ roleCodes: ['finance'] }), false) + assert.equal(canManageExpenseClaims({ roleCodes: ['finance'] }), false) assert.equal(canReturnExpenseClaims({ roleCodes: ['executive'] }), true) assert.equal(canManageExpenseClaims({ roleCodes: ['executive'] }), true) }) + +test('finance approval inbox only processes finance-stage requests', () => { + const financeUser = { roleCodes: ['finance'], name: '财务' } + + assert.equal( + canProcessApprovalRequest({ workflowNode: '财务审批', person: '张三' }, financeUser), + true + ) + assert.equal( + canProcessApprovalRequest({ workflowNode: '直属领导审批', person: '张三' }, financeUser), + false + ) +}) + +test('users with both finance and manager roles can process both relevant stages', () => { + const financeManagerUser = { roleCodes: ['finance', 'manager'], name: '李经理' } + + assert.equal( + canProcessApprovalRequest({ workflowNode: '财务审批', person: '张三' }, financeManagerUser), + true + ) + assert.equal( + canProcessApprovalRequest({ workflowNode: '直属领导审批', person: '张三' }, financeManagerUser), + true + ) +}) diff --git a/web/tests/requestProgressSteps.test.mjs b/web/tests/requestProgressSteps.test.mjs index c394a05..84a18c2 100644 --- a/web/tests/requestProgressSteps.test.mjs +++ b/web/tests/requestProgressSteps.test.mjs @@ -39,7 +39,9 @@ test('progress steps show approval operator time and current stay duration', () const leaderStep = request.progressSteps.find((step) => step.label === '直属领导审批') const financeStep = request.progressSteps.find((step) => step.label === '财务审批') const aiStep = request.progressSteps.find((step) => step.label === 'AI预审') + const firstStep = request.progressSteps[0] + assert.equal(firstStep.label, '创建单据') assert.equal(leaderStep.time, '李经理通过') assert.match(leaderStep.detail, /2026-05-20/) assert.match(leaderStep.title, /李经理审批通过/) @@ -52,6 +54,96 @@ test('progress steps show approval operator time and current stay duration', () } }) +test('progress steps do not expose approver email when manager name is available', () => { + const originalNow = Date.now + Date.now = () => new Date('2026-05-20T05:00:00.000Z').getTime() + + try { + const request = mapExpenseClaimToRequest({ + id: 'claim-email-operator', + claim_no: 'EXP-202605-003', + employee_name: '张三', + department_name: '市场部', + manager_name: '李经理', + expense_type: 'transport', + reason: '交通报销', + location: '上海', + amount: 88, + invoice_count: 1, + occurred_at: '2026-05-20T01:00:00.000Z', + submitted_at: '2026-05-20T02:00:00.000Z', + created_at: '2026-05-20T01:30:00.000Z', + updated_at: '2026-05-20T03:30:00.000Z', + status: 'submitted', + approval_stage: '财务审批', + risk_flags_json: [ + { + source: 'manual_approval', + operator: 'manager@example.com', + operator_username: 'manager@example.com', + previous_approval_stage: '直属领导审批', + next_approval_stage: '财务审批', + created_at: '2026-05-20T03:30:00.000Z' + } + ], + items: [] + }) + + const leaderStep = request.progressSteps.find((step) => step.label === '直属领导审批') + + assert.equal(leaderStep.time, '李经理通过') + assert.ok(!leaderStep.title.includes('manager@example.com')) + } finally { + Date.now = originalNow + } +}) + +test('completed finance approval marks finance and archive progress steps', () => { + const request = mapExpenseClaimToRequest({ + id: 'claim-finance-completed', + claim_no: 'EXP-202605-004', + employee_name: '张三', + department_name: '市场部', + expense_type: 'transport', + reason: '交通报销', + location: '上海', + amount: 88, + invoice_count: 1, + occurred_at: '2026-05-20T01:00:00.000Z', + submitted_at: '2026-05-20T02:00:00.000Z', + created_at: '2026-05-20T01:30:00.000Z', + updated_at: '2026-05-20T04:00:00.000Z', + status: 'approved', + approval_stage: '归档入账', + risk_flags_json: [ + { + source: 'manual_approval', + operator: '李经理', + previous_approval_stage: '直属领导审批', + next_approval_stage: '财务审批', + created_at: '2026-05-20T03:00:00.000Z' + }, + { + source: 'finance_approval', + operator: '财务复核', + previous_approval_stage: '财务审批', + next_approval_stage: '归档入账', + created_at: '2026-05-20T04:00:00.000Z' + } + ], + items: [] + }) + + const financeStep = request.progressSteps.find((step) => step.label === '财务审批') + const archiveStep = request.progressSteps.find((step) => step.label === '归档入账') + + assert.equal(request.workflowNode, '归档入账') + assert.equal(financeStep.time, '财务复核通过') + assert.match(financeStep.detail, /2026-05-20/) + assert.equal(archiveStep.time, '归档入账') + assert.equal(archiveStep.done, true) +}) + test('current direct manager step shows how long the claim has stayed there', () => { const originalNow = Date.now Date.now = () => new Date('2026-05-20T05:15:00.000Z').getTime() diff --git a/web/tests/requestViewModel.test.mjs b/web/tests/requestViewModel.test.mjs index 79c9d99..e666de2 100644 --- a/web/tests/requestViewModel.test.mjs +++ b/web/tests/requestViewModel.test.mjs @@ -31,3 +31,17 @@ test('normalizes returned backend claims as editable pending submission', () => assert.equal(request.approvalStatus, '待提交') assert.equal(request.node, '待提交') }) + +test('does not show manager email as direct supervisor name', () => { + const request = normalizeRequestForUi({ + id: 'EXP-202605-003', + claim_id: 'claim-3', + status: 'submitted', + approval_stage: '直属领导审批', + expense_type: 'transport', + amount: 66, + manager_name: 'manager@example.com' + }) + + assert.equal(request.profileManager, '待补充') +}) diff --git a/web/tests/travel-reimbursement-review-drawer-switch.test.mjs b/web/tests/travel-reimbursement-review-drawer-switch.test.mjs index 42c487a..7971f79 100644 --- a/web/tests/travel-reimbursement-review-drawer-switch.test.mjs +++ b/web/tests/travel-reimbursement-review-drawer-switch.test.mjs @@ -11,6 +11,10 @@ const createViewScript = readFileSync( fileURLToPath(new URL('../src/views/scripts/TravelReimbursementCreateView.js', import.meta.url)), 'utf8' ) +const reimbursementService = readFileSync( + fileURLToPath(new URL('../src/services/reimbursements.js', import.meta.url)), + 'utf8' +) test('review drawer tools expose the default review tab before conditional document and risk tabs', () => { assert.match(createViewTemplate, /title="报销识别核对"[\s\S]*@click="switchToReviewOverviewDrawer"/) @@ -35,3 +39,74 @@ test('review drawer tool buttons switch modes instead of toggling the active mod assert.doesNotMatch(createViewScript, /REVIEW_DRAWER_MODE_RISK\s*\?\s*REVIEW_DRAWER_MODE_REVIEW/) assert.doesNotMatch(createViewScript, /REVIEW_DRAWER_MODE_FLOW\s*\?\s*REVIEW_DRAWER_MODE_REVIEW/) }) + +test('review risk drawer lists risk briefs without score and posts details into the conversation', () => { + const riskItemsBlock = createViewScript.match(/function buildReviewRiskItems\(reviewPayload\) \{[\s\S]*?\n\}\n\nfunction buildReviewRiskConversationText/) + assert.ok(riskItemsBlock, 'risk item builder should be present') + + assert.doesNotMatch(createViewTemplate, /review-side-risk-score/) + assert.doesNotMatch(createViewTemplate, /风险评分/) + assert.doesNotMatch(createViewTemplate, /暂无风险评分/) + assert.doesNotMatch(createViewScript, /function buildReviewRiskScore/) + assert.doesNotMatch(createViewScript, /const reviewRiskScore/) + assert.doesNotMatch(riskItemsBlock[0], /\.slice\(0,\s*6\)/) + assert.match(createViewScript, /const DEPRECATED_REVIEW_RISK_TITLE_KEYWORDS = \[[\s\S]*'历史报销画像'[\s\S]*'制度注意事项'/) + assert.match( + createViewScript, + /function resolveReviewRiskBriefs\(reviewPayload\) \{[\s\S]*DEPRECATED_REVIEW_RISK_TITLE_KEYWORDS\.some/ + ) + + assert.match( + createViewTemplate, + /class="review-side-risk-item"[\s\S]*@click="appendReviewRiskBriefToConversation\(item\)"/ + ) + assert.doesNotMatch(createViewTemplate, /\{\{\s*item\.levelLabel\s*\}\}/) + assert.match(createViewTemplate, /class="review-side-risk-icon" :title="item\.levelLabel"/) + assert.match(createViewScript, /medium:\s*\{[\s\S]*label:\s*'中风险'/) + assert.match(createViewScript, /low:\s*\{[\s\S]*label:\s*'低风险'/) + assert.match(createViewScript, /function normalizeReviewRiskTitle/) + assert.match(createViewScript, /\.replace\(\/AI\\s\*预审/) + assert.match(createViewScript, /\.replace\(\/\(高风险\|中风险\|低风险\)\/g,\s*''\)/) + assert.match(createViewScript, /sourceLabel:\s*meta\.label/) + assert.doesNotMatch(createViewScript, /normalizedTitle\.includes\('AI预审'\)/) + assert.match(createViewScript, /metaTone:\s*item\.level \|\| 'low'/) + assert.doesNotMatch(createViewTemplate, /@click="openReviewRiskDetail\(item\)"/) + assert.doesNotMatch(createViewTemplate, /review-risk-detail-modal/) + assert.doesNotMatch(createViewScript, /reviewRiskDetailDialog/) + assert.doesNotMatch(createViewScript, /function openReviewRiskDetail/) + + assert.match( + createViewScript, + /function appendReviewRiskBriefToConversation\(item\) \{[\s\S]*messages\.value\.push\(createMessage\('assistant'/ + ) +}) + +test('review payload with risks opens risk drawer and travel overview uses travel-specific fields', () => { + assert.match( + createViewScript, + /reviewDrawerMode\.value = resolveReviewRiskBriefs\(payload\)\.length[\s\S]*\? REVIEW_DRAWER_MODE_RISK[\s\S]*: REVIEW_DRAWER_MODE_REVIEW/ + ) + assert.match(createViewScript, /function isTravelReviewPayload\(reviewPayload/) + assert.match(createViewScript, /function resolveReviewTravelTransportType\(reviewPayload/) + assert.match(createViewScript, /label: '交通类型'[\s\S]*modelKey: 'transport_type'/) + assert.match(createViewScript, /label: '酒店名称'[\s\S]*modelKey: 'merchant_name'/) + assert.match(createViewScript, /label: '出差事宜'[\s\S]*editor: 'textarea'[\s\S]*wide: true/) + assert.match(createViewTemplate, /item\.editor === 'textarea'[\s\S]*