diff --git a/nul b/nul deleted file mode 100644 index 49d60e3..0000000 --- a/nul +++ /dev/null @@ -1 +0,0 @@ -/usr/bin/bash: line 1: rg: command not found diff --git a/server/src/app/services/expense_claims.py b/server/src/app/services/expense_claims.py index df7966c..3d62347 100644 --- a/server/src/app/services/expense_claims.py +++ b/server/src/app/services/expense_claims.py @@ -1,65 +1,65 @@ -from __future__ import annotations - -import base64 -import binascii -import json -import mimetypes -import re -import shutil -import uuid -from collections import defaultdict -from datetime import UTC, date, datetime, timedelta -from decimal import Decimal, InvalidOperation -from pathlib import Path -from types import SimpleNamespace -from typing import Any -from urllib.parse import quote - -from sqlalchemy import and_, func, or_, select -from sqlalchemy import inspect as sqlalchemy_inspect -from sqlalchemy.exc import IntegrityError -from sqlalchemy.orm import Session, selectinload - -from app.api.deps import CurrentUserContext -from app.core.agent_enums import AgentAssetDomain, AgentAssetStatus, AgentAssetType -from app.core.config import get_settings -from app.models.agent_asset import AgentAsset -from app.models.employee import Employee -from app.models.financial_record import ExpenseClaim, ExpenseClaimItem -from app.models.organization import OrganizationUnit -from app.schemas.ontology import OntologyEntity, OntologyParseResult -from app.schemas.reimbursement import ( - ExpenseClaimItemCreate, - ExpenseClaimItemUpdate, - ExpenseClaimUpdate, - TravelReimbursementCalculatorRequest, -) -from app.services.agent_asset_rule_library import AgentAssetRuleLibraryManager -from app.services.agent_asset_spreadsheet import RISK_RULES_LIBRARY -from app.services.agent_foundation import AgentFoundationService -from app.services.audit import AuditLogService -from app.services.document_intelligence import build_document_insight -from app.services.expense_amounts import ( - extract_amount_candidates, - format_decimal_amount, - is_amount_match_date_fragment, - is_date_like_amount_candidate, - is_probable_year_amount, - parse_document_amount_value, - parse_plain_document_amount_value, - resolve_document_field_amount, - resolve_document_item_amount, - resolve_document_text_amount, -) -from app.services.expense_rule_runtime import ( - DEFAULT_SCENE_RULE_ASSET_CODE, - ExpenseRuleRuntimeService, - RuntimeTravelPolicy, - build_default_expense_rule_catalog, - resolve_document_type_label, -) -from app.services.ocr import OcrService - +from __future__ import annotations + +import base64 +import binascii +import json +import mimetypes +import re +import shutil +import uuid +from collections import defaultdict +from datetime import UTC, date, datetime, timedelta +from decimal import Decimal, InvalidOperation +from pathlib import Path +from types import SimpleNamespace +from typing import Any +from urllib.parse import quote + +from sqlalchemy import and_, func, or_, select +from sqlalchemy import inspect as sqlalchemy_inspect +from sqlalchemy.exc import IntegrityError +from sqlalchemy.orm import Session, selectinload + +from app.api.deps import CurrentUserContext +from app.core.agent_enums import AgentAssetDomain, AgentAssetStatus, AgentAssetType +from app.core.config import get_settings +from app.models.agent_asset import AgentAsset +from app.models.employee import Employee +from app.models.financial_record import ExpenseClaim, ExpenseClaimItem +from app.models.organization import OrganizationUnit +from app.schemas.ontology import OntologyEntity, OntologyParseResult +from app.schemas.reimbursement import ( + ExpenseClaimItemCreate, + ExpenseClaimItemUpdate, + ExpenseClaimUpdate, + TravelReimbursementCalculatorRequest, +) +from app.services.agent_asset_rule_library import AgentAssetRuleLibraryManager +from app.services.agent_asset_spreadsheet import RISK_RULES_LIBRARY +from app.services.agent_foundation import AgentFoundationService +from app.services.audit import AuditLogService +from app.services.document_intelligence import build_document_insight +from app.services.expense_amounts import ( + extract_amount_candidates, + format_decimal_amount, + is_amount_match_date_fragment, + is_date_like_amount_candidate, + is_probable_year_amount, + parse_document_amount_value, + parse_plain_document_amount_value, + resolve_document_field_amount, + resolve_document_item_amount, + resolve_document_text_amount, +) +from app.services.expense_rule_runtime import ( + DEFAULT_SCENE_RULE_ASSET_CODE, + ExpenseRuleRuntimeService, + RuntimeTravelPolicy, + build_default_expense_rule_catalog, + resolve_document_type_label, +) +from app.services.ocr import OcrService + EXPENSE_TYPE_LABELS = { "travel": "差旅", "train_ticket": "火车票", @@ -69,15 +69,15 @@ EXPENSE_TYPE_LABELS = { "travel_allowance": "出差补贴", "hotel": "住宿", "transport": "交通", - "meal": "餐费", - "meeting": "会务", - "entertainment": "招待", - "office": "办公", - "training": "培训", - "communication": "通讯", - "welfare": "福利", -} - + "meal": "餐费", + "meeting": "会务", + "entertainment": "招待", + "office": "办公", + "training": "培训", + "communication": "通讯", + "welfare": "福利", +} + PRIVILEGED_CLAIM_ROLE_CODES = {"finance", "executive"} APPROVAL_VISIBLE_CLAIM_ROLE_CODES = {"manager", "approver"} CLAIM_DELETE_ROLE_CODES = {"executive"} @@ -199,10 +199,10 @@ class ExpenseClaimSubmissionBlockedError(ValueError): super().__init__("提交前请先补全信息:" + ";".join(self.issues)) EXPENSE_SCENE_KEYWORDS = { - "travel": ("差旅", "出差", "行程"), - "hotel": ("酒店", "住宿", "房费", "客房", "入住", "离店"), - "transport": ( - "交通", + "travel": ("差旅", "出差", "行程"), + "hotel": ("酒店", "住宿", "房费", "客房", "入住", "离店"), + "transport": ( + "交通", "打车", "出租车", "网约车", @@ -216,25 +216,25 @@ EXPENSE_SCENE_KEYWORDS = { "的士", "高铁", "动车", - "火车", - "机票", - "航班", - "行程单", - "登机", - "客票", - "公交", - "地铁", - "过路费", - "通行费", - "停车", - ), - "meal": ("餐饮", "餐费", "用餐", "外卖", "快餐", "酒楼", "饭店", "饭馆", "食品", "咖啡"), - "entertainment": ("招待", "宴请", "接待", "客户餐", "商务餐", "业务招待"), - "office": ("办公", "办公用品", "文具", "耗材", "打印", "纸张", "硒鼓", "墨盒", "鼠标", "键盘", "电脑"), - "meeting": ("会议", "会务", "会展", "会议室", "会场", "场地费", "论坛"), - "training": ("培训", "课程", "讲师", "教材", "学费", "认证"), -} - + "火车", + "机票", + "航班", + "行程单", + "登机", + "客票", + "公交", + "地铁", + "过路费", + "通行费", + "停车", + ), + "meal": ("餐饮", "餐费", "用餐", "外卖", "快餐", "酒楼", "饭店", "饭馆", "食品", "咖啡"), + "entertainment": ("招待", "宴请", "接待", "客户餐", "商务餐", "业务招待"), + "office": ("办公", "办公用品", "文具", "耗材", "打印", "纸张", "硒鼓", "墨盒", "鼠标", "键盘", "电脑"), + "meeting": ("会议", "会务", "会展", "会议室", "会场", "场地费", "论坛"), + "training": ("培训", "课程", "讲师", "教材", "学费", "认证"), +} + EXPENSE_TYPE_ALLOWED_DOCUMENT_SCENES = { "travel": {"travel", "hotel", "transport", "meal"}, "train_ticket": {"travel"}, @@ -243,26 +243,26 @@ EXPENSE_TYPE_ALLOWED_DOCUMENT_SCENES = { "ride_ticket": {"transport"}, "travel_allowance": set(), "hotel": {"hotel"}, - "transport": {"transport", "travel"}, - "meal": {"meal", "entertainment"}, - "entertainment": {"entertainment", "meal"}, - "office": {"office"}, - "meeting": {"meeting"}, - "training": {"training"}, -} - -DOCUMENT_SCENE_LABELS = { - "travel": "差旅", - "hotel": "住宿", - "transport": "交通", - "meal": "餐饮", - "entertainment": "业务招待", - "office": "办公用品", - "meeting": "会务", - "training": "培训", - "other": "其他票据", -} - + "transport": {"transport", "travel"}, + "meal": {"meal", "entertainment"}, + "entertainment": {"entertainment", "meal"}, + "office": {"office"}, + "meeting": {"meeting"}, + "training": {"training"}, +} + +DOCUMENT_SCENE_LABELS = { + "travel": "差旅", + "hotel": "住宿", + "transport": "交通", + "meal": "餐饮", + "entertainment": "业务招待", + "office": "办公用品", + "meeting": "会务", + "training": "培训", + "other": "其他票据", +} + DOCUMENT_ASSOCIATION_REVIEW_ACTIONS = { "link_to_existing_draft", "create_new_claim_from_documents", @@ -286,10 +286,10 @@ SYSTEM_GENERATED_REASON_PREFIXES = ( "我上传了", "请按当前已识别信息", "请把当前上传的票据", - "请基于当前上传的多张票据", - "我已核对右侧识别结果", - "请同步修正逐票据识别结果", - "我已修改识别信息", + "请基于当前上传的多张票据", + "我已核对右侧识别结果", + "请同步修正逐票据识别结果", + "我已修改识别信息", "查看报销草稿", "请解释一下当前这笔报销的合规风险和待补充项", ) @@ -308,143 +308,143 @@ LEADING_REASON_TIME_PATTERNS = ( ), ) AI_REVIEW_LOOKBACK_DAYS = 90 -AI_REVIEW_REPEAT_RISK_WARNING_COUNT = 1 -AI_REVIEW_REPEAT_RISK_BLOCK_COUNT = 2 -TRAVEL_REVIEW_RELEVANT_EXPENSE_TYPES = {"travel", "hotel", "transport"} -TRAVEL_REVIEW_LONG_DISTANCE_DOCUMENT_TYPES = {"flight_itinerary", "train_ticket"} -TRAVEL_POLICY_CITY_TIERS = { - "北京": "tier_1", - "上海": "tier_1", - "广州": "tier_1", - "深圳": "tier_1", - "杭州": "tier_2", - "南京": "tier_2", - "苏州": "tier_2", - "武汉": "tier_2", - "成都": "tier_2", - "重庆": "tier_2", - "西安": "tier_2", - "天津": "tier_2", - "宁波": "tier_2", - "厦门": "tier_2", - "青岛": "tier_2", - "长沙": "tier_2", - "郑州": "tier_2", - "合肥": "tier_2", - "济南": "tier_2", - "沈阳": "tier_2", - "大连": "tier_2", - "福州": "tier_2", - "昆明": "tier_2", - "海口": "tier_2", - "三亚": "tier_2", - "无锡": "tier_2", - "东莞": "tier_2", - "佛山": "tier_2", -} -TRAVEL_POLICY_CITY_MATCH_ORDER = tuple( - sorted(TRAVEL_POLICY_CITY_TIERS.keys(), key=lambda item: len(item), reverse=True) -) -TRAVEL_POLICY_BAND_LABELS = { - "junior": "P1-P3", - "mid": "P4-P5", - "senior": "P6-P7", - "manager": "M1-M2", - "executive": "M3及以上 / D序列", -} -TRAVEL_POLICY_HOTEL_LIMITS = { - "junior": { - "tier_1": Decimal("450.00"), - "tier_2": Decimal("380.00"), - "tier_3": Decimal("320.00"), - }, - "mid": { - "tier_1": Decimal("550.00"), - "tier_2": Decimal("480.00"), - "tier_3": Decimal("380.00"), - }, - "senior": { - "tier_1": Decimal("700.00"), - "tier_2": Decimal("620.00"), - "tier_3": Decimal("520.00"), - }, - "manager": { - "tier_1": Decimal("900.00"), - "tier_2": Decimal("820.00"), - "tier_3": Decimal("720.00"), - }, - "executive": { - "tier_1": Decimal("1200.00"), - "tier_2": Decimal("1000.00"), - "tier_3": Decimal("900.00"), - }, -} -TRAVEL_POLICY_ALLOWED_TRANSPORT_LEVELS = { - "junior": {"flight": 1, "train": 1}, - "mid": {"flight": 1, "train": 1}, - "senior": {"flight": 2, "train": 2}, - "manager": {"flight": 3, "train": 3}, - "executive": {"flight": 4, "train": 3}, -} -TRAVEL_POLICY_ROUTE_EXCEPTION_KEYWORDS = ( - "中转", - "转机", - "经停", - "改签", - "多地出差", - "多城市", - "多站", - "异地返程", - "异地结束", - "临时变更", - "继续前往", - "第二站", -) -TRAVEL_POLICY_STANDARD_EXCEPTION_KEYWORDS = ( - "超标说明", - "无直达", - "展会高峰", - "会议高峰", - "协议酒店满房", - "客户指定", - "临时改签", - "行程变更", - "红眼航班", - "晚到店", -) -TRAVEL_POLICY_FLIGHT_CLASS_PATTERNS = ( - ("头等舱", 4), - ("公务舱", 3), - ("商务舱", 3), - ("超级经济舱", 2), - ("高端经济舱", 2), - ("明珠经济舱", 2), - ("经济舱", 1), -) -TRAVEL_POLICY_TRAIN_CLASS_PATTERNS = ( - ("商务座", 3), - ("一等座", 2), - ("软卧", 2), - ("二等座", 1), - ("二等卧", 1), - ("硬卧", 1), -) -TRAVEL_POLICY_HOTEL_NIGHT_PATTERN = re.compile(r"(\d+)\s*(?:晚|间夜)") - - -class ExpenseClaimService: - def __init__(self, db: Session) -> None: - self.db = db - self.audit_service = AuditLogService(db) - +AI_REVIEW_REPEAT_RISK_WARNING_COUNT = 1 +AI_REVIEW_REPEAT_RISK_BLOCK_COUNT = 2 +TRAVEL_REVIEW_RELEVANT_EXPENSE_TYPES = {"travel", "hotel", "transport"} +TRAVEL_REVIEW_LONG_DISTANCE_DOCUMENT_TYPES = {"flight_itinerary", "train_ticket"} +TRAVEL_POLICY_CITY_TIERS = { + "北京": "tier_1", + "上海": "tier_1", + "广州": "tier_1", + "深圳": "tier_1", + "杭州": "tier_2", + "南京": "tier_2", + "苏州": "tier_2", + "武汉": "tier_2", + "成都": "tier_2", + "重庆": "tier_2", + "西安": "tier_2", + "天津": "tier_2", + "宁波": "tier_2", + "厦门": "tier_2", + "青岛": "tier_2", + "长沙": "tier_2", + "郑州": "tier_2", + "合肥": "tier_2", + "济南": "tier_2", + "沈阳": "tier_2", + "大连": "tier_2", + "福州": "tier_2", + "昆明": "tier_2", + "海口": "tier_2", + "三亚": "tier_2", + "无锡": "tier_2", + "东莞": "tier_2", + "佛山": "tier_2", +} +TRAVEL_POLICY_CITY_MATCH_ORDER = tuple( + sorted(TRAVEL_POLICY_CITY_TIERS.keys(), key=lambda item: len(item), reverse=True) +) +TRAVEL_POLICY_BAND_LABELS = { + "junior": "P1-P3", + "mid": "P4-P5", + "senior": "P6-P7", + "manager": "M1-M2", + "executive": "M3及以上 / D序列", +} +TRAVEL_POLICY_HOTEL_LIMITS = { + "junior": { + "tier_1": Decimal("450.00"), + "tier_2": Decimal("380.00"), + "tier_3": Decimal("320.00"), + }, + "mid": { + "tier_1": Decimal("550.00"), + "tier_2": Decimal("480.00"), + "tier_3": Decimal("380.00"), + }, + "senior": { + "tier_1": Decimal("700.00"), + "tier_2": Decimal("620.00"), + "tier_3": Decimal("520.00"), + }, + "manager": { + "tier_1": Decimal("900.00"), + "tier_2": Decimal("820.00"), + "tier_3": Decimal("720.00"), + }, + "executive": { + "tier_1": Decimal("1200.00"), + "tier_2": Decimal("1000.00"), + "tier_3": Decimal("900.00"), + }, +} +TRAVEL_POLICY_ALLOWED_TRANSPORT_LEVELS = { + "junior": {"flight": 1, "train": 1}, + "mid": {"flight": 1, "train": 1}, + "senior": {"flight": 2, "train": 2}, + "manager": {"flight": 3, "train": 3}, + "executive": {"flight": 4, "train": 3}, +} +TRAVEL_POLICY_ROUTE_EXCEPTION_KEYWORDS = ( + "中转", + "转机", + "经停", + "改签", + "多地出差", + "多城市", + "多站", + "异地返程", + "异地结束", + "临时变更", + "继续前往", + "第二站", +) +TRAVEL_POLICY_STANDARD_EXCEPTION_KEYWORDS = ( + "超标说明", + "无直达", + "展会高峰", + "会议高峰", + "协议酒店满房", + "客户指定", + "临时改签", + "行程变更", + "红眼航班", + "晚到店", +) +TRAVEL_POLICY_FLIGHT_CLASS_PATTERNS = ( + ("头等舱", 4), + ("公务舱", 3), + ("商务舱", 3), + ("超级经济舱", 2), + ("高端经济舱", 2), + ("明珠经济舱", 2), + ("经济舱", 1), +) +TRAVEL_POLICY_TRAIN_CLASS_PATTERNS = ( + ("商务座", 3), + ("一等座", 2), + ("软卧", 2), + ("二等座", 1), + ("二等卧", 1), + ("硬卧", 1), +) +TRAVEL_POLICY_HOTEL_NIGHT_PATTERN = re.compile(r"(\d+)\s*(?:晚|间夜)") + + +class ExpenseClaimService: + def __init__(self, db: Session) -> None: + self.db = db + self.audit_service = AuditLogService(db) + def list_claims(self, current_user: CurrentUserContext) -> list[ExpenseClaim]: stmt = ( select(ExpenseClaim) .options( selectinload(ExpenseClaim.items), - selectinload(ExpenseClaim.employee).selectinload(Employee.manager), - selectinload(ExpenseClaim.employee).selectinload(Employee.roles), - ) + selectinload(ExpenseClaim.employee).selectinload(Employee.manager), + selectinload(ExpenseClaim.employee).selectinload(Employee.roles), + ) .order_by(ExpenseClaim.created_at.desc(), ExpenseClaim.occurred_at.desc()) ) stmt = self._apply_claim_scope(stmt, current_user) @@ -468,8 +468,8 @@ class ExpenseClaimService: select(ExpenseClaim) .options( selectinload(ExpenseClaim.items), - selectinload(ExpenseClaim.employee).selectinload(Employee.manager), - selectinload(ExpenseClaim.employee).selectinload(Employee.roles), + selectinload(ExpenseClaim.employee).selectinload(Employee.manager), + selectinload(ExpenseClaim.employee).selectinload(Employee.roles), ) .where(ExpenseClaim.id == claim_id) ) @@ -510,12 +510,12 @@ class ExpenseClaimService: def update_claim_item( self, *, - claim_id: str, - item_id: str, - payload: ExpenseClaimItemUpdate, - current_user: CurrentUserContext, - ) -> ExpenseClaim | None: - claim = self.get_claim(claim_id, current_user) + claim_id: str, + item_id: str, + payload: ExpenseClaimItemUpdate, + current_user: CurrentUserContext, + ) -> ExpenseClaim | None: + claim = self.get_claim(claim_id, current_user) if claim is None: return None @@ -524,11 +524,11 @@ class ExpenseClaimService: if item is None: raise LookupError("Item not found") self._ensure_mutable_claim_item(item) - - before_json = self._serialize_claim(claim) - - if payload.item_date is not None: - item.item_date = payload.item_date + + before_json = self._serialize_claim(claim) + + if payload.item_date is not None: + item.item_date = payload.item_date if payload.item_type is not None: item.item_type = self._normalize_optional_text(payload.item_type, fallback=item.item_type) or item.item_type if payload.item_reason is not None: @@ -544,170 +544,170 @@ class ExpenseClaimService: if amount < Decimal("0.00"): raise ValueError("费用金额不能小于 0。") item.item_amount = amount - if payload.invoice_id is not None: - item.invoice_id = self._normalize_optional_text(payload.invoice_id, allow_empty=True) - - self._refresh_item_attachment_analysis(item) - self._sync_claim_from_items(claim) - self.db.commit() - self.db.refresh(claim) - - self.audit_service.log_action( - actor=current_user.name or current_user.username, - action="expense_claim.item_update", - resource_type="expense_claim", - resource_id=claim.id, - before_json=before_json, - after_json=self._serialize_claim(claim), - ) - - return claim - - def create_claim_item( - self, - *, - claim_id: str, - payload: ExpenseClaimItemCreate | None, - current_user: CurrentUserContext, - ) -> ExpenseClaim | None: - claim = self.get_claim(claim_id, current_user) + if payload.invoice_id is not None: + item.invoice_id = self._normalize_optional_text(payload.invoice_id, allow_empty=True) + + self._refresh_item_attachment_analysis(item) + self._sync_claim_from_items(claim) + self.db.commit() + self.db.refresh(claim) + + self.audit_service.log_action( + actor=current_user.name or current_user.username, + action="expense_claim.item_update", + resource_type="expense_claim", + resource_id=claim.id, + before_json=before_json, + after_json=self._serialize_claim(claim), + ) + + return claim + + def create_claim_item( + self, + *, + claim_id: str, + payload: ExpenseClaimItemCreate | None, + current_user: CurrentUserContext, + ) -> ExpenseClaim | None: + claim = self.get_claim(claim_id, current_user) if claim is None: return None self._ensure_draft_claim(claim) before_json = self._serialize_claim(claim) payload = payload or ExpenseClaimItemCreate() - - occurred_at = claim.occurred_at if claim.occurred_at is not None else datetime.now(UTC) - item_amount = Decimal("0.00") - if payload.item_amount is not None: - item_amount = payload.item_amount.quantize(Decimal("0.01")) - if item_amount < Decimal("0.00"): - raise ValueError("费用金额不能小于 0。") - - item = ExpenseClaimItem( - claim_id=claim.id, - item_date=payload.item_date or occurred_at.date(), - item_type=self._normalize_optional_text( - payload.item_type, - fallback=str(claim.expense_type or "").strip() or "other", - ) - or "other", - item_reason=self._normalize_optional_text(payload.item_reason, fallback="") or "", - item_location=self._normalize_optional_text(payload.item_location, fallback="") or "", - item_amount=item_amount, - invoice_id=self._normalize_optional_text(payload.invoice_id, allow_empty=True), - ) - claim.items.append(item) - self.db.add(item) - - self._sync_claim_from_items(claim) - self.db.commit() - self.db.refresh(claim) - - self.audit_service.log_action( - actor=current_user.name or current_user.username, - action="expense_claim.item_create", - resource_type="expense_claim", - resource_id=claim.id, - before_json=before_json, - after_json=self._serialize_claim(claim), - ) - - return claim - - def delete_claim_item( - self, - *, - claim_id: str, - item_id: str, - current_user: CurrentUserContext, - ) -> dict[str, Any] | None: - claim, item = self._get_claim_item_or_raise( - claim_id=claim_id, - item_id=item_id, - current_user=current_user, - ) - if claim is None: - return None - - self._ensure_draft_claim(claim) - before_json = self._serialize_claim(claim) - item_label = str(item.item_reason or "").strip() or self._resolve_expense_type_label(item.item_type) - - self._delete_item_attachment_files(item) - claim.items = [entry for entry in claim.items if entry.id != item.id] - self.db.delete(item) - - self._sync_claim_from_items(claim) - self.db.commit() - self.db.refresh(claim) - - self.audit_service.log_action( - actor=current_user.name or current_user.username, - action="expense_claim.item_delete", - resource_type="expense_claim", - resource_id=claim.id, - before_json=before_json, - after_json=self._serialize_claim(claim), - ) - - return { - "message": f"费用明细“{item_label}”已删除。", - "claim_id": claim.id, - "item_id": item.id, - } - - def upload_claim_item_attachment( - self, - *, - claim_id: str, - item_id: str, - filename: str, - content: bytes, - media_type: str | None, - current_user: CurrentUserContext, - ) -> dict[str, Any] | None: - claim, item = self._get_claim_item_or_raise( - claim_id=claim_id, - item_id=item_id, - current_user=current_user, - ) + + occurred_at = claim.occurred_at if claim.occurred_at is not None else datetime.now(UTC) + item_amount = Decimal("0.00") + if payload.item_amount is not None: + item_amount = payload.item_amount.quantize(Decimal("0.01")) + if item_amount < Decimal("0.00"): + raise ValueError("费用金额不能小于 0。") + + item = ExpenseClaimItem( + claim_id=claim.id, + item_date=payload.item_date or occurred_at.date(), + item_type=self._normalize_optional_text( + payload.item_type, + fallback=str(claim.expense_type or "").strip() or "other", + ) + or "other", + item_reason=self._normalize_optional_text(payload.item_reason, fallback="") or "", + item_location=self._normalize_optional_text(payload.item_location, fallback="") or "", + item_amount=item_amount, + invoice_id=self._normalize_optional_text(payload.invoice_id, allow_empty=True), + ) + claim.items.append(item) + self.db.add(item) + + self._sync_claim_from_items(claim) + self.db.commit() + self.db.refresh(claim) + + self.audit_service.log_action( + actor=current_user.name or current_user.username, + action="expense_claim.item_create", + resource_type="expense_claim", + resource_id=claim.id, + before_json=before_json, + after_json=self._serialize_claim(claim), + ) + + return claim + + def delete_claim_item( + self, + *, + claim_id: str, + item_id: str, + current_user: CurrentUserContext, + ) -> dict[str, Any] | None: + claim, item = self._get_claim_item_or_raise( + claim_id=claim_id, + item_id=item_id, + current_user=current_user, + ) + if claim is None: + return None + + self._ensure_draft_claim(claim) + before_json = self._serialize_claim(claim) + item_label = str(item.item_reason or "").strip() or self._resolve_expense_type_label(item.item_type) + + self._delete_item_attachment_files(item) + claim.items = [entry for entry in claim.items if entry.id != item.id] + self.db.delete(item) + + self._sync_claim_from_items(claim) + self.db.commit() + self.db.refresh(claim) + + self.audit_service.log_action( + actor=current_user.name or current_user.username, + action="expense_claim.item_delete", + resource_type="expense_claim", + resource_id=claim.id, + before_json=before_json, + after_json=self._serialize_claim(claim), + ) + + return { + "message": f"费用明细“{item_label}”已删除。", + "claim_id": claim.id, + "item_id": item.id, + } + + def upload_claim_item_attachment( + self, + *, + claim_id: str, + item_id: str, + filename: str, + content: bytes, + media_type: str | None, + current_user: CurrentUserContext, + ) -> dict[str, Any] | None: + claim, item = self._get_claim_item_or_raise( + claim_id=claim_id, + item_id=item_id, + current_user=current_user, + ) if claim is None: return None self._ensure_draft_claim(claim) self._ensure_mutable_claim_item(item) normalized_name = self._normalize_attachment_filename(filename) - if not content: - raise ValueError("上传文件不能为空。") - - before_json = self._serialize_claim(claim) - attachment_dir = self._build_item_attachment_dir(claim.id, item.id) - shutil.rmtree(attachment_dir, ignore_errors=True) - attachment_dir.mkdir(parents=True, exist_ok=True) - - file_path = attachment_dir / normalized_name - file_path.write_bytes(content) - resolved_media_type = self._resolve_attachment_media_type( - normalized_name, - fallback=media_type, - ) - - attachment_analysis = self._build_fallback_attachment_analysis( - media_type=media_type, - item=item, - ) - ocr_document = None - document_info = None - requirement_check = None - ocr_status = "empty" - ocr_error = "" - try: - ocr_result = OcrService(self.db).recognize_files( - [(normalized_name, content, media_type or "application/octet-stream")] - ) - documents = list(ocr_result.documents or []) + if not content: + raise ValueError("上传文件不能为空。") + + before_json = self._serialize_claim(claim) + attachment_dir = self._build_item_attachment_dir(claim.id, item.id) + shutil.rmtree(attachment_dir, ignore_errors=True) + attachment_dir.mkdir(parents=True, exist_ok=True) + + file_path = attachment_dir / normalized_name + file_path.write_bytes(content) + resolved_media_type = self._resolve_attachment_media_type( + normalized_name, + fallback=media_type, + ) + + attachment_analysis = self._build_fallback_attachment_analysis( + media_type=media_type, + item=item, + ) + ocr_document = None + document_info = None + requirement_check = None + ocr_status = "empty" + ocr_error = "" + try: + ocr_result = OcrService(self.db).recognize_files( + [(normalized_name, content, media_type or "application/octet-stream")] + ) + documents = list(ocr_result.documents or []) if documents: ocr_document = documents[0] ocr_status = "recognized" @@ -742,65 +742,65 @@ class ExpenseClaimService: document_info=document_info, requirement_check=requirement_check, ) - except Exception as exc: # pragma: no cover - fallback path depends on OCR runtime - ocr_status = "failed" - ocr_error = str(exc) - attachment_analysis = self._build_failed_ocr_attachment_analysis( - media_type=media_type, - error_message=ocr_error, - item=item, - ) - - item.invoice_id = self._to_attachment_storage_key(file_path) - preview_meta = self._build_attachment_preview_meta( - file_path=file_path, - media_type=resolved_media_type, - ocr_document=ocr_document, - ) - meta = { - "file_name": normalized_name, - "storage_key": item.invoice_id, - "media_type": resolved_media_type, - "size_bytes": len(content), - "uploaded_at": datetime.now(UTC).isoformat(), - "previewable": bool(preview_meta["previewable"]), - "preview_kind": str(preview_meta["preview_kind"]), - "preview_storage_key": str(preview_meta["preview_storage_key"]), - "preview_media_type": str(preview_meta["preview_media_type"]), - "preview_file_name": str(preview_meta["preview_file_name"]), - "analysis": attachment_analysis, - "document_info": document_info, - "requirement_check": requirement_check, - "ocr_status": ocr_status, - "ocr_error": ocr_error, - "ocr_text": str(getattr(ocr_document, "text", "") or ""), - "ocr_summary": str(getattr(ocr_document, "summary", "") or ""), - "ocr_avg_score": float(getattr(ocr_document, "avg_score", 0.0) or 0.0), - "ocr_line_count": int(getattr(ocr_document, "line_count", 0) or 0), - "ocr_classification_source": str(getattr(ocr_document, "classification_source", "") or ""), - "ocr_classification_confidence": float(getattr(ocr_document, "classification_confidence", 0.0) or 0.0), - "ocr_classification_evidence": [ - str(item) - for item in getattr(ocr_document, "classification_evidence", []) or [] - if str(item).strip() - ], - "ocr_warnings": [str(item) for item in getattr(ocr_document, "warnings", []) or []], - } - self._write_attachment_meta(file_path, meta) - - self._sync_claim_from_items(claim) - self.db.commit() - self.db.refresh(claim) - - self.audit_service.log_action( - actor=current_user.name or current_user.username, - action="expense_claim.attachment_upload", - resource_type="expense_claim", - resource_id=claim.id, - before_json=before_json, - after_json=self._serialize_claim(claim), - ) - + except Exception as exc: # pragma: no cover - fallback path depends on OCR runtime + ocr_status = "failed" + ocr_error = str(exc) + attachment_analysis = self._build_failed_ocr_attachment_analysis( + media_type=media_type, + error_message=ocr_error, + item=item, + ) + + item.invoice_id = self._to_attachment_storage_key(file_path) + preview_meta = self._build_attachment_preview_meta( + file_path=file_path, + media_type=resolved_media_type, + ocr_document=ocr_document, + ) + meta = { + "file_name": normalized_name, + "storage_key": item.invoice_id, + "media_type": resolved_media_type, + "size_bytes": len(content), + "uploaded_at": datetime.now(UTC).isoformat(), + "previewable": bool(preview_meta["previewable"]), + "preview_kind": str(preview_meta["preview_kind"]), + "preview_storage_key": str(preview_meta["preview_storage_key"]), + "preview_media_type": str(preview_meta["preview_media_type"]), + "preview_file_name": str(preview_meta["preview_file_name"]), + "analysis": attachment_analysis, + "document_info": document_info, + "requirement_check": requirement_check, + "ocr_status": ocr_status, + "ocr_error": ocr_error, + "ocr_text": str(getattr(ocr_document, "text", "") or ""), + "ocr_summary": str(getattr(ocr_document, "summary", "") or ""), + "ocr_avg_score": float(getattr(ocr_document, "avg_score", 0.0) or 0.0), + "ocr_line_count": int(getattr(ocr_document, "line_count", 0) or 0), + "ocr_classification_source": str(getattr(ocr_document, "classification_source", "") or ""), + "ocr_classification_confidence": float(getattr(ocr_document, "classification_confidence", 0.0) or 0.0), + "ocr_classification_evidence": [ + str(item) + for item in getattr(ocr_document, "classification_evidence", []) or [] + if str(item).strip() + ], + "ocr_warnings": [str(item) for item in getattr(ocr_document, "warnings", []) or []], + } + self._write_attachment_meta(file_path, meta) + + self._sync_claim_from_items(claim) + self.db.commit() + self.db.refresh(claim) + + self.audit_service.log_action( + actor=current_user.name or current_user.username, + action="expense_claim.attachment_upload", + resource_type="expense_claim", + resource_id=claim.id, + before_json=before_json, + after_json=self._serialize_claim(claim), + ) + return { "message": f"{normalized_name} 已上传并关联到当前费用明细。", "claim_id": claim.id, @@ -814,113 +814,113 @@ class ExpenseClaimService: "claim_amount": claim.amount, "attachment": self._build_attachment_payload(item), } - - def get_claim_item_attachment_meta( - self, - *, - claim_id: str, - item_id: str, - current_user: CurrentUserContext, - ) -> dict[str, Any] | None: - claim, item = self._get_claim_item_or_raise( - claim_id=claim_id, - item_id=item_id, - current_user=current_user, - ) - if claim is None: - return None - - return self._build_attachment_payload(item) - - def get_claim_item_attachment_content( - self, - *, - claim_id: str, - item_id: str, - current_user: CurrentUserContext, - ) -> tuple[Path, str, str] | None: - claim, item = self._get_claim_item_or_raise( - claim_id=claim_id, - item_id=item_id, - current_user=current_user, - ) - if claim is None: - return None - - return self._resolve_item_attachment_content(item) - - def get_claim_item_attachment_preview_content( - self, - *, - claim_id: str, - item_id: str, - current_user: CurrentUserContext, - ) -> tuple[Path, str, str] | None: - claim, item = self._get_claim_item_or_raise( - claim_id=claim_id, - item_id=item_id, - current_user=current_user, - ) - if claim is None: - return None - - return self._resolve_item_attachment_preview_content(item) - - def delete_claim_item_attachment( - self, - *, - claim_id: str, - item_id: str, - current_user: CurrentUserContext, - ) -> dict[str, Any] | None: - claim, item = self._get_claim_item_or_raise( - claim_id=claim_id, - item_id=item_id, - current_user=current_user, - ) + + def get_claim_item_attachment_meta( + self, + *, + claim_id: str, + item_id: str, + current_user: CurrentUserContext, + ) -> dict[str, Any] | None: + claim, item = self._get_claim_item_or_raise( + claim_id=claim_id, + item_id=item_id, + current_user=current_user, + ) + if claim is None: + return None + + return self._build_attachment_payload(item) + + def get_claim_item_attachment_content( + self, + *, + claim_id: str, + item_id: str, + current_user: CurrentUserContext, + ) -> tuple[Path, str, str] | None: + claim, item = self._get_claim_item_or_raise( + claim_id=claim_id, + item_id=item_id, + current_user=current_user, + ) + if claim is None: + return None + + return self._resolve_item_attachment_content(item) + + def get_claim_item_attachment_preview_content( + self, + *, + claim_id: str, + item_id: str, + current_user: CurrentUserContext, + ) -> tuple[Path, str, str] | None: + claim, item = self._get_claim_item_or_raise( + claim_id=claim_id, + item_id=item_id, + current_user=current_user, + ) + if claim is None: + return None + + return self._resolve_item_attachment_preview_content(item) + + def delete_claim_item_attachment( + self, + *, + claim_id: str, + item_id: str, + current_user: CurrentUserContext, + ) -> dict[str, Any] | None: + claim, item = self._get_claim_item_or_raise( + claim_id=claim_id, + item_id=item_id, + current_user=current_user, + ) if claim is None: return None self._ensure_draft_claim(claim) self._ensure_mutable_claim_item(item) before_json = self._serialize_claim(claim) - previous_name = self._resolve_attachment_display_name(item.invoice_id) - self._delete_item_attachment_files(item) - item.invoice_id = None - - self._sync_claim_from_items(claim) - self.db.commit() - self.db.refresh(claim) - - self.audit_service.log_action( - actor=current_user.name or current_user.username, - action="expense_claim.attachment_delete", - resource_type="expense_claim", - resource_id=claim.id, - before_json=before_json, - after_json=self._serialize_claim(claim), - ) - - return { - "message": f"{previous_name or '附件'} 已删除。", - "claim_id": claim.id, - "item_id": item.id, - "invoice_id": item.invoice_id, - "attachment": None, - } - - def submit_claim(self, claim_id: str, current_user: CurrentUserContext) -> ExpenseClaim | None: - claim = self.get_claim(claim_id, current_user) - if claim is None: - return None - + previous_name = self._resolve_attachment_display_name(item.invoice_id) + self._delete_item_attachment_files(item) + item.invoice_id = None + + self._sync_claim_from_items(claim) + self.db.commit() + self.db.refresh(claim) + + self.audit_service.log_action( + actor=current_user.name or current_user.username, + action="expense_claim.attachment_delete", + resource_type="expense_claim", + resource_id=claim.id, + before_json=before_json, + after_json=self._serialize_claim(claim), + ) + + return { + "message": f"{previous_name or '附件'} 已删除。", + "claim_id": claim.id, + "item_id": item.id, + "invoice_id": item.invoice_id, + "attachment": None, + } + + def submit_claim(self, claim_id: str, current_user: CurrentUserContext) -> ExpenseClaim | None: + claim = self.get_claim(claim_id, current_user) + if claim is None: + return None + self._ensure_draft_claim(claim) self._backfill_claim_identity_from_current_user(claim, current_user) self._sync_claim_from_items(claim) missing_fields = self._validate_claim_for_submission(claim) if missing_fields: raise ExpenseClaimSubmissionBlockedError(missing_fields) - + before_json = self._serialize_claim(claim) review_result = self._run_ai_submission_review(claim) @@ -931,7 +931,7 @@ 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", @@ -944,19 +944,24 @@ class ExpenseClaimService: self._delete_claim_assistant_sessions(claim.id) return claim - + def save_or_submit_from_ontology( self, *, run_id: str, user_id: str | None, - message: str, + message: str, ontology: OntologyParseResult, context_json: dict[str, Any], ) -> dict[str, Any]: review_action = str(context_json.get("review_action") or "").strip() if review_action not in PERSISTENT_EXPENSE_REVIEW_ACTIONS: - return self._build_expense_review_preview_result(context_json) + return self._build_expense_review_preview_result( + user_id=user_id, + message=message, + ontology=ontology, + context_json=context_json, + ) result = self.upsert_draft_from_ontology( run_id=run_id, @@ -968,23 +973,23 @@ class ExpenseClaimService: if review_action != "next_step": return result - - claim_id = str(result.get("claim_id") or "").strip() - if not claim_id or result.get("draft_limit_reached"): - return result - - current_user = CurrentUserContext( - username=str(user_id or context_json.get("name") or "anonymous").strip() or "anonymous", - name=str(context_json.get("name") or user_id or "anonymous").strip() or "anonymous", - role_codes=[ - str(item).strip() - for item in list(context_json.get("role_codes") or []) - if str(item).strip() + + claim_id = str(result.get("claim_id") or "").strip() + if not claim_id or result.get("draft_limit_reached"): + return result + + current_user = CurrentUserContext( + username=str(user_id or context_json.get("name") or "anonymous").strip() or "anonymous", + name=str(context_json.get("name") or user_id or "anonymous").strip() or "anonymous", + role_codes=[ + str(item).strip() + for item in list(context_json.get("role_codes") or []) + if str(item).strip() ], is_admin=bool(context_json.get("is_admin")), department_name=str(context_json.get("department_name") or context_json.get("department") or "").strip(), ) - + try: claim = self.submit_claim(claim_id, current_user) except ExpenseClaimSubmissionBlockedError as exc: @@ -1006,60 +1011,74 @@ class ExpenseClaimService: "missing_fields": [message] if message else [], "draft_only": False, } - - if claim is None: - return { - **result, - "message": "未找到可提交的报销单,请刷新后重试。", - "submission_blocked": True, - "draft_only": False, - } - - if str(claim.status or "").strip().lower() != "submitted": - review_message = "" - for flag in list(claim.risk_flags_json or []): - if not isinstance(flag, dict): - continue - if str(flag.get("source") or "").strip() != "submission_review": - continue - review_message = str(flag.get("message") or "").strip() - if review_message: - break - return { + + if claim is None: + return { + **result, + "message": "未找到可提交的报销单,请刷新后重试。", + "submission_blocked": True, + "draft_only": False, + } + + if str(claim.status or "").strip().lower() != "submitted": + review_message = "" + for flag in list(claim.risk_flags_json or []): + if not isinstance(flag, dict): + continue + if str(flag.get("source") or "").strip() != "submission_review": + continue + review_message = str(flag.get("message") or "").strip() + if review_message: + break + return { "message": review_message or f"报销单 {claim.claim_no} 经 AI预审后转为待补充,请先修正后再提交。", - "submission_blocked": True, - "draft_only": False, - "claim_id": claim.id, - "claim_no": claim.claim_no, - "status": claim.status, - "approval_stage": claim.approval_stage, - "amount": float(claim.amount), - "invoice_count": int(claim.invoice_count or 0), - } - - return { - "message": ( + "submission_blocked": True, + "draft_only": False, + "claim_id": claim.id, + "claim_no": claim.claim_no, + "status": claim.status, + "approval_stage": claim.approval_stage, + "amount": float(claim.amount), + "invoice_count": int(claim.invoice_count or 0), + } + + return { + "message": ( f"报销单 {claim.claim_no} 已完成 AI预审," - f"当前节点为 {claim.approval_stage or '审批中'}。" - ), - "draft_only": False, - "claim_id": claim.id, - "claim_no": claim.claim_no, - "status": claim.status, - "approval_stage": claim.approval_stage, - "amount": float(claim.amount), + f"当前节点为 {claim.approval_stage or '审批中'}。" + ), + "draft_only": False, + "claim_id": claim.id, + "claim_no": claim.claim_no, + "status": claim.status, + "approval_stage": claim.approval_stage, + "amount": float(claim.amount), "invoice_count": int(claim.invoice_count or 0), } - def _build_expense_review_preview_result(self, context_json: dict[str, Any]) -> dict[str, Any]: + def _build_expense_review_preview_result( + self, + *, + user_id: str | None, + message: str, + ontology: OntologyParseResult, + context_json: dict[str, Any], + ) -> dict[str, Any]: attachment_count = self._resolve_attachment_count(context_json) + calculation_copy = self._build_expense_review_preview_calculation_copy( + user_id=user_id, + message=message, + ontology=ontology, + context_json=context_json, + ) return { - "message": ( - "我已先整理出本次报销的待核对信息。" - "如果附件还没有上传,金额可以先按制度口径做参考测算:" - "差旅费按“交通票据金额 + 住宿标准 × 出差天数 + 出差补贴 × 出差天数”估算;" - "交通费、住宿费等其他费用以实际票据金额为基础,再按规则中心限额和审批口径复核。" - "后续补充票据后,我会用真实票据金额重新校验。" + "message": "\n\n".join( + item + for item in [ + "我已先整理出本次报销的待核对信息。下面是基于当前信息的制度测算,票据补齐后会按真实金额重新复核。", + calculation_copy, + ] + if item ), "draft_only": True, "preview_only": True, @@ -1067,6 +1086,145 @@ class ExpenseClaimService: "invoice_count": attachment_count, } + def _build_expense_review_preview_calculation_copy( + self, + *, + user_id: str | None, + message: str, + ontology: OntologyParseResult, + context_json: dict[str, Any], + ) -> str: + expense_type = self._resolve_explicit_review_expense_type(context_json) or self._resolve_expense_type( + ontology.entities, + context_json=context_json, + ) + if expense_type == "travel" or ( + (not expense_type or expense_type == "other") + and self._should_preview_as_travel(message=message, context_json=context_json) + ): + return self._build_travel_review_preview_calculation_copy( + user_id=user_id, + message=message, + ontology=ontology, + context_json=context_json, + ) + + amount = self._resolve_amount(ontology.entities, context_json=context_json) or Decimal("0.00") + expense_label = EXPENSE_TYPE_LABELS.get(str(expense_type or "").strip(), "当前费用") + return "\n".join( + [ + "报销测算参考:", + "", + "| 项目 | 当前信息 | 复核口径 |", + "| --- | --- | --- |", + f"| 费用类型 | {expense_label} | 匹配规则中心对应费用标准 |", + f"| 票据金额 | {self._format_decimal_amount(amount)} 元 | 以真实票据识别金额和用户确认金额为准 |", + "| 规则校验 | 待票据和关键信息补齐 | 按费用类型、发生地点、业务事由和审批口径复核 |", + ] + ) + + def _build_travel_review_preview_calculation_copy( + self, + *, + user_id: str | None, + message: str, + ontology: OntologyParseResult, + context_json: dict[str, Any], + ) -> str: + location = self._resolve_location(message=message, context_json=context_json) or "待确认" + occurred_at = self._resolve_occurred_at(ontology, context_json=context_json) or datetime.now(UTC) + days, _, _ = self._resolve_travel_allowance_days( + context_json=context_json, + occurred_at=occurred_at, + ) + amount = self._resolve_amount(ontology.entities, context_json=context_json) or Decimal("0.00") + employee = self._resolve_employee( + ontology=ontology, + context_json=context_json, + user_id=user_id, + ) + grade = str( + context_json.get("employee_grade") + or context_json.get("grade") + or context_json.get("user_grade") + or (employee.grade if employee is not None else "") + or "" + ).strip() + + if location == "待确认" or not grade: + return "\n".join( + [ + "报销测算参考:", + "", + "| 项目 | 当前信息 | 测算说明 |", + "| --- | --- | --- |", + f"| 出差地点 | {location} | 用于匹配城市住宿标准和补贴区域 |", + f"| 出差天数 | {days} 天 | 来自业务发生时间或用户描述 |", + f"| 职级 | {grade or '待确认'} | 补齐后才能匹配住宿标准和补贴档位 |", + f"| 交通票据 | {self._format_decimal_amount(amount)} 元 | 上传票据后按真实金额重新复核 |", + ] + ) + + try: + from app.services.travel_reimbursement_calculator import ( + TravelReimbursementCalculatorService, + ) + + result = TravelReimbursementCalculatorService(self.db).calculate( + TravelReimbursementCalculatorRequest(days=days, location=location, grade=grade), + CurrentUserContext( + username=str(user_id or context_json.get("name") or "anonymous").strip() or "anonymous", + name=str(context_json.get("name") or user_id or "anonymous").strip() or "anonymous", + role_codes=[], + is_admin=False, + ), + ) + except ValueError: + return "\n".join( + [ + "报销测算参考:", + "", + "| 项目 | 当前信息 | 测算说明 |", + "| --- | --- | --- |", + f"| 出差地点 | {location} | 暂时未能匹配规则中心地点 |", + f"| 出差天数 | {days} 天 | 来自业务发生时间或用户描述 |", + f"| 职级 | {grade} | 暂时无法自动匹配差旅标准 |", + f"| 交通票据 | {self._format_decimal_amount(amount)} 元 | 上传票据后按真实金额重新复核 |", + ] + ) + + ticket_amount = amount.quantize(Decimal("0.01")) + total_amount = ( + ticket_amount + + Decimal(result.hotel_amount or Decimal("0.00")) + + Decimal(result.allowance_amount or Decimal("0.00")) + ).quantize(Decimal("0.01")) + ticket_basis = "当前未上传交通票据,先按 0.00 元占位" if ticket_amount <= Decimal("0.00") else "已识别或填写的交通票据金额" + return "\n".join( + [ + "报销测算参考:", + "", + f"职级 {grade},目的地 {location},匹配城市 {result.matched_city};补齐交通、酒店等票据后,我会按真实票据金额和规则中心标准重新复核。", + "", + "| 项目 | 测算口径 | 金额 |", + "| --- | --- | ---: |", + f"| 交通票据 | {ticket_basis} | {self._format_decimal_amount(ticket_amount)} 元 |", + f"| 住宿标准 | {self._format_decimal_amount(result.hotel_rate)} 元/天 × {days} 天 | {self._format_decimal_amount(result.hotel_amount)} 元 |", + f"| 出差补贴 | {self._format_decimal_amount(result.total_allowance_rate)} 元/天 × {days} 天 | {self._format_decimal_amount(result.allowance_amount)} 元 |", + f"| 参考合计 | 交通票据 + 住宿标准 + 出差补贴 | {self._format_decimal_amount(total_amount)} 元 |", + ] + ) + + @staticmethod + def _should_preview_as_travel(*, message: str, context_json: dict[str, Any]) -> bool: + text_parts = [message] + review_form_values = context_json.get("review_form_values") + if isinstance(review_form_values, dict): + text_parts.extend(str(value or "") for value in review_form_values.values()) + text_parts.extend(str(context_json.get(key) or "") for key in ("user_input_text", "raw_text", "ocr_summary")) + compact = "".join(text_parts) + return any(keyword in compact for keyword in ("差旅", "出差", "火车票", "机票", "酒店", "住宿票")) + def delete_claim(self, claim_id: str, current_user: CurrentUserContext) -> ExpenseClaim | None: claim = self.get_claim(claim_id, current_user) if claim is None: @@ -1083,7 +1241,7 @@ class ExpenseClaimService: self._delete_claim_attachment_files(claim) self.db.delete(claim) self.db.commit() - + self.audit_service.log_action( actor=current_user.name or current_user.username, action="expense_claim.delete", @@ -1276,88 +1434,88 @@ class ExpenseClaimService: return claim def upsert_draft_from_ontology( - self, - *, - run_id: str, - user_id: str | None, - message: str, - ontology: OntologyParseResult, - context_json: dict[str, Any], - ) -> dict[str, Any]: - self._ensure_ready() - context_json = dict(context_json or {}) - retry_count = self._resolve_claim_no_retry_count(context_json) - - review_action = str(context_json.get("review_action") or "").strip() - attachment_names = self._resolve_attachment_names(context_json) - context_documents = self._resolve_context_documents(context_json) - - employee = self._resolve_employee( - ontology=ontology, - context_json=context_json, - user_id=user_id, - ) - draft_owner_name = ( - employee.name - if employee is not None - else self._resolve_employee_name( - ontology=ontology, - context_json=context_json, - user_id=user_id, - ) - ) - - association_candidate = self._find_association_candidate( - ontology=ontology, - context_json=context_json, - user_id=user_id, - employee=employee, - ) - if self._should_defer_multi_document_association( - context_json=context_json, - review_action=review_action, - association_candidate=association_candidate, - context_documents=context_documents, - ): - document_count = max(len(context_documents), len(attachment_names), self._resolve_attachment_count(context_json)) - return { - "message": ( - f"检测到你已有草稿 {association_candidate.claim_no}," - f"当前新上传了 {document_count} 张票据,请先选择关联到现有草稿,或单独建立新的报销单。" - ), - "draft_only": False, - "status": "pending_association_decision", - "pending_association_decision": True, - "association_candidate_claim_id": association_candidate.id, - "association_candidate_claim_no": association_candidate.claim_no, - } - - claim = self._find_target_claim( - ontology=ontology, - context_json=context_json, - review_action=review_action, - association_candidate=association_candidate, - ) - is_new_claim = claim is None - before_json = self._serialize_claim(claim) if claim is not None else None - if is_new_claim: - existing_draft_count = self._count_draft_claims_for_owner( - employee=employee, - user_id=user_id, - ) - if existing_draft_count >= MAX_DRAFT_CLAIMS_PER_USER: - return { - "message": ( - f"你当前已保存 {MAX_DRAFT_CLAIMS_PER_USER} 个草稿,请先完成已保存的草稿," - "才能再次新建草稿。" - ), - "draft_limit_reached": True, - "draft_only": False, - "status": "blocked", - "draft_count": existing_draft_count, - "max_draft_count": MAX_DRAFT_CLAIMS_PER_USER, - } - + self, + *, + run_id: str, + user_id: str | None, + message: str, + ontology: OntologyParseResult, + context_json: dict[str, Any], + ) -> dict[str, Any]: + self._ensure_ready() + context_json = dict(context_json or {}) + retry_count = self._resolve_claim_no_retry_count(context_json) + + review_action = str(context_json.get("review_action") or "").strip() + attachment_names = self._resolve_attachment_names(context_json) + context_documents = self._resolve_context_documents(context_json) + + employee = self._resolve_employee( + ontology=ontology, + context_json=context_json, + user_id=user_id, + ) + draft_owner_name = ( + employee.name + if employee is not None + else self._resolve_employee_name( + ontology=ontology, + context_json=context_json, + user_id=user_id, + ) + ) + + association_candidate = self._find_association_candidate( + ontology=ontology, + context_json=context_json, + user_id=user_id, + employee=employee, + ) + if self._should_defer_multi_document_association( + context_json=context_json, + review_action=review_action, + association_candidate=association_candidate, + context_documents=context_documents, + ): + document_count = max(len(context_documents), len(attachment_names), self._resolve_attachment_count(context_json)) + return { + "message": ( + f"检测到你已有草稿 {association_candidate.claim_no}," + f"当前新上传了 {document_count} 张票据,请先选择关联到现有草稿,或单独建立新的报销单。" + ), + "draft_only": False, + "status": "pending_association_decision", + "pending_association_decision": True, + "association_candidate_claim_id": association_candidate.id, + "association_candidate_claim_no": association_candidate.claim_no, + } + + claim = self._find_target_claim( + ontology=ontology, + context_json=context_json, + review_action=review_action, + association_candidate=association_candidate, + ) + is_new_claim = claim is None + before_json = self._serialize_claim(claim) if claim is not None else None + if is_new_claim: + existing_draft_count = self._count_draft_claims_for_owner( + employee=employee, + user_id=user_id, + ) + if existing_draft_count >= MAX_DRAFT_CLAIMS_PER_USER: + return { + "message": ( + f"你当前已保存 {MAX_DRAFT_CLAIMS_PER_USER} 个草稿,请先完成已保存的草稿," + "才能再次新建草稿。" + ), + "draft_limit_reached": True, + "draft_only": False, + "status": "blocked", + "draft_count": existing_draft_count, + "max_draft_count": MAX_DRAFT_CLAIMS_PER_USER, + } + amount = self._resolve_amount(ontology.entities, context_json=context_json) occurred_at = self._resolve_occurred_at(ontology, context_json=context_json) explicit_expense_type = self._resolve_explicit_review_expense_type(context_json) @@ -1369,154 +1527,162 @@ class ExpenseClaimService: location = self._resolve_location(message=message, context_json=context_json) reason = self._resolve_reason( message=message, - context_json=context_json, - allow_message_fallback=is_new_claim, - ) - attachment_count = len(attachment_names) or self._resolve_attachment_count(context_json) - - final_amount = amount if amount is not None else (claim.amount if claim is not None else Decimal("0.00")) - final_occurred_at = ( - occurred_at if occurred_at is not None else (claim.occurred_at if claim is not None else datetime.now(UTC)) - ) - final_expense_type = expense_type or (claim.expense_type if claim is not None else "other") - final_location = location or (claim.location if claim is not None else "待补充") - final_reason = reason or (claim.reason if claim is not None else "待补充") - final_attachment_count = ( - attachment_count if attachment_count > 0 else int(claim.invoice_count or 0) if claim is not None else 0 - ) + context_json=context_json, + allow_message_fallback=is_new_claim, + ) + attachment_count = len(attachment_names) or self._resolve_attachment_count(context_json) + + final_amount = amount if amount is not None else (claim.amount if claim is not None else Decimal("0.00")) + final_occurred_at = ( + occurred_at if occurred_at is not None else (claim.occurred_at if claim is not None else datetime.now(UTC)) + ) + final_expense_type = expense_type or (claim.expense_type if claim is not None else "other") + final_location = location or (claim.location if claim is not None else "待补充") + final_reason = reason or (claim.reason if claim is not None else "待补充") + final_attachment_count = ( + attachment_count if attachment_count > 0 else int(claim.invoice_count or 0) if claim is not None else 0 + ) final_risk_flags = self._merge_persistent_claim_risk_flags( existing_flags=list(claim.risk_flags_json or []) if claim is not None else [], next_flags=list(ontology.risk_flags), ) - - try: - if claim is None: - claim = ExpenseClaim( - claim_no=self._generate_claim_no(final_occurred_at), - employee_id=employee.id if employee is not None else None, - employee_name=draft_owner_name, - department_id=employee.organization_unit_id if employee is not None else None, - department_name=self._resolve_department_name( - employee=employee, - context_json=context_json, - ), - project_code=self._resolve_project_code(ontology.entities), - expense_type=final_expense_type, - reason=final_reason, - location=final_location, - amount=final_amount, - currency="CNY", - invoice_count=final_attachment_count, - occurred_at=final_occurred_at, - status="draft", - approval_stage="待提交", - risk_flags_json=final_risk_flags, - ) - self.db.add(claim) - else: - claim.employee_id = employee.id if employee is not None else claim.employee_id - claim.employee_name = ( - employee.name - if employee is not None - else self._resolve_employee_name( - ontology=ontology, - context_json=context_json, - user_id=user_id, - fallback=claim.employee_name, - ) - ) - claim.department_id = employee.organization_unit_id if employee is not None else claim.department_id - claim.department_name = self._resolve_department_name( - employee=employee, - context_json=context_json, - fallback=claim.department_name, - ) - claim.project_code = self._resolve_project_code(ontology.entities) or claim.project_code - claim.expense_type = final_expense_type - claim.reason = final_reason - claim.location = final_location - claim.amount = final_amount - claim.invoice_count = final_attachment_count - claim.occurred_at = final_occurred_at - claim.status = "draft" - claim.approval_stage = "待提交" - claim.risk_flags_json = final_risk_flags - - self.db.flush() - if context_documents or attachment_names: - document_specs = self._build_context_item_specs( - context_documents=context_documents, - attachment_names=attachment_names, + if context_documents or attachment_names: + document_specs = self._build_context_item_specs( + context_documents=context_documents, + attachment_names=attachment_names, + occurred_at=final_occurred_at, + expense_type=final_expense_type, + amount=final_amount, + reason=final_reason, + location=final_location, + context_json=context_json, + employee_grade=str(employee.grade or "").strip() if employee is not None else "", + user_id=user_id, + ) + else: + document_specs = [] + + if claim is not None and review_action == "link_to_existing_draft" and document_specs: + duplicate_result = self._build_duplicate_attachment_block_result( + claim=claim, + document_specs=document_specs, + context_documents=context_documents, + ) + if duplicate_result is not None: + return duplicate_result + + try: + if claim is None: + claim = ExpenseClaim( + claim_no=self._generate_claim_no(final_occurred_at), + employee_id=employee.id if employee is not None else None, + employee_name=draft_owner_name, + department_id=employee.organization_unit_id if employee is not None else None, + department_name=self._resolve_department_name( + employee=employee, + context_json=context_json, + ), + project_code=self._resolve_project_code(ontology.entities), + expense_type=final_expense_type, + reason=final_reason, + location=final_location, + amount=final_amount, + currency="CNY", + invoice_count=final_attachment_count, + occurred_at=final_occurred_at, + status="draft", + approval_stage="待提交", + risk_flags_json=final_risk_flags, + ) + self.db.add(claim) + else: + claim.employee_id = employee.id if employee is not None else claim.employee_id + claim.employee_name = ( + employee.name + if employee is not None + else self._resolve_employee_name( + ontology=ontology, + context_json=context_json, + user_id=user_id, + fallback=claim.employee_name, + ) + ) + claim.department_id = employee.organization_unit_id if employee is not None else claim.department_id + claim.department_name = self._resolve_department_name( + employee=employee, + context_json=context_json, + fallback=claim.department_name, + ) + claim.project_code = self._resolve_project_code(ontology.entities) or claim.project_code + claim.expense_type = final_expense_type + claim.reason = final_reason + claim.location = final_location + claim.amount = final_amount + claim.invoice_count = final_attachment_count + claim.occurred_at = final_occurred_at + claim.status = "draft" + claim.approval_stage = "待提交" + claim.risk_flags_json = final_risk_flags + + self.db.flush() + if document_specs and (is_new_claim or review_action in DOCUMENT_ASSOCIATION_REVIEW_ACTIONS): + if review_action == "link_to_existing_draft" and claim.items: + self._append_document_items( + claim=claim, + item_specs=document_specs, + ) + else: + self._replace_claim_items( + claim=claim, + item_specs=document_specs, + ) + self._sync_claim_from_items(claim) + else: + self._upsert_primary_item( + claim=claim, occurred_at=final_occurred_at, expense_type=final_expense_type, amount=final_amount, reason=final_reason, location=final_location, - context_json=context_json, - employee_grade=str(employee.grade or "").strip() if employee is not None else "", - user_id=user_id, - ) - else: - document_specs = [] - - if document_specs and (is_new_claim or review_action in DOCUMENT_ASSOCIATION_REVIEW_ACTIONS): - if review_action == "link_to_existing_draft" and claim.items: - self._append_document_items( - claim=claim, - item_specs=document_specs, - ) - else: - self._replace_claim_items( - claim=claim, - item_specs=document_specs, - ) - self._sync_claim_from_items(claim) - else: - self._upsert_primary_item( - claim=claim, - occurred_at=final_occurred_at, - expense_type=final_expense_type, - amount=final_amount, - reason=final_reason, - location=final_location, - attachment_names=attachment_names, + attachment_names=attachment_names, ) self._sync_claim_from_items(claim) if locked_expense_type: claim.expense_type = locked_expense_type self.db.commit() self.db.refresh(claim) - except IntegrityError as exc: - self.db.rollback() - if ( - is_new_claim - and retry_count < MAX_CLAIM_NO_RETRY_ATTEMPTS - and self._is_claim_no_conflict_error(exc) - ): - retry_context = dict(context_json) - retry_context["_claim_no_retry_count"] = retry_count + 1 - return self.upsert_draft_from_ontology( - run_id=run_id, - user_id=user_id, - message=message, - ontology=ontology, - context_json=retry_context, - ) - raise - except Exception: - self.db.rollback() - raise - - self.audit_service.log_action( - actor=user_id or claim.employee_name or "anonymous", - action="expense_claim.draft_upsert", - resource_type="expense_claim", - resource_id=claim.id, - before_json=before_json, - after_json=self._serialize_claim(claim), - request_id=run_id, - ) - + except IntegrityError as exc: + self.db.rollback() + if ( + is_new_claim + and retry_count < MAX_CLAIM_NO_RETRY_ATTEMPTS + and self._is_claim_no_conflict_error(exc) + ): + retry_context = dict(context_json) + retry_context["_claim_no_retry_count"] = retry_count + 1 + return self.upsert_draft_from_ontology( + run_id=run_id, + user_id=user_id, + message=message, + ontology=ontology, + context_json=retry_context, + ) + raise + except Exception: + self.db.rollback() + raise + + self.audit_service.log_action( + actor=user_id or claim.employee_name or "anonymous", + action="expense_claim.draft_upsert", + resource_type="expense_claim", + resource_id=claim.id, + before_json=before_json, + after_json=self._serialize_claim(claim), + request_id=run_id, + ) + return { "message": ( f"已{'创建' if is_new_claim else '更新'}报销草稿 {claim.claim_no},当前状态为 draft。" @@ -1525,182 +1691,182 @@ class ExpenseClaimService: "draft_only": True, "claim_id": claim.id, "claim_no": claim.claim_no, - "status": claim.status, - "amount": float(claim.amount), - "invoice_count": int(claim.invoice_count or 0), - } - - def _find_target_claim( - self, - *, - ontology: OntologyParseResult, - context_json: dict[str, Any], - review_action: str = "", - association_candidate: ExpenseClaim | None = None, - ) -> ExpenseClaim | None: - if review_action == "create_new_claim_from_documents": - return None - if review_action == "link_to_existing_draft" and association_candidate is not None: - return association_candidate - + "status": claim.status, + "amount": float(claim.amount), + "invoice_count": int(claim.invoice_count or 0), + } + + def _find_target_claim( + self, + *, + ontology: OntologyParseResult, + context_json: dict[str, Any], + review_action: str = "", + association_candidate: ExpenseClaim | None = None, + ) -> ExpenseClaim | None: + if review_action == "create_new_claim_from_documents": + return None + if review_action == "link_to_existing_draft" and association_candidate is not None: + return association_candidate + draft_claim_id = str(context_json.get("draft_claim_id") or "").strip() if draft_claim_id: claim = self.db.get(ExpenseClaim, draft_claim_id) if claim is not None and self._is_editable_claim_status(claim.status): return claim return None - - claim_codes = [ - item.normalized_value - for item in ontology.entities - if item.type == "expense_claim" and item.normalized_value - ] - if not claim_codes: - return None - - stmt = ( + + claim_codes = [ + item.normalized_value + for item in ontology.entities + if item.type == "expense_claim" and item.normalized_value + ] + if not claim_codes: + return None + + stmt = ( select(ExpenseClaim) .where(ExpenseClaim.claim_no.in_(claim_codes)) .where(ExpenseClaim.status.in_(EDITABLE_CLAIM_STATUSES)) .limit(1) ) - return self.db.scalar(stmt) - - def _find_association_candidate( - self, - *, - ontology: OntologyParseResult, - context_json: dict[str, Any], - user_id: str | None, - employee: Employee | None, - ) -> ExpenseClaim | None: + return self.db.scalar(stmt) + + def _find_association_candidate( + self, + *, + ontology: OntologyParseResult, + context_json: dict[str, Any], + user_id: str | None, + employee: Employee | None, + ) -> ExpenseClaim | None: draft_claim_id = str(context_json.get("draft_claim_id") or "").strip() if draft_claim_id: claim = self.db.get(ExpenseClaim, draft_claim_id) if claim is not None and self._is_editable_claim_status(claim.status): return claim - - owner_filters = self._build_draft_owner_filters( - employee=employee, - user_id=user_id, - ) - if not owner_filters: - fallback_name = self._resolve_employee_name( - ontology=ontology, - context_json=context_json, - user_id=user_id, - fallback="", - ) - if fallback_name: - owner_filters = [ExpenseClaim.employee_name == fallback_name] - - if not owner_filters: - return None - - stmt = ( + + owner_filters = self._build_draft_owner_filters( + employee=employee, + user_id=user_id, + ) + if not owner_filters: + fallback_name = self._resolve_employee_name( + ontology=ontology, + context_json=context_json, + user_id=user_id, + fallback="", + ) + if fallback_name: + owner_filters = [ExpenseClaim.employee_name == fallback_name] + + if not owner_filters: + return None + + stmt = ( select(ExpenseClaim) .where(ExpenseClaim.status.in_(EDITABLE_CLAIM_STATUSES)) .where(or_(*owner_filters)) .order_by(ExpenseClaim.updated_at.desc(), ExpenseClaim.created_at.desc()) .limit(1) - ) - return self.db.scalar(stmt) - - def _should_defer_multi_document_association( - self, - *, - context_json: dict[str, Any], - review_action: str, - association_candidate: ExpenseClaim | None, - context_documents: list[dict[str, Any]], - ) -> bool: - if association_candidate is None: - return False - if review_action in DOCUMENT_ASSOCIATION_REVIEW_ACTIONS: - return False - document_count = max( - len(context_documents), - len(self._resolve_attachment_names(context_json)), - self._resolve_attachment_count(context_json), - ) - return document_count > 1 - - def _resolve_context_documents(self, context_json: dict[str, Any]) -> list[dict[str, Any]]: - documents = context_json.get("ocr_documents") - if not isinstance(documents, list): - documents = [] - - normalized: list[dict[str, Any]] = [] - for index, item in enumerate(documents[:10], start=1): - if not isinstance(item, dict): - continue - normalized.append( - { - "index": index, - "filename": str(item.get("filename") or "").strip(), - "summary": str(item.get("summary") or "").strip(), - "text": str(item.get("text") or "").strip(), - "document_type": str(item.get("document_type") or "").strip(), - "scene_code": str(item.get("scene_code") or "").strip(), - "scene_label": str(item.get("scene_label") or "").strip(), - "document_fields": self._normalize_document_fields(item.get("document_fields")), - } - ) - - overrides = context_json.get("review_document_form_values") - if not isinstance(overrides, list) or not normalized: - return normalized - - override_map: dict[tuple[int, str], dict[str, Any]] = {} - for item in overrides: - if not isinstance(item, dict): - continue - filename = str(item.get("filename") or "").strip() - index = int(item.get("index") or 0) - if not filename and index <= 0: - continue - override_map[(index, filename)] = item - - for item in normalized: - override = override_map.get((int(item["index"]), str(item["filename"]))) - if override is None: - override = override_map.get((int(item["index"]), "")) - if override is None: - continue - summary = str(override.get("summary") or "").strip() - scene_label = str(override.get("scene_label") or "").strip() - fields = override.get("fields") - if summary: - item["summary"] = summary - if scene_label: - item["scene_label"] = scene_label - if isinstance(fields, list): - item["document_fields"] = self._normalize_document_fields(fields) - - return normalized - - @staticmethod - def _normalize_document_fields(raw_fields: Any) -> list[dict[str, str]]: - if not isinstance(raw_fields, list): - return [] - normalized: list[dict[str, str]] = [] - for field in raw_fields: - if not isinstance(field, dict): - continue - label = str(field.get("label") or "").strip() - value = str(field.get("value") or "").strip() - key = str(field.get("key") or label or "").strip() - if not label or not value: - continue - normalized.append( - { - "key": key, - "label": label, - "value": value, - } - ) - return normalized - + ) + return self.db.scalar(stmt) + + def _should_defer_multi_document_association( + self, + *, + context_json: dict[str, Any], + review_action: str, + association_candidate: ExpenseClaim | None, + context_documents: list[dict[str, Any]], + ) -> bool: + if association_candidate is None: + return False + if review_action in DOCUMENT_ASSOCIATION_REVIEW_ACTIONS: + return False + document_count = max( + len(context_documents), + len(self._resolve_attachment_names(context_json)), + self._resolve_attachment_count(context_json), + ) + return document_count > 1 + + def _resolve_context_documents(self, context_json: dict[str, Any]) -> list[dict[str, Any]]: + documents = context_json.get("ocr_documents") + if not isinstance(documents, list): + documents = [] + + normalized: list[dict[str, Any]] = [] + for index, item in enumerate(documents[:10], start=1): + if not isinstance(item, dict): + continue + normalized.append( + { + "index": index, + "filename": str(item.get("filename") or "").strip(), + "summary": str(item.get("summary") or "").strip(), + "text": str(item.get("text") or "").strip(), + "document_type": str(item.get("document_type") or "").strip(), + "scene_code": str(item.get("scene_code") or "").strip(), + "scene_label": str(item.get("scene_label") or "").strip(), + "document_fields": self._normalize_document_fields(item.get("document_fields")), + } + ) + + overrides = context_json.get("review_document_form_values") + if not isinstance(overrides, list) or not normalized: + return normalized + + override_map: dict[tuple[int, str], dict[str, Any]] = {} + for item in overrides: + if not isinstance(item, dict): + continue + filename = str(item.get("filename") or "").strip() + index = int(item.get("index") or 0) + if not filename and index <= 0: + continue + override_map[(index, filename)] = item + + for item in normalized: + override = override_map.get((int(item["index"]), str(item["filename"]))) + if override is None: + override = override_map.get((int(item["index"]), "")) + if override is None: + continue + summary = str(override.get("summary") or "").strip() + scene_label = str(override.get("scene_label") or "").strip() + fields = override.get("fields") + if summary: + item["summary"] = summary + if scene_label: + item["scene_label"] = scene_label + if isinstance(fields, list): + item["document_fields"] = self._normalize_document_fields(fields) + + return normalized + + @staticmethod + def _normalize_document_fields(raw_fields: Any) -> list[dict[str, str]]: + if not isinstance(raw_fields, list): + return [] + normalized: list[dict[str, str]] = [] + for field in raw_fields: + if not isinstance(field, dict): + continue + label = str(field.get("label") or "").strip() + value = str(field.get("value") or "").strip() + key = str(field.get("key") or label or "").strip() + if not label or not value: + continue + normalized.append( + { + "key": key, + "label": label, + "value": value, + } + ) + return normalized + def _build_context_item_specs( self, *, @@ -1718,41 +1884,41 @@ class ExpenseClaimService: specs: list[dict[str, Any]] = [] if context_documents: for document in context_documents: - specs.append( - { + specs.append( + { "item_date": self._resolve_document_item_date(document, fallback=occurred_at.date()), "item_type": self._resolve_document_item_type(document, fallback=expense_type), "item_reason": self._resolve_document_item_reason(document, fallback=reason), "item_location": location, "item_amount": self._resolve_document_item_amount(document), "invoice_id": str(document.get("filename") or "").strip() or None, - } - ) - elif attachment_names: - for attachment_name in attachment_names: - specs.append( - { - "item_date": occurred_at.date(), - "item_type": expense_type, - "item_reason": reason, - "item_location": location, - "item_amount": None, - "invoice_id": attachment_name, - } - ) - - if not specs: - return [] - - total_recognized = sum( - spec["item_amount"] for spec in specs if isinstance(spec.get("item_amount"), Decimal) - ) - missing_specs = [spec for spec in specs if spec.get("item_amount") is None] - if missing_specs: - remaining = (amount - total_recognized).quantize(Decimal("0.01")) - if remaining > Decimal("0.00"): - missing_specs[0]["item_amount"] = remaining - + } + ) + elif attachment_names: + for attachment_name in attachment_names: + specs.append( + { + "item_date": occurred_at.date(), + "item_type": expense_type, + "item_reason": reason, + "item_location": location, + "item_amount": None, + "invoice_id": attachment_name, + } + ) + + if not specs: + return [] + + total_recognized = sum( + spec["item_amount"] for spec in specs if isinstance(spec.get("item_amount"), Decimal) + ) + missing_specs = [spec for spec in specs if spec.get("item_amount") is None] + if missing_specs: + remaining = (amount - total_recognized).quantize(Decimal("0.01")) + if remaining > Decimal("0.00"): + missing_specs[0]["item_amount"] = remaining + for spec in specs: if spec.get("item_amount") is None: spec["item_amount"] = Decimal("0.00") @@ -1808,9 +1974,9 @@ class ExpenseClaimService: return None try: - from app.services.travel_reimbursement_calculator import ( - TravelReimbursementCalculatorService, - ) + from app.services.travel_reimbursement_calculator import ( + TravelReimbursementCalculatorService, + ) result = TravelReimbursementCalculatorService(self.db).calculate( TravelReimbursementCalculatorRequest( @@ -1984,25 +2150,25 @@ class ExpenseClaimService: return "" def _replace_claim_items( - self, - *, - claim: ExpenseClaim, - item_specs: list[dict[str, Any]], - ) -> None: - existing_items = sorted( - list(claim.items), - key=lambda item: ( - item.item_date or date.max, - self._normalize_sort_datetime(item.created_at), - ), - ) - for index, spec in enumerate(item_specs): - item = existing_items[index] if index < len(existing_items) else None - if item is None: - item = ExpenseClaimItem(claim_id=claim.id) - claim.items.append(item) - self.db.add(item) - item.item_date = spec["item_date"] + self, + *, + claim: ExpenseClaim, + item_specs: list[dict[str, Any]], + ) -> None: + existing_items = sorted( + list(claim.items), + key=lambda item: ( + item.item_date or date.max, + self._normalize_sort_datetime(item.created_at), + ), + ) + for index, spec in enumerate(item_specs): + item = existing_items[index] if index < len(existing_items) else None + if item is None: + item = ExpenseClaimItem(claim_id=claim.id) + claim.items.append(item) + self.db.add(item) + item.item_date = spec["item_date"] item.item_type = spec["item_type"] item.item_reason = spec["item_reason"] item.item_location = spec["item_location"] @@ -2012,11 +2178,11 @@ class ExpenseClaimService: if str(spec.get("item_type") or "").strip() in SYSTEM_GENERATED_ITEM_TYPES else self._merge_attachment_reference(item.invoice_id, spec["invoice_id"]) ) - - for stale_item in existing_items[len(item_specs) :]: - claim.items.remove(stale_item) - self.db.delete(stale_item) - + + for stale_item in existing_items[len(item_specs) :]: + claim.items.remove(stale_item) + self.db.delete(stale_item) + def _append_document_items( self, *, @@ -2046,15 +2212,15 @@ class ExpenseClaimService: continue claim.items.append( ExpenseClaimItem( - claim_id=claim.id, - item_date=spec["item_date"], - item_type=spec["item_type"], - item_reason=spec["item_reason"], - item_location=spec["item_location"], - item_amount=spec["item_amount"], - invoice_id=spec["invoice_id"], - ) - ) + claim_id=claim.id, + item_date=spec["item_date"], + item_type=spec["item_type"], + item_reason=spec["item_reason"], + item_location=spec["item_location"], + item_amount=spec["item_amount"], + invoice_id=spec["invoice_id"], + ) + ) self.db.add(claim.items[-1]) if invoice_id: existing_invoice_ids.add(invoice_id) @@ -2080,7 +2246,158 @@ class ExpenseClaimService: ) ) self.db.add(claim.items[-1]) - + + def _build_duplicate_attachment_block_result( + self, + *, + claim: ExpenseClaim, + document_specs: list[dict[str, Any]], + context_documents: list[dict[str, Any]], + ) -> dict[str, Any] | None: + duplicate_matches = self._find_duplicate_attachment_matches( + claim=claim, + document_specs=document_specs, + context_documents=context_documents, + ) + if not duplicate_matches: + return None + + duplicate_labels = list( + dict.fromkeys( + str(item.get("incoming_label") or item.get("existing_label") or "").strip() + for item in duplicate_matches + if str(item.get("incoming_label") or item.get("existing_label") or "").strip() + ) + ) + duplicate_text = "、".join(duplicate_labels[:3]) or "本次上传票据" + reason = ( + f"检测到本次上传的票据与草稿 {claim.claim_no} 中已有票据重复:{duplicate_text}。" + "请重新上传不同的票据后再归集。" + ) + return { + "message": reason, + "draft_only": False, + "status": "blocked", + "duplicate_attachment_blocked": True, + "duplicate_invoice_blocked": True, + "submission_blocked": True, + "submission_blocked_reasons": [reason], + "missing_fields": [reason], + "risk_flags": ["duplicate_invoice"], + "duplicate_attachments": duplicate_matches, + "claim_id": claim.id, + "claim_no": claim.claim_no, + "amount": float(claim.amount or Decimal("0.00")), + "invoice_count": int(claim.invoice_count or 0), + } + + def _find_duplicate_attachment_matches( + self, + *, + claim: ExpenseClaim, + document_specs: list[dict[str, Any]], + context_documents: list[dict[str, Any]], + ) -> list[dict[str, str]]: + existing_tokens: dict[str, dict[str, str]] = {} + for item in list(claim.items or []): + if str(item.item_type or "").strip() in SYSTEM_GENERATED_ITEM_TYPES: + continue + invoice_id = str(item.invoice_id or "").strip() + if not invoice_id: + continue + + display_name = self._resolve_attachment_display_name(invoice_id) + for token in self._build_duplicate_attachment_tokens(invoice_id): + existing_tokens.setdefault( + token, + { + "existing_label": display_name or invoice_id, + "existing_item_id": str(item.id or ""), + "match_type": "filename", + }, + ) + + file_path = self._resolve_item_attachment_path(item) + if file_path is not None and file_path.exists(): + metadata = self._read_attachment_meta(file_path) + document_info = metadata.get("document_info") + if isinstance(document_info, dict): + for invoice_key in self._collect_invoice_keys_from_document_info(document_info): + token = self._normalize_duplicate_attachment_token(invoice_key) + if token: + existing_tokens.setdefault( + token, + { + "existing_label": display_name or invoice_id, + "existing_item_id": str(item.id or ""), + "match_type": "invoice_key", + }, + ) + + if not existing_tokens: + return [] + + document_by_filename = { + str(document.get("filename") or "").strip(): document + for document in context_documents + if isinstance(document, dict) and str(document.get("filename") or "").strip() + } + matches: list[dict[str, str]] = [] + seen_tokens: set[str] = set() + for spec in document_specs: + if str(spec.get("item_type") or "").strip() in SYSTEM_GENERATED_ITEM_TYPES: + continue + invoice_id = str(spec.get("invoice_id") or "").strip() + if not invoice_id: + continue + incoming_tokens = self._build_duplicate_attachment_tokens(invoice_id) + document = document_by_filename.get(invoice_id) + if document is not None: + incoming_tokens.extend( + self._normalize_duplicate_attachment_token(invoice_key) + for invoice_key in self._collect_invoice_keys_from_incoming_document(document) + ) + for token in incoming_tokens: + if not token or token in seen_tokens or token not in existing_tokens: + continue + seen_tokens.add(token) + existing = existing_tokens[token] + matches.append( + { + "incoming_label": self._resolve_attachment_display_name(invoice_id) or invoice_id, + "existing_label": existing.get("existing_label", ""), + "existing_item_id": existing.get("existing_item_id", ""), + "match_type": existing.get("match_type", "filename"), + } + ) + return matches + + @classmethod + def _build_duplicate_attachment_tokens(cls, value: str | None) -> list[str]: + raw = str(value or "").strip() + display_name = cls._resolve_attachment_display_name(raw) + candidates = [raw, display_name] + return list( + dict.fromkeys( + token + for token in (cls._normalize_duplicate_attachment_token(candidate) for candidate in candidates) + if token + ) + ) + + @staticmethod + def _normalize_duplicate_attachment_token(value: str | None) -> str: + normalized = Path(str(value or "").strip()).name.lower() + normalized = re.sub(r"\s+", "", normalized) + normalized = re.sub(r"[^\w.\-\u4e00-\u9fff]+", "_", normalized).strip("._") + return normalized + + def _collect_invoice_keys_from_incoming_document(self, document: dict[str, Any]) -> list[str]: + document_info = dict(document or {}) + if "fields" not in document_info and isinstance(document_info.get("document_fields"), list): + document_info["fields"] = document_info.get("document_fields") + return self._collect_invoice_keys_from_document_info(document_info) + def _resolve_document_item_type(self, document: dict[str, Any], *, fallback: str) -> str: document_type = str(document.get("document_type") or "").strip() mapped_type = DOCUMENT_TYPE_ITEM_TYPE_MAP.get(document_type) @@ -2093,29 +2410,29 @@ class ExpenseClaimService: if document_type in {"flight_itinerary", "train_ticket"}: return "travel" - if document_type in {"taxi_receipt", "parking_toll_receipt", "transport_receipt"}: - return "transport" - if document_type == "hotel_invoice": - return "hotel" - if document_type == "meal_receipt": - return "meal" - if document_type == "office_invoice": - return "office" - if document_type == "meeting_invoice": - return "meeting" - if document_type == "training_invoice": - return "training" - - scene_label = str(document.get("scene_label") or "").strip() - if "交通" in scene_label: - return "transport" - if "住宿" in scene_label: - return "hotel" - if "餐" in scene_label: - return "meal" - if "会务" in scene_label or "会议" in scene_label: - return "meeting" - if "培训" in scene_label: + if document_type in {"taxi_receipt", "parking_toll_receipt", "transport_receipt"}: + return "transport" + if document_type == "hotel_invoice": + return "hotel" + if document_type == "meal_receipt": + return "meal" + if document_type == "office_invoice": + return "office" + if document_type == "meeting_invoice": + return "meeting" + if document_type == "training_invoice": + return "training" + + scene_label = str(document.get("scene_label") or "").strip() + if "交通" in scene_label: + return "transport" + if "住宿" in scene_label: + return "hotel" + if "餐" in scene_label: + return "meal" + if "会务" in scene_label or "会议" in scene_label: + return "meeting" + if "培训" in scene_label: return "training" return fallback or "other" @@ -2349,7 +2666,7 @@ class ExpenseClaimService: @staticmethod def _format_decimal_amount(amount: Decimal | None) -> str: return format_decimal_amount(amount) - + def _resolve_document_item_date(self, document: dict[str, Any], *, fallback: date) -> date: return self._resolve_document_item_date_candidate(document) or fallback @@ -2391,21 +2708,21 @@ class ExpenseClaimService: continue key = str(field.get("key") or "").strip().lower().replace("_", "") label = str(field.get("label") or "").replace(" ", "") - value = str(field.get("value") or "").strip() - if not value: - continue + value = str(field.get("value") or "").strip() + if not value: + continue if key in {"date", "time", "issuedat", "issuedate", "invoicedate"} or any( token in label for token in ("日期", "时间", "开票日期", "发生时间") ): parsed = self._parse_document_date(value) if parsed is not None: - return parsed - - parsed = self._parse_document_date( - " ".join( - [ - str(document.get("summary") or "").strip(), - str(document.get("text") or "").strip(), + return parsed + + parsed = self._parse_document_date( + " ".join( + [ + str(document.get("summary") or "").strip(), + str(document.get("text") or "").strip(), ] ).strip() ) @@ -2435,48 +2752,48 @@ class ExpenseClaimService: @staticmethod def _parse_document_date(value: str) -> date | None: - match = DOCUMENT_DATE_PATTERN.search(str(value or "")) - if not match: - return None - raw_value = str(match.group(1) or "").strip() - normalized = raw_value.replace("年", "-").replace("月", "-").replace("日", "") - normalized = normalized.replace("/", "-").replace(".", "-") - parts = [part for part in normalized.split("-") if part] - if len(parts) != 3: - return None - try: - return date(int(parts[0]), int(parts[1]), int(parts[2])) - except ValueError: - return None - - def _upsert_primary_item( - self, - *, - claim: ExpenseClaim, - occurred_at: datetime, - expense_type: str, - amount: Decimal, - reason: str, - location: str, - attachment_names: list[str], - ) -> None: - item = claim.items[0] if claim.items else None - if item is None: - item = ExpenseClaimItem( - claim_id=claim.id, - item_date=occurred_at.date(), - item_type=expense_type, - item_reason=reason, - item_location=location, - item_amount=amount, - invoice_id=attachment_names[0] if attachment_names else None, - ) - claim.items.append(item) - self.db.add(item) - return - - item.item_date = occurred_at.date() - item.item_type = expense_type + match = DOCUMENT_DATE_PATTERN.search(str(value or "")) + if not match: + return None + raw_value = str(match.group(1) or "").strip() + normalized = raw_value.replace("年", "-").replace("月", "-").replace("日", "") + normalized = normalized.replace("/", "-").replace(".", "-") + parts = [part for part in normalized.split("-") if part] + if len(parts) != 3: + return None + try: + return date(int(parts[0]), int(parts[1]), int(parts[2])) + except ValueError: + return None + + def _upsert_primary_item( + self, + *, + claim: ExpenseClaim, + occurred_at: datetime, + expense_type: str, + amount: Decimal, + reason: str, + location: str, + attachment_names: list[str], + ) -> None: + item = claim.items[0] if claim.items else None + if item is None: + item = ExpenseClaimItem( + claim_id=claim.id, + item_date=occurred_at.date(), + item_type=expense_type, + item_reason=reason, + item_location=location, + item_amount=amount, + invoice_id=attachment_names[0] if attachment_names else None, + ) + claim.items.append(item) + self.db.add(item) + return + + item.item_date = occurred_at.date() + item.item_type = expense_type item.item_reason = reason item.item_location = location item.item_amount = amount @@ -2485,107 +2802,107 @@ class ExpenseClaimService: if attachment_names else item.invoice_id ) - - def _generate_claim_no(self, occurred_at: datetime) -> str: - month_code = occurred_at.strftime("%Y%m") - prefix = f"EXP-{month_code}-" - existing_claim_nos = list( - self.db.scalars( - select(ExpenseClaim.claim_no).where(ExpenseClaim.claim_no.like(f"{prefix}%")) - ) - ) - max_suffix = 0 - for claim_no in existing_claim_nos: - normalized = str(claim_no or "").strip() - if not normalized.startswith(prefix): - continue - suffix = normalized[len(prefix):] - if not suffix.isdigit(): - continue - max_suffix = max(max_suffix, int(suffix)) - return f"{prefix}{max_suffix + 1:03d}" - - @staticmethod - def _resolve_claim_no_retry_count(context_json: dict[str, Any]) -> int: - try: - return max(0, int(context_json.get("_claim_no_retry_count") or 0)) - except (TypeError, ValueError): - return 0 - - @staticmethod - def _is_claim_no_conflict_error(exc: IntegrityError) -> bool: - message = str(exc).lower() - return ( - "claim_no" in message - and ( - "unique" in message - or "duplicate key" in message - or "ix_expense_claims_claim_no" in message - or "expense_claims.claim_no" in message - ) - ) - - def _count_draft_claims_for_owner( - self, - *, - employee: Employee | None, - user_id: str | None, - ) -> int: - owner_filters = self._build_draft_owner_filters( - employee=employee, - user_id=user_id, - ) - if not owner_filters: - return 0 - - stmt = ( - select(func.count()) - .select_from(ExpenseClaim) - .where(ExpenseClaim.status == "draft") - .where(or_(*owner_filters)) - ) - return int(self.db.scalar(stmt) or 0) - - def _build_draft_owner_filters( - self, - *, - employee: Employee | None, - user_id: str | None, - ) -> list[Any]: - conditions: list[Any] = [] - seen: set[tuple[str, str]] = set() - - def add_condition(field_name: str, value: str | None) -> None: - normalized = str(value or "").strip() - if not normalized or normalized == "待补充": - return - - marker = (field_name, normalized.lower()) - if marker in seen: - return - seen.add(marker) - - if field_name == "employee_id": - conditions.append(ExpenseClaim.employee_id == normalized) - return - conditions.append(ExpenseClaim.employee_name == normalized) - - if employee is not None: - add_condition("employee_id", employee.id) - add_condition("employee_name", employee.email) - if self._employee_name_is_unique(employee): - add_condition("employee_name", employee.name) - - add_condition("employee_name", user_id) - return conditions - - def _resolve_employee( - self, - *, - ontology: OntologyParseResult, - context_json: dict[str, Any], - user_id: str | None, - ) -> Employee | None: + + def _generate_claim_no(self, occurred_at: datetime) -> str: + month_code = occurred_at.strftime("%Y%m") + prefix = f"EXP-{month_code}-" + existing_claim_nos = list( + self.db.scalars( + select(ExpenseClaim.claim_no).where(ExpenseClaim.claim_no.like(f"{prefix}%")) + ) + ) + max_suffix = 0 + for claim_no in existing_claim_nos: + normalized = str(claim_no or "").strip() + if not normalized.startswith(prefix): + continue + suffix = normalized[len(prefix):] + if not suffix.isdigit(): + continue + max_suffix = max(max_suffix, int(suffix)) + return f"{prefix}{max_suffix + 1:03d}" + + @staticmethod + def _resolve_claim_no_retry_count(context_json: dict[str, Any]) -> int: + try: + return max(0, int(context_json.get("_claim_no_retry_count") or 0)) + except (TypeError, ValueError): + return 0 + + @staticmethod + def _is_claim_no_conflict_error(exc: IntegrityError) -> bool: + message = str(exc).lower() + return ( + "claim_no" in message + and ( + "unique" in message + or "duplicate key" in message + or "ix_expense_claims_claim_no" in message + or "expense_claims.claim_no" in message + ) + ) + + def _count_draft_claims_for_owner( + self, + *, + employee: Employee | None, + user_id: str | None, + ) -> int: + owner_filters = self._build_draft_owner_filters( + employee=employee, + user_id=user_id, + ) + if not owner_filters: + return 0 + + stmt = ( + select(func.count()) + .select_from(ExpenseClaim) + .where(ExpenseClaim.status == "draft") + .where(or_(*owner_filters)) + ) + return int(self.db.scalar(stmt) or 0) + + def _build_draft_owner_filters( + self, + *, + employee: Employee | None, + user_id: str | None, + ) -> list[Any]: + conditions: list[Any] = [] + seen: set[tuple[str, str]] = set() + + def add_condition(field_name: str, value: str | None) -> None: + normalized = str(value or "").strip() + if not normalized or normalized == "待补充": + return + + marker = (field_name, normalized.lower()) + if marker in seen: + return + seen.add(marker) + + if field_name == "employee_id": + conditions.append(ExpenseClaim.employee_id == normalized) + return + conditions.append(ExpenseClaim.employee_name == normalized) + + if employee is not None: + add_condition("employee_id", employee.id) + add_condition("employee_name", employee.email) + if self._employee_name_is_unique(employee): + add_condition("employee_name", employee.name) + + add_condition("employee_name", user_id) + return conditions + + def _resolve_employee( + self, + *, + ontology: OntologyParseResult, + context_json: dict[str, Any], + user_id: str | None, + ) -> Employee | None: normalized_user_id = str(user_id or "").strip() if normalized_user_id: stmt = ( @@ -2597,15 +2914,15 @@ class ExpenseClaimService: employee = self.db.scalar(stmt) if employee is not None: return employee - - employee_name = self._resolve_employee_name( - ontology=ontology, - context_json=context_json, - user_id=None, - ) - if not employee_name: - return None - + + employee_name = self._resolve_employee_name( + ontology=ontology, + context_json=context_json, + user_id=None, + ) + if not employee_name: + return None + stmt = ( select(Employee) .options(selectinload(Employee.organization_unit), selectinload(Employee.manager)) @@ -2613,88 +2930,88 @@ class ExpenseClaimService: .limit(1) ) return self.db.scalar(stmt) - - @staticmethod - def _resolve_employee_name( - *, - ontology: OntologyParseResult, - context_json: dict[str, Any], - user_id: str | None, - fallback: str = "待补充", - ) -> str: - review_form_values = context_json.get("review_form_values") - if isinstance(review_form_values, dict): - for key in ("reporter_name", "employee_name", "claimant_name"): - value = str(review_form_values.get(key) or "").strip() - if value: - return value - for item in ontology.entities: - if item.type == "employee" and item.value.strip(): - return item.value.strip() - for key in ("name", "user_name", "employee_name"): - value = str(context_json.get(key) or "").strip() - if value: - return value - return str(user_id or fallback).strip() or fallback - - @staticmethod - def _resolve_department_name( - *, - employee: Employee | None, - context_json: dict[str, Any], - fallback: str = "待补充", - ) -> str: - if employee is not None and employee.organization_unit is not None: - return employee.organization_unit.name - - request_context = context_json.get("request_context") - if isinstance(request_context, dict): - for key in ("department", "department_name", "deptName"): - value = str(request_context.get(key) or "").strip() - if value: - return value - - for key in ("department_name", "department"): - value = str(context_json.get(key) or "").strip() - if value: - return value - return fallback - - @staticmethod - def _resolve_project_code(entities: list[OntologyEntity]) -> str | None: - for item in entities: - if item.type == "project" and item.normalized_value.strip(): - return item.normalized_value.strip() - return None - + + @staticmethod + def _resolve_employee_name( + *, + ontology: OntologyParseResult, + context_json: dict[str, Any], + user_id: str | None, + fallback: str = "待补充", + ) -> str: + review_form_values = context_json.get("review_form_values") + if isinstance(review_form_values, dict): + for key in ("reporter_name", "employee_name", "claimant_name"): + value = str(review_form_values.get(key) or "").strip() + if value: + return value + for item in ontology.entities: + if item.type == "employee" and item.value.strip(): + return item.value.strip() + for key in ("name", "user_name", "employee_name"): + value = str(context_json.get(key) or "").strip() + if value: + return value + return str(user_id or fallback).strip() or fallback + + @staticmethod + def _resolve_department_name( + *, + employee: Employee | None, + context_json: dict[str, Any], + fallback: str = "待补充", + ) -> str: + if employee is not None and employee.organization_unit is not None: + return employee.organization_unit.name + + request_context = context_json.get("request_context") + if isinstance(request_context, dict): + for key in ("department", "department_name", "deptName"): + value = str(request_context.get(key) or "").strip() + if value: + return value + + for key in ("department_name", "department"): + value = str(context_json.get(key) or "").strip() + if value: + return value + return fallback + + @staticmethod + def _resolve_project_code(entities: list[OntologyEntity]) -> str | None: + for item in entities: + if item.type == "project" and item.normalized_value.strip(): + return item.normalized_value.strip() + return None + @staticmethod def _resolve_explicit_review_expense_type(context_json: dict[str, Any]) -> str | None: review_form_values = context_json.get("review_form_values") if isinstance(review_form_values, dict): compact = str( - review_form_values.get("expense_type") - or review_form_values.get("reimbursement_type") - or "" - ).replace(" ", "") - if compact: - if "招待" in compact or ("客户" in compact and any(word in compact for word in ("吃饭", "宴请", "请客", "用餐"))): - return "entertainment" - if any(word in compact for word in ("差旅", "出差", "机票", "行程")): - return "travel" - if any(word in compact for word in ("住宿", "酒店", "宾馆")): - return "hotel" + review_form_values.get("expense_type") + or review_form_values.get("reimbursement_type") + or "" + ).replace(" ", "") + if compact: + if "招待" in compact or ("客户" in compact and any(word in compact for word in ("吃饭", "宴请", "请客", "用餐"))): + return "entertainment" + if any(word in compact for word in ("差旅", "出差", "机票", "行程")): + return "travel" + if any(word in compact for word in ("住宿", "酒店", "宾馆")): + return "hotel" if any(word in compact for word in ("交通", "打车", "网约车", "出租车", "乘车", "用车", "叫车", "车费", "车资", "的士", "停车")): return "transport" - if any(word in compact for word in ("餐费", "用餐", "午餐", "晚餐", "早餐", "伙食")): - return "meal" - if "会务" in compact: - return "meeting" - if any(word in compact for word in ("办公费", "办公用品", "文具", "耗材", "办公耗材", "打印纸", "办公设备", "键盘", "鼠标", "白板")): - return "office" - if any(word in compact for word in ("培训费", "培训", "讲师费", "课时费", "课程费")): - return "training" - if any(word in compact for word in ("通讯费", "话费", "流量费", "宽带费")): - return "communication" + if any(word in compact for word in ("餐费", "用餐", "午餐", "晚餐", "早餐", "伙食")): + return "meal" + if "会务" in compact: + return "meeting" + if any(word in compact for word in ("办公费", "办公用品", "文具", "耗材", "办公耗材", "打印纸", "办公设备", "键盘", "鼠标", "白板")): + return "office" + if any(word in compact for word in ("培训费", "培训", "讲师费", "课时费", "课程费")): + return "training" + if any(word in compact for word in ("通讯费", "话费", "流量费", "宽带费")): + return "communication" if any(word in compact for word in ("福利费", "团建", "慰问", "节日福利", "体检费")): return "welfare" return None @@ -2711,18 +3028,18 @@ class ExpenseClaimService: for item in entities: if item.type == "expense_type": normalized = item.normalized_value.strip() - if normalized: - return normalized - return None - - @staticmethod + if normalized: + return normalized + return None + + @staticmethod def _resolve_reason( *, message: str, context_json: dict[str, Any], allow_message_fallback: bool, - ) -> str | None: - review_form_values = context_json.get("review_form_values") + ) -> str | None: + review_form_values = context_json.get("review_form_values") if isinstance(review_form_values, dict): for key in ("reason", "business_reason"): value = str(review_form_values.get(key) or "").strip() @@ -2735,20 +3052,20 @@ class ExpenseClaimService: if normalized_explicit_text: return ExpenseClaimService._strip_leading_time_from_reason(normalized_explicit_text)[:500] or None return None - - request_context = context_json.get("request_context") - if ( - isinstance(request_context, dict) - and str(context_json.get("entry_source") or "").strip() == "detail" - ): - for key in ("reason", "title"): - value = str(request_context.get(key) or "").strip() - if value: - return value - if not allow_message_fallback: - return None - - normalized_message = str(message or "").strip() + + request_context = context_json.get("request_context") + if ( + isinstance(request_context, dict) + and str(context_json.get("entry_source") or "").strip() == "detail" + ): + for key in ("reason", "title"): + value = str(request_context.get(key) or "").strip() + if value: + return value + if not allow_message_fallback: + return None + + normalized_message = str(message or "").strip() compact_message = re.sub(r"\s+", "", normalized_message) if compact_message.startswith(SYSTEM_GENERATED_REASON_PREFIXES): return None @@ -2765,22 +3082,22 @@ class ExpenseClaimService: @staticmethod def _resolve_location(*, message: str, context_json: dict[str, Any]) -> str | None: - review_form_values = context_json.get("review_form_values") - if isinstance(review_form_values, dict): - for key in ("business_location", "location"): - value = str(review_form_values.get(key) or "").strip() - if value: - return value - - request_context = context_json.get("request_context") - if ( - isinstance(request_context, dict) - and str(context_json.get("entry_source") or "").strip() == "detail" - ): - for key in ("city", "location"): - value = str(request_context.get(key) or "").strip() - if value: - return value + review_form_values = context_json.get("review_form_values") + if isinstance(review_form_values, dict): + for key in ("business_location", "location"): + value = str(review_form_values.get(key) or "").strip() + if value: + return value + + request_context = context_json.get("request_context") + if ( + isinstance(request_context, dict) + and str(context_json.get("entry_source") or "").strip() == "detail" + ): + for key in ("city", "location"): + value = str(request_context.get(key) or "").strip() + if value: + return value compact = str(message or "").replace(" ", "") city_match = re.search( r"去(?P[\u4e00-\u9fa5]{2,8}?)(?:出差|拜访|参会|见客户|客户现场|支撑|支持|部署|实施|处理|协助)", @@ -2791,96 +3108,96 @@ class ExpenseClaimService: if "客户现场" in compact: return "客户现场" return None - - @staticmethod - def _resolve_occurred_at( - ontology: OntologyParseResult, - *, - context_json: dict[str, Any], - ) -> datetime | None: - review_form_values = context_json.get("review_form_values") - if isinstance(review_form_values, dict): - for key in ("occurred_date", "time_range", "business_time"): - value = str(review_form_values.get(key) or "").strip() - if not value: - continue - try: - parsed = date.fromisoformat(value) - return datetime(parsed.year, parsed.month, parsed.day, tzinfo=UTC) - except ValueError: - continue - - start_date = ontology.time_range.start_date - if start_date: - try: - parsed = date.fromisoformat(start_date) - return datetime(parsed.year, parsed.month, parsed.day, tzinfo=UTC) - except ValueError: - pass - return None - - @staticmethod - def _resolve_amount( - entities: list[OntologyEntity], - *, - context_json: dict[str, Any], - ) -> Decimal | None: - review_form_values = context_json.get("review_form_values") - if isinstance(review_form_values, dict): - raw_value = str(review_form_values.get("amount") or "").strip() - if raw_value: - compact = raw_value.replace("元", "").replace(",", "").strip() - try: - return Decimal(compact).quantize(Decimal("0.01")) - except (InvalidOperation, ValueError): - pass - for item in entities: - if item.type != "amount" or item.role == "threshold": - continue - try: - return Decimal(item.normalized_value).quantize(Decimal("0.01")) - except (InvalidOperation, ValueError): - continue - return None - - @staticmethod - def _resolve_attachment_names(context_json: dict[str, Any]) -> list[str]: - names = context_json.get("attachment_names") - if not isinstance(names, list): - return [] - return [str(name).strip() for name in names if str(name).strip()] - - def _resolve_attachment_count(self, context_json: dict[str, Any]) -> int: - names = self._resolve_attachment_names(context_json) - if names: - return len(names) - try: - return max(0, int(context_json.get("attachment_count") or 0)) - except (TypeError, ValueError): - return 0 - - def _get_claim_item_or_raise( - self, - *, - claim_id: str, - item_id: str, - current_user: CurrentUserContext, - ) -> tuple[ExpenseClaim | None, ExpenseClaimItem]: - claim = self.get_claim(claim_id, current_user) - if claim is None: - return None, None # type: ignore[return-value] - - item = next((entry for entry in claim.items if entry.id == item_id), None) - if item is None: - raise LookupError("Item not found") - return claim, item - - def _get_attachment_storage_root(self) -> Path: - return (get_settings().resolved_storage_root_dir / "expense_claims").resolve() - - def _build_item_attachment_dir(self, claim_id: str, item_id: str) -> Path: - return (self._get_attachment_storage_root() / claim_id / item_id).resolve() - + + @staticmethod + def _resolve_occurred_at( + ontology: OntologyParseResult, + *, + context_json: dict[str, Any], + ) -> datetime | None: + review_form_values = context_json.get("review_form_values") + if isinstance(review_form_values, dict): + for key in ("occurred_date", "time_range", "business_time"): + value = str(review_form_values.get(key) or "").strip() + if not value: + continue + try: + parsed = date.fromisoformat(value) + return datetime(parsed.year, parsed.month, parsed.day, tzinfo=UTC) + except ValueError: + continue + + start_date = ontology.time_range.start_date + if start_date: + try: + parsed = date.fromisoformat(start_date) + return datetime(parsed.year, parsed.month, parsed.day, tzinfo=UTC) + except ValueError: + pass + return None + + @staticmethod + def _resolve_amount( + entities: list[OntologyEntity], + *, + context_json: dict[str, Any], + ) -> Decimal | None: + review_form_values = context_json.get("review_form_values") + if isinstance(review_form_values, dict): + raw_value = str(review_form_values.get("amount") or "").strip() + if raw_value: + compact = raw_value.replace("元", "").replace(",", "").strip() + try: + return Decimal(compact).quantize(Decimal("0.01")) + except (InvalidOperation, ValueError): + pass + for item in entities: + if item.type != "amount" or item.role == "threshold": + continue + try: + return Decimal(item.normalized_value).quantize(Decimal("0.01")) + except (InvalidOperation, ValueError): + continue + return None + + @staticmethod + def _resolve_attachment_names(context_json: dict[str, Any]) -> list[str]: + names = context_json.get("attachment_names") + if not isinstance(names, list): + return [] + return [str(name).strip() for name in names if str(name).strip()] + + def _resolve_attachment_count(self, context_json: dict[str, Any]) -> int: + names = self._resolve_attachment_names(context_json) + if names: + return len(names) + try: + return max(0, int(context_json.get("attachment_count") or 0)) + except (TypeError, ValueError): + return 0 + + def _get_claim_item_or_raise( + self, + *, + claim_id: str, + item_id: str, + current_user: CurrentUserContext, + ) -> tuple[ExpenseClaim | None, ExpenseClaimItem]: + claim = self.get_claim(claim_id, current_user) + if claim is None: + return None, None # type: ignore[return-value] + + item = next((entry for entry in claim.items if entry.id == item_id), None) + if item is None: + raise LookupError("Item not found") + return claim, item + + def _get_attachment_storage_root(self) -> Path: + return (get_settings().resolved_storage_root_dir / "expense_claims").resolve() + + def _build_item_attachment_dir(self, claim_id: str, item_id: str) -> Path: + return (self._get_attachment_storage_root() / claim_id / item_id).resolve() + def _delete_claim_attachment_files(self, claim: ExpenseClaim) -> None: for item in list(claim.items or []): self._delete_item_attachment_files(item) @@ -2889,26 +3206,26 @@ class ExpenseClaimService: def _delete_claim_attachment_root(self, claim_id: str) -> None: claim_root = self._assert_attachment_storage_child(self._get_attachment_storage_root() / claim_id) self._delete_attachment_path(claim_root) - - @staticmethod - def _normalize_attachment_filename(filename: str | None) -> str: - normalized = Path(str(filename or "").strip()).name - normalized = re.sub(r"[^\w.\-\u4e00-\u9fff]+", "_", normalized).strip("._") - suffix = Path(normalized).suffix - if normalized: - return normalized - return f"attachment{suffix or '.bin'}" - + + @staticmethod + def _normalize_attachment_filename(filename: str | None) -> str: + normalized = Path(str(filename or "").strip()).name + normalized = re.sub(r"[^\w.\-\u4e00-\u9fff]+", "_", normalized).strip("._") + suffix = Path(normalized).suffix + if normalized: + return normalized + return f"attachment{suffix or '.bin'}" + def _resolve_attachment_path(self, storage_key: str | None) -> Path | None: normalized = str(storage_key or "").strip() if not normalized: return None - root = self._get_attachment_storage_root() - path = (root / normalized).resolve() - try: - path.relative_to(root) - except ValueError as exc: + root = self._get_attachment_storage_root() + path = (root / normalized).resolve() + try: + path.relative_to(root) + except ValueError as exc: raise FileNotFoundError("Attachment path is invalid") from exc return path @@ -2939,13 +3256,13 @@ class ExpenseClaimService: file_path = self._resolve_item_attachment_path(item) if file_path is None or not file_path.exists(): raise FileNotFoundError("Attachment not found") - - metadata = self._read_attachment_meta(file_path) - filename = str(metadata.get("file_name") or file_path.name) - media_type = self._resolve_attachment_media_type( - filename, - fallback=str(metadata.get("media_type") or ""), - ) + + metadata = self._read_attachment_meta(file_path) + filename = str(metadata.get("file_name") or file_path.name) + media_type = self._resolve_attachment_media_type( + filename, + fallback=str(metadata.get("media_type") or ""), + ) return file_path, media_type, filename def _delete_item_attachment_files(self, item: ExpenseClaimItem) -> None: @@ -2985,23 +3302,23 @@ class ExpenseClaimService: if target.exists(): raise OSError(f"Attachment path was not deleted: {target}") - - @staticmethod - def _attachment_meta_path(file_path: Path) -> Path: - return file_path.with_name(f"{file_path.name}.meta.json") - - def _write_attachment_meta(self, file_path: Path, payload: dict[str, Any]) -> None: - meta_path = self._attachment_meta_path(file_path) - meta_path.write_text(json.dumps(payload, ensure_ascii=False, indent=2), encoding="utf-8") - + + @staticmethod + def _attachment_meta_path(file_path: Path) -> Path: + return file_path.with_name(f"{file_path.name}.meta.json") + + def _write_attachment_meta(self, file_path: Path, payload: dict[str, Any]) -> None: + 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 {} - - try: - payload = json.loads(meta_path.read_text(encoding="utf-8")) - except (json.JSONDecodeError, OSError): + + try: + payload = json.loads(meta_path.read_text(encoding="utf-8")) + except (json.JSONDecodeError, OSError): return {} return payload if isinstance(payload, dict) else {} @@ -3078,53 +3395,53 @@ class ExpenseClaimService: self._write_attachment_meta(file_path, metadata) return metadata - - def _build_attachment_preview_meta( - self, - *, - file_path: Path, - media_type: str, - ocr_document: Any | None, - ) -> dict[str, Any]: - filename = file_path.name - storage_key = self._to_attachment_storage_key(file_path) - preview_kind = self._resolve_preview_kind(media_type, filename) - - preview_data_url = str(getattr(ocr_document, "preview_data_url", "") or "").strip() - preview_source_kind = str(getattr(ocr_document, "preview_kind", "") or "").strip() - if preview_source_kind == "image" and preview_data_url: - preview_asset = self._write_preview_asset_from_data_url( - attachment_dir=file_path.parent, - original_filename=filename, - preview_data_url=preview_data_url, - ) - if preview_asset is not None: - preview_path, preview_media_type, preview_file_name = preview_asset - return { - "previewable": True, - "preview_kind": "image", - "preview_storage_key": self._to_attachment_storage_key(preview_path), - "preview_media_type": preview_media_type, - "preview_file_name": preview_file_name, - } - - if preview_kind: - return { - "previewable": True, - "preview_kind": preview_kind, - "preview_storage_key": storage_key, - "preview_media_type": media_type, - "preview_file_name": filename, - } - - return { - "previewable": False, - "preview_kind": "", - "preview_storage_key": "", - "preview_media_type": "", - "preview_file_name": "", - } - + + def _build_attachment_preview_meta( + self, + *, + file_path: Path, + media_type: str, + ocr_document: Any | None, + ) -> dict[str, Any]: + filename = file_path.name + storage_key = self._to_attachment_storage_key(file_path) + preview_kind = self._resolve_preview_kind(media_type, filename) + + preview_data_url = str(getattr(ocr_document, "preview_data_url", "") or "").strip() + preview_source_kind = str(getattr(ocr_document, "preview_kind", "") or "").strip() + if preview_source_kind == "image" and preview_data_url: + preview_asset = self._write_preview_asset_from_data_url( + attachment_dir=file_path.parent, + original_filename=filename, + preview_data_url=preview_data_url, + ) + if preview_asset is not None: + preview_path, preview_media_type, preview_file_name = preview_asset + return { + "previewable": True, + "preview_kind": "image", + "preview_storage_key": self._to_attachment_storage_key(preview_path), + "preview_media_type": preview_media_type, + "preview_file_name": preview_file_name, + } + + if preview_kind: + return { + "previewable": True, + "preview_kind": preview_kind, + "preview_storage_key": storage_key, + "preview_media_type": media_type, + "preview_file_name": filename, + } + + return { + "previewable": False, + "preview_kind": "", + "preview_storage_key": "", + "preview_media_type": "", + "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) @@ -3136,22 +3453,22 @@ class ExpenseClaimService: 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) - if preview_path is not None and preview_path.exists(): - resolved_name = preview_file_name or preview_path.name - resolved_media_type = self._resolve_attachment_media_type( - resolved_name, - fallback=preview_media_type, - ) - return preview_path, resolved_media_type, resolved_name - - if self._is_previewable_media_type(media_type, filename): - return file_path, media_type, filename - - raise FileNotFoundError("Attachment preview not found") - + + if preview_storage_key: + preview_path = self._resolve_attachment_path(preview_storage_key) + if preview_path is not None and preview_path.exists(): + resolved_name = preview_file_name or preview_path.name + resolved_media_type = self._resolve_attachment_media_type( + resolved_name, + fallback=preview_media_type, + ) + return preview_path, resolved_media_type, resolved_name + + if self._is_previewable_media_type(media_type, filename): + return file_path, media_type, filename + + 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) @@ -3161,100 +3478,100 @@ class ExpenseClaimService: item=item, ) uploaded_at_value = metadata.get("uploaded_at") - uploaded_at = None - if isinstance(uploaded_at_value, str) and uploaded_at_value.strip(): - try: - uploaded_at = datetime.fromisoformat(uploaded_at_value) - except ValueError: - uploaded_at = None - - analysis = metadata.get("analysis") - if not isinstance(analysis, dict): - analysis = None - - document_info = metadata.get("document_info") - if not isinstance(document_info, dict): - document_info = None - - requirement_check = metadata.get("requirement_check") - if not isinstance(requirement_check, dict): - requirement_check = None - - preview_kind = str(metadata.get("preview_kind") or "").strip() - previewable = bool(metadata.get("previewable", self._is_previewable_media_type(media_type, filename))) - preview_url = self._build_attachment_preview_client_path(item.claim_id, item.id) if previewable else "" - - return { - "file_name": str(metadata.get("file_name") or filename), - "storage_key": str(item.invoice_id or ""), - "media_type": str(metadata.get("media_type") or media_type), - "size_bytes": int(metadata.get("size_bytes") or file_path.stat().st_size), - "uploaded_at": uploaded_at, - "previewable": previewable, - "preview_kind": preview_kind or self._resolve_preview_kind(media_type, filename), - "preview_url": preview_url, - "analysis": analysis, - "document_info": document_info, - "requirement_check": requirement_check, - } - - @staticmethod - def _resolve_preview_kind(media_type: str | None, filename: str) -> str: - resolved = str(media_type or "").strip() or (mimetypes.guess_type(filename)[0] or "") - if resolved.startswith("image/"): - return "image" - if resolved == "application/pdf": - return "pdf" - return "" - - @staticmethod - def _decode_data_url(payload: str) -> tuple[str, bytes] | None: - normalized = str(payload or "").strip() - matched = re.match(r"^data:(?P[\w.+-]+/[\w.+-]+);base64,(?P.+)$", normalized, flags=re.DOTALL) - if not matched: - return None - try: - content = base64.b64decode(matched.group("body"), validate=True) - except (binascii.Error, ValueError): - return None - return matched.group("media"), content - - def _write_preview_asset_from_data_url( - self, - *, - attachment_dir: Path, - original_filename: str, - preview_data_url: str, - ) -> tuple[Path, str, str] | None: - decoded = self._decode_data_url(preview_data_url) - if decoded is None: - return None - - preview_media_type, preview_content = decoded - suffix = mimetypes.guess_extension(preview_media_type) or ".bin" - preview_name = f"{Path(original_filename).stem}.preview{suffix}" - preview_path = attachment_dir / preview_name - preview_path.write_bytes(preview_content) - return preview_path, preview_media_type, preview_name - - @staticmethod - def _build_attachment_preview_client_path(claim_id: str, item_id: str) -> str: - return ( - "/reimbursements/claims/" - f"{quote(str(claim_id or '').strip(), safe='')}" - f"/items/{quote(str(item_id or '').strip(), safe='')}/attachment/preview" - ) - - @staticmethod - def _resolve_attachment_media_type(filename: str, *, fallback: str | None = None) -> str: - guessed = mimetypes.guess_type(filename)[0] - return str(guessed or fallback or "application/octet-stream") - - @staticmethod - def _is_previewable_media_type(media_type: str | None, filename: str) -> bool: - resolved = str(media_type or "").strip() or (mimetypes.guess_type(filename)[0] or "") - return resolved.startswith("image/") or resolved == "application/pdf" - + uploaded_at = None + if isinstance(uploaded_at_value, str) and uploaded_at_value.strip(): + try: + uploaded_at = datetime.fromisoformat(uploaded_at_value) + except ValueError: + uploaded_at = None + + analysis = metadata.get("analysis") + if not isinstance(analysis, dict): + analysis = None + + document_info = metadata.get("document_info") + if not isinstance(document_info, dict): + document_info = None + + requirement_check = metadata.get("requirement_check") + if not isinstance(requirement_check, dict): + requirement_check = None + + preview_kind = str(metadata.get("preview_kind") or "").strip() + previewable = bool(metadata.get("previewable", self._is_previewable_media_type(media_type, filename))) + preview_url = self._build_attachment_preview_client_path(item.claim_id, item.id) if previewable else "" + + return { + "file_name": str(metadata.get("file_name") or filename), + "storage_key": str(item.invoice_id or ""), + "media_type": str(metadata.get("media_type") or media_type), + "size_bytes": int(metadata.get("size_bytes") or file_path.stat().st_size), + "uploaded_at": uploaded_at, + "previewable": previewable, + "preview_kind": preview_kind or self._resolve_preview_kind(media_type, filename), + "preview_url": preview_url, + "analysis": analysis, + "document_info": document_info, + "requirement_check": requirement_check, + } + + @staticmethod + def _resolve_preview_kind(media_type: str | None, filename: str) -> str: + resolved = str(media_type or "").strip() or (mimetypes.guess_type(filename)[0] or "") + if resolved.startswith("image/"): + return "image" + if resolved == "application/pdf": + return "pdf" + return "" + + @staticmethod + def _decode_data_url(payload: str) -> tuple[str, bytes] | None: + normalized = str(payload or "").strip() + matched = re.match(r"^data:(?P[\w.+-]+/[\w.+-]+);base64,(?P.+)$", normalized, flags=re.DOTALL) + if not matched: + return None + try: + content = base64.b64decode(matched.group("body"), validate=True) + except (binascii.Error, ValueError): + return None + return matched.group("media"), content + + def _write_preview_asset_from_data_url( + self, + *, + attachment_dir: Path, + original_filename: str, + preview_data_url: str, + ) -> tuple[Path, str, str] | None: + decoded = self._decode_data_url(preview_data_url) + if decoded is None: + return None + + preview_media_type, preview_content = decoded + suffix = mimetypes.guess_extension(preview_media_type) or ".bin" + preview_name = f"{Path(original_filename).stem}.preview{suffix}" + preview_path = attachment_dir / preview_name + preview_path.write_bytes(preview_content) + return preview_path, preview_media_type, preview_name + + @staticmethod + def _build_attachment_preview_client_path(claim_id: str, item_id: str) -> str: + return ( + "/reimbursements/claims/" + f"{quote(str(claim_id or '').strip(), safe='')}" + f"/items/{quote(str(item_id or '').strip(), safe='')}/attachment/preview" + ) + + @staticmethod + def _resolve_attachment_media_type(filename: str, *, fallback: str | None = None) -> str: + guessed = mimetypes.guess_type(filename)[0] + return str(guessed or fallback or "application/octet-stream") + + @staticmethod + def _is_previewable_media_type(media_type: str | None, filename: str) -> bool: + resolved = str(media_type or "").strip() or (mimetypes.guess_type(filename)[0] or "") + return resolved.startswith("image/") or resolved == "application/pdf" + @staticmethod def _resolve_attachment_display_name(storage_key: str | None) -> str: return Path(str(storage_key or "").strip()).name @@ -3274,7 +3591,7 @@ class ExpenseClaimService: return normalized_current return normalized_next - + def _build_attachment_document_info(self, document: Any) -> dict[str, Any]: insight = build_document_insight( filename=str(getattr(document, "filename", "") or ""), @@ -3302,11 +3619,11 @@ class ExpenseClaimService: for item in raw_fields: key = "" label = "" - value = "" - if isinstance(item, dict): - key = str(item.get("key") or "").strip() - label = str(item.get("label") or "").strip() - value = str(item.get("value") or "").strip() + value = "" + if isinstance(item, dict): + key = str(item.get("key") or "").strip() + label = str(item.get("label") or "").strip() + value = str(item.get("value") or "").strip() else: key = str(getattr(item, "key", "") or "").strip() label = str(getattr(item, "label", "") or "").strip() @@ -3322,16 +3639,16 @@ class ExpenseClaimService: "key": key, "label": label, "value": value, - } - ) - - if not normalized_fields: - normalized_fields = [ - { - "key": field.key, - "label": field.label, - "value": field.value, - } + } + ) + + if not normalized_fields: + normalized_fields = [ + { + "key": field.key, + "label": field.label, + "value": field.value, + } for field in insight.fields if field.value ] @@ -3602,67 +3919,67 @@ class ExpenseClaimService: *, 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) - expense_label = policy.label if policy is not None else self._resolve_expense_type_label(expense_type) - allowed_scenes = set(policy.allowed_scene_codes) if policy is not None else set() - allowed_document_types = set(policy.allowed_document_types) if policy is not None else set() - allowed_scene_labels = [self._resolve_document_scene_label(code) for code in sorted(allowed_scenes)] - allowed_document_type_labels = [ - resolve_document_type_label(document_type) - for document_type in sorted(allowed_document_types) - ] - recognized_scene_code = str(document_info.get("scene_code") or "other").strip() or "other" - recognized_scene_label = str( - document_info.get("scene_label") or self._resolve_document_scene_label(recognized_scene_code) - ).strip() - recognized_document_type = str(document_info.get("document_type") or "other").strip() or "other" - recognized_document_type_label = str(document_info.get("document_type_label") or "其他单据").strip() or "其他单据" - matches = ( - (not allowed_scenes and not allowed_document_types) - or recognized_scene_code in allowed_scenes - or recognized_document_type in allowed_document_types - ) - - if matches: - if allowed_scene_labels or allowed_document_type_labels: - message = ( - f"当前费用项目为{expense_label},已识别为{recognized_document_type_label}," - f"符合当前{expense_label}场景的附件要求。" - ) - else: - message = f"当前费用项目为{expense_label},已识别为{recognized_document_type_label}。" - else: - expected_parts = [label + "相关票据" for label in allowed_scene_labels] - expected_parts.extend(allowed_document_type_labels) - expected_text = "、".join(dict.fromkeys(part for part in expected_parts if part)) or "对应场景票据" - message = ( - f"当前费用项目为{expense_label},要求上传{expected_text};" - f"当前识别为{recognized_document_type_label},不符合当前场景,建议过滤或更换附件。" - ) - - return { - "matches": matches, - "current_expense_type": expense_type, - "current_expense_type_label": expense_label, - "allowed_scene_labels": allowed_scene_labels, - "allowed_document_type_labels": allowed_document_type_labels, - "recognized_scene_code": recognized_scene_code, - "recognized_scene_label": recognized_scene_label, - "recognized_document_type": recognized_document_type, - "recognized_document_type_label": recognized_document_type_label, - "mismatch_severity": policy.attachment_mismatch_severity if policy is not None else "high", - "rule_code": policy.rule_code if policy is not None else DEFAULT_SCENE_RULE_ASSET_CODE, - "rule_name": policy.rule_name if policy is not None else "报销场景提交与附件标准", - "message": message, - } - - @staticmethod - def _resolve_document_scene_label(scene_code: str) -> str: - normalized = str(scene_code or "").strip().lower() - return DOCUMENT_SCENE_LABELS.get(normalized, "其他票据") - + ) -> dict[str, Any]: + expense_type = str(item.item_type or "").strip().lower() or "other" + policy = self._get_expense_scene_policy(expense_type) + expense_label = policy.label if policy is not None else self._resolve_expense_type_label(expense_type) + allowed_scenes = set(policy.allowed_scene_codes) if policy is not None else set() + allowed_document_types = set(policy.allowed_document_types) if policy is not None else set() + allowed_scene_labels = [self._resolve_document_scene_label(code) for code in sorted(allowed_scenes)] + allowed_document_type_labels = [ + resolve_document_type_label(document_type) + for document_type in sorted(allowed_document_types) + ] + recognized_scene_code = str(document_info.get("scene_code") or "other").strip() or "other" + recognized_scene_label = str( + document_info.get("scene_label") or self._resolve_document_scene_label(recognized_scene_code) + ).strip() + recognized_document_type = str(document_info.get("document_type") or "other").strip() or "other" + recognized_document_type_label = str(document_info.get("document_type_label") or "其他单据").strip() or "其他单据" + matches = ( + (not allowed_scenes and not allowed_document_types) + or recognized_scene_code in allowed_scenes + or recognized_document_type in allowed_document_types + ) + + if matches: + if allowed_scene_labels or allowed_document_type_labels: + message = ( + f"当前费用项目为{expense_label},已识别为{recognized_document_type_label}," + f"符合当前{expense_label}场景的附件要求。" + ) + else: + message = f"当前费用项目为{expense_label},已识别为{recognized_document_type_label}。" + else: + expected_parts = [label + "相关票据" for label in allowed_scene_labels] + expected_parts.extend(allowed_document_type_labels) + expected_text = "、".join(dict.fromkeys(part for part in expected_parts if part)) or "对应场景票据" + message = ( + f"当前费用项目为{expense_label},要求上传{expected_text};" + f"当前识别为{recognized_document_type_label},不符合当前场景,建议过滤或更换附件。" + ) + + return { + "matches": matches, + "current_expense_type": expense_type, + "current_expense_type_label": expense_label, + "allowed_scene_labels": allowed_scene_labels, + "allowed_document_type_labels": allowed_document_type_labels, + "recognized_scene_code": recognized_scene_code, + "recognized_scene_label": recognized_scene_label, + "recognized_document_type": recognized_document_type, + "recognized_document_type_label": recognized_document_type_label, + "mismatch_severity": policy.attachment_mismatch_severity if policy is not None else "high", + "rule_code": policy.rule_code if policy is not None else DEFAULT_SCENE_RULE_ASSET_CODE, + "rule_name": policy.rule_name if policy is not None else "报销场景提交与附件标准", + "message": message, + } + + @staticmethod + def _resolve_document_scene_label(scene_code: str) -> str: + normalized = str(scene_code or "").strip().lower() + return DOCUMENT_SCENE_LABELS.get(normalized, "其他票据") + @staticmethod def _extract_amount_candidates(text: str) -> list[Decimal]: return extract_amount_candidates(text) @@ -3675,20 +3992,20 @@ class ExpenseClaimService: end: int, ) -> bool: return is_amount_match_date_fragment(amount, text, start, end) - - @staticmethod - def _has_date_like_text(text: str) -> bool: - return bool(re.search(r"(20\d{2}[年/\-.]\d{1,2}[月/\-.]\d{1,2}日?)", text)) - - @staticmethod - def _normalize_match_text(text: str) -> str: - return re.sub(r"\s+", "", str(text or "")).lower() - - @staticmethod - def _resolve_expense_type_label(expense_type: str | None) -> str: - normalized = str(expense_type or "").strip().lower() - return EXPENSE_TYPE_LABELS.get(normalized, "其他") - + + @staticmethod + def _has_date_like_text(text: str) -> bool: + return bool(re.search(r"(20\d{2}[年/\-.]\d{1,2}[月/\-.]\d{1,2}日?)", text)) + + @staticmethod + def _normalize_match_text(text: str) -> str: + return re.sub(r"\s+", "", str(text or "")).lower() + + @staticmethod + def _resolve_expense_type_label(expense_type: str | None) -> str: + normalized = str(expense_type or "").strip().lower() + return EXPENSE_TYPE_LABELS.get(normalized, "其他") + def _resolve_allowed_document_scenes(self, expense_type: str | None) -> set[str]: normalized = str(expense_type or "").strip().lower() policy = self._get_expense_scene_policy(normalized) @@ -3710,33 +4027,33 @@ class ExpenseClaimService: if scenes: return scenes return set(self._detect_expense_scenes(text).keys()) - - def _detect_expense_scenes(self, text: str) -> dict[str, list[str]]: - normalized = self._normalize_match_text(text) - if not normalized: - return {} - - matches: dict[str, list[str]] = {} - for scene, keywords in EXPENSE_SCENE_KEYWORDS.items(): - matched = [keyword for keyword in keywords if keyword in normalized] - if matched: - matches[scene] = matched[:3] - return matches - - def _format_scene_labels(self, scene_codes: set[str]) -> str: - labels = [self._resolve_expense_type_label(code) for code in scene_codes] - unique_labels = list(dict.fromkeys(label for label in labels if label)) - return "、".join(unique_labels) if unique_labels else "其他" - + + def _detect_expense_scenes(self, text: str) -> dict[str, list[str]]: + normalized = self._normalize_match_text(text) + if not normalized: + return {} + + matches: dict[str, list[str]] = {} + for scene, keywords in EXPENSE_SCENE_KEYWORDS.items(): + matched = [keyword for keyword in keywords if keyword in normalized] + if matched: + matches[scene] = matched[:3] + return matches + + def _format_scene_labels(self, scene_codes: set[str]) -> str: + labels = [self._resolve_expense_type_label(code) for code in scene_codes] + unique_labels = list(dict.fromkeys(label for label in labels if label)) + return "、".join(unique_labels) if unique_labels else "其他" + def _build_purpose_mismatch_point( self, *, item: ExpenseClaimItem, document_scenes: set[str], - ) -> str | None: - if not document_scenes: - return None - + ) -> str | None: + if not document_scenes: + return None + allowed_scenes = self._resolve_allowed_document_scenes(item.item_type) document_scene_labels = self._format_scene_labels(document_scenes) @@ -3784,43 +4101,43 @@ class ExpenseClaimService: ) def _build_fallback_attachment_analysis( - self, - *, - media_type: str | None, - item: ExpenseClaimItem, - ) -> dict[str, Any]: - return { - "severity": "medium", - "label": "中风险", - "headline": "AI提示:附件已上传,待识别结果", - "summary": "附件已成功保存,但当前尚未拿到有效识别结果,建议人工先核对票据内容。", - "points": [ - f"附件格式:{self._resolve_attachment_media_type('attachment', fallback=media_type)}", - f"费用金额:当前明细金额为 {item.item_amount} 元", - ], - "suggestion": "建议打开附件确认金额、日期和票据类型是否完整,再继续提交审批。", - } - - def _build_failed_ocr_attachment_analysis( - self, - *, - media_type: str | None, - error_message: str, - item: ExpenseClaimItem, - ) -> dict[str, Any]: - return { - "severity": "medium", - "label": "中风险", - "headline": "AI提示:附件已上传,但识别失败", - "summary": "文件已经保存成功,但本次 AI 识别未完成,因此无法给出完整票据核验结论。", - "points": [ - f"识别异常:{error_message or 'OCR 服务暂不可用'}", - f"费用金额:当前明细金额为 {item.item_amount} 元", - f"附件格式:{self._resolve_attachment_media_type('attachment', fallback=media_type)}", - ], - "suggestion": "建议重新上传更清晰的票据图片,或稍后重试识别后再提交。", - } - + self, + *, + media_type: str | None, + item: ExpenseClaimItem, + ) -> dict[str, Any]: + return { + "severity": "medium", + "label": "中风险", + "headline": "AI提示:附件已上传,待识别结果", + "summary": "附件已成功保存,但当前尚未拿到有效识别结果,建议人工先核对票据内容。", + "points": [ + f"附件格式:{self._resolve_attachment_media_type('attachment', fallback=media_type)}", + f"费用金额:当前明细金额为 {item.item_amount} 元", + ], + "suggestion": "建议打开附件确认金额、日期和票据类型是否完整,再继续提交审批。", + } + + def _build_failed_ocr_attachment_analysis( + self, + *, + media_type: str | None, + error_message: str, + item: ExpenseClaimItem, + ) -> dict[str, Any]: + return { + "severity": "medium", + "label": "中风险", + "headline": "AI提示:附件已上传,但识别失败", + "summary": "文件已经保存成功,但本次 AI 识别未完成,因此无法给出完整票据核验结论。", + "points": [ + f"识别异常:{error_message or 'OCR 服务暂不可用'}", + f"费用金额:当前明细金额为 {item.item_amount} 元", + f"附件格式:{self._resolve_attachment_media_type('attachment', fallback=media_type)}", + ], + "suggestion": "建议重新上传更清晰的票据图片,或稍后重试识别后再提交。", + } + def _build_attachment_analysis( self, *, @@ -3830,21 +4147,21 @@ class ExpenseClaimService: document_info: dict[str, Any] | None = None, requirement_check: dict[str, Any] | None = None, ) -> dict[str, Any]: - warnings = [str(value).strip() for value in list(getattr(document, "warnings", []) or []) if str(value).strip()] - text = " ".join( - [ - str(getattr(document, "summary", "") or "").strip(), - str(getattr(document, "text", "") or "").strip(), - ] - ).strip() - compact_text = text.replace(" ", "") - avg_score = float(getattr(document, "avg_score", 0.0) or 0.0) - line_count = int(getattr(document, "line_count", 0) or 0) - document_info = document_info or self._build_attachment_document_info(document) - requirement_check = requirement_check or self._build_attachment_requirement_check( - item=item, - document_info=document_info, - ) + warnings = [str(value).strip() for value in list(getattr(document, "warnings", []) or []) if str(value).strip()] + text = " ".join( + [ + str(getattr(document, "summary", "") or "").strip(), + str(getattr(document, "text", "") or "").strip(), + ] + ).strip() + compact_text = text.replace(" ", "") + avg_score = float(getattr(document, "avg_score", 0.0) or 0.0) + line_count = int(getattr(document, "line_count", 0) or 0) + document_info = document_info or self._build_attachment_document_info(document) + requirement_check = requirement_check or self._build_attachment_requirement_check( + item=item, + document_info=document_info, + ) document_scenes = self._resolve_document_analysis_scenes(document_info, text) purpose_mismatch_point = self._build_purpose_mismatch_point( item=item, @@ -3878,38 +4195,38 @@ class ExpenseClaimService: travel_policy_high_risk = bool(travel_policy_audit.get("has_high_risk")) recognized_document_type = str(document_info.get("document_type") or "other").strip().lower() or "other" recognized_document_label = str(document_info.get("document_type_label") or "其他单据").strip() or "其他单据" - requirement_matches = bool(requirement_check.get("matches")) - mismatch_severity = str(requirement_check.get("mismatch_severity") or "high").strip().lower() or "high" - - has_ticket_keyword = any( - keyword in compact_text - for keyword in ( - "发票", - "票据", - "增值税", - "电子行程单", - "购买方", - "销售方", - "税额", - "价税", - "票号", - "发票代码", - "凭证", - ) - ) - amount_candidates = self._extract_amount_candidates(text) - item_amount = Decimal(item.item_amount or Decimal("0.00")).quantize(Decimal("0.01")) - has_matching_amount = any(abs(candidate - item_amount) <= Decimal("1.00") for candidate in amount_candidates) - has_date_text = self._has_date_like_text(text) - amount_mismatch = bool(amount_candidates) and item_amount > Decimal("0.00") and not has_matching_amount - - points: list[str] = [] - if warnings: - points.append(f"识别提示:{warnings[0]}") - if line_count == 0 or not compact_text: - points.append("附件内容:未识别到有效文字,当前附件更像普通图片或内容过于模糊。") - if recognized_document_type == "other" and not has_ticket_keyword: - points.append("票据类型:未识别到发票、票据、电子行程单等关键字,暂无法判断票据类型。") + requirement_matches = bool(requirement_check.get("matches")) + mismatch_severity = str(requirement_check.get("mismatch_severity") or "high").strip().lower() or "high" + + has_ticket_keyword = any( + keyword in compact_text + for keyword in ( + "发票", + "票据", + "增值税", + "电子行程单", + "购买方", + "销售方", + "税额", + "价税", + "票号", + "发票代码", + "凭证", + ) + ) + amount_candidates = self._extract_amount_candidates(text) + item_amount = Decimal(item.item_amount or Decimal("0.00")).quantize(Decimal("0.01")) + has_matching_amount = any(abs(candidate - item_amount) <= Decimal("1.00") for candidate in amount_candidates) + has_date_text = self._has_date_like_text(text) + amount_mismatch = bool(amount_candidates) and item_amount > Decimal("0.00") and not has_matching_amount + + points: list[str] = [] + if warnings: + points.append(f"识别提示:{warnings[0]}") + if line_count == 0 or not compact_text: + points.append("附件内容:未识别到有效文字,当前附件更像普通图片或内容过于模糊。") + if recognized_document_type == "other" and not has_ticket_keyword: + points.append("票据类型:未识别到发票、票据、电子行程单等关键字,暂无法判断票据类型。") if not amount_candidates: points.append("金额字段:未识别到可用于核对的金额。") elif amount_mismatch: @@ -3929,16 +4246,16 @@ class ExpenseClaimService: points.append(purpose_mismatch_point) if route_format_point: points.append(route_format_point) - if avg_score and avg_score < 0.72: - points.append(f"识别质量:OCR 置信度偏低({avg_score:.0%}),可能影响票据核验准确性。") - - issue_count = len(points) - if issue_count == 0: - return { - "severity": "pass", - "label": "AI提示符合条件", - "headline": "AI提示:附件符合基础校验条件", - "summary": "已识别到票据类型和关键字段,且符合当前费用场景的附件要求。", + if avg_score and avg_score < 0.72: + points.append(f"识别质量:OCR 置信度偏低({avg_score:.0%}),可能影响票据核验准确性。") + + issue_count = len(points) + if issue_count == 0: + return { + "severity": "pass", + "label": "AI提示符合条件", + "headline": "AI提示:附件符合基础校验条件", + "summary": "已识别到票据类型和关键字段,且符合当前费用场景的附件要求。", "points": [ f"票据类型:已识别为{recognized_document_label}。", f"附件类型要求:{requirement_check.get('message')}", @@ -3947,12 +4264,12 @@ class ExpenseClaimService: "rule_basis": travel_policy_rule_basis, "suggestion": "建议继续核对报销分类、费用说明和业务场景是否一致。", } - - severity = "low" - label = "低风险" - headline = "AI提示:附件存在轻微待核对项" - summary = "当前附件已识别出部分票据要素,但仍建议人工继续复核。" - + + severity = "low" + label = "低风险" + headline = "AI提示:附件存在轻微待核对项" + summary = "当前附件已识别出部分票据要素,但仍建议人工继续复核。" + if travel_policy_high_risk: severity = "high" label = "高风险" @@ -3962,13 +4279,13 @@ class ExpenseClaimService: line_count == 0 or not compact_text or (recognized_document_type == "other" and not has_ticket_keyword and issue_count >= 2) - or (not requirement_matches and mismatch_severity == "high") - or (purpose_mismatch_point and amount_mismatch) - ): - severity = "high" - label = "高风险" - headline = "AI提示:附件不符合票据校验条件" - summary = "当前附件存在明显异常,票据类型与当前费用场景不匹配,或无法作为有效报销材料。" + or (not requirement_matches and mismatch_severity == "high") + or (purpose_mismatch_point and amount_mismatch) + ): + severity = "high" + label = "高风险" + headline = "AI提示:附件不符合票据校验条件" + summary = "当前附件存在明显异常,票据类型与当前费用场景不匹配,或无法作为有效报销材料。" elif ( purpose_mismatch_point or route_format_point @@ -3977,10 +4294,10 @@ class ExpenseClaimService: or amount_mismatch or issue_count >= 2 or warnings - or (avg_score and avg_score < 0.72) - or (not requirement_matches and mismatch_severity in {"medium", "low"}) - ): - severity = "medium" + or (avg_score and avg_score < 0.72) + or (not requirement_matches and mismatch_severity in {"medium", "low"}) + ): + severity = "medium" label = "中风险" headline = "AI提示:附件存在明显待整改项" summary = "当前附件可见部分内容,但金额、用途、日期或附件类型仍有缺失或不一致。" @@ -4008,22 +4325,22 @@ class ExpenseClaimService: "rule_basis": list(dict.fromkeys(travel_policy_rule_basis)), "suggestion": suggestion, } - - @staticmethod + + @staticmethod def _serialize_claim(claim: ExpenseClaim) -> dict[str, Any]: return { "id": claim.id, "claim_no": claim.claim_no, - "employee_name": claim.employee_name, - "department_name": claim.department_name, - "project_code": claim.project_code, - "expense_type": claim.expense_type, - "reason": claim.reason, - "location": claim.location, - "amount": float(claim.amount), - "invoice_count": int(claim.invoice_count or 0), - "status": claim.status, - "approval_stage": claim.approval_stage, + "employee_name": claim.employee_name, + "department_name": claim.department_name, + "project_code": claim.project_code, + "expense_type": claim.expense_type, + "reason": claim.reason, + "location": claim.location, + "amount": float(claim.amount), + "invoice_count": int(claim.invoice_count or 0), + "status": claim.status, + "approval_stage": claim.approval_stage, "risk_flags_json": list(claim.risk_flags_json or []), } @@ -4116,29 +4433,29 @@ class ExpenseClaimService: @staticmethod def _normalize_optional_text(value: str | None, *, fallback: str = "", allow_empty: bool = False) -> str | None: - normalized = str(value or "").strip() - if normalized: - return normalized - if allow_empty: - return None - return fallback - - @staticmethod - def _normalize_sort_datetime(value: datetime | None) -> datetime: - if value is None: - return datetime.max.replace(tzinfo=UTC) - if value.tzinfo is None: - return value.replace(tzinfo=UTC) - return value - - @staticmethod - def _is_missing_value(value: Any) -> bool: - text = str(value or "").strip() - if not text: - return True - compact = text.replace(" ", "") - return compact in {"待补充", "暂无", "无", "未知", "处理中"} - + normalized = str(value or "").strip() + if normalized: + return normalized + if allow_empty: + return None + return fallback + + @staticmethod + def _normalize_sort_datetime(value: datetime | None) -> datetime: + if value is None: + return datetime.max.replace(tzinfo=UTC) + if value.tzinfo is None: + return value.replace(tzinfo=UTC) + return value + + @staticmethod + def _is_missing_value(value: Any) -> bool: + text = str(value or "").strip() + if not text: + return True + compact = text.replace(" ", "") + return compact in {"待补充", "暂无", "无", "未知", "处理中"} + def _ensure_draft_claim(self, claim: ExpenseClaim) -> None: if not self._is_editable_claim_status(claim.status): raise ValueError("只有草稿、待补充或退回待提交状态的报销单才允许执行该操作。") @@ -4164,30 +4481,30 @@ class ExpenseClaimService: ) def _run_ai_submission_review(self, claim: ExpenseClaim) -> dict[str, Any]: - base_flags = list(claim.risk_flags_json or []) - attachment_flags = [ - flag - for flag in base_flags - if isinstance(flag, dict) and str(flag.get("source") or "").strip() == "attachment_analysis" - ] - preserved_flags = [ - flag - for flag in base_flags - if not (isinstance(flag, dict) and str(flag.get("source") or "").strip() == "submission_review") - ] - + base_flags = list(claim.risk_flags_json or []) + attachment_flags = [ + flag + for flag in base_flags + if isinstance(flag, dict) and str(flag.get("source") or "").strip() == "attachment_analysis" + ] + preserved_flags = [ + flag + for flag in base_flags + if not (isinstance(flag, dict) and str(flag.get("source") or "").strip() == "submission_review") + ] + review_flags: list[dict[str, Any]] = [] attention_reasons: list[str] = [] - - high_attachment_flags = [ - flag - for flag in attachment_flags - if str(flag.get("severity") or "").strip().lower() == "high" - ] - medium_attachment_flags = [ - flag - for flag in attachment_flags - if str(flag.get("severity") or "").strip().lower() == "medium" + + high_attachment_flags = [ + flag + for flag in attachment_flags + if str(flag.get("severity") or "").strip().lower() == "high" + ] + medium_attachment_flags = [ + flag + for flag in attachment_flags + if str(flag.get("severity") or "").strip().lower() == "medium" ] if high_attachment_flags: attention_reasons.append("存在高风险票据,需审批人重点复核。") @@ -4202,16 +4519,16 @@ class ExpenseClaimService: ), } ) - elif medium_attachment_flags: - review_flags.append( - { - "source": "submission_review", - "severity": "medium", + elif medium_attachment_flags: + review_flags.append( + { + "source": "submission_review", + "severity": "medium", "label": "AI预审提醒", "message": f"AI预审发现 {len(medium_attachment_flags)} 条中风险附件,已随单流转给审批人复核。", - } - ) - + } + ) + manager_name = self._resolve_claim_manager_name(claim) if not manager_name: attention_reasons.append("未识别到该员工的直属领导,需审批环节补充分配。") @@ -4223,33 +4540,33 @@ class ExpenseClaimService: "message": "AI预审发现直属领导缺失,已提交到审批环节等待分配或复核。", } ) - - historical_risk_count = self._count_recent_risky_claims(claim) - if historical_risk_count >= AI_REVIEW_REPEAT_RISK_BLOCK_COUNT: - review_flags.append( - { - "source": "submission_review", - "severity": "medium", - "label": "历史风险偏高", - "message": ( - f"近 {AI_REVIEW_LOOKBACK_DAYS} 天内该员工已有 {historical_risk_count} 笔带风险标记的报销," - "本次已追加到审批链重点关注。" - ), - } - ) - elif historical_risk_count >= AI_REVIEW_REPEAT_RISK_WARNING_COUNT: - review_flags.append( - { - "source": "submission_review", - "severity": "low", - "label": "历史风险提醒", - "message": ( - f"近 {AI_REVIEW_LOOKBACK_DAYS} 天内该员工已有 {historical_risk_count} 笔带风险标记的报销," - "建议直属领导重点复核。" - ), - } - ) - + + historical_risk_count = self._count_recent_risky_claims(claim) + if historical_risk_count >= AI_REVIEW_REPEAT_RISK_BLOCK_COUNT: + review_flags.append( + { + "source": "submission_review", + "severity": "medium", + "label": "历史风险偏高", + "message": ( + f"近 {AI_REVIEW_LOOKBACK_DAYS} 天内该员工已有 {historical_risk_count} 笔带风险标记的报销," + "本次已追加到审批链重点关注。" + ), + } + ) + elif historical_risk_count >= AI_REVIEW_REPEAT_RISK_WARNING_COUNT: + review_flags.append( + { + "source": "submission_review", + "severity": "low", + "label": "历史风险提醒", + "message": ( + f"近 {AI_REVIEW_LOOKBACK_DAYS} 天内该员工已有 {historical_risk_count} 笔带风险标记的报销," + "建议直属领导重点复核。" + ), + } + ) + travel_review = self._run_travel_policy_review(claim) attention_reasons.extend(travel_review["blocking_reasons"]) review_flags.extend(travel_review["flags"]) @@ -4278,40 +4595,40 @@ class ExpenseClaimService: return { "status": "submitted", - "approval_stage": "直属领导审批", - "risk_flags": preserved_flags + review_flags, - "message": ( + "approval_stage": "直属领导审批", + "risk_flags": preserved_flags + review_flags, + "message": ( f"报销单 {claim.claim_no} 已完成 AI预审," - f"现已提交给直属领导 {manager_name or '审批人'} 审批。" - ), - "passed": True, - } - - @staticmethod - def _resolve_claim_manager_name(claim: ExpenseClaim) -> str: - if claim.employee is not None: - if claim.employee.manager is not None and claim.employee.manager.name: - return str(claim.employee.manager.name).strip() - if claim.employee.organization_unit is not None and claim.employee.organization_unit.manager_name: - return str(claim.employee.organization_unit.manager_name).strip() - return "" - - def _count_recent_risky_claims(self, claim: ExpenseClaim) -> int: - filters = [] - if claim.employee_id: - filters.append(ExpenseClaim.employee_id == claim.employee_id) - elif claim.employee_name: - filters.append(ExpenseClaim.employee_name == claim.employee_name) - if not filters: - return 0 - - since = datetime.now(UTC) - timedelta(days=AI_REVIEW_LOOKBACK_DAYS) - stmt = ( - select(ExpenseClaim) - .where(or_(*filters)) - .where(ExpenseClaim.id != claim.id) - .where(ExpenseClaim.occurred_at >= since) - ) + f"现已提交给直属领导 {manager_name or '审批人'} 审批。" + ), + "passed": True, + } + + @staticmethod + def _resolve_claim_manager_name(claim: ExpenseClaim) -> str: + if claim.employee is not None: + if claim.employee.manager is not None and claim.employee.manager.name: + return str(claim.employee.manager.name).strip() + if claim.employee.organization_unit is not None and claim.employee.organization_unit.manager_name: + return str(claim.employee.organization_unit.manager_name).strip() + return "" + + def _count_recent_risky_claims(self, claim: ExpenseClaim) -> int: + filters = [] + if claim.employee_id: + filters.append(ExpenseClaim.employee_id == claim.employee_id) + elif claim.employee_name: + filters.append(ExpenseClaim.employee_name == claim.employee_name) + if not filters: + return 0 + + since = datetime.now(UTC) - timedelta(days=AI_REVIEW_LOOKBACK_DAYS) + stmt = ( + select(ExpenseClaim) + .where(or_(*filters)) + .where(ExpenseClaim.id != claim.id) + .where(ExpenseClaim.occurred_at >= since) + ) recent_claims = list(self.db.scalars(stmt).all()) return sum(1 for item in recent_claims if list(item.risk_flags_json or [])) @@ -5014,282 +5331,282 @@ class ExpenseClaimService: return "" def _run_scene_policy_review(self, claim: ExpenseClaim) -> dict[str, list[Any]]: - catalog = self._get_expense_rule_catalog() - flags: list[dict[str, Any]] = [] - blocking_reasons: list[str] = [] - reason_corpus = self._build_scene_reason_corpus(claim) - scene_totals: dict[str, Decimal] = defaultdict(lambda: Decimal("0.00")) - scene_warned: set[str] = set() - - for item in claim.items: - item_type = str(item.item_type or claim.expense_type or "other").strip().lower() or "other" - policy = catalog.get_scene_policy(item_type) - if policy is None: - continue - - scene_totals[item_type] += Decimal(item.item_amount or Decimal("0.00")).quantize(Decimal("0.01")) - - if policy.always_warn and item_type not in scene_warned: - scene_warned.add(item_type) - flags.append( - { - "source": "submission_review", - "severity": "medium", - "label": f"{policy.label}人工重点复核", - "message": policy.always_warn_message or f"{policy.label}默认需要人工重点复核。", - "rule_code": policy.rule_code, - } - ) - - item_limit = policy.item_amount_limit - item_amount = Decimal(item.item_amount or Decimal("0.00")).quantize(Decimal("0.01")) - if item_limit is not None and item_amount > Decimal("0.00"): - exceeded = self._evaluate_amount_limit( - amount=item_amount, - limit_config=item_limit, - reason_text="\n".join( - part - for part in [reason_corpus, str(item.item_reason or "").strip()] - if part - ), - ) - if exceeded is not None: - severity, threshold = exceeded - label = ( - f"{policy.label}金额超标待说明" - if severity == "high" - else f"{policy.label}金额超标提醒" - ) - message = ( - f"{policy.label}当前识别金额为 {item_amount} 元," - f"已超过制度阈值 {threshold} 元。" - ) - if severity == "high": - message += " 当前未识别到例外说明,请先补充原因。" - blocking_reasons.append(f"{policy.label}金额超出制度阈值,且未补充例外说明。") - else: - message += " 已识别到例外说明,请审批人重点复核。" - flags.append( - { - "source": "submission_review", - "severity": severity, - "label": label, - "message": message, - "rule_code": policy.rule_code, - } - ) - - for scene_code, total_amount in scene_totals.items(): - policy = catalog.get_scene_policy(scene_code) - if policy is None or policy.claim_amount_limit is None or total_amount <= Decimal("0.00"): - continue - exceeded = self._evaluate_amount_limit( - amount=total_amount, - limit_config=policy.claim_amount_limit, - reason_text=reason_corpus, - ) - if exceeded is None: - continue - - severity, threshold = exceeded - label = f"{policy.label}合计超标待说明" if severity == "high" else f"{policy.label}合计超标提醒" - message = ( - f"{policy.label}当前合计金额为 {total_amount} 元," - f"已超过制度阈值 {threshold} 元。" - ) - if severity == "high": - message += " 当前未识别到例外说明,请先补充原因。" - blocking_reasons.append(f"{policy.label}合计金额超出制度阈值,且未补充例外说明。") - else: - message += " 已识别到例外说明,请审批人重点复核。" - flags.append( - { - "source": "submission_review", - "severity": severity, - "label": label, - "message": message, - "rule_code": policy.rule_code, - } - ) - - return { - "flags": flags, - "blocking_reasons": list(dict.fromkeys(reason for reason in blocking_reasons if reason)), - } - - @staticmethod - def _evaluate_amount_limit( - *, - 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 = ExpenseClaimService._text_contains_keywords(reason_text, exception_keywords) - - if block_amount is not None and amount > Decimal(block_amount): - return ("medium" if has_exception else "high", Decimal(block_amount)) - if warn_amount is not None and amount > Decimal(warn_amount): - return ("medium", Decimal(warn_amount)) - return None - - def _run_travel_policy_review(self, claim: ExpenseClaim) -> dict[str, list[Any]]: - policy = self._get_expense_rule_catalog().travel_policy - if policy is None: - return {"flags": [], "blocking_reasons": []} - contexts = [ - context - for context in self._build_claim_attachment_contexts(claim) - if self._is_travel_policy_relevant_context(context, policy) - ] - if not contexts: - return {"flags": [], "blocking_reasons": []} - - reason_corpus = self._build_travel_reason_corpus(claim) - has_route_exception = self._text_contains_keywords( - reason_corpus, - policy.route_exception_keywords, - ) - has_standard_exception = self._text_contains_keywords( - reason_corpus, - policy.standard_exception_keywords, - ) - grade_band = self._resolve_travel_policy_band(claim.employee_grade) - band_label = policy.band_labels.get(grade_band or "", str(claim.employee_grade or "").strip() or "当前职级") - - itinerary_segments: list[dict[str, Any]] = [] - itinerary_cities: list[str] = [] - hotel_contexts: list[dict[str, Any]] = [] - flags: list[dict[str, Any]] = [] - blocking_reasons: list[str] = [] - - for context in contexts: - route_segment = self._extract_route_segment(context, policy) - if route_segment and self._is_long_distance_travel_context(context, policy): - itinerary_segments.append( - { - "item": context["item"], - "origin": route_segment[0], - "destination": route_segment[1], - } - ) - itinerary_cities.extend([route_segment[0], route_segment[1]]) - - scene_code = str(context["document_info"].get("scene_code") or "").strip().lower() - document_type = str(context["document_info"].get("document_type") or "").strip().lower() - item_type = str(context["item"].item_type or "").strip().lower() - if "hotel" in {scene_code, document_type, item_type} or document_type == "hotel_invoice": - hotel_contexts.append(context) - - unique_itinerary_cities = list(dict.fromkeys(city for city in itinerary_cities if city)) - expected_destination_city = self._resolve_expected_travel_city( - claim, - contexts, - unique_itinerary_cities, - policy, - ) - - if itinerary_segments: - unique_destinations = list( - dict.fromkeys(segment["destination"] for segment in itinerary_segments if segment["destination"]) - ) - first_origin = str(itinerary_segments[0]["origin"] or "").strip() - last_destination = str(itinerary_segments[-1]["destination"] or "").strip() - - for previous, current in zip(itinerary_segments, itinerary_segments[1:]): - previous_destination = str(previous["destination"] or "").strip() - current_origin = str(current["origin"] or "").strip() - if previous_destination and current_origin and previous_destination != current_origin: - message = ( - f"差旅行程未形成连续链路:上一段到达 {previous_destination}," - f"下一段却从 {current_origin} 出发,请补充中转或改签说明。" - ) - flags.append( - { - "source": "submission_review", - "severity": "high", - "label": "行程闭环异常", - "message": message, - "rule_code": policy.rule_code, - } - ) - blocking_reasons.append("差旅行程未形成连续闭环,请补充中转、改签或异地出发原因。") - break - - if ( - expected_destination_city - and last_destination - and last_destination not in {expected_destination_city, first_origin} - ): - message = ( - f"差旅行程终点识别为 {last_destination}," - f"与申报目的地 {expected_destination_city} 不一致,请补充多地出差或后续行程说明。" - ) - flags.append( - { - "source": "submission_review", - "severity": "high", - "label": "行程终点异常", - "message": message, - "rule_code": policy.rule_code, - } - ) - blocking_reasons.append("差旅行程终点与申报目的地不一致,请补充多地出差说明或补齐后续票据。") - - expected_city_set = { - city - for city in (expected_destination_city, first_origin) - if city - } - extra_destinations = [ - city - for city in unique_destinations - if city and city not in expected_city_set - ] - if extra_destinations and not has_route_exception: - destinations_text = "、".join(extra_destinations[:3]) - flags.append( - { - "source": "submission_review", - "severity": "high", - "label": "多城市行程待说明", - "message": ( - f"检测到本次差旅涉及 {destinations_text} 多个目的地," - "但当前报销事由未说明中转、多地拜访或改签原因。" - ), - "rule_code": policy.rule_code, - } - ) - blocking_reasons.append("检测到多城市差旅行程,但当前未补充中转或多地出差说明。") - - allowed_hotel_cities = { - city - for city in [expected_destination_city, *unique_itinerary_cities] - if city - } - for context in hotel_contexts: - hotel_city = self._extract_hotel_city(context, policy) - if hotel_city and allowed_hotel_cities and hotel_city not in allowed_hotel_cities: - expected_text = "、".join(sorted(allowed_hotel_cities)) - flags.append( - { - "source": "submission_review", - "severity": "high", - "label": "酒店地点异常", - "message": ( - f"酒店票据识别城市为 {hotel_city}," - f"与当前差旅目的地/行程城市 {expected_text} 不一致,请补充异地住宿原因。" - ), - "rule_code": policy.rule_code, - } - ) - blocking_reasons.append("酒店票据地点与差旅目的地不一致,请补充异地住宿原因或更换附件。") - - if grade_band is None: - continue - + catalog = self._get_expense_rule_catalog() + flags: list[dict[str, Any]] = [] + blocking_reasons: list[str] = [] + reason_corpus = self._build_scene_reason_corpus(claim) + scene_totals: dict[str, Decimal] = defaultdict(lambda: Decimal("0.00")) + scene_warned: set[str] = set() + + for item in claim.items: + item_type = str(item.item_type or claim.expense_type or "other").strip().lower() or "other" + policy = catalog.get_scene_policy(item_type) + if policy is None: + continue + + scene_totals[item_type] += Decimal(item.item_amount or Decimal("0.00")).quantize(Decimal("0.01")) + + if policy.always_warn and item_type not in scene_warned: + scene_warned.add(item_type) + flags.append( + { + "source": "submission_review", + "severity": "medium", + "label": f"{policy.label}人工重点复核", + "message": policy.always_warn_message or f"{policy.label}默认需要人工重点复核。", + "rule_code": policy.rule_code, + } + ) + + item_limit = policy.item_amount_limit + item_amount = Decimal(item.item_amount or Decimal("0.00")).quantize(Decimal("0.01")) + if item_limit is not None and item_amount > Decimal("0.00"): + exceeded = self._evaluate_amount_limit( + amount=item_amount, + limit_config=item_limit, + reason_text="\n".join( + part + for part in [reason_corpus, str(item.item_reason or "").strip()] + if part + ), + ) + if exceeded is not None: + severity, threshold = exceeded + label = ( + f"{policy.label}金额超标待说明" + if severity == "high" + else f"{policy.label}金额超标提醒" + ) + message = ( + f"{policy.label}当前识别金额为 {item_amount} 元," + f"已超过制度阈值 {threshold} 元。" + ) + if severity == "high": + message += " 当前未识别到例外说明,请先补充原因。" + blocking_reasons.append(f"{policy.label}金额超出制度阈值,且未补充例外说明。") + else: + message += " 已识别到例外说明,请审批人重点复核。" + flags.append( + { + "source": "submission_review", + "severity": severity, + "label": label, + "message": message, + "rule_code": policy.rule_code, + } + ) + + for scene_code, total_amount in scene_totals.items(): + policy = catalog.get_scene_policy(scene_code) + if policy is None or policy.claim_amount_limit is None or total_amount <= Decimal("0.00"): + continue + exceeded = self._evaluate_amount_limit( + amount=total_amount, + limit_config=policy.claim_amount_limit, + reason_text=reason_corpus, + ) + if exceeded is None: + continue + + severity, threshold = exceeded + label = f"{policy.label}合计超标待说明" if severity == "high" else f"{policy.label}合计超标提醒" + message = ( + f"{policy.label}当前合计金额为 {total_amount} 元," + f"已超过制度阈值 {threshold} 元。" + ) + if severity == "high": + message += " 当前未识别到例外说明,请先补充原因。" + blocking_reasons.append(f"{policy.label}合计金额超出制度阈值,且未补充例外说明。") + else: + message += " 已识别到例外说明,请审批人重点复核。" + flags.append( + { + "source": "submission_review", + "severity": severity, + "label": label, + "message": message, + "rule_code": policy.rule_code, + } + ) + + return { + "flags": flags, + "blocking_reasons": list(dict.fromkeys(reason for reason in blocking_reasons if reason)), + } + + @staticmethod + def _evaluate_amount_limit( + *, + 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 = ExpenseClaimService._text_contains_keywords(reason_text, exception_keywords) + + if block_amount is not None and amount > Decimal(block_amount): + return ("medium" if has_exception else "high", Decimal(block_amount)) + if warn_amount is not None and amount > Decimal(warn_amount): + return ("medium", Decimal(warn_amount)) + return None + + def _run_travel_policy_review(self, claim: ExpenseClaim) -> dict[str, list[Any]]: + policy = self._get_expense_rule_catalog().travel_policy + if policy is None: + return {"flags": [], "blocking_reasons": []} + contexts = [ + context + for context in self._build_claim_attachment_contexts(claim) + if self._is_travel_policy_relevant_context(context, policy) + ] + if not contexts: + return {"flags": [], "blocking_reasons": []} + + reason_corpus = self._build_travel_reason_corpus(claim) + has_route_exception = self._text_contains_keywords( + reason_corpus, + policy.route_exception_keywords, + ) + has_standard_exception = self._text_contains_keywords( + reason_corpus, + policy.standard_exception_keywords, + ) + grade_band = self._resolve_travel_policy_band(claim.employee_grade) + band_label = policy.band_labels.get(grade_band or "", str(claim.employee_grade or "").strip() or "当前职级") + + itinerary_segments: list[dict[str, Any]] = [] + itinerary_cities: list[str] = [] + hotel_contexts: list[dict[str, Any]] = [] + flags: list[dict[str, Any]] = [] + blocking_reasons: list[str] = [] + + for context in contexts: + route_segment = self._extract_route_segment(context, policy) + if route_segment and self._is_long_distance_travel_context(context, policy): + itinerary_segments.append( + { + "item": context["item"], + "origin": route_segment[0], + "destination": route_segment[1], + } + ) + itinerary_cities.extend([route_segment[0], route_segment[1]]) + + scene_code = str(context["document_info"].get("scene_code") or "").strip().lower() + document_type = str(context["document_info"].get("document_type") or "").strip().lower() + item_type = str(context["item"].item_type or "").strip().lower() + if "hotel" in {scene_code, document_type, item_type} or document_type == "hotel_invoice": + hotel_contexts.append(context) + + unique_itinerary_cities = list(dict.fromkeys(city for city in itinerary_cities if city)) + expected_destination_city = self._resolve_expected_travel_city( + claim, + contexts, + unique_itinerary_cities, + policy, + ) + + if itinerary_segments: + unique_destinations = list( + dict.fromkeys(segment["destination"] for segment in itinerary_segments if segment["destination"]) + ) + first_origin = str(itinerary_segments[0]["origin"] or "").strip() + last_destination = str(itinerary_segments[-1]["destination"] or "").strip() + + for previous, current in zip(itinerary_segments, itinerary_segments[1:]): + previous_destination = str(previous["destination"] or "").strip() + current_origin = str(current["origin"] or "").strip() + if previous_destination and current_origin and previous_destination != current_origin: + message = ( + f"差旅行程未形成连续链路:上一段到达 {previous_destination}," + f"下一段却从 {current_origin} 出发,请补充中转或改签说明。" + ) + flags.append( + { + "source": "submission_review", + "severity": "high", + "label": "行程闭环异常", + "message": message, + "rule_code": policy.rule_code, + } + ) + blocking_reasons.append("差旅行程未形成连续闭环,请补充中转、改签或异地出发原因。") + break + + if ( + expected_destination_city + and last_destination + and last_destination not in {expected_destination_city, first_origin} + ): + message = ( + f"差旅行程终点识别为 {last_destination}," + f"与申报目的地 {expected_destination_city} 不一致,请补充多地出差或后续行程说明。" + ) + flags.append( + { + "source": "submission_review", + "severity": "high", + "label": "行程终点异常", + "message": message, + "rule_code": policy.rule_code, + } + ) + blocking_reasons.append("差旅行程终点与申报目的地不一致,请补充多地出差说明或补齐后续票据。") + + expected_city_set = { + city + for city in (expected_destination_city, first_origin) + if city + } + extra_destinations = [ + city + for city in unique_destinations + if city and city not in expected_city_set + ] + if extra_destinations and not has_route_exception: + destinations_text = "、".join(extra_destinations[:3]) + flags.append( + { + "source": "submission_review", + "severity": "high", + "label": "多城市行程待说明", + "message": ( + f"检测到本次差旅涉及 {destinations_text} 多个目的地," + "但当前报销事由未说明中转、多地拜访或改签原因。" + ), + "rule_code": policy.rule_code, + } + ) + blocking_reasons.append("检测到多城市差旅行程,但当前未补充中转或多地出差说明。") + + allowed_hotel_cities = { + city + for city in [expected_destination_city, *unique_itinerary_cities] + if city + } + for context in hotel_contexts: + hotel_city = self._extract_hotel_city(context, policy) + if hotel_city and allowed_hotel_cities and hotel_city not in allowed_hotel_cities: + expected_text = "、".join(sorted(allowed_hotel_cities)) + flags.append( + { + "source": "submission_review", + "severity": "high", + "label": "酒店地点异常", + "message": ( + f"酒店票据识别城市为 {hotel_city}," + f"与当前差旅目的地/行程城市 {expected_text} 不一致,请补充异地住宿原因。" + ), + "rule_code": policy.rule_code, + } + ) + blocking_reasons.append("酒店票据地点与差旅目的地不一致,请补充异地住宿原因或更换附件。") + + if grade_band is None: + continue + baseline_city = hotel_city or expected_destination_city standard = self._resolve_travel_policy_hotel_standard( policy=policy, @@ -5310,217 +5627,217 @@ class ExpenseClaimService: f"{band_label} 职级在{standard_label}的住宿标准为 {cap} 元/晚," f"当前酒店识别金额约 {nightly_amount} 元/晚。" ) - item_reason = str(context["item"].item_reason or "").strip() - item_has_exception = self._text_contains_keywords(item_reason, policy.standard_exception_keywords) - if has_standard_exception or item_has_exception: - flags.append( - { - "source": "submission_review", - "severity": "medium", - "label": "住宿超标提醒", - "message": hotel_message + " 已识别到补充说明,请直属领导重点复核。", - "rule_code": policy.rule_code, - } - ) - else: - flags.append( - { - "source": "submission_review", - "severity": "high", - "label": "住宿超标待说明", - "message": hotel_message + " 当前未识别到超标说明,请先补充原因。", - "rule_code": policy.rule_code, - } - ) - blocking_reasons.append("住宿金额超出当前职级差标,且未补充超标说明。") - - if grade_band is not None: - for context in contexts: - transport_class = self._detect_transport_class(context, policy) - if transport_class is None: - continue - - transport_kind, class_label, class_level = transport_class - allowed_level = policy.transport_limits.get(grade_band, {}).get(transport_kind) - if allowed_level is None or class_level <= allowed_level: - continue - - item_reason = str(context["item"].item_reason or "").strip() - item_has_exception = self._text_contains_keywords(item_reason, policy.standard_exception_keywords) - message = f"{band_label} 职级当前默认不可报销 {class_label}。" - if has_standard_exception or item_has_exception: - flags.append( - { - "source": "submission_review", - "severity": "medium", - "label": "交通舱位超标提醒", - "message": message + " 已识别到补充说明,请审批人重点复核。", - "rule_code": policy.rule_code, - } - ) - else: - flags.append( - { - "source": "submission_review", - "severity": "high", - "label": "交通舱位超标待说明", - "message": message + " 当前未识别到例外说明,请先补充原因。", - "rule_code": policy.rule_code, - } - ) - blocking_reasons.append("交通舱位或席别超出当前职级差标,且未补充例外说明。") - - return { - "flags": flags, - "blocking_reasons": list(dict.fromkeys(reason for reason in blocking_reasons if reason)), - } - - def _build_claim_attachment_contexts(self, claim: ExpenseClaim) -> list[dict[str, Any]]: - contexts: list[dict[str, Any]] = [] - ordered_items = sorted( - claim.items, - key=lambda item: ( - item.item_date or date.max, - self._normalize_sort_datetime(item.created_at), - ), - ) - for index, item in enumerate(ordered_items, start=1): - file_path = self._resolve_attachment_path(item.invoice_id) - if file_path is None or not file_path.exists(): - continue - - metadata = self._read_attachment_meta(file_path) - document_info = metadata.get("document_info") - contexts.append( - { - "index": index, - "item": item, - "document_info": document_info if isinstance(document_info, dict) else {}, - "ocr_text": str(metadata.get("ocr_text") or ""), - "ocr_summary": str(metadata.get("ocr_summary") or ""), - } - ) - return contexts - - def _is_travel_policy_relevant_context( - self, - context: dict[str, Any], - policy: RuntimeTravelPolicy, - ) -> bool: - item = context.get("item") - document_info = context.get("document_info") or {} - item_type = str(getattr(item, "item_type", "") or "").strip().lower() - scene_code = str(document_info.get("scene_code") or "").strip().lower() - document_type = str(document_info.get("document_type") or "").strip().lower() - return ( - item_type in set(policy.relevant_expense_types) - or scene_code in set(policy.relevant_expense_types) - or document_type in {"hotel_invoice", *set(policy.long_distance_document_types)} - ) - - @staticmethod - def _resolve_document_field_value(document_info: dict[str, Any], key: str) -> str: - normalized_key = str(key or "").strip().lower() - for field in list(document_info.get("fields") or []): - if not isinstance(field, dict): - continue - field_key = str(field.get("key") or "").strip().lower() - if field_key == normalized_key: - return str(field.get("value") or "").strip() - return "" - - @staticmethod - def _text_contains_keywords(text: str, keywords: tuple[str, ...] | list[str]) -> bool: - compact = re.sub(r"\s+", "", str(text or "")) - if not compact: - return False - return any(keyword in compact for keyword in keywords) - - def _build_travel_reason_corpus(self, claim: ExpenseClaim) -> str: - parts = [str(claim.reason or "").strip(), str(claim.location or "").strip()] - for item in claim.items: - parts.append(str(item.item_reason or "").strip()) - parts.append(str(item.item_location or "").strip()) - return "\n".join(part for part in parts if part) - - @staticmethod - def _resolve_travel_policy_band(grade: str | None) -> str | None: - normalized = str(grade or "").strip().upper() - if not normalized: - return None - - p_match = re.search(r"P(\d+)", normalized) - if p_match: - level = int(p_match.group(1)) - if level <= 3: - return "junior" - if level <= 5: - return "mid" - return "senior" - - m_match = re.search(r"M(\d+)", normalized) - if m_match: - level = int(m_match.group(1)) - if level <= 2: - return "manager" - return "executive" - - if normalized.startswith("D"): - return "executive" - return None - - def _resolve_expected_travel_city( - self, - claim: ExpenseClaim, - contexts: list[dict[str, Any]], - itinerary_cities: list[str], - policy: RuntimeTravelPolicy, - ) -> str: - claim_city = self._extract_city_from_text(str(claim.location or ""), policy) - if claim_city: - return claim_city - - for context in contexts: - hotel_city = self._extract_hotel_city(context, policy) - if hotel_city: - return hotel_city - - if len(itinerary_cities) >= 2 and itinerary_cities[1]: - return itinerary_cities[1] - for city in itinerary_cities: - if city: - return city - return "" - - def _extract_route_segment( - self, - context: dict[str, Any], - policy: RuntimeTravelPolicy, - ) -> tuple[str, str] | None: - document_info = context["document_info"] - route_value = self._resolve_document_field_value(document_info, "route") - if not route_value or "-" not in route_value: - return None - - origin_text, destination_text = [segment.strip() for segment in route_value.split("-", 1)] - origin_city = self._extract_city_from_text(origin_text, policy) - destination_city = self._extract_city_from_text(destination_text, policy) - if not origin_city or not destination_city or origin_city == destination_city: - return None - return origin_city, destination_city - + item_reason = str(context["item"].item_reason or "").strip() + item_has_exception = self._text_contains_keywords(item_reason, policy.standard_exception_keywords) + if has_standard_exception or item_has_exception: + flags.append( + { + "source": "submission_review", + "severity": "medium", + "label": "住宿超标提醒", + "message": hotel_message + " 已识别到补充说明,请直属领导重点复核。", + "rule_code": policy.rule_code, + } + ) + else: + flags.append( + { + "source": "submission_review", + "severity": "high", + "label": "住宿超标待说明", + "message": hotel_message + " 当前未识别到超标说明,请先补充原因。", + "rule_code": policy.rule_code, + } + ) + blocking_reasons.append("住宿金额超出当前职级差标,且未补充超标说明。") + + if grade_band is not None: + for context in contexts: + transport_class = self._detect_transport_class(context, policy) + if transport_class is None: + continue + + transport_kind, class_label, class_level = transport_class + allowed_level = policy.transport_limits.get(grade_band, {}).get(transport_kind) + if allowed_level is None or class_level <= allowed_level: + continue + + item_reason = str(context["item"].item_reason or "").strip() + item_has_exception = self._text_contains_keywords(item_reason, policy.standard_exception_keywords) + message = f"{band_label} 职级当前默认不可报销 {class_label}。" + if has_standard_exception or item_has_exception: + flags.append( + { + "source": "submission_review", + "severity": "medium", + "label": "交通舱位超标提醒", + "message": message + " 已识别到补充说明,请审批人重点复核。", + "rule_code": policy.rule_code, + } + ) + else: + flags.append( + { + "source": "submission_review", + "severity": "high", + "label": "交通舱位超标待说明", + "message": message + " 当前未识别到例外说明,请先补充原因。", + "rule_code": policy.rule_code, + } + ) + blocking_reasons.append("交通舱位或席别超出当前职级差标,且未补充例外说明。") + + return { + "flags": flags, + "blocking_reasons": list(dict.fromkeys(reason for reason in blocking_reasons if reason)), + } + + def _build_claim_attachment_contexts(self, claim: ExpenseClaim) -> list[dict[str, Any]]: + contexts: list[dict[str, Any]] = [] + ordered_items = sorted( + claim.items, + key=lambda item: ( + item.item_date or date.max, + self._normalize_sort_datetime(item.created_at), + ), + ) + for index, item in enumerate(ordered_items, start=1): + file_path = self._resolve_attachment_path(item.invoice_id) + if file_path is None or not file_path.exists(): + continue + + metadata = self._read_attachment_meta(file_path) + document_info = metadata.get("document_info") + contexts.append( + { + "index": index, + "item": item, + "document_info": document_info if isinstance(document_info, dict) else {}, + "ocr_text": str(metadata.get("ocr_text") or ""), + "ocr_summary": str(metadata.get("ocr_summary") or ""), + } + ) + return contexts + + def _is_travel_policy_relevant_context( + self, + context: dict[str, Any], + policy: RuntimeTravelPolicy, + ) -> bool: + item = context.get("item") + document_info = context.get("document_info") or {} + item_type = str(getattr(item, "item_type", "") or "").strip().lower() + scene_code = str(document_info.get("scene_code") or "").strip().lower() + document_type = str(document_info.get("document_type") or "").strip().lower() + return ( + item_type in set(policy.relevant_expense_types) + or scene_code in set(policy.relevant_expense_types) + or document_type in {"hotel_invoice", *set(policy.long_distance_document_types)} + ) + + @staticmethod + def _resolve_document_field_value(document_info: dict[str, Any], key: str) -> str: + normalized_key = str(key or "").strip().lower() + for field in list(document_info.get("fields") or []): + if not isinstance(field, dict): + continue + field_key = str(field.get("key") or "").strip().lower() + if field_key == normalized_key: + return str(field.get("value") or "").strip() + return "" + + @staticmethod + def _text_contains_keywords(text: str, keywords: tuple[str, ...] | list[str]) -> bool: + compact = re.sub(r"\s+", "", str(text or "")) + if not compact: + return False + return any(keyword in compact for keyword in keywords) + + def _build_travel_reason_corpus(self, claim: ExpenseClaim) -> str: + parts = [str(claim.reason or "").strip(), str(claim.location or "").strip()] + for item in claim.items: + parts.append(str(item.item_reason or "").strip()) + parts.append(str(item.item_location or "").strip()) + return "\n".join(part for part in parts if part) + + @staticmethod + def _resolve_travel_policy_band(grade: str | None) -> str | None: + normalized = str(grade or "").strip().upper() + if not normalized: + return None + + p_match = re.search(r"P(\d+)", normalized) + if p_match: + level = int(p_match.group(1)) + if level <= 3: + return "junior" + if level <= 5: + return "mid" + return "senior" + + m_match = re.search(r"M(\d+)", normalized) + if m_match: + level = int(m_match.group(1)) + if level <= 2: + return "manager" + return "executive" + + if normalized.startswith("D"): + return "executive" + return None + + def _resolve_expected_travel_city( + self, + claim: ExpenseClaim, + contexts: list[dict[str, Any]], + itinerary_cities: list[str], + policy: RuntimeTravelPolicy, + ) -> str: + claim_city = self._extract_city_from_text(str(claim.location or ""), policy) + if claim_city: + return claim_city + + for context in contexts: + hotel_city = self._extract_hotel_city(context, policy) + if hotel_city: + return hotel_city + + if len(itinerary_cities) >= 2 and itinerary_cities[1]: + return itinerary_cities[1] + for city in itinerary_cities: + if city: + return city + return "" + + def _extract_route_segment( + self, + context: dict[str, Any], + policy: RuntimeTravelPolicy, + ) -> tuple[str, str] | None: + document_info = context["document_info"] + route_value = self._resolve_document_field_value(document_info, "route") + if not route_value or "-" not in route_value: + return None + + origin_text, destination_text = [segment.strip() for segment in route_value.split("-", 1)] + origin_city = self._extract_city_from_text(origin_text, policy) + destination_city = self._extract_city_from_text(destination_text, policy) + if not origin_city or not destination_city or origin_city == destination_city: + return None + return origin_city, destination_city + def _extract_hotel_city(self, context: dict[str, Any], policy: RuntimeTravelPolicy) -> str: document_info = context["document_info"] item = context["item"] - merchant_name = self._resolve_document_field_value(document_info, "merchant_name") - for candidate in ( - merchant_name, - str(item.item_location or ""), - str(context.get("ocr_summary") or ""), - str(context.get("ocr_text") or ""), - ): - city = self._extract_city_from_text(candidate, policy) - if city: + merchant_name = self._resolve_document_field_value(document_info, "merchant_name") + for candidate in ( + merchant_name, + str(item.item_location or ""), + str(context.get("ocr_summary") or ""), + str(context.get("ocr_text") or ""), + ): + city = self._extract_city_from_text(candidate, policy) + if city: return city return "" @@ -5566,71 +5883,71 @@ class ExpenseClaimService: for city in city_match_order: if city in normalized: return city - return "" - - @staticmethod - def _extract_hotel_night_count(context: dict[str, Any]) -> int: - text = " ".join( - [ - str(context.get("ocr_summary") or "").strip(), - str(context.get("ocr_text") or "").strip(), - ] - ).strip() - match = TRAVEL_POLICY_HOTEL_NIGHT_PATTERN.search(text) - if not match: - return 1 - try: - return max(1, int(match.group(1))) - except (TypeError, ValueError): - return 1 - - def _detect_transport_class( - self, - context: dict[str, Any], - policy: RuntimeTravelPolicy, - ) -> tuple[str, str, int] | None: - document_info = context["document_info"] - document_type = str(document_info.get("document_type") or "").strip().lower() - text = " ".join( - [ - str(context.get("ocr_summary") or "").strip(), - str(context.get("ocr_text") or "").strip(), - ] - ).strip() - compact_text = re.sub(r"\s+", "", text) - if not compact_text: - return None - - if document_type == "flight_itinerary": - for config in policy.flight_classes: - label = str(config.keyword or "").strip() - level = int(config.level) - if label in compact_text: - return "flight", label, level - return None - - if document_type == "train_ticket": - for config in policy.train_classes: - label = str(config.keyword or "").strip() - level = int(config.level) - if label in compact_text: - return "train", label, level - return None - - return None - - def _is_long_distance_travel_context( - self, - context: dict[str, Any], - policy: RuntimeTravelPolicy, - ) -> bool: - document_info = context["document_info"] - document_type = str(document_info.get("document_type") or "").strip().lower() - scene_code = str(document_info.get("scene_code") or "").strip().lower() - if document_type in set(policy.long_distance_document_types): - return True - return scene_code == "travel" - + return "" + + @staticmethod + def _extract_hotel_night_count(context: dict[str, Any]) -> int: + text = " ".join( + [ + str(context.get("ocr_summary") or "").strip(), + str(context.get("ocr_text") or "").strip(), + ] + ).strip() + match = TRAVEL_POLICY_HOTEL_NIGHT_PATTERN.search(text) + if not match: + return 1 + try: + return max(1, int(match.group(1))) + except (TypeError, ValueError): + return 1 + + def _detect_transport_class( + self, + context: dict[str, Any], + policy: RuntimeTravelPolicy, + ) -> tuple[str, str, int] | None: + document_info = context["document_info"] + document_type = str(document_info.get("document_type") or "").strip().lower() + text = " ".join( + [ + str(context.get("ocr_summary") or "").strip(), + str(context.get("ocr_text") or "").strip(), + ] + ).strip() + compact_text = re.sub(r"\s+", "", text) + if not compact_text: + return None + + if document_type == "flight_itinerary": + for config in policy.flight_classes: + label = str(config.keyword or "").strip() + level = int(config.level) + if label in compact_text: + return "flight", label, level + return None + + if document_type == "train_ticket": + for config in policy.train_classes: + label = str(config.keyword or "").strip() + level = int(config.level) + if label in compact_text: + return "train", label, level + return None + + return None + + def _is_long_distance_travel_context( + self, + context: dict[str, Any], + policy: RuntimeTravelPolicy, + ) -> bool: + document_info = context["document_info"] + document_type = str(document_info.get("document_type") or "").strip().lower() + scene_code = str(document_info.get("scene_code") or "").strip().lower() + if document_type in set(policy.long_distance_document_types): + return True + return scene_code == "travel" + def _sync_travel_allowance_item(self, claim: ExpenseClaim) -> None: items = list(claim.items or []) allowance_items = [ @@ -5668,9 +5985,9 @@ class ExpenseClaimService: return try: - from app.services.travel_reimbursement_calculator import ( - TravelReimbursementCalculatorService, - ) + from app.services.travel_reimbursement_calculator import ( + TravelReimbursementCalculatorService, + ) result = TravelReimbursementCalculatorService(self.db).calculate( TravelReimbursementCalculatorRequest( @@ -5800,27 +6117,27 @@ class ExpenseClaimService: if not claim.items: claim.amount = Decimal("0.00") claim.invoice_count = 0 - claim.risk_flags_json = self._merge_claim_attachment_risk_flags(claim, []) - return - - ordered_items = sorted( - claim.items, - key=lambda item: ( - item.item_date or date.max, - self._normalize_sort_datetime(item.created_at), - ), - ) - primary_item = ordered_items[0] - total_amount = sum((item.item_amount for item in ordered_items), Decimal("0.00")) - - claim.amount = total_amount.quantize(Decimal("0.01")) - claim.invoice_count = sum(1 for item in ordered_items if str(item.invoice_id or "").strip()) - claim.occurred_at = datetime( - primary_item.item_date.year, - primary_item.item_date.month, - primary_item.item_date.day, - tzinfo=UTC, - ) + claim.risk_flags_json = self._merge_claim_attachment_risk_flags(claim, []) + return + + ordered_items = sorted( + claim.items, + key=lambda item: ( + item.item_date or date.max, + self._normalize_sort_datetime(item.created_at), + ), + ) + primary_item = ordered_items[0] + total_amount = sum((item.item_amount for item in ordered_items), Decimal("0.00")) + + claim.amount = total_amount.quantize(Decimal("0.01")) + claim.invoice_count = sum(1 for item in ordered_items if str(item.invoice_id or "").strip()) + claim.occurred_at = datetime( + primary_item.item_date.year, + primary_item.item_date.month, + primary_item.item_date.day, + tzinfo=UTC, + ) claim.expense_type = self._resolve_claim_expense_type_from_items( ordered_items, fallback=str(primary_item.item_type or claim.expense_type or "other").strip() or "other", @@ -5831,14 +6148,14 @@ class ExpenseClaimService: self._normalize_optional_text(primary_item.item_reason, fallback=claim.reason or "待补充") or "待补充" ) - claim.location = ( - self._normalize_optional_text(primary_item.item_location, fallback=claim.location or "待补充") - or "待补充" - ) - claim.risk_flags_json = self._merge_claim_attachment_risk_flags( - claim, - self._build_claim_attachment_risk_flags(ordered_items), - ) + claim.location = ( + self._normalize_optional_text(primary_item.item_location, fallback=claim.location or "待补充") + or "待补充" + ) + claim.risk_flags_json = self._merge_claim_attachment_risk_flags( + claim, + self._build_claim_attachment_risk_flags(ordered_items), + ) if str(claim.status or "").strip().lower() == "draft": claim.approval_stage = "待提交" @@ -5853,51 +6170,51 @@ class ExpenseClaimService: if item_types & (TRAVEL_ALLOWANCE_TRIGGER_ITEM_TYPES | {"travel_allowance"}): return "travel" return fallback_type - - def _refresh_item_attachment_analysis(self, item: ExpenseClaimItem) -> None: - file_path = self._resolve_attachment_path(item.invoice_id) - if file_path is None or not file_path.exists(): - return - - metadata = self._read_attachment_meta(file_path) - media_type = str(metadata.get("media_type") or self._resolve_attachment_media_type(file_path.name)).strip() - ocr_status = str(metadata.get("ocr_status") or "").strip().lower() - - if ocr_status == "failed": - analysis = self._build_failed_ocr_attachment_analysis( - media_type=media_type, - error_message=str(metadata.get("ocr_error") or ""), - item=item, - ) - elif ocr_status == "recognized" or any( - ( - str(metadata.get("ocr_text") or "").strip(), - str(metadata.get("ocr_summary") or "").strip(), - int(metadata.get("ocr_line_count") or 0), - list(metadata.get("ocr_warnings") or []), - ) - ): - stored_document_info = metadata.get("document_info") - if not isinstance(stored_document_info, dict): - stored_document_info = {} - document = SimpleNamespace( - filename=str(metadata.get("file_name") or file_path.name), - text=str(metadata.get("ocr_text") or ""), - summary=str(metadata.get("ocr_summary") or ""), - avg_score=float(metadata.get("ocr_avg_score") or 0.0), - line_count=int(metadata.get("ocr_line_count") or 0), - document_type=str(stored_document_info.get("document_type") or ""), - document_type_label=str(stored_document_info.get("document_type_label") or ""), - scene_code=str(stored_document_info.get("scene_code") or ""), - scene_label=str(stored_document_info.get("scene_label") or ""), - document_fields=list(stored_document_info.get("fields") or []), - warnings=[str(value) for value in list(metadata.get("ocr_warnings") or []) if str(value).strip()], - ) - document_info = self._build_attachment_document_info(document) - requirement_check = self._build_attachment_requirement_check( - item=item, - document_info=document_info, - ) + + def _refresh_item_attachment_analysis(self, item: ExpenseClaimItem) -> None: + file_path = self._resolve_attachment_path(item.invoice_id) + if file_path is None or not file_path.exists(): + return + + metadata = self._read_attachment_meta(file_path) + media_type = str(metadata.get("media_type") or self._resolve_attachment_media_type(file_path.name)).strip() + ocr_status = str(metadata.get("ocr_status") or "").strip().lower() + + if ocr_status == "failed": + analysis = self._build_failed_ocr_attachment_analysis( + media_type=media_type, + error_message=str(metadata.get("ocr_error") or ""), + item=item, + ) + elif ocr_status == "recognized" or any( + ( + str(metadata.get("ocr_text") or "").strip(), + str(metadata.get("ocr_summary") or "").strip(), + int(metadata.get("ocr_line_count") or 0), + list(metadata.get("ocr_warnings") or []), + ) + ): + stored_document_info = metadata.get("document_info") + if not isinstance(stored_document_info, dict): + stored_document_info = {} + document = SimpleNamespace( + filename=str(metadata.get("file_name") or file_path.name), + text=str(metadata.get("ocr_text") or ""), + summary=str(metadata.get("ocr_summary") or ""), + avg_score=float(metadata.get("ocr_avg_score") or 0.0), + line_count=int(metadata.get("ocr_line_count") or 0), + document_type=str(stored_document_info.get("document_type") or ""), + document_type_label=str(stored_document_info.get("document_type_label") or ""), + scene_code=str(stored_document_info.get("scene_code") or ""), + scene_label=str(stored_document_info.get("scene_label") or ""), + document_fields=list(stored_document_info.get("fields") or []), + warnings=[str(value) for value in list(metadata.get("ocr_warnings") or []) if str(value).strip()], + ) + document_info = self._build_attachment_document_info(document) + requirement_check = self._build_attachment_requirement_check( + item=item, + document_info=document_info, + ) analysis = self._build_attachment_analysis( document=document, item=item, @@ -5905,29 +6222,29 @@ class ExpenseClaimService: document_info=document_info, requirement_check=requirement_check, ) - metadata["document_info"] = document_info - metadata["requirement_check"] = requirement_check - else: - analysis = self._build_fallback_attachment_analysis(media_type=media_type, item=item) - - metadata["analysis"] = analysis - self._write_attachment_meta(file_path, metadata) - + metadata["document_info"] = document_info + metadata["requirement_check"] = requirement_check + else: + analysis = self._build_fallback_attachment_analysis(media_type=media_type, item=item) + + metadata["analysis"] = analysis + self._write_attachment_meta(file_path, metadata) + def _build_claim_attachment_risk_flags( self, ordered_items: list[ExpenseClaimItem] ) -> list[dict[str, Any]]: derived_flags: list[dict[str, Any]] = [] for index, item in enumerate(ordered_items, start=1): - file_path = self._resolve_attachment_path(item.invoice_id) - if file_path is None or not file_path.exists(): - continue - - metadata = self._read_attachment_meta(file_path) - analysis = metadata.get("analysis") - if not isinstance(analysis, dict): - continue - - severity = str(analysis.get("severity") or "").strip().lower() + file_path = self._resolve_attachment_path(item.invoice_id) + if file_path is None or not file_path.exists(): + continue + + metadata = self._read_attachment_meta(file_path) + analysis = metadata.get("analysis") + if not isinstance(analysis, dict): + continue + + severity = str(analysis.get("severity") or "").strip().lower() if severity in {"", "pass", "low"}: continue @@ -5956,45 +6273,45 @@ class ExpenseClaimService: } ) return derived_flags - - def _get_expense_rule_catalog(self) -> Any: - cached = getattr(self, "_expense_rule_catalog", None) - if cached is not None: - return cached - - db = getattr(self, "db", None) - if db is None: - catalog = build_default_expense_rule_catalog() - else: - catalog = ExpenseRuleRuntimeService(db).load_catalog() - setattr(self, "_expense_rule_catalog", catalog) - return catalog - - def _get_expense_scene_policy(self, expense_type: str | None) -> Any | None: - return self._get_expense_rule_catalog().get_scene_policy(expense_type) - - def _resolve_min_attachment_count(self, expense_type: str | None) -> int: - policy = self._get_expense_scene_policy(expense_type) - if policy is None: - return 1 - return max(0, int(policy.min_attachment_count or 0)) - - def _build_scene_reason_corpus(self, claim: ExpenseClaim) -> str: - parts = [str(claim.reason or "").strip(), str(claim.location or "").strip()] - for item in claim.items: - parts.append(str(item.item_reason or "").strip()) - parts.append(str(item.item_location or "").strip()) - return "\n".join(part for part in parts if part) - + + def _get_expense_rule_catalog(self) -> Any: + cached = getattr(self, "_expense_rule_catalog", None) + if cached is not None: + return cached + + db = getattr(self, "db", None) + if db is None: + catalog = build_default_expense_rule_catalog() + else: + catalog = ExpenseRuleRuntimeService(db).load_catalog() + setattr(self, "_expense_rule_catalog", catalog) + return catalog + + def _get_expense_scene_policy(self, expense_type: str | None) -> Any | None: + return self._get_expense_rule_catalog().get_scene_policy(expense_type) + + def _resolve_min_attachment_count(self, expense_type: str | None) -> int: + policy = self._get_expense_scene_policy(expense_type) + if policy is None: + return 1 + return max(0, int(policy.min_attachment_count or 0)) + + def _build_scene_reason_corpus(self, claim: ExpenseClaim) -> str: + parts = [str(claim.reason or "").strip(), str(claim.location or "").strip()] + for item in claim.items: + parts.append(str(item.item_reason or "").strip()) + parts.append(str(item.item_location or "").strip()) + return "\n".join(part for part in parts if part) + @staticmethod def _merge_claim_attachment_risk_flags( claim: ExpenseClaim, attachment_risk_flags: list[dict[str, Any]], ) -> list[Any]: - preserved_flags = [ - flag - for flag in list(claim.risk_flags_json or []) - if not (isinstance(flag, dict) and str(flag.get("source") or "").strip() == "attachment_analysis") + preserved_flags = [ + flag + for flag in list(claim.risk_flags_json or []) + if not (isinstance(flag, dict) and str(flag.get("source") or "").strip() == "attachment_analysis") ] return preserved_flags + attachment_risk_flags @@ -6010,61 +6327,61 @@ class ExpenseClaimService: def _validate_claim_for_submission(self, claim: ExpenseClaim) -> list[str]: issues: list[str] = [] - claim_location_required = self._is_location_required_expense_type(claim.expense_type) - claim_min_attachment_count = self._resolve_min_attachment_count(claim.expense_type) - - if self._is_missing_value(claim.employee_name): - issues.append("申请人未完善") - if self._is_missing_value(claim.department_name): - issues.append("所属部门未完善") - if self._is_missing_value(claim.expense_type): - issues.append("报销类型未完善") - if self._is_missing_value(claim.reason): - issues.append("报销事由未完善") - if claim_location_required and self._is_missing_value(claim.location): - issues.append("业务地点未完善") - if claim.amount is None or claim.amount <= Decimal("0.00"): - issues.append("报销金额未完善") - if claim.occurred_at is None: - issues.append("发生时间未完善") - if int(claim.invoice_count or 0) < claim_min_attachment_count: - issues.append("票据附件数量不足") - if not claim.items: - issues.append("费用明细不能为空") - + claim_location_required = self._is_location_required_expense_type(claim.expense_type) + claim_min_attachment_count = self._resolve_min_attachment_count(claim.expense_type) + + if self._is_missing_value(claim.employee_name): + issues.append("申请人未完善") + if self._is_missing_value(claim.department_name): + issues.append("所属部门未完善") + if self._is_missing_value(claim.expense_type): + issues.append("报销类型未完善") + if self._is_missing_value(claim.reason): + issues.append("报销事由未完善") + if claim_location_required and self._is_missing_value(claim.location): + issues.append("业务地点未完善") + if claim.amount is None or claim.amount <= Decimal("0.00"): + issues.append("报销金额未完善") + if claim.occurred_at is None: + issues.append("发生时间未完善") + if int(claim.invoice_count or 0) < claim_min_attachment_count: + issues.append("票据附件数量不足") + if not claim.items: + issues.append("费用明细不能为空") + for index, item in enumerate(claim.items, start=1): prefix = f"费用明细第 {index} 条" is_system_generated = str(item.item_type or "").strip().lower() in SYSTEM_GENERATED_ITEM_TYPES item_location_required = self._is_location_required_expense_type(item.item_type or claim.expense_type) if item.item_date is None: issues.append(f"{prefix}缺少日期") - if self._is_missing_value(item.item_type): - issues.append(f"{prefix}缺少费用项目") - if self._is_missing_value(item.item_reason): - issues.append(f"{prefix}缺少说明") - if item_location_required and self._is_missing_value(item.item_location): - issues.append(f"{prefix}缺少地点") + if self._is_missing_value(item.item_type): + issues.append(f"{prefix}缺少费用项目") + if self._is_missing_value(item.item_reason): + issues.append(f"{prefix}缺少说明") + if item_location_required and self._is_missing_value(item.item_location): + issues.append(f"{prefix}缺少地点") if item.item_amount is None or item.item_amount <= Decimal("0.00"): issues.append(f"{prefix}缺少金额") if not is_system_generated and self._is_missing_value(item.invoice_id): issues.append(f"{prefix}缺少票据标识") - - return issues - - def _is_location_required_expense_type(self, expense_type: str | None) -> bool: - policy = self._get_expense_scene_policy(expense_type) - if policy is None: - return str(expense_type or "").strip().lower() in LOCATION_REQUIRED_EXPENSE_TYPES - return bool(policy.location_required) - + + return issues + + def _is_location_required_expense_type(self, expense_type: str | None) -> bool: + policy = self._get_expense_scene_policy(expense_type) + if policy is None: + return str(expense_type or "").strip().lower() in LOCATION_REQUIRED_EXPENSE_TYPES + return bool(policy.location_required) + @staticmethod def _has_privileged_claim_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() + for item in current_user.role_codes + if str(item).strip() } return bool(role_codes & PRIVILEGED_CLAIM_ROLE_CODES) @@ -6150,11 +6467,11 @@ class ExpenseClaimService: @staticmethod def _normalize_role_codes(current_user: CurrentUserContext) -> set[str]: return { - str(item).strip().lower() - for item in current_user.role_codes - if str(item).strip() - } - + str(item).strip().lower() + for item in current_user.role_codes + if str(item).strip() + } + def _resolve_current_employee(self, current_user: CurrentUserContext) -> Employee | None: return self._resolve_employee_by_identity_candidates( [ @@ -6327,34 +6644,34 @@ class ExpenseClaimService: normalized_name = str(employee.name or "").strip() if not normalized_name: return False - - same_name_count = int( - self.db.scalar( - select(func.count()).select_from(Employee).where(Employee.name == normalized_name) - ) - or 0 - ) - return same_name_count == 1 - + + same_name_count = int( + self.db.scalar( + select(func.count()).select_from(Employee).where(Employee.name == normalized_name) + ) + or 0 + ) + return same_name_count == 1 + def _build_personal_claim_conditions(self, current_user: CurrentUserContext) -> list[Any]: conditions = [] username = str(current_user.username or "").strip() employee = self._resolve_current_employee(current_user) - - def add_condition(field_name: str, value: str | None) -> None: - normalized = str(value or "").strip() - if not normalized: - return - if field_name == "employee_id": - conditions.append(ExpenseClaim.employee_id == normalized) - return - conditions.append(ExpenseClaim.employee_name == normalized) - - if employee is not None: - add_condition("employee_id", employee.id) - add_condition("employee_name", employee.email) - if self._employee_name_is_unique(employee): - add_condition("employee_name", employee.name) + + def add_condition(field_name: str, value: str | None) -> None: + normalized = str(value or "").strip() + if not normalized: + return + if field_name == "employee_id": + conditions.append(ExpenseClaim.employee_id == normalized) + return + conditions.append(ExpenseClaim.employee_name == normalized) + + if employee is not None: + add_condition("employee_id", employee.id) + add_condition("employee_name", employee.email) + if self._employee_name_is_unique(employee): + add_condition("employee_name", employee.name) else: add_condition("employee_id", username) add_condition("employee_name", username) @@ -6431,6 +6748,6 @@ class ExpenseClaimService: conditions.extend(self._build_approval_claim_conditions(current_user)) return stmt.where(or_(*conditions)) - - def _ensure_ready(self) -> None: - AgentFoundationService(self.db).ensure_foundation_ready() + + def _ensure_ready(self) -> None: + AgentFoundationService(self.db).ensure_foundation_ready() diff --git a/server/src/app/services/user_agent.py b/server/src/app/services/user_agent.py index 88c1276..56cc515 100644 --- a/server/src/app/services/user_agent.py +++ b/server/src/app/services/user_agent.py @@ -3354,23 +3354,23 @@ class UserAgentService: location = slots.get("location") customer = slots.get("customer_name") - summary = "我先根据您当前提供的信息整理出一笔报销。" + summary = "我先根据您当前提供的信息整理出一笔报销:" if expense_type and expense_type.value: - summary = f"识别到您希望报销一笔“{expense_type.value}”费用。" + summary = f"识别到您希望报销一笔“{expense_type.value}”费用:" details: list[str] = [] if customer and customer.value: - details.append(f"客户为 {customer.value}") + details.append(f"客户:{customer.value}") if time_range and time_range.value: - details.append(f"时间为 {time_range.value}") + details.append(f"时间:{time_range.value}") if location and location.value: - details.append(f"地点为 {location.value}") + details.append(f"地点:{location.value}") if amount and amount.value: - details.append(f"金额为 {amount.value}") + details.append(f"金额:{amount.value}") reason = slots.get("reason") if reason and reason.value: - details.append(f"事由是 {reason.value}") + details.append(f"事由:{reason.value}") if details: - return f"{summary} {','.join(details)}。" + return "\n\n".join([summary, "基础信息识别结果:", "\n".join(details)]) return summary def _build_review_body_answer( @@ -3399,6 +3399,11 @@ class UserAgentService: slot_cards=review_payload.slot_cards, claim_groups=review_payload.claim_groups, ) + if payload.tool_payload.get("duplicate_attachment_blocked") or payload.tool_payload.get("duplicate_invoice_blocked"): + return ( + str(payload.tool_payload.get("message") or "").strip() + or "检测到本次上传票据与当前单据已有票据重复,请重新上传不同的票据后再归集。" + ) if review_action == "save_draft": if draft_payload is not None and draft_payload.claim_no: return ( @@ -3441,7 +3446,7 @@ class UserAgentService: ) return str(payload.tool_payload.get("message") or "").strip() or "当前报销单暂时还不能提交审批。" return ( - f"{self._build_review_intent_summary(payload, slot_cards=review_payload.slot_cards, claim_groups=review_payload.claim_groups)} " + f"{self._build_review_intent_summary(payload, slot_cards=review_payload.slot_cards, claim_groups=review_payload.claim_groups)}\n\n" "当前关键信息已基本齐全,您确认无误后可以继续下一步。" ) return review_payload.body_message or None @@ -3497,7 +3502,7 @@ class UserAgentService: expense_type_slot = next((item for item in slot_cards if item.key == "expense_type"), None) if expense_type_slot is not None and not str(expense_type_slot.value or "").strip(): return ( - f"{self._build_review_intent_summary(payload, slot_cards=slot_cards, claim_groups=[])} " + f"{self._build_review_intent_summary(payload, slot_cards=slot_cards, claim_groups=[])}\n\n" "我已经先保留了当前识别出的时间、地点和事由,但还不能确定这张单据应该走哪类报销流程。" "请先点击“选择报销类型”,在差旅费、交通费、住宿费等选项中选定;" "选定后,后续上传的票据都会作为这张单据的补充继续核对,不会重新改判报销类型。" @@ -3616,17 +3621,17 @@ class UserAgentService: [ "报销测算参考:", "", + ( + f"职级 {calculation.grade},目的地 {destination},匹配城市 {calculation.matched_city};" + "补齐交通、酒店等票据后,我会按真实票据金额和规则中心标准重新复核。" + ), + "", "| 项目 | 测算口径 | 金额 |", "| --- | --- | ---: |", f"| 交通票据 | {ticket_basis} | {self._format_decimal_money(ticket_amount)} 元 |", f"| 住宿标准 | {self._format_decimal_money(calculation.hotel_rate)} 元/天 × {calculation.days} 天 | {self._format_decimal_money(calculation.hotel_amount)} 元 |", f"| 出差补贴 | {self._format_decimal_money(calculation.total_allowance_rate)} 元/天 × {calculation.days} 天 | {self._format_decimal_money(calculation.allowance_amount)} 元 |", f"| 参考合计 | 交通票据 + 住宿标准 + 出差补贴 | {self._format_decimal_money(total_amount)} 元 |", - "", - ( - f"测算依据:职级 {calculation.grade},目的地 {destination},匹配城市 {calculation.matched_city};" - "补齐交通、酒店等票据后,我会按真实票据金额和规则中心标准重新复核。" - ), ] ) @@ -3850,7 +3855,6 @@ class UserAgentService: *, mention_save_draft: bool, ) -> str: - missing_count = len(review_payload.missing_slots) reminder_count = len(review_payload.risk_briefs) if review_payload.can_proceed: @@ -3861,18 +3865,7 @@ class UserAgentService: ) return "当前关键信息已基本齐全,您确认无误后可以继续下一步。" - issue_parts: list[str] = [] - if missing_count: - issue_parts.append(f"{missing_count} 项信息待补充") - if reminder_count: - issue_parts.append(f"{reminder_count} 条提醒") - issue_summary = "、".join(issue_parts) if issue_parts else "一些细节还需要进一步确认" - - suffix = ";如果想先暂存,也可以点击对话文字中的“草稿”。" if mention_save_draft else "。" - return ( - f"当前还有 {issue_summary}。" - f"请核查对话中的文字说明{suffix}" - ) + return "" @staticmethod def _can_proceed_review( diff --git a/server/storage/expense_claims/5544b2a0-a6f5-4ef8-b5b6-c1ac1b03772f/07085673-a7df-4622-abb7-12f6552c780d/酒店2.jpg b/server/storage/expense_claims/5544b2a0-a6f5-4ef8-b5b6-c1ac1b03772f/07085673-a7df-4622-abb7-12f6552c780d/酒店2.jpg new file mode 100644 index 0000000..a061a93 Binary files /dev/null and b/server/storage/expense_claims/5544b2a0-a6f5-4ef8-b5b6-c1ac1b03772f/07085673-a7df-4622-abb7-12f6552c780d/酒店2.jpg differ diff --git a/server/storage/expense_claims/5544b2a0-a6f5-4ef8-b5b6-c1ac1b03772f/07085673-a7df-4622-abb7-12f6552c780d/酒店2.jpg.meta.json b/server/storage/expense_claims/5544b2a0-a6f5-4ef8-b5b6-c1ac1b03772f/07085673-a7df-4622-abb7-12f6552c780d/酒店2.jpg.meta.json new file mode 100644 index 0000000..0665583 --- /dev/null +++ b/server/storage/expense_claims/5544b2a0-a6f5-4ef8-b5b6-c1ac1b03772f/07085673-a7df-4622-abb7-12f6552c780d/酒店2.jpg.meta.json @@ -0,0 +1,82 @@ +{ + "file_name": "酒店2.jpg", + "storage_key": "5544b2a0-a6f5-4ef8-b5b6-c1ac1b03772f/07085673-a7df-4622-abb7-12f6552c780d/酒店2.jpg", + "media_type": "image/jpeg", + "size_bytes": 156877, + "uploaded_at": "2026-05-21T14:19:49.450265+00:00", + "previewable": true, + "preview_kind": "image", + "preview_storage_key": "5544b2a0-a6f5-4ef8-b5b6-c1ac1b03772f/07085673-a7df-4622-abb7-12f6552c780d/酒店2.preview.jpg", + "preview_media_type": "image/jpeg", + "preview_file_name": "酒店2.preview.jpg", + "analysis": { + "severity": "pass", + "label": "AI提示符合条件", + "headline": "AI提示:附件符合基础校验条件", + "summary": "已识别到票据类型和关键字段,且符合当前费用场景的附件要求。", + "points": [ + "票据类型:已识别为酒店住宿票据。", + "附件类型要求:当前费用项目为住宿票,已识别为酒店住宿票据。", + "金额字段:已识别到与当前明细接近的金额 2400.00 元。" + ], + "suggestion": "建议继续核对报销分类、费用说明和业务场景是否一致。" + }, + "document_info": { + "document_type": "hotel_invoice", + "document_type_label": "酒店住宿票据", + "scene_code": "hotel", + "scene_label": "住宿票据", + "fields": [ + { + "key": "amount", + "label": "金额", + "value": "2400元" + }, + { + "key": "date", + "label": "日期", + "value": "2026-02-23" + }, + { + "key": "merchant_name", + "label": "商户", + "value": "上海喜来登酒店" + }, + { + "key": "invoice_number", + "label": "票据号码", + "value": "SH-SAMPLE-20260223-003" + } + ] + }, + "requirement_check": { + "matches": true, + "current_expense_type": "hotel_ticket", + "current_expense_type_label": "住宿票", + "allowed_scene_labels": [], + "allowed_document_type_labels": [], + "recognized_scene_code": "hotel", + "recognized_scene_label": "住宿票据", + "recognized_document_type": "hotel_invoice", + "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单号:SH-SAMPLE-20260223-003\n出单期:2026年2月23\n宾客姓名:\n曹笑竹\n房间类型:豪华床房\n入住日期:\n2026年2月20日\n住晚数: 3晚\n离店期: 2026年223日\n付款式: 现/信卡/其他\n日期\n项目\n计费说明\n单价\n数量\n金额\n2026年2月20日\n至\n住宿费\n豪华大床房\n¥800/晚\n3\n¥2400\n2026年2月22日\n额写:贰仟肆佰元整\n合计:¥2400\n温馨提示:如您对以上账单有任何疑问,请在离店后7天内与酒店联系,感谢您的理解与支持。\n酒店联系式:上海喜来登酒店\n地址:上海市浦东新区银城中路88号 电话:021-12345678\n样例票据|仅供系统测试|无效凭证", + "ocr_summary": "上海喜来登酒店(样例);住宿消费明细单;单号:SH-SAMPLE-20260223-003", + "ocr_avg_score": 0.9784442763775587, + "ocr_line_count": 32, + "ocr_classification_source": "rule", + "ocr_classification_confidence": 0.84, + "ocr_classification_evidence": [ + "住宿", + "入住", + "离店", + "酒店" + ], + "ocr_warnings": [] +} \ No newline at end of file diff --git a/server/storage/expense_claims/5544b2a0-a6f5-4ef8-b5b6-c1ac1b03772f/07085673-a7df-4622-abb7-12f6552c780d/酒店2.preview.jpg b/server/storage/expense_claims/5544b2a0-a6f5-4ef8-b5b6-c1ac1b03772f/07085673-a7df-4622-abb7-12f6552c780d/酒店2.preview.jpg new file mode 100644 index 0000000..a061a93 Binary files /dev/null and b/server/storage/expense_claims/5544b2a0-a6f5-4ef8-b5b6-c1ac1b03772f/07085673-a7df-4622-abb7-12f6552c780d/酒店2.preview.jpg differ diff --git a/server/storage/expense_claims/5544b2a0-a6f5-4ef8-b5b6-c1ac1b03772f/ac0a7cc8-7152-41e3-bcce-bd358459a5a8/2月23_上海-武汉.pdf b/server/storage/expense_claims/5544b2a0-a6f5-4ef8-b5b6-c1ac1b03772f/ac0a7cc8-7152-41e3-bcce-bd358459a5a8/2月23_上海-武汉.pdf new file mode 100644 index 0000000..d516ecb Binary files /dev/null and b/server/storage/expense_claims/5544b2a0-a6f5-4ef8-b5b6-c1ac1b03772f/ac0a7cc8-7152-41e3-bcce-bd358459a5a8/2月23_上海-武汉.pdf differ diff --git a/server/storage/expense_claims/5544b2a0-a6f5-4ef8-b5b6-c1ac1b03772f/ac0a7cc8-7152-41e3-bcce-bd358459a5a8/2月23_上海-武汉.pdf.meta.json b/server/storage/expense_claims/5544b2a0-a6f5-4ef8-b5b6-c1ac1b03772f/ac0a7cc8-7152-41e3-bcce-bd358459a5a8/2月23_上海-武汉.pdf.meta.json new file mode 100644 index 0000000..7f4bd97 --- /dev/null +++ b/server/storage/expense_claims/5544b2a0-a6f5-4ef8-b5b6-c1ac1b03772f/ac0a7cc8-7152-41e3-bcce-bd358459a5a8/2月23_上海-武汉.pdf.meta.json @@ -0,0 +1,87 @@ +{ + "file_name": "2月23_上海-武汉.pdf", + "storage_key": "5544b2a0-a6f5-4ef8-b5b6-c1ac1b03772f/ac0a7cc8-7152-41e3-bcce-bd358459a5a8/2月23_上海-武汉.pdf", + "media_type": "application/pdf", + "size_bytes": 24940, + "uploaded_at": "2026-05-21T14:03:40.109269+00:00", + "previewable": true, + "preview_kind": "image", + "preview_storage_key": "5544b2a0-a6f5-4ef8-b5b6-c1ac1b03772f/ac0a7cc8-7152-41e3-bcce-bd358459a5a8/2月23_上海-武汉.preview.png", + "preview_media_type": "image/png", + "preview_file_name": "2月23_上海-武汉.preview.png", + "analysis": { + "severity": "pass", + "label": "AI提示符合条件", + "headline": "AI提示:附件符合基础校验条件", + "summary": "已识别到票据类型和关键字段,且符合当前费用场景的附件要求。", + "points": [ + "票据类型:已识别为火车/高铁票。", + "附件类型要求:当前费用项目为火车票,已识别为火车/高铁票。", + "金额字段:已识别到与当前明细接近的金额 354.00 元。" + ], + "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-02-23 13:54" + }, + { + "key": "merchant_name", + "label": "商户", + "value": "中国铁路" + }, + { + "key": "invoice_number", + "label": "票据号码", + "value": "26319166100006175398" + }, + { + "key": "route", + "label": "行程", + "value": "上海-武汉" + } + ] + }, + "requirement_check": { + "matches": true, + "current_expense_type": "train_ticket", + "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/5544b2a0-a6f5-4ef8-b5b6-c1ac1b03772f/ac0a7cc8-7152-41e3-bcce-bd358459a5a8/2月23_上海-武汉.preview.png b/server/storage/expense_claims/5544b2a0-a6f5-4ef8-b5b6-c1ac1b03772f/ac0a7cc8-7152-41e3-bcce-bd358459a5a8/2月23_上海-武汉.preview.png new file mode 100644 index 0000000..099413e Binary files /dev/null and b/server/storage/expense_claims/5544b2a0-a6f5-4ef8-b5b6-c1ac1b03772f/ac0a7cc8-7152-41e3-bcce-bd358459a5a8/2月23_上海-武汉.preview.png differ diff --git a/server/storage/expense_claims/5544b2a0-a6f5-4ef8-b5b6-c1ac1b03772f/b4143190-f375-4f6b-8836-23eee534c99e/2月20_武汉-上海.pdf b/server/storage/expense_claims/5544b2a0-a6f5-4ef8-b5b6-c1ac1b03772f/b4143190-f375-4f6b-8836-23eee534c99e/2月20_武汉-上海.pdf new file mode 100644 index 0000000..b2207b8 Binary files /dev/null and b/server/storage/expense_claims/5544b2a0-a6f5-4ef8-b5b6-c1ac1b03772f/b4143190-f375-4f6b-8836-23eee534c99e/2月20_武汉-上海.pdf differ diff --git a/server/storage/expense_claims/5544b2a0-a6f5-4ef8-b5b6-c1ac1b03772f/b4143190-f375-4f6b-8836-23eee534c99e/2月20_武汉-上海.pdf.meta.json b/server/storage/expense_claims/5544b2a0-a6f5-4ef8-b5b6-c1ac1b03772f/b4143190-f375-4f6b-8836-23eee534c99e/2月20_武汉-上海.pdf.meta.json new file mode 100644 index 0000000..6b94282 --- /dev/null +++ b/server/storage/expense_claims/5544b2a0-a6f5-4ef8-b5b6-c1ac1b03772f/b4143190-f375-4f6b-8836-23eee534c99e/2月20_武汉-上海.pdf.meta.json @@ -0,0 +1,87 @@ +{ + "file_name": "2月20_武汉-上海.pdf", + "storage_key": "5544b2a0-a6f5-4ef8-b5b6-c1ac1b03772f/b4143190-f375-4f6b-8836-23eee534c99e/2月20_武汉-上海.pdf", + "media_type": "application/pdf", + "size_bytes": 24995, + "uploaded_at": "2026-05-21T14:03:02.982421+00:00", + "previewable": true, + "preview_kind": "image", + "preview_storage_key": "5544b2a0-a6f5-4ef8-b5b6-c1ac1b03772f/b4143190-f375-4f6b-8836-23eee534c99e/2月20_武汉-上海.preview.png", + "preview_media_type": "image/png", + "preview_file_name": "2月20_武汉-上海.preview.png", + "analysis": { + "severity": "pass", + "label": "AI提示符合条件", + "headline": "AI提示:附件符合基础校验条件", + "summary": "已识别到票据类型和关键字段,且符合当前费用场景的附件要求。", + "points": [ + "票据类型:已识别为火车/高铁票。", + "附件类型要求:当前费用项目为火车票,已识别为火车/高铁票。", + "金额字段:已识别到与当前明细接近的金额 354.00 元。" + ], + "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-02-20 07:55" + }, + { + "key": "merchant_name", + "label": "商户", + "value": "中国铁路" + }, + { + "key": "invoice_number", + "label": "票据号码", + "value": "26429165800002785705" + }, + { + "key": "route", + "label": "行程", + "value": "武汉-上海" + } + ] + }, + "requirement_check": { + "matches": true, + "current_expense_type": "train_ticket", + "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/5544b2a0-a6f5-4ef8-b5b6-c1ac1b03772f/b4143190-f375-4f6b-8836-23eee534c99e/2月20_武汉-上海.preview.png b/server/storage/expense_claims/5544b2a0-a6f5-4ef8-b5b6-c1ac1b03772f/b4143190-f375-4f6b-8836-23eee534c99e/2月20_武汉-上海.preview.png new file mode 100644 index 0000000..0bdfb91 Binary files /dev/null and b/server/storage/expense_claims/5544b2a0-a6f5-4ef8-b5b6-c1ac1b03772f/b4143190-f375-4f6b-8836-23eee534c99e/2月20_武汉-上海.preview.png differ diff --git a/server/storage/expense_claims/b00cb2a5-0af3-4a49-9f7a-1f79d0ab873a/ab4d8fae-f59d-460d-94a8-eaf644c83591/2月20_武汉-上海.pdf b/server/storage/expense_claims/b00cb2a5-0af3-4a49-9f7a-1f79d0ab873a/ab4d8fae-f59d-460d-94a8-eaf644c83591/2月20_武汉-上海.pdf new file mode 100644 index 0000000..b2207b8 Binary files /dev/null and b/server/storage/expense_claims/b00cb2a5-0af3-4a49-9f7a-1f79d0ab873a/ab4d8fae-f59d-460d-94a8-eaf644c83591/2月20_武汉-上海.pdf differ diff --git a/server/storage/expense_claims/b00cb2a5-0af3-4a49-9f7a-1f79d0ab873a/ab4d8fae-f59d-460d-94a8-eaf644c83591/2月20_武汉-上海.pdf.meta.json b/server/storage/expense_claims/b00cb2a5-0af3-4a49-9f7a-1f79d0ab873a/ab4d8fae-f59d-460d-94a8-eaf644c83591/2月20_武汉-上海.pdf.meta.json new file mode 100644 index 0000000..75d33ac --- /dev/null +++ b/server/storage/expense_claims/b00cb2a5-0af3-4a49-9f7a-1f79d0ab873a/ab4d8fae-f59d-460d-94a8-eaf644c83591/2月20_武汉-上海.pdf.meta.json @@ -0,0 +1,88 @@ +{ + "file_name": "2月20_武汉-上海.pdf", + "storage_key": "b00cb2a5-0af3-4a49-9f7a-1f79d0ab873a/ab4d8fae-f59d-460d-94a8-eaf644c83591/2月20_武汉-上海.pdf", + "media_type": "application/pdf", + "size_bytes": 24995, + "uploaded_at": "2026-05-22T00:38:09.743522+00:00", + "previewable": true, + "preview_kind": "image", + "preview_storage_key": "b00cb2a5-0af3-4a49-9f7a-1f79d0ab873a/ab4d8fae-f59d-460d-94a8-eaf644c83591/2月20_武汉-上海.preview.png", + "preview_media_type": "image/png", + "preview_file_name": "2月20_武汉-上海.preview.png", + "analysis": { + "severity": "pass", + "label": "AI提示符合条件", + "headline": "AI提示:附件符合基础校验条件", + "summary": "已识别到票据类型和关键字段,且符合当前费用场景的附件要求。", + "points": [ + "票据类型:已识别为火车/高铁票。", + "附件类型要求:当前费用项目为火车票,已识别为火车/高铁票。", + "金额字段:已识别到与当前明细接近的金额 354.00 元。" + ], + "rule_basis": [], + "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-02-20 07:55" + }, + { + "key": "merchant_name", + "label": "商户", + "value": "中国铁路" + }, + { + "key": "invoice_number", + "label": "票据号码", + "value": "26429165800002785705" + }, + { + "key": "route", + "label": "行程", + "value": "武汉-上海" + } + ] + }, + "requirement_check": { + "matches": true, + "current_expense_type": "train_ticket", + "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/b00cb2a5-0af3-4a49-9f7a-1f79d0ab873a/ab4d8fae-f59d-460d-94a8-eaf644c83591/2月20_武汉-上海.preview.png b/server/storage/expense_claims/b00cb2a5-0af3-4a49-9f7a-1f79d0ab873a/ab4d8fae-f59d-460d-94a8-eaf644c83591/2月20_武汉-上海.preview.png new file mode 100644 index 0000000..0bdfb91 Binary files /dev/null and b/server/storage/expense_claims/b00cb2a5-0af3-4a49-9f7a-1f79d0ab873a/ab4d8fae-f59d-460d-94a8-eaf644c83591/2月20_武汉-上海.preview.png differ diff --git a/server/storage/expense_claims/b00cb2a5-0af3-4a49-9f7a-1f79d0ab873a/b2edd3f3-9efc-44ab-bd3b-60a42f204a60/2月23_上海-武汉.pdf b/server/storage/expense_claims/b00cb2a5-0af3-4a49-9f7a-1f79d0ab873a/b2edd3f3-9efc-44ab-bd3b-60a42f204a60/2月23_上海-武汉.pdf new file mode 100644 index 0000000..d516ecb Binary files /dev/null and b/server/storage/expense_claims/b00cb2a5-0af3-4a49-9f7a-1f79d0ab873a/b2edd3f3-9efc-44ab-bd3b-60a42f204a60/2月23_上海-武汉.pdf differ diff --git a/server/storage/expense_claims/b00cb2a5-0af3-4a49-9f7a-1f79d0ab873a/b2edd3f3-9efc-44ab-bd3b-60a42f204a60/2月23_上海-武汉.pdf.meta.json b/server/storage/expense_claims/b00cb2a5-0af3-4a49-9f7a-1f79d0ab873a/b2edd3f3-9efc-44ab-bd3b-60a42f204a60/2月23_上海-武汉.pdf.meta.json new file mode 100644 index 0000000..33234df --- /dev/null +++ b/server/storage/expense_claims/b00cb2a5-0af3-4a49-9f7a-1f79d0ab873a/b2edd3f3-9efc-44ab-bd3b-60a42f204a60/2月23_上海-武汉.pdf.meta.json @@ -0,0 +1,88 @@ +{ + "file_name": "2月23_上海-武汉.pdf", + "storage_key": "b00cb2a5-0af3-4a49-9f7a-1f79d0ab873a/b2edd3f3-9efc-44ab-bd3b-60a42f204a60/2月23_上海-武汉.pdf", + "media_type": "application/pdf", + "size_bytes": 24940, + "uploaded_at": "2026-05-22T00:38:30.927361+00:00", + "previewable": true, + "preview_kind": "image", + "preview_storage_key": "b00cb2a5-0af3-4a49-9f7a-1f79d0ab873a/b2edd3f3-9efc-44ab-bd3b-60a42f204a60/2月23_上海-武汉.preview.png", + "preview_media_type": "image/png", + "preview_file_name": "2月23_上海-武汉.preview.png", + "analysis": { + "severity": "pass", + "label": "AI提示符合条件", + "headline": "AI提示:附件符合基础校验条件", + "summary": "已识别到票据类型和关键字段,且符合当前费用场景的附件要求。", + "points": [ + "票据类型:已识别为火车/高铁票。", + "附件类型要求:当前费用项目为火车票,已识别为火车/高铁票。", + "金额字段:已识别到与当前明细接近的金额 354.00 元。" + ], + "rule_basis": [], + "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-02-23 13:54" + }, + { + "key": "merchant_name", + "label": "商户", + "value": "中国铁路" + }, + { + "key": "invoice_number", + "label": "票据号码", + "value": "26319166100006175398" + }, + { + "key": "route", + "label": "行程", + "value": "上海-武汉" + } + ] + }, + "requirement_check": { + "matches": true, + "current_expense_type": "train_ticket", + "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/b00cb2a5-0af3-4a49-9f7a-1f79d0ab873a/b2edd3f3-9efc-44ab-bd3b-60a42f204a60/2月23_上海-武汉.preview.png b/server/storage/expense_claims/b00cb2a5-0af3-4a49-9f7a-1f79d0ab873a/b2edd3f3-9efc-44ab-bd3b-60a42f204a60/2月23_上海-武汉.preview.png new file mode 100644 index 0000000..099413e Binary files /dev/null and b/server/storage/expense_claims/b00cb2a5-0af3-4a49-9f7a-1f79d0ab873a/b2edd3f3-9efc-44ab-bd3b-60a42f204a60/2月23_上海-武汉.preview.png differ diff --git a/server/storage/knowledge/.index.json b/server/storage/knowledge/.index.json index 4f7185f..9fce3d0 100644 --- a/server/storage/knowledge/.index.json +++ b/server/storage/knowledge/.index.json @@ -35,13 +35,13 @@ "updated_at": "2026-05-17T13:00:09.485818+00:00", "uploaded_by": "admin", "version_number": 1, - "ingest_status": 4, - "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_3a0b0ecb941b4c8e" + "ingest_status": 3, + "ingest_status_updated_at": "2026-05-21T15:56:58.286585+00:00", + "ingest_completed_at": "2026-05-21T15:56:58.286585+00:00", + "ingest_document_name": "无单需求文档0506.docx", + "ingest_document_updated_at": "2026-05-17T13:00:09.485818+00:00", + "ingest_document_sha256": "00985ec85a8163be9c9ffc5eb522df18ed52d4b131ceed12102c2d75e4df85a9", + "ingest_agent_run_id": "run_9f4f60cf545c470f" } ] } \ No newline at end of file diff --git a/server/storage/knowledge/.lightrag/x_financial_knowledge/graph_chunk_entity_relation.graphml b/server/storage/knowledge/.lightrag/x_financial_knowledge/graph_chunk_entity_relation.graphml index 8735b8b..4c381f3 100644 --- a/server/storage/knowledge/.lightrag/x_financial_knowledge/graph_chunk_entity_relation.graphml +++ b/server/storage/knowledge/.lightrag/x_financial_knowledge/graph_chunk_entity_relation.graphml @@ -1,2692 +1,3925 @@ - - - - - - - - - - - - - - - - - - - 远光软件股份有限公司 - organization - 远光软件股份有限公司is a company that issued the Company Expenditure Management Measures (2024) to regulate expenditure and reimbursement standards.<SEP>Yuan Guang Software Co., Ltd. is a company that has established internal expense reimbursement and management regulations.<SEP>YuanGuang Software Co., Ltd. is the company that issued the expense reimbursement management regulations to optimize business development, standardize expenditure and reimbursement processes, and prevent operational risks. - chunk-aa5435156b829944c173fa1d2d7a93d4<SEP>chunk-18d968b78afe916b419c1b5973421ebe<SEP>chunk-dd87aa5bc62cc9587ecb4c26d35a5263 - /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf - 1779011991 - - - - 第一章总则 - content - Chapter 1 General Provisions contains the purpose, scope, and management principles of the expense reimbursement regulations. - chunk-aa5435156b829944c173fa1d2d7a93d4 - /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf - 1779011991 - - - - 第二条目的 - content - Article 2 Purpose describes the objective of adapting to business development needs, optimizing expenditure and reimbursement standards, and standardizing approval processes. - chunk-aa5435156b829944c173fa1d2d7a93d4 - /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf - 1779011991 - - - - 第二条范围 - content - Article 2 Scope defines the applicable scope of the expense reimbursement regulations. - chunk-aa5435156b829944c173fa1d2d7a93d4 - /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf - 1779011991 - - - - 第三条管理原则 - content - Article 3 Management Principles establishes the principles for managing the expense reimbursement system. - chunk-aa5435156b829944c173fa1d2d7a93d4 - /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf - 1779011991 - - - - 第二章职责分工 - content - Chapter 2 Responsibilities Division outlines the responsibilities of various departments and personnel in the expense management system. - chunk-aa5435156b829944c173fa1d2d7a93d4 - /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf - 1779011991 - - - - 第四条归口管理部门主要职责 - content - Article 4 Main Responsibilities of the Designated Management Department specifies the duties of the designated management department. - chunk-aa5435156b829944c173fa1d2d7a93d4 - /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf - 1779011991 - - - - 计划财务部 - organization - 计划财务部is a department of远光软件股份有限公司with main responsibilities related to financial planning and expenditure management.<SEP>计划财务部负责制定、修订、解释及实施协调工作。<SEP>Planning and Finance Department is a key management department responsible for expense reimbursement duties.<SEP>Planning and Finance Department is one of the departments responsible for financial management and expense approval, determining expenditure scope, standards, methods, and management processes.<SEP>计划财务部is responsible for employee advance funds, travel expenses, transportation, foreign travel, meal allowances, taxes, audits, and financial expenses. - chunk-aa5435156b829944c173fa1d2d7a93d4<SEP>chunk-afc57a0e9548d1f484da6df6c182676b<SEP>chunk-e9438f69c9e221d9f0f00a05ad84eac6<SEP>chunk-18d968b78afe916b419c1b5973421ebe<SEP>chunk-dd87aa5bc62cc9587ecb4c26d35a5263 - /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf - 1779011991 - - - - 第五条计划财务部主要职责 - content - Article 5 Main Responsibilities of Planning and Finance Department outlines the specific duties of the Planning and Finance Department. - chunk-aa5435156b829944c173fa1d2d7a93d4 - /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf - 1779011992 - - - - 第六条经办部门(个人)主要职责 - content - Article 6 Main Responsibilities of Operating Departments (Individuals) describes the duties of operating departments and individuals handling expenses. - chunk-aa5435156b829944c173fa1d2d7a93d4 - /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf - 1779011992 - - - - 第七条各级管理人员主要职责 - content - Article 7 Main Responsibilities of Management Personnel at All Levels specifies the duties of managers at all levels. - chunk-aa5435156b829944c173fa1d2d7a93d4 - /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf - 1779011992 - - - - 第三章支出报销申请与审批 - content - Chapter 3 Expense Reimbursement Application and Approval covers the processes and regulations for expense reimbursement applications and approvals. - chunk-aa5435156b829944c173fa1d2d7a93d4 - /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf - 1779011992 - - - - 第八条支出报销申请 - content - Article 8 Expense Reimbursement Application establishes the procedures for submitting expense reimbursement requests. - chunk-aa5435156b829944c173fa1d2d7a93d4 - /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf - 1779011992 - - - - 第九条支出报销审批 - content - Article 9 Expense Reimbursement Approval defines the approval process for expense reimbursement requests. - chunk-aa5435156b829944c173fa1d2d7a93d4 - /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf - 1779011993 - - - - 第十条支出成本中心归属 - content - Article 10 Cost Center Attribution determines which cost centers expenses should be attributed to. - chunk-aa5435156b829944c173fa1d2d7a93d4 - /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf - 1779011993 - - - - 第四章重点支出管理规定 - content - Chapter 4 Key Expense Management Regulations contains specific management provisions for important types of - chunk-aa5435156b829944c173fa1d2d7a93d4 - /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf - 1779011994 - - - - 第十一条备用金借款 - content - Article 11 Petty Cash Loans provides management regulations for petty cash borrowing. - chunk-aa5435156b829944c173fa1d2d7a93d4 - /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf - 1779011994 - - - - 第十二条市内交通费 - content - Article 12 Local Transportation Fees specifies the regulations for local transportation expense reimbursement. - chunk-aa5435156b829944c173fa1d2d7a93d4 - /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf - 1779011994 - - - - 第十三条差旅费 - content - Article 13 Travel Expenses establishes the management regulations for travel-related expenses. - chunk-aa5435156b829944c173fa1d2d7a93d4 - /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf - 1779011994 - - - - 第十四条业务招待费 - content - Article 14 Business Entertainment Expenses provides management regulations for business entertainment costs. - chunk-aa5435156b829944c173fa1d2d7a93d4 - /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf - 1779011994 - - - - 第五章附则 - content - Chapter 5 Supplementary Provisions contains the final provisions including administration, implementation, and attachments of the regulations. - chunk-aa5435156b829944c173fa1d2d7a93d4 - /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf - 1779011994 - - - - 第二十三条本办法的归口与实施 - content - Article 23 Administration and Implementation designates the department responsible for administration and specifies the effective date of these measures. - chunk-aa5435156b829944c173fa1d2d7a93d4 - /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf - 1779011994 - - - - 第二十四条附件 - content - Article 24 Appendices indicates that supplementary materials and attachments are part of these regulations. - chunk-aa5435156b829944c173fa1d2d7a93d4 - /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf - 1779011995 - - - - 交通工具等级标准 - data - Transportation Level Standards is a data table specifying the permitted transportation modes (airplane, train, ship, other transportation) based on employee rank levels. - chunk-aa5435156b829944c173fa1d2d7a93d4 - /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf - 1779011995 - - - - 出差补贴标准 - data - Travel Allowance Standards is a data table detailing meal allowances, basic travel allowances, and total allowances by region (Hong Kong/Macau/Taiwan, municipalities/special zones/Tibet, other regions, and foreign countries). - chunk-aa5435156b829944c173fa1d2d7a93d4 - /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf - 1779011996 - - - - 经济舱 - data - Economy Class is the permitted airplane class for all employee levels according to transportation standards. - chunk-aa5435156b829944c173fa1d2d7a93d4 - /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf - 1779011996 - - - - 火车硬席 - data - Hard Seat Train is a permitted train transportation mode including hard sleeper, hard seat, high-speed rail second-class, and all soft-seat train second-class soft seats. - chunk-aa5435156b829944c173fa1d2d7a93d4 - /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf - 1779011996 - - - - 三等舱 - data - Third Class Cabin is the permitted ship accommodation class for all employee levels. - chunk-aa5435156b829944c173fa1d2d7a93d4 - /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf - 1779011996 - - - - 凭据报销 - method - Receipt-Based Reimbursement is the method for other transportation expenses (excluding cars), requiring submission of receipts for reimbursement. - chunk-aa5435156b829944c173fa1d2d7a93d4 - /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf - 1779011997 - - - - 餐补 - data - 餐补是指出差人员因工作需要在外出差期间的餐饮费用补贴,根据地区不同分为75元、65元、55元三个标准,但西藏地区标准为140元。组织安排统一安排餐食的情况下不再报销餐补。<SEP>Meal Allowance is a type of travel subsidy that varies by region: 75 for Hong Kong/Macau/Taiwan, 65 for municipalities/special zones/Tibet, 55 for other regions, and 140 for foreign countries. - chunk-aa5435156b829944c173fa1d2d7a93d4<SEP>chunk-d26b288ed4001dc5c504dce0eb841362 - /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf - 1779011997 - - - - 基本补助 - data - Basic Allowance is a standard travel subsidy of 35 regardless of region. - chunk-aa5435156b829944c173fa1d2d7a93d4 - /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf - 1779011997 - - - - 公司支出管理办法 - concept - 公司支出管理办法is a corporate expense management policy document that outlines reimbursement standards, approval authority, and departmental responsibilities for expense management. - chunk-afc57a0e9548d1f484da6df6c182676b - /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf - 1779011997 - - - - 办公室(党委办公室) - organization - 办公室(党委办公室)is a department responsible for party building expenses and official vehicle expenses. - chunk-afc57a0e9548d1f484da6df6c182676b - /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf - 1779011997 - - - - 工会委员会 - organization - 工会委员会is responsible for trade union expenses. - chunk-afc57a0e9548d1f484da6df6c182676b - /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf - 1779011998 - - - - 营销中心 - organization - 营销中心is responsible for bidding business expenses, institutional marketing expenses, customer training, and sales refund expenses. - chunk-afc57a0e9548d1f484da6df6c182676b - /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf - 1779011998 - - - - 品牌及市场运营中心 - organization - 品牌及市场运营中心是对外捐赠支出的归口管理部门,负责审核捐赠申请。<SEP>品牌及市场运营中心is responsible for advertising expenses, business promotion expenses, and external donation expenses. - chunk-afc57a0e9548d1f484da6df6c182676b<SEP>chunk-e9438f69c9e221d9f0f00a05ad84eac6 - /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf - 1779011998 - - - - 组织人事部 - organization - 组织人事部负责职工福利费的年度计划管理,并规定薪酬福利支事的审批程序标准。<SEP>组织人事部是公司负责人事管理的部门,确定调动工作人员的报销标准。<SEP>Personnel Department determines reimbursement standards for assigned personnel working at remote locations.<SEP>组织人事部is responsible for salary and benefits (excluding canteen and meal allowances), external labor, employee insurance, relocation allowances, and other benefits expenses. - chunk-afc57a0e9548d1f484da6df6c182676b<SEP>chunk-e9438f69c9e221d9f0f00a05ad84eac6<SEP>chunk-18d968b78afe916b419c1b5973421ebe<SEP>chunk-d26b288ed4001dc5c504dce0eb841362 - /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf - 1779011999 - - - - 人力资源服务部 - organization - 人力资源服务部is responsible for recruitment business and employee education training expenses. - chunk-afc57a0e9548d1f484da6df6c182676b - /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf - 1779012000 - - - - 产业投资部 - organization - 产业投资部is responsible for equity investment expenses and merger business expenses. - chunk-afc57a0e9548d1f484da6df6c182676b - /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf - 1779012000 - - - - 证券与法律事务部 - organization - 证券与法律事务部is responsible for legal affairs expenses, listing information disclosure expenses, and trademark registration expenses. - chunk-afc57a0e9548d1f484da6df6c182676b - /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf - 1779012000 - - - - 产品规划设计部 - organization - 产品规划设计部is responsible for intellectual property expenses, information technology consulting expenses, and research and development expenses. - chunk-afc57a0e9548d1f484da6df6c182676b - /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf - 1779012000 - - - - DAP研发中心 - organization - DAP研发中心is responsible for testing, evaluation, and analysis expenses paid to external units during research and development. - chunk-afc57a0e9548d1f484da6df6c182676b - /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf - 1779012001 - - - - 信息管理部 - organization - 信息管理部is responsible for IT asset acquisition, leasing, operations, maintenance, repairs, and network usage expenses. - chunk-afc57a0e9548d1f484da6df6c182676b - /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf - 1779012001 - - - - 后勤服务部 - organization - 后勤服务部is responsible for non-IT asset management, canteen expenses, office expenses, and business travel settlement. - chunk-afc57a0e9548d1f484da6df6c182676b - /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf - 1779012001 - - - - 审批权限 - concept - 审批权限refers to the approval authority levels for different management positions regarding expense approvals within their responsibilities. - chunk-afc57a0e9548d1f484da6df6c182676b - /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf - 1779012001 - - - - 报销标准 - concept - 报销标准refers to reimbursement standards including travel expense transportation methods and allowances. - chunk-afc57a0e9548d1f484da6df6c182676b - /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf - 1779012002 - - - - 差旅费 - concept - Travel expenses is a category of expenditure managed under the measures.<SEP>差旅费是指因公出差发生的各项费用,包括交通费、住宿费、餐补等,公司制定了详细的报销规定和注意事项。<SEP>差旅费是指员工因公出差所发生的交通费、住宿费、出差补贴等费用。<SEP>Travel expenses are regulated under the key expense management provisions, with specific standards for business trips.<SEP>差旅费refers to travel expenses including transportation standards and allowances for company leadership. - chunk-afc57a0e9548d1f484da6df6c182676b<SEP>chunk-18d968b78afe916b419c1b5973421ebe<SEP>chunk-dd87aa5bc62cc9587ecb4c26d35a5263<SEP>chunk-d26b288ed4001dc5c504dce0eb841362<SEP>chunk-061324cc36078214691a6fc1cd0aaeea - /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf - 1779012002 - - - - 全资子公司 - organization - 全资子公司is a subsidiary type wholly owned by远光软件股份有限公司, included in the scope of the expenditure management measures.<SEP>全资子公司refers to wholly-owned subsidiaries whose approval authority is managed by parent company personnel. - chunk-afc57a0e9548d1f484da6df6c182676b<SEP>chunk-dd87aa5bc62cc9587ecb4c26d35a5263 - /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf - 1779012003 - - - - 人事归口管理部门 - organization - 人事归口管理部门refers to the centralized HR management department responsible for salary, bonuses, and benefits approval. - chunk-afc57a0e9548d1f484da6df6c182676b - /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf - 1779012003 - - - - 母公司 - organization - 母公司refers to the parent company that oversees subsidiary management and authorization. - chunk-afc57a0e9548d1f484da6df6c182676b - /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf - 1779012003 - - - - 逐级审批规则 - concept - 逐级审批规则refers to the level-by-level approval rules that form the basis of business workflow execution, following organizational relationships. - chunk-afc57a0e9548d1f484da6df6c182676b - /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf - 1779012004 - - - - 终审岗 - concept - 终审岗refers to the final approval position in the hierarchical approval process. - chunk-afc57a0e9548d1f484da6df6c182676b - /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf - 1779012004 - - - - 财务入账条件 - concept - 财务入账条件refers to the conditions required for financial recording of settlement business expenses. - chunk-afc57a0e9548d1f484da6df6c182676b - /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf - 1779012004 - - - - 薪酬福利支出分配计划 - concept - 薪酬福利支出分配计划refers to the salary and benefits expense distribution plan approved according to HR management department regulations. - chunk-afc57a0e9548d1f484da6df6c182676b - /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf - 1779012004 - - - - 公司1号文 - content - 公司1号文refers to Company Document No. 1 which specifies job authorization standards for subsidiary department managers. - chunk-afc57a0e9548d1f484da6df6c182676b - /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf - 1779012004 - - - - 总监 - concept - 总监refers to the director-level position with corresponding approval authority for subsidiary management. - chunk-afc57a0e9548d1f484da6df6c182676b - /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf - 1779012004 - - - - 一级部门总经理 - concept - 一级部门总经理refers to the level-1 department general manager position with corresponding approval authority. - chunk-afc57a0e9548d1f484da6df6c182676b - /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf - 1779012004 - - - - P8 - concept - P8 refers to the position level of company leadership in the organizational hierarchy. - chunk-afc57a0e9548d1f484da6df6c182676b - /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf - 1779012004 - - - - 报销标准变化情况 - concept - Reimbursement standard changes is a key topic in the regulations, adjusting reimbursement rules for official vehicle subsidies and other expenses.<SEP>报销标准变化情况refers to the changes in reimbursement standards, including travel expense transportation and allowance modifications. - chunk-afc57a0e9548d1f484da6df6c182676b<SEP>chunk-18d968b78afe916b419c1b5973421ebe - /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf - 1779012005 - - - - 取消报销规定 - concept - 取消报销规定refers to the cancelled reimbursement regulations, such as the official vehicle allowance now included in salary. - chunk-afc57a0e9548d1f484da6df6c182676b - /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf - 1779012005 - - - - 新增报销规定 - concept - 新增报销规定refers to new reimbursement regulations added to the company expense management policy. - chunk-afc57a0e9548d1f484da6df6c182676b - /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf - 1779012005 - - - - 因公用车补贴 - concept - 因公用车补贴refers to the official vehicle allowance that was cancelled and integrated into salary payment. - chunk-afc57a0e9548d1f484da6df6c182676b - /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf - 1779012006 - - - - 异地挂职锻炼补贴标准 - concept - Remote assignment training allowance standards define the reimbursement rules for transportation, meal allowances, and basic subsidies during temporary assignments.<SEP>异地挂职锻炼补贴标准refers to the subsidy standard for off-site training and development exercises arranged by the organization. - chunk-afc57a0e9548d1f484da6df6c182676b<SEP>chunk-18d968b78afe916b419c1b5973421ebe - /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf - 1779012007 - - - - 组织安排 - concept - 组织安排refers to organizational arrangements for employee training, relocation, - chunk-afc57a0e9548d1f484da6df6c182676b - /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf - 1779012007 - - - - Company - organization - The company is an organization that establishes expenditure management principles, approval authority, and departmental responsibilities for financial operations. - chunk-74c01decac4a10cd40a491786743b0ee - /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf - 1779012007 - - - - Management Personnel At All Levels - person - Management personnel at all levels should fulfill expenditure reimbursement approval authority within authorized approval scope and responsibilities, bearing approval responsibilities. - chunk-74c01decac4a10cd40a491786743b0ee - /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf - 1779012007 - - - - Centralized Management department - organization - The centralized management department is responsible for determining expenditure scope, standards, methods, and management processes for various expenditure businesses based on business management needs. - chunk-74c01decac4a10cd40a491786743b0ee - /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf - 1779012007 - - - - Planning and Finance Department - organization - The Planning and Finance Department is responsible for clarifying expenditure reimbursement approval processes, audit points, and reimbursement documentation standards. - chunk-74c01decac4a10cd40a491786743b0ee - /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf - 1779012007 - - - - Operating Department Individual - person - The operating department (individual) is responsible for conducting expenditure business activities within departmental job responsibilities and authorized business scope, adhering to budget-first, thrifty, and benefit-priority principles. - chunk-74c01decac4a10cd40a491786743b0ee - /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf - 1779012008 - - - - Operator - person - The operator should timely fill out system documents, submit business original documents, obtain real, compliant, related, and complete business original documents, and verify invoice authenticity. - chunk-74c01decac4a10cd40a491786743b0ee - /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf - 1779012009 - - - - First Approver - person - The first approver should comprehensively audit the authenticity, compliance, necessity, and rationality of expenditure business, and bear approval responsibility. - chunk-74c01decac4a10cd40a491786743b0ee - /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf - 1779012009 - - - - Subsequent Approver - person - The subsequent approver should audit the necessity and rationality of expenditure business, and bear approval responsibility. - chunk-74c01decac4a10cd40a491786743b0ee - /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf - 1779012009 - - - - Financial Information System - artifact - The financial information system is the platform through which expenditure reimbursement applications are submitted via system documents. - chunk-74c01decac4a10cd40a491786743b0ee - /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf - 1779012009 - - - - Business Original Documents - data - Business original documents are the supporting materials for expenditure reimbursement, including invoices and related vouchers that must be complete, compliant, related, and complete. - chunk-74c01decac4a10cd40a491786743b0ee - /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf - 1779012009 - - - - VAT Special Invoice - content - VAT special invoice is a tax document required for most expenditures, and if not obtained when required, the operator should explain the reason in the system document. - chunk-74c01decac4a10cd40a491786743b0ee - /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf - 1779011997 - - - - Expenditure Reimbursement Application - concept - The expenditure reimbursement application is submitted through the financial information system, and financial原则上does not accept paper application documents. - chunk-74c01decac4a10cd40a491786743b0ee - /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf - 1779011997 - - - - Expenditure Authorization Approval Scope - concept - Expenditure authorization approval scope refers to the authorized limits for expenditure approval at various management levels. - chunk-74c01decac4a10cd40a491786743b0ee - /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf - 1779011997 - - - - Separation of Approval and Processing Principle - concept - The separation of approval and processing principle requires that the expenditure operator and approver cannot be the same person. - chunk-74c01decac4a10cd40a491786743b0ee - /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf - 1779011998 - - - - Three Flows Consistency Principle - concept - The three flows consistency principle requires alignment of invoice flow, capital flow, and material flow during business operations. - chunk-74c01decac4a10cd40a491786743b0ee - /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf - 1779011998 - - - - Employee Remuneration - concept - Employee remuneration is a type of expenditure that does not require tax authority-recognized invoices for reimbursement. - chunk-74c01decac4a10cd40a491786743b0ee - /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf - 1779011998 - - - - Personal Service Compensation - concept - Personal service compensation is a type of expenditure that does not require tax authority-recognized invoices for reimbursement. - chunk-74c01decac4a10cd40a491786743b0ee - /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf - 1779011999 - - - - Travel Allowance - concept - Travel allowance is a type of expenditure that does not require tax authority-recognized invoices for reimbursement. - chunk-74c01decac4a10cd40a491786743b0ee - /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf - 1779011999 - - - - Special Subsidy - concept - Special subsidy is a type of expenditure that does not require tax authority-recognized invoices for reimbursement. - chunk-74c01decac4a10cd40a491786743b0ee - /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf - 1779011999 - - - - Current Account Payment - concept - Current account payment is a type of expenditure that does not require tax authority-recognized invoices for reimbursement. - chunk-74c01decac4a10cd40a491786743b0ee - /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf - 1779011999 - - - - Trade Union Fund - concept - Trade union fund is a type of expenditure exempt from VAT special invoice requirements. - chunk-74c01decac4a10cd40a491786743b0ee - /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf - 1779012000 - - - - Employee Welfare - concept - Employee welfare is a type of expenditure exempt from VAT special invoice requirements. - chunk-74c01decac4a10cd40a491786743b0ee - /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf - 1779012000 - - - - Staff Activities - concept - Staff activities is a type of expenditure exempt from VAT special invoice requirements. - chunk-74c01decac4a10cd40a491786743b0ee - /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf - 1779012000 - - - - Business Entertainment - concept - Business entertainment is a type of expenditure exempt from VAT special invoice requirements. - chunk-74c01decac4a10cd40a491786743b0ee - /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf - 1779012000 - - - - Transportation Tickets - concept - Transportation tickets is a type of expenditure exempt from VAT special invoice requirements. - chunk-74c01decac4a10cd40a491786743b0ee - /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf - 1779012000 - - - - Government Fees - concept - Government fees is a type of expenditure exempt from VAT special invoice requirements. - chunk-74c01decac4a10cd40a491786743b0ee - /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf - 1779012000 - - - - Tax Control System Details - data - Tax control system details is a supplementary document required for aggregated VAT invoices. - chunk-74c01decac4a10cd40a491786743b0ee - /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf - 1779012000 - - - - Three Working Days Deadline - concept - The three working days deadline refers to the timeframe within which the operator must supplement incomplete business original documents after financial review. - chunk-74c01decac4a10cd40a491786743b0ee - /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf - 1779012000 - - - - 广告费 - concept - 广告费是指公司通过各种公开媒体宣传所发生的费用,报销时应附广告投放等业务佐证材料。 - chunk-e9438f69c9e221d9f0f00a05ad84eac6<SEP>chunk-d26b288ed4001dc5c504dce0eb841362 - /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf - 1779012000 - - - - 业务宣传费 - concept - 业务宣传费是指公司自身开展宣传与营销活动所发生的费用,包括未通过媒体传播的广告性支出,以及发放的印有公司标志的礼品、纪念品等。 - chunk-e9438f69c9e221d9f0f00a05ad84eac6<SEP>chunk-d26b288ed4001dc5c504dce0eb841362 - /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf - 1779012001 - - - - 培训费 - concept - Training expenses is a category of expenditure managed under the measures.<SEP>培训费是指公司安排、主办或承办培训发生的学费、书籍杂费、师资费、资料费、场地费、设备材料费、住宿费、交通费等,以及员工根据工作需要,经归口管理部门批准参加外部培训、考证、教育产生的相关费用。 - chunk-e9438f69c9e221d9f0f00a05ad84eac6<SEP>chunk-dd87aa5bc62cc9587ecb4c26d35a5263 - /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf - 1779012001 - - - - 通信费 - concept - Communication fees is a category of expenditure managed under the measures.<SEP>通信费是指为满足公司日常办公需要发生的电话、传真、集团网、网络连接等支出。 - chunk-e9438f69c9e221d9f0f00a05ad84eac6<SEP>chunk-dd87aa5bc62cc9587ecb4c26d35a5263 - /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf - 1779012002 - - - - 邮递费 - concept - 邮递费是指公司因业务需要邮递物品而支付的费用,包括邮件费、托运费、快递费等。 - chunk-e9438f69c9e221d9f0f00a05ad84eac6 - /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf - 1779012004 - - - - 薪酬福利支出 - concept - 薪酬福利支出是指公司相关制度规定的职工薪资、奖励提成、福利费支出,以及临时的奖励及福利支出。 - chunk-e9438f69c9e221d9f0f00a05ad84eac6 - /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf - 1779012005 - - - - 对外捐赠支出 - concept - 对外捐赠支出是指公司对外捐赠的费用,由品牌及市场运营中心归口管理,需严格预算单控。 - chunk-e9438f69c9e221d9f0f00a05ad84eac6 - /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf - 1779012005 - - - - 涉外业务汇率标准 - concept - 涉外业务汇率标准规定以外币结算时按支付凭据所载汇率折算,未载明汇率的按中国银行外汇折算价执行。 - chunk-e9438f69c9e221d9f0f00a05ad84eac6 - /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf - 1779012005 - - - - 公司员工教育培训管理办法 - content - 《公司员工教育培训管理办法》是规定培训费报销资格认定标准的制度文件。 - chunk-e9438f69c9e221d9f0f00a05ad84eac6 - /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf - 1779012006 - - - - 公司员工因公通讯费用实施细则 - content - 《公司员工因公通讯费用实施细则》是规定员工通讯费执行标准的制度文件。 - chunk-e9438f69c9e221d9f0f00a05ad84eac6 - /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf - 1779012006 - - - - 公司团建管理办法 - content - 《公司团建管理办法》是规定职工活动支出执行标准的制度文件。 - chunk-e9438f69c9e221d9f0f00a05ad84eac6 - /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf - 1779012006 - - - - 工会经费管理办法 - content - 《工会经费管理办法》是规定职工活动支出执行标准的制度文件。 - chunk-e9438f69c9e221d9f0f00a05ad84eac6 - /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf - 1779012006 - - - - 中国银行外汇折算价 - data - 中国银行外汇折算价是涉外业务汇率折算的标准依据。 - chunk-e9438f69c9e221d9f0f00a05ad84eac6 - /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf - 1779012019 - - - - 中国外汇交易中心参考汇率 - data - 中国外汇交易中心参考汇率是中国银行无折算价币种的备选汇率依据。 - chunk-e9438f69c9e221d9f0f00a05ad84eac6 - /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf - 1779012007 - - - - 第十七条 - concept - 第十七条规定培训费的定义、范围及报销标准。 - chunk-e9438f69c9e221d9f0f00a05ad84eac6 - /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf - 1779012008 - - - - 第十八条 - concept - 第十八条规定通信费的定义及执行标准。 - chunk-e9438f69c9e221d9f0f00a05ad84eac6 - /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf - 1779012008 - - - - 第十九条 - concept - 第十九条规定邮递费的定义及报销凭据要求。 - chunk-e9438f69c9e221d9f0f00a05ad84eac6 - /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf - 1779012008 - - - - 第二十条 - concept - 第二十条规定薪酬福利支出的分类、执行标准及审批程序。 - chunk-e9438f69c9e221d9f0f00a05ad84eac6 - /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf - 1779012008 - - - - 第二十一条 - concept - 第二十一条规定对外捐赠支出的归口管理、预算控制及审批流程。 - chunk-e9438f69c9e221d9f0f00a05ad84eac6 - /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf - 1779012009 - - - - 第二十二条 - concept - 第二十二条规定涉外业务汇率标准及结算方式。 - chunk-e9438f69c9e221d9f0f00a05ad84eac6 - /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf - 1779012009 - - - - 第二十三条 - concept - 第二十三条规定办法的归口管理部门及实施时间。 - chunk-e9438f69c9e221d9f0f00a05ad84eac6 - /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf - 1779012009 - - - - 第二十四条 - concept - 第二十四条规定办法的附件内容。 - chunk-e9438f69c9e221d9f0f00a05ad84eac6 - /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf - 1779012009 - - - - 附表1:员工支出报销审批权限表 - content - 附表1规定了员工支出报销的审批权限表,明确各部门经理、总监、副总裁等审批层级及权限。 - chunk-e9438f69c9e221d9f0f00a05ad84eac6 - /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf - 1779012009 - - - - 附表2:岗位支出报销审批权限表 - content - 附表2规定了岗位支出报销的审批权限表。 - chunk-e9438f69c9e221d9f0f00a05ad84eac6 - /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf - 1779012011 - - - - 附表3:支出归口管理部门与归口业务范围 - content - 附表3规定了支出归口管理部门及其对应的业务范围。 - chunk-e9438f69c9e221d9f0f00a05ad84eac6 - /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf - 1779012011 - - - - 业务招待 - concept - 业务招待是员工支出类别之一,对应审批权限额度分别为0.5万元、1万元、2万元、3万元、15万元。<SEP>业务招待是报销审批权限表中的支出项目类别。 - chunk-e9438f69c9e221d9f0f00a05ad84eac6<SEP>chunk-9841d66d8fb8548aab40220663a51693 - /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf - 1779012012 - - - - 报销资格 - concept - 报销资格是指员工申请费用报销所需满足的条件和标准。 - chunk-e9438f69c9e221d9f0f00a05ad84eac6 - /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf - 1779012012 - - - - 捐赠申请 - concept - 捐赠申请是指业务部门向公司提出对外捐赠申请的文件,需说明捐赠事由、对象、金额等内容。 - chunk-e9438f69c9e221d9f0f00a05ad84eac6 - /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf - 1779012012 - - - - 预算调整决策程序 - concept - 预算调整决策程序是指针对未纳入预算的对外捐赠事项所履行的预算调整审批流程。 - chunk-e9438f69c9e221d9f0f00a05ad84eac6 - /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf - 1779012012 - - - - Departments And Units - organization - Departments and units are organizational entities within the company that must strictly enforce travel approval procedures and control the number and duration of business trips. - chunk-613d6dfd4c5e9c807229a3147f96b584 - /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf - 1779012012 - - - - Company Business Travel System - concept - The company business travel system is an internal approval platform through which employees below department deputy level must obtain pre-approval for business travel. - chunk-613d6dfd4c5e9c807229a3147f96b584 - /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf - 1779012012 - - - - Transportation Level Standards - concept - Transportation level standards is a table specifying the allowed transportation modes and classes for employees based on their rank for domestic and international travel. - chunk-613d6dfd4c5e9c807229a3147f96b584 - /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf - 1779012012 - - - - Hotel Accommodation Standards - concept - Hotel accommodation standards are tables specifying the maximum hotel accommodation expenses allowed for employees based on their rank and destination. - chunk-613d6dfd4c5e9c807229a3147f96b584 - /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf - 1779012013 - - - - Travel Allowance Standards - concept - Travel allowance standards are tables specifying the daily allowance amounts for employees, including meal allowances and basic travel allowances, categorized by travel destination. - chunk-613d6dfd4c5e9c807229a3147f96b584 - /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf - 1779012013 - - - - Company Property Rental Management - concept - Company property rental management refers to a policy document that governs the application and reimbursement standards for remote work housing. - chunk-613d6dfd4c5e9c807229a3147f96b584 - /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf - 1779012013 - - - - Business Trip Approval - concept - Business trip approval is a required procedural step that employees must follow before undertaking official travel. - chunk-613d6dfd4c5e9c807229a3147f96b584 - /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf - 1779012013 - - - - Company Leadership - person - Company leadership refers to the highest-ranking executives (P8 and above) who have the most generous travel expense standards. - chunk-613d6dfd4c5e9c807229a3147f96b584 - /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf - 1779012013 - - - - Senior Managers - person - Senior managers (P7 level) are executives with the second-highest travel expense standards after company leadership. - chunk-613d6dfd4c5e9c807229a3147f96b584 - /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf - 1779012014 - - - - Middle Managers - person - Middle managers (P5-P6 level) and external experts have moderate travel expense standards. - chunk-613d6dfd4c5e9c807229a3147f96b584 - /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf - 1779012014 - - - - Basic Level Managers - person - Basic level managers (P4) are supervisors with lower travel expense standards and additional approval requirements for air travel. - chunk-613d6dfd4c5e9c807229a3147f96b584 - /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf - 1779012015 - - - - Other Employees - person - Other employees (P1-P3 level) have the most restrictive travel expense standards and must fly economy class at 50% discount or below. - chunk-613d6dfd4c5e9c807229a3147f96b584 - /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf - 1779012015 - - - - Remote Work Housing - artifact - Remote work housing refers to accommodation provided to employees on long-term business travel assignments, governed by company rental management policies. - chunk-613d6dfd4c5e9c807229a3147f96b584 - /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf - 1779012015 - - - - Commercial Insurance - content - Commercial insurance including transportation insurance has been purchased by the company for employees, and insurance fees during business trips are non-reimbursable. - chunk-613d6dfd4c5e9c807229a3147f96b584 - /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf - 1779012015 - - - - Transportation Cost Reimbursement - concept - Transportation cost reimbursement covers expenses for air travel, train, ship, and other transportation modes based on employee rank and travel standards. - chunk-613d6dfd4c5e9c807229a3147f96b584 - /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf - 1779012016 - - - - Accommodation Cost Reimbursement - concept - Accommodation cost reimbursement covers hotel lodging expenses according to location category and employee rank, with approval required for excess amounts. - chunk-613d6dfd4c5e9c807229a3147f96b584 - /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf - 1779012016 - - - - Hong Kong, Macau, And Taiwan Region - location - Hong Kong, Macau, and Taiwan region is a specific travel destination category in the expense reimbursement tables, listed separately from domestic mainland destinations. - chunk-613d6dfd4c5e9c807229a3147f96b584 - /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf - 1779012016 - - - - Directly-Controlled Municipalities And Special Administrative Regions - location - Directly-controlled municipalities and special administrative regions refer to major cities like Beijing, Shanghai, Tianjin, Chongqing, and Shenzhen that have higher accommodation standards than provincial capitals. - chunk-613d6dfd4c5e9c807229a3147f96b584 - /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf - 1779012016 - - - - Provincial Capitals - location - Provincial capitals are cities designated as provincial-level administrative centers that have moderate accommodation standards in the policy. - chunk-613d6dfd4c5e9c807229a3147f96b584 - /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf - 1779012016 - - - - Other Areas - location - Other areas refer to locations outside directly-controlled municipalities, special administrative regions, and provincial capitals that have the lowest accommodation standards in the policy. - chunk-613d6dfd4c5e9c807229a3147f96b584 - /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf - 1779012017 - - - - Night High-Speed Rail Provision - concept - Night high-speed rail provision is a special allowance permitting employees to choose sleeper seats when traveling on high-speed trains for 6 hours or more at night. - chunk-613d6dfd4c5e9c807229a3147f96b584 - /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf - 1779012017 - - - - Taxi Usage Regulations - concept - Taxi usage regulations specify the limited circumstances under which taxi expenses can be reimbursed, including emergency official business, client接送, late night work after 22:00, and other special circumstances. - chunk-613d6dfd4c5e9c807229a3147f96b584 - /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf - 1779012017 - - - - Self-Driving Travel Provisions - concept - Self-driving travel provisions outline the reimbursement rules for road tolls, parking fees, fuel costs, and electricity expenses when employees use personal vehicles for business travel, with department head approval required. - chunk-613d6dfd4c5e9c807229a3147f96b584 - /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf - 1779012017 - - - - Remote Work Housing Rental Expenses - data - Remote work housing rental expenses include rent, initial housing configuration costs, property management fees, heating fees, utility and gas expenses including shared portions, and internet broadband fees. - chunk-613d6dfd4c5e9c807229a3147f96b584 - /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf - 1779012018 - - - - External Conference Accommodation - concept - External conference accommodation refers to hotel expenses when employees attend conferences or training sessions, which may be reimbursed at the conference organizer's stated standards if accommodations are uniformly arranged. - chunk-613d6dfd4c5e9c807229a3147f96b584 - /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf - 1779012018 - - - - 取消报销规定内容 - concept - The content about canceling reimbursement regulations refers to the removal of official vehicle subsidy-related expressions since the subsidy has been included in wages. - chunk-18d968b78afe916b419c1b5973421ebe - /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf - 1779012018 - - - - 新增规定内容 - concept - Newly added regulations content covers remote assignment allowance standards and standardized business travel booking procedures. - chunk-18d968b78afe916b419c1b5973421ebe - /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf - 1779012018 - - - - 商旅订票规范 - concept - Business travel booking standards specify that official business trips should use the commercial travel system for unified booking. - chunk-18d968b78afe916b419c1b5973421ebe - /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf - 1779012018 - - - - 审批权限变化情况 - concept - Changes in approval authority mainly involve adjusting bid security deposit approval limits and clarifying expense approval workflow procedures. - chunk-18d968b78afe916b419c1b5973421ebe - /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf - 1779012019 - - - - 投标保证金 - data - Bid security deposit is a type of expense requiring approval, with different approval limits assigned to different management levels. - chunk-18d968b78afe916b419c1b5973421ebe - /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf - 1779012019 - - - - 审批流转程序 - method - Approval workflow process is the multi-level approval rule based on organizational relationships, with provisions for special matters to bypass levels. - chunk-18d968b78afe916b419c1b5973421ebe - /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf - 1779012019 - - - - 出差规定 - concept - Business travel regulations define the reimbursement standards for transportation, meal allowances, and basic subsidies during transit periods. - chunk-18d968b78afe916b419c1b5973421ebe - /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf - 1779012019 - - - - 财务信息化系统 - method - Financial information system is the system used for submitting expense reimbursement applications electronically. - chunk-18d968b78afe916b419c1b5973421ebe - /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf - 1779012020 - - - - 支出报销申请与审批 - concept - Expenditure reimbursement application and approval is a key process regulated by the measures.<SEP>Expense reimbursement application and approval is a chapter of the regulations covering application methods and approval processes. - chunk-18d968b78afe916b419c1b5973421ebe<SEP>chunk-dd87aa5bc62cc9587ecb4c26d35a5263 - /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf - 1779012020 - - - - 重点支出管理规定 - concept - Key expense management regulations is a chapter covering petty cash loans, local transportation fees, and travel expenses. - chunk-18d968b78afe916b419c1b5973421ebe - /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf - 1779012020 - - - - 备用金借款 - concept - Petty cash loans is a category of key expenditure regulated by the measures.<SEP>备用金借款是公司借支给正式员工用于支付与公司经济业务相关且必须预支的费用,遵循"前款不清、后款不借"原则。<SEP>Petty cash loan is one of the key expense items regulated under the management provisions. - chunk-18d968b78afe916b419c1b5973421ebe<SEP>chunk-dd87aa5bc62cc9587ecb4c26d35a5263<SEP>chunk-061324cc36078214691a6fc1cd0aaeea - /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf - 1779012020 - - - - 市内交通费 - concept - Local transportation fees is a category of expenditure managed under the measures.<SEP>市内交通费指员工为公司生产经营活动在工作所在地发生的交通费用,不包括正常上下班交通费。<SEP>Local transportation fees are regulated under the key expense management provisions. - chunk-18d968b78afe916b419c1b5973421ebe<SEP>chunk-dd87aa5bc62cc9587ecb4c26d35a5263<SEP>chunk-061324cc36078214691a6fc1cd0aaeea - /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf - 1779012022 - - - - 审批权限表 - content - Approval authority table is an attachment showing approval limits for different management positions regarding bid security deposits. - chunk-18d968b78afe916b419c1b5973421ebe - /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf - 1779012022 - - - - 1 Yuan Per Person Per Kilometer Reimbursement - data - 1 yuan per person per kilometer reimbursement standard is the new rule for official vehicle subsidy calculation, with amounts exceeding the standard to be borne by the employee. - chunk-18d968b78afe916b419c1b5973421ebe - /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf - 1779012023 - - - - Official Vehicle Subsidy - content - Official vehicle subsidy has been included in wages, leading to the cancellation of related reimbursement regulations. - chunk-18d968b78afe916b419c1b5973421ebe - /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf - 1779012023 - - - - Department Manager - person - Department Manager is a management position with approval authority for bid security deposits up to 50,000 yuan. - chunk-18d968b78afe916b419c1b5973421ebe - /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf - 1779012023 - - - - Director - person - Director is a management position with approval authority for bid security deposits up to 50,000 yuan. - chunk-18d968b78afe916b419c1b5973421ebe - /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf - 1779012023 - - - - First-Level Department General Manager - person - First-Level Department General Manager is a management position with approval authority for bid security deposits up to 50,000 yuan. - chunk-18d968b78afe916b419c1b5973421ebe - /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf - 1779012023 - - - - Institution General Manager - person - Institution General Manager is a management position with approval authority for bid security deposits up to 50,000 yuan. - chunk-18d968b78afe916b419c1b5973421ebe - /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf - 1779012023 - - - - Business Division General Manager - person - Business Division General Manager is a management position with approval authority for bid security deposits up to 50,000 yuan. - chunk-18d968b78afe916b419c1b5973421ebe - /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf - 1779012023 - - - - Vice President - person - Vice President is a senior management position with approval authority for bid security deposits up to 100,000 yuan. - chunk-18d968b78afe916b419c1b5973421ebe - /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf - 1779012023 - - - - Chief Engineer - person - Chief Engineer is a senior management position with approval authority for bid security deposits up to 100,000 yuan. - chunk-18d968b78afe916b419c1b5973421ebe - /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf - 1779012023 - - - - Senior Vice President - person - Senior Vice President is a senior management position with approval authority for bid security deposits up to 200,000 yuan. - chunk-18d968b78afe916b419c1b5973421ebe - /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf - 1779012024 - - - - President - person - President is the highest executive position with approval authority for bid security deposits up to 500,000 yuan. - chunk-18d968b78afe916b419c1b5973421ebe - /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf - 1779012024 - - - - Committee Chairpersons - person - Committee Chairpersons are senior management positions with approval authority for bid security deposits up to 200,000 yuan. - chunk-18d968b78afe916b419c1b5973421ebe - /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf - 1779012024 - - - - Bid Security Deposit Approval Limits Table - content - The bid security deposit approval limits table specifies different approval authority limits for various management positions, ranging from 50,000 to 5,000,000 yuan. - chunk-18d968b78afe916b419c1b5973421ebe - /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf - 1779012024 - - - - 50000 Yuan Approval Limit - data - 50,000 yuan is the bid security deposit approval limit for department managers, directors, and first-level department general managers. - chunk-18d968b78afe916b419c1b5973421ebe - /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf - 1779012024 - - - - 100000 Yuan Approval Limit - data - 100,000 yuan is the bid security deposit approval limit for vice presidents and chief engineers. - chunk-18d968b78afe916b419c1b5973421ebe - /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf - 1779012025 - - - - 200000 Yuan Approval Limit - data - 200,000 yuan is the bid security deposit approval limit for senior vice presidents and committee chairpersons. - chunk-18d968b78afe916b419c1b5973421ebe - /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf - 1779012025 - - - - 5000000 Yuan Approval Limit - data - 5,000,000 yuan is the bid security deposit approval limit for the president. - chunk-18d968b78afe916b419c1b5973421ebe - /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf - 1779012025 - - - - Commercial Travel System - method - Commercial travel system is the unified booking platform that should be used for official business travel arrangements. - chunk-18d968b78afe916b419c1b5973421ebe - /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf - 1779012026 - - - - Multi-Level Approval Rule - method - Multi-level approval rule is based on organizational relationships, requiring expenses to be approved sequentially through management levels. - chunk-18d968b78afe916b419c1b5973421ebe - /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf - 1779012026 - - - - Final Approval Position - person - Final approval position is the highest approval authority that can be bypassed for special matters after decision-making. - chunk-18d968b78afe916b419c1b5973421ebe - /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf - 1779012026 - - - - Company Hotel Accommodation Limit Standards - data - Company hotel accommodation limit - chunk-18d968b78afe916b419c1b5973421ebe - /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf - 1779012026 - - - - 公司支出管理办法(2024) - content - 公司支出管理办法(2024)is a regulation issued by远光软件股份有限公司to optimize expenditure and reimbursement standards, standardize approval processes, and prevent operational risks. - chunk-dd87aa5bc62cc9587ecb4c26d35a5263 - /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf - 1779012026 - - - - 国家电网公司 - organization - 国家电网公司is a reference entity whose management regulations are consulted in the development of the expenditure management measures. - chunk-dd87aa5bc62cc9587ecb4c26d35a5263 - /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf - 1779012038 - - - - 国网数科公司 - organization - 国网数科公司is a reference entity whose management regulations are consulted in the development of the expenditure management measures. - chunk-dd87aa5bc62cc9587ecb4c26d35a5263 - /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf - 1779012039 - - - - 办法 - concept - The original "Company Expenditure Management Measures" that has been superseded by the 2024 version. - chunk-dd87aa5bc62cc9587ecb4c26d35a5263 - /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf - 1779012039 - - - - 2024年4月17日 - event - 2024年4月17日is the date when the Company Expenditure Management Measures (2024) were issued by远光软件股份有限公司. - chunk-dd87aa5bc62cc9587ecb4c26d35a5263 - /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf - 1779012027 - - - - 预算先行 - concept - Budget-first is one of the core management principles in the expenditure management system, requiring expenditures to be within budget targets. - chunk-dd87aa5bc62cc9587ecb4c26d35a5263 - /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf - 1779012028 - - - - 厉行节约 - concept - Rigorous economy is a management principle requiring departments and positions to adhere to cost-saving and efficiency-first principles. - chunk-dd87aa5bc62cc9587ecb4c26d35a5263 - /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf - 1779012028 - - - - 分级授权 - concept - Hierarchical authorization is a management principle where management personnel exercise expenditure approval authority based on their positions. - chunk-dd87aa5bc62cc9587ecb4c26d35a5263 - /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf - 1779012028 - - - - 分类控制 - concept - Classified control is a management principle for standardized expenditure business activities. - chunk-dd87aa5bc62cc9587ecb4c26d35a5263 - /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf - 1779012028 - - - - 批办分离 - concept - Separation of approval and execution is a management principle in the expenditure management system. - chunk-dd87aa5bc62cc9587ecb4c26d35a5263 - /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf - 1779012029 - - - - 业务招待费 - concept - Business entertainment expenses is a category of expenditure managed under the measures.<SEP>业务招待费是指各级单位正常生产经营管理过程中需要发生的、用于必要招待的各项费用,包括用于接待客户和相关单位的餐饮等合理支出。 - chunk-dd87aa5bc62cc9587ecb4c26d35a5263<SEP>chunk-d26b288ed4001dc5c504dce0eb841362 - /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf - 1779012029 - - - - 会议费 - concept - Meeting expenses is a category of expenditure managed under the measures.<SEP>会议费是指公司主办或承办会议发生的会场租金、文件资料、设备租金等支出,以及参加外部会议所发生的会务相关支出。 - chunk-dd87aa5bc62cc9587ecb4c26d35a5263<SEP>chunk-d26b288ed4001dc5c504dce0eb841362 - /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf - 1779012029 - - - - 广告宣传费 - concept - Advertising expenses is a category of expenditure managed under the measures. - chunk-dd87aa5bc62cc9587ecb4c26d35a5263<SEP>chunk-d26b288ed4001dc5c504dce0eb841362 - /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf - 1779012029 - - - - 控股子公司 - organization - 控股子公司is a controlled subsidiary of远光软件股份有限公司that should follow the expenditure management measures and report to计划财务部. - chunk-dd87aa5bc62cc9587ecb4c26d35a5263 - /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf - 1779012029 - - - - 分支机构 - organization - 分支机构refers to non-legal-person branches of远光软件股份有限公司included in the scope of the expenditure management measures. - chunk-dd87aa5bc62cc9587ecb4c26d35a5263 - /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf - 1779012029 - - - - 经办部门 - organization - 经办部门is a department or individual responsible for handling expenditure business activities under the measures. - chunk-dd87aa5bc62cc9587ecb4c26d35a5263 - /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf - 1779012029 - - - - 各级管理人员 - concept - 各级管理人员refers to management personnel at all levels who exercise expenditure approval authority within their authorization scope. - chunk-dd87aa5bc62cc9587ecb4c26d35a5263 - /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf - 1779012030 - - - - 归口管理部门 - organization - 归口管理部门is the central management department responsible for expenditure management under the measures. - chunk-dd87aa5bc62cc9587ecb4c26d35a5263 - /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf - 1779012044 - - - - 远光制度〔2024〕14号 - content - 远光制度〔2024〕14号is the document number assigned to the Company Expenditure Management Measures (2024) issued by远光软件股份有限公司. - chunk-dd87aa5bc62cc9587ecb4c26d35a5263 - /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf - 1779012044 - - - - 修订说明 - content - 修订说明is an appendix to the Company Expenditure Management Measures (2024) explaining the revisions made. - chunk-dd87aa5bc62cc9587ecb4c26d35a5263 - /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf - 1779012032 - - - - 员工支出报销审批权限表 - content - 员工支出报销审批权限表is an appendix table defining employee-level expenditure reimbursement approval authority.<SEP>员工支出报销审批权限表是一份规定公司员工各项支出报销审批层级的制度文件,详细列示了不同支出项目的审批权限金额标准。 - chunk-dd87aa5bc62cc9587ecb4c26d35a5263<SEP>chunk-9841d66d8fb8548aab40220663a51693 - /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf - 1779012032 - - - - 岗位支出报销审批权限表 - content - 岗位支出报销审批权限表is an appendix table defining position-level expenditure reimbursement approval authority.<SEP>岗位支出报销审批权限表是一份规定公司各岗位支出报销审批层级的制度文件,涵盖资本性支出、收益性支出、财务专用等类别。 - chunk-dd87aa5bc62cc9587ecb4c26d35a5263<SEP>chunk-9841d66d8fb8548aab40220663a51693 - /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf - 1779012032 - - - - 支出归口管理部门与归口业务范围 - content - 支出归口管理部门与归口业务范围is an appendix table defining the mapping between central management departments and their corresponding business scopes. - chunk-dd87aa5bc62cc9587ecb4c26d35a5263 - /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf - 1779012033 - - - - 效益优先 - concept - 效益优先is a management principle requiring departments and positions to prioritize efficiency in expenditure activities. - chunk-dd87aa5bc62cc9587ecb4c26d35a5263 - /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf - 1779012033 - - - - 公司各部门 - organization - 公司各部门refers to all departments within远光软件股份有限公司, which are recipients of the Company Expenditure Management Measures (2024). - chunk-dd87aa5bc62cc9587ecb4c26d35a5263 - /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf - 1779012033 - - - - 因公借款 - concept - 因公借款是员工支出类别之一,对应审批权限额度分别为0.5万元、1万元、2万元、3万元、15万元。 - chunk-9841d66d8fb8548aab40220663a51693 - /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf - 1779012033 - - - - 其他支出(员工) - concept - 其他支出是员工支出类别之一,对应审批权限额度分别为1万元、2万元、3万元、5万元、50万元,并包含差旅费、市内交通、客服及商务等补充说明。 - chunk-9841d66d8fb8548aab40220663a51693 - /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf - 1779012034 - - - - 资产采购 - concept - 资产采购属于资本性支出类别,包括固定资产、无形资产、低值易耗品采购,对应审批权限为1万元、2万元、10万元、15万元、200万元。 - chunk-9841d66d8fb8548aab40220663a51693 - /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf - 1779012034 - - - - 基建工程 - concept - 基建工程属于资本性支出类别,对应审批权限为5万元、10万元、50万元,但前两级审批权限为空。 - chunk-9841d66d8fb8548aab40220663a51693 - /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf - 1779012034 - - - - 股权投资、兼并收购 - concept - 股权投资、兼并收购属于资本性支出类别,全部审批权限为空,需由董事长单独审批。 - chunk-9841d66d8fb8548aab40220663a51693 - /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf - 1779012036 - - - - 材料采购 - concept - 材料采购属于收益性支出类别,包括生产采购(原材料、辅助材料、机物料)和项目采购(设备、软件、公有云资源),对应审批权限为10万元、20万元、30万元、500万元。 - chunk-9841d66d8fb8548aab40220663a51693 - /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf - 1779012036 - - - - 分包外包(内部单位) - concept - 分包外包(内部单位)属于收益性支出类别,包括研发、实施、运维、服务等分包外包,对应审批权限为10万元、20万元、30万元、500万元。 - chunk-9841d66d8fb8548aab40220663a51693 - /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf - 1779012036 - - - - 分包外包(外部单位) - concept - 分包外包(外部单位)属于收益性支出类别,包括委托加工、项目土建装修等,对应审批权限为10万元、20万元、30万元、200万元。 - chunk-9841d66d8fb8548aab40220663a51693 - /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf - 1779012036 - - - - 保证金 - concept - 保证金属于收益性支出类别,包括投标保证金、质保金、履约保证金及招标相关保证金,对应审批权限为5万元、50万元、100万元、200万元、500万元。 - chunk-9841d66d8fb8548aab40220663a51693 - /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf - 1779012036 - - - - 销售退款 - concept - 销售退款属于收益性支出类别,包括销售退款和代付款(代收后),对应审批权限为5万元、10万元、30万元、50万元、200万元。 - chunk-9841d66d8fb8548aab40220663a51693 - /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf - 1779012036 - - - - 房屋租金 - concept - 房屋租金属于收益性支出类别,不含水电及杂费,需经业务归口部门审批,对应审批权限为5万元、10万元、20万元、30万元、200万元。 - chunk-9841d66d8fb8548aab40220663a51693 - /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf - 1779012036 - - - - 基本出差补贴 - concept - 基本出差补贴是指出差期间每天给予的基本生活补助,标准为35元,适用于所有出差地区。 - chunk-d26b288ed4001dc5c504dce0eb841362 - /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf - 1779012048 - - - - 商旅系统 - artifact - 商旅系统是公司统一的差旅预订和审批平台,出差人员原则上应通过该系统预定交通和住宿,特殊情况未通过系统下单的应邮件知会商旅客服并抄送部门负责人。<SEP>商旅系统是公司用于事前审批员工出差申请的系统平台。 - chunk-d26b288ed4001dc5c504dce0eb841362<SEP>chunk-061324cc36078214691a6fc1cd0aaeea - /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf - 1779012049 - - - - 业务佐证材料 - data - 业务佐证材料是指用于证明出差真实性、费用合理性等的材料,包括登机牌、通行记录、支付记录、审批邮件、订单详情等。 - chunk-d26b288ed4001dc5c504dce0eb841362 - /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf - 1779012036 - - - - 探亲路费 - concept - 探亲路费是指员工因私回家探亲产生的交通费用,应遵循公司员工探亲管理办法规定,不得以因公差旅方式报销,不享受出差补贴。 - chunk-d26b288ed4001dc5c504dce0eb841362 - /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf - 1779012037 - - - - 调动工作 - event - 调动工作是指公司组织安排员工到异地挂职锻炼、培养锻炼、人才帮扶、借调支援等,在途期间按出差规定执行,在异地工作期间按组织人事部确定的标准执行。 - chunk-d26b288ed4001dc5c504dce0eb841362 - /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf - 1779012037 - - - - 直辖市 - location - 直辖市是中国行政区划的一种,指由中央政府直接管辖的城市,包括北京、上海、天津、重庆等。 - chunk-d26b288ed4001dc5c504dce0eb841362 - /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf - 1779012037 - - - - 特区 - location - 特区在这里指深圳等经济特区,是享有特殊经济政策的国家级区域。 - chunk-d26b288ed4001dc5c504dce0eb841362 - /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf - 1779012037 - - - - 西藏 - location - 西藏是中国的一个自治区,在差旅补贴标准中作为特殊地区标注,餐补标准为140元。 - chunk-d26b288ed4001dc5c504dce0eb841362 - /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf - 1779012037 - - - - 第十四条 - concept - 第十四条是公司差旅费报销规定中关于业务招待费的条款,定义了业务招待费的范围和报销要求。 - chunk-d26b288ed4001dc5c504dce0eb841362 - /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf - 1779012038 - - - - 第十五条 - concept - 第十五条是公司差旅费报销规定中关于会议费的条款,规定了公司主办或承办会议的报销标准。 - chunk-d26b288ed4001dc5c504dce0eb841362 - /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf - 1779012038 - - - - 第十六条 - concept - 第十六条是公司差旅费报销规定中关于广告宣传费的条款,包括广告费和业务宣传费的管理规定。 - chunk-d26b288ed4001dc5c504dce0eb841362 - /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf - 1779012038 - - - - 公司总裁 - person - 公司总裁是公司最高管理人员,负责批准预算调整申请。<SEP>公司总裁是公司最高管理层人员,对经费预算30000元及以上的内部会议、研讨与集中培训具有审批权限。 - chunk-d26b288ed4001dc5c504dce0eb841362<SEP>chunk-061324cc36078214691a6fc1cd0aaeea - /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf - 1779012038 - - - - 商旅客服 - person - 商旅客服是商旅系统的服务人员,负责处理差旅预订异常情况,未通过系统下单的需邮件知会。 - chunk-d26b288ed4001dc5c504dce0eb841362 - /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf - 1779012038 - - - - 公司员工探亲管理办法 - content - 《公司员工探亲管理办法》是公司制定的关于员工探亲路费报销的管理规定,探亲路费应严格遵循此办法。 - chunk-d26b288ed4001dc5c504dce0eb841362 - /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf - 1779012039 - - - - 增值税发票 - content - 增值税发票是指企业开具的税务发票,用于记录商品或服务的销售和税收信息。文中提到汇总开具的增值税发票应附税控系统明细清单。 - chunk-061324cc36078214691a6fc1cd0aaeea - /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf - 1779012039 - - - - 税控系统明细清单 - content - 税控系统明细清单是由税控系统生成的详细清单,汇总开具增值税发票时需要附上该清单。 - chunk-061324cc36078214691a6fc1cd0aaeea - /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf - 1779012039 - - - - 财务 - organization - 财务是指公司内部的财务部门,负责审核业务原始凭据、影像扫描、审核与支付等报销相关工作。 - chunk-061324cc36078214691a6fc1cd0aaeea - /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf - 1779012039 - - - - 经办人 - person - 经办人是指负责具体业务办理并提交报销申请的人员,需确保原始凭据完整并按时补充。 - chunk-061324cc36078214691a6fc1cd0aaeea - /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf - 1779012039 - - - - 业务原始凭据 - content - 业务原始凭据是指证明经济业务发生的原始文件,财务审核时需要检查其完整性。 - chunk-061324cc36078214691a6fc1cd0aaeea - /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf - 1779012039 - - - - 报销申请时限 - concept - 报销申请时限是指从业务完成日到附件影像资料挂接系统单据日的期间,公司各类支出报销结算申请时限为三个月。 - chunk-061324cc36078214691a6fc1cd0aaeea - /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf - 1779012039 - - - - 预付款项 - concept - 预付款项是指公司预先支付给员工或供应商的款项,原则上应在次月底前完成结算。 - chunk-061324cc36078214691a6fc1cd0aaeea - /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf - 1779012039 - - - - 公司 - organization - 公司是指雇用员工并制定报销政策的企业主体,通过公对私或公对公方式进行支出结算。 - chunk-061324cc36078214691a6fc1cd0aaeea<SEP>chunk-e9438f69c9e221d9f0f00a05ad84eac6 - /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf - 1779012040 - - - - 员工 - person - 员工是公司的正式成员,可以申请备用金借款、差旅费报销等支出业务。 - chunk-061324cc36078214691a6fc1cd0aaeea - /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf - 1779012040 - - - - 供应商 - organization - 供应商是公司采购商品或服务的外部合作方,岗位支出业务原则上采用公对公方式与其直接结算。 - chunk-061324cc36078214691a6fc1cd0aaeea - /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf - 1779012040 - - - - 支出报销审批 - event - 支出报销审批是指按照审批权限对报销申请进行审核批准的过程,包括预算内和预算外支出的不同审批流程。 - chunk-061324cc36078214691a6fc1cd0aaeea - /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf - 1779012041 - - - - 预算内支出 - concept - 预算内支出是指在已批准预算范围内的支出,按附表1、附表2执行审批权限。 - chunk-061324cc36078214691a6fc1cd0aaeea - /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf - 1779012042 - - - - 正式员工 - person - 正式员工是公司的正式成员,有资格申请备用金借款,非正式员工不得申请。 - chunk-061324cc36078214691a6fc1cd0aaeea - /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf - 1779012042 - - - - 分管领导 - person - 分管领导是负责特定业务领域的公司管理人员,需对季度不能及时报账核销的备用金借款进行延期审批。 - chunk-061324cc36078214691a6fc1cd0aaeea - /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf - 1779012042 - - - - 一万元 - data - 一万元是员工备用金借款额度的上限。 - chunk-061324cc36078214691a6fc1cd0aaeea - /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf - 1779012042 - - - - 出租车 - method - 出租车是市内交通出行方式之一,仅限紧急公务、接送客户、夜间工作至22:00后等特别情形使用。 - chunk-061324cc36078214691a6fc1cd0aaeea - /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf - 1779012042 - - - - 部门负责人 - person - 部门负责人负责从严管理出租车市内交通使用,确保符合使用规定。 - chunk-061324cc36078214691a6fc1cd0aaeea - /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf - 1779012042 - - - - 出差审批程序 - method - 出差审批程序是出差前必须完成的审批流程,各部门应严格执行以从严控制出差人数和天数。 - chunk-061324cc36078214691a6fc1cd0aaeea - /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf - 1779012042 - - - - 交通费 - concept - 交通费是差旅费的组成部分,包括出差发生的各种交通支出。 - chunk-061324cc36078214691a6fc1cd0aaeea - /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf - 1779012042 - - - - 住宿费 - concept - 住宿费是差旅费的组成部分,指出差期间的住宿支出。 - chunk-061324cc36078214691a6fc1cd0aaeea - /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf - 1779012043 - - - - 出差补贴 - concept - 出差补贴是差旅费的组成部分,用于补贴员工出差期间的相关开支。 - chunk-061324cc36078214691a6fc1cd0aaeea - /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf - 1779012043 - - - - 成本中心归属 - concept - 成本中心归属基于责任原则与受益原则确定,特殊情况由业务部门协商确定。 - chunk-061324cc36078214691a6fc1cd0aaeea - /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf - 1779012043 - - - - 责任原则 - concept - 责任原则是确定支出成本中心归属的原则之一。 - chunk-061324cc36078214691a6fc1cd0aaeea - /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf - 1779012043 - - - - 受益原则 - concept - 受益原则是确定支出成本中心归属的原则之一。 - chunk-061324cc36078214691a6fc1cd0aaeea - /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf - 1779012044 - - - - 结算起点 - data - 结算起点是1000元,低于此金额且无法直接结算的小额支出需附付款凭据截图。 - chunk-061324cc36078214691a6fc1cd0aaeea - /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf - 1779012044 - - - - Procurement Management Regulations - chunk-74c01decac4a10cd40a491786743b0ee - Operating departments must strictly follow company bidding, procurement, and material management regulations for procurement of materials and services. - UNKNOWN - /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf - 1779012081 - - - - Tax Authority Recognized Invoice - chunk-74c01decac4a10cd40a491786743b0ee - Expenditures other than employee remuneration, personal service compensation, travel allowance, special subsidy, and current account payment require tax authority-recognized invoices. - UNKNOWN - /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf - 1779012094 - - - - Financial Review - chunk-74c01decac4a10cd40a491786743b0ee - Financial review can reject applications if documents are incomplete, incorrectly filled, or non-compliant. - UNKNOWN - /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf - 1779012085 - - - - 1.0 - 远光软件股份有限公司is the issuer of the expense reimbursement regulations, with Chapter 1 General Provisions establishing the foundational framework. - organizational hierarchy,regulation issuer - chunk-aa5435156b829944c173fa1d2d7a93d4 - /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf - 1779012088 - - - - 1.0 - 远光软件股份有限公司established the Planning and Finance Department to handle financial management and expense-related responsibilities. - financial authority,organizational structure - chunk-aa5435156b829944c173fa1d2d7a93d4 - /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf - 1779012076 - - - - 1.0 - Yuan Guang Software Co., Ltd. has implemented changes in reimbursement standards as part of its internal policy adjustments. - company governance,policy adjustment - chunk-18d968b78afe916b419c1b5973421ebe - /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf - 1779012084 - - - - 1.0 - 远光软件股份有限公司issued the Company Expenditure Management Measures (2024) to regulate company expenditures. - document issuance,policy implementation - chunk-dd87aa5bc62cc9587ecb4c26d35a5263 - /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf - 1779012085 - - - - 1.0 - 远光软件股份有限公司assigned document number远光制度〔2024〕14号to the expenditure management measures. - document numbering,regulatory framework - chunk-dd87aa5bc62cc9587ecb4c26d35a5263 - /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf - 1779012086 - - - - 1.0 - Article 3 Management Principles provides the foundational principles for the entire expense reimbursement system. - chapter article relationship,regulatory foundation - chunk-aa5435156b829944c173fa1d2d7a93d4 - /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf - 1779012076 - - - - 1.0 - The designated management department determines expenditure scope, standards, methods, and management processes in accordance with company financial, procurement, and human resources policies. - department responsibility,regulatory compliance - chunk-aa5435156b829944c173fa1d2d7a93d4 - /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf - 1779012079 - - - - 1.0 - 控股子公司must report expenditure management measures to计划财务部for filing after approval. - compliance,reporting relationship - chunk-dd87aa5bc62cc9587ecb4c26d35a5263 - /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf - 1779012099 - - - - 1.0 - Article 11 Petty Cash Loans is one of the key expense management regulations under Chapter - chapter article relationship,specific regulation - chunk-aa5435156b829944c173fa1d2d7a93d4 - /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf - 1779012088 - - - - 1.0 - 办公室(党委办公室)manages party building and official vehicle expenses according to the company expense management policy. - expense management,policy execution - chunk-afc57a0e9548d1f484da6df6c182676b - /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf - 1779012088 - - - - 1.0 - 工会委员会manages trade union expenses according to the company expense management policy. - expense management,policy execution - chunk-afc57a0e9548d1f484da6df6c182676b - /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf - 1779012079 - - - - 1.0 - 营销中心manages bidding - expense management,policy execution - chunk-afc57a0e9548d1f484da6df6c182676b - /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf - 1779012079 - - - - 1.0 - 组织人事部负责确定调动工作人员的报销标准,对异地挂职锻炼等人员的费用报销进行规范管理。 - 标准制定、人事管理 - chunk-d26b288ed4001dc5c504dce0eb841362 - /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf - 1779012090 - - - - 1.0 - 商旅系统是公司差旅费管理的核心平台,用于统一预定和审批差旅相关费用。 - 系统支持、费用管控 - chunk-d26b288ed4001dc5c504dce0eb841362 - /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf - 1779012086 - - - - 1.0 - 业务招待费是公司费用管理体系的重要组成部分,与差旅费并列作为公司主要费用报销项目。 - 费用类别、公司运营 - chunk-d26b288ed4001dc5c504dce0eb841362 - /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf - 1779012089 - - - - 1.0 - 会议费是公司费用管理体系的重要组成部分,与差旅费并列作为公司主要费用报销项目,需要事前审批并附业务佐证材料。 - 费用类别、公司运营 - chunk-d26b288ed4001dc5c504dce0eb841362 - /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf - 1779012092 - - - - 1.0 - The reimbursement standard changes include the cancellation of official vehicle subsidy reimbursement since it has been incorporated into wages. - expense reduction,policy modification - chunk-18d968b78afe916b419c1b5973421ebe - /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf - 1779012085 - - - - 1.0 - Management personnel at all levels exercise approval authority within the company's expenditure authorization approval scope. - hierarchical authority,organizational structure - chunk-74c01decac4a10cd40a491786743b0ee - /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf - 1779012076 - - - - 1.0 - The centralized management department implements expenditure centralized management on behalf of the company. - centralized management,departmental responsibility - chunk-74c01decac4a10cd40a491786743b0ee - /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf - 1779012077 - - - - 1.0 - The Planning and Finance Department assists the centralized management department and is responsible for financial reimbursement auditing and payment settlement. - departmental responsibility,financial oversight - chunk-74c01decac4a10cd40a491786743b0ee - /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf - 1779012077 - - - - 1.0 - The operating department (individual) conducts expenditure business activities within the company's authorization. - business execution,departmental responsibility - chunk-74c01decac4a10cd40a491786743b0ee - /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf - 1779012078 - - - - 1.0 - Operating departments must strictly follow company bidding, procurement, and material management regulations for procurement of materials and services. - business execution,procurement compliance - chunk-74c01decac4a10cd40a491786743b0ee - /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf - 1779012083 - - - - 1.0 - The operator submits the expenditure reimbursement application through the financial information system and provides business original documents. - documentation responsibility,workflow initiation - chunk-74c01decac4a10cd40a491786743b0ee - /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf - 1779012079 - - - - 1.0 - The operator is responsible for obtaining real - authenticity responsibility,document preparation - chunk-74c01decac4a10cd40a491786743b0ee - /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf - 1779012094 - - - - 1.0 - The operator has three working days to supplement incomplete business original documents after financial review. - documentation compliance,workflow timeline - chunk-74c01decac4a10cd40a491786743b0ee - /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf - 1779012083 - - - - 1.0 - Financial review can reject applications if documents are incomplete, incorrectly filled, or non-compliant. - document verification,rejection handling - chunk-74c01decac4a10cd40a491786743b0ee - /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf - 1779012088 - - - - 1.0 - Aggregated VAT invoices must be accompanied by tax control system detail lists. - documentation requirement,tax compliance - chunk-74c01decac4a10cd40a491786743b0ee - /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf - 1779012079 - - - - 1.0 - Expenditures other than employee remuneration, personal service compensation, travel allowance, special subsidy, and current account payment require tax authority-recognized invoices. - compliance requirement,documentation standard - chunk-74c01decac4a10cd40a491786743b0ee - /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf - 1779012082 - - - - 1.0 - 公司通过第十七条对培训费进行规范管理。 - 合规管理,规章制定 - chunk-e9438f69c9e221d9f0f00a05ad84eac6 - /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf - 1779012084 - - - - 1.0 - 公司通过第十八条对通信费进行规范管理。 - 合规管理,规章制定 - chunk-e9438f69c9e221d9f0f00a05ad84eac6 - /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf - 1779012084 - - - - 1.0 - 公司通过第十九条对邮递费进行规范管理。 - 合规管理,规章制定 - chunk-e9438f69c9e221d9f0f00a05ad84eac6 - /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf - 1779012084 - - - - 1.0 - 公司通过第二十条对薪酬福利支出进行规范管理。 - 薪酬管理,规章制定 - chunk-e9438f69c9e221d9f0f00a05ad84eac6 - /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf - 1779012086 - - - - 1.0 - 公司通过第二十一条对对外捐赠支出进行规范管理。 - 捐赠管理,规章制定 - chunk-e9438f69c9e221d9f0f00a05ad84eac6 - /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf - 1779012089 - - - - 1.0 - Departments and units must implement the night high-speed rail provision allowing employees to choose sleeper seats when high-speed train travel exceeds 6 hours at night. - policy implementation,travel standards - chunk-613d6dfd4c5e9c807229a3147f96b584 - /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf - 1779012084 - - - - 1.0 - Departments and units are responsible for strictly managing taxi usage, limiting reimbursements to emergency situations, client接送, late night work, and other special circumstances. - cost control,policy enforcement - chunk-613d6dfd4c5e9c807229a3147f96b584 - /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf - 1779012099 - - - - 1.0 - 第十四条专门定义了业务招待费的概念和报销要求,明确了接待客户和相关单位的餐饮等合理支出范围。 - 条款规定、费用管理 - chunk-d26b288ed4001dc5c504dce0eb841362 - /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf - 1779012092 - - - - 1.0 - 第十五条专门规定了会议费的报销范围和报销要求,包括公司主办或承办会议以及参加外部会议的报销标准。 - 条款规定、费用管理 - chunk-d26b288ed4001dc5c504dce0eb841362 - /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf - 1779012092 - - - - 1.0 - 公司总裁对经费预算30000元及以上的内部会议具有审批权限,体现了公司对大额会议支出的管控。 - 审批权限、预算管理 - chunk-d26b288ed4001dc5c504dce0eb841362 - /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf - 1779012093 - - - - 1.0 - 第十六条专门规定了广告宣传费的定义和管理要求,包括广告费和业务宣传费两类。 - 条款规定、费用管理 - chunk-d26b288ed4001dc5c504dce0eb841362 - /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf - 1779012092 - - - - + + + + + + + + + + + + + + + + + + + 远光软件股份有限公司 + organization + 远光软件股份有限公司is a company that issued the Company Expenditure Management Measures (2024) to regulate expenditure and reimbursement standards.<SEP>Yuan Guang Software Co., Ltd. is a company that has established internal expense reimbursement and management regulations.<SEP>YuanGuang Software Co., Ltd. is the company that issued the expense reimbursement management regulations to optimize business development, standardize expenditure and reimbursement processes, and prevent operational risks. + chunk-aa5435156b829944c173fa1d2d7a93d4<SEP>chunk-18d968b78afe916b419c1b5973421ebe<SEP>chunk-dd87aa5bc62cc9587ecb4c26d35a5263 + /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf + 1779011991 + + + + 第一章总则 + content + Chapter 1 General Provisions contains the purpose, scope, and management principles of the expense reimbursement regulations. + chunk-aa5435156b829944c173fa1d2d7a93d4 + /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf + 1779011991 + + + + 第二条目的 + content + Article 2 Purpose describes the objective of adapting to business development needs, optimizing expenditure and reimbursement standards, and standardizing approval processes. + chunk-aa5435156b829944c173fa1d2d7a93d4 + /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf + 1779011991 + + + + 第二条范围 + content + Article 2 Scope defines the applicable scope of the expense reimbursement regulations. + chunk-aa5435156b829944c173fa1d2d7a93d4 + /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf + 1779011991 + + + + 第三条管理原则 + content + Article 3 Management Principles establishes the principles for managing the expense reimbursement system. + chunk-aa5435156b829944c173fa1d2d7a93d4 + /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf + 1779011991 + + + + 第二章职责分工 + content + Chapter 2 Responsibilities Division outlines the responsibilities of various departments and personnel in the expense management system. + chunk-aa5435156b829944c173fa1d2d7a93d4 + /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf + 1779011991 + + + + 第四条归口管理部门主要职责 + content + Article 4 Main Responsibilities of the Designated Management Department specifies the duties of the designated management department. + chunk-aa5435156b829944c173fa1d2d7a93d4 + /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf + 1779011991 + + + + 计划财务部 + organization + 计划财务部is a department of远光软件股份有限公司with main responsibilities related to financial planning and expenditure management.<SEP>计划财务部负责制定、修订、解释及实施协调工作。<SEP>Planning and Finance Department is a key management department responsible for expense reimbursement duties.<SEP>Planning and Finance Department is one of the departments responsible for financial management and expense approval, determining expenditure scope, standards, methods, and management processes.<SEP>计划财务部is responsible for employee advance funds, travel expenses, transportation, foreign travel, meal allowances, taxes, audits, and financial expenses. + chunk-aa5435156b829944c173fa1d2d7a93d4<SEP>chunk-afc57a0e9548d1f484da6df6c182676b<SEP>chunk-e9438f69c9e221d9f0f00a05ad84eac6<SEP>chunk-18d968b78afe916b419c1b5973421ebe<SEP>chunk-dd87aa5bc62cc9587ecb4c26d35a5263 + /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf + 1779011991 + + + + 第五条计划财务部主要职责 + content + Article 5 Main Responsibilities of Planning and Finance Department outlines the specific duties of the Planning and Finance Department. + chunk-aa5435156b829944c173fa1d2d7a93d4 + /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf + 1779011992 + + + + 第六条经办部门(个人)主要职责 + content + Article 6 Main Responsibilities of Operating Departments (Individuals) describes the duties of operating departments and individuals handling expenses. + chunk-aa5435156b829944c173fa1d2d7a93d4 + /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf + 1779011992 + + + + 第七条各级管理人员主要职责 + content + Article 7 Main Responsibilities of Management Personnel at All Levels specifies the duties of managers at all levels. + chunk-aa5435156b829944c173fa1d2d7a93d4 + /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf + 1779011992 + + + + 第三章支出报销申请与审批 + content + Chapter 3 Expense Reimbursement Application and Approval covers the processes and regulations for expense reimbursement applications and approvals. + chunk-aa5435156b829944c173fa1d2d7a93d4 + /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf + 1779011992 + + + + 第八条支出报销申请 + content + Article 8 Expense Reimbursement Application establishes the procedures for submitting expense reimbursement requests. + chunk-aa5435156b829944c173fa1d2d7a93d4 + /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf + 1779011992 + + + + 第九条支出报销审批 + content + Article 9 Expense Reimbursement Approval defines the approval process for expense reimbursement requests. + chunk-aa5435156b829944c173fa1d2d7a93d4 + /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf + 1779011993 + + + + 第十条支出成本中心归属 + content + Article 10 Cost Center Attribution determines which cost centers expenses should be attributed to. + chunk-aa5435156b829944c173fa1d2d7a93d4 + /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf + 1779011993 + + + + 第四章重点支出管理规定 + content + Chapter 4 Key Expense Management Regulations contains specific management provisions for important types of + chunk-aa5435156b829944c173fa1d2d7a93d4 + /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf + 1779011994 + + + + 第十一条备用金借款 + content + Article 11 Petty Cash Loans provides management regulations for petty cash borrowing. + chunk-aa5435156b829944c173fa1d2d7a93d4 + /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf + 1779011994 + + + + 第十二条市内交通费 + content + Article 12 Local Transportation Fees specifies the regulations for local transportation expense reimbursement. + chunk-aa5435156b829944c173fa1d2d7a93d4 + /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf + 1779011994 + + + + 第十三条差旅费 + content + Article 13 Travel Expenses establishes the management regulations for travel-related expenses. + chunk-aa5435156b829944c173fa1d2d7a93d4 + /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf + 1779011994 + + + + 第十四条业务招待费 + content + Article 14 Business Entertainment Expenses provides management regulations for business entertainment costs. + chunk-aa5435156b829944c173fa1d2d7a93d4 + /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf + 1779011994 + + + + 第五章附则 + content + Chapter 5 Supplementary Provisions contains the final provisions including administration, implementation, and attachments of the regulations. + chunk-aa5435156b829944c173fa1d2d7a93d4 + /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf + 1779011994 + + + + 第二十三条本办法的归口与实施 + content + Article 23 Administration and Implementation designates the department responsible for administration and specifies the effective date of these measures. + chunk-aa5435156b829944c173fa1d2d7a93d4 + /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf + 1779011994 + + + + 第二十四条附件 + content + Article 24 Appendices indicates that supplementary materials and attachments are part of these regulations. + chunk-aa5435156b829944c173fa1d2d7a93d4 + /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf + 1779011995 + + + + 交通工具等级标准 + data + Transportation Level Standards is a data table specifying the permitted transportation modes (airplane, train, ship, other transportation) based on employee rank levels. + chunk-aa5435156b829944c173fa1d2d7a93d4 + /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf + 1779011995 + + + + 出差补贴标准 + data + Travel Allowance Standards is a data table detailing meal allowances, basic travel allowances, and total allowances by region (Hong Kong/Macau/Taiwan, municipalities/special zones/Tibet, other regions, and foreign countries). + chunk-aa5435156b829944c173fa1d2d7a93d4 + /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf + 1779011996 + + + + 经济舱 + data + Economy Class is the permitted airplane class for all employee levels according to transportation standards. + chunk-aa5435156b829944c173fa1d2d7a93d4 + /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf + 1779011996 + + + + 火车硬席 + data + Hard Seat Train is a permitted train transportation mode including hard sleeper, hard seat, high-speed rail second-class, and all soft-seat train second-class soft seats. + chunk-aa5435156b829944c173fa1d2d7a93d4 + /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf + 1779011996 + + + + 三等舱 + data + Third Class Cabin is the permitted ship accommodation class for all employee levels. + chunk-aa5435156b829944c173fa1d2d7a93d4 + /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf + 1779011996 + + + + 凭据报销 + method + Receipt-Based Reimbursement is the method for other transportation expenses (excluding cars), requiring submission of receipts for reimbursement. + chunk-aa5435156b829944c173fa1d2d7a93d4 + /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf + 1779011997 + + + + 餐补 + data + 餐补是指出差人员因工作需要在外出差期间的餐饮费用补贴,根据地区不同分为75元、65元、55元三个标准,但西藏地区标准为140元。组织安排统一安排餐食的情况下不再报销餐补。<SEP>Meal Allowance is a type of travel subsidy that varies by region: 75 for Hong Kong/Macau/Taiwan, 65 for municipalities/special zones/Tibet, 55 for other regions, and 140 for foreign countries. + chunk-aa5435156b829944c173fa1d2d7a93d4<SEP>chunk-d26b288ed4001dc5c504dce0eb841362 + /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf + 1779011997 + + + + 基本补助 + data + Basic Allowance is a standard travel subsidy of 35 regardless of region. + chunk-aa5435156b829944c173fa1d2d7a93d4 + /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf + 1779011997 + + + + 公司支出管理办法 + concept + 公司支出管理办法is a corporate expense management policy document that outlines reimbursement standards, approval authority, and departmental responsibilities for expense management. + chunk-afc57a0e9548d1f484da6df6c182676b + /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf + 1779011997 + + + + 办公室(党委办公室) + organization + 办公室(党委办公室)is a department responsible for party building expenses and official vehicle expenses. + chunk-afc57a0e9548d1f484da6df6c182676b + /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf + 1779011997 + + + + 工会委员会 + organization + 工会委员会is responsible for trade union expenses. + chunk-afc57a0e9548d1f484da6df6c182676b + /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf + 1779011998 + + + + 营销中心 + organization + 营销中心is responsible for bidding business expenses, institutional marketing expenses, customer training, and sales refund expenses. + chunk-afc57a0e9548d1f484da6df6c182676b + /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf + 1779011998 + + + + 品牌及市场运营中心 + organization + 品牌及市场运营中心是对外捐赠支出的归口管理部门,负责审核捐赠申请。<SEP>品牌及市场运营中心is responsible for advertising expenses, business promotion expenses, and external donation expenses. + chunk-afc57a0e9548d1f484da6df6c182676b<SEP>chunk-e9438f69c9e221d9f0f00a05ad84eac6 + /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf + 1779011998 + + + + 组织人事部 + organization + 组织人事部负责职工福利费的年度计划管理,并规定薪酬福利支事的审批程序标准。<SEP>组织人事部是公司负责人事管理的部门,确定调动工作人员的报销标准。<SEP>Personnel Department determines reimbursement standards for assigned personnel working at remote locations.<SEP>组织人事部is responsible for salary and benefits (excluding canteen and meal allowances), external labor, employee insurance, relocation allowances, and other benefits expenses. + chunk-afc57a0e9548d1f484da6df6c182676b<SEP>chunk-e9438f69c9e221d9f0f00a05ad84eac6<SEP>chunk-18d968b78afe916b419c1b5973421ebe<SEP>chunk-d26b288ed4001dc5c504dce0eb841362 + /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf + 1779011999 + + + + 人力资源服务部 + organization + 人力资源服务部is responsible for recruitment business and employee education training expenses. + chunk-afc57a0e9548d1f484da6df6c182676b + /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf + 1779012000 + + + + 产业投资部 + organization + 产业投资部is responsible for equity investment expenses and merger business expenses. + chunk-afc57a0e9548d1f484da6df6c182676b + /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf + 1779012000 + + + + 证券与法律事务部 + organization + 证券与法律事务部is responsible for legal affairs expenses, listing information disclosure expenses, and trademark registration expenses. + chunk-afc57a0e9548d1f484da6df6c182676b + /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf + 1779012000 + + + + 产品规划设计部 + organization + 产品规划设计部is responsible for intellectual property expenses, information technology consulting expenses, and research and development expenses. + chunk-afc57a0e9548d1f484da6df6c182676b + /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf + 1779012000 + + + + DAP研发中心 + organization + DAP研发中心is responsible for testing, evaluation, and analysis expenses paid to external units during research and development. + chunk-afc57a0e9548d1f484da6df6c182676b + /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf + 1779012001 + + + + 信息管理部 + organization + 信息管理部is responsible for IT asset acquisition, leasing, operations, maintenance, repairs, and network usage expenses. + chunk-afc57a0e9548d1f484da6df6c182676b + /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf + 1779012001 + + + + 后勤服务部 + organization + 后勤服务部is responsible for non-IT asset management, canteen expenses, office expenses, and business travel settlement. + chunk-afc57a0e9548d1f484da6df6c182676b + /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf + 1779012001 + + + + 审批权限 + concept + 审批权限refers to the approval authority levels for different management positions regarding expense approvals within their responsibilities. + chunk-afc57a0e9548d1f484da6df6c182676b + /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf + 1779012001 + + + + 报销标准 + concept + 报销标准refers to reimbursement standards including travel expense transportation methods and allowances. + chunk-afc57a0e9548d1f484da6df6c182676b + /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf + 1779012002 + + + + 差旅费 + concept + Travel expenses is a category of expenditure managed under the measures.<SEP>差旅费是指因公出差发生的各项费用,包括交通费、住宿费、餐补等,公司制定了详细的报销规定和注意事项。<SEP>差旅费是指员工因公出差所发生的交通费、住宿费、出差补贴等费用。<SEP>Travel expenses are regulated under the key expense management provisions, with specific standards for business trips.<SEP>差旅费refers to travel expenses including transportation standards and allowances for company leadership. + chunk-afc57a0e9548d1f484da6df6c182676b<SEP>chunk-18d968b78afe916b419c1b5973421ebe<SEP>chunk-dd87aa5bc62cc9587ecb4c26d35a5263<SEP>chunk-d26b288ed4001dc5c504dce0eb841362<SEP>chunk-061324cc36078214691a6fc1cd0aaeea + /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf + 1779012002 + + + + 全资子公司 + organization + 全资子公司is a subsidiary type wholly owned by远光软件股份有限公司, included in the scope of the expenditure management measures.<SEP>全资子公司refers to wholly-owned subsidiaries whose approval authority is managed by parent company personnel. + chunk-afc57a0e9548d1f484da6df6c182676b<SEP>chunk-dd87aa5bc62cc9587ecb4c26d35a5263 + /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf + 1779012003 + + + + 人事归口管理部门 + organization + 人事归口管理部门refers to the centralized HR management department responsible for salary, bonuses, and benefits approval. + chunk-afc57a0e9548d1f484da6df6c182676b + /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf + 1779012003 + + + + 母公司 + organization + 母公司refers to the parent company that oversees subsidiary management and authorization. + chunk-afc57a0e9548d1f484da6df6c182676b + /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf + 1779012003 + + + + 逐级审批规则 + concept + 逐级审批规则refers to the level-by-level approval rules that form the basis of business workflow execution, following organizational relationships. + chunk-afc57a0e9548d1f484da6df6c182676b + /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf + 1779012004 + + + + 终审岗 + concept + 终审岗refers to the final approval position in the hierarchical approval process. + chunk-afc57a0e9548d1f484da6df6c182676b + /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf + 1779012004 + + + + 财务入账条件 + concept + 财务入账条件refers to the conditions required for financial recording of settlement business expenses. + chunk-afc57a0e9548d1f484da6df6c182676b + /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf + 1779012004 + + + + 薪酬福利支出分配计划 + concept + 薪酬福利支出分配计划refers to the salary and benefits expense distribution plan approved according to HR management department regulations. + chunk-afc57a0e9548d1f484da6df6c182676b + /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf + 1779012004 + + + + 公司1号文 + content + 公司1号文refers to Company Document No. 1 which specifies job authorization standards for subsidiary department managers. + chunk-afc57a0e9548d1f484da6df6c182676b + /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf + 1779012004 + + + + 总监 + concept + 总监refers to the director-level position with corresponding approval authority for subsidiary management. + chunk-afc57a0e9548d1f484da6df6c182676b + /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf + 1779012004 + + + + 一级部门总经理 + concept + 一级部门总经理refers to the level-1 department general manager position with corresponding approval authority. + chunk-afc57a0e9548d1f484da6df6c182676b + /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf + 1779012004 + + + + P8 + concept + P8 refers to the position level of company leadership in the organizational hierarchy. + chunk-afc57a0e9548d1f484da6df6c182676b + /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf + 1779012004 + + + + 报销标准变化情况 + concept + Reimbursement standard changes is a key topic in the regulations, adjusting reimbursement rules for official vehicle subsidies and other expenses.<SEP>报销标准变化情况refers to the changes in reimbursement standards, including travel expense transportation and allowance modifications. + chunk-afc57a0e9548d1f484da6df6c182676b<SEP>chunk-18d968b78afe916b419c1b5973421ebe + /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf + 1779012005 + + + + 取消报销规定 + concept + 取消报销规定refers to the cancelled reimbursement regulations, such as the official vehicle allowance now included in salary. + chunk-afc57a0e9548d1f484da6df6c182676b + /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf + 1779012005 + + + + 新增报销规定 + concept + 新增报销规定refers to new reimbursement regulations added to the company expense management policy. + chunk-afc57a0e9548d1f484da6df6c182676b + /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf + 1779012005 + + + + 因公用车补贴 + concept + 因公用车补贴refers to the official vehicle allowance that was cancelled and integrated into salary payment. + chunk-afc57a0e9548d1f484da6df6c182676b + /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf + 1779012006 + + + + 异地挂职锻炼补贴标准 + concept + Remote assignment training allowance standards define the reimbursement rules for transportation, meal allowances, and basic subsidies during temporary assignments.<SEP>异地挂职锻炼补贴标准refers to the subsidy standard for off-site training and development exercises arranged by the organization. + chunk-afc57a0e9548d1f484da6df6c182676b<SEP>chunk-18d968b78afe916b419c1b5973421ebe + /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf + 1779012007 + + + + 组织安排 + concept + 组织安排refers to organizational arrangements for employee training, relocation, + chunk-afc57a0e9548d1f484da6df6c182676b + /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf + 1779012007 + + + + Company + organization + The company is an organization that establishes expenditure management principles, approval authority, and departmental responsibilities for financial operations. + chunk-74c01decac4a10cd40a491786743b0ee + /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf + 1779012007 + + + + Management Personnel At All Levels + person + Management personnel at all levels should fulfill expenditure reimbursement approval authority within authorized approval scope and responsibilities, bearing approval responsibilities. + chunk-74c01decac4a10cd40a491786743b0ee + /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf + 1779012007 + + + + Centralized Management department + organization + The centralized management department is responsible for determining expenditure scope, standards, methods, and management processes for various expenditure businesses based on business management needs. + chunk-74c01decac4a10cd40a491786743b0ee + /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf + 1779012007 + + + + Planning and Finance Department + organization + The Planning and Finance Department is responsible for clarifying expenditure reimbursement approval processes, audit points, and reimbursement documentation standards. + chunk-74c01decac4a10cd40a491786743b0ee + /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf + 1779012007 + + + + Operating Department Individual + person + The operating department (individual) is responsible for conducting expenditure business activities within departmental job responsibilities and authorized business scope, adhering to budget-first, thrifty, and benefit-priority principles. + chunk-74c01decac4a10cd40a491786743b0ee + /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf + 1779012008 + + + + Operator + person + The operator should timely fill out system documents, submit business original documents, obtain real, compliant, related, and complete business original documents, and verify invoice authenticity. + chunk-74c01decac4a10cd40a491786743b0ee + /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf + 1779012009 + + + + First Approver + person + The first approver should comprehensively audit the authenticity, compliance, necessity, and rationality of expenditure business, and bear approval responsibility. + chunk-74c01decac4a10cd40a491786743b0ee + /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf + 1779012009 + + + + Subsequent Approver + person + The subsequent approver should audit the necessity and rationality of expenditure business, and bear approval responsibility. + chunk-74c01decac4a10cd40a491786743b0ee + /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf + 1779012009 + + + + Financial Information System + artifact + The financial information system is the platform through which expenditure reimbursement applications are submitted via system documents. + chunk-74c01decac4a10cd40a491786743b0ee + /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf + 1779012009 + + + + Business Original Documents + data + Business original documents are the supporting materials for expenditure reimbursement, including invoices and related vouchers that must be complete, compliant, related, and complete. + chunk-74c01decac4a10cd40a491786743b0ee + /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf + 1779012009 + + + + VAT Special Invoice + content + VAT special invoice is a tax document required for most expenditures, and if not obtained when required, the operator should explain the reason in the system document. + chunk-74c01decac4a10cd40a491786743b0ee + /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf + 1779011997 + + + + Expenditure Reimbursement Application + concept + The expenditure reimbursement application is submitted through the financial information system, and financial原则上does not accept paper application documents. + chunk-74c01decac4a10cd40a491786743b0ee + /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf + 1779011997 + + + + Expenditure Authorization Approval Scope + concept + Expenditure authorization approval scope refers to the authorized limits for expenditure approval at various management levels. + chunk-74c01decac4a10cd40a491786743b0ee + /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf + 1779011997 + + + + Separation of Approval and Processing Principle + concept + The separation of approval and processing principle requires that the expenditure operator and approver cannot be the same person. + chunk-74c01decac4a10cd40a491786743b0ee + /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf + 1779011998 + + + + Three Flows Consistency Principle + concept + The three flows consistency principle requires alignment of invoice flow, capital flow, and material flow during business operations. + chunk-74c01decac4a10cd40a491786743b0ee + /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf + 1779011998 + + + + Employee Remuneration + concept + Employee remuneration is a type of expenditure that does not require tax authority-recognized invoices for reimbursement. + chunk-74c01decac4a10cd40a491786743b0ee + /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf + 1779011998 + + + + Personal Service Compensation + concept + Personal service compensation is a type of expenditure that does not require tax authority-recognized invoices for reimbursement. + chunk-74c01decac4a10cd40a491786743b0ee + /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf + 1779011999 + + + + Travel Allowance + concept + Travel allowance is a type of expenditure that does not require tax authority-recognized invoices for reimbursement. + chunk-74c01decac4a10cd40a491786743b0ee + /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf + 1779011999 + + + + Special Subsidy + concept + Special subsidy is a type of expenditure that does not require tax authority-recognized invoices for reimbursement. + chunk-74c01decac4a10cd40a491786743b0ee + /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf + 1779011999 + + + + Current Account Payment + concept + Current account payment is a type of expenditure that does not require tax authority-recognized invoices for reimbursement. + chunk-74c01decac4a10cd40a491786743b0ee + /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf + 1779011999 + + + + Trade Union Fund + concept + Trade union fund is a type of expenditure exempt from VAT special invoice requirements. + chunk-74c01decac4a10cd40a491786743b0ee + /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf + 1779012000 + + + + Employee Welfare + concept + Employee welfare is a type of expenditure exempt from VAT special invoice requirements. + chunk-74c01decac4a10cd40a491786743b0ee + /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf + 1779012000 + + + + Staff Activities + concept + Staff activities is a type of expenditure exempt from VAT special invoice requirements. + chunk-74c01decac4a10cd40a491786743b0ee + /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf + 1779012000 + + + + Business Entertainment + concept + Business entertainment is a type of expenditure exempt from VAT special invoice requirements. + chunk-74c01decac4a10cd40a491786743b0ee + /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf + 1779012000 + + + + Transportation Tickets + concept + Transportation tickets is a type of expenditure exempt from VAT special invoice requirements. + chunk-74c01decac4a10cd40a491786743b0ee + /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf + 1779012000 + + + + Government Fees + concept + Government fees is a type of expenditure exempt from VAT special invoice requirements. + chunk-74c01decac4a10cd40a491786743b0ee + /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf + 1779012000 + + + + Tax Control System Details + data + Tax control system details is a supplementary document required for aggregated VAT invoices. + chunk-74c01decac4a10cd40a491786743b0ee + /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf + 1779012000 + + + + Three Working Days Deadline + concept + The three working days deadline refers to the timeframe within which the operator must supplement incomplete business original documents after financial review. + chunk-74c01decac4a10cd40a491786743b0ee + /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf + 1779012000 + + + + 广告费 + concept + 广告费是指公司通过各种公开媒体宣传所发生的费用,报销时应附广告投放等业务佐证材料。 + chunk-e9438f69c9e221d9f0f00a05ad84eac6<SEP>chunk-d26b288ed4001dc5c504dce0eb841362 + /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf + 1779012000 + + + + 业务宣传费 + concept + 业务宣传费是指公司自身开展宣传与营销活动所发生的费用,包括未通过媒体传播的广告性支出,以及发放的印有公司标志的礼品、纪念品等。 + chunk-e9438f69c9e221d9f0f00a05ad84eac6<SEP>chunk-d26b288ed4001dc5c504dce0eb841362 + /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf + 1779012001 + + + + 培训费 + concept + Training expenses is a category of expenditure managed under the measures.<SEP>培训费是指公司安排、主办或承办培训发生的学费、书籍杂费、师资费、资料费、场地费、设备材料费、住宿费、交通费等,以及员工根据工作需要,经归口管理部门批准参加外部培训、考证、教育产生的相关费用。 + chunk-e9438f69c9e221d9f0f00a05ad84eac6<SEP>chunk-dd87aa5bc62cc9587ecb4c26d35a5263 + /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf + 1779012001 + + + + 通信费 + concept + Communication fees is a category of expenditure managed under the measures.<SEP>通信费是指为满足公司日常办公需要发生的电话、传真、集团网、网络连接等支出。 + chunk-e9438f69c9e221d9f0f00a05ad84eac6<SEP>chunk-dd87aa5bc62cc9587ecb4c26d35a5263 + /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf + 1779012002 + + + + 邮递费 + concept + 邮递费是指公司因业务需要邮递物品而支付的费用,包括邮件费、托运费、快递费等。 + chunk-e9438f69c9e221d9f0f00a05ad84eac6 + /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf + 1779012004 + + + + 薪酬福利支出 + concept + 薪酬福利支出是指公司相关制度规定的职工薪资、奖励提成、福利费支出,以及临时的奖励及福利支出。 + chunk-e9438f69c9e221d9f0f00a05ad84eac6 + /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf + 1779012005 + + + + 对外捐赠支出 + concept + 对外捐赠支出是指公司对外捐赠的费用,由品牌及市场运营中心归口管理,需严格预算单控。 + chunk-e9438f69c9e221d9f0f00a05ad84eac6 + /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf + 1779012005 + + + + 涉外业务汇率标准 + concept + 涉外业务汇率标准规定以外币结算时按支付凭据所载汇率折算,未载明汇率的按中国银行外汇折算价执行。 + chunk-e9438f69c9e221d9f0f00a05ad84eac6 + /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf + 1779012005 + + + + 公司员工教育培训管理办法 + content + 《公司员工教育培训管理办法》是规定培训费报销资格认定标准的制度文件。 + chunk-e9438f69c9e221d9f0f00a05ad84eac6 + /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf + 1779012006 + + + + 公司员工因公通讯费用实施细则 + content + 《公司员工因公通讯费用实施细则》是规定员工通讯费执行标准的制度文件。 + chunk-e9438f69c9e221d9f0f00a05ad84eac6 + /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf + 1779012006 + + + + 公司团建管理办法 + content + 《公司团建管理办法》是规定职工活动支出执行标准的制度文件。 + chunk-e9438f69c9e221d9f0f00a05ad84eac6 + /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf + 1779012006 + + + + 工会经费管理办法 + content + 《工会经费管理办法》是规定职工活动支出执行标准的制度文件。 + chunk-e9438f69c9e221d9f0f00a05ad84eac6 + /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf + 1779012006 + + + + 中国银行外汇折算价 + data + 中国银行外汇折算价是涉外业务汇率折算的标准依据。 + chunk-e9438f69c9e221d9f0f00a05ad84eac6 + /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf + 1779012019 + + + + 中国外汇交易中心参考汇率 + data + 中国外汇交易中心参考汇率是中国银行无折算价币种的备选汇率依据。 + chunk-e9438f69c9e221d9f0f00a05ad84eac6 + /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf + 1779012007 + + + + 第十七条 + concept + 第十七条规定培训费的定义、范围及报销标准。 + chunk-e9438f69c9e221d9f0f00a05ad84eac6 + /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf + 1779012008 + + + + 第十八条 + concept + 第十八条规定通信费的定义及执行标准。 + chunk-e9438f69c9e221d9f0f00a05ad84eac6 + /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf + 1779012008 + + + + 第十九条 + concept + 第十九条规定邮递费的定义及报销凭据要求。 + chunk-e9438f69c9e221d9f0f00a05ad84eac6 + /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf + 1779012008 + + + + 第二十条 + concept + 第二十条规定薪酬福利支出的分类、执行标准及审批程序。 + chunk-e9438f69c9e221d9f0f00a05ad84eac6 + /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf + 1779012008 + + + + 第二十一条 + concept + 第二十一条规定对外捐赠支出的归口管理、预算控制及审批流程。 + chunk-e9438f69c9e221d9f0f00a05ad84eac6 + /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf + 1779012009 + + + + 第二十二条 + concept + 第二十二条规定涉外业务汇率标准及结算方式。 + chunk-e9438f69c9e221d9f0f00a05ad84eac6 + /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf + 1779012009 + + + + 第二十三条 + concept + 第二十三条规定办法的归口管理部门及实施时间。 + chunk-e9438f69c9e221d9f0f00a05ad84eac6 + /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf + 1779012009 + + + + 第二十四条 + concept + 第二十四条规定办法的附件内容。 + chunk-e9438f69c9e221d9f0f00a05ad84eac6 + /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf + 1779012009 + + + + 附表1:员工支出报销审批权限表 + content + 附表1规定了员工支出报销的审批权限表,明确各部门经理、总监、副总裁等审批层级及权限。 + chunk-e9438f69c9e221d9f0f00a05ad84eac6 + /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf + 1779012009 + + + + 附表2:岗位支出报销审批权限表 + content + 附表2规定了岗位支出报销的审批权限表。 + chunk-e9438f69c9e221d9f0f00a05ad84eac6 + /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf + 1779012011 + + + + 附表3:支出归口管理部门与归口业务范围 + content + 附表3规定了支出归口管理部门及其对应的业务范围。 + chunk-e9438f69c9e221d9f0f00a05ad84eac6 + /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf + 1779012011 + + + + 业务招待 + concept + 业务招待是员工支出类别之一,对应审批权限额度分别为0.5万元、1万元、2万元、3万元、15万元。<SEP>业务招待是报销审批权限表中的支出项目类别。 + chunk-e9438f69c9e221d9f0f00a05ad84eac6<SEP>chunk-9841d66d8fb8548aab40220663a51693 + /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf + 1779012012 + + + + 报销资格 + concept + 报销资格是指员工申请费用报销所需满足的条件和标准。 + chunk-e9438f69c9e221d9f0f00a05ad84eac6 + /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf + 1779012012 + + + + 捐赠申请 + concept + 捐赠申请是指业务部门向公司提出对外捐赠申请的文件,需说明捐赠事由、对象、金额等内容。 + chunk-e9438f69c9e221d9f0f00a05ad84eac6 + /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf + 1779012012 + + + + 预算调整决策程序 + concept + 预算调整决策程序是指针对未纳入预算的对外捐赠事项所履行的预算调整审批流程。 + chunk-e9438f69c9e221d9f0f00a05ad84eac6 + /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf + 1779012012 + + + + Departments And Units + organization + Departments and units are organizational entities within the company that must strictly enforce travel approval procedures and control the number and duration of business trips. + chunk-613d6dfd4c5e9c807229a3147f96b584 + /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf + 1779012012 + + + + Company Business Travel System + concept + The company business travel system is an internal approval platform through which employees below department deputy level must obtain pre-approval for business travel. + chunk-613d6dfd4c5e9c807229a3147f96b584 + /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf + 1779012012 + + + + Transportation Level Standards + concept + Transportation level standards is a table specifying the allowed transportation modes and classes for employees based on their rank for domestic and international travel. + chunk-613d6dfd4c5e9c807229a3147f96b584 + /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf + 1779012012 + + + + Hotel Accommodation Standards + concept + Hotel accommodation standards are tables specifying the maximum hotel accommodation expenses allowed for employees based on their rank and destination. + chunk-613d6dfd4c5e9c807229a3147f96b584 + /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf + 1779012013 + + + + Travel Allowance Standards + concept + Travel allowance standards are tables specifying the daily allowance amounts for employees, including meal allowances and basic travel allowances, categorized by travel destination. + chunk-613d6dfd4c5e9c807229a3147f96b584 + /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf + 1779012013 + + + + Company Property Rental Management + concept + Company property rental management refers to a policy document that governs the application and reimbursement standards for remote work housing. + chunk-613d6dfd4c5e9c807229a3147f96b584 + /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf + 1779012013 + + + + Business Trip Approval + concept + Business trip approval is a required procedural step that employees must follow before undertaking official travel. + chunk-613d6dfd4c5e9c807229a3147f96b584 + /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf + 1779012013 + + + + Company Leadership + person + Company leadership refers to the highest-ranking executives (P8 and above) who have the most generous travel expense standards. + chunk-613d6dfd4c5e9c807229a3147f96b584 + /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf + 1779012013 + + + + Senior Managers + person + Senior managers (P7 level) are executives with the second-highest travel expense standards after company leadership. + chunk-613d6dfd4c5e9c807229a3147f96b584 + /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf + 1779012014 + + + + Middle Managers + person + Middle managers (P5-P6 level) and external experts have moderate travel expense standards. + chunk-613d6dfd4c5e9c807229a3147f96b584 + /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf + 1779012014 + + + + Basic Level Managers + person + Basic level managers (P4) are supervisors with lower travel expense standards and additional approval requirements for air travel. + chunk-613d6dfd4c5e9c807229a3147f96b584 + /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf + 1779012015 + + + + Other Employees + person + Other employees (P1-P3 level) have the most restrictive travel expense standards and must fly economy class at 50% discount or below. + chunk-613d6dfd4c5e9c807229a3147f96b584 + /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf + 1779012015 + + + + Remote Work Housing + artifact + Remote work housing refers to accommodation provided to employees on long-term business travel assignments, governed by company rental management policies. + chunk-613d6dfd4c5e9c807229a3147f96b584 + /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf + 1779012015 + + + + Commercial Insurance + content + Commercial insurance including transportation insurance has been purchased by the company for employees, and insurance fees during business trips are non-reimbursable. + chunk-613d6dfd4c5e9c807229a3147f96b584 + /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf + 1779012015 + + + + Transportation Cost Reimbursement + concept + Transportation cost reimbursement covers expenses for air travel, train, ship, and other transportation modes based on employee rank and travel standards. + chunk-613d6dfd4c5e9c807229a3147f96b584 + /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf + 1779012016 + + + + Accommodation Cost Reimbursement + concept + Accommodation cost reimbursement covers hotel lodging expenses according to location category and employee rank, with approval required for excess amounts. + chunk-613d6dfd4c5e9c807229a3147f96b584 + /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf + 1779012016 + + + + Hong Kong, Macau, And Taiwan Region + location + Hong Kong, Macau, and Taiwan region is a specific travel destination category in the expense reimbursement tables, listed separately from domestic mainland destinations. + chunk-613d6dfd4c5e9c807229a3147f96b584 + /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf + 1779012016 + + + + Directly-Controlled Municipalities And Special Administrative Regions + location + Directly-controlled municipalities and special administrative regions refer to major cities like Beijing, Shanghai, Tianjin, Chongqing, and Shenzhen that have higher accommodation standards than provincial capitals. + chunk-613d6dfd4c5e9c807229a3147f96b584 + /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf + 1779012016 + + + + Provincial Capitals + location + Provincial capitals are cities designated as provincial-level administrative centers that have moderate accommodation standards in the policy. + chunk-613d6dfd4c5e9c807229a3147f96b584 + /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf + 1779012016 + + + + Other Areas + location + Other areas refer to locations outside directly-controlled municipalities, special administrative regions, and provincial capitals that have the lowest accommodation standards in the policy. + chunk-613d6dfd4c5e9c807229a3147f96b584 + /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf + 1779012017 + + + + Night High-Speed Rail Provision + concept + Night high-speed rail provision is a special allowance permitting employees to choose sleeper seats when traveling on high-speed trains for 6 hours or more at night. + chunk-613d6dfd4c5e9c807229a3147f96b584 + /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf + 1779012017 + + + + Taxi Usage Regulations + concept + Taxi usage regulations specify the limited circumstances under which taxi expenses can be reimbursed, including emergency official business, client接送, late night work after 22:00, and other special circumstances. + chunk-613d6dfd4c5e9c807229a3147f96b584 + /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf + 1779012017 + + + + Self-Driving Travel Provisions + concept + Self-driving travel provisions outline the reimbursement rules for road tolls, parking fees, fuel costs, and electricity expenses when employees use personal vehicles for business travel, with department head approval required. + chunk-613d6dfd4c5e9c807229a3147f96b584 + /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf + 1779012017 + + + + Remote Work Housing Rental Expenses + data + Remote work housing rental expenses include rent, initial housing configuration costs, property management fees, heating fees, utility and gas expenses including shared portions, and internet broadband fees. + chunk-613d6dfd4c5e9c807229a3147f96b584 + /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf + 1779012018 + + + + External Conference Accommodation + concept + External conference accommodation refers to hotel expenses when employees attend conferences or training sessions, which may be reimbursed at the conference organizer's stated standards if accommodations are uniformly arranged. + chunk-613d6dfd4c5e9c807229a3147f96b584 + /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf + 1779012018 + + + + 取消报销规定内容 + concept + The content about canceling reimbursement regulations refers to the removal of official vehicle subsidy-related expressions since the subsidy has been included in wages. + chunk-18d968b78afe916b419c1b5973421ebe + /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf + 1779012018 + + + + 新增规定内容 + concept + Newly added regulations content covers remote assignment allowance standards and standardized business travel booking procedures. + chunk-18d968b78afe916b419c1b5973421ebe + /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf + 1779012018 + + + + 商旅订票规范 + concept + Business travel booking standards specify that official business trips should use the commercial travel system for unified booking. + chunk-18d968b78afe916b419c1b5973421ebe + /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf + 1779012018 + + + + 审批权限变化情况 + concept + Changes in approval authority mainly involve adjusting bid security deposit approval limits and clarifying expense approval workflow procedures. + chunk-18d968b78afe916b419c1b5973421ebe + /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf + 1779012019 + + + + 投标保证金 + data + Bid security deposit is a type of expense requiring approval, with different approval limits assigned to different management levels. + chunk-18d968b78afe916b419c1b5973421ebe + /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf + 1779012019 + + + + 审批流转程序 + method + Approval workflow process is the multi-level approval rule based on organizational relationships, with provisions for special matters to bypass levels. + chunk-18d968b78afe916b419c1b5973421ebe + /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf + 1779012019 + + + + 出差规定 + concept + Business travel regulations define the reimbursement standards for transportation, meal allowances, and basic subsidies during transit periods. + chunk-18d968b78afe916b419c1b5973421ebe + /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf + 1779012019 + + + + 财务信息化系统 + method + Financial information system is the system used for submitting expense reimbursement applications electronically. + chunk-18d968b78afe916b419c1b5973421ebe + /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf + 1779012020 + + + + 支出报销申请与审批 + concept + Expenditure reimbursement application and approval is a key process regulated by the measures.<SEP>Expense reimbursement application and approval is a chapter of the regulations covering application methods and approval processes. + chunk-18d968b78afe916b419c1b5973421ebe<SEP>chunk-dd87aa5bc62cc9587ecb4c26d35a5263 + /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf + 1779012020 + + + + 重点支出管理规定 + concept + Key expense management regulations is a chapter covering petty cash loans, local transportation fees, and travel expenses. + chunk-18d968b78afe916b419c1b5973421ebe + /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf + 1779012020 + + + + 备用金借款 + concept + Petty cash loans is a category of key expenditure regulated by the measures.<SEP>备用金借款是公司借支给正式员工用于支付与公司经济业务相关且必须预支的费用,遵循"前款不清、后款不借"原则。<SEP>Petty cash loan is one of the key expense items regulated under the management provisions. + chunk-18d968b78afe916b419c1b5973421ebe<SEP>chunk-dd87aa5bc62cc9587ecb4c26d35a5263<SEP>chunk-061324cc36078214691a6fc1cd0aaeea + /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf + 1779012020 + + + + 市内交通费 + concept + Local transportation fees is a category of expenditure managed under the measures.<SEP>市内交通费指员工为公司生产经营活动在工作所在地发生的交通费用,不包括正常上下班交通费。<SEP>Local transportation fees are regulated under the key expense management provisions. + chunk-18d968b78afe916b419c1b5973421ebe<SEP>chunk-dd87aa5bc62cc9587ecb4c26d35a5263<SEP>chunk-061324cc36078214691a6fc1cd0aaeea + /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf + 1779012022 + + + + 审批权限表 + content + Approval authority table is an attachment showing approval limits for different management positions regarding bid security deposits. + chunk-18d968b78afe916b419c1b5973421ebe + /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf + 1779012022 + + + + 1 Yuan Per Person Per Kilometer Reimbursement + data + 1 yuan per person per kilometer reimbursement standard is the new rule for official vehicle subsidy calculation, with amounts exceeding the standard to be borne by the employee. + chunk-18d968b78afe916b419c1b5973421ebe + /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf + 1779012023 + + + + Official Vehicle Subsidy + content + Official vehicle subsidy has been included in wages, leading to the cancellation of related reimbursement regulations. + chunk-18d968b78afe916b419c1b5973421ebe + /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf + 1779012023 + + + + Department Manager + person + Department Manager is a management position with approval authority for bid security deposits up to 50,000 yuan. + chunk-18d968b78afe916b419c1b5973421ebe + /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf + 1779012023 + + + + Director + person + Director is a management position with approval authority for bid security deposits up to 50,000 yuan. + chunk-18d968b78afe916b419c1b5973421ebe + /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf + 1779012023 + + + + First-Level Department General Manager + person + First-Level Department General Manager is a management position with approval authority for bid security deposits up to 50,000 yuan. + chunk-18d968b78afe916b419c1b5973421ebe + /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf + 1779012023 + + + + Institution General Manager + person + Institution General Manager is a management position with approval authority for bid security deposits up to 50,000 yuan. + chunk-18d968b78afe916b419c1b5973421ebe + /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf + 1779012023 + + + + Business Division General Manager + person + Business Division General Manager is a management position with approval authority for bid security deposits up to 50,000 yuan. + chunk-18d968b78afe916b419c1b5973421ebe + /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf + 1779012023 + + + + Vice President + person + Vice President is a senior management position with approval authority for bid security deposits up to 100,000 yuan. + chunk-18d968b78afe916b419c1b5973421ebe + /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf + 1779012023 + + + + Chief Engineer + person + Chief Engineer is a senior management position with approval authority for bid security deposits up to 100,000 yuan. + chunk-18d968b78afe916b419c1b5973421ebe + /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf + 1779012023 + + + + Senior Vice President + person + Senior Vice President is a senior management position with approval authority for bid security deposits up to 200,000 yuan. + chunk-18d968b78afe916b419c1b5973421ebe + /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf + 1779012024 + + + + President + person + President is the highest executive position with approval authority for bid security deposits up to 500,000 yuan. + chunk-18d968b78afe916b419c1b5973421ebe + /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf + 1779012024 + + + + Committee Chairpersons + person + Committee Chairpersons are senior management positions with approval authority for bid security deposits up to 200,000 yuan. + chunk-18d968b78afe916b419c1b5973421ebe + /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf + 1779012024 + + + + Bid Security Deposit Approval Limits Table + content + The bid security deposit approval limits table specifies different approval authority limits for various management positions, ranging from 50,000 to 5,000,000 yuan. + chunk-18d968b78afe916b419c1b5973421ebe + /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf + 1779012024 + + + + 50000 Yuan Approval Limit + data + 50,000 yuan is the bid security deposit approval limit for department managers, directors, and first-level department general managers. + chunk-18d968b78afe916b419c1b5973421ebe + /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf + 1779012024 + + + + 100000 Yuan Approval Limit + data + 100,000 yuan is the bid security deposit approval limit for vice presidents and chief engineers. + chunk-18d968b78afe916b419c1b5973421ebe + /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf + 1779012025 + + + + 200000 Yuan Approval Limit + data + 200,000 yuan is the bid security deposit approval limit for senior vice presidents and committee chairpersons. + chunk-18d968b78afe916b419c1b5973421ebe + /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf + 1779012025 + + + + 5000000 Yuan Approval Limit + data + 5,000,000 yuan is the bid security deposit approval limit for the president. + chunk-18d968b78afe916b419c1b5973421ebe + /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf + 1779012025 + + + + Commercial Travel System + method + Commercial travel system is the unified booking platform that should be used for official business travel arrangements. + chunk-18d968b78afe916b419c1b5973421ebe + /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf + 1779012026 + + + + Multi-Level Approval Rule + method + Multi-level approval rule is based on organizational relationships, requiring expenses to be approved sequentially through management levels. + chunk-18d968b78afe916b419c1b5973421ebe + /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf + 1779012026 + + + + Final Approval Position + person + Final approval position is the highest approval authority that can be bypassed for special matters after decision-making. + chunk-18d968b78afe916b419c1b5973421ebe + /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf + 1779012026 + + + + Company Hotel Accommodation Limit Standards + data + Company hotel accommodation limit + chunk-18d968b78afe916b419c1b5973421ebe + /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf + 1779012026 + + + + 公司支出管理办法(2024) + content + 公司支出管理办法(2024)is a regulation issued by远光软件股份有限公司to optimize expenditure and reimbursement standards, standardize approval processes, and prevent operational risks. + chunk-dd87aa5bc62cc9587ecb4c26d35a5263 + /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf + 1779012026 + + + + 国家电网公司 + organization + 国家电网公司is a reference entity whose management regulations are consulted in the development of the expenditure management measures. + chunk-dd87aa5bc62cc9587ecb4c26d35a5263 + /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf + 1779012038 + + + + 国网数科公司 + organization + 国网数科公司is a reference entity whose management regulations are consulted in the development of the expenditure management measures. + chunk-dd87aa5bc62cc9587ecb4c26d35a5263 + /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf + 1779012039 + + + + 办法 + concept + The original "Company Expenditure Management Measures" that has been superseded by the 2024 version. + chunk-dd87aa5bc62cc9587ecb4c26d35a5263 + /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf + 1779012039 + + + + 2024年4月17日 + event + 2024年4月17日is the date when the Company Expenditure Management Measures (2024) were issued by远光软件股份有限公司. + chunk-dd87aa5bc62cc9587ecb4c26d35a5263 + /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf + 1779012027 + + + + 预算先行 + concept + Budget-first is one of the core management principles in the expenditure management system, requiring expenditures to be within budget targets. + chunk-dd87aa5bc62cc9587ecb4c26d35a5263 + /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf + 1779012028 + + + + 厉行节约 + concept + Rigorous economy is a management principle requiring departments and positions to adhere to cost-saving and efficiency-first principles. + chunk-dd87aa5bc62cc9587ecb4c26d35a5263 + /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf + 1779012028 + + + + 分级授权 + concept + Hierarchical authorization is a management principle where management personnel exercise expenditure approval authority based on their positions. + chunk-dd87aa5bc62cc9587ecb4c26d35a5263 + /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf + 1779012028 + + + + 分类控制 + concept + Classified control is a management principle for standardized expenditure business activities. + chunk-dd87aa5bc62cc9587ecb4c26d35a5263 + /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf + 1779012028 + + + + 批办分离 + concept + Separation of approval and execution is a management principle in the expenditure management system. + chunk-dd87aa5bc62cc9587ecb4c26d35a5263 + /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf + 1779012029 + + + + 业务招待费 + concept + Business entertainment expenses is a category of expenditure managed under the measures.<SEP>业务招待费是指各级单位正常生产经营管理过程中需要发生的、用于必要招待的各项费用,包括用于接待客户和相关单位的餐饮等合理支出。 + chunk-dd87aa5bc62cc9587ecb4c26d35a5263<SEP>chunk-d26b288ed4001dc5c504dce0eb841362 + /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf + 1779012029 + + + + 会议费 + concept + Meeting expenses is a category of expenditure managed under the measures.<SEP>会议费是指公司主办或承办会议发生的会场租金、文件资料、设备租金等支出,以及参加外部会议所发生的会务相关支出。 + chunk-dd87aa5bc62cc9587ecb4c26d35a5263<SEP>chunk-d26b288ed4001dc5c504dce0eb841362 + /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf + 1779012029 + + + + 广告宣传费 + concept + Advertising expenses is a category of expenditure managed under the measures. + chunk-dd87aa5bc62cc9587ecb4c26d35a5263<SEP>chunk-d26b288ed4001dc5c504dce0eb841362 + /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf + 1779012029 + + + + 控股子公司 + organization + 控股子公司is a controlled subsidiary of远光软件股份有限公司that should follow the expenditure management measures and report to计划财务部. + chunk-dd87aa5bc62cc9587ecb4c26d35a5263 + /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf + 1779012029 + + + + 分支机构 + organization + 分支机构refers to non-legal-person branches of远光软件股份有限公司included in the scope of the expenditure management measures. + chunk-dd87aa5bc62cc9587ecb4c26d35a5263 + /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf + 1779012029 + + + + 经办部门 + organization + 经办部门is a department or individual responsible for handling expenditure business activities under the measures. + chunk-dd87aa5bc62cc9587ecb4c26d35a5263 + /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf + 1779012029 + + + + 各级管理人员 + concept + 各级管理人员refers to management personnel at all levels who exercise expenditure approval authority within their authorization scope. + chunk-dd87aa5bc62cc9587ecb4c26d35a5263 + /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf + 1779012030 + + + + 归口管理部门 + organization + 归口管理部门is the central management department responsible for expenditure management under the measures. + chunk-dd87aa5bc62cc9587ecb4c26d35a5263 + /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf + 1779012044 + + + + 远光制度〔2024〕14号 + content + 远光制度〔2024〕14号is the document number assigned to the Company Expenditure Management Measures (2024) issued by远光软件股份有限公司. + chunk-dd87aa5bc62cc9587ecb4c26d35a5263 + /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf + 1779012044 + + + + 修订说明 + content + 修订说明is an appendix to the Company Expenditure Management Measures (2024) explaining the revisions made. + chunk-dd87aa5bc62cc9587ecb4c26d35a5263 + /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf + 1779012032 + + + + 员工支出报销审批权限表 + content + 员工支出报销审批权限表is an appendix table defining employee-level expenditure reimbursement approval authority.<SEP>员工支出报销审批权限表是一份规定公司员工各项支出报销审批层级的制度文件,详细列示了不同支出项目的审批权限金额标准。 + chunk-dd87aa5bc62cc9587ecb4c26d35a5263<SEP>chunk-9841d66d8fb8548aab40220663a51693 + /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf + 1779012032 + + + + 岗位支出报销审批权限表 + content + 岗位支出报销审批权限表is an appendix table defining position-level expenditure reimbursement approval authority.<SEP>岗位支出报销审批权限表是一份规定公司各岗位支出报销审批层级的制度文件,涵盖资本性支出、收益性支出、财务专用等类别。 + chunk-dd87aa5bc62cc9587ecb4c26d35a5263<SEP>chunk-9841d66d8fb8548aab40220663a51693 + /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf + 1779012032 + + + + 支出归口管理部门与归口业务范围 + content + 支出归口管理部门与归口业务范围is an appendix table defining the mapping between central management departments and their corresponding business scopes. + chunk-dd87aa5bc62cc9587ecb4c26d35a5263 + /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf + 1779012033 + + + + 效益优先 + concept + 效益优先is a management principle requiring departments and positions to prioritize efficiency in expenditure activities. + chunk-dd87aa5bc62cc9587ecb4c26d35a5263 + /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf + 1779012033 + + + + 公司各部门 + organization + 公司各部门refers to all departments within远光软件股份有限公司, which are recipients of the Company Expenditure Management Measures (2024). + chunk-dd87aa5bc62cc9587ecb4c26d35a5263 + /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf + 1779012033 + + + + 因公借款 + concept + 因公借款是员工支出类别之一,对应审批权限额度分别为0.5万元、1万元、2万元、3万元、15万元。 + chunk-9841d66d8fb8548aab40220663a51693 + /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf + 1779012033 + + + + 其他支出(员工) + concept + 其他支出是员工支出类别之一,对应审批权限额度分别为1万元、2万元、3万元、5万元、50万元,并包含差旅费、市内交通、客服及商务等补充说明。 + chunk-9841d66d8fb8548aab40220663a51693 + /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf + 1779012034 + + + + 资产采购 + concept + 资产采购属于资本性支出类别,包括固定资产、无形资产、低值易耗品采购,对应审批权限为1万元、2万元、10万元、15万元、200万元。 + chunk-9841d66d8fb8548aab40220663a51693 + /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf + 1779012034 + + + + 基建工程 + concept + 基建工程属于资本性支出类别,对应审批权限为5万元、10万元、50万元,但前两级审批权限为空。 + chunk-9841d66d8fb8548aab40220663a51693 + /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf + 1779012034 + + + + 股权投资、兼并收购 + concept + 股权投资、兼并收购属于资本性支出类别,全部审批权限为空,需由董事长单独审批。 + chunk-9841d66d8fb8548aab40220663a51693 + /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf + 1779012036 + + + + 材料采购 + concept + 材料采购属于收益性支出类别,包括生产采购(原材料、辅助材料、机物料)和项目采购(设备、软件、公有云资源),对应审批权限为10万元、20万元、30万元、500万元。 + chunk-9841d66d8fb8548aab40220663a51693 + /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf + 1779012036 + + + + 分包外包(内部单位) + concept + 分包外包(内部单位)属于收益性支出类别,包括研发、实施、运维、服务等分包外包,对应审批权限为10万元、20万元、30万元、500万元。 + chunk-9841d66d8fb8548aab40220663a51693 + /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf + 1779012036 + + + + 分包外包(外部单位) + concept + 分包外包(外部单位)属于收益性支出类别,包括委托加工、项目土建装修等,对应审批权限为10万元、20万元、30万元、200万元。 + chunk-9841d66d8fb8548aab40220663a51693 + /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf + 1779012036 + + + + 保证金 + concept + 保证金属于收益性支出类别,包括投标保证金、质保金、履约保证金及招标相关保证金,对应审批权限为5万元、50万元、100万元、200万元、500万元。 + chunk-9841d66d8fb8548aab40220663a51693 + /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf + 1779012036 + + + + 销售退款 + concept + 销售退款属于收益性支出类别,包括销售退款和代付款(代收后),对应审批权限为5万元、10万元、30万元、50万元、200万元。 + chunk-9841d66d8fb8548aab40220663a51693 + /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf + 1779012036 + + + + 房屋租金 + concept + 房屋租金属于收益性支出类别,不含水电及杂费,需经业务归口部门审批,对应审批权限为5万元、10万元、20万元、30万元、200万元。 + chunk-9841d66d8fb8548aab40220663a51693 + /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf + 1779012036 + + + + 基本出差补贴 + concept + 基本出差补贴是指出差期间每天给予的基本生活补助,标准为35元,适用于所有出差地区。 + chunk-d26b288ed4001dc5c504dce0eb841362 + /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf + 1779012048 + + + + 商旅系统 + artifact + 商旅系统是公司统一的差旅预订和审批平台,出差人员原则上应通过该系统预定交通和住宿,特殊情况未通过系统下单的应邮件知会商旅客服并抄送部门负责人。<SEP>商旅系统是公司用于事前审批员工出差申请的系统平台。 + chunk-d26b288ed4001dc5c504dce0eb841362<SEP>chunk-061324cc36078214691a6fc1cd0aaeea + /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf + 1779012049 + + + + 业务佐证材料 + data + 业务佐证材料是指用于证明出差真实性、费用合理性等的材料,包括登机牌、通行记录、支付记录、审批邮件、订单详情等。 + chunk-d26b288ed4001dc5c504dce0eb841362 + /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf + 1779012036 + + + + 探亲路费 + concept + 探亲路费是指员工因私回家探亲产生的交通费用,应遵循公司员工探亲管理办法规定,不得以因公差旅方式报销,不享受出差补贴。 + chunk-d26b288ed4001dc5c504dce0eb841362 + /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf + 1779012037 + + + + 调动工作 + event + 调动工作是指公司组织安排员工到异地挂职锻炼、培养锻炼、人才帮扶、借调支援等,在途期间按出差规定执行,在异地工作期间按组织人事部确定的标准执行。 + chunk-d26b288ed4001dc5c504dce0eb841362 + /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf + 1779012037 + + + + 直辖市 + location + 直辖市是中国行政区划的一种,指由中央政府直接管辖的城市,包括北京、上海、天津、重庆等。 + chunk-d26b288ed4001dc5c504dce0eb841362 + /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf + 1779012037 + + + + 特区 + location + 特区在这里指深圳等经济特区,是享有特殊经济政策的国家级区域。 + chunk-d26b288ed4001dc5c504dce0eb841362 + /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf + 1779012037 + + + + 西藏 + location + 西藏是中国的一个自治区,在差旅补贴标准中作为特殊地区标注,餐补标准为140元。 + chunk-d26b288ed4001dc5c504dce0eb841362 + /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf + 1779012037 + + + + 第十四条 + concept + 第十四条是公司差旅费报销规定中关于业务招待费的条款,定义了业务招待费的范围和报销要求。 + chunk-d26b288ed4001dc5c504dce0eb841362 + /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf + 1779012038 + + + + 第十五条 + concept + 第十五条是公司差旅费报销规定中关于会议费的条款,规定了公司主办或承办会议的报销标准。 + chunk-d26b288ed4001dc5c504dce0eb841362 + /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf + 1779012038 + + + + 第十六条 + concept + 第十六条是公司差旅费报销规定中关于广告宣传费的条款,包括广告费和业务宣传费的管理规定。 + chunk-d26b288ed4001dc5c504dce0eb841362 + /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf + 1779012038 + + + + 公司总裁 + person + 公司总裁是公司最高管理人员,负责批准预算调整申请。<SEP>公司总裁是公司最高管理层人员,对经费预算30000元及以上的内部会议、研讨与集中培训具有审批权限。 + chunk-d26b288ed4001dc5c504dce0eb841362<SEP>chunk-061324cc36078214691a6fc1cd0aaeea + /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf + 1779012038 + + + + 商旅客服 + person + 商旅客服是商旅系统的服务人员,负责处理差旅预订异常情况,未通过系统下单的需邮件知会。 + chunk-d26b288ed4001dc5c504dce0eb841362 + /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf + 1779012038 + + + + 公司员工探亲管理办法 + content + 《公司员工探亲管理办法》是公司制定的关于员工探亲路费报销的管理规定,探亲路费应严格遵循此办法。 + chunk-d26b288ed4001dc5c504dce0eb841362 + /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf + 1779012039 + + + + 增值税发票 + content + 增值税发票是指企业开具的税务发票,用于记录商品或服务的销售和税收信息。文中提到汇总开具的增值税发票应附税控系统明细清单。 + chunk-061324cc36078214691a6fc1cd0aaeea + /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf + 1779012039 + + + + 税控系统明细清单 + content + 税控系统明细清单是由税控系统生成的详细清单,汇总开具增值税发票时需要附上该清单。 + chunk-061324cc36078214691a6fc1cd0aaeea + /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf + 1779012039 + + + + 财务 + organization + 财务是指公司内部的财务部门,负责审核业务原始凭据、影像扫描、审核与支付等报销相关工作。 + chunk-061324cc36078214691a6fc1cd0aaeea + /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf + 1779012039 + + + + 经办人 + person + 经办人是指负责具体业务办理并提交报销申请的人员,需确保原始凭据完整并按时补充。 + chunk-061324cc36078214691a6fc1cd0aaeea + /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf + 1779012039 + + + + 业务原始凭据 + content + 业务原始凭据是指证明经济业务发生的原始文件,财务审核时需要检查其完整性。 + chunk-061324cc36078214691a6fc1cd0aaeea + /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf + 1779012039 + + + + 报销申请时限 + concept + 报销申请时限是指从业务完成日到附件影像资料挂接系统单据日的期间,公司各类支出报销结算申请时限为三个月。 + chunk-061324cc36078214691a6fc1cd0aaeea + /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf + 1779012039 + + + + 预付款项 + concept + 预付款项是指公司预先支付给员工或供应商的款项,原则上应在次月底前完成结算。 + chunk-061324cc36078214691a6fc1cd0aaeea + /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf + 1779012039 + + + + 公司 + organization + 公司是指雇用员工并制定报销政策的企业主体,通过公对私或公对公方式进行支出结算。 + chunk-061324cc36078214691a6fc1cd0aaeea<SEP>chunk-e9438f69c9e221d9f0f00a05ad84eac6 + /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf + 1779012040 + + + + 员工 + person + 员工是公司的正式成员,可以申请备用金借款、差旅费报销等支出业务。 + chunk-061324cc36078214691a6fc1cd0aaeea + /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf + 1779012040 + + + + 供应商 + organization + 供应商是公司采购商品或服务的外部合作方,岗位支出业务原则上采用公对公方式与其直接结算。 + chunk-061324cc36078214691a6fc1cd0aaeea + /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf + 1779012040 + + + + 支出报销审批 + event + 支出报销审批是指按照审批权限对报销申请进行审核批准的过程,包括预算内和预算外支出的不同审批流程。 + chunk-061324cc36078214691a6fc1cd0aaeea + /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf + 1779012041 + + + + 预算内支出 + concept + 预算内支出是指在已批准预算范围内的支出,按附表1、附表2执行审批权限。 + chunk-061324cc36078214691a6fc1cd0aaeea + /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf + 1779012042 + + + + 正式员工 + person + 正式员工是公司的正式成员,有资格申请备用金借款,非正式员工不得申请。 + chunk-061324cc36078214691a6fc1cd0aaeea + /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf + 1779012042 + + + + 分管领导 + person + 分管领导是负责特定业务领域的公司管理人员,需对季度不能及时报账核销的备用金借款进行延期审批。 + chunk-061324cc36078214691a6fc1cd0aaeea + /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf + 1779012042 + + + + 一万元 + data + 一万元是员工备用金借款额度的上限。 + chunk-061324cc36078214691a6fc1cd0aaeea + /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf + 1779012042 + + + + 出租车 + method + 出租车是市内交通出行方式之一,仅限紧急公务、接送客户、夜间工作至22:00后等特别情形使用。 + chunk-061324cc36078214691a6fc1cd0aaeea + /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf + 1779012042 + + + + 部门负责人 + person + 部门负责人负责从严管理出租车市内交通使用,确保符合使用规定。 + chunk-061324cc36078214691a6fc1cd0aaeea + /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf + 1779012042 + + + + 出差审批程序 + method + 出差审批程序是出差前必须完成的审批流程,各部门应严格执行以从严控制出差人数和天数。 + chunk-061324cc36078214691a6fc1cd0aaeea + /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf + 1779012042 + + + + 交通费 + concept + 交通费是差旅费的组成部分,包括出差发生的各种交通支出。 + chunk-061324cc36078214691a6fc1cd0aaeea + /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf + 1779012042 + + + + 住宿费 + concept + 住宿费是差旅费的组成部分,指出差期间的住宿支出。 + chunk-061324cc36078214691a6fc1cd0aaeea + /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf + 1779012043 + + + + 出差补贴 + concept + 出差补贴是差旅费的组成部分,用于补贴员工出差期间的相关开支。 + chunk-061324cc36078214691a6fc1cd0aaeea + /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf + 1779012043 + + + + 成本中心归属 + concept + 成本中心归属基于责任原则与受益原则确定,特殊情况由业务部门协商确定。 + chunk-061324cc36078214691a6fc1cd0aaeea + /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf + 1779012043 + + + + 责任原则 + concept + 责任原则是确定支出成本中心归属的原则之一。 + chunk-061324cc36078214691a6fc1cd0aaeea + /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf + 1779012043 + + + + 受益原则 + concept + 受益原则是确定支出成本中心归属的原则之一。 + chunk-061324cc36078214691a6fc1cd0aaeea + /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf + 1779012044 + + + + 结算起点 + data + 结算起点是1000元,低于此金额且无法直接结算的小额支出需附付款凭据截图。 + chunk-061324cc36078214691a6fc1cd0aaeea + /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf + 1779012044 + + + + Procurement Management Regulations + chunk-74c01decac4a10cd40a491786743b0ee + Operating departments must strictly follow company bidding, procurement, and material management regulations for procurement of materials and services. + UNKNOWN + /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf + 1779012081 + + + + Tax Authority Recognized Invoice + chunk-74c01decac4a10cd40a491786743b0ee + Expenditures other than employee remuneration, personal service compensation, travel allowance, special subsidy, and current account payment require tax authority-recognized invoices. + UNKNOWN + /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf + 1779012094 + + + + Financial Review + chunk-74c01decac4a10cd40a491786743b0ee + Financial review can reject applications if documents are incomplete, incorrectly filled, or non-compliant. + UNKNOWN + /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf + 1779012085 + + + + 总裁办 + content + 总裁办is the official product name for the无单报销system, designed as a shadow ERP tool positioned in front of the main ERP system.<SEP>总裁办is the product name for this expense reporting tool, functioning as a "Shadow ERP" that serves as a frontend interface preceding the existing ERP system, acting as its database and archive. + chunk-2187fa0609874bdda339c9850da45a26<SEP>chunk-07de6ea74f60535b689f977295770273 + /app/server/storage/knowledge/报销制度/a8f8465df08e455ebe133351721d49f8__无单需求文档0506.docx + 1779379010 + + + + 采购专员 + person + 采购专员is an AI assistant role responsible for procurement process management, supplier evaluation, and procurement execution.<SEP>采购专员is a procurement specialist role within the system, responsible for handling procurement matters following established processes. + chunk-2187fa0609874bdda339c9850da45a26<SEP>chunk-07de6ea74f60535b689f977295770273 + /app/server/storage/knowledge/报销制度/a8f8465df08e455ebe133351721d49f8__无单需求文档0506.docx + 1779379010 + + + + 用户中心 + concept + 用户中心is Module 4 that provides user profile management, including username, organization affiliation, settings, and logout functionality. + chunk-2187fa0609874bdda339c9850da45a26 + /app/server/storage/knowledge/报销制度/a8f8465df08e455ebe133351721d49f8__无单需求文档0506.docx + 1779379010 + + + + 用户菜单 + content + 用户菜单is the dropdown menu displayed when clicking the user avatar, showing username, organization, settings, and logout options. + chunk-2187fa0609874bdda339c9850da45a26 + /app/server/storage/knowledge/报销制度/a8f8465df08e455ebe133351721d49f8__无单需求文档0506.docx + 1779379010 + + + + 扫码上传 + concept + 扫码上传is Module 5 enabling file upload functionality through scanning QR codes via mini-program codes in the activity bar, main content area, or bottom floating buttons. + chunk-2187fa0609874bdda339c9850da45a26 + /app/server/storage/knowledge/报销制度/a8f8465df08e455ebe133351721d49f8__无单需求文档0506.docx + 1779379010 + + + + 状态栏 + concept + 状态栏is Module 6 located at the bottom of the interface, displaying row/column number, UTF-8 encoding, and the current workbench name "总裁办".<SEP>状态栏is a UI status bar component with a specified height of 22 pixels. + chunk-2187fa0609874bdda339c9850da45a26<SEP>chunk-2224d777c0b72d0b2dab622c79096c2c + /app/server/storage/knowledge/报销制度/a8f8465df08e455ebe133351721d49f8__无单需求文档0506.docx + 1779379010 + + + + Ashy有限公司 + organization + Ashy有限公司is the organization name displayed in the user center, representing the company entity to which the current user belongs. + chunk-2187fa0609874bdda339c9850da45a26 + /app/server/storage/knowledge/报销制度/a8f8465df08e455ebe133351721d49f8__无单需求文档0506.docx + 1779379010 + + + + 无单报销工具 + content + 无单报销工具is the product positioning for this tool, designed to solve existing ERP usage experience problems. + chunk-2187fa0609874bdda339c9850da45a26 + /app/server/storage/knowledge/报销制度/a8f8465df08e455ebe133351721d49f8__无单需求文档0506.docx + 1779379010 + + + + 影子ERP + concept + 影子ERP (Shadow Ledger) is the system positioning for总裁办, which operates as a frontend tool that handles operations while using ERP as the backend database and archive.<SEP>影子ERP (Shadow Ledger) is a product alias describing how this tool operates as a frontend positioned before the existing ERP system, using ERP as its database and archive backend. + chunk-2187fa0609874bdda339c9850da45a26<SEP>chunk-07de6ea74f60535b689f977295770273 + /app/server/storage/knowledge/报销制度/a8f8465df08e455ebe133351721d49f8__无单需求文档0506.docx + 1779379010 + + + + 零报销 + concept + 零报销(Zero-Expense) is a product alias emphasizing that once business is organized, reimbursement and accounting are complete, making reimbursement essentially "disappear" rather than just becoming faster.<SEP>零报销(Zero-Expense) is a product alias representing the philosophy that business completion equals reimbursement and accounting, making reimbursement disappear rather than faster. + chunk-2187fa0609874bdda339c9850da45a26<SEP>chunk-07de6ea74f60535b689f977295770273 + /app/server/storage/knowledge/报销制度/a8f8465df08e455ebe133351721d49f8__无单需求文档0506.docx + 1779379010 + + + + 即效合规 + concept + 即效合规is a product alias for the无单报销system, emphasizing strict compliance with financial risk control boundaries and delivering out-of-the-box professional financial business capabilities.<SEP>即效合规is a product feature emphasizing strict adherence to financial risk control boundaries and immediate financial compliance. + chunk-2187fa0609874bdda339c9850da45a26<SEP>chunk-07de6ea74f60535b689f977295770273 + /app/server/storage/knowledge/报销制度/a8f8465df08e455ebe133351721d49f8__无单需求文档0506.docx + 1779379010 + + + + ERP系统 + system + ERP系统is the existing backend system that serves as the database and archive for the expense reporting tool. + chunk-2187fa0609874bdda339c9850da45a26 + /app/server/storage/knowledge/报销制度/a8f8465df08e455ebe133351721d49f8__无单需求文档0506.docx + 1779379010 + + + + 标题栏 + artifact + 标题栏is the title bar component at the top of the interface with a height of 35px. + chunk-2187fa0609874bdda339c9850da45a26 + /app/server/storage/knowledge/报销制度/a8f8465df08e455ebe133351721d49f8__无单需求文档0506.docx + 1779379010 + + + + 活动栏 + artifact + 活动栏is the activity bar component on the left side of the interface with a height of 50px. + chunk-2187fa0609874bdda339c9850da45a26 + /app/server/storage/knowledge/报销制度/a8f8465df08e455ebe133351721d49f8__无单需求文档0506.docx + 1779379010 + + + + 侧边栏 + artifact + 侧边栏is the sidebar component of the interface with a width of 250px and supports collapsing functionality. + chunk-2187fa0609874bdda339c9850da45a26 + /app/server/storage/knowledge/报销制度/a8f8465df08e455ebe133351721d49f8__无单需求文档0506.docx + 1779379010 + + + + 底部对话栏 + artifact + 底部对话栏is the bottom dialog bar component with variable height (280px expanded, approximately 44px collapsed). + chunk-2187fa0609874bdda339c9850da45a26 + /app/server/storage/knowledge/报销制度/a8f8465df08e455ebe133351721d49f8__无单需求文档0506.docx + 1779379010 + + + + 报销流程 + method + 报销流程is the reimbursement process workflow consisting of initiating items, uploading vouchers, generating time tracks, AI preliminary review, modification (loop), and submitting reimbursement. + chunk-2187fa0609874bdda339c9850da45a26 + /app/server/storage/knowledge/报销制度/a8f8465df08e455ebe133351721d49f8__无单需求文档0506.docx + 1779379010 + + + + 凭证处理流程 + method + 凭证处理流程is the voucher handling process + chunk-2187fa0609874bdda339c9850da45a26 + /app/server/storage/knowledge/报销制度/a8f8465df08e455ebe133351721d49f8__无单需求文档0506.docx + 1779379010 + + + + 无单报销 + concept + 无单报销is a product tool that uses AI to automate expense reimbursement processes, eliminating the need for traditional manual documentation by shifting from "people adapting to systems" to "systems adapting to people". + chunk-07de6ea74f60535b689f977295770273 + /app/server/storage/knowledge/报销制度/a8f8465df08e455ebe133351721d49f8__无单需求文档0506.docx + 1779379010 + + + + ERP + concept + ERP (Enterprise Resource Planning) is the legacy system that serves as the backend database and archiving system for the无单报销tool. + chunk-07de6ea74f60535b689f977295770273 + /app/server/storage/knowledge/报销制度/a8f8465df08e455ebe133351721d49f8__无单需求文档0506.docx + 1779379010 + + + + 大型企业 + organization + 大型企业is the target customer segment for the无单报销product, addressing issues with existing ERP user experience. + chunk-07de6ea74f60535b689f977295770273 + /app/server/storage/knowledge/报销制度/a8f8465df08e455ebe133351721d49f8__无单需求文档0506.docx + 1779379010 + + + + 业务人员 + person + 业务人员are non-finance professionals who serve as the primary users of the无单报销system, initiating expense reimbursement requests. + chunk-07de6ea74f60535b689f977295770273 + /app/server/storage/knowledge/报销制度/a8f8465df08e455ebe133351721d49f8__无单需求文档0506.docx + 1779379010 + + + + 行政秘书 + person + 行政秘书is an AI assistant role responsible for administrative affairs management including scheduling, meeting organization, and external reception, supporting the efficient operation of总裁办. + chunk-07de6ea74f60535b689f977295770273 + /app/server/storage/knowledge/报销制度/a8f8465df08e455ebe133351721d49f8__无单需求文档0506.docx + 1779379010 + + + + 费控专责 + person + 费控专责is an AI assistant role responsible for expense review and control, ensuring reimbursement complies with company policies and budget requirements. + chunk-07de6ea74f60535b689f977295770273 + /app/server/storage/knowledge/报销制度/a8f8465df08e455ebe133351721d49f8__无单需求文档0506.docx + 1779379010 + + + + 财务BP + person + 财务BP is an AI assistant role serving as a Finance Business Partner, providing financial support and professional advice to business departments. + chunk-07de6ea74f60535b689f977295770273 + /app/server/storage/knowledge/报销制度/a8f8465df08e455ebe133351721d49f8__无单需求文档0506.docx + 1779379010 + + + + Web端 + concept + Web端refers to the product type of the无单报销system, indicating it is a web-based application. + chunk-07de6ea74f60535b689f977295770273 + /app/server/storage/knowledge/报销制度/a8f8465df08e455ebe133351721d49f8__无单需求文档0506.docx + 1779379010 + + + + AI + concept + AI (Artificial Intelligence) is the core technology enabling the shift from "people adapting to systems" to "systems adapting to people" in the expense reimbursement process. + chunk-07de6ea74f60535b689f977295770273 + /app/server/storage/knowledge/报销制度/a8f8465df08e455ebe133351721d49f8__无单需求文档0506.docx + 1779379010 + + + + UI Layout + concept + UI Layout refers to the overall system interface structure including title bar, activity bar, sidebar, main content area, and status bar with specific pixel dimensions. + chunk-07de6ea74f60535b689f977295770273 + /app/server/storage/knowledge/报销制度/a8f8465df08e455ebe133351721d49f8__无单需求文档0506.docx + 1779379010 + + + + Title Bar + concept + Title Bar is a UI component with a height of 35px serving as the top header of the system interface. + chunk-07de6ea74f60535b689f977295770273 + /app/server/storage/knowledge/报销制度/a8f8465df08e455ebe133351721d49f8__无单需求文档0506.docx + 1779379010 + + + + Activity Bar + concept + Activity Bar is a UI component with a width of 50px located on the left side of the system interface. + chunk-07de6ea74f60535b689f977295770273 + /app/server/storage/knowledge/报销制度/a8f8465df08e455ebe133351721d49f8__无单需求文档0506.docx + 1779379011 + + + + Sidebar + concept + Sidebar is a UI component with a width of 250px positioned between the activity bar and main content area. + chunk-07de6ea74f60535b689f977295770273 + /app/server/storage/knowledge/报销制度/a8f8465df08e455ebe133351721d49f8__无单需求文档0506.docx + 1779379011 + + + + Main Content Area + concept + Main Content Area is the central UI component containing the main content region and an optional expandable bottom dialog bar. + chunk-07de6ea74f60535b689f977295770273 + /app/server/storage/knowledge/报销制度/a8f8465df08e455ebe133351721d49f8__无单需求文档0506.docx + 1779379011 + + + + Status Bar + concept + Status Bar is a UI component at the bottom of the interface with a height of 22px. + chunk-07de6ea74f60535b689f977295770273 + /app/server/storage/knowledge/报销制度/a8f8465df08e455ebe133351721d49f8__无单需求文档0506.docx + 1779379011 + + + + Bottom Dialog Bar + concept + Bottom Dialog Bar is an optional expandable component within the main content area for user interaction. + chunk-07de6ea74f60535b689f977295770273 + /app/server/storage/knowledge/报销制度/a8f8465df08e455ebe133351721d49f8__无单需求文档0506.docx + 1779379011 + + + + 菜单1 + concept + 菜单1 is a menu category + chunk-07de6ea74f60535b689f977295770273 + /app/server/storage/knowledge/报销制度/a8f8465df08e455ebe133351721d49f8__无单需求文档0506.docx + 1779379011 + + + + 商旅预订 + concept + 商旅预订is a tag or label used in the system for business travel bookings. + chunk-1746bd83138e85e66a78e0cb9ad79272 + /app/server/storage/knowledge/报销制度/a8f8465df08e455ebe133351721d49f8__无单需求文档0506.docx + 1779379011 + + + + 线下自付 + concept + 线下自付is a tag or label used in the system for offline self-payment scenarios. + chunk-1746bd83138e85e66a78e0cb9ad79272 + /app/server/storage/knowledge/报销制度/a8f8465df08e455ebe133351721d49f8__无单需求文档0506.docx + 1779379011 + + + + 凭证识别 + method + 凭证识别is a feature that automatically identifies and extracts information from receipt thumbnails, displaying fields such as receipt title, recognition results, invoice type, and compliance check status. + chunk-1746bd83138e85e66a78e0cb9ad79272 + /app/server/storage/knowledge/报销制度/a8f8465df08e455ebe133351721d49f8__无单需求文档0506.docx + 1779379011 + + + + 凭证缩略图 + content + 凭证缩略图is a clickable interface element that displays receipt images and provides access to auto-recognized receipt information. + chunk-1746bd83138e85e66a78e0cb9ad79272 + /app/server/storage/knowledge/报销制度/a8f8465df08e455ebe133351721d49f8__无单需求文档0506.docx + 1779379011 + + + + 火车票 + content + 火车票is a supported receipt type with recognition fields including departure location, destination, train number, seat, price, and date. + chunk-1746bd83138e85e66a78e0cb9ad79272 + /app/server/storage/knowledge/报销制度/a8f8465df08e455ebe133351721d49f8__无单需求文档0506.docx + 1779379011 + + + + 出租车发票及行程单 + content + 出租车发票及行程单is a supported receipt type with recognition fields including vehicle number, date, time, origin, destination, and amount. + chunk-1746bd83138e85e66a78e0cb9ad79272 + /app/server/storage/knowledge/报销制度/a8f8465df08e455ebe133351721d49f8__无单需求文档0506.docx + 1779379011 + + + + 住宿发票及流水 + content + 住宿发票及流水is a supported receipt type with recognition fields including hotel name, check-in date, check-out date, number of days, room type, and amount. + chunk-1746bd83138e85e66a78e0cb9ad79272 + /app/server/storage/knowledge/报销制度/a8f8465df08e455ebe133351721d49f8__无单需求文档0506.docx + 1779379011 + + + + 公共交通发票及行程单 + content + 公共交通发票及行程单is a supported receipt type with recognition fields including date, time, origin, destination, and amount. + chunk-1746bd83138e85e66a78e0cb9ad79272 + /app/server/storage/knowledge/报销制度/a8f8465df08e455ebe133351721d49f8__无单需求文档0506.docx + 1779379011 + + + + 飞机票行程单 + content + 飞机票行程单is a supported receipt type with recognition fields including origin, destination, flight number, seat, price, date, and tax amount. + chunk-1746bd83138e85e66a78e0cb9ad79272 + /app/server/storage/knowledge/报销制度/a8f8465df08e455ebe133351721d49f8__无单需求文档0506.docx + 1779379011 + + + + AI预审 + method + AI预审is a method that performs automated pre-audit checks including completeness checks, compliance checks, and issue + chunk-1746bd83138e85e66a78e0cb9ad79272 + /app/server/storage/knowledge/报销制度/a8f8465df08e455ebe133351721d49f8__无单需求文档0506.docx + 1779379011 + + + + 问题项目标识 + concept + 问题项目标识is a system feature that displays a warning icon, problem description text, and provides a supplementary upload button for addressing issues. + chunk-1746bd83138e85e66a78e0cb9ad79272 + /app/server/storage/knowledge/报销制度/a8f8465df08e455ebe133351721d49f8__无单需求文档0506.docx + 1779379011 + + + + 补充上传按钮 + content + 补充上传按钮is a user interface component that allows users to upload additional documentation when required. + chunk-1746bd83138e85e66a78e0cb9ad79272 + /app/server/storage/knowledge/报销制度/a8f8465df08e455ebe133351721d49f8__无单需求文档0506.docx + 1779379011 + + + + 预审按钮 + content + 预审按钮is a clickable button located in the timeline section that triggers AI automated pre-audit checks. + chunk-1746bd83138e85e66a78e0cb9ad79272 + /app/server/storage/knowledge/报销制度/a8f8465df08e455ebe133351721d49f8__无单需求文档0506.docx + 1779379011 + + + + 审核点 + concept + 审核点is a structured audit checklist containing 13 sequential check items with completeness and compliance verification types. + chunk-1746bd83138e85e66a78e0cb9ad79272 + /app/server/storage/knowledge/报销制度/a8f8465df08e455ebe133351721d49f8__无单需求文档0506.docx + 1779379011 + + + + 完整性检查 + method + 完整性检查is a verification method that checks whether all required vouchers and attachments have been properly uploaded. + chunk-1746bd83138e85e66a78e0cb9ad79272 + /app/server/storage/knowledge/报销制度/a8f8465df08e455ebe133351721d49f8__无单需求文档0506.docx + 1779379012 + + + + 合规性检查 + method + 合规性检查is a verification method that checks whether expenses meet regulatory standards and compliance requirements. + chunk-1746bd83138e85e66a78e0cb9ad79272 + /app/server/storage/knowledge/报销制度/a8f8465df08e455ebe133351721d49f8__无单需求文档0506.docx + 1779379012 + + + + 问题标注 + method + 问题标注is an automatic labeling method that identifies and marks issues found during the audit process. + chunk-1746bd83138e85e66a78e0cb9ad79272 + /app/server/storage/knowledge/报销制度/a8f8465df08e455ebe133351721d49f8__无单需求文档0506.docx + 1779379012 + + + + 商旅附件 + content + 商旅附件refers to business travel documentation containing booking information such as train tickets, flights, and hotel reservations. + chunk-1746bd83138e85e66a78e0cb9ad79272 + /app/server/storage/knowledge/报销制度/a8f8465df08e455ebe133351721d49f8__无单需求文档0506.docx + 1779379012 + + + + 出差 + concept + 出差refers to business travel involving departure and return trips with specific origins, destinations, and transit points. + chunk-1746bd83138e85e66a78e0cb9ad79272 + /app/server/storage/knowledge/报销制度/a8f8465df08e455ebe133351721d49f8__无单需求文档0506.docx + 1779379012 + + + + 火车票超标 + concept + 火车票超标refers to train ticket expenses that exceed the allowed spending limits. + chunk-1746bd83138e85e66a78e0cb9ad79272 + /app/server/storage/knowledge/报销制度/a8f8465df08e455ebe133351721d49f8__无单需求文档0506.docx + 1779379012 + + + + 飞机票超标 + concept + 飞机票超标refers to flight ticket expenses that exceed the allowed spending limits. + chunk-1746bd83138e85e66a78e0cb9ad79272 + /app/server/storage/knowledge/报销制度/a8f8465df08e455ebe133351721d49f8__无单需求文档0506.docx + 1779379012 + + + + Train Ticket Compliance Check + concept + Compliance check item 11 that verifies whether offline booked train tickets exceed specified limits. + chunk-ce44e4483e4119265b43eacb72e0326a + /app/server/storage/knowledge/报销制度/a8f8465df08e455ebe133351721d49f8__无单需求文档0506.docx + 1779379012 + + + + Flight Ticket Compliance Check + concept + Compliance check item 12 that verifies whether offline booked flight tickets exceed specified limits. + chunk-ce44e4483e4119265b43eacb72e0326a + /app/server/storage/knowledge/报销制度/a8f8465df08e455ebe133351721d49f8__无单需求文档0506.docx + 1779379012 + + + + Hotel Booking Compliance Check + concept + Compliance check item 13 that verifies whether offline booked hotel accommodations exceed specified limits. + chunk-ce44e4483e4119265b43eacb72e0326a + /app/server/storage/knowledge/报销制度/a8f8465df08e455ebe133351721d49f8__无单需求文档0506.docx + 1779379012 + + + + Taxi Trip Time Compliance Check + concept + Compliance check item 14 that checks if taxi trip times are after 22:00 at night, requiring supplementary explanation if not. + chunk-ce44e4483e4119265b43eacb72e0326a + /app/server/storage/knowledge/报销制度/a8f8465df08e455ebe133351721d49f8__无单需求文档0506.docx + 1779379012 + + + + Taxi Invoice Check + concept + Compliance check item 15 that verifies if taxi invoices have corresponding trip records provided. + chunk-ce44e4483e4119265b43eacb72e0326a + /app/server/storage/knowledge/报销制度/a8f8465df08e455ebe133351721d49f8__无单需求文档0506.docx + 1779379012 + + + + Airport Bus Ticket Check + concept + Completeness check item 16 that verifies if airport bus tickets have corresponding tickets or booking screenshots. + chunk-ce44e4483e4119265b43eacb72e0326a + /app/server/storage/knowledge/报销制度/a8f8465df08e455ebe133351721d49f8__无单需求文档0506.docx + 1779379012 + + + + Subway Invoice Check + concept + Completeness check item 17 that verifies if subway invoices have corresponding trip screenshots and payment screenshots. + chunk-ce44e4483e4119265b43eacb72e0326a + /app/server/storage/knowledge/报销制度/a8f8465df08e455ebe133351721d49f8__无单需求文档0506.docx + 1779379012 + + + + Invoice Title Check + concept + Compliance check item 18 that verifies all ticket and invoice titles match the required entity name. + chunk-ce44e4483e4119265b43eacb72e0326a + /app/server/storage/knowledge/报销制度/a8f8465df08e455ebe133351721d49f8__无单需求文档0506.docx + 1779379003 + + + + Pre-Review Result Display + concept + System display showing normal items marked as "已修复" or "issue-fixed", and problematic items with warning icons and supplementary upload buttons. + chunk-ce44e4483e4119265b43eacb72e0326a + /app/server/storage/knowledge/报销制度/a8f8465df08e455ebe133351721d49f8__无单需求文档0506.docx + 1779379003 + + + + Expense Reimbursement Submission Process + method + Process for submitting expense reimbursement applications after pre-review approval, including confirmation prompts and submission confirmation. + chunk-ce44e4483e4119265b43eacb72e0326a + /app/server/storage/knowledge/报销制度/a8f8465df08e455ebe133351721d49f8__无单需求文档0506.docx + 1779379003 + + + + AI Assistant Module + concept + Module 3 of the system featuring a global chat bar, summon panel, preset assistant cards, and role configuration capabilities. + chunk-ce44e4483e4119265b43eacb72e0326a + /app/server/storage/knowledge/报销制度/a8f8465df08e455ebe133351721d49f8__无单需求文档0506.docx + 1779379003 + + + + Global Chat Bar + content + Bottom floating chat bar in the AI Assistant module that supports quick interaction with welcome messages, quick replies, and message input functionality. + chunk-ce44e4483e4119265b43eacb72e0326a + /app/server/storage/knowledge/报销制度/a8f8465df08e455ebe133351721d49f8__无单需求文档0506.docx + 1779379003 + + + + Summon Panel + content + Panel accessible via a "召唤" entry point that supports mode switching between custom instruction editing and preset assistant selection. + chunk-ce44e4483e4119265b43eacb72e0326a + /app/server/storage/knowledge/报销制度/a8f8465df08e455ebe133351721d49f8__无单需求文档0506.docx + 1779379003 + + + + Preset Assistant Cards + content + Assistant cards in the summon panel featuring gradient background avatars, role names, and settings for role configuration. + chunk-ce44e4483e4119265b43eacb72e0326a + /app/server/storage/knowledge/报销制度/a8f8465df08e455ebe133351721d49f8__无单需求文档0506.docx + 1779379003 + + + + Role Configuration Pop-up Window + content + Configuration interface for setting role name, role description, and AI prompt templates. + chunk-ce44e4483e4119265b43eacb72e0326a + /app/server/storage/knowledge/报销制度/a8f8465df08e455ebe133351721d49f8__无单需求文档0506.docx + 1779379003 + + + + Role Prompt Templates + content + Prompt templates for four preset roles including行政秘书, 费控专责, 财务BP, and采购专员with specific instruction formats. + chunk-ce44e4483e4119265b43eacb72e0326a + /app/server/storage/knowledge/报销制度/a8f8465df08e455ebe133351721d49f8__无单需求文档0506.docx + 1779379003 + + + + User Center Module + concept + Module 4 of the system containing user menu functionality accessible via avatar click. + chunk-ce44e4483e4119265b43eacb72e0326a + /app/server/storage/knowledge/报销制度/a8f8465df08e455ebe133351721d49f8__无单需求文档0506.docx + 1779379003 + + + + User Menu + content + Dropdown menu displayed when clicking the user avatar, containing user-related options and settings. + chunk-ce44e4483e4119265b43eacb72e0326a + /app/server/storage/knowledge/报销制度/a8f8465df08e455ebe133351721d49f8__无单需求文档0506.docx + 1779379003 + + + + Trip Time Check + concept + Compliance check item 10 that verifies whether offline booked train or flight trip times overlap with other bookings, requiring review if overlap is detected. + chunk-ce44e4483e4119265b43eacb72e0326a + /app/server/storage/knowledge/报销制度/a8f8465df08e455ebe133351721d49f8__无单需求文档0506.docx + 1779379003 + + + + Normal Items + concept + Expense items that pass pre-review verification and are marked as "已修复" or "issue-fixed". + chunk-ce44e4483e4119265b43eacb72e0326a + /app/server/storage/knowledge/报销制度/a8f8465df08e455ebe133351721d49f8__无单需求文档0506.docx + 1779379003 + + + + Problem Items + concept + Expense items that fail pre-review verification, displaying warning icons and problem descriptions. + chunk-ce44e4483e4119265b43eacb72e0326a + /app/server/storage/knowledge/报销制度/a8f8465df08e455ebe133351721d49f8__无单需求文档0506.docx + 1779379003 + + + + Pre-Review Pass Notification + concept + System message indicating "预审通过!所有单据完整且合规。" when all documents pass verification. + chunk-ce44e4483e4119265b43eacb72e0326a + /app/server/storage/knowledge/报销制度/a8f8465df08e455ebe133351721d49f8__无单需求文档0506.docx + 1779379003 + + + + Pre-Review Problem Summary + concept + System display showing the count of pre-review problems detected (N项) along with specific problem descriptions. + chunk-ce44e4483e4119265b43eacb72e0326a + /app/server/storage/knowledge/报销制度/a8f8465df08e455ebe133351721d49f8__无单需求文档0506.docx + 1779379004 + + + + Supplementary Upload Button + content + User interface button provided alongside problem item displays for uploading additional documentation. + chunk-ce44e4483e4119265b43eacb72e0326a + /app/server/storage/knowledge/报销制度/a8f8465df08e455ebe133351721d49f8__无单需求文档0506.docx + 1779379004 + + + + Go Reimburse Button + content + Button labeled "去报销吧" that initiates the expense reimbursement submission process. + chunk-ce44e4483e4119265b43eacb72e0326a + /app/server/storage/knowledge/报销制度/a8f8465df08e455ebe133351721d49f8__无单需求文档0506.docx + 1779379004 + + + + Submission Confirmation Prompt + concept + Warning message "请注意:总裁办去报销了,前期事务已完结且不可回退。" displayed before final expense reimbursement submission. + chunk-ce44e4483e4119265b43eacb72e0326a + /app/server/storage/knowledge/报销制度/a8f8465df08e455ebe133351721d49f8__无单需求文档0506.docx + 1779379004 + + + + Submission Result Prompt + concept + Status message "已提交报销申请,等待审批..." displayed after successful expense reimbursement submission. + chunk-ce44e4483e4119265b43eacb72e0326a + /app/server/storage/knowledge/报销制度/a8f8465df08e455ebe133351721d49f8__无单需求文档0506.docx + 1779379004 + + + + Administrative Secretary + concept + AI assistant role template with responsibilities for handling administrative affairs including company policy compliance, confidentiality, and timely progress updates. + chunk-ce44e4483e4119265b43eacb72e0326a + /app/server/storage/knowledge/报销制度/a8f8465df08e455ebe133351721d49f8__无单需求文档0506.docx + 1779379004 + + + + Cost Control Specialist + concept + AI assistant role template for reviewing expense reimbursement with requirements for invoice verification, standards compliance, and budget confirmation. + chunk-ce44e4483e4119265b43eacb72e0326a + /app/server/storage/knowledge/报销制度/a8f8465df08e455ebe133351721d49f8__无单需求文档0506.docx + 1779379004 + + + + Finance BP + concept + AI assistant role template for financial analysis providing professional advice while considering compliance and business development. + chunk-ce44e4483e4119265b43eacb72e0326a + /app/server/storage/knowledge/报销制度/a8f8465df08e455ebe133351721d49f8__无单需求文档0506.docx + 1779379004 + + + + Procurement Specialist + concept + AI assistant role template for procurement matters including following procurement processes, price comparison, and ledger maintenance. + chunk-ce44e4483e4119265b43eacb72e0326a + /app/server/storage/knowledge/报销制度/a8f8465df08e455ebe133351721d49f8__无单需求文档0506.docx + 1779379004 + + + + User Message + content + Chat message type displayed on the right side with blue background in the AI Assistant module. + chunk-ce44e4483e4119265b43eacb72e0326a + /app/server/storage/knowledge/报销制度/a8f8465df08e455ebe133351721d49f8__无单需求文档0506.docx + 1779379004 + + + + AI Reply + content + Chat message type displayed on the left side with gray background in the AI Assistant module. + chunk-ce44e4483e4119265b43eacb72e0326a + /app/server/storage/knowledge/报销制度/a8f8465df08e455ebe133351721d49f8__无单需求文档0506.docx + 1779379004 + + + + 配色方案 + concept + 配色方案refers to the color scheme design specification, identified as section 3.2 in the document. + chunk-2224d777c0b72d0b2dab622c79096c2c + /app/server/storage/knowledge/报销制度/a8f8465df08e455ebe133351721d49f8__无单需求文档0506.docx + 1779379004 + + + + 功能需求 + concept + 功能需求refers to functional requirements, identified as section 4 in the document. + chunk-2224d777c0b72d0b2dab622c79096c2c + /app/server/storage/knowledge/报销制度/a8f8465df08e455ebe133351721d49f8__无单需求文档0506.docx + 1779379004 + + + + 正文 + content + 正文is a document label indicating the main body text content, used as a marker for section entries. + chunk-2224d777c0b72d0b2dab622c79096c2c + /app/server/storage/knowledge/报销制度/a8f8465df08e455ebe133351721d49f8__无单需求文档0506.docx + 1779379004 + + + + Menu 2 + concept + Menu 2 is a second-level navigation menu in the system, containing options such as the Matter List feature. + chunk-99c6f377dff2b9a37a7214b7b05ea9a8 + /app/server/storage/knowledge/报销制度/a8f8465df08e455ebe133351721d49f8__无单需求文档0506.docx + 1779379004 + + + + Matter List + concept + Matter List is a menu item under Menu 2 that displays a list of pending and processed matters, with each entry showing summary, amount, status, and deadline. + chunk-99c6f377dff2b9a37a7214b7b05ea9a8 + /app/server/storage/knowledge/报销制度/a8f8465df08e455ebe133351721d49f8__无单需求文档0506.docx + 1779379004 + + + + Receipt-Free Reimbursement + concept + Receipt-Free Reimbursement is a module under Menu 2 that allows users to initiate reimbursement without traditional receipts, including functions such as matter initiation, document upload, and time track generation. + chunk-99c6f377dff2b9a37a7214b7b05ea9a8 + /app/server/storage/knowledge/报销制度/a8f8465df08e455ebe133351721d49f8__无单需求文档0506.docx + 1779379004 + + + + AI Assistant + concept + AI Assistant is a feature point under Menu 2 providing global chat functionality for users. + chunk-99c6f377dff2b9a37a7214b7b05ea9a8 + /app/server/storage/knowledge/报销制度/a8f8465df08e455ebe133351721d49f8__无单需求文档0506.docx + 1779379004 + + + + User Center + concept + User Center is a feature point under Menu 2 offering personal center access and logout options. + chunk-99c6f377dff2b9a37a7214b7b05ea9a8 + /app/server/storage/knowledge/报销制度/a8f8465df08e455ebe133351721d49f8__无单需求文档0506.docx + 1779379004 + + + + Initiate Matter + concept + Initiate Matter is a method within the Receipt-Free Reimbursement module that allows users to upload local attachments for automatic bill organization. + chunk-99c6f377dff2b9a37a7214b7b05ea9a8 + /app/server/storage/knowledge/报销制度/a8f8465df08e455ebe133351721d49f8__无单需求文档0506.docx + 1779379004 + + + + Mini Program Code + concept + Mini Program Code is a method within the Receipt-Free Reimbursement module that allows users to scan a code via mini program to upload files from a mobile device. + chunk-99c6f377dff2b9a37a7214b7b05ea9a8 + /app/server/storage/knowledge/报销制度/a8f8465df08e455ebe133351721d49f8__无单需求文档0506.docx + 1779379004 + + + + Document Upload + concept + Document Upload is a function of the Receipt-Free Reimbursement module that supports drag-and-drop upload, click upload, multi-file upload, file preview, reset, and confirmation, supporting PDF, JPG, JPEG, PNG, and XLSX formats. + chunk-99c6f377dff2b9a37a7214b7b05ea9a8 + /app/server/storage/knowledge/报销制度/a8f8465df08e455ebe133351721d49f8__无单需求文档0506.docx + 1779379005 + + + + Time Track + concept + Time Track is a feature within the Receipt-Free Reimbursement module that automatically generates a visual timeline after document upload, displaying fields such as name, time, location, total expenditure, business travel booking, and offline self-payment. + chunk-99c6f377dff2b9a37a7214b7b05ea9a8 + /app/server/storage/knowledge/报销制度/a8f8465df08e455ebe133351721d49f8__无单需求文档0506.docx + 1779379005 + + + + AI Pre-Review + concept + AI Pre-Review is a function within the Receipt-Free Reimbursement module that uses AI to perform preliminary review of reimbursement submissions. + chunk-99c6f377dff2b9a37a7214b7b05ea9a8 + /app/server/storage/knowledge/报销制度/a8f8465df08e455ebe133351721d49f8__无单需求文档0506.docx + 1779379005 + + + + Personal Center + concept + Personal Center is a sub-item of User Center where users can manage their personal information. + chunk-99c6f377dff2b9a37a7214b7b05ea9a8 + /app/server/storage/knowledge/报销制度/a8f8465df08e455ebe133351721d49f8__无单需求文档0506.docx + 1779379005 + + + + Logout + concept + Logout is a sub-item of User Center that allows users to sign out of the system. + chunk-99c6f377dff2b9a37a7214b7b05ea9a8 + /app/server/storage/knowledge/报销制度/a8f8465df08e455ebe133351721d49f8__无单需求文档0506.docx + 1779379005 + + + + Business Travel + concept + Business Travel is a business type field in the Matter List, corresponding to travel-related expense matters. + chunk-99c6f377dff2b9a37a7214b7b05ea9a8 + /app/server/storage/knowledge/报销制度/a8f8465df08e455ebe133351721d49f8__无单需求文档0506.docx + 1779379005 + + + + Q1 Quarterly Business Progress Report + content + Q1 Quarterly Business Progress Report is a specific business travel matter listed in the Matter List, with an amount of 1678.20, status of Not Submitted, initiated on 2026-4-6. + chunk-99c6f377dff2b9a37a7214b7b05ea9a8 + /app/server/storage/knowledge/报销制度/a8f8465df08e455ebe133351721d49f8__无单需求文档0506.docx + 1779379005 + + + + 2026 National AI Technology Summit in Hefei + event + 2026 National AI Technology Summit in Hefei is a specific business travel matter listed in the Matter List, with an amount of 3498.39, status of Not Submitted, initiated on 2026-4-8. + chunk-99c6f377dff2b9a37a7214b7b05ea9a8 + /app/server/storage/knowledge/报销制度/a8f8465df08e455ebe133351721d49f8__无单需求文档0506.docx + 1779379005 + + + + Smart Platform Jiangsu Province Company Operations Support + content + Smart Platform Jiangsu Province Company Operations Support is a specific business travel matter listed in the Matter List, with an amount of 1345.87, status of Submitted, initiated on 2026-4-12. + chunk-99c6f377dff2b9a37a7214b7b05ea9a8 + /app/server/storage/knowledge/报销制度/a8f8465df08e455ebe133351721d49f8__无单需求文档0506.docx + 1779379005 + + + + Document Recognition + concept + Document Recognition is a feature within the Receipt-Free Reimbursement module that automatically identifies information from uploaded vouchers when users click on voucher thumbnails. + chunk-99c6f377dff2b9a37a7214b7b05ea9a8 + /app/server/storage/knowledge/报销制度/a8f8465df08e455ebe133351721d49f8__无单需求文档0506.docx + 1779379005 + + + + Submit Reimbursement + concept + Submit Reimbursement is a function within the Receipt-Free Reimbursement module that allows users to finalize and submit their reimbursement requests after AI pre-review. + chunk-99c6f377dff2b9a37a7214b7b05ea9a8 + /app/server/storage/knowledge/报销制度/a8f8465df08e455ebe133351721d49f8__无单需求文档0506.docx + 1779379005 + + + + Warning Icon + artifact + Warning Icon is a visual indicator (⚠) used in the system to flag problem items such as missing voucher screenshots in reimbursement records. + chunk-99c6f377dff2b9a37a7214b7b05ea9a8 + /app/server/storage/knowledge/报销制度/a8f8465df08e455ebe133351721d49f8__无单需求文档0506.docx + 1779379005 + + + + 1.0 + 远光软件股份有限公司is the issuer of the expense reimbursement regulations, with Chapter 1 General Provisions establishing the foundational framework. + organizational hierarchy,regulation issuer + chunk-aa5435156b829944c173fa1d2d7a93d4 + /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf + 1779012088 + + + + 1.0 + 远光软件股份有限公司established the Planning and Finance Department to handle financial management and expense-related responsibilities. + financial authority,organizational structure + chunk-aa5435156b829944c173fa1d2d7a93d4 + /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf + 1779012076 + + + + 1.0 + Yuan Guang Software Co., Ltd. has implemented changes in reimbursement standards as part of its internal policy adjustments. + company governance,policy adjustment + chunk-18d968b78afe916b419c1b5973421ebe + /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf + 1779012084 + + + + 1.0 + 远光软件股份有限公司issued the Company Expenditure Management Measures (2024) to regulate company expenditures. + document issuance,policy implementation + chunk-dd87aa5bc62cc9587ecb4c26d35a5263 + /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf + 1779012085 + + + + 1.0 + 远光软件股份有限公司assigned document number远光制度〔2024〕14号to the expenditure management measures. + document numbering,regulatory framework + chunk-dd87aa5bc62cc9587ecb4c26d35a5263 + /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf + 1779012086 + + + + 1.0 + Article 3 Management Principles provides the foundational principles for the entire expense reimbursement system. + chapter article relationship,regulatory foundation + chunk-aa5435156b829944c173fa1d2d7a93d4 + /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf + 1779012076 + + + + 1.0 + The designated management department determines expenditure scope, standards, methods, and management processes in accordance with company financial, procurement, and human resources policies. + department responsibility,regulatory compliance + chunk-aa5435156b829944c173fa1d2d7a93d4 + /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf + 1779012079 + + + + 1.0 + 控股子公司must report expenditure management measures to计划财务部for filing after approval. + compliance,reporting relationship + chunk-dd87aa5bc62cc9587ecb4c26d35a5263 + /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf + 1779012099 + + + + 1.0 + Article 11 Petty Cash Loans is one of the key expense management regulations under Chapter + chapter article relationship,specific regulation + chunk-aa5435156b829944c173fa1d2d7a93d4 + /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf + 1779012088 + + + + 1.0 + 办公室(党委办公室)manages party building and official vehicle expenses according to the company expense management policy. + expense management,policy execution + chunk-afc57a0e9548d1f484da6df6c182676b + /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf + 1779012088 + + + + 1.0 + 工会委员会manages trade union expenses according to the company expense management policy. + expense management,policy execution + chunk-afc57a0e9548d1f484da6df6c182676b + /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf + 1779012079 + + + + 1.0 + 营销中心manages bidding + expense management,policy execution + chunk-afc57a0e9548d1f484da6df6c182676b + /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf + 1779012079 + + + + 1.0 + 组织人事部负责确定调动工作人员的报销标准,对异地挂职锻炼等人员的费用报销进行规范管理。 + 标准制定、人事管理 + chunk-d26b288ed4001dc5c504dce0eb841362 + /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf + 1779012090 + + + + 1.0 + 商旅系统是公司差旅费管理的核心平台,用于统一预定和审批差旅相关费用。 + 系统支持、费用管控 + chunk-d26b288ed4001dc5c504dce0eb841362 + /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf + 1779012086 + + + + 1.0 + 业务招待费是公司费用管理体系的重要组成部分,与差旅费并列作为公司主要费用报销项目。 + 费用类别、公司运营 + chunk-d26b288ed4001dc5c504dce0eb841362 + /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf + 1779012089 + + + + 1.0 + 会议费是公司费用管理体系的重要组成部分,与差旅费并列作为公司主要费用报销项目,需要事前审批并附业务佐证材料。 + 费用类别、公司运营 + chunk-d26b288ed4001dc5c504dce0eb841362 + /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf + 1779012092 + + + + 1.0 + The reimbursement standard changes include the cancellation of official vehicle subsidy reimbursement since it has been incorporated into wages. + expense reduction,policy modification + chunk-18d968b78afe916b419c1b5973421ebe + /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf + 1779012085 + + + + 1.0 + Management personnel at all levels exercise approval authority within the company's expenditure authorization approval scope. + hierarchical authority,organizational structure + chunk-74c01decac4a10cd40a491786743b0ee + /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf + 1779012076 + + + + 1.0 + The centralized management department implements expenditure centralized management on behalf of the company. + centralized management,departmental responsibility + chunk-74c01decac4a10cd40a491786743b0ee + /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf + 1779012077 + + + + 1.0 + The Planning and Finance Department assists the centralized management department and is responsible for financial reimbursement auditing and payment settlement. + departmental responsibility,financial oversight + chunk-74c01decac4a10cd40a491786743b0ee + /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf + 1779012077 + + + + 1.0 + The operating department (individual) conducts expenditure business activities within the company's authorization. + business execution,departmental responsibility + chunk-74c01decac4a10cd40a491786743b0ee + /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf + 1779012078 + + + + 1.0 + Operating departments must strictly follow company bidding, procurement, and material management regulations for procurement of materials and services. + business execution,procurement compliance + chunk-74c01decac4a10cd40a491786743b0ee + /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf + 1779012083 + + + + 1.0 + The operator submits the expenditure reimbursement application through the financial information system and provides business original documents. + documentation responsibility,workflow initiation + chunk-74c01decac4a10cd40a491786743b0ee + /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf + 1779012079 + + + + 1.0 + The operator is responsible for obtaining real + authenticity responsibility,document preparation + chunk-74c01decac4a10cd40a491786743b0ee + /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf + 1779012094 + + + + 1.0 + The operator has three working days to supplement incomplete business original documents after financial review. + documentation compliance,workflow timeline + chunk-74c01decac4a10cd40a491786743b0ee + /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf + 1779012083 + + + + 1.0 + Financial review can reject applications if documents are incomplete, incorrectly filled, or non-compliant. + document verification,rejection handling + chunk-74c01decac4a10cd40a491786743b0ee + /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf + 1779012088 + + + + 1.0 + Aggregated VAT invoices must be accompanied by tax control system detail lists. + documentation requirement,tax compliance + chunk-74c01decac4a10cd40a491786743b0ee + /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf + 1779012079 + + + + 1.0 + Expenditures other than employee remuneration, personal service compensation, travel allowance, special subsidy, and current account payment require tax authority-recognized invoices. + compliance requirement,documentation standard + chunk-74c01decac4a10cd40a491786743b0ee + /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf + 1779012082 + + + + 1.0 + 公司通过第十七条对培训费进行规范管理。 + 合规管理,规章制定 + chunk-e9438f69c9e221d9f0f00a05ad84eac6 + /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf + 1779012084 + + + + 1.0 + 公司通过第十八条对通信费进行规范管理。 + 合规管理,规章制定 + chunk-e9438f69c9e221d9f0f00a05ad84eac6 + /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf + 1779012084 + + + + 1.0 + 公司通过第十九条对邮递费进行规范管理。 + 合规管理,规章制定 + chunk-e9438f69c9e221d9f0f00a05ad84eac6 + /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf + 1779012084 + + + + 1.0 + 公司通过第二十条对薪酬福利支出进行规范管理。 + 薪酬管理,规章制定 + chunk-e9438f69c9e221d9f0f00a05ad84eac6 + /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf + 1779012086 + + + + 1.0 + 公司通过第二十一条对对外捐赠支出进行规范管理。 + 捐赠管理,规章制定 + chunk-e9438f69c9e221d9f0f00a05ad84eac6 + /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf + 1779012089 + + + + 1.0 + Departments and units must implement the night high-speed rail provision allowing employees to choose sleeper seats when high-speed train travel exceeds 6 hours at night. + policy implementation,travel standards + chunk-613d6dfd4c5e9c807229a3147f96b584 + /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf + 1779012084 + + + + 1.0 + Departments and units are responsible for strictly managing taxi usage, limiting reimbursements to emergency situations, client接送, late night work, and other special circumstances. + cost control,policy enforcement + chunk-613d6dfd4c5e9c807229a3147f96b584 + /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf + 1779012099 + + + + 1.0 + 第十四条专门定义了业务招待费的概念和报销要求,明确了接待客户和相关单位的餐饮等合理支出范围。 + 条款规定、费用管理 + chunk-d26b288ed4001dc5c504dce0eb841362 + /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf + 1779012092 + + + + 1.0 + 第十五条专门规定了会议费的报销范围和报销要求,包括公司主办或承办会议以及参加外部会议的报销标准。 + 条款规定、费用管理 + chunk-d26b288ed4001dc5c504dce0eb841362 + /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf + 1779012092 + + + + 1.0 + 公司总裁对经费预算30000元及以上的内部会议具有审批权限,体现了公司对大额会议支出的管控。 + 审批权限、预算管理 + chunk-d26b288ed4001dc5c504dce0eb841362 + /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf + 1779012093 + + + + 1.0 + 第十六条专门规定了广告宣传费的定义和管理要求,包括广告费和业务宣传费两类。 + 条款规定、费用管理 + chunk-d26b288ed4001dc5c504dce0eb841362 + /app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf + 1779012092 + + + + 1.0 + 无单报销is officially named总裁办, serving as the primary product designation. + product naming,system identity + chunk-07de6ea74f60535b689f977295770273 + /app/server/storage/knowledge/报销制度/a8f8465df08e455ebe133351721d49f8__无单需求文档0506.docx + 1779379014 + + + + 1.0 + The status bar is referenced in the document structure alongside the color scheme section. + document structure,hierarchy + chunk-2224d777c0b72d0b2dab622c79096c2c + /app/server/storage/knowledge/报销制度/a8f8465df08e455ebe133351721d49f8__无单需求文档0506.docx + 1779379015 + + + + 1.0 + 无单报销is a web-based tool for expense reimbursement. + platform,product type + chunk-07de6ea74f60535b689f977295770273 + /app/server/storage/knowledge/报销制度/a8f8465df08e455ebe133351721d49f8__无单需求文档0506.docx + 1779379015 + + + + 1.0 + 无单报销targets large enterprises to solve existing ERP user experience problems. + customer segment,target market + chunk-07de6ea74f60535b689f977295770273 + /app/server/storage/knowledge/报销制度/a8f8465df08e455ebe133351721d49f8__无单需求文档0506.docx + 1779379015 + + + + 1.0 + 无单报销is designed for business personnel (non-finance professionals) as the primary users. + intended audience,target users + chunk-07de6ea74f60535b689f977295770273 + /app/server/storage/knowledge/报销制度/a8f8465df08e455ebe133351721d49f8__无单需求文档0506.docx + 1779379015 + + + + 1.0 + 无单报销operates in front of the ERP system, using ERP as its backend database and archiving system. + backend support,system integration + chunk-07de6ea74f60535b689f977295770273 + /app/server/storage/knowledge/报销制度/a8f8465df08e455ebe133351721d49f8__无单需求文档0506.docx + 1779379016 + + + + 1.0 + AI预审performs completeness checks to verify all required vouchers and attachments are present. + automated verification,document completeness + chunk-1746bd83138e85e66a78e0cb9ad79272 + /app/server/storage/knowledge/报销制度/a8f8465df08e455ebe133351721d49f8__无单需求文档0506.docx + 1779379014 + + + + 1.0 + AI预审performs compliance checks to verify expenses meet regulatory standards. + automated verification,policy compliance + chunk-1746bd83138e85e66a78e0cb9ad79272 + /app/server/storage/knowledge/报销制度/a8f8465df08e455ebe133351721d49f8__无单需求文档0506.docx + 1779379015 + + + + 1.0 + AI预审automatically marks identified issues in the audit process. + automated identification,issue marking + chunk-1746bd83138e85e66a78e0cb9ad79272 + /app/server/storage/knowledge/报销制度/a8f8465df08e455ebe133351721d49f8__无单需求文档0506.docx + 1779379015 + + + + 1.0 + Clicking the pre-audit button initiates the AI预审automated verification process. + audit trigger,user interaction + chunk-1746bd83138e85e66a78e0cb9ad79272 + /app/server/storage/knowledge/报销制度/a8f8465df08e455ebe133351721d49f8__无单需求文档0506.docx + 1779379015 + + + + 1.0 + 审核点includes check items categorized under the completeness verification type. + audit structure,verification type + chunk-1746bd83138e85e66a78e0cb9ad79272 + /app/server/storage/knowledge/报销制度/a8f8465df08e455ebe133351721d49f8__无单需求文档0506.docx + 1779379015 + + + + 1.0 + 审核点includes check items categorized under the compliance verification type. + audit structure,verification type + chunk-1746bd83138e85e66a78e0cb9ad79272 + /app/server/storage/knowledge/报销制度/a8f8465df08e455ebe133351721d49f8__无单需求文档0506.docx + 1779379015 + + + + 1.0 + Train Ticket Compliance Check is one of the pre-review items that determines whether expense items pass verification and are displayed in the pre-review result. + compliance verification,system workflow + chunk-ce44e4483e4119265b43eacb72e0326a + /app/server/storage/knowledge/报销制度/a8f8465df08e455ebe133351721d49f8__无单需求文档0506.docx + 1779379015 + + + + 1.0 + Flight Ticket Compliance Check is one of the + compliance verification,system workflow + chunk-ce44e4483e4119265b43eacb72e0326a + /app/server/storage/knowledge/报销制度/a8f8465df08e455ebe133351721d49f8__无单需求文档0506.docx + 1779379015 + + + + 1.0 + The color scheme section (3.2) precedes the functional requirements section (4) in the document. + document structure,sequential + chunk-2224d777c0b72d0b2dab622c79096c2c + /app/server/storage/knowledge/报销制度/a8f8465df08e455ebe133351721d49f8__无单需求文档0506.docx + 1779379016 + + + + 1.0 + Menu 2 contains the Matter List feature for viewing pending and processed matters. + feature containment,menu structure + chunk-99c6f377dff2b9a37a7214b7b05ea9a8 + /app/server/storage/knowledge/报销制度/a8f8465df08e455ebe133351721d49f8__无单需求文档0506.docx + 1779379015 + + + + 1.0 + Menu 2 contains the Receipt-Free Reimbursement module for submitting expenses without traditional receipts. + feature containment,menu structure + chunk-99c6f377dff2b9a37a7214b7b05ea9a8 + /app/server/storage/knowledge/报销制度/a8f8465df08e455ebe133351721d49f8__无单需求文档0506.docx + 1779379016 + + + + 1.0 + Menu 2 contains the AI Assistant feature providing global chat functionality. + feature containment,menu structure + chunk-99c6f377dff2b9a37a7214b7b05ea9a8 + /app/server/storage/knowledge/报销制度/a8f8465df08e455ebe133351721d49f8__无单需求文档0506.docx + 1779379016 + + + + 1.0 + Menu 2 contains the User Center feature with personal center and logout options. + feature containment,menu structure + chunk-99c6f377dff2b9a37a7214b7b05ea9a8 + /app/server/storage/knowledge/报销制度/a8f8465df08e455ebe133351721d49f8__无单需求文档0506.docx + 1779379016 + + + + 1.0 + Matter List displays a business travel matter titled Q1 Quarterly Business Progress Report with amount 1678.20 and status Not Submitted. + business record,item display + chunk-99c6f377dff2b9a37a7214b7b05ea9a8 + /app/server/storage/knowledge/报销制度/a8f8465df08e455ebe133351721d49f8__无单需求文档0506.docx + 1779379016 + + + + 1.0 + Matter List displays a business travel matter for the 2026 National AI Technology Summit in Hefei with amount 3498.39 and status Not Submitted. + business record,item display + chunk-99c6f377dff2b9a37a7214b7b05ea9a8 + /app/server/storage/knowledge/报销制度/a8f8465df08e455ebe133351721d49f8__无单需求文档0506.docx + 1779379016 + + + + 1.0 + Matter List displays a business travel matter for Smart Platform Jiangsu Province Company Operations Support with amount 1345.87 and status Submitted. + business record,item display + chunk-99c6f377dff2b9a37a7214b7b05ea9a8 + /app/server/storage/knowledge/报销制度/a8f8465df08e455ebe133351721d49f8__无单需求文档0506.docx + 1779379017 + + + + 1.0 + Receipt-Free Reimbursement module includes the Initiate Matter function for starting reimbursement processes. + module function,workflow step + chunk-99c6f377dff2b9a37a7214b7b05ea9a8 + /app/server/storage/knowledge/报销制度/a8f8465df08e455ebe133351721d49f8__无单需求文档0506.docx + 1779379016 + + + + 1.0 + Receipt-Free Reimbursement module includes the Document Upload function supporting drag-and-drop and click upload. + module function,workflow step + chunk-99c6f377dff2b9a37a7214b7b05ea9a8 + /app/server/storage/knowledge/报销制度/a8f8465df08e455ebe133351721d49f8__无单需求文档0506.docx + 1779379017 + + + + 1.0 + Receipt-Free Reimbursement module includes the Time Track function that generates visual timelines after document upload. + module function,workflow step + chunk-99c6f377dff2b9a37a7214b7b05ea9a8 + /app/server/storage/knowledge/报销制度/a8f8465df08e455ebe133351721d49f8__无单需求文档0506.docx + 1779379017 + + + + 1.0 + Receipt-Free Reimbursement module includes the Submit Reimbursement function accessible after AI pre-review. + module function,workflow completion + chunk-99c6f377dff2b9a37a7214b7b05ea9a8 + /app/server/storage/knowledge/报销制度/a8f8465df08e455ebe133351721d49f8__无单需求文档0506.docx + 1779379017 + + + + diff --git a/server/storage/knowledge/.lightrag/x_financial_knowledge/kv_store_doc_status.json b/server/storage/knowledge/.lightrag/x_financial_knowledge/kv_store_doc_status.json index 7a16619..9131734 100644 --- a/server/storage/knowledge/.lightrag/x_financial_knowledge/kv_store_doc_status.json +++ b/server/storage/knowledge/.lightrag/x_financial_knowledge/kv_store_doc_status.json @@ -26,8 +26,7 @@ } }, "a8f8465df08e455ebe133351721d49f8": { - "status": "failed", - "error_msg": "Embedding func: Worker execution timeout after 60s", + "status": "processed", "chunks_count": 6, "chunks_list": [ "chunk-07de6ea74f60535b689f977295770273", @@ -40,12 +39,29 @@ "content_summary": "# 产品需求文档\n## 文档信息\n| 项目 | 内容 |\n|------|------|\n| 项目名称 |\n无单报销\n|\n| 版本 | V1.0 |\n| 日期 | 2026-05-06 |\n| 状态 | 正式版 |\n---\n## 1. 项目概述\n### 1.1 项目背景\n面向\n大型企业,\n从业务人员视角出发,解决现有ERP使用体验不佳的问题。\n在ERP的发展历程中,“单据化”曾是财务合规的一大进步,它确保了每笔支出都有据可查。但不可否认,传统的人工填单确实\n也制造了很多\n“枷锁”。在AI时代,解...", "content_length": 9088, "created_at": "2026-05-19T15:59:57.283110+00:00", - "updated_at": "2026-05-19T16:00:57.323299+00:00", + "updated_at": "2026-05-21T15:56:58.097242+00:00", "file_path": "/app/server/storage/knowledge/报销制度/a8f8465df08e455ebe133351721d49f8__无单需求文档0506.docx", "track_id": "insert_20260519_155957_88c49850", "metadata": { - "processing_start_time": 1779206397, - "processing_end_time": 1779206457 + "processing_start_time": 1779378923, + "processing_end_time": 1779379018 + } + }, + "dup-de90fa8775923ae9a1669c8e24d60529": { + "status": "failed", + "content_summary": "[DUPLICATE] Original document: a8f8465df08e455ebe133351721d49f8", + "content_length": 9088, + "chunks_count": 0, + "chunks_list": [], + "created_at": "2026-05-21T15:55:23.540372+00:00", + "updated_at": "2026-05-21T15:55:23.540380+00:00", + "file_path": "/app/server/storage/knowledge/报销制度/a8f8465df08e455ebe133351721d49f8__无单需求文档0506.docx", + "track_id": "insert_20260521_155523_1e232e61", + "error_msg": "Content already exists. Original doc_id: a8f8465df08e455ebe133351721d49f8, Status: failed", + "metadata": { + "is_duplicate": true, + "original_doc_id": "a8f8465df08e455ebe133351721d49f8", + "original_track_id": "insert_20260519_155957_88c49850" } } } \ No newline at end of file diff --git a/server/storage/knowledge/.lightrag/x_financial_knowledge/kv_store_entity_chunks.json b/server/storage/knowledge/.lightrag/x_financial_knowledge/kv_store_entity_chunks.json index d6b1b69..980bff3 100644 --- a/server/storage/knowledge/.lightrag/x_financial_knowledge/kv_store_entity_chunks.json +++ b/server/storage/knowledge/.lightrag/x_financial_knowledge/kv_store_entity_chunks.json @@ -1,2358 +1,3363 @@ -{ - "远光软件股份有限公司": { - "chunk_ids": [ - "chunk-aa5435156b829944c173fa1d2d7a93d4", - "chunk-18d968b78afe916b419c1b5973421ebe", - "chunk-dd87aa5bc62cc9587ecb4c26d35a5263" - ], - "count": 3, - "create_time": 1779011991, - "update_time": 1779011991, - "_id": "远光软件股份有限公司" - }, - "第一章总则": { - "chunk_ids": [ - "chunk-aa5435156b829944c173fa1d2d7a93d4" - ], - "count": 1, - "create_time": 1779011991, - "update_time": 1779011991, - "_id": "第一章总则" - }, - "第二条目的": { - "chunk_ids": [ - "chunk-aa5435156b829944c173fa1d2d7a93d4" - ], - "count": 1, - "create_time": 1779011991, - "update_time": 1779011991, - "_id": "第二条目的" - }, - "第二条范围": { - "chunk_ids": [ - "chunk-aa5435156b829944c173fa1d2d7a93d4" - ], - "count": 1, - "create_time": 1779011991, - "update_time": 1779011991, - "_id": "第二条范围" - }, - "第三条管理原则": { - "chunk_ids": [ - "chunk-aa5435156b829944c173fa1d2d7a93d4" - ], - "count": 1, - "create_time": 1779011991, - "update_time": 1779011991, - "_id": "第三条管理原则" - }, - "第二章职责分工": { - "chunk_ids": [ - "chunk-aa5435156b829944c173fa1d2d7a93d4" - ], - "count": 1, - "create_time": 1779011991, - "update_time": 1779011991, - "_id": "第二章职责分工" - }, - "第四条归口管理部门主要职责": { - "chunk_ids": [ - "chunk-aa5435156b829944c173fa1d2d7a93d4" - ], - "count": 1, - "create_time": 1779011991, - "update_time": 1779011991, - "_id": "第四条归口管理部门主要职责" - }, - "计划财务部": { - "chunk_ids": [ - "chunk-aa5435156b829944c173fa1d2d7a93d4", - "chunk-afc57a0e9548d1f484da6df6c182676b", - "chunk-e9438f69c9e221d9f0f00a05ad84eac6", - "chunk-18d968b78afe916b419c1b5973421ebe", - "chunk-dd87aa5bc62cc9587ecb4c26d35a5263" - ], - "count": 5, - "create_time": 1779011991, - "update_time": 1779011991, - "_id": "计划财务部" - }, - "第五条计划财务部主要职责": { - "chunk_ids": [ - "chunk-aa5435156b829944c173fa1d2d7a93d4" - ], - "count": 1, - "create_time": 1779011992, - "update_time": 1779011992, - "_id": "第五条计划财务部主要职责" - }, - "第六条经办部门(个人)主要职责": { - "chunk_ids": [ - "chunk-aa5435156b829944c173fa1d2d7a93d4" - ], - "count": 1, - "create_time": 1779011992, - "update_time": 1779011992, - "_id": "第六条经办部门(个人)主要职责" - }, - "第七条各级管理人员主要职责": { - "chunk_ids": [ - "chunk-aa5435156b829944c173fa1d2d7a93d4" - ], - "count": 1, - "create_time": 1779011992, - "update_time": 1779011992, - "_id": "第七条各级管理人员主要职责" - }, - "第三章支出报销申请与审批": { - "chunk_ids": [ - "chunk-aa5435156b829944c173fa1d2d7a93d4" - ], - "count": 1, - "create_time": 1779011992, - "update_time": 1779011992, - "_id": "第三章支出报销申请与审批" - }, - "第八条支出报销申请": { - "chunk_ids": [ - "chunk-aa5435156b829944c173fa1d2d7a93d4" - ], - "count": 1, - "create_time": 1779011992, - "update_time": 1779011992, - "_id": "第八条支出报销申请" - }, - "第九条支出报销审批": { - "chunk_ids": [ - "chunk-aa5435156b829944c173fa1d2d7a93d4" - ], - "count": 1, - "create_time": 1779011993, - "update_time": 1779011993, - "_id": "第九条支出报销审批" - }, - "第十条支出成本中心归属": { - "chunk_ids": [ - "chunk-aa5435156b829944c173fa1d2d7a93d4" - ], - "count": 1, - "create_time": 1779011993, - "update_time": 1779011993, - "_id": "第十条支出成本中心归属" - }, - "第四章重点支出管理规定": { - "chunk_ids": [ - "chunk-aa5435156b829944c173fa1d2d7a93d4" - ], - "count": 1, - "create_time": 1779011994, - "update_time": 1779011994, - "_id": "第四章重点支出管理规定" - }, - "第十一条备用金借款": { - "chunk_ids": [ - "chunk-aa5435156b829944c173fa1d2d7a93d4" - ], - "count": 1, - "create_time": 1779011994, - "update_time": 1779011994, - "_id": "第十一条备用金借款" - }, - "第十二条市内交通费": { - "chunk_ids": [ - "chunk-aa5435156b829944c173fa1d2d7a93d4" - ], - "count": 1, - "create_time": 1779011994, - "update_time": 1779011994, - "_id": "第十二条市内交通费" - }, - "第十三条差旅费": { - "chunk_ids": [ - "chunk-aa5435156b829944c173fa1d2d7a93d4" - ], - "count": 1, - "create_time": 1779011994, - "update_time": 1779011994, - "_id": "第十三条差旅费" - }, - "第十四条业务招待费": { - "chunk_ids": [ - "chunk-aa5435156b829944c173fa1d2d7a93d4" - ], - "count": 1, - "create_time": 1779011994, - "update_time": 1779011994, - "_id": "第十四条业务招待费" - }, - "第五章附则": { - "chunk_ids": [ - "chunk-aa5435156b829944c173fa1d2d7a93d4" - ], - "count": 1, - "create_time": 1779011994, - "update_time": 1779011994, - "_id": "第五章附则" - }, - "第二十三条本办法的归口与实施": { - "chunk_ids": [ - "chunk-aa5435156b829944c173fa1d2d7a93d4" - ], - "count": 1, - "create_time": 1779011994, - "update_time": 1779011994, - "_id": "第二十三条本办法的归口与实施" - }, - "第二十四条附件": { - "chunk_ids": [ - "chunk-aa5435156b829944c173fa1d2d7a93d4" - ], - "count": 1, - "create_time": 1779011995, - "update_time": 1779011995, - "_id": "第二十四条附件" - }, - "交通工具等级标准": { - "chunk_ids": [ - "chunk-aa5435156b829944c173fa1d2d7a93d4" - ], - "count": 1, - "create_time": 1779011995, - "update_time": 1779011995, - "_id": "交通工具等级标准" - }, - "出差补贴标准": { - "chunk_ids": [ - "chunk-aa5435156b829944c173fa1d2d7a93d4" - ], - "count": 1, - "create_time": 1779011996, - "update_time": 1779011996, - "_id": "出差补贴标准" - }, - "经济舱": { - "chunk_ids": [ - "chunk-aa5435156b829944c173fa1d2d7a93d4" - ], - "count": 1, - "create_time": 1779011996, - "update_time": 1779011996, - "_id": "经济舱" - }, - "火车硬席": { - "chunk_ids": [ - "chunk-aa5435156b829944c173fa1d2d7a93d4" - ], - "count": 1, - "create_time": 1779011996, - "update_time": 1779011996, - "_id": "火车硬席" - }, - "三等舱": { - "chunk_ids": [ - "chunk-aa5435156b829944c173fa1d2d7a93d4" - ], - "count": 1, - "create_time": 1779011996, - "update_time": 1779011996, - "_id": "三等舱" - }, - "凭据报销": { - "chunk_ids": [ - "chunk-aa5435156b829944c173fa1d2d7a93d4" - ], - "count": 1, - "create_time": 1779011997, - "update_time": 1779011997, - "_id": "凭据报销" - }, - "餐补": { - "chunk_ids": [ - "chunk-aa5435156b829944c173fa1d2d7a93d4", - "chunk-d26b288ed4001dc5c504dce0eb841362" - ], - "count": 2, - "create_time": 1779011997, - "update_time": 1779011997, - "_id": "餐补" - }, - "基本补助": { - "chunk_ids": [ - "chunk-aa5435156b829944c173fa1d2d7a93d4" - ], - "count": 1, - "create_time": 1779011997, - "update_time": 1779011997, - "_id": "基本补助" - }, - "公司支出管理办法": { - "chunk_ids": [ - "chunk-afc57a0e9548d1f484da6df6c182676b" - ], - "count": 1, - "create_time": 1779011997, - "update_time": 1779011997, - "_id": "公司支出管理办法" - }, - "办公室(党委办公室)": { - "chunk_ids": [ - "chunk-afc57a0e9548d1f484da6df6c182676b" - ], - "count": 1, - "create_time": 1779011997, - "update_time": 1779011997, - "_id": "办公室(党委办公室)" - }, - "工会委员会": { - "chunk_ids": [ - "chunk-afc57a0e9548d1f484da6df6c182676b" - ], - "count": 1, - "create_time": 1779011998, - "update_time": 1779011998, - "_id": "工会委员会" - }, - "营销中心": { - "chunk_ids": [ - "chunk-afc57a0e9548d1f484da6df6c182676b" - ], - "count": 1, - "create_time": 1779011998, - "update_time": 1779011998, - "_id": "营销中心" - }, - "品牌及市场运营中心": { - "chunk_ids": [ - "chunk-afc57a0e9548d1f484da6df6c182676b", - "chunk-e9438f69c9e221d9f0f00a05ad84eac6" - ], - "count": 2, - "create_time": 1779011998, - "update_time": 1779011998, - "_id": "品牌及市场运营中心" - }, - "组织人事部": { - "chunk_ids": [ - "chunk-afc57a0e9548d1f484da6df6c182676b", - "chunk-e9438f69c9e221d9f0f00a05ad84eac6", - "chunk-18d968b78afe916b419c1b5973421ebe", - "chunk-d26b288ed4001dc5c504dce0eb841362" - ], - "count": 4, - "create_time": 1779011999, - "update_time": 1779011999, - "_id": "组织人事部" - }, - "人力资源服务部": { - "chunk_ids": [ - "chunk-afc57a0e9548d1f484da6df6c182676b" - ], - "count": 1, - "create_time": 1779012000, - "update_time": 1779012000, - "_id": "人力资源服务部" - }, - "产业投资部": { - "chunk_ids": [ - "chunk-afc57a0e9548d1f484da6df6c182676b" - ], - "count": 1, - "create_time": 1779012000, - "update_time": 1779012000, - "_id": "产业投资部" - }, - "证券与法律事务部": { - "chunk_ids": [ - "chunk-afc57a0e9548d1f484da6df6c182676b" - ], - "count": 1, - "create_time": 1779012000, - "update_time": 1779012000, - "_id": "证券与法律事务部" - }, - "产品规划设计部": { - "chunk_ids": [ - "chunk-afc57a0e9548d1f484da6df6c182676b" - ], - "count": 1, - "create_time": 1779012000, - "update_time": 1779012000, - "_id": "产品规划设计部" - }, - "DAP研发中心": { - "chunk_ids": [ - "chunk-afc57a0e9548d1f484da6df6c182676b" - ], - "count": 1, - "create_time": 1779012001, - "update_time": 1779012001, - "_id": "DAP研发中心" - }, - "信息管理部": { - "chunk_ids": [ - "chunk-afc57a0e9548d1f484da6df6c182676b" - ], - "count": 1, - "create_time": 1779012001, - "update_time": 1779012001, - "_id": "信息管理部" - }, - "后勤服务部": { - "chunk_ids": [ - "chunk-afc57a0e9548d1f484da6df6c182676b" - ], - "count": 1, - "create_time": 1779012001, - "update_time": 1779012001, - "_id": "后勤服务部" - }, - "审批权限": { - "chunk_ids": [ - "chunk-afc57a0e9548d1f484da6df6c182676b" - ], - "count": 1, - "create_time": 1779012001, - "update_time": 1779012001, - "_id": "审批权限" - }, - "报销标准": { - "chunk_ids": [ - "chunk-afc57a0e9548d1f484da6df6c182676b" - ], - "count": 1, - "create_time": 1779012002, - "update_time": 1779012002, - "_id": "报销标准" - }, - "差旅费": { - "chunk_ids": [ - "chunk-afc57a0e9548d1f484da6df6c182676b", - "chunk-18d968b78afe916b419c1b5973421ebe", - "chunk-dd87aa5bc62cc9587ecb4c26d35a5263", - "chunk-d26b288ed4001dc5c504dce0eb841362", - "chunk-061324cc36078214691a6fc1cd0aaeea" - ], - "count": 5, - "create_time": 1779012002, - "update_time": 1779012002, - "_id": "差旅费" - }, - "全资子公司": { - "chunk_ids": [ - "chunk-afc57a0e9548d1f484da6df6c182676b", - "chunk-dd87aa5bc62cc9587ecb4c26d35a5263" - ], - "count": 2, - "create_time": 1779012003, - "update_time": 1779012003, - "_id": "全资子公司" - }, - "人事归口管理部门": { - "chunk_ids": [ - "chunk-afc57a0e9548d1f484da6df6c182676b" - ], - "count": 1, - "create_time": 1779012003, - "update_time": 1779012003, - "_id": "人事归口管理部门" - }, - "母公司": { - "chunk_ids": [ - "chunk-afc57a0e9548d1f484da6df6c182676b" - ], - "count": 1, - "create_time": 1779012003, - "update_time": 1779012003, - "_id": "母公司" - }, - "逐级审批规则": { - "chunk_ids": [ - "chunk-afc57a0e9548d1f484da6df6c182676b" - ], - "count": 1, - "create_time": 1779012004, - "update_time": 1779012004, - "_id": "逐级审批规则" - }, - "终审岗": { - "chunk_ids": [ - "chunk-afc57a0e9548d1f484da6df6c182676b" - ], - "count": 1, - "create_time": 1779012004, - "update_time": 1779012004, - "_id": "终审岗" - }, - "财务入账条件": { - "chunk_ids": [ - "chunk-afc57a0e9548d1f484da6df6c182676b" - ], - "count": 1, - "create_time": 1779012004, - "update_time": 1779012004, - "_id": "财务入账条件" - }, - "薪酬福利支出分配计划": { - "chunk_ids": [ - "chunk-afc57a0e9548d1f484da6df6c182676b" - ], - "count": 1, - "create_time": 1779012004, - "update_time": 1779012004, - "_id": "薪酬福利支出分配计划" - }, - "公司1号文": { - "chunk_ids": [ - "chunk-afc57a0e9548d1f484da6df6c182676b" - ], - "count": 1, - "create_time": 1779012004, - "update_time": 1779012004, - "_id": "公司1号文" - }, - "总监": { - "chunk_ids": [ - "chunk-afc57a0e9548d1f484da6df6c182676b" - ], - "count": 1, - "create_time": 1779012004, - "update_time": 1779012004, - "_id": "总监" - }, - "一级部门总经理": { - "chunk_ids": [ - "chunk-afc57a0e9548d1f484da6df6c182676b" - ], - "count": 1, - "create_time": 1779012004, - "update_time": 1779012004, - "_id": "一级部门总经理" - }, - "P8": { - "chunk_ids": [ - "chunk-afc57a0e9548d1f484da6df6c182676b" - ], - "count": 1, - "create_time": 1779012004, - "update_time": 1779012004, - "_id": "P8" - }, - "报销标准变化情况": { - "chunk_ids": [ - "chunk-afc57a0e9548d1f484da6df6c182676b", - "chunk-18d968b78afe916b419c1b5973421ebe" - ], - "count": 2, - "create_time": 1779012005, - "update_time": 1779012005, - "_id": "报销标准变化情况" - }, - "取消报销规定": { - "chunk_ids": [ - "chunk-afc57a0e9548d1f484da6df6c182676b" - ], - "count": 1, - "create_time": 1779012005, - "update_time": 1779012005, - "_id": "取消报销规定" - }, - "新增报销规定": { - "chunk_ids": [ - "chunk-afc57a0e9548d1f484da6df6c182676b" - ], - "count": 1, - "create_time": 1779012005, - "update_time": 1779012005, - "_id": "新增报销规定" - }, - "因公用车补贴": { - "chunk_ids": [ - "chunk-afc57a0e9548d1f484da6df6c182676b" - ], - "count": 1, - "create_time": 1779012006, - "update_time": 1779012006, - "_id": "因公用车补贴" - }, - "异地挂职锻炼补贴标准": { - "chunk_ids": [ - "chunk-afc57a0e9548d1f484da6df6c182676b", - "chunk-18d968b78afe916b419c1b5973421ebe" - ], - "count": 2, - "create_time": 1779012007, - "update_time": 1779012007, - "_id": "异地挂职锻炼补贴标准" - }, - "组织安排": { - "chunk_ids": [ - "chunk-afc57a0e9548d1f484da6df6c182676b" - ], - "count": 1, - "create_time": 1779012007, - "update_time": 1779012007, - "_id": "组织安排" - }, - "Company": { - "chunk_ids": [ - "chunk-74c01decac4a10cd40a491786743b0ee" - ], - "count": 1, - "create_time": 1779012007, - "update_time": 1779012007, - "_id": "Company" - }, - "Management Personnel At All Levels": { - "chunk_ids": [ - "chunk-74c01decac4a10cd40a491786743b0ee" - ], - "count": 1, - "create_time": 1779012007, - "update_time": 1779012007, - "_id": "Management Personnel At All Levels" - }, - "Centralized Management department": { - "chunk_ids": [ - "chunk-74c01decac4a10cd40a491786743b0ee" - ], - "count": 1, - "create_time": 1779012007, - "update_time": 1779012007, - "_id": "Centralized Management department" - }, - "Planning and Finance Department": { - "chunk_ids": [ - "chunk-74c01decac4a10cd40a491786743b0ee" - ], - "count": 1, - "create_time": 1779012007, - "update_time": 1779012007, - "_id": "Planning and Finance Department" - }, - "Operating Department Individual": { - "chunk_ids": [ - "chunk-74c01decac4a10cd40a491786743b0ee" - ], - "count": 1, - "create_time": 1779012008, - "update_time": 1779012008, - "_id": "Operating Department Individual" - }, - "Operator": { - "chunk_ids": [ - "chunk-74c01decac4a10cd40a491786743b0ee" - ], - "count": 1, - "create_time": 1779012009, - "update_time": 1779012009, - "_id": "Operator" - }, - "First Approver": { - "chunk_ids": [ - "chunk-74c01decac4a10cd40a491786743b0ee" - ], - "count": 1, - "create_time": 1779012009, - "update_time": 1779012009, - "_id": "First Approver" - }, - "Subsequent Approver": { - "chunk_ids": [ - "chunk-74c01decac4a10cd40a491786743b0ee" - ], - "count": 1, - "create_time": 1779012009, - "update_time": 1779012009, - "_id": "Subsequent Approver" - }, - "Financial Information System": { - "chunk_ids": [ - "chunk-74c01decac4a10cd40a491786743b0ee" - ], - "count": 1, - "create_time": 1779012009, - "update_time": 1779012009, - "_id": "Financial Information System" - }, - "Business Original Documents": { - "chunk_ids": [ - "chunk-74c01decac4a10cd40a491786743b0ee" - ], - "count": 1, - "create_time": 1779012009, - "update_time": 1779012009, - "_id": "Business Original Documents" - }, - "VAT Special Invoice": { - "chunk_ids": [ - "chunk-74c01decac4a10cd40a491786743b0ee" - ], - "count": 1, - "create_time": 1779011997, - "update_time": 1779011997, - "_id": "VAT Special Invoice" - }, - "Expenditure Reimbursement Application": { - "chunk_ids": [ - "chunk-74c01decac4a10cd40a491786743b0ee" - ], - "count": 1, - "create_time": 1779011997, - "update_time": 1779011997, - "_id": "Expenditure Reimbursement Application" - }, - "Expenditure Authorization Approval Scope": { - "chunk_ids": [ - "chunk-74c01decac4a10cd40a491786743b0ee" - ], - "count": 1, - "create_time": 1779011997, - "update_time": 1779011997, - "_id": "Expenditure Authorization Approval Scope" - }, - "Separation of Approval and Processing Principle": { - "chunk_ids": [ - "chunk-74c01decac4a10cd40a491786743b0ee" - ], - "count": 1, - "create_time": 1779011998, - "update_time": 1779011998, - "_id": "Separation of Approval and Processing Principle" - }, - "Three Flows Consistency Principle": { - "chunk_ids": [ - "chunk-74c01decac4a10cd40a491786743b0ee" - ], - "count": 1, - "create_time": 1779011998, - "update_time": 1779011998, - "_id": "Three Flows Consistency Principle" - }, - "Employee Remuneration": { - "chunk_ids": [ - "chunk-74c01decac4a10cd40a491786743b0ee" - ], - "count": 1, - "create_time": 1779011998, - "update_time": 1779011998, - "_id": "Employee Remuneration" - }, - "Personal Service Compensation": { - "chunk_ids": [ - "chunk-74c01decac4a10cd40a491786743b0ee" - ], - "count": 1, - "create_time": 1779011999, - "update_time": 1779011999, - "_id": "Personal Service Compensation" - }, - "Travel Allowance": { - "chunk_ids": [ - "chunk-74c01decac4a10cd40a491786743b0ee" - ], - "count": 1, - "create_time": 1779011999, - "update_time": 1779011999, - "_id": "Travel Allowance" - }, - "Special Subsidy": { - "chunk_ids": [ - "chunk-74c01decac4a10cd40a491786743b0ee" - ], - "count": 1, - "create_time": 1779011999, - "update_time": 1779011999, - "_id": "Special Subsidy" - }, - "Current Account Payment": { - "chunk_ids": [ - "chunk-74c01decac4a10cd40a491786743b0ee" - ], - "count": 1, - "create_time": 1779011999, - "update_time": 1779011999, - "_id": "Current Account Payment" - }, - "Trade Union Fund": { - "chunk_ids": [ - "chunk-74c01decac4a10cd40a491786743b0ee" - ], - "count": 1, - "create_time": 1779012000, - "update_time": 1779012000, - "_id": "Trade Union Fund" - }, - "Employee Welfare": { - "chunk_ids": [ - "chunk-74c01decac4a10cd40a491786743b0ee" - ], - "count": 1, - "create_time": 1779012000, - "update_time": 1779012000, - "_id": "Employee Welfare" - }, - "Staff Activities": { - "chunk_ids": [ - "chunk-74c01decac4a10cd40a491786743b0ee" - ], - "count": 1, - "create_time": 1779012000, - "update_time": 1779012000, - "_id": "Staff Activities" - }, - "Business Entertainment": { - "chunk_ids": [ - "chunk-74c01decac4a10cd40a491786743b0ee" - ], - "count": 1, - "create_time": 1779012000, - "update_time": 1779012000, - "_id": "Business Entertainment" - }, - "Transportation Tickets": { - "chunk_ids": [ - "chunk-74c01decac4a10cd40a491786743b0ee" - ], - "count": 1, - "create_time": 1779012000, - "update_time": 1779012000, - "_id": "Transportation Tickets" - }, - "Government Fees": { - "chunk_ids": [ - "chunk-74c01decac4a10cd40a491786743b0ee" - ], - "count": 1, - "create_time": 1779012000, - "update_time": 1779012000, - "_id": "Government Fees" - }, - "Tax Control System Details": { - "chunk_ids": [ - "chunk-74c01decac4a10cd40a491786743b0ee" - ], - "count": 1, - "create_time": 1779012000, - "update_time": 1779012000, - "_id": "Tax Control System Details" - }, - "Three Working Days Deadline": { - "chunk_ids": [ - "chunk-74c01decac4a10cd40a491786743b0ee" - ], - "count": 1, - "create_time": 1779012000, - "update_time": 1779012000, - "_id": "Three Working Days Deadline" - }, - "广告费": { - "chunk_ids": [ - "chunk-e9438f69c9e221d9f0f00a05ad84eac6", - "chunk-d26b288ed4001dc5c504dce0eb841362" - ], - "count": 2, - "create_time": 1779012000, - "update_time": 1779012000, - "_id": "广告费" - }, - "业务宣传费": { - "chunk_ids": [ - "chunk-e9438f69c9e221d9f0f00a05ad84eac6", - "chunk-d26b288ed4001dc5c504dce0eb841362" - ], - "count": 2, - "create_time": 1779012001, - "update_time": 1779012001, - "_id": "业务宣传费" - }, - "培训费": { - "chunk_ids": [ - "chunk-e9438f69c9e221d9f0f00a05ad84eac6", - "chunk-dd87aa5bc62cc9587ecb4c26d35a5263" - ], - "count": 2, - "create_time": 1779012001, - "update_time": 1779012001, - "_id": "培训费" - }, - "通信费": { - "chunk_ids": [ - "chunk-e9438f69c9e221d9f0f00a05ad84eac6", - "chunk-dd87aa5bc62cc9587ecb4c26d35a5263" - ], - "count": 2, - "create_time": 1779012002, - "update_time": 1779012002, - "_id": "通信费" - }, - "邮递费": { - "chunk_ids": [ - "chunk-e9438f69c9e221d9f0f00a05ad84eac6" - ], - "count": 1, - "create_time": 1779012004, - "update_time": 1779012004, - "_id": "邮递费" - }, - "薪酬福利支出": { - "chunk_ids": [ - "chunk-e9438f69c9e221d9f0f00a05ad84eac6" - ], - "count": 1, - "create_time": 1779012005, - "update_time": 1779012005, - "_id": "薪酬福利支出" - }, - "对外捐赠支出": { - "chunk_ids": [ - "chunk-e9438f69c9e221d9f0f00a05ad84eac6" - ], - "count": 1, - "create_time": 1779012005, - "update_time": 1779012005, - "_id": "对外捐赠支出" - }, - "涉外业务汇率标准": { - "chunk_ids": [ - "chunk-e9438f69c9e221d9f0f00a05ad84eac6" - ], - "count": 1, - "create_time": 1779012005, - "update_time": 1779012005, - "_id": "涉外业务汇率标准" - }, - "公司员工教育培训管理办法": { - "chunk_ids": [ - "chunk-e9438f69c9e221d9f0f00a05ad84eac6" - ], - "count": 1, - "create_time": 1779012006, - "update_time": 1779012006, - "_id": "公司员工教育培训管理办法" - }, - "公司员工因公通讯费用实施细则": { - "chunk_ids": [ - "chunk-e9438f69c9e221d9f0f00a05ad84eac6" - ], - "count": 1, - "create_time": 1779012006, - "update_time": 1779012006, - "_id": "公司员工因公通讯费用实施细则" - }, - "公司团建管理办法": { - "chunk_ids": [ - "chunk-e9438f69c9e221d9f0f00a05ad84eac6" - ], - "count": 1, - "create_time": 1779012006, - "update_time": 1779012006, - "_id": "公司团建管理办法" - }, - "工会经费管理办法": { - "chunk_ids": [ - "chunk-e9438f69c9e221d9f0f00a05ad84eac6" - ], - "count": 1, - "create_time": 1779012006, - "update_time": 1779012006, - "_id": "工会经费管理办法" - }, - "中国银行外汇折算价": { - "chunk_ids": [ - "chunk-e9438f69c9e221d9f0f00a05ad84eac6" - ], - "count": 1, - "create_time": 1779012019, - "update_time": 1779012019, - "_id": "中国银行外汇折算价" - }, - "中国外汇交易中心参考汇率": { - "chunk_ids": [ - "chunk-e9438f69c9e221d9f0f00a05ad84eac6" - ], - "count": 1, - "create_time": 1779012007, - "update_time": 1779012007, - "_id": "中国外汇交易中心参考汇率" - }, - "第十七条": { - "chunk_ids": [ - "chunk-e9438f69c9e221d9f0f00a05ad84eac6" - ], - "count": 1, - "create_time": 1779012008, - "update_time": 1779012008, - "_id": "第十七条" - }, - "第十八条": { - "chunk_ids": [ - "chunk-e9438f69c9e221d9f0f00a05ad84eac6" - ], - "count": 1, - "create_time": 1779012008, - "update_time": 1779012008, - "_id": "第十八条" - }, - "第十九条": { - "chunk_ids": [ - "chunk-e9438f69c9e221d9f0f00a05ad84eac6" - ], - "count": 1, - "create_time": 1779012008, - "update_time": 1779012008, - "_id": "第十九条" - }, - "第二十条": { - "chunk_ids": [ - "chunk-e9438f69c9e221d9f0f00a05ad84eac6" - ], - "count": 1, - "create_time": 1779012008, - "update_time": 1779012008, - "_id": "第二十条" - }, - "第二十一条": { - "chunk_ids": [ - "chunk-e9438f69c9e221d9f0f00a05ad84eac6" - ], - "count": 1, - "create_time": 1779012009, - "update_time": 1779012009, - "_id": "第二十一条" - }, - "第二十二条": { - "chunk_ids": [ - "chunk-e9438f69c9e221d9f0f00a05ad84eac6" - ], - "count": 1, - "create_time": 1779012009, - "update_time": 1779012009, - "_id": "第二十二条" - }, - "第二十三条": { - "chunk_ids": [ - "chunk-e9438f69c9e221d9f0f00a05ad84eac6" - ], - "count": 1, - "create_time": 1779012009, - "update_time": 1779012009, - "_id": "第二十三条" - }, - "第二十四条": { - "chunk_ids": [ - "chunk-e9438f69c9e221d9f0f00a05ad84eac6" - ], - "count": 1, - "create_time": 1779012009, - "update_time": 1779012009, - "_id": "第二十四条" - }, - "附表1:员工支出报销审批权限表": { - "chunk_ids": [ - "chunk-e9438f69c9e221d9f0f00a05ad84eac6" - ], - "count": 1, - "create_time": 1779012009, - "update_time": 1779012009, - "_id": "附表1:员工支出报销审批权限表" - }, - "附表2:岗位支出报销审批权限表": { - "chunk_ids": [ - "chunk-e9438f69c9e221d9f0f00a05ad84eac6" - ], - "count": 1, - "create_time": 1779012011, - "update_time": 1779012011, - "_id": "附表2:岗位支出报销审批权限表" - }, - "附表3:支出归口管理部门与归口业务范围": { - "chunk_ids": [ - "chunk-e9438f69c9e221d9f0f00a05ad84eac6" - ], - "count": 1, - "create_time": 1779012011, - "update_time": 1779012011, - "_id": "附表3:支出归口管理部门与归口业务范围" - }, - "业务招待": { - "chunk_ids": [ - "chunk-e9438f69c9e221d9f0f00a05ad84eac6", - "chunk-9841d66d8fb8548aab40220663a51693" - ], - "count": 2, - "create_time": 1779012012, - "update_time": 1779012012, - "_id": "业务招待" - }, - "报销资格": { - "chunk_ids": [ - "chunk-e9438f69c9e221d9f0f00a05ad84eac6" - ], - "count": 1, - "create_time": 1779012012, - "update_time": 1779012012, - "_id": "报销资格" - }, - "捐赠申请": { - "chunk_ids": [ - "chunk-e9438f69c9e221d9f0f00a05ad84eac6" - ], - "count": 1, - "create_time": 1779012012, - "update_time": 1779012012, - "_id": "捐赠申请" - }, - "预算调整决策程序": { - "chunk_ids": [ - "chunk-e9438f69c9e221d9f0f00a05ad84eac6" - ], - "count": 1, - "create_time": 1779012012, - "update_time": 1779012012, - "_id": "预算调整决策程序" - }, - "Departments And Units": { - "chunk_ids": [ - "chunk-613d6dfd4c5e9c807229a3147f96b584" - ], - "count": 1, - "create_time": 1779012012, - "update_time": 1779012012, - "_id": "Departments And Units" - }, - "Company Business Travel System": { - "chunk_ids": [ - "chunk-613d6dfd4c5e9c807229a3147f96b584" - ], - "count": 1, - "create_time": 1779012012, - "update_time": 1779012012, - "_id": "Company Business Travel System" - }, - "Transportation Level Standards": { - "chunk_ids": [ - "chunk-613d6dfd4c5e9c807229a3147f96b584" - ], - "count": 1, - "create_time": 1779012012, - "update_time": 1779012012, - "_id": "Transportation Level Standards" - }, - "Hotel Accommodation Standards": { - "chunk_ids": [ - "chunk-613d6dfd4c5e9c807229a3147f96b584" - ], - "count": 1, - "create_time": 1779012013, - "update_time": 1779012013, - "_id": "Hotel Accommodation Standards" - }, - "Travel Allowance Standards": { - "chunk_ids": [ - "chunk-613d6dfd4c5e9c807229a3147f96b584" - ], - "count": 1, - "create_time": 1779012013, - "update_time": 1779012013, - "_id": "Travel Allowance Standards" - }, - "Company Property Rental Management": { - "chunk_ids": [ - "chunk-613d6dfd4c5e9c807229a3147f96b584" - ], - "count": 1, - "create_time": 1779012013, - "update_time": 1779012013, - "_id": "Company Property Rental Management" - }, - "Business Trip Approval": { - "chunk_ids": [ - "chunk-613d6dfd4c5e9c807229a3147f96b584" - ], - "count": 1, - "create_time": 1779012013, - "update_time": 1779012013, - "_id": "Business Trip Approval" - }, - "Company Leadership": { - "chunk_ids": [ - "chunk-613d6dfd4c5e9c807229a3147f96b584" - ], - "count": 1, - "create_time": 1779012013, - "update_time": 1779012013, - "_id": "Company Leadership" - }, - "Senior Managers": { - "chunk_ids": [ - "chunk-613d6dfd4c5e9c807229a3147f96b584" - ], - "count": 1, - "create_time": 1779012014, - "update_time": 1779012014, - "_id": "Senior Managers" - }, - "Middle Managers": { - "chunk_ids": [ - "chunk-613d6dfd4c5e9c807229a3147f96b584" - ], - "count": 1, - "create_time": 1779012014, - "update_time": 1779012014, - "_id": "Middle Managers" - }, - "Basic Level Managers": { - "chunk_ids": [ - "chunk-613d6dfd4c5e9c807229a3147f96b584" - ], - "count": 1, - "create_time": 1779012015, - "update_time": 1779012015, - "_id": "Basic Level Managers" - }, - "Other Employees": { - "chunk_ids": [ - "chunk-613d6dfd4c5e9c807229a3147f96b584" - ], - "count": 1, - "create_time": 1779012015, - "update_time": 1779012015, - "_id": "Other Employees" - }, - "Remote Work Housing": { - "chunk_ids": [ - "chunk-613d6dfd4c5e9c807229a3147f96b584" - ], - "count": 1, - "create_time": 1779012015, - "update_time": 1779012015, - "_id": "Remote Work Housing" - }, - "Commercial Insurance": { - "chunk_ids": [ - "chunk-613d6dfd4c5e9c807229a3147f96b584" - ], - "count": 1, - "create_time": 1779012015, - "update_time": 1779012015, - "_id": "Commercial Insurance" - }, - "Transportation Cost Reimbursement": { - "chunk_ids": [ - "chunk-613d6dfd4c5e9c807229a3147f96b584" - ], - "count": 1, - "create_time": 1779012016, - "update_time": 1779012016, - "_id": "Transportation Cost Reimbursement" - }, - "Accommodation Cost Reimbursement": { - "chunk_ids": [ - "chunk-613d6dfd4c5e9c807229a3147f96b584" - ], - "count": 1, - "create_time": 1779012016, - "update_time": 1779012016, - "_id": "Accommodation Cost Reimbursement" - }, - "Hong Kong, Macau, And Taiwan Region": { - "chunk_ids": [ - "chunk-613d6dfd4c5e9c807229a3147f96b584" - ], - "count": 1, - "create_time": 1779012016, - "update_time": 1779012016, - "_id": "Hong Kong, Macau, And Taiwan Region" - }, - "Directly-Controlled Municipalities And Special Administrative Regions": { - "chunk_ids": [ - "chunk-613d6dfd4c5e9c807229a3147f96b584" - ], - "count": 1, - "create_time": 1779012016, - "update_time": 1779012016, - "_id": "Directly-Controlled Municipalities And Special Administrative Regions" - }, - "Provincial Capitals": { - "chunk_ids": [ - "chunk-613d6dfd4c5e9c807229a3147f96b584" - ], - "count": 1, - "create_time": 1779012016, - "update_time": 1779012016, - "_id": "Provincial Capitals" - }, - "Other Areas": { - "chunk_ids": [ - "chunk-613d6dfd4c5e9c807229a3147f96b584" - ], - "count": 1, - "create_time": 1779012017, - "update_time": 1779012017, - "_id": "Other Areas" - }, - "Night High-Speed Rail Provision": { - "chunk_ids": [ - "chunk-613d6dfd4c5e9c807229a3147f96b584" - ], - "count": 1, - "create_time": 1779012017, - "update_time": 1779012017, - "_id": "Night High-Speed Rail Provision" - }, - "Taxi Usage Regulations": { - "chunk_ids": [ - "chunk-613d6dfd4c5e9c807229a3147f96b584" - ], - "count": 1, - "create_time": 1779012017, - "update_time": 1779012017, - "_id": "Taxi Usage Regulations" - }, - "Self-Driving Travel Provisions": { - "chunk_ids": [ - "chunk-613d6dfd4c5e9c807229a3147f96b584" - ], - "count": 1, - "create_time": 1779012017, - "update_time": 1779012017, - "_id": "Self-Driving Travel Provisions" - }, - "Remote Work Housing Rental Expenses": { - "chunk_ids": [ - "chunk-613d6dfd4c5e9c807229a3147f96b584" - ], - "count": 1, - "create_time": 1779012018, - "update_time": 1779012018, - "_id": "Remote Work Housing Rental Expenses" - }, - "External Conference Accommodation": { - "chunk_ids": [ - "chunk-613d6dfd4c5e9c807229a3147f96b584" - ], - "count": 1, - "create_time": 1779012018, - "update_time": 1779012018, - "_id": "External Conference Accommodation" - }, - "取消报销规定内容": { - "chunk_ids": [ - "chunk-18d968b78afe916b419c1b5973421ebe" - ], - "count": 1, - "create_time": 1779012018, - "update_time": 1779012018, - "_id": "取消报销规定内容" - }, - "新增规定内容": { - "chunk_ids": [ - "chunk-18d968b78afe916b419c1b5973421ebe" - ], - "count": 1, - "create_time": 1779012018, - "update_time": 1779012018, - "_id": "新增规定内容" - }, - "商旅订票规范": { - "chunk_ids": [ - "chunk-18d968b78afe916b419c1b5973421ebe" - ], - "count": 1, - "create_time": 1779012018, - "update_time": 1779012018, - "_id": "商旅订票规范" - }, - "审批权限变化情况": { - "chunk_ids": [ - "chunk-18d968b78afe916b419c1b5973421ebe" - ], - "count": 1, - "create_time": 1779012019, - "update_time": 1779012019, - "_id": "审批权限变化情况" - }, - "投标保证金": { - "chunk_ids": [ - "chunk-18d968b78afe916b419c1b5973421ebe" - ], - "count": 1, - "create_time": 1779012019, - "update_time": 1779012019, - "_id": "投标保证金" - }, - "审批流转程序": { - "chunk_ids": [ - "chunk-18d968b78afe916b419c1b5973421ebe" - ], - "count": 1, - "create_time": 1779012019, - "update_time": 1779012019, - "_id": "审批流转程序" - }, - "出差规定": { - "chunk_ids": [ - "chunk-18d968b78afe916b419c1b5973421ebe" - ], - "count": 1, - "create_time": 1779012019, - "update_time": 1779012019, - "_id": "出差规定" - }, - "财务信息化系统": { - "chunk_ids": [ - "chunk-18d968b78afe916b419c1b5973421ebe" - ], - "count": 1, - "create_time": 1779012020, - "update_time": 1779012020, - "_id": "财务信息化系统" - }, - "支出报销申请与审批": { - "chunk_ids": [ - "chunk-18d968b78afe916b419c1b5973421ebe", - "chunk-dd87aa5bc62cc9587ecb4c26d35a5263" - ], - "count": 2, - "create_time": 1779012020, - "update_time": 1779012020, - "_id": "支出报销申请与审批" - }, - "重点支出管理规定": { - "chunk_ids": [ - "chunk-18d968b78afe916b419c1b5973421ebe" - ], - "count": 1, - "create_time": 1779012020, - "update_time": 1779012020, - "_id": "重点支出管理规定" - }, - "备用金借款": { - "chunk_ids": [ - "chunk-18d968b78afe916b419c1b5973421ebe", - "chunk-dd87aa5bc62cc9587ecb4c26d35a5263", - "chunk-061324cc36078214691a6fc1cd0aaeea" - ], - "count": 3, - "create_time": 1779012020, - "update_time": 1779012020, - "_id": "备用金借款" - }, - "市内交通费": { - "chunk_ids": [ - "chunk-18d968b78afe916b419c1b5973421ebe", - "chunk-dd87aa5bc62cc9587ecb4c26d35a5263", - "chunk-061324cc36078214691a6fc1cd0aaeea" - ], - "count": 3, - "create_time": 1779012022, - "update_time": 1779012022, - "_id": "市内交通费" - }, - "审批权限表": { - "chunk_ids": [ - "chunk-18d968b78afe916b419c1b5973421ebe" - ], - "count": 1, - "create_time": 1779012022, - "update_time": 1779012022, - "_id": "审批权限表" - }, - "1 Yuan Per Person Per Kilometer Reimbursement": { - "chunk_ids": [ - "chunk-18d968b78afe916b419c1b5973421ebe" - ], - "count": 1, - "create_time": 1779012023, - "update_time": 1779012023, - "_id": "1 Yuan Per Person Per Kilometer Reimbursement" - }, - "Official Vehicle Subsidy": { - "chunk_ids": [ - "chunk-18d968b78afe916b419c1b5973421ebe" - ], - "count": 1, - "create_time": 1779012023, - "update_time": 1779012023, - "_id": "Official Vehicle Subsidy" - }, - "Department Manager": { - "chunk_ids": [ - "chunk-18d968b78afe916b419c1b5973421ebe" - ], - "count": 1, - "create_time": 1779012023, - "update_time": 1779012023, - "_id": "Department Manager" - }, - "Director": { - "chunk_ids": [ - "chunk-18d968b78afe916b419c1b5973421ebe" - ], - "count": 1, - "create_time": 1779012023, - "update_time": 1779012023, - "_id": "Director" - }, - "First-Level Department General Manager": { - "chunk_ids": [ - "chunk-18d968b78afe916b419c1b5973421ebe" - ], - "count": 1, - "create_time": 1779012023, - "update_time": 1779012023, - "_id": "First-Level Department General Manager" - }, - "Institution General Manager": { - "chunk_ids": [ - "chunk-18d968b78afe916b419c1b5973421ebe" - ], - "count": 1, - "create_time": 1779012023, - "update_time": 1779012023, - "_id": "Institution General Manager" - }, - "Business Division General Manager": { - "chunk_ids": [ - "chunk-18d968b78afe916b419c1b5973421ebe" - ], - "count": 1, - "create_time": 1779012023, - "update_time": 1779012023, - "_id": "Business Division General Manager" - }, - "Vice President": { - "chunk_ids": [ - "chunk-18d968b78afe916b419c1b5973421ebe" - ], - "count": 1, - "create_time": 1779012023, - "update_time": 1779012023, - "_id": "Vice President" - }, - "Chief Engineer": { - "chunk_ids": [ - "chunk-18d968b78afe916b419c1b5973421ebe" - ], - "count": 1, - "create_time": 1779012023, - "update_time": 1779012023, - "_id": "Chief Engineer" - }, - "Senior Vice President": { - "chunk_ids": [ - "chunk-18d968b78afe916b419c1b5973421ebe" - ], - "count": 1, - "create_time": 1779012024, - "update_time": 1779012024, - "_id": "Senior Vice President" - }, - "President": { - "chunk_ids": [ - "chunk-18d968b78afe916b419c1b5973421ebe" - ], - "count": 1, - "create_time": 1779012024, - "update_time": 1779012024, - "_id": "President" - }, - "Committee Chairpersons": { - "chunk_ids": [ - "chunk-18d968b78afe916b419c1b5973421ebe" - ], - "count": 1, - "create_time": 1779012024, - "update_time": 1779012024, - "_id": "Committee Chairpersons" - }, - "Bid Security Deposit Approval Limits Table": { - "chunk_ids": [ - "chunk-18d968b78afe916b419c1b5973421ebe" - ], - "count": 1, - "create_time": 1779012024, - "update_time": 1779012024, - "_id": "Bid Security Deposit Approval Limits Table" - }, - "50000 Yuan Approval Limit": { - "chunk_ids": [ - "chunk-18d968b78afe916b419c1b5973421ebe" - ], - "count": 1, - "create_time": 1779012024, - "update_time": 1779012024, - "_id": "50000 Yuan Approval Limit" - }, - "100000 Yuan Approval Limit": { - "chunk_ids": [ - "chunk-18d968b78afe916b419c1b5973421ebe" - ], - "count": 1, - "create_time": 1779012025, - "update_time": 1779012025, - "_id": "100000 Yuan Approval Limit" - }, - "200000 Yuan Approval Limit": { - "chunk_ids": [ - "chunk-18d968b78afe916b419c1b5973421ebe" - ], - "count": 1, - "create_time": 1779012025, - "update_time": 1779012025, - "_id": "200000 Yuan Approval Limit" - }, - "5000000 Yuan Approval Limit": { - "chunk_ids": [ - "chunk-18d968b78afe916b419c1b5973421ebe" - ], - "count": 1, - "create_time": 1779012025, - "update_time": 1779012025, - "_id": "5000000 Yuan Approval Limit" - }, - "Commercial Travel System": { - "chunk_ids": [ - "chunk-18d968b78afe916b419c1b5973421ebe" - ], - "count": 1, - "create_time": 1779012026, - "update_time": 1779012026, - "_id": "Commercial Travel System" - }, - "Multi-Level Approval Rule": { - "chunk_ids": [ - "chunk-18d968b78afe916b419c1b5973421ebe" - ], - "count": 1, - "create_time": 1779012026, - "update_time": 1779012026, - "_id": "Multi-Level Approval Rule" - }, - "Final Approval Position": { - "chunk_ids": [ - "chunk-18d968b78afe916b419c1b5973421ebe" - ], - "count": 1, - "create_time": 1779012026, - "update_time": 1779012026, - "_id": "Final Approval Position" - }, - "Company Hotel Accommodation Limit Standards": { - "chunk_ids": [ - "chunk-18d968b78afe916b419c1b5973421ebe" - ], - "count": 1, - "create_time": 1779012026, - "update_time": 1779012026, - "_id": "Company Hotel Accommodation Limit Standards" - }, - "公司支出管理办法(2024)": { - "chunk_ids": [ - "chunk-dd87aa5bc62cc9587ecb4c26d35a5263" - ], - "count": 1, - "create_time": 1779012026, - "update_time": 1779012026, - "_id": "公司支出管理办法(2024)" - }, - "国家电网公司": { - "chunk_ids": [ - "chunk-dd87aa5bc62cc9587ecb4c26d35a5263" - ], - "count": 1, - "create_time": 1779012038, - "update_time": 1779012038, - "_id": "国家电网公司" - }, - "国网数科公司": { - "chunk_ids": [ - "chunk-dd87aa5bc62cc9587ecb4c26d35a5263" - ], - "count": 1, - "create_time": 1779012039, - "update_time": 1779012039, - "_id": "国网数科公司" - }, - "办法": { - "chunk_ids": [ - "chunk-dd87aa5bc62cc9587ecb4c26d35a5263" - ], - "count": 1, - "create_time": 1779012039, - "update_time": 1779012039, - "_id": "办法" - }, - "2024年4月17日": { - "chunk_ids": [ - "chunk-dd87aa5bc62cc9587ecb4c26d35a5263" - ], - "count": 1, - "create_time": 1779012027, - "update_time": 1779012027, - "_id": "2024年4月17日" - }, - "预算先行": { - "chunk_ids": [ - "chunk-dd87aa5bc62cc9587ecb4c26d35a5263" - ], - "count": 1, - "create_time": 1779012028, - "update_time": 1779012028, - "_id": "预算先行" - }, - "厉行节约": { - "chunk_ids": [ - "chunk-dd87aa5bc62cc9587ecb4c26d35a5263" - ], - "count": 1, - "create_time": 1779012028, - "update_time": 1779012028, - "_id": "厉行节约" - }, - "分级授权": { - "chunk_ids": [ - "chunk-dd87aa5bc62cc9587ecb4c26d35a5263" - ], - "count": 1, - "create_time": 1779012028, - "update_time": 1779012028, - "_id": "分级授权" - }, - "分类控制": { - "chunk_ids": [ - "chunk-dd87aa5bc62cc9587ecb4c26d35a5263" - ], - "count": 1, - "create_time": 1779012028, - "update_time": 1779012028, - "_id": "分类控制" - }, - "批办分离": { - "chunk_ids": [ - "chunk-dd87aa5bc62cc9587ecb4c26d35a5263" - ], - "count": 1, - "create_time": 1779012029, - "update_time": 1779012029, - "_id": "批办分离" - }, - "业务招待费": { - "chunk_ids": [ - "chunk-dd87aa5bc62cc9587ecb4c26d35a5263", - "chunk-d26b288ed4001dc5c504dce0eb841362" - ], - "count": 2, - "create_time": 1779012029, - "update_time": 1779012029, - "_id": "业务招待费" - }, - "会议费": { - "chunk_ids": [ - "chunk-dd87aa5bc62cc9587ecb4c26d35a5263", - "chunk-d26b288ed4001dc5c504dce0eb841362" - ], - "count": 2, - "create_time": 1779012029, - "update_time": 1779012029, - "_id": "会议费" - }, - "广告宣传费": { - "chunk_ids": [ - "chunk-dd87aa5bc62cc9587ecb4c26d35a5263", - "chunk-d26b288ed4001dc5c504dce0eb841362" - ], - "count": 2, - "update_time": 1779012089, - "_id": "广告宣传费" - }, - "控股子公司": { - "chunk_ids": [ - "chunk-dd87aa5bc62cc9587ecb4c26d35a5263" - ], - "count": 1, - "create_time": 1779012029, - "update_time": 1779012029, - "_id": "控股子公司" - }, - "分支机构": { - "chunk_ids": [ - "chunk-dd87aa5bc62cc9587ecb4c26d35a5263" - ], - "count": 1, - "create_time": 1779012029, - "update_time": 1779012029, - "_id": "分支机构" - }, - "经办部门": { - "chunk_ids": [ - "chunk-dd87aa5bc62cc9587ecb4c26d35a5263" - ], - "count": 1, - "create_time": 1779012029, - "update_time": 1779012029, - "_id": "经办部门" - }, - "各级管理人员": { - "chunk_ids": [ - "chunk-dd87aa5bc62cc9587ecb4c26d35a5263" - ], - "count": 1, - "create_time": 1779012030, - "update_time": 1779012030, - "_id": "各级管理人员" - }, - "归口管理部门": { - "chunk_ids": [ - "chunk-dd87aa5bc62cc9587ecb4c26d35a5263" - ], - "count": 1, - "create_time": 1779012044, - "update_time": 1779012044, - "_id": "归口管理部门" - }, - "远光制度〔2024〕14号": { - "chunk_ids": [ - "chunk-dd87aa5bc62cc9587ecb4c26d35a5263" - ], - "count": 1, - "create_time": 1779012044, - "update_time": 1779012044, - "_id": "远光制度〔2024〕14号" - }, - "修订说明": { - "chunk_ids": [ - "chunk-dd87aa5bc62cc9587ecb4c26d35a5263" - ], - "count": 1, - "create_time": 1779012032, - "update_time": 1779012032, - "_id": "修订说明" - }, - "员工支出报销审批权限表": { - "chunk_ids": [ - "chunk-dd87aa5bc62cc9587ecb4c26d35a5263", - "chunk-9841d66d8fb8548aab40220663a51693" - ], - "count": 2, - "create_time": 1779012032, - "update_time": 1779012032, - "_id": "员工支出报销审批权限表" - }, - "岗位支出报销审批权限表": { - "chunk_ids": [ - "chunk-dd87aa5bc62cc9587ecb4c26d35a5263", - "chunk-9841d66d8fb8548aab40220663a51693" - ], - "count": 2, - "create_time": 1779012032, - "update_time": 1779012032, - "_id": "岗位支出报销审批权限表" - }, - "支出归口管理部门与归口业务范围": { - "chunk_ids": [ - "chunk-dd87aa5bc62cc9587ecb4c26d35a5263" - ], - "count": 1, - "create_time": 1779012033, - "update_time": 1779012033, - "_id": "支出归口管理部门与归口业务范围" - }, - "效益优先": { - "chunk_ids": [ - "chunk-dd87aa5bc62cc9587ecb4c26d35a5263" - ], - "count": 1, - "create_time": 1779012033, - "update_time": 1779012033, - "_id": "效益优先" - }, - "公司各部门": { - "chunk_ids": [ - "chunk-dd87aa5bc62cc9587ecb4c26d35a5263" - ], - "count": 1, - "create_time": 1779012033, - "update_time": 1779012033, - "_id": "公司各部门" - }, - "因公借款": { - "chunk_ids": [ - "chunk-9841d66d8fb8548aab40220663a51693" - ], - "count": 1, - "create_time": 1779012033, - "update_time": 1779012033, - "_id": "因公借款" - }, - "其他支出(员工)": { - "chunk_ids": [ - "chunk-9841d66d8fb8548aab40220663a51693" - ], - "count": 1, - "create_time": 1779012034, - "update_time": 1779012034, - "_id": "其他支出(员工)" - }, - "资产采购": { - "chunk_ids": [ - "chunk-9841d66d8fb8548aab40220663a51693" - ], - "count": 1, - "create_time": 1779012034, - "update_time": 1779012034, - "_id": "资产采购" - }, - "基建工程": { - "chunk_ids": [ - "chunk-9841d66d8fb8548aab40220663a51693" - ], - "count": 1, - "create_time": 1779012034, - "update_time": 1779012034, - "_id": "基建工程" - }, - "股权投资、兼并收购": { - "chunk_ids": [ - "chunk-9841d66d8fb8548aab40220663a51693" - ], - "count": 1, - "create_time": 1779012036, - "update_time": 1779012036, - "_id": "股权投资、兼并收购" - }, - "材料采购": { - "chunk_ids": [ - "chunk-9841d66d8fb8548aab40220663a51693" - ], - "count": 1, - "create_time": 1779012036, - "update_time": 1779012036, - "_id": "材料采购" - }, - "分包外包(内部单位)": { - "chunk_ids": [ - "chunk-9841d66d8fb8548aab40220663a51693" - ], - "count": 1, - "create_time": 1779012036, - "update_time": 1779012036, - "_id": "分包外包(内部单位)" - }, - "分包外包(外部单位)": { - "chunk_ids": [ - "chunk-9841d66d8fb8548aab40220663a51693" - ], - "count": 1, - "create_time": 1779012036, - "update_time": 1779012036, - "_id": "分包外包(外部单位)" - }, - "保证金": { - "chunk_ids": [ - "chunk-9841d66d8fb8548aab40220663a51693" - ], - "count": 1, - "create_time": 1779012036, - "update_time": 1779012036, - "_id": "保证金" - }, - "销售退款": { - "chunk_ids": [ - "chunk-9841d66d8fb8548aab40220663a51693" - ], - "count": 1, - "create_time": 1779012036, - "update_time": 1779012036, - "_id": "销售退款" - }, - "房屋租金": { - "chunk_ids": [ - "chunk-9841d66d8fb8548aab40220663a51693" - ], - "count": 1, - "create_time": 1779012036, - "update_time": 1779012036, - "_id": "房屋租金" - }, - "基本出差补贴": { - "chunk_ids": [ - "chunk-d26b288ed4001dc5c504dce0eb841362" - ], - "count": 1, - "create_time": 1779012048, - "update_time": 1779012048, - "_id": "基本出差补贴" - }, - "商旅系统": { - "chunk_ids": [ - "chunk-d26b288ed4001dc5c504dce0eb841362", - "chunk-061324cc36078214691a6fc1cd0aaeea" - ], - "count": 2, - "create_time": 1779012049, - "update_time": 1779012049, - "_id": "商旅系统" - }, - "业务佐证材料": { - "chunk_ids": [ - "chunk-d26b288ed4001dc5c504dce0eb841362" - ], - "count": 1, - "create_time": 1779012036, - "update_time": 1779012036, - "_id": "业务佐证材料" - }, - "探亲路费": { - "chunk_ids": [ - "chunk-d26b288ed4001dc5c504dce0eb841362" - ], - "count": 1, - "create_time": 1779012037, - "update_time": 1779012037, - "_id": "探亲路费" - }, - "调动工作": { - "chunk_ids": [ - "chunk-d26b288ed4001dc5c504dce0eb841362" - ], - "count": 1, - "create_time": 1779012037, - "update_time": 1779012037, - "_id": "调动工作" - }, - "直辖市": { - "chunk_ids": [ - "chunk-d26b288ed4001dc5c504dce0eb841362" - ], - "count": 1, - "create_time": 1779012037, - "update_time": 1779012037, - "_id": "直辖市" - }, - "特区": { - "chunk_ids": [ - "chunk-d26b288ed4001dc5c504dce0eb841362" - ], - "count": 1, - "create_time": 1779012037, - "update_time": 1779012037, - "_id": "特区" - }, - "西藏": { - "chunk_ids": [ - "chunk-d26b288ed4001dc5c504dce0eb841362" - ], - "count": 1, - "create_time": 1779012037, - "update_time": 1779012037, - "_id": "西藏" - }, - "第十四条": { - "chunk_ids": [ - "chunk-d26b288ed4001dc5c504dce0eb841362" - ], - "count": 1, - "create_time": 1779012038, - "update_time": 1779012038, - "_id": "第十四条" - }, - "第十五条": { - "chunk_ids": [ - "chunk-d26b288ed4001dc5c504dce0eb841362" - ], - "count": 1, - "create_time": 1779012038, - "update_time": 1779012038, - "_id": "第十五条" - }, - "第十六条": { - "chunk_ids": [ - "chunk-d26b288ed4001dc5c504dce0eb841362" - ], - "count": 1, - "create_time": 1779012038, - "update_time": 1779012038, - "_id": "第十六条" - }, - "公司总裁": { - "chunk_ids": [ - "chunk-d26b288ed4001dc5c504dce0eb841362", - "chunk-061324cc36078214691a6fc1cd0aaeea" - ], - "count": 2, - "create_time": 1779012038, - "update_time": 1779012038, - "_id": "公司总裁" - }, - "商旅客服": { - "chunk_ids": [ - "chunk-d26b288ed4001dc5c504dce0eb841362" - ], - "count": 1, - "create_time": 1779012038, - "update_time": 1779012038, - "_id": "商旅客服" - }, - "公司员工探亲管理办法": { - "chunk_ids": [ - "chunk-d26b288ed4001dc5c504dce0eb841362" - ], - "count": 1, - "create_time": 1779012039, - "update_time": 1779012039, - "_id": "公司员工探亲管理办法" - }, - "增值税发票": { - "chunk_ids": [ - "chunk-061324cc36078214691a6fc1cd0aaeea" - ], - "count": 1, - "create_time": 1779012039, - "update_time": 1779012039, - "_id": "增值税发票" - }, - "税控系统明细清单": { - "chunk_ids": [ - "chunk-061324cc36078214691a6fc1cd0aaeea" - ], - "count": 1, - "create_time": 1779012039, - "update_time": 1779012039, - "_id": "税控系统明细清单" - }, - "财务": { - "chunk_ids": [ - "chunk-061324cc36078214691a6fc1cd0aaeea" - ], - "count": 1, - "create_time": 1779012039, - "update_time": 1779012039, - "_id": "财务" - }, - "经办人": { - "chunk_ids": [ - "chunk-061324cc36078214691a6fc1cd0aaeea" - ], - "count": 1, - "create_time": 1779012039, - "update_time": 1779012039, - "_id": "经办人" - }, - "业务原始凭据": { - "chunk_ids": [ - "chunk-061324cc36078214691a6fc1cd0aaeea" - ], - "count": 1, - "create_time": 1779012039, - "update_time": 1779012039, - "_id": "业务原始凭据" - }, - "报销申请时限": { - "chunk_ids": [ - "chunk-061324cc36078214691a6fc1cd0aaeea" - ], - "count": 1, - "create_time": 1779012039, - "update_time": 1779012039, - "_id": "报销申请时限" - }, - "预付款项": { - "chunk_ids": [ - "chunk-061324cc36078214691a6fc1cd0aaeea" - ], - "count": 1, - "create_time": 1779012039, - "update_time": 1779012039, - "_id": "预付款项" - }, - "公司": { - "chunk_ids": [ - "chunk-061324cc36078214691a6fc1cd0aaeea", - "chunk-e9438f69c9e221d9f0f00a05ad84eac6" - ], - "count": 2, - "update_time": 1779012094, - "_id": "公司" - }, - "员工": { - "chunk_ids": [ - "chunk-061324cc36078214691a6fc1cd0aaeea" - ], - "count": 1, - "create_time": 1779012040, - "update_time": 1779012040, - "_id": "员工" - }, - "供应商": { - "chunk_ids": [ - "chunk-061324cc36078214691a6fc1cd0aaeea" - ], - "count": 1, - "create_time": 1779012040, - "update_time": 1779012040, - "_id": "供应商" - }, - "支出报销审批": { - "chunk_ids": [ - "chunk-061324cc36078214691a6fc1cd0aaeea" - ], - "count": 1, - "create_time": 1779012041, - "update_time": 1779012041, - "_id": "支出报销审批" - }, - "预算内支出": { - "chunk_ids": [ - "chunk-061324cc36078214691a6fc1cd0aaeea" - ], - "count": 1, - "create_time": 1779012042, - "update_time": 1779012042, - "_id": "预算内支出" - }, - "正式员工": { - "chunk_ids": [ - "chunk-061324cc36078214691a6fc1cd0aaeea" - ], - "count": 1, - "create_time": 1779012042, - "update_time": 1779012042, - "_id": "正式员工" - }, - "分管领导": { - "chunk_ids": [ - "chunk-061324cc36078214691a6fc1cd0aaeea" - ], - "count": 1, - "create_time": 1779012042, - "update_time": 1779012042, - "_id": "分管领导" - }, - "一万元": { - "chunk_ids": [ - "chunk-061324cc36078214691a6fc1cd0aaeea" - ], - "count": 1, - "create_time": 1779012042, - "update_time": 1779012042, - "_id": "一万元" - }, - "出租车": { - "chunk_ids": [ - "chunk-061324cc36078214691a6fc1cd0aaeea" - ], - "count": 1, - "create_time": 1779012042, - "update_time": 1779012042, - "_id": "出租车" - }, - "部门负责人": { - "chunk_ids": [ - "chunk-061324cc36078214691a6fc1cd0aaeea" - ], - "count": 1, - "create_time": 1779012042, - "update_time": 1779012042, - "_id": "部门负责人" - }, - "出差审批程序": { - "chunk_ids": [ - "chunk-061324cc36078214691a6fc1cd0aaeea" - ], - "count": 1, - "create_time": 1779012042, - "update_time": 1779012042, - "_id": "出差审批程序" - }, - "交通费": { - "chunk_ids": [ - "chunk-061324cc36078214691a6fc1cd0aaeea" - ], - "count": 1, - "create_time": 1779012042, - "update_time": 1779012042, - "_id": "交通费" - }, - "住宿费": { - "chunk_ids": [ - "chunk-061324cc36078214691a6fc1cd0aaeea" - ], - "count": 1, - "create_time": 1779012043, - "update_time": 1779012043, - "_id": "住宿费" - }, - "出差补贴": { - "chunk_ids": [ - "chunk-061324cc36078214691a6fc1cd0aaeea" - ], - "count": 1, - "create_time": 1779012043, - "update_time": 1779012043, - "_id": "出差补贴" - }, - "成本中心归属": { - "chunk_ids": [ - "chunk-061324cc36078214691a6fc1cd0aaeea" - ], - "count": 1, - "create_time": 1779012043, - "update_time": 1779012043, - "_id": "成本中心归属" - }, - "责任原则": { - "chunk_ids": [ - "chunk-061324cc36078214691a6fc1cd0aaeea" - ], - "count": 1, - "create_time": 1779012043, - "update_time": 1779012043, - "_id": "责任原则" - }, - "受益原则": { - "chunk_ids": [ - "chunk-061324cc36078214691a6fc1cd0aaeea" - ], - "count": 1, - "create_time": 1779012044, - "update_time": 1779012044, - "_id": "受益原则" - }, - "结算起点": { - "chunk_ids": [ - "chunk-061324cc36078214691a6fc1cd0aaeea" - ], - "count": 1, - "create_time": 1779012044, - "update_time": 1779012044, - "_id": "结算起点" - }, - "Procurement Management Regulations": { - "chunk_ids": [ - "chunk-74c01decac4a10cd40a491786743b0ee" - ], - "count": 1, - "create_time": 1779012081, - "update_time": 1779012081, - "_id": "Procurement Management Regulations" - }, - "Tax Authority Recognized Invoice": { - "chunk_ids": [ - "chunk-74c01decac4a10cd40a491786743b0ee" - ], - "count": 1, - "create_time": 1779012094, - "update_time": 1779012094, - "_id": "Tax Authority Recognized Invoice" - }, - "Financial Review": { - "chunk_ids": [ - "chunk-74c01decac4a10cd40a491786743b0ee" - ], - "count": 1, - "create_time": 1779012085, - "update_time": 1779012085, - "_id": "Financial Review" - } +{ + "远光软件股份有限公司": { + "chunk_ids": [ + "chunk-aa5435156b829944c173fa1d2d7a93d4", + "chunk-18d968b78afe916b419c1b5973421ebe", + "chunk-dd87aa5bc62cc9587ecb4c26d35a5263" + ], + "count": 3, + "create_time": 1779011991, + "update_time": 1779011991, + "_id": "远光软件股份有限公司" + }, + "第一章总则": { + "chunk_ids": [ + "chunk-aa5435156b829944c173fa1d2d7a93d4" + ], + "count": 1, + "create_time": 1779011991, + "update_time": 1779011991, + "_id": "第一章总则" + }, + "第二条目的": { + "chunk_ids": [ + "chunk-aa5435156b829944c173fa1d2d7a93d4" + ], + "count": 1, + "create_time": 1779011991, + "update_time": 1779011991, + "_id": "第二条目的" + }, + "第二条范围": { + "chunk_ids": [ + "chunk-aa5435156b829944c173fa1d2d7a93d4" + ], + "count": 1, + "create_time": 1779011991, + "update_time": 1779011991, + "_id": "第二条范围" + }, + "第三条管理原则": { + "chunk_ids": [ + "chunk-aa5435156b829944c173fa1d2d7a93d4" + ], + "count": 1, + "create_time": 1779011991, + "update_time": 1779011991, + "_id": "第三条管理原则" + }, + "第二章职责分工": { + "chunk_ids": [ + "chunk-aa5435156b829944c173fa1d2d7a93d4" + ], + "count": 1, + "create_time": 1779011991, + "update_time": 1779011991, + "_id": "第二章职责分工" + }, + "第四条归口管理部门主要职责": { + "chunk_ids": [ + "chunk-aa5435156b829944c173fa1d2d7a93d4" + ], + "count": 1, + "create_time": 1779011991, + "update_time": 1779011991, + "_id": "第四条归口管理部门主要职责" + }, + "计划财务部": { + "chunk_ids": [ + "chunk-aa5435156b829944c173fa1d2d7a93d4", + "chunk-afc57a0e9548d1f484da6df6c182676b", + "chunk-e9438f69c9e221d9f0f00a05ad84eac6", + "chunk-18d968b78afe916b419c1b5973421ebe", + "chunk-dd87aa5bc62cc9587ecb4c26d35a5263" + ], + "count": 5, + "create_time": 1779011991, + "update_time": 1779011991, + "_id": "计划财务部" + }, + "第五条计划财务部主要职责": { + "chunk_ids": [ + "chunk-aa5435156b829944c173fa1d2d7a93d4" + ], + "count": 1, + "create_time": 1779011992, + "update_time": 1779011992, + "_id": "第五条计划财务部主要职责" + }, + "第六条经办部门(个人)主要职责": { + "chunk_ids": [ + "chunk-aa5435156b829944c173fa1d2d7a93d4" + ], + "count": 1, + "create_time": 1779011992, + "update_time": 1779011992, + "_id": "第六条经办部门(个人)主要职责" + }, + "第七条各级管理人员主要职责": { + "chunk_ids": [ + "chunk-aa5435156b829944c173fa1d2d7a93d4" + ], + "count": 1, + "create_time": 1779011992, + "update_time": 1779011992, + "_id": "第七条各级管理人员主要职责" + }, + "第三章支出报销申请与审批": { + "chunk_ids": [ + "chunk-aa5435156b829944c173fa1d2d7a93d4" + ], + "count": 1, + "create_time": 1779011992, + "update_time": 1779011992, + "_id": "第三章支出报销申请与审批" + }, + "第八条支出报销申请": { + "chunk_ids": [ + "chunk-aa5435156b829944c173fa1d2d7a93d4" + ], + "count": 1, + "create_time": 1779011992, + "update_time": 1779011992, + "_id": "第八条支出报销申请" + }, + "第九条支出报销审批": { + "chunk_ids": [ + "chunk-aa5435156b829944c173fa1d2d7a93d4" + ], + "count": 1, + "create_time": 1779011993, + "update_time": 1779011993, + "_id": "第九条支出报销审批" + }, + "第十条支出成本中心归属": { + "chunk_ids": [ + "chunk-aa5435156b829944c173fa1d2d7a93d4" + ], + "count": 1, + "create_time": 1779011993, + "update_time": 1779011993, + "_id": "第十条支出成本中心归属" + }, + "第四章重点支出管理规定": { + "chunk_ids": [ + "chunk-aa5435156b829944c173fa1d2d7a93d4" + ], + "count": 1, + "create_time": 1779011994, + "update_time": 1779011994, + "_id": "第四章重点支出管理规定" + }, + "第十一条备用金借款": { + "chunk_ids": [ + "chunk-aa5435156b829944c173fa1d2d7a93d4" + ], + "count": 1, + "create_time": 1779011994, + "update_time": 1779011994, + "_id": "第十一条备用金借款" + }, + "第十二条市内交通费": { + "chunk_ids": [ + "chunk-aa5435156b829944c173fa1d2d7a93d4" + ], + "count": 1, + "create_time": 1779011994, + "update_time": 1779011994, + "_id": "第十二条市内交通费" + }, + "第十三条差旅费": { + "chunk_ids": [ + "chunk-aa5435156b829944c173fa1d2d7a93d4" + ], + "count": 1, + "create_time": 1779011994, + "update_time": 1779011994, + "_id": "第十三条差旅费" + }, + "第十四条业务招待费": { + "chunk_ids": [ + "chunk-aa5435156b829944c173fa1d2d7a93d4" + ], + "count": 1, + "create_time": 1779011994, + "update_time": 1779011994, + "_id": "第十四条业务招待费" + }, + "第五章附则": { + "chunk_ids": [ + "chunk-aa5435156b829944c173fa1d2d7a93d4" + ], + "count": 1, + "create_time": 1779011994, + "update_time": 1779011994, + "_id": "第五章附则" + }, + "第二十三条本办法的归口与实施": { + "chunk_ids": [ + "chunk-aa5435156b829944c173fa1d2d7a93d4" + ], + "count": 1, + "create_time": 1779011994, + "update_time": 1779011994, + "_id": "第二十三条本办法的归口与实施" + }, + "第二十四条附件": { + "chunk_ids": [ + "chunk-aa5435156b829944c173fa1d2d7a93d4" + ], + "count": 1, + "create_time": 1779011995, + "update_time": 1779011995, + "_id": "第二十四条附件" + }, + "交通工具等级标准": { + "chunk_ids": [ + "chunk-aa5435156b829944c173fa1d2d7a93d4" + ], + "count": 1, + "create_time": 1779011995, + "update_time": 1779011995, + "_id": "交通工具等级标准" + }, + "出差补贴标准": { + "chunk_ids": [ + "chunk-aa5435156b829944c173fa1d2d7a93d4" + ], + "count": 1, + "create_time": 1779011996, + "update_time": 1779011996, + "_id": "出差补贴标准" + }, + "经济舱": { + "chunk_ids": [ + "chunk-aa5435156b829944c173fa1d2d7a93d4" + ], + "count": 1, + "create_time": 1779011996, + "update_time": 1779011996, + "_id": "经济舱" + }, + "火车硬席": { + "chunk_ids": [ + "chunk-aa5435156b829944c173fa1d2d7a93d4" + ], + "count": 1, + "create_time": 1779011996, + "update_time": 1779011996, + "_id": "火车硬席" + }, + "三等舱": { + "chunk_ids": [ + "chunk-aa5435156b829944c173fa1d2d7a93d4" + ], + "count": 1, + "create_time": 1779011996, + "update_time": 1779011996, + "_id": "三等舱" + }, + "凭据报销": { + "chunk_ids": [ + "chunk-aa5435156b829944c173fa1d2d7a93d4" + ], + "count": 1, + "create_time": 1779011997, + "update_time": 1779011997, + "_id": "凭据报销" + }, + "餐补": { + "chunk_ids": [ + "chunk-aa5435156b829944c173fa1d2d7a93d4", + "chunk-d26b288ed4001dc5c504dce0eb841362" + ], + "count": 2, + "create_time": 1779011997, + "update_time": 1779011997, + "_id": "餐补" + }, + "基本补助": { + "chunk_ids": [ + "chunk-aa5435156b829944c173fa1d2d7a93d4" + ], + "count": 1, + "create_time": 1779011997, + "update_time": 1779011997, + "_id": "基本补助" + }, + "公司支出管理办法": { + "chunk_ids": [ + "chunk-afc57a0e9548d1f484da6df6c182676b" + ], + "count": 1, + "create_time": 1779011997, + "update_time": 1779011997, + "_id": "公司支出管理办法" + }, + "办公室(党委办公室)": { + "chunk_ids": [ + "chunk-afc57a0e9548d1f484da6df6c182676b" + ], + "count": 1, + "create_time": 1779011997, + "update_time": 1779011997, + "_id": "办公室(党委办公室)" + }, + "工会委员会": { + "chunk_ids": [ + "chunk-afc57a0e9548d1f484da6df6c182676b" + ], + "count": 1, + "create_time": 1779011998, + "update_time": 1779011998, + "_id": "工会委员会" + }, + "营销中心": { + "chunk_ids": [ + "chunk-afc57a0e9548d1f484da6df6c182676b" + ], + "count": 1, + "create_time": 1779011998, + "update_time": 1779011998, + "_id": "营销中心" + }, + "品牌及市场运营中心": { + "chunk_ids": [ + "chunk-afc57a0e9548d1f484da6df6c182676b", + "chunk-e9438f69c9e221d9f0f00a05ad84eac6" + ], + "count": 2, + "create_time": 1779011998, + "update_time": 1779011998, + "_id": "品牌及市场运营中心" + }, + "组织人事部": { + "chunk_ids": [ + "chunk-afc57a0e9548d1f484da6df6c182676b", + "chunk-e9438f69c9e221d9f0f00a05ad84eac6", + "chunk-18d968b78afe916b419c1b5973421ebe", + "chunk-d26b288ed4001dc5c504dce0eb841362" + ], + "count": 4, + "create_time": 1779011999, + "update_time": 1779011999, + "_id": "组织人事部" + }, + "人力资源服务部": { + "chunk_ids": [ + "chunk-afc57a0e9548d1f484da6df6c182676b" + ], + "count": 1, + "create_time": 1779012000, + "update_time": 1779012000, + "_id": "人力资源服务部" + }, + "产业投资部": { + "chunk_ids": [ + "chunk-afc57a0e9548d1f484da6df6c182676b" + ], + "count": 1, + "create_time": 1779012000, + "update_time": 1779012000, + "_id": "产业投资部" + }, + "证券与法律事务部": { + "chunk_ids": [ + "chunk-afc57a0e9548d1f484da6df6c182676b" + ], + "count": 1, + "create_time": 1779012000, + "update_time": 1779012000, + "_id": "证券与法律事务部" + }, + "产品规划设计部": { + "chunk_ids": [ + "chunk-afc57a0e9548d1f484da6df6c182676b" + ], + "count": 1, + "create_time": 1779012000, + "update_time": 1779012000, + "_id": "产品规划设计部" + }, + "DAP研发中心": { + "chunk_ids": [ + "chunk-afc57a0e9548d1f484da6df6c182676b" + ], + "count": 1, + "create_time": 1779012001, + "update_time": 1779012001, + "_id": "DAP研发中心" + }, + "信息管理部": { + "chunk_ids": [ + "chunk-afc57a0e9548d1f484da6df6c182676b" + ], + "count": 1, + "create_time": 1779012001, + "update_time": 1779012001, + "_id": "信息管理部" + }, + "后勤服务部": { + "chunk_ids": [ + "chunk-afc57a0e9548d1f484da6df6c182676b" + ], + "count": 1, + "create_time": 1779012001, + "update_time": 1779012001, + "_id": "后勤服务部" + }, + "审批权限": { + "chunk_ids": [ + "chunk-afc57a0e9548d1f484da6df6c182676b" + ], + "count": 1, + "create_time": 1779012001, + "update_time": 1779012001, + "_id": "审批权限" + }, + "报销标准": { + "chunk_ids": [ + "chunk-afc57a0e9548d1f484da6df6c182676b" + ], + "count": 1, + "create_time": 1779012002, + "update_time": 1779012002, + "_id": "报销标准" + }, + "差旅费": { + "chunk_ids": [ + "chunk-afc57a0e9548d1f484da6df6c182676b", + "chunk-18d968b78afe916b419c1b5973421ebe", + "chunk-dd87aa5bc62cc9587ecb4c26d35a5263", + "chunk-d26b288ed4001dc5c504dce0eb841362", + "chunk-061324cc36078214691a6fc1cd0aaeea" + ], + "count": 5, + "create_time": 1779012002, + "update_time": 1779012002, + "_id": "差旅费" + }, + "全资子公司": { + "chunk_ids": [ + "chunk-afc57a0e9548d1f484da6df6c182676b", + "chunk-dd87aa5bc62cc9587ecb4c26d35a5263" + ], + "count": 2, + "create_time": 1779012003, + "update_time": 1779012003, + "_id": "全资子公司" + }, + "人事归口管理部门": { + "chunk_ids": [ + "chunk-afc57a0e9548d1f484da6df6c182676b" + ], + "count": 1, + "create_time": 1779012003, + "update_time": 1779012003, + "_id": "人事归口管理部门" + }, + "母公司": { + "chunk_ids": [ + "chunk-afc57a0e9548d1f484da6df6c182676b" + ], + "count": 1, + "create_time": 1779012003, + "update_time": 1779012003, + "_id": "母公司" + }, + "逐级审批规则": { + "chunk_ids": [ + "chunk-afc57a0e9548d1f484da6df6c182676b" + ], + "count": 1, + "create_time": 1779012004, + "update_time": 1779012004, + "_id": "逐级审批规则" + }, + "终审岗": { + "chunk_ids": [ + "chunk-afc57a0e9548d1f484da6df6c182676b" + ], + "count": 1, + "create_time": 1779012004, + "update_time": 1779012004, + "_id": "终审岗" + }, + "财务入账条件": { + "chunk_ids": [ + "chunk-afc57a0e9548d1f484da6df6c182676b" + ], + "count": 1, + "create_time": 1779012004, + "update_time": 1779012004, + "_id": "财务入账条件" + }, + "薪酬福利支出分配计划": { + "chunk_ids": [ + "chunk-afc57a0e9548d1f484da6df6c182676b" + ], + "count": 1, + "create_time": 1779012004, + "update_time": 1779012004, + "_id": "薪酬福利支出分配计划" + }, + "公司1号文": { + "chunk_ids": [ + "chunk-afc57a0e9548d1f484da6df6c182676b" + ], + "count": 1, + "create_time": 1779012004, + "update_time": 1779012004, + "_id": "公司1号文" + }, + "总监": { + "chunk_ids": [ + "chunk-afc57a0e9548d1f484da6df6c182676b" + ], + "count": 1, + "create_time": 1779012004, + "update_time": 1779012004, + "_id": "总监" + }, + "一级部门总经理": { + "chunk_ids": [ + "chunk-afc57a0e9548d1f484da6df6c182676b" + ], + "count": 1, + "create_time": 1779012004, + "update_time": 1779012004, + "_id": "一级部门总经理" + }, + "P8": { + "chunk_ids": [ + "chunk-afc57a0e9548d1f484da6df6c182676b" + ], + "count": 1, + "create_time": 1779012004, + "update_time": 1779012004, + "_id": "P8" + }, + "报销标准变化情况": { + "chunk_ids": [ + "chunk-afc57a0e9548d1f484da6df6c182676b", + "chunk-18d968b78afe916b419c1b5973421ebe" + ], + "count": 2, + "create_time": 1779012005, + "update_time": 1779012005, + "_id": "报销标准变化情况" + }, + "取消报销规定": { + "chunk_ids": [ + "chunk-afc57a0e9548d1f484da6df6c182676b" + ], + "count": 1, + "create_time": 1779012005, + "update_time": 1779012005, + "_id": "取消报销规定" + }, + "新增报销规定": { + "chunk_ids": [ + "chunk-afc57a0e9548d1f484da6df6c182676b" + ], + "count": 1, + "create_time": 1779012005, + "update_time": 1779012005, + "_id": "新增报销规定" + }, + "因公用车补贴": { + "chunk_ids": [ + "chunk-afc57a0e9548d1f484da6df6c182676b" + ], + "count": 1, + "create_time": 1779012006, + "update_time": 1779012006, + "_id": "因公用车补贴" + }, + "异地挂职锻炼补贴标准": { + "chunk_ids": [ + "chunk-afc57a0e9548d1f484da6df6c182676b", + "chunk-18d968b78afe916b419c1b5973421ebe" + ], + "count": 2, + "create_time": 1779012007, + "update_time": 1779012007, + "_id": "异地挂职锻炼补贴标准" + }, + "组织安排": { + "chunk_ids": [ + "chunk-afc57a0e9548d1f484da6df6c182676b" + ], + "count": 1, + "create_time": 1779012007, + "update_time": 1779012007, + "_id": "组织安排" + }, + "Company": { + "chunk_ids": [ + "chunk-74c01decac4a10cd40a491786743b0ee" + ], + "count": 1, + "create_time": 1779012007, + "update_time": 1779012007, + "_id": "Company" + }, + "Management Personnel At All Levels": { + "chunk_ids": [ + "chunk-74c01decac4a10cd40a491786743b0ee" + ], + "count": 1, + "create_time": 1779012007, + "update_time": 1779012007, + "_id": "Management Personnel At All Levels" + }, + "Centralized Management department": { + "chunk_ids": [ + "chunk-74c01decac4a10cd40a491786743b0ee" + ], + "count": 1, + "create_time": 1779012007, + "update_time": 1779012007, + "_id": "Centralized Management department" + }, + "Planning and Finance Department": { + "chunk_ids": [ + "chunk-74c01decac4a10cd40a491786743b0ee" + ], + "count": 1, + "create_time": 1779012007, + "update_time": 1779012007, + "_id": "Planning and Finance Department" + }, + "Operating Department Individual": { + "chunk_ids": [ + "chunk-74c01decac4a10cd40a491786743b0ee" + ], + "count": 1, + "create_time": 1779012008, + "update_time": 1779012008, + "_id": "Operating Department Individual" + }, + "Operator": { + "chunk_ids": [ + "chunk-74c01decac4a10cd40a491786743b0ee" + ], + "count": 1, + "create_time": 1779012009, + "update_time": 1779012009, + "_id": "Operator" + }, + "First Approver": { + "chunk_ids": [ + "chunk-74c01decac4a10cd40a491786743b0ee" + ], + "count": 1, + "create_time": 1779012009, + "update_time": 1779012009, + "_id": "First Approver" + }, + "Subsequent Approver": { + "chunk_ids": [ + "chunk-74c01decac4a10cd40a491786743b0ee" + ], + "count": 1, + "create_time": 1779012009, + "update_time": 1779012009, + "_id": "Subsequent Approver" + }, + "Financial Information System": { + "chunk_ids": [ + "chunk-74c01decac4a10cd40a491786743b0ee" + ], + "count": 1, + "create_time": 1779012009, + "update_time": 1779012009, + "_id": "Financial Information System" + }, + "Business Original Documents": { + "chunk_ids": [ + "chunk-74c01decac4a10cd40a491786743b0ee" + ], + "count": 1, + "create_time": 1779012009, + "update_time": 1779012009, + "_id": "Business Original Documents" + }, + "VAT Special Invoice": { + "chunk_ids": [ + "chunk-74c01decac4a10cd40a491786743b0ee" + ], + "count": 1, + "create_time": 1779011997, + "update_time": 1779011997, + "_id": "VAT Special Invoice" + }, + "Expenditure Reimbursement Application": { + "chunk_ids": [ + "chunk-74c01decac4a10cd40a491786743b0ee" + ], + "count": 1, + "create_time": 1779011997, + "update_time": 1779011997, + "_id": "Expenditure Reimbursement Application" + }, + "Expenditure Authorization Approval Scope": { + "chunk_ids": [ + "chunk-74c01decac4a10cd40a491786743b0ee" + ], + "count": 1, + "create_time": 1779011997, + "update_time": 1779011997, + "_id": "Expenditure Authorization Approval Scope" + }, + "Separation of Approval and Processing Principle": { + "chunk_ids": [ + "chunk-74c01decac4a10cd40a491786743b0ee" + ], + "count": 1, + "create_time": 1779011998, + "update_time": 1779011998, + "_id": "Separation of Approval and Processing Principle" + }, + "Three Flows Consistency Principle": { + "chunk_ids": [ + "chunk-74c01decac4a10cd40a491786743b0ee" + ], + "count": 1, + "create_time": 1779011998, + "update_time": 1779011998, + "_id": "Three Flows Consistency Principle" + }, + "Employee Remuneration": { + "chunk_ids": [ + "chunk-74c01decac4a10cd40a491786743b0ee" + ], + "count": 1, + "create_time": 1779011998, + "update_time": 1779011998, + "_id": "Employee Remuneration" + }, + "Personal Service Compensation": { + "chunk_ids": [ + "chunk-74c01decac4a10cd40a491786743b0ee" + ], + "count": 1, + "create_time": 1779011999, + "update_time": 1779011999, + "_id": "Personal Service Compensation" + }, + "Travel Allowance": { + "chunk_ids": [ + "chunk-74c01decac4a10cd40a491786743b0ee" + ], + "count": 1, + "create_time": 1779011999, + "update_time": 1779011999, + "_id": "Travel Allowance" + }, + "Special Subsidy": { + "chunk_ids": [ + "chunk-74c01decac4a10cd40a491786743b0ee" + ], + "count": 1, + "create_time": 1779011999, + "update_time": 1779011999, + "_id": "Special Subsidy" + }, + "Current Account Payment": { + "chunk_ids": [ + "chunk-74c01decac4a10cd40a491786743b0ee" + ], + "count": 1, + "create_time": 1779011999, + "update_time": 1779011999, + "_id": "Current Account Payment" + }, + "Trade Union Fund": { + "chunk_ids": [ + "chunk-74c01decac4a10cd40a491786743b0ee" + ], + "count": 1, + "create_time": 1779012000, + "update_time": 1779012000, + "_id": "Trade Union Fund" + }, + "Employee Welfare": { + "chunk_ids": [ + "chunk-74c01decac4a10cd40a491786743b0ee" + ], + "count": 1, + "create_time": 1779012000, + "update_time": 1779012000, + "_id": "Employee Welfare" + }, + "Staff Activities": { + "chunk_ids": [ + "chunk-74c01decac4a10cd40a491786743b0ee" + ], + "count": 1, + "create_time": 1779012000, + "update_time": 1779012000, + "_id": "Staff Activities" + }, + "Business Entertainment": { + "chunk_ids": [ + "chunk-74c01decac4a10cd40a491786743b0ee" + ], + "count": 1, + "create_time": 1779012000, + "update_time": 1779012000, + "_id": "Business Entertainment" + }, + "Transportation Tickets": { + "chunk_ids": [ + "chunk-74c01decac4a10cd40a491786743b0ee" + ], + "count": 1, + "create_time": 1779012000, + "update_time": 1779012000, + "_id": "Transportation Tickets" + }, + "Government Fees": { + "chunk_ids": [ + "chunk-74c01decac4a10cd40a491786743b0ee" + ], + "count": 1, + "create_time": 1779012000, + "update_time": 1779012000, + "_id": "Government Fees" + }, + "Tax Control System Details": { + "chunk_ids": [ + "chunk-74c01decac4a10cd40a491786743b0ee" + ], + "count": 1, + "create_time": 1779012000, + "update_time": 1779012000, + "_id": "Tax Control System Details" + }, + "Three Working Days Deadline": { + "chunk_ids": [ + "chunk-74c01decac4a10cd40a491786743b0ee" + ], + "count": 1, + "create_time": 1779012000, + "update_time": 1779012000, + "_id": "Three Working Days Deadline" + }, + "广告费": { + "chunk_ids": [ + "chunk-e9438f69c9e221d9f0f00a05ad84eac6", + "chunk-d26b288ed4001dc5c504dce0eb841362" + ], + "count": 2, + "create_time": 1779012000, + "update_time": 1779012000, + "_id": "广告费" + }, + "业务宣传费": { + "chunk_ids": [ + "chunk-e9438f69c9e221d9f0f00a05ad84eac6", + "chunk-d26b288ed4001dc5c504dce0eb841362" + ], + "count": 2, + "create_time": 1779012001, + "update_time": 1779012001, + "_id": "业务宣传费" + }, + "培训费": { + "chunk_ids": [ + "chunk-e9438f69c9e221d9f0f00a05ad84eac6", + "chunk-dd87aa5bc62cc9587ecb4c26d35a5263" + ], + "count": 2, + "create_time": 1779012001, + "update_time": 1779012001, + "_id": "培训费" + }, + "通信费": { + "chunk_ids": [ + "chunk-e9438f69c9e221d9f0f00a05ad84eac6", + "chunk-dd87aa5bc62cc9587ecb4c26d35a5263" + ], + "count": 2, + "create_time": 1779012002, + "update_time": 1779012002, + "_id": "通信费" + }, + "邮递费": { + "chunk_ids": [ + "chunk-e9438f69c9e221d9f0f00a05ad84eac6" + ], + "count": 1, + "create_time": 1779012004, + "update_time": 1779012004, + "_id": "邮递费" + }, + "薪酬福利支出": { + "chunk_ids": [ + "chunk-e9438f69c9e221d9f0f00a05ad84eac6" + ], + "count": 1, + "create_time": 1779012005, + "update_time": 1779012005, + "_id": "薪酬福利支出" + }, + "对外捐赠支出": { + "chunk_ids": [ + "chunk-e9438f69c9e221d9f0f00a05ad84eac6" + ], + "count": 1, + "create_time": 1779012005, + "update_time": 1779012005, + "_id": "对外捐赠支出" + }, + "涉外业务汇率标准": { + "chunk_ids": [ + "chunk-e9438f69c9e221d9f0f00a05ad84eac6" + ], + "count": 1, + "create_time": 1779012005, + "update_time": 1779012005, + "_id": "涉外业务汇率标准" + }, + "公司员工教育培训管理办法": { + "chunk_ids": [ + "chunk-e9438f69c9e221d9f0f00a05ad84eac6" + ], + "count": 1, + "create_time": 1779012006, + "update_time": 1779012006, + "_id": "公司员工教育培训管理办法" + }, + "公司员工因公通讯费用实施细则": { + "chunk_ids": [ + "chunk-e9438f69c9e221d9f0f00a05ad84eac6" + ], + "count": 1, + "create_time": 1779012006, + "update_time": 1779012006, + "_id": "公司员工因公通讯费用实施细则" + }, + "公司团建管理办法": { + "chunk_ids": [ + "chunk-e9438f69c9e221d9f0f00a05ad84eac6" + ], + "count": 1, + "create_time": 1779012006, + "update_time": 1779012006, + "_id": "公司团建管理办法" + }, + "工会经费管理办法": { + "chunk_ids": [ + "chunk-e9438f69c9e221d9f0f00a05ad84eac6" + ], + "count": 1, + "create_time": 1779012006, + "update_time": 1779012006, + "_id": "工会经费管理办法" + }, + "中国银行外汇折算价": { + "chunk_ids": [ + "chunk-e9438f69c9e221d9f0f00a05ad84eac6" + ], + "count": 1, + "create_time": 1779012019, + "update_time": 1779012019, + "_id": "中国银行外汇折算价" + }, + "中国外汇交易中心参考汇率": { + "chunk_ids": [ + "chunk-e9438f69c9e221d9f0f00a05ad84eac6" + ], + "count": 1, + "create_time": 1779012007, + "update_time": 1779012007, + "_id": "中国外汇交易中心参考汇率" + }, + "第十七条": { + "chunk_ids": [ + "chunk-e9438f69c9e221d9f0f00a05ad84eac6" + ], + "count": 1, + "create_time": 1779012008, + "update_time": 1779012008, + "_id": "第十七条" + }, + "第十八条": { + "chunk_ids": [ + "chunk-e9438f69c9e221d9f0f00a05ad84eac6" + ], + "count": 1, + "create_time": 1779012008, + "update_time": 1779012008, + "_id": "第十八条" + }, + "第十九条": { + "chunk_ids": [ + "chunk-e9438f69c9e221d9f0f00a05ad84eac6" + ], + "count": 1, + "create_time": 1779012008, + "update_time": 1779012008, + "_id": "第十九条" + }, + "第二十条": { + "chunk_ids": [ + "chunk-e9438f69c9e221d9f0f00a05ad84eac6" + ], + "count": 1, + "create_time": 1779012008, + "update_time": 1779012008, + "_id": "第二十条" + }, + "第二十一条": { + "chunk_ids": [ + "chunk-e9438f69c9e221d9f0f00a05ad84eac6" + ], + "count": 1, + "create_time": 1779012009, + "update_time": 1779012009, + "_id": "第二十一条" + }, + "第二十二条": { + "chunk_ids": [ + "chunk-e9438f69c9e221d9f0f00a05ad84eac6" + ], + "count": 1, + "create_time": 1779012009, + "update_time": 1779012009, + "_id": "第二十二条" + }, + "第二十三条": { + "chunk_ids": [ + "chunk-e9438f69c9e221d9f0f00a05ad84eac6" + ], + "count": 1, + "create_time": 1779012009, + "update_time": 1779012009, + "_id": "第二十三条" + }, + "第二十四条": { + "chunk_ids": [ + "chunk-e9438f69c9e221d9f0f00a05ad84eac6" + ], + "count": 1, + "create_time": 1779012009, + "update_time": 1779012009, + "_id": "第二十四条" + }, + "附表1:员工支出报销审批权限表": { + "chunk_ids": [ + "chunk-e9438f69c9e221d9f0f00a05ad84eac6" + ], + "count": 1, + "create_time": 1779012009, + "update_time": 1779012009, + "_id": "附表1:员工支出报销审批权限表" + }, + "附表2:岗位支出报销审批权限表": { + "chunk_ids": [ + "chunk-e9438f69c9e221d9f0f00a05ad84eac6" + ], + "count": 1, + "create_time": 1779012011, + "update_time": 1779012011, + "_id": "附表2:岗位支出报销审批权限表" + }, + "附表3:支出归口管理部门与归口业务范围": { + "chunk_ids": [ + "chunk-e9438f69c9e221d9f0f00a05ad84eac6" + ], + "count": 1, + "create_time": 1779012011, + "update_time": 1779012011, + "_id": "附表3:支出归口管理部门与归口业务范围" + }, + "业务招待": { + "chunk_ids": [ + "chunk-e9438f69c9e221d9f0f00a05ad84eac6", + "chunk-9841d66d8fb8548aab40220663a51693" + ], + "count": 2, + "create_time": 1779012012, + "update_time": 1779012012, + "_id": "业务招待" + }, + "报销资格": { + "chunk_ids": [ + "chunk-e9438f69c9e221d9f0f00a05ad84eac6" + ], + "count": 1, + "create_time": 1779012012, + "update_time": 1779012012, + "_id": "报销资格" + }, + "捐赠申请": { + "chunk_ids": [ + "chunk-e9438f69c9e221d9f0f00a05ad84eac6" + ], + "count": 1, + "create_time": 1779012012, + "update_time": 1779012012, + "_id": "捐赠申请" + }, + "预算调整决策程序": { + "chunk_ids": [ + "chunk-e9438f69c9e221d9f0f00a05ad84eac6" + ], + "count": 1, + "create_time": 1779012012, + "update_time": 1779012012, + "_id": "预算调整决策程序" + }, + "Departments And Units": { + "chunk_ids": [ + "chunk-613d6dfd4c5e9c807229a3147f96b584" + ], + "count": 1, + "create_time": 1779012012, + "update_time": 1779012012, + "_id": "Departments And Units" + }, + "Company Business Travel System": { + "chunk_ids": [ + "chunk-613d6dfd4c5e9c807229a3147f96b584" + ], + "count": 1, + "create_time": 1779012012, + "update_time": 1779012012, + "_id": "Company Business Travel System" + }, + "Transportation Level Standards": { + "chunk_ids": [ + "chunk-613d6dfd4c5e9c807229a3147f96b584" + ], + "count": 1, + "create_time": 1779012012, + "update_time": 1779012012, + "_id": "Transportation Level Standards" + }, + "Hotel Accommodation Standards": { + "chunk_ids": [ + "chunk-613d6dfd4c5e9c807229a3147f96b584" + ], + "count": 1, + "create_time": 1779012013, + "update_time": 1779012013, + "_id": "Hotel Accommodation Standards" + }, + "Travel Allowance Standards": { + "chunk_ids": [ + "chunk-613d6dfd4c5e9c807229a3147f96b584" + ], + "count": 1, + "create_time": 1779012013, + "update_time": 1779012013, + "_id": "Travel Allowance Standards" + }, + "Company Property Rental Management": { + "chunk_ids": [ + "chunk-613d6dfd4c5e9c807229a3147f96b584" + ], + "count": 1, + "create_time": 1779012013, + "update_time": 1779012013, + "_id": "Company Property Rental Management" + }, + "Business Trip Approval": { + "chunk_ids": [ + "chunk-613d6dfd4c5e9c807229a3147f96b584" + ], + "count": 1, + "create_time": 1779012013, + "update_time": 1779012013, + "_id": "Business Trip Approval" + }, + "Company Leadership": { + "chunk_ids": [ + "chunk-613d6dfd4c5e9c807229a3147f96b584" + ], + "count": 1, + "create_time": 1779012013, + "update_time": 1779012013, + "_id": "Company Leadership" + }, + "Senior Managers": { + "chunk_ids": [ + "chunk-613d6dfd4c5e9c807229a3147f96b584" + ], + "count": 1, + "create_time": 1779012014, + "update_time": 1779012014, + "_id": "Senior Managers" + }, + "Middle Managers": { + "chunk_ids": [ + "chunk-613d6dfd4c5e9c807229a3147f96b584" + ], + "count": 1, + "create_time": 1779012014, + "update_time": 1779012014, + "_id": "Middle Managers" + }, + "Basic Level Managers": { + "chunk_ids": [ + "chunk-613d6dfd4c5e9c807229a3147f96b584" + ], + "count": 1, + "create_time": 1779012015, + "update_time": 1779012015, + "_id": "Basic Level Managers" + }, + "Other Employees": { + "chunk_ids": [ + "chunk-613d6dfd4c5e9c807229a3147f96b584" + ], + "count": 1, + "create_time": 1779012015, + "update_time": 1779012015, + "_id": "Other Employees" + }, + "Remote Work Housing": { + "chunk_ids": [ + "chunk-613d6dfd4c5e9c807229a3147f96b584" + ], + "count": 1, + "create_time": 1779012015, + "update_time": 1779012015, + "_id": "Remote Work Housing" + }, + "Commercial Insurance": { + "chunk_ids": [ + "chunk-613d6dfd4c5e9c807229a3147f96b584" + ], + "count": 1, + "create_time": 1779012015, + "update_time": 1779012015, + "_id": "Commercial Insurance" + }, + "Transportation Cost Reimbursement": { + "chunk_ids": [ + "chunk-613d6dfd4c5e9c807229a3147f96b584" + ], + "count": 1, + "create_time": 1779012016, + "update_time": 1779012016, + "_id": "Transportation Cost Reimbursement" + }, + "Accommodation Cost Reimbursement": { + "chunk_ids": [ + "chunk-613d6dfd4c5e9c807229a3147f96b584" + ], + "count": 1, + "create_time": 1779012016, + "update_time": 1779012016, + "_id": "Accommodation Cost Reimbursement" + }, + "Hong Kong, Macau, And Taiwan Region": { + "chunk_ids": [ + "chunk-613d6dfd4c5e9c807229a3147f96b584" + ], + "count": 1, + "create_time": 1779012016, + "update_time": 1779012016, + "_id": "Hong Kong, Macau, And Taiwan Region" + }, + "Directly-Controlled Municipalities And Special Administrative Regions": { + "chunk_ids": [ + "chunk-613d6dfd4c5e9c807229a3147f96b584" + ], + "count": 1, + "create_time": 1779012016, + "update_time": 1779012016, + "_id": "Directly-Controlled Municipalities And Special Administrative Regions" + }, + "Provincial Capitals": { + "chunk_ids": [ + "chunk-613d6dfd4c5e9c807229a3147f96b584" + ], + "count": 1, + "create_time": 1779012016, + "update_time": 1779012016, + "_id": "Provincial Capitals" + }, + "Other Areas": { + "chunk_ids": [ + "chunk-613d6dfd4c5e9c807229a3147f96b584" + ], + "count": 1, + "create_time": 1779012017, + "update_time": 1779012017, + "_id": "Other Areas" + }, + "Night High-Speed Rail Provision": { + "chunk_ids": [ + "chunk-613d6dfd4c5e9c807229a3147f96b584" + ], + "count": 1, + "create_time": 1779012017, + "update_time": 1779012017, + "_id": "Night High-Speed Rail Provision" + }, + "Taxi Usage Regulations": { + "chunk_ids": [ + "chunk-613d6dfd4c5e9c807229a3147f96b584" + ], + "count": 1, + "create_time": 1779012017, + "update_time": 1779012017, + "_id": "Taxi Usage Regulations" + }, + "Self-Driving Travel Provisions": { + "chunk_ids": [ + "chunk-613d6dfd4c5e9c807229a3147f96b584" + ], + "count": 1, + "create_time": 1779012017, + "update_time": 1779012017, + "_id": "Self-Driving Travel Provisions" + }, + "Remote Work Housing Rental Expenses": { + "chunk_ids": [ + "chunk-613d6dfd4c5e9c807229a3147f96b584" + ], + "count": 1, + "create_time": 1779012018, + "update_time": 1779012018, + "_id": "Remote Work Housing Rental Expenses" + }, + "External Conference Accommodation": { + "chunk_ids": [ + "chunk-613d6dfd4c5e9c807229a3147f96b584" + ], + "count": 1, + "create_time": 1779012018, + "update_time": 1779012018, + "_id": "External Conference Accommodation" + }, + "取消报销规定内容": { + "chunk_ids": [ + "chunk-18d968b78afe916b419c1b5973421ebe" + ], + "count": 1, + "create_time": 1779012018, + "update_time": 1779012018, + "_id": "取消报销规定内容" + }, + "新增规定内容": { + "chunk_ids": [ + "chunk-18d968b78afe916b419c1b5973421ebe" + ], + "count": 1, + "create_time": 1779012018, + "update_time": 1779012018, + "_id": "新增规定内容" + }, + "商旅订票规范": { + "chunk_ids": [ + "chunk-18d968b78afe916b419c1b5973421ebe" + ], + "count": 1, + "create_time": 1779012018, + "update_time": 1779012018, + "_id": "商旅订票规范" + }, + "审批权限变化情况": { + "chunk_ids": [ + "chunk-18d968b78afe916b419c1b5973421ebe" + ], + "count": 1, + "create_time": 1779012019, + "update_time": 1779012019, + "_id": "审批权限变化情况" + }, + "投标保证金": { + "chunk_ids": [ + "chunk-18d968b78afe916b419c1b5973421ebe" + ], + "count": 1, + "create_time": 1779012019, + "update_time": 1779012019, + "_id": "投标保证金" + }, + "审批流转程序": { + "chunk_ids": [ + "chunk-18d968b78afe916b419c1b5973421ebe" + ], + "count": 1, + "create_time": 1779012019, + "update_time": 1779012019, + "_id": "审批流转程序" + }, + "出差规定": { + "chunk_ids": [ + "chunk-18d968b78afe916b419c1b5973421ebe" + ], + "count": 1, + "create_time": 1779012019, + "update_time": 1779012019, + "_id": "出差规定" + }, + "财务信息化系统": { + "chunk_ids": [ + "chunk-18d968b78afe916b419c1b5973421ebe" + ], + "count": 1, + "create_time": 1779012020, + "update_time": 1779012020, + "_id": "财务信息化系统" + }, + "支出报销申请与审批": { + "chunk_ids": [ + "chunk-18d968b78afe916b419c1b5973421ebe", + "chunk-dd87aa5bc62cc9587ecb4c26d35a5263" + ], + "count": 2, + "create_time": 1779012020, + "update_time": 1779012020, + "_id": "支出报销申请与审批" + }, + "重点支出管理规定": { + "chunk_ids": [ + "chunk-18d968b78afe916b419c1b5973421ebe" + ], + "count": 1, + "create_time": 1779012020, + "update_time": 1779012020, + "_id": "重点支出管理规定" + }, + "备用金借款": { + "chunk_ids": [ + "chunk-18d968b78afe916b419c1b5973421ebe", + "chunk-dd87aa5bc62cc9587ecb4c26d35a5263", + "chunk-061324cc36078214691a6fc1cd0aaeea" + ], + "count": 3, + "create_time": 1779012020, + "update_time": 1779012020, + "_id": "备用金借款" + }, + "市内交通费": { + "chunk_ids": [ + "chunk-18d968b78afe916b419c1b5973421ebe", + "chunk-dd87aa5bc62cc9587ecb4c26d35a5263", + "chunk-061324cc36078214691a6fc1cd0aaeea" + ], + "count": 3, + "create_time": 1779012022, + "update_time": 1779012022, + "_id": "市内交通费" + }, + "审批权限表": { + "chunk_ids": [ + "chunk-18d968b78afe916b419c1b5973421ebe" + ], + "count": 1, + "create_time": 1779012022, + "update_time": 1779012022, + "_id": "审批权限表" + }, + "1 Yuan Per Person Per Kilometer Reimbursement": { + "chunk_ids": [ + "chunk-18d968b78afe916b419c1b5973421ebe" + ], + "count": 1, + "create_time": 1779012023, + "update_time": 1779012023, + "_id": "1 Yuan Per Person Per Kilometer Reimbursement" + }, + "Official Vehicle Subsidy": { + "chunk_ids": [ + "chunk-18d968b78afe916b419c1b5973421ebe" + ], + "count": 1, + "create_time": 1779012023, + "update_time": 1779012023, + "_id": "Official Vehicle Subsidy" + }, + "Department Manager": { + "chunk_ids": [ + "chunk-18d968b78afe916b419c1b5973421ebe" + ], + "count": 1, + "create_time": 1779012023, + "update_time": 1779012023, + "_id": "Department Manager" + }, + "Director": { + "chunk_ids": [ + "chunk-18d968b78afe916b419c1b5973421ebe" + ], + "count": 1, + "create_time": 1779012023, + "update_time": 1779012023, + "_id": "Director" + }, + "First-Level Department General Manager": { + "chunk_ids": [ + "chunk-18d968b78afe916b419c1b5973421ebe" + ], + "count": 1, + "create_time": 1779012023, + "update_time": 1779012023, + "_id": "First-Level Department General Manager" + }, + "Institution General Manager": { + "chunk_ids": [ + "chunk-18d968b78afe916b419c1b5973421ebe" + ], + "count": 1, + "create_time": 1779012023, + "update_time": 1779012023, + "_id": "Institution General Manager" + }, + "Business Division General Manager": { + "chunk_ids": [ + "chunk-18d968b78afe916b419c1b5973421ebe" + ], + "count": 1, + "create_time": 1779012023, + "update_time": 1779012023, + "_id": "Business Division General Manager" + }, + "Vice President": { + "chunk_ids": [ + "chunk-18d968b78afe916b419c1b5973421ebe" + ], + "count": 1, + "create_time": 1779012023, + "update_time": 1779012023, + "_id": "Vice President" + }, + "Chief Engineer": { + "chunk_ids": [ + "chunk-18d968b78afe916b419c1b5973421ebe" + ], + "count": 1, + "create_time": 1779012023, + "update_time": 1779012023, + "_id": "Chief Engineer" + }, + "Senior Vice President": { + "chunk_ids": [ + "chunk-18d968b78afe916b419c1b5973421ebe" + ], + "count": 1, + "create_time": 1779012024, + "update_time": 1779012024, + "_id": "Senior Vice President" + }, + "President": { + "chunk_ids": [ + "chunk-18d968b78afe916b419c1b5973421ebe" + ], + "count": 1, + "create_time": 1779012024, + "update_time": 1779012024, + "_id": "President" + }, + "Committee Chairpersons": { + "chunk_ids": [ + "chunk-18d968b78afe916b419c1b5973421ebe" + ], + "count": 1, + "create_time": 1779012024, + "update_time": 1779012024, + "_id": "Committee Chairpersons" + }, + "Bid Security Deposit Approval Limits Table": { + "chunk_ids": [ + "chunk-18d968b78afe916b419c1b5973421ebe" + ], + "count": 1, + "create_time": 1779012024, + "update_time": 1779012024, + "_id": "Bid Security Deposit Approval Limits Table" + }, + "50000 Yuan Approval Limit": { + "chunk_ids": [ + "chunk-18d968b78afe916b419c1b5973421ebe" + ], + "count": 1, + "create_time": 1779012024, + "update_time": 1779012024, + "_id": "50000 Yuan Approval Limit" + }, + "100000 Yuan Approval Limit": { + "chunk_ids": [ + "chunk-18d968b78afe916b419c1b5973421ebe" + ], + "count": 1, + "create_time": 1779012025, + "update_time": 1779012025, + "_id": "100000 Yuan Approval Limit" + }, + "200000 Yuan Approval Limit": { + "chunk_ids": [ + "chunk-18d968b78afe916b419c1b5973421ebe" + ], + "count": 1, + "create_time": 1779012025, + "update_time": 1779012025, + "_id": "200000 Yuan Approval Limit" + }, + "5000000 Yuan Approval Limit": { + "chunk_ids": [ + "chunk-18d968b78afe916b419c1b5973421ebe" + ], + "count": 1, + "create_time": 1779012025, + "update_time": 1779012025, + "_id": "5000000 Yuan Approval Limit" + }, + "Commercial Travel System": { + "chunk_ids": [ + "chunk-18d968b78afe916b419c1b5973421ebe" + ], + "count": 1, + "create_time": 1779012026, + "update_time": 1779012026, + "_id": "Commercial Travel System" + }, + "Multi-Level Approval Rule": { + "chunk_ids": [ + "chunk-18d968b78afe916b419c1b5973421ebe" + ], + "count": 1, + "create_time": 1779012026, + "update_time": 1779012026, + "_id": "Multi-Level Approval Rule" + }, + "Final Approval Position": { + "chunk_ids": [ + "chunk-18d968b78afe916b419c1b5973421ebe" + ], + "count": 1, + "create_time": 1779012026, + "update_time": 1779012026, + "_id": "Final Approval Position" + }, + "Company Hotel Accommodation Limit Standards": { + "chunk_ids": [ + "chunk-18d968b78afe916b419c1b5973421ebe" + ], + "count": 1, + "create_time": 1779012026, + "update_time": 1779012026, + "_id": "Company Hotel Accommodation Limit Standards" + }, + "公司支出管理办法(2024)": { + "chunk_ids": [ + "chunk-dd87aa5bc62cc9587ecb4c26d35a5263" + ], + "count": 1, + "create_time": 1779012026, + "update_time": 1779012026, + "_id": "公司支出管理办法(2024)" + }, + "国家电网公司": { + "chunk_ids": [ + "chunk-dd87aa5bc62cc9587ecb4c26d35a5263" + ], + "count": 1, + "create_time": 1779012038, + "update_time": 1779012038, + "_id": "国家电网公司" + }, + "国网数科公司": { + "chunk_ids": [ + "chunk-dd87aa5bc62cc9587ecb4c26d35a5263" + ], + "count": 1, + "create_time": 1779012039, + "update_time": 1779012039, + "_id": "国网数科公司" + }, + "办法": { + "chunk_ids": [ + "chunk-dd87aa5bc62cc9587ecb4c26d35a5263" + ], + "count": 1, + "create_time": 1779012039, + "update_time": 1779012039, + "_id": "办法" + }, + "2024年4月17日": { + "chunk_ids": [ + "chunk-dd87aa5bc62cc9587ecb4c26d35a5263" + ], + "count": 1, + "create_time": 1779012027, + "update_time": 1779012027, + "_id": "2024年4月17日" + }, + "预算先行": { + "chunk_ids": [ + "chunk-dd87aa5bc62cc9587ecb4c26d35a5263" + ], + "count": 1, + "create_time": 1779012028, + "update_time": 1779012028, + "_id": "预算先行" + }, + "厉行节约": { + "chunk_ids": [ + "chunk-dd87aa5bc62cc9587ecb4c26d35a5263" + ], + "count": 1, + "create_time": 1779012028, + "update_time": 1779012028, + "_id": "厉行节约" + }, + "分级授权": { + "chunk_ids": [ + "chunk-dd87aa5bc62cc9587ecb4c26d35a5263" + ], + "count": 1, + "create_time": 1779012028, + "update_time": 1779012028, + "_id": "分级授权" + }, + "分类控制": { + "chunk_ids": [ + "chunk-dd87aa5bc62cc9587ecb4c26d35a5263" + ], + "count": 1, + "create_time": 1779012028, + "update_time": 1779012028, + "_id": "分类控制" + }, + "批办分离": { + "chunk_ids": [ + "chunk-dd87aa5bc62cc9587ecb4c26d35a5263" + ], + "count": 1, + "create_time": 1779012029, + "update_time": 1779012029, + "_id": "批办分离" + }, + "业务招待费": { + "chunk_ids": [ + "chunk-dd87aa5bc62cc9587ecb4c26d35a5263", + "chunk-d26b288ed4001dc5c504dce0eb841362" + ], + "count": 2, + "create_time": 1779012029, + "update_time": 1779012029, + "_id": "业务招待费" + }, + "会议费": { + "chunk_ids": [ + "chunk-dd87aa5bc62cc9587ecb4c26d35a5263", + "chunk-d26b288ed4001dc5c504dce0eb841362" + ], + "count": 2, + "create_time": 1779012029, + "update_time": 1779012029, + "_id": "会议费" + }, + "广告宣传费": { + "chunk_ids": [ + "chunk-dd87aa5bc62cc9587ecb4c26d35a5263", + "chunk-d26b288ed4001dc5c504dce0eb841362" + ], + "count": 2, + "update_time": 1779012089, + "_id": "广告宣传费" + }, + "控股子公司": { + "chunk_ids": [ + "chunk-dd87aa5bc62cc9587ecb4c26d35a5263" + ], + "count": 1, + "create_time": 1779012029, + "update_time": 1779012029, + "_id": "控股子公司" + }, + "分支机构": { + "chunk_ids": [ + "chunk-dd87aa5bc62cc9587ecb4c26d35a5263" + ], + "count": 1, + "create_time": 1779012029, + "update_time": 1779012029, + "_id": "分支机构" + }, + "经办部门": { + "chunk_ids": [ + "chunk-dd87aa5bc62cc9587ecb4c26d35a5263" + ], + "count": 1, + "create_time": 1779012029, + "update_time": 1779012029, + "_id": "经办部门" + }, + "各级管理人员": { + "chunk_ids": [ + "chunk-dd87aa5bc62cc9587ecb4c26d35a5263" + ], + "count": 1, + "create_time": 1779012030, + "update_time": 1779012030, + "_id": "各级管理人员" + }, + "归口管理部门": { + "chunk_ids": [ + "chunk-dd87aa5bc62cc9587ecb4c26d35a5263" + ], + "count": 1, + "create_time": 1779012044, + "update_time": 1779012044, + "_id": "归口管理部门" + }, + "远光制度〔2024〕14号": { + "chunk_ids": [ + "chunk-dd87aa5bc62cc9587ecb4c26d35a5263" + ], + "count": 1, + "create_time": 1779012044, + "update_time": 1779012044, + "_id": "远光制度〔2024〕14号" + }, + "修订说明": { + "chunk_ids": [ + "chunk-dd87aa5bc62cc9587ecb4c26d35a5263" + ], + "count": 1, + "create_time": 1779012032, + "update_time": 1779012032, + "_id": "修订说明" + }, + "员工支出报销审批权限表": { + "chunk_ids": [ + "chunk-dd87aa5bc62cc9587ecb4c26d35a5263", + "chunk-9841d66d8fb8548aab40220663a51693" + ], + "count": 2, + "create_time": 1779012032, + "update_time": 1779012032, + "_id": "员工支出报销审批权限表" + }, + "岗位支出报销审批权限表": { + "chunk_ids": [ + "chunk-dd87aa5bc62cc9587ecb4c26d35a5263", + "chunk-9841d66d8fb8548aab40220663a51693" + ], + "count": 2, + "create_time": 1779012032, + "update_time": 1779012032, + "_id": "岗位支出报销审批权限表" + }, + "支出归口管理部门与归口业务范围": { + "chunk_ids": [ + "chunk-dd87aa5bc62cc9587ecb4c26d35a5263" + ], + "count": 1, + "create_time": 1779012033, + "update_time": 1779012033, + "_id": "支出归口管理部门与归口业务范围" + }, + "效益优先": { + "chunk_ids": [ + "chunk-dd87aa5bc62cc9587ecb4c26d35a5263" + ], + "count": 1, + "create_time": 1779012033, + "update_time": 1779012033, + "_id": "效益优先" + }, + "公司各部门": { + "chunk_ids": [ + "chunk-dd87aa5bc62cc9587ecb4c26d35a5263" + ], + "count": 1, + "create_time": 1779012033, + "update_time": 1779012033, + "_id": "公司各部门" + }, + "因公借款": { + "chunk_ids": [ + "chunk-9841d66d8fb8548aab40220663a51693" + ], + "count": 1, + "create_time": 1779012033, + "update_time": 1779012033, + "_id": "因公借款" + }, + "其他支出(员工)": { + "chunk_ids": [ + "chunk-9841d66d8fb8548aab40220663a51693" + ], + "count": 1, + "create_time": 1779012034, + "update_time": 1779012034, + "_id": "其他支出(员工)" + }, + "资产采购": { + "chunk_ids": [ + "chunk-9841d66d8fb8548aab40220663a51693" + ], + "count": 1, + "create_time": 1779012034, + "update_time": 1779012034, + "_id": "资产采购" + }, + "基建工程": { + "chunk_ids": [ + "chunk-9841d66d8fb8548aab40220663a51693" + ], + "count": 1, + "create_time": 1779012034, + "update_time": 1779012034, + "_id": "基建工程" + }, + "股权投资、兼并收购": { + "chunk_ids": [ + "chunk-9841d66d8fb8548aab40220663a51693" + ], + "count": 1, + "create_time": 1779012036, + "update_time": 1779012036, + "_id": "股权投资、兼并收购" + }, + "材料采购": { + "chunk_ids": [ + "chunk-9841d66d8fb8548aab40220663a51693" + ], + "count": 1, + "create_time": 1779012036, + "update_time": 1779012036, + "_id": "材料采购" + }, + "分包外包(内部单位)": { + "chunk_ids": [ + "chunk-9841d66d8fb8548aab40220663a51693" + ], + "count": 1, + "create_time": 1779012036, + "update_time": 1779012036, + "_id": "分包外包(内部单位)" + }, + "分包外包(外部单位)": { + "chunk_ids": [ + "chunk-9841d66d8fb8548aab40220663a51693" + ], + "count": 1, + "create_time": 1779012036, + "update_time": 1779012036, + "_id": "分包外包(外部单位)" + }, + "保证金": { + "chunk_ids": [ + "chunk-9841d66d8fb8548aab40220663a51693" + ], + "count": 1, + "create_time": 1779012036, + "update_time": 1779012036, + "_id": "保证金" + }, + "销售退款": { + "chunk_ids": [ + "chunk-9841d66d8fb8548aab40220663a51693" + ], + "count": 1, + "create_time": 1779012036, + "update_time": 1779012036, + "_id": "销售退款" + }, + "房屋租金": { + "chunk_ids": [ + "chunk-9841d66d8fb8548aab40220663a51693" + ], + "count": 1, + "create_time": 1779012036, + "update_time": 1779012036, + "_id": "房屋租金" + }, + "基本出差补贴": { + "chunk_ids": [ + "chunk-d26b288ed4001dc5c504dce0eb841362" + ], + "count": 1, + "create_time": 1779012048, + "update_time": 1779012048, + "_id": "基本出差补贴" + }, + "商旅系统": { + "chunk_ids": [ + "chunk-d26b288ed4001dc5c504dce0eb841362", + "chunk-061324cc36078214691a6fc1cd0aaeea" + ], + "count": 2, + "create_time": 1779012049, + "update_time": 1779012049, + "_id": "商旅系统" + }, + "业务佐证材料": { + "chunk_ids": [ + "chunk-d26b288ed4001dc5c504dce0eb841362" + ], + "count": 1, + "create_time": 1779012036, + "update_time": 1779012036, + "_id": "业务佐证材料" + }, + "探亲路费": { + "chunk_ids": [ + "chunk-d26b288ed4001dc5c504dce0eb841362" + ], + "count": 1, + "create_time": 1779012037, + "update_time": 1779012037, + "_id": "探亲路费" + }, + "调动工作": { + "chunk_ids": [ + "chunk-d26b288ed4001dc5c504dce0eb841362" + ], + "count": 1, + "create_time": 1779012037, + "update_time": 1779012037, + "_id": "调动工作" + }, + "直辖市": { + "chunk_ids": [ + "chunk-d26b288ed4001dc5c504dce0eb841362" + ], + "count": 1, + "create_time": 1779012037, + "update_time": 1779012037, + "_id": "直辖市" + }, + "特区": { + "chunk_ids": [ + "chunk-d26b288ed4001dc5c504dce0eb841362" + ], + "count": 1, + "create_time": 1779012037, + "update_time": 1779012037, + "_id": "特区" + }, + "西藏": { + "chunk_ids": [ + "chunk-d26b288ed4001dc5c504dce0eb841362" + ], + "count": 1, + "create_time": 1779012037, + "update_time": 1779012037, + "_id": "西藏" + }, + "第十四条": { + "chunk_ids": [ + "chunk-d26b288ed4001dc5c504dce0eb841362" + ], + "count": 1, + "create_time": 1779012038, + "update_time": 1779012038, + "_id": "第十四条" + }, + "第十五条": { + "chunk_ids": [ + "chunk-d26b288ed4001dc5c504dce0eb841362" + ], + "count": 1, + "create_time": 1779012038, + "update_time": 1779012038, + "_id": "第十五条" + }, + "第十六条": { + "chunk_ids": [ + "chunk-d26b288ed4001dc5c504dce0eb841362" + ], + "count": 1, + "create_time": 1779012038, + "update_time": 1779012038, + "_id": "第十六条" + }, + "公司总裁": { + "chunk_ids": [ + "chunk-d26b288ed4001dc5c504dce0eb841362", + "chunk-061324cc36078214691a6fc1cd0aaeea" + ], + "count": 2, + "create_time": 1779012038, + "update_time": 1779012038, + "_id": "公司总裁" + }, + "商旅客服": { + "chunk_ids": [ + "chunk-d26b288ed4001dc5c504dce0eb841362" + ], + "count": 1, + "create_time": 1779012038, + "update_time": 1779012038, + "_id": "商旅客服" + }, + "公司员工探亲管理办法": { + "chunk_ids": [ + "chunk-d26b288ed4001dc5c504dce0eb841362" + ], + "count": 1, + "create_time": 1779012039, + "update_time": 1779012039, + "_id": "公司员工探亲管理办法" + }, + "增值税发票": { + "chunk_ids": [ + "chunk-061324cc36078214691a6fc1cd0aaeea" + ], + "count": 1, + "create_time": 1779012039, + "update_time": 1779012039, + "_id": "增值税发票" + }, + "税控系统明细清单": { + "chunk_ids": [ + "chunk-061324cc36078214691a6fc1cd0aaeea" + ], + "count": 1, + "create_time": 1779012039, + "update_time": 1779012039, + "_id": "税控系统明细清单" + }, + "财务": { + "chunk_ids": [ + "chunk-061324cc36078214691a6fc1cd0aaeea" + ], + "count": 1, + "create_time": 1779012039, + "update_time": 1779012039, + "_id": "财务" + }, + "经办人": { + "chunk_ids": [ + "chunk-061324cc36078214691a6fc1cd0aaeea" + ], + "count": 1, + "create_time": 1779012039, + "update_time": 1779012039, + "_id": "经办人" + }, + "业务原始凭据": { + "chunk_ids": [ + "chunk-061324cc36078214691a6fc1cd0aaeea" + ], + "count": 1, + "create_time": 1779012039, + "update_time": 1779012039, + "_id": "业务原始凭据" + }, + "报销申请时限": { + "chunk_ids": [ + "chunk-061324cc36078214691a6fc1cd0aaeea" + ], + "count": 1, + "create_time": 1779012039, + "update_time": 1779012039, + "_id": "报销申请时限" + }, + "预付款项": { + "chunk_ids": [ + "chunk-061324cc36078214691a6fc1cd0aaeea" + ], + "count": 1, + "create_time": 1779012039, + "update_time": 1779012039, + "_id": "预付款项" + }, + "公司": { + "chunk_ids": [ + "chunk-061324cc36078214691a6fc1cd0aaeea", + "chunk-e9438f69c9e221d9f0f00a05ad84eac6" + ], + "count": 2, + "update_time": 1779012094, + "_id": "公司" + }, + "员工": { + "chunk_ids": [ + "chunk-061324cc36078214691a6fc1cd0aaeea" + ], + "count": 1, + "create_time": 1779012040, + "update_time": 1779012040, + "_id": "员工" + }, + "供应商": { + "chunk_ids": [ + "chunk-061324cc36078214691a6fc1cd0aaeea" + ], + "count": 1, + "create_time": 1779012040, + "update_time": 1779012040, + "_id": "供应商" + }, + "支出报销审批": { + "chunk_ids": [ + "chunk-061324cc36078214691a6fc1cd0aaeea" + ], + "count": 1, + "create_time": 1779012041, + "update_time": 1779012041, + "_id": "支出报销审批" + }, + "预算内支出": { + "chunk_ids": [ + "chunk-061324cc36078214691a6fc1cd0aaeea" + ], + "count": 1, + "create_time": 1779012042, + "update_time": 1779012042, + "_id": "预算内支出" + }, + "正式员工": { + "chunk_ids": [ + "chunk-061324cc36078214691a6fc1cd0aaeea" + ], + "count": 1, + "create_time": 1779012042, + "update_time": 1779012042, + "_id": "正式员工" + }, + "分管领导": { + "chunk_ids": [ + "chunk-061324cc36078214691a6fc1cd0aaeea" + ], + "count": 1, + "create_time": 1779012042, + "update_time": 1779012042, + "_id": "分管领导" + }, + "一万元": { + "chunk_ids": [ + "chunk-061324cc36078214691a6fc1cd0aaeea" + ], + "count": 1, + "create_time": 1779012042, + "update_time": 1779012042, + "_id": "一万元" + }, + "出租车": { + "chunk_ids": [ + "chunk-061324cc36078214691a6fc1cd0aaeea" + ], + "count": 1, + "create_time": 1779012042, + "update_time": 1779012042, + "_id": "出租车" + }, + "部门负责人": { + "chunk_ids": [ + "chunk-061324cc36078214691a6fc1cd0aaeea" + ], + "count": 1, + "create_time": 1779012042, + "update_time": 1779012042, + "_id": "部门负责人" + }, + "出差审批程序": { + "chunk_ids": [ + "chunk-061324cc36078214691a6fc1cd0aaeea" + ], + "count": 1, + "create_time": 1779012042, + "update_time": 1779012042, + "_id": "出差审批程序" + }, + "交通费": { + "chunk_ids": [ + "chunk-061324cc36078214691a6fc1cd0aaeea" + ], + "count": 1, + "create_time": 1779012042, + "update_time": 1779012042, + "_id": "交通费" + }, + "住宿费": { + "chunk_ids": [ + "chunk-061324cc36078214691a6fc1cd0aaeea" + ], + "count": 1, + "create_time": 1779012043, + "update_time": 1779012043, + "_id": "住宿费" + }, + "出差补贴": { + "chunk_ids": [ + "chunk-061324cc36078214691a6fc1cd0aaeea" + ], + "count": 1, + "create_time": 1779012043, + "update_time": 1779012043, + "_id": "出差补贴" + }, + "成本中心归属": { + "chunk_ids": [ + "chunk-061324cc36078214691a6fc1cd0aaeea" + ], + "count": 1, + "create_time": 1779012043, + "update_time": 1779012043, + "_id": "成本中心归属" + }, + "责任原则": { + "chunk_ids": [ + "chunk-061324cc36078214691a6fc1cd0aaeea" + ], + "count": 1, + "create_time": 1779012043, + "update_time": 1779012043, + "_id": "责任原则" + }, + "受益原则": { + "chunk_ids": [ + "chunk-061324cc36078214691a6fc1cd0aaeea" + ], + "count": 1, + "create_time": 1779012044, + "update_time": 1779012044, + "_id": "受益原则" + }, + "结算起点": { + "chunk_ids": [ + "chunk-061324cc36078214691a6fc1cd0aaeea" + ], + "count": 1, + "create_time": 1779012044, + "update_time": 1779012044, + "_id": "结算起点" + }, + "Procurement Management Regulations": { + "chunk_ids": [ + "chunk-74c01decac4a10cd40a491786743b0ee" + ], + "count": 1, + "create_time": 1779012081, + "update_time": 1779012081, + "_id": "Procurement Management Regulations" + }, + "Tax Authority Recognized Invoice": { + "chunk_ids": [ + "chunk-74c01decac4a10cd40a491786743b0ee" + ], + "count": 1, + "create_time": 1779012094, + "update_time": 1779012094, + "_id": "Tax Authority Recognized Invoice" + }, + "Financial Review": { + "chunk_ids": [ + "chunk-74c01decac4a10cd40a491786743b0ee" + ], + "count": 1, + "create_time": 1779012085, + "update_time": 1779012085, + "_id": "Financial Review" + }, + "总裁办": { + "chunk_ids": [ + "chunk-2187fa0609874bdda339c9850da45a26", + "chunk-07de6ea74f60535b689f977295770273" + ], + "count": 2, + "create_time": 1779379010, + "update_time": 1779379010, + "_id": "总裁办" + }, + "采购专员": { + "chunk_ids": [ + "chunk-2187fa0609874bdda339c9850da45a26", + "chunk-07de6ea74f60535b689f977295770273" + ], + "count": 2, + "create_time": 1779379010, + "update_time": 1779379010, + "_id": "采购专员" + }, + "用户中心": { + "chunk_ids": [ + "chunk-2187fa0609874bdda339c9850da45a26" + ], + "count": 1, + "create_time": 1779379010, + "update_time": 1779379010, + "_id": "用户中心" + }, + "用户菜单": { + "chunk_ids": [ + "chunk-2187fa0609874bdda339c9850da45a26" + ], + "count": 1, + "create_time": 1779379010, + "update_time": 1779379010, + "_id": "用户菜单" + }, + "扫码上传": { + "chunk_ids": [ + "chunk-2187fa0609874bdda339c9850da45a26" + ], + "count": 1, + "create_time": 1779379010, + "update_time": 1779379010, + "_id": "扫码上传" + }, + "状态栏": { + "chunk_ids": [ + "chunk-2187fa0609874bdda339c9850da45a26", + "chunk-2224d777c0b72d0b2dab622c79096c2c" + ], + "count": 2, + "create_time": 1779379010, + "update_time": 1779379010, + "_id": "状态栏" + }, + "Ashy有限公司": { + "chunk_ids": [ + "chunk-2187fa0609874bdda339c9850da45a26" + ], + "count": 1, + "create_time": 1779379010, + "update_time": 1779379010, + "_id": "Ashy有限公司" + }, + "无单报销工具": { + "chunk_ids": [ + "chunk-2187fa0609874bdda339c9850da45a26" + ], + "count": 1, + "create_time": 1779379010, + "update_time": 1779379010, + "_id": "无单报销工具" + }, + "影子ERP": { + "chunk_ids": [ + "chunk-2187fa0609874bdda339c9850da45a26", + "chunk-07de6ea74f60535b689f977295770273" + ], + "count": 2, + "create_time": 1779379010, + "update_time": 1779379010, + "_id": "影子ERP" + }, + "零报销": { + "chunk_ids": [ + "chunk-2187fa0609874bdda339c9850da45a26", + "chunk-07de6ea74f60535b689f977295770273" + ], + "count": 2, + "create_time": 1779379010, + "update_time": 1779379010, + "_id": "零报销" + }, + "即效合规": { + "chunk_ids": [ + "chunk-2187fa0609874bdda339c9850da45a26", + "chunk-07de6ea74f60535b689f977295770273" + ], + "count": 2, + "create_time": 1779379010, + "update_time": 1779379010, + "_id": "即效合规" + }, + "ERP系统": { + "chunk_ids": [ + "chunk-2187fa0609874bdda339c9850da45a26" + ], + "count": 1, + "create_time": 1779379010, + "update_time": 1779379010, + "_id": "ERP系统" + }, + "标题栏": { + "chunk_ids": [ + "chunk-2187fa0609874bdda339c9850da45a26" + ], + "count": 1, + "create_time": 1779379010, + "update_time": 1779379010, + "_id": "标题栏" + }, + "活动栏": { + "chunk_ids": [ + "chunk-2187fa0609874bdda339c9850da45a26" + ], + "count": 1, + "create_time": 1779379010, + "update_time": 1779379010, + "_id": "活动栏" + }, + "侧边栏": { + "chunk_ids": [ + "chunk-2187fa0609874bdda339c9850da45a26" + ], + "count": 1, + "create_time": 1779379010, + "update_time": 1779379010, + "_id": "侧边栏" + }, + "底部对话栏": { + "chunk_ids": [ + "chunk-2187fa0609874bdda339c9850da45a26" + ], + "count": 1, + "create_time": 1779379010, + "update_time": 1779379010, + "_id": "底部对话栏" + }, + "报销流程": { + "chunk_ids": [ + "chunk-2187fa0609874bdda339c9850da45a26" + ], + "count": 1, + "create_time": 1779379010, + "update_time": 1779379010, + "_id": "报销流程" + }, + "凭证处理流程": { + "chunk_ids": [ + "chunk-2187fa0609874bdda339c9850da45a26" + ], + "count": 1, + "create_time": 1779379010, + "update_time": 1779379010, + "_id": "凭证处理流程" + }, + "无单报销": { + "chunk_ids": [ + "chunk-07de6ea74f60535b689f977295770273" + ], + "count": 1, + "create_time": 1779379010, + "update_time": 1779379010, + "_id": "无单报销" + }, + "ERP": { + "chunk_ids": [ + "chunk-07de6ea74f60535b689f977295770273" + ], + "count": 1, + "create_time": 1779379010, + "update_time": 1779379010, + "_id": "ERP" + }, + "大型企业": { + "chunk_ids": [ + "chunk-07de6ea74f60535b689f977295770273" + ], + "count": 1, + "create_time": 1779379010, + "update_time": 1779379010, + "_id": "大型企业" + }, + "业务人员": { + "chunk_ids": [ + "chunk-07de6ea74f60535b689f977295770273" + ], + "count": 1, + "create_time": 1779379010, + "update_time": 1779379010, + "_id": "业务人员" + }, + "行政秘书": { + "chunk_ids": [ + "chunk-07de6ea74f60535b689f977295770273" + ], + "count": 1, + "create_time": 1779379010, + "update_time": 1779379010, + "_id": "行政秘书" + }, + "费控专责": { + "chunk_ids": [ + "chunk-07de6ea74f60535b689f977295770273" + ], + "count": 1, + "create_time": 1779379010, + "update_time": 1779379010, + "_id": "费控专责" + }, + "财务BP": { + "chunk_ids": [ + "chunk-07de6ea74f60535b689f977295770273" + ], + "count": 1, + "create_time": 1779379010, + "update_time": 1779379010, + "_id": "财务BP" + }, + "Web端": { + "chunk_ids": [ + "chunk-07de6ea74f60535b689f977295770273" + ], + "count": 1, + "create_time": 1779379010, + "update_time": 1779379010, + "_id": "Web端" + }, + "AI": { + "chunk_ids": [ + "chunk-07de6ea74f60535b689f977295770273" + ], + "count": 1, + "create_time": 1779379010, + "update_time": 1779379010, + "_id": "AI" + }, + "UI Layout": { + "chunk_ids": [ + "chunk-07de6ea74f60535b689f977295770273" + ], + "count": 1, + "create_time": 1779379010, + "update_time": 1779379010, + "_id": "UI Layout" + }, + "Title Bar": { + "chunk_ids": [ + "chunk-07de6ea74f60535b689f977295770273" + ], + "count": 1, + "create_time": 1779379010, + "update_time": 1779379010, + "_id": "Title Bar" + }, + "Activity Bar": { + "chunk_ids": [ + "chunk-07de6ea74f60535b689f977295770273" + ], + "count": 1, + "create_time": 1779379010, + "update_time": 1779379010, + "_id": "Activity Bar" + }, + "Sidebar": { + "chunk_ids": [ + "chunk-07de6ea74f60535b689f977295770273" + ], + "count": 1, + "create_time": 1779379011, + "update_time": 1779379011, + "_id": "Sidebar" + }, + "Main Content Area": { + "chunk_ids": [ + "chunk-07de6ea74f60535b689f977295770273" + ], + "count": 1, + "create_time": 1779379011, + "update_time": 1779379011, + "_id": "Main Content Area" + }, + "Status Bar": { + "chunk_ids": [ + "chunk-07de6ea74f60535b689f977295770273" + ], + "count": 1, + "create_time": 1779379011, + "update_time": 1779379011, + "_id": "Status Bar" + }, + "Bottom Dialog Bar": { + "chunk_ids": [ + "chunk-07de6ea74f60535b689f977295770273" + ], + "count": 1, + "create_time": 1779379011, + "update_time": 1779379011, + "_id": "Bottom Dialog Bar" + }, + "菜单1": { + "chunk_ids": [ + "chunk-07de6ea74f60535b689f977295770273" + ], + "count": 1, + "create_time": 1779379011, + "update_time": 1779379011, + "_id": "菜单1" + }, + "商旅预订": { + "chunk_ids": [ + "chunk-1746bd83138e85e66a78e0cb9ad79272" + ], + "count": 1, + "create_time": 1779379011, + "update_time": 1779379011, + "_id": "商旅预订" + }, + "线下自付": { + "chunk_ids": [ + "chunk-1746bd83138e85e66a78e0cb9ad79272" + ], + "count": 1, + "create_time": 1779379011, + "update_time": 1779379011, + "_id": "线下自付" + }, + "凭证识别": { + "chunk_ids": [ + "chunk-1746bd83138e85e66a78e0cb9ad79272" + ], + "count": 1, + "create_time": 1779379011, + "update_time": 1779379011, + "_id": "凭证识别" + }, + "凭证缩略图": { + "chunk_ids": [ + "chunk-1746bd83138e85e66a78e0cb9ad79272" + ], + "count": 1, + "create_time": 1779379011, + "update_time": 1779379011, + "_id": "凭证缩略图" + }, + "火车票": { + "chunk_ids": [ + "chunk-1746bd83138e85e66a78e0cb9ad79272" + ], + "count": 1, + "create_time": 1779379011, + "update_time": 1779379011, + "_id": "火车票" + }, + "出租车发票及行程单": { + "chunk_ids": [ + "chunk-1746bd83138e85e66a78e0cb9ad79272" + ], + "count": 1, + "create_time": 1779379011, + "update_time": 1779379011, + "_id": "出租车发票及行程单" + }, + "住宿发票及流水": { + "chunk_ids": [ + "chunk-1746bd83138e85e66a78e0cb9ad79272" + ], + "count": 1, + "create_time": 1779379011, + "update_time": 1779379011, + "_id": "住宿发票及流水" + }, + "公共交通发票及行程单": { + "chunk_ids": [ + "chunk-1746bd83138e85e66a78e0cb9ad79272" + ], + "count": 1, + "create_time": 1779379011, + "update_time": 1779379011, + "_id": "公共交通发票及行程单" + }, + "飞机票行程单": { + "chunk_ids": [ + "chunk-1746bd83138e85e66a78e0cb9ad79272" + ], + "count": 1, + "create_time": 1779379011, + "update_time": 1779379011, + "_id": "飞机票行程单" + }, + "AI预审": { + "chunk_ids": [ + "chunk-1746bd83138e85e66a78e0cb9ad79272" + ], + "count": 1, + "create_time": 1779379011, + "update_time": 1779379011, + "_id": "AI预审" + }, + "问题项目标识": { + "chunk_ids": [ + "chunk-1746bd83138e85e66a78e0cb9ad79272" + ], + "count": 1, + "create_time": 1779379011, + "update_time": 1779379011, + "_id": "问题项目标识" + }, + "补充上传按钮": { + "chunk_ids": [ + "chunk-1746bd83138e85e66a78e0cb9ad79272" + ], + "count": 1, + "create_time": 1779379011, + "update_time": 1779379011, + "_id": "补充上传按钮" + }, + "预审按钮": { + "chunk_ids": [ + "chunk-1746bd83138e85e66a78e0cb9ad79272" + ], + "count": 1, + "create_time": 1779379011, + "update_time": 1779379011, + "_id": "预审按钮" + }, + "审核点": { + "chunk_ids": [ + "chunk-1746bd83138e85e66a78e0cb9ad79272" + ], + "count": 1, + "create_time": 1779379011, + "update_time": 1779379011, + "_id": "审核点" + }, + "完整性检查": { + "chunk_ids": [ + "chunk-1746bd83138e85e66a78e0cb9ad79272" + ], + "count": 1, + "create_time": 1779379012, + "update_time": 1779379012, + "_id": "完整性检查" + }, + "合规性检查": { + "chunk_ids": [ + "chunk-1746bd83138e85e66a78e0cb9ad79272" + ], + "count": 1, + "create_time": 1779379012, + "update_time": 1779379012, + "_id": "合规性检查" + }, + "问题标注": { + "chunk_ids": [ + "chunk-1746bd83138e85e66a78e0cb9ad79272" + ], + "count": 1, + "create_time": 1779379012, + "update_time": 1779379012, + "_id": "问题标注" + }, + "商旅附件": { + "chunk_ids": [ + "chunk-1746bd83138e85e66a78e0cb9ad79272" + ], + "count": 1, + "create_time": 1779379012, + "update_time": 1779379012, + "_id": "商旅附件" + }, + "出差": { + "chunk_ids": [ + "chunk-1746bd83138e85e66a78e0cb9ad79272" + ], + "count": 1, + "create_time": 1779379012, + "update_time": 1779379012, + "_id": "出差" + }, + "火车票超标": { + "chunk_ids": [ + "chunk-1746bd83138e85e66a78e0cb9ad79272" + ], + "count": 1, + "create_time": 1779379012, + "update_time": 1779379012, + "_id": "火车票超标" + }, + "飞机票超标": { + "chunk_ids": [ + "chunk-1746bd83138e85e66a78e0cb9ad79272" + ], + "count": 1, + "create_time": 1779379012, + "update_time": 1779379012, + "_id": "飞机票超标" + }, + "Train Ticket Compliance Check": { + "chunk_ids": [ + "chunk-ce44e4483e4119265b43eacb72e0326a" + ], + "count": 1, + "create_time": 1779379012, + "update_time": 1779379012, + "_id": "Train Ticket Compliance Check" + }, + "Flight Ticket Compliance Check": { + "chunk_ids": [ + "chunk-ce44e4483e4119265b43eacb72e0326a" + ], + "count": 1, + "create_time": 1779379012, + "update_time": 1779379012, + "_id": "Flight Ticket Compliance Check" + }, + "Hotel Booking Compliance Check": { + "chunk_ids": [ + "chunk-ce44e4483e4119265b43eacb72e0326a" + ], + "count": 1, + "create_time": 1779379012, + "update_time": 1779379012, + "_id": "Hotel Booking Compliance Check" + }, + "Taxi Trip Time Compliance Check": { + "chunk_ids": [ + "chunk-ce44e4483e4119265b43eacb72e0326a" + ], + "count": 1, + "create_time": 1779379012, + "update_time": 1779379012, + "_id": "Taxi Trip Time Compliance Check" + }, + "Taxi Invoice Check": { + "chunk_ids": [ + "chunk-ce44e4483e4119265b43eacb72e0326a" + ], + "count": 1, + "create_time": 1779379012, + "update_time": 1779379012, + "_id": "Taxi Invoice Check" + }, + "Airport Bus Ticket Check": { + "chunk_ids": [ + "chunk-ce44e4483e4119265b43eacb72e0326a" + ], + "count": 1, + "create_time": 1779379012, + "update_time": 1779379012, + "_id": "Airport Bus Ticket Check" + }, + "Subway Invoice Check": { + "chunk_ids": [ + "chunk-ce44e4483e4119265b43eacb72e0326a" + ], + "count": 1, + "create_time": 1779379012, + "update_time": 1779379012, + "_id": "Subway Invoice Check" + }, + "Invoice Title Check": { + "chunk_ids": [ + "chunk-ce44e4483e4119265b43eacb72e0326a" + ], + "count": 1, + "create_time": 1779379003, + "update_time": 1779379003, + "_id": "Invoice Title Check" + }, + "Pre-Review Result Display": { + "chunk_ids": [ + "chunk-ce44e4483e4119265b43eacb72e0326a" + ], + "count": 1, + "create_time": 1779379003, + "update_time": 1779379003, + "_id": "Pre-Review Result Display" + }, + "Expense Reimbursement Submission Process": { + "chunk_ids": [ + "chunk-ce44e4483e4119265b43eacb72e0326a" + ], + "count": 1, + "create_time": 1779379003, + "update_time": 1779379003, + "_id": "Expense Reimbursement Submission Process" + }, + "AI Assistant Module": { + "chunk_ids": [ + "chunk-ce44e4483e4119265b43eacb72e0326a" + ], + "count": 1, + "create_time": 1779379003, + "update_time": 1779379003, + "_id": "AI Assistant Module" + }, + "Global Chat Bar": { + "chunk_ids": [ + "chunk-ce44e4483e4119265b43eacb72e0326a" + ], + "count": 1, + "create_time": 1779379003, + "update_time": 1779379003, + "_id": "Global Chat Bar" + }, + "Summon Panel": { + "chunk_ids": [ + "chunk-ce44e4483e4119265b43eacb72e0326a" + ], + "count": 1, + "create_time": 1779379003, + "update_time": 1779379003, + "_id": "Summon Panel" + }, + "Preset Assistant Cards": { + "chunk_ids": [ + "chunk-ce44e4483e4119265b43eacb72e0326a" + ], + "count": 1, + "create_time": 1779379003, + "update_time": 1779379003, + "_id": "Preset Assistant Cards" + }, + "Role Configuration Pop-up Window": { + "chunk_ids": [ + "chunk-ce44e4483e4119265b43eacb72e0326a" + ], + "count": 1, + "create_time": 1779379003, + "update_time": 1779379003, + "_id": "Role Configuration Pop-up Window" + }, + "Role Prompt Templates": { + "chunk_ids": [ + "chunk-ce44e4483e4119265b43eacb72e0326a" + ], + "count": 1, + "create_time": 1779379003, + "update_time": 1779379003, + "_id": "Role Prompt Templates" + }, + "User Center Module": { + "chunk_ids": [ + "chunk-ce44e4483e4119265b43eacb72e0326a" + ], + "count": 1, + "create_time": 1779379003, + "update_time": 1779379003, + "_id": "User Center Module" + }, + "User Menu": { + "chunk_ids": [ + "chunk-ce44e4483e4119265b43eacb72e0326a" + ], + "count": 1, + "create_time": 1779379003, + "update_time": 1779379003, + "_id": "User Menu" + }, + "Trip Time Check": { + "chunk_ids": [ + "chunk-ce44e4483e4119265b43eacb72e0326a" + ], + "count": 1, + "create_time": 1779379003, + "update_time": 1779379003, + "_id": "Trip Time Check" + }, + "Normal Items": { + "chunk_ids": [ + "chunk-ce44e4483e4119265b43eacb72e0326a" + ], + "count": 1, + "create_time": 1779379003, + "update_time": 1779379003, + "_id": "Normal Items" + }, + "Problem Items": { + "chunk_ids": [ + "chunk-ce44e4483e4119265b43eacb72e0326a" + ], + "count": 1, + "create_time": 1779379003, + "update_time": 1779379003, + "_id": "Problem Items" + }, + "Pre-Review Pass Notification": { + "chunk_ids": [ + "chunk-ce44e4483e4119265b43eacb72e0326a" + ], + "count": 1, + "create_time": 1779379003, + "update_time": 1779379003, + "_id": "Pre-Review Pass Notification" + }, + "Pre-Review Problem Summary": { + "chunk_ids": [ + "chunk-ce44e4483e4119265b43eacb72e0326a" + ], + "count": 1, + "create_time": 1779379004, + "update_time": 1779379004, + "_id": "Pre-Review Problem Summary" + }, + "Supplementary Upload Button": { + "chunk_ids": [ + "chunk-ce44e4483e4119265b43eacb72e0326a" + ], + "count": 1, + "create_time": 1779379004, + "update_time": 1779379004, + "_id": "Supplementary Upload Button" + }, + "Go Reimburse Button": { + "chunk_ids": [ + "chunk-ce44e4483e4119265b43eacb72e0326a" + ], + "count": 1, + "create_time": 1779379004, + "update_time": 1779379004, + "_id": "Go Reimburse Button" + }, + "Submission Confirmation Prompt": { + "chunk_ids": [ + "chunk-ce44e4483e4119265b43eacb72e0326a" + ], + "count": 1, + "create_time": 1779379004, + "update_time": 1779379004, + "_id": "Submission Confirmation Prompt" + }, + "Submission Result Prompt": { + "chunk_ids": [ + "chunk-ce44e4483e4119265b43eacb72e0326a" + ], + "count": 1, + "create_time": 1779379004, + "update_time": 1779379004, + "_id": "Submission Result Prompt" + }, + "Administrative Secretary": { + "chunk_ids": [ + "chunk-ce44e4483e4119265b43eacb72e0326a" + ], + "count": 1, + "create_time": 1779379004, + "update_time": 1779379004, + "_id": "Administrative Secretary" + }, + "Cost Control Specialist": { + "chunk_ids": [ + "chunk-ce44e4483e4119265b43eacb72e0326a" + ], + "count": 1, + "create_time": 1779379004, + "update_time": 1779379004, + "_id": "Cost Control Specialist" + }, + "Finance BP": { + "chunk_ids": [ + "chunk-ce44e4483e4119265b43eacb72e0326a" + ], + "count": 1, + "create_time": 1779379004, + "update_time": 1779379004, + "_id": "Finance BP" + }, + "Procurement Specialist": { + "chunk_ids": [ + "chunk-ce44e4483e4119265b43eacb72e0326a" + ], + "count": 1, + "create_time": 1779379004, + "update_time": 1779379004, + "_id": "Procurement Specialist" + }, + "User Message": { + "chunk_ids": [ + "chunk-ce44e4483e4119265b43eacb72e0326a" + ], + "count": 1, + "create_time": 1779379004, + "update_time": 1779379004, + "_id": "User Message" + }, + "AI Reply": { + "chunk_ids": [ + "chunk-ce44e4483e4119265b43eacb72e0326a" + ], + "count": 1, + "create_time": 1779379004, + "update_time": 1779379004, + "_id": "AI Reply" + }, + "配色方案": { + "chunk_ids": [ + "chunk-2224d777c0b72d0b2dab622c79096c2c" + ], + "count": 1, + "create_time": 1779379004, + "update_time": 1779379004, + "_id": "配色方案" + }, + "功能需求": { + "chunk_ids": [ + "chunk-2224d777c0b72d0b2dab622c79096c2c" + ], + "count": 1, + "create_time": 1779379004, + "update_time": 1779379004, + "_id": "功能需求" + }, + "正文": { + "chunk_ids": [ + "chunk-2224d777c0b72d0b2dab622c79096c2c" + ], + "count": 1, + "create_time": 1779379004, + "update_time": 1779379004, + "_id": "正文" + }, + "Menu 2": { + "chunk_ids": [ + "chunk-99c6f377dff2b9a37a7214b7b05ea9a8" + ], + "count": 1, + "create_time": 1779379004, + "update_time": 1779379004, + "_id": "Menu 2" + }, + "Matter List": { + "chunk_ids": [ + "chunk-99c6f377dff2b9a37a7214b7b05ea9a8" + ], + "count": 1, + "create_time": 1779379004, + "update_time": 1779379004, + "_id": "Matter List" + }, + "Receipt-Free Reimbursement": { + "chunk_ids": [ + "chunk-99c6f377dff2b9a37a7214b7b05ea9a8" + ], + "count": 1, + "create_time": 1779379004, + "update_time": 1779379004, + "_id": "Receipt-Free Reimbursement" + }, + "AI Assistant": { + "chunk_ids": [ + "chunk-99c6f377dff2b9a37a7214b7b05ea9a8" + ], + "count": 1, + "create_time": 1779379004, + "update_time": 1779379004, + "_id": "AI Assistant" + }, + "User Center": { + "chunk_ids": [ + "chunk-99c6f377dff2b9a37a7214b7b05ea9a8" + ], + "count": 1, + "create_time": 1779379004, + "update_time": 1779379004, + "_id": "User Center" + }, + "Initiate Matter": { + "chunk_ids": [ + "chunk-99c6f377dff2b9a37a7214b7b05ea9a8" + ], + "count": 1, + "create_time": 1779379004, + "update_time": 1779379004, + "_id": "Initiate Matter" + }, + "Mini Program Code": { + "chunk_ids": [ + "chunk-99c6f377dff2b9a37a7214b7b05ea9a8" + ], + "count": 1, + "create_time": 1779379004, + "update_time": 1779379004, + "_id": "Mini Program Code" + }, + "Document Upload": { + "chunk_ids": [ + "chunk-99c6f377dff2b9a37a7214b7b05ea9a8" + ], + "count": 1, + "create_time": 1779379005, + "update_time": 1779379005, + "_id": "Document Upload" + }, + "Time Track": { + "chunk_ids": [ + "chunk-99c6f377dff2b9a37a7214b7b05ea9a8" + ], + "count": 1, + "create_time": 1779379005, + "update_time": 1779379005, + "_id": "Time Track" + }, + "AI Pre-Review": { + "chunk_ids": [ + "chunk-99c6f377dff2b9a37a7214b7b05ea9a8" + ], + "count": 1, + "create_time": 1779379005, + "update_time": 1779379005, + "_id": "AI Pre-Review" + }, + "Personal Center": { + "chunk_ids": [ + "chunk-99c6f377dff2b9a37a7214b7b05ea9a8" + ], + "count": 1, + "create_time": 1779379005, + "update_time": 1779379005, + "_id": "Personal Center" + }, + "Logout": { + "chunk_ids": [ + "chunk-99c6f377dff2b9a37a7214b7b05ea9a8" + ], + "count": 1, + "create_time": 1779379005, + "update_time": 1779379005, + "_id": "Logout" + }, + "Business Travel": { + "chunk_ids": [ + "chunk-99c6f377dff2b9a37a7214b7b05ea9a8" + ], + "count": 1, + "create_time": 1779379005, + "update_time": 1779379005, + "_id": "Business Travel" + }, + "Q1 Quarterly Business Progress Report": { + "chunk_ids": [ + "chunk-99c6f377dff2b9a37a7214b7b05ea9a8" + ], + "count": 1, + "create_time": 1779379005, + "update_time": 1779379005, + "_id": "Q1 Quarterly Business Progress Report" + }, + "2026 National AI Technology Summit in Hefei": { + "chunk_ids": [ + "chunk-99c6f377dff2b9a37a7214b7b05ea9a8" + ], + "count": 1, + "create_time": 1779379005, + "update_time": 1779379005, + "_id": "2026 National AI Technology Summit in Hefei" + }, + "Smart Platform Jiangsu Province Company Operations Support": { + "chunk_ids": [ + "chunk-99c6f377dff2b9a37a7214b7b05ea9a8" + ], + "count": 1, + "create_time": 1779379005, + "update_time": 1779379005, + "_id": "Smart Platform Jiangsu Province Company Operations Support" + }, + "Document Recognition": { + "chunk_ids": [ + "chunk-99c6f377dff2b9a37a7214b7b05ea9a8" + ], + "count": 1, + "create_time": 1779379005, + "update_time": 1779379005, + "_id": "Document Recognition" + }, + "Submit Reimbursement": { + "chunk_ids": [ + "chunk-99c6f377dff2b9a37a7214b7b05ea9a8" + ], + "count": 1, + "create_time": 1779379005, + "update_time": 1779379005, + "_id": "Submit Reimbursement" + }, + "Warning Icon": { + "chunk_ids": [ + "chunk-99c6f377dff2b9a37a7214b7b05ea9a8" + ], + "count": 1, + "create_time": 1779379005, + "update_time": 1779379005, + "_id": "Warning Icon" + } } \ No newline at end of file diff --git a/server/storage/knowledge/.lightrag/x_financial_knowledge/kv_store_full_entities.json b/server/storage/knowledge/.lightrag/x_financial_knowledge/kv_store_full_entities.json index 815b966..22d4d57 100644 --- a/server/storage/knowledge/.lightrag/x_financial_knowledge/kv_store_full_entities.json +++ b/server/storage/knowledge/.lightrag/x_financial_knowledge/kv_store_full_entities.json @@ -1,268 +1,387 @@ -{ - "2c1cb358f08d44ceb0e4d287133206ec": { - "entity_names": [ - "工会委员会", - "Business Original Documents", - "First Approver", - "P8", - "一级部门总经理", - "组织人事部", - "业务原始凭据", - "营销中心", - "保证金", - "投标保证金", - "餐补", - "第十四条业务招待费", - "Chief Engineer", - "业务招待", - "Employee Welfare", - "经济舱", - "2024年4月17日", - "三等舱", - "财务信息化系统", - "分管领导", - "重点支出管理规定", - "备用金借款", - "Financial Review", - "第五章附则", - "Company Leadership", - "第十九条", - "经办人", - "预算内支出", - "Current Account Payment", - "Business Entertainment", - "Tax Control System Details", - "第二十一条", - "成本中心归属", - "岗位支出报销审批权限表", - "工会经费管理办法", - "商旅系统", - "Special Subsidy", - "中国银行外汇折算价", - "因公借款", - "资产采购", - "广告费", - "First-Level Department General Manager", - "正式员工", - "一万元", - "公司员工教育培训管理办法", - "责任原则", - "第二章职责分工", - "预算先行", - "Planning and Finance Department", - "Accommodation Cost Reimbursement", - "Official Vehicle Subsidy", - "第四条归口管理部门主要职责", - "Personal Service Compensation", - "邮递费", - "附表3:支出归口管理部门与归口业务范围", - "员工", - "第二条目的", - "Director", - "支出归口管理部门与归口业务范围", - "其他支出(员工)", - "报销标准", - "5000000 Yuan Approval Limit", - "第十一条备用金借款", - "会议费", - "第十七条", - "第七条各级管理人员主要职责", - "50000 Yuan Approval Limit", - "全资子公司", - "涉外业务汇率标准", - "总监", - "第十三条差旅费", - "审批权限表", - "商旅订票规范", - "Final Approval Position", - "报销资格", - "新增报销规定", - "公司支出管理办法", - "Institution General Manager", - "房屋租金", - "Staff Activities", - "分包外包(内部单位)", - "报销申请时限", - "Financial Information System", - "Expenditure Authorization Approval Scope", - "直辖市", - "培训费", - "第十二条市内交通费", - "第十五条", - "终审岗", - "Remote Work Housing", - "Centralized Management department", - "第二十条", - "办公室(党委办公室)", - "Three Flows Consistency Principle", - "审批权限", - "VAT Special Invoice", - "后勤服务部", - "员工支出报销审批权限表", - "公司总裁", - "出差补贴", - "Basic Level Managers", - "预付款项", - "附表1:员工支出报销审批权限表", - "经办部门", - "信息管理部", - "通信费", - "第十六条", - "增值税发票", - "财务入账条件", - "Hotel Accommodation Standards", - "审批流转程序", - "Self-Driving Travel Provisions", - "交通费", - "第九条支出报销审批", - "薪酬福利支出分配计划", - "产品规划设计部", - "因公用车补贴", - "Committee Chairpersons", - "Business Division General Manager", - "组织安排", - "1 Yuan Per Person Per Kilometer Reimbursement", - "Separation of Approval and Processing Principle", - "第五条计划财务部主要职责", - "200000 Yuan Approval Limit", - "公司各部门", - "第十四条", - "Other Areas", - "分支机构", - "Departments And Units", - "计划财务部", - "Other Employees", - "第二十三条", - "公司团建管理办法", - "火车硬席", - "税控系统明细清单", - "Trade Union Fund", - "报销标准变化情况", - "薪酬福利支出", - "Hong Kong, Macau, And Taiwan Region", - "对外捐赠支出", - "Multi-Level Approval Rule", - "Three Working Days Deadline", - "Employee Remuneration", - "销售退款", - "股权投资、兼并收购", - "控股子公司", - "取消报销规定", - "Procurement Management Regulations", - "Middle Managers", - "差旅费", - "批办分离", - "住宿费", - "Travel Allowance Standards", - "第二十三条本办法的归口与实施", - "Senior Vice President", - "供应商", - "人事归口管理部门", - "Management Personnel At All Levels", - "效益优先", - "Operating Department Individual", - "Remote Work Housing Rental Expenses", - "取消报销规定内容", - "Company", - "修订说明", - "国网数科公司", - "Vice President", - "分级授权", - "Expenditure Reimbursement Application", - "第二十四条附件", - "第二十二条", - "出租车", - "Night High-Speed Rail Provision", - "各级管理人员", - "受益原则", - "公司员工因公通讯费用实施细则", - "公司支出管理办法(2024)", - "出差补贴标准", - "Bid Security Deposit Approval Limits Table", - "第二条范围", - "Company Property Rental Management", - "调动工作", - "远光软件股份有限公司", - "市内交通费", - "交通工具等级标准", - "Operator", - "第八条支出报销申请", - "Directly-Controlled Municipalities And Special Administrative Regions", - "出差规定", - "业务招待费", - "Senior Managers", - "逐级审批规则", - "Company Business Travel System", - "广告宣传费", - "Transportation Cost Reimbursement", - "财务", - "第一章总则", - "材料采购", - "人力资源服务部", - "证券与法律事务部", - "Transportation Level Standards", - "归口管理部门", - "商旅客服", - "第四章重点支出管理规定", - "出差审批程序", - "Business Trip Approval", - "西藏", - "附表2:岗位支出报销审批权限表", - "第十八条", - "第二十四条", - "Company Hotel Accommodation Limit Standards", - "办法", - "DAP研发中心", - "新增规定内容", - "基本补助", - "Travel Allowance", - "异地挂职锻炼补贴标准", - "部门负责人", - "Provincial Capitals", - "特区", - "Transportation Tickets", - "第三章支出报销申请与审批", - "品牌及市场运营中心", - "分包外包(外部单位)", - "探亲路费", - "President", - "凭据报销", - "基本出差补贴", - "Taxi Usage Regulations", - "Government Fees", - "Commercial Travel System", - "远光制度〔2024〕14号", - "审批权限变化情况", - "基建工程", - "支出报销申请与审批", - "中国外汇交易中心参考汇率", - "Department Manager", - "支出报销审批", - "预算调整决策程序", - "公司1号文", - "External Conference Accommodation", - "厉行节约", - "Commercial Insurance", - "公司", - "第三条管理原则", - "捐赠申请", - "分类控制", - "业务宣传费", - "产业投资部", - "公司员工探亲管理办法", - "Subsequent Approver", - "100000 Yuan Approval Limit", - "Tax Authority Recognized Invoice", - "国家电网公司", - "业务佐证材料", - "第六条经办部门(个人)主要职责", - "结算起点", - "第十条支出成本中心归属", - "母公司" - ], - "count": 258, - "create_time": 1779012093, - "update_time": 1779012093, - "_id": "2c1cb358f08d44ceb0e4d287133206ec" - } +{ + "2c1cb358f08d44ceb0e4d287133206ec": { + "entity_names": [ + "工会委员会", + "Business Original Documents", + "First Approver", + "P8", + "一级部门总经理", + "组织人事部", + "业务原始凭据", + "营销中心", + "保证金", + "投标保证金", + "餐补", + "第十四条业务招待费", + "Chief Engineer", + "业务招待", + "Employee Welfare", + "经济舱", + "2024年4月17日", + "三等舱", + "财务信息化系统", + "分管领导", + "重点支出管理规定", + "备用金借款", + "Financial Review", + "第五章附则", + "Company Leadership", + "第十九条", + "经办人", + "预算内支出", + "Current Account Payment", + "Business Entertainment", + "Tax Control System Details", + "第二十一条", + "成本中心归属", + "岗位支出报销审批权限表", + "工会经费管理办法", + "商旅系统", + "Special Subsidy", + "中国银行外汇折算价", + "因公借款", + "资产采购", + "广告费", + "First-Level Department General Manager", + "正式员工", + "一万元", + "公司员工教育培训管理办法", + "责任原则", + "第二章职责分工", + "预算先行", + "Planning and Finance Department", + "Accommodation Cost Reimbursement", + "Official Vehicle Subsidy", + "第四条归口管理部门主要职责", + "Personal Service Compensation", + "邮递费", + "附表3:支出归口管理部门与归口业务范围", + "员工", + "第二条目的", + "Director", + "支出归口管理部门与归口业务范围", + "其他支出(员工)", + "报销标准", + "5000000 Yuan Approval Limit", + "第十一条备用金借款", + "会议费", + "第十七条", + "第七条各级管理人员主要职责", + "50000 Yuan Approval Limit", + "全资子公司", + "涉外业务汇率标准", + "总监", + "第十三条差旅费", + "审批权限表", + "商旅订票规范", + "Final Approval Position", + "报销资格", + "新增报销规定", + "公司支出管理办法", + "Institution General Manager", + "房屋租金", + "Staff Activities", + "分包外包(内部单位)", + "报销申请时限", + "Financial Information System", + "Expenditure Authorization Approval Scope", + "直辖市", + "培训费", + "第十二条市内交通费", + "第十五条", + "终审岗", + "Remote Work Housing", + "Centralized Management department", + "第二十条", + "办公室(党委办公室)", + "Three Flows Consistency Principle", + "审批权限", + "VAT Special Invoice", + "后勤服务部", + "员工支出报销审批权限表", + "公司总裁", + "出差补贴", + "Basic Level Managers", + "预付款项", + "附表1:员工支出报销审批权限表", + "经办部门", + "信息管理部", + "通信费", + "第十六条", + "增值税发票", + "财务入账条件", + "Hotel Accommodation Standards", + "审批流转程序", + "Self-Driving Travel Provisions", + "交通费", + "第九条支出报销审批", + "薪酬福利支出分配计划", + "产品规划设计部", + "因公用车补贴", + "Committee Chairpersons", + "Business Division General Manager", + "组织安排", + "1 Yuan Per Person Per Kilometer Reimbursement", + "Separation of Approval and Processing Principle", + "第五条计划财务部主要职责", + "200000 Yuan Approval Limit", + "公司各部门", + "第十四条", + "Other Areas", + "分支机构", + "Departments And Units", + "计划财务部", + "Other Employees", + "第二十三条", + "公司团建管理办法", + "火车硬席", + "税控系统明细清单", + "Trade Union Fund", + "报销标准变化情况", + "薪酬福利支出", + "Hong Kong, Macau, And Taiwan Region", + "对外捐赠支出", + "Multi-Level Approval Rule", + "Three Working Days Deadline", + "Employee Remuneration", + "销售退款", + "股权投资、兼并收购", + "控股子公司", + "取消报销规定", + "Procurement Management Regulations", + "Middle Managers", + "差旅费", + "批办分离", + "住宿费", + "Travel Allowance Standards", + "第二十三条本办法的归口与实施", + "Senior Vice President", + "供应商", + "人事归口管理部门", + "Management Personnel At All Levels", + "效益优先", + "Operating Department Individual", + "Remote Work Housing Rental Expenses", + "取消报销规定内容", + "Company", + "修订说明", + "国网数科公司", + "Vice President", + "分级授权", + "Expenditure Reimbursement Application", + "第二十四条附件", + "第二十二条", + "出租车", + "Night High-Speed Rail Provision", + "各级管理人员", + "受益原则", + "公司员工因公通讯费用实施细则", + "公司支出管理办法(2024)", + "出差补贴标准", + "Bid Security Deposit Approval Limits Table", + "第二条范围", + "Company Property Rental Management", + "调动工作", + "远光软件股份有限公司", + "市内交通费", + "交通工具等级标准", + "Operator", + "第八条支出报销申请", + "Directly-Controlled Municipalities And Special Administrative Regions", + "出差规定", + "业务招待费", + "Senior Managers", + "逐级审批规则", + "Company Business Travel System", + "广告宣传费", + "Transportation Cost Reimbursement", + "财务", + "第一章总则", + "材料采购", + "人力资源服务部", + "证券与法律事务部", + "Transportation Level Standards", + "归口管理部门", + "商旅客服", + "第四章重点支出管理规定", + "出差审批程序", + "Business Trip Approval", + "西藏", + "附表2:岗位支出报销审批权限表", + "第十八条", + "第二十四条", + "Company Hotel Accommodation Limit Standards", + "办法", + "DAP研发中心", + "新增规定内容", + "基本补助", + "Travel Allowance", + "异地挂职锻炼补贴标准", + "部门负责人", + "Provincial Capitals", + "特区", + "Transportation Tickets", + "第三章支出报销申请与审批", + "品牌及市场运营中心", + "分包外包(外部单位)", + "探亲路费", + "President", + "凭据报销", + "基本出差补贴", + "Taxi Usage Regulations", + "Government Fees", + "Commercial Travel System", + "远光制度〔2024〕14号", + "审批权限变化情况", + "基建工程", + "支出报销申请与审批", + "中国外汇交易中心参考汇率", + "Department Manager", + "支出报销审批", + "预算调整决策程序", + "公司1号文", + "External Conference Accommodation", + "厉行节约", + "Commercial Insurance", + "公司", + "第三条管理原则", + "捐赠申请", + "分类控制", + "业务宣传费", + "产业投资部", + "公司员工探亲管理办法", + "Subsequent Approver", + "100000 Yuan Approval Limit", + "Tax Authority Recognized Invoice", + "国家电网公司", + "业务佐证材料", + "第六条经办部门(个人)主要职责", + "结算起点", + "第十条支出成本中心归属", + "母公司" + ], + "count": 258, + "create_time": 1779012093, + "update_time": 1779012093, + "_id": "2c1cb358f08d44ceb0e4d287133206ec" + }, + "a8f8465df08e455ebe133351721d49f8": { + "entity_names": [ + "User Menu", + "Logout", + "行政秘书", + "配色方案", + "Q1 Quarterly Business Progress Report", + "补充上传按钮", + "AI", + "侧边栏", + "凭证识别", + "预审按钮", + "标题栏", + "Sidebar", + "Mini Program Code", + "Smart Platform Jiangsu Province Company Operations Support", + "Pre-Review Result Display", + "扫码上传", + "出差", + "影子ERP", + "Preset Assistant Cards", + "Trip Time Check", + "合规性检查", + "Airport Bus Ticket Check", + "Train Ticket Compliance Check", + "总裁办", + "ERP系统", + "Initiate Matter", + "Procurement Specialist", + "Submit Reimbursement", + "商旅附件", + "Title Bar", + "Web端", + "用户菜单", + "Time Track", + "2026 National AI Technology Summit in Hefei", + "Taxi Invoice Check", + "Activity Bar", + "Pre-Review Problem Summary", + "Matter List", + "Global Chat Bar", + "Problem Items", + "状态栏", + "Personal Center", + "Flight Ticket Compliance Check", + "UI Layout", + "飞机票行程单", + "Ashy有限公司", + "User Center Module", + "正文", + "Go Reimburse Button", + "Menu 2", + "Normal Items", + "住宿发票及流水", + "Business Travel", + "报销流程", + "火车票", + "活动栏", + "Invoice Title Check", + "采购专员", + "线下自付", + "火车票超标", + "Document Upload", + "Submission Confirmation Prompt", + "功能需求", + "零报销", + "User Message", + "AI Assistant", + "ERP", + "无单报销", + "底部对话栏", + "审核点", + "Submission Result Prompt", + "Document Recognition", + "即效合规", + "Main Content Area", + "费控专责", + "完整性检查", + "User Center", + "Cost Control Specialist", + "AI Reply", + "公共交通发票及行程单", + "Summon Panel", + "Receipt-Free Reimbursement", + "Status Bar", + "Hotel Booking Compliance Check", + "Warning Icon", + "Finance BP", + "菜单1", + "Taxi Trip Time Compliance Check", + "大型企业", + "AI预审", + "凭证处理流程", + "Expense Reimbursement Submission Process", + "Role Prompt Templates", + "Pre-Review Pass Notification", + "AI Assistant Module", + "用户中心", + "Supplementary Upload Button", + "问题项目标识", + "Subway Invoice Check", + "业务人员", + "Role Configuration Pop-up Window", + "AI Pre-Review", + "出租车发票及行程单", + "无单报销工具", + "财务BP", + "飞机票超标", + "Bottom Dialog Bar", + "商旅预订", + "凭证缩略图", + "Administrative Secretary", + "问题标注" + ], + "count": 111, + "create_time": 1779379018, + "update_time": 1779379018, + "_id": "a8f8465df08e455ebe133351721d49f8" + } } \ No newline at end of file diff --git a/server/storage/knowledge/.lightrag/x_financial_knowledge/kv_store_full_relations.json b/server/storage/knowledge/.lightrag/x_financial_knowledge/kv_store_full_relations.json index 6d1a2ff..03abac9 100644 --- a/server/storage/knowledge/.lightrag/x_financial_knowledge/kv_store_full_relations.json +++ b/server/storage/knowledge/.lightrag/x_financial_knowledge/kv_store_full_relations.json @@ -1,166 +1,278 @@ -{ - "2c1cb358f08d44ceb0e4d287133206ec": { - "relation_pairs": [ - [ - "Departments And Units", - "Taxi Usage Regulations" - ], - [ - "取消报销规定内容", - "报销标准变化情况" - ], - [ - "业务招待费", - "第十四条" - ], - [ - "控股子公司", - "计划财务部" - ], - [ - "公司支出管理办法", - "工会委员会" - ], - [ - "第一章总则", - "第三条管理原则" - ], - [ - "广告宣传费", - "第十六条" - ], - [ - "Tax Control System Details", - "VAT Special Invoice" - ], - [ - "Expenditure Reimbursement Application", - "Tax Authority Recognized Invoice" - ], - [ - "远光制度〔2024〕14号", - "远光软件股份有限公司" - ], - [ - "Financial Review", - "Operator" - ], - [ - "Operating Department Individual", - "Procurement Management Regulations" - ], - [ - "会议费", - "第十五条" - ], - [ - "Company", - "Management Personnel At All Levels" - ], - [ - "公司", - "第十七条" - ], - [ - "公司", - "第十八条" - ], - [ - "Operator", - "Three Working Days Deadline" - ], - [ - "第十一条备用金借款", - "第四章重点支出管理规定" - ], - [ - "Expenditure Reimbursement Application", - "Operator" - ], - [ - "业务招待费", - "差旅费" - ], - [ - "公司", - "第二十一条" - ], - [ - "公司支出管理办法(2024)", - "远光软件股份有限公司" - ], - [ - "第四条归口管理部门主要职责", - "计划财务部" - ], - [ - "会议费", - "差旅费" - ], - [ - "Company", - "Operating Department Individual" - ], - [ - "商旅系统", - "差旅费" - ], - [ - "会议费", - "公司总裁" - ], - [ - "计划财务部", - "远光软件股份有限公司" - ], - [ - "公司", - "第十九条" - ], - [ - "公司", - "第二十条" - ], - [ - "Company", - "Planning and Finance Department" - ], - [ - "公司支出管理办法", - "营销中心" - ], - [ - "Business Original Documents", - "Operator" - ], - [ - "公司支出管理办法", - "办公室(党委办公室)" - ], - [ - "Departments And Units", - "Night High-Speed Rail Provision" - ], - [ - "Centralized Management department", - "Company" - ], - [ - "组织人事部", - "调动工作" - ], - [ - "报销标准变化情况", - "远光软件股份有限公司" - ], - [ - "第一章总则", - "远光软件股份有限公司" - ] - ], - "count": 39, - "create_time": 1779012093, - "update_time": 1779012093, - "_id": "2c1cb358f08d44ceb0e4d287133206ec" - } +{ + "2c1cb358f08d44ceb0e4d287133206ec": { + "relation_pairs": [ + [ + "Departments And Units", + "Taxi Usage Regulations" + ], + [ + "取消报销规定内容", + "报销标准变化情况" + ], + [ + "业务招待费", + "第十四条" + ], + [ + "控股子公司", + "计划财务部" + ], + [ + "公司支出管理办法", + "工会委员会" + ], + [ + "第一章总则", + "第三条管理原则" + ], + [ + "广告宣传费", + "第十六条" + ], + [ + "Tax Control System Details", + "VAT Special Invoice" + ], + [ + "Expenditure Reimbursement Application", + "Tax Authority Recognized Invoice" + ], + [ + "远光制度〔2024〕14号", + "远光软件股份有限公司" + ], + [ + "Financial Review", + "Operator" + ], + [ + "Operating Department Individual", + "Procurement Management Regulations" + ], + [ + "会议费", + "第十五条" + ], + [ + "Company", + "Management Personnel At All Levels" + ], + [ + "公司", + "第十七条" + ], + [ + "公司", + "第十八条" + ], + [ + "Operator", + "Three Working Days Deadline" + ], + [ + "第十一条备用金借款", + "第四章重点支出管理规定" + ], + [ + "Expenditure Reimbursement Application", + "Operator" + ], + [ + "业务招待费", + "差旅费" + ], + [ + "公司", + "第二十一条" + ], + [ + "公司支出管理办法(2024)", + "远光软件股份有限公司" + ], + [ + "第四条归口管理部门主要职责", + "计划财务部" + ], + [ + "会议费", + "差旅费" + ], + [ + "Company", + "Operating Department Individual" + ], + [ + "商旅系统", + "差旅费" + ], + [ + "会议费", + "公司总裁" + ], + [ + "计划财务部", + "远光软件股份有限公司" + ], + [ + "公司", + "第十九条" + ], + [ + "公司", + "第二十条" + ], + [ + "Company", + "Planning and Finance Department" + ], + [ + "公司支出管理办法", + "营销中心" + ], + [ + "Business Original Documents", + "Operator" + ], + [ + "公司支出管理办法", + "办公室(党委办公室)" + ], + [ + "Departments And Units", + "Night High-Speed Rail Provision" + ], + [ + "Centralized Management department", + "Company" + ], + [ + "组织人事部", + "调动工作" + ], + [ + "报销标准变化情况", + "远光软件股份有限公司" + ], + [ + "第一章总则", + "远光软件股份有限公司" + ] + ], + "count": 39, + "create_time": 1779012093, + "update_time": 1779012093, + "_id": "2c1cb358f08d44ceb0e4d287133206ec" + }, + "a8f8465df08e455ebe133351721d49f8": { + "relation_pairs": [ + [ + "AI预审", + "预审按钮" + ], + [ + "Menu 2", + "User Center" + ], + [ + "Pre-Review Result Display", + "Train Ticket Compliance Check" + ], + [ + "AI Assistant", + "Menu 2" + ], + [ + "AI预审", + "问题标注" + ], + [ + "业务人员", + "无单报销" + ], + [ + "状态栏", + "配色方案" + ], + [ + "Matter List", + "Smart Platform Jiangsu Province Company Operations Support" + ], + [ + "总裁办", + "无单报销" + ], + [ + "Document Upload", + "Receipt-Free Reimbursement" + ], + [ + "Flight Ticket Compliance Check", + "Pre-Review Result Display" + ], + [ + "Web端", + "无单报销" + ], + [ + "Receipt-Free Reimbursement", + "Submit Reimbursement" + ], + [ + "功能需求", + "配色方案" + ], + [ + "完整性检查", + "审核点" + ], + [ + "Receipt-Free Reimbursement", + "Time Track" + ], + [ + "合规性检查", + "审核点" + ], + [ + "ERP", + "无单报销" + ], + [ + "AI预审", + "完整性检查" + ], + [ + "Matter List", + "Q1 Quarterly Business Progress Report" + ], + [ + "Menu 2", + "Receipt-Free Reimbursement" + ], + [ + "AI预审", + "合规性检查" + ], + [ + "Matter List", + "Menu 2" + ], + [ + "2026 National AI Technology Summit in Hefei", + "Matter List" + ], + [ + "大型企业", + "无单报销" + ], + [ + "Initiate Matter", + "Receipt-Free Reimbursement" + ] + ], + "count": 26, + "create_time": 1779379018, + "update_time": 1779379018, + "_id": "a8f8465df08e455ebe133351721d49f8" + } } \ No newline at end of file diff --git a/server/storage/knowledge/.lightrag/x_financial_knowledge/kv_store_relation_chunks.json b/server/storage/knowledge/.lightrag/x_financial_knowledge/kv_store_relation_chunks.json index 9465773..1781878 100644 --- a/server/storage/knowledge/.lightrag/x_financial_knowledge/kv_store_relation_chunks.json +++ b/server/storage/knowledge/.lightrag/x_financial_knowledge/kv_store_relation_chunks.json @@ -1,353 +1,587 @@ -{ - "第一章总则远光软件股份有限公司": { - "chunk_ids": [ - "chunk-aa5435156b829944c173fa1d2d7a93d4" - ], - "count": 1, - "create_time": 1779012088, - "update_time": 1779012088, - "_id": "第一章总则远光软件股份有限公司" - }, - "第十一条备用金借款第四章重点支出管理规定": { - "chunk_ids": [ - "chunk-aa5435156b829944c173fa1d2d7a93d4" - ], - "count": 1, - "create_time": 1779012088, - "update_time": 1779012088, - "_id": "第十一条备用金借款第四章重点支出管理规定" - }, - "公司支出管理办法办公室(党委办公室)": { - "chunk_ids": [ - "chunk-afc57a0e9548d1f484da6df6c182676b" - ], - "count": 1, - "create_time": 1779012088, - "update_time": 1779012088, - "_id": "公司支出管理办法办公室(党委办公室)" - }, - "计划财务部远光软件股份有限公司": { - "chunk_ids": [ - "chunk-aa5435156b829944c173fa1d2d7a93d4" - ], - "count": 1, - "create_time": 1779012076, - "update_time": 1779012076, - "_id": "计划财务部远光软件股份有限公司" - }, - "第一章总则第三条管理原则": { - "chunk_ids": [ - "chunk-aa5435156b829944c173fa1d2d7a93d4" - ], - "count": 1, - "create_time": 1779012076, - "update_time": 1779012076, - "_id": "第一章总则第三条管理原则" - }, - "CompanyManagement Personnel At All Levels": { - "chunk_ids": [ - "chunk-74c01decac4a10cd40a491786743b0ee" - ], - "count": 1, - "create_time": 1779012076, - "update_time": 1779012076, - "_id": "CompanyManagement Personnel At All Levels" - }, - "Centralized Management departmentCompany": { - "chunk_ids": [ - "chunk-74c01decac4a10cd40a491786743b0ee" - ], - "count": 1, - "create_time": 1779012077, - "update_time": 1779012077, - "_id": "Centralized Management departmentCompany" - }, - "CompanyPlanning and Finance Department": { - "chunk_ids": [ - "chunk-74c01decac4a10cd40a491786743b0ee" - ], - "count": 1, - "create_time": 1779012077, - "update_time": 1779012077, - "_id": "CompanyPlanning and Finance Department" - }, - "CompanyOperating Department Individual": { - "chunk_ids": [ - "chunk-74c01decac4a10cd40a491786743b0ee" - ], - "count": 1, - "create_time": 1779012078, - "update_time": 1779012078, - "_id": "CompanyOperating Department Individual" - }, - "公司支出管理办法工会委员会": { - "chunk_ids": [ - "chunk-afc57a0e9548d1f484da6df6c182676b" - ], - "count": 1, - "create_time": 1779012079, - "update_time": 1779012079, - "_id": "公司支出管理办法工会委员会" - }, - "Expenditure Reimbursement ApplicationOperator": { - "chunk_ids": [ - "chunk-74c01decac4a10cd40a491786743b0ee" - ], - "count": 1, - "create_time": 1779012079, - "update_time": 1779012079, - "_id": "Expenditure Reimbursement ApplicationOperator" - }, - "公司支出管理办法营销中心": { - "chunk_ids": [ - "chunk-afc57a0e9548d1f484da6df6c182676b" - ], - "count": 1, - "create_time": 1779012079, - "update_time": 1779012079, - "_id": "公司支出管理办法营销中心" - }, - "第四条归口管理部门主要职责计划财务部": { - "chunk_ids": [ - "chunk-aa5435156b829944c173fa1d2d7a93d4" - ], - "count": 1, - "create_time": 1779012079, - "update_time": 1779012079, - "_id": "第四条归口管理部门主要职责计划财务部" - }, - "Tax Control System DetailsVAT Special Invoice": { - "chunk_ids": [ - "chunk-74c01decac4a10cd40a491786743b0ee" - ], - "count": 1, - "create_time": 1779012079, - "update_time": 1779012079, - "_id": "Tax Control System DetailsVAT Special Invoice" - }, - "Operating Department IndividualProcurement Management Regulations": { - "chunk_ids": [ - "chunk-74c01decac4a10cd40a491786743b0ee" - ], - "count": 1, - "create_time": 1779012081, - "update_time": 1779012081, - "_id": "Operating Department IndividualProcurement Management Regulations" - }, - "Business Original DocumentsOperator": { - "chunk_ids": [ - "chunk-74c01decac4a10cd40a491786743b0ee" - ], - "count": 1, - "create_time": 1779012094, - "update_time": 1779012094, - "_id": "Business Original DocumentsOperator" - }, - "Expenditure Reimbursement ApplicationTax Authority Recognized Invoice": { - "chunk_ids": [ - "chunk-74c01decac4a10cd40a491786743b0ee" - ], - "count": 1, - "create_time": 1779012094, - "update_time": 1779012094, - "_id": "Expenditure Reimbursement ApplicationTax Authority Recognized Invoice" - }, - "公司第十七条": { - "chunk_ids": [ - "chunk-e9438f69c9e221d9f0f00a05ad84eac6" - ], - "count": 1, - "create_time": 1779012094, - "update_time": 1779012094, - "_id": "公司第十七条" - }, - "OperatorThree Working Days Deadline": { - "chunk_ids": [ - "chunk-74c01decac4a10cd40a491786743b0ee" - ], - "count": 1, - "create_time": 1779012083, - "update_time": 1779012083, - "_id": "OperatorThree Working Days Deadline" - }, - "Departments And UnitsNight High-Speed Rail Provision": { - "chunk_ids": [ - "chunk-613d6dfd4c5e9c807229a3147f96b584" - ], - "count": 1, - "create_time": 1779012084, - "update_time": 1779012084, - "_id": "Departments And UnitsNight High-Speed Rail Provision" - }, - "公司第十八条": { - "chunk_ids": [ - "chunk-e9438f69c9e221d9f0f00a05ad84eac6" - ], - "count": 1, - "create_time": 1779012084, - "update_time": 1779012084, - "_id": "公司第十八条" - }, - "公司第十九条": { - "chunk_ids": [ - "chunk-e9438f69c9e221d9f0f00a05ad84eac6" - ], - "count": 1, - "create_time": 1779012084, - "update_time": 1779012084, - "_id": "公司第十九条" - }, - "报销标准变化情况远光软件股份有限公司": { - "chunk_ids": [ - "chunk-18d968b78afe916b419c1b5973421ebe" - ], - "count": 1, - "create_time": 1779012084, - "update_time": 1779012084, - "_id": "报销标准变化情况远光软件股份有限公司" - }, - "取消报销规定内容报销标准变化情况": { - "chunk_ids": [ - "chunk-18d968b78afe916b419c1b5973421ebe" - ], - "count": 1, - "create_time": 1779012085, - "update_time": 1779012085, - "_id": "取消报销规定内容报销标准变化情况" - }, - "Financial ReviewOperator": { - "chunk_ids": [ - "chunk-74c01decac4a10cd40a491786743b0ee" - ], - "count": 1, - "create_time": 1779012085, - "update_time": 1779012085, - "_id": "Financial ReviewOperator" - }, - "公司支出管理办法(2024)远光软件股份有限公司": { - "chunk_ids": [ - "chunk-dd87aa5bc62cc9587ecb4c26d35a5263" - ], - "count": 1, - "create_time": 1779012085, - "update_time": 1779012085, - "_id": "公司支出管理办法(2024)远光软件股份有限公司" - }, - "远光制度〔2024〕14号远光软件股份有限公司": { - "chunk_ids": [ - "chunk-dd87aa5bc62cc9587ecb4c26d35a5263" - ], - "count": 1, - "create_time": 1779012086, - "update_time": 1779012086, - "_id": "远光制度〔2024〕14号远光软件股份有限公司" - }, - "Departments And UnitsTaxi Usage Regulations": { - "chunk_ids": [ - "chunk-613d6dfd4c5e9c807229a3147f96b584" - ], - "count": 1, - "create_time": 1779012099, - "update_time": 1779012099, - "_id": "Departments And UnitsTaxi Usage Regulations" - }, - "控股子公司计划财务部": { - "chunk_ids": [ - "chunk-dd87aa5bc62cc9587ecb4c26d35a5263" - ], - "count": 1, - "create_time": 1779012099, - "update_time": 1779012099, - "_id": "控股子公司计划财务部" - }, - "公司第二十条": { - "chunk_ids": [ - "chunk-e9438f69c9e221d9f0f00a05ad84eac6" - ], - "count": 1, - "create_time": 1779012086, - "update_time": 1779012086, - "_id": "公司第二十条" - }, - "商旅系统差旅费": { - "chunk_ids": [ - "chunk-d26b288ed4001dc5c504dce0eb841362" - ], - "count": 1, - "create_time": 1779012086, - "update_time": 1779012086, - "_id": "商旅系统差旅费" - }, - "业务招待费差旅费": { - "chunk_ids": [ - "chunk-d26b288ed4001dc5c504dce0eb841362" - ], - "count": 1, - "create_time": 1779012089, - "update_time": 1779012089, - "_id": "业务招待费差旅费" - }, - "公司第二十一条": { - "chunk_ids": [ - "chunk-e9438f69c9e221d9f0f00a05ad84eac6" - ], - "count": 1, - "create_time": 1779012089, - "update_time": 1779012089, - "_id": "公司第二十一条" - }, - "广告宣传费第十六条": { - "chunk_ids": [ - "chunk-d26b288ed4001dc5c504dce0eb841362" - ], - "count": 1, - "create_time": 1779012089, - "update_time": 1779012089, - "_id": "广告宣传费第十六条" - }, - "组织人事部调动工作": { - "chunk_ids": [ - "chunk-d26b288ed4001dc5c504dce0eb841362" - ], - "count": 1, - "create_time": 1779012090, - "update_time": 1779012090, - "_id": "组织人事部调动工作" - }, - "会议费差旅费": { - "chunk_ids": [ - "chunk-d26b288ed4001dc5c504dce0eb841362" - ], - "count": 1, - "create_time": 1779012092, - "update_time": 1779012092, - "_id": "会议费差旅费" - }, - "业务招待费第十四条": { - "chunk_ids": [ - "chunk-d26b288ed4001dc5c504dce0eb841362" - ], - "count": 1, - "create_time": 1779012092, - "update_time": 1779012092, - "_id": "业务招待费第十四条" - }, - "会议费第十五条": { - "chunk_ids": [ - "chunk-d26b288ed4001dc5c504dce0eb841362" - ], - "count": 1, - "create_time": 1779012092, - "update_time": 1779012092, - "_id": "会议费第十五条" - }, - "会议费公司总裁": { - "chunk_ids": [ - "chunk-d26b288ed4001dc5c504dce0eb841362" - ], - "count": 1, - "create_time": 1779012093, - "update_time": 1779012093, - "_id": "会议费公司总裁" - } +{ + "第一章总则远光软件股份有限公司": { + "chunk_ids": [ + "chunk-aa5435156b829944c173fa1d2d7a93d4" + ], + "count": 1, + "create_time": 1779012088, + "update_time": 1779012088, + "_id": "第一章总则远光软件股份有限公司" + }, + "第十一条备用金借款第四章重点支出管理规定": { + "chunk_ids": [ + "chunk-aa5435156b829944c173fa1d2d7a93d4" + ], + "count": 1, + "create_time": 1779012088, + "update_time": 1779012088, + "_id": "第十一条备用金借款第四章重点支出管理规定" + }, + "公司支出管理办法办公室(党委办公室)": { + "chunk_ids": [ + "chunk-afc57a0e9548d1f484da6df6c182676b" + ], + "count": 1, + "create_time": 1779012088, + "update_time": 1779012088, + "_id": "公司支出管理办法办公室(党委办公室)" + }, + "计划财务部远光软件股份有限公司": { + "chunk_ids": [ + "chunk-aa5435156b829944c173fa1d2d7a93d4" + ], + "count": 1, + "create_time": 1779012076, + "update_time": 1779012076, + "_id": "计划财务部远光软件股份有限公司" + }, + "第一章总则第三条管理原则": { + "chunk_ids": [ + "chunk-aa5435156b829944c173fa1d2d7a93d4" + ], + "count": 1, + "create_time": 1779012076, + "update_time": 1779012076, + "_id": "第一章总则第三条管理原则" + }, + "CompanyManagement Personnel At All Levels": { + "chunk_ids": [ + "chunk-74c01decac4a10cd40a491786743b0ee" + ], + "count": 1, + "create_time": 1779012076, + "update_time": 1779012076, + "_id": "CompanyManagement Personnel At All Levels" + }, + "Centralized Management departmentCompany": { + "chunk_ids": [ + "chunk-74c01decac4a10cd40a491786743b0ee" + ], + "count": 1, + "create_time": 1779012077, + "update_time": 1779012077, + "_id": "Centralized Management departmentCompany" + }, + "CompanyPlanning and Finance Department": { + "chunk_ids": [ + "chunk-74c01decac4a10cd40a491786743b0ee" + ], + "count": 1, + "create_time": 1779012077, + "update_time": 1779012077, + "_id": "CompanyPlanning and Finance Department" + }, + "CompanyOperating Department Individual": { + "chunk_ids": [ + "chunk-74c01decac4a10cd40a491786743b0ee" + ], + "count": 1, + "create_time": 1779012078, + "update_time": 1779012078, + "_id": "CompanyOperating Department Individual" + }, + "公司支出管理办法工会委员会": { + "chunk_ids": [ + "chunk-afc57a0e9548d1f484da6df6c182676b" + ], + "count": 1, + "create_time": 1779012079, + "update_time": 1779012079, + "_id": "公司支出管理办法工会委员会" + }, + "Expenditure Reimbursement ApplicationOperator": { + "chunk_ids": [ + "chunk-74c01decac4a10cd40a491786743b0ee" + ], + "count": 1, + "create_time": 1779012079, + "update_time": 1779012079, + "_id": "Expenditure Reimbursement ApplicationOperator" + }, + "公司支出管理办法营销中心": { + "chunk_ids": [ + "chunk-afc57a0e9548d1f484da6df6c182676b" + ], + "count": 1, + "create_time": 1779012079, + "update_time": 1779012079, + "_id": "公司支出管理办法营销中心" + }, + "第四条归口管理部门主要职责计划财务部": { + "chunk_ids": [ + "chunk-aa5435156b829944c173fa1d2d7a93d4" + ], + "count": 1, + "create_time": 1779012079, + "update_time": 1779012079, + "_id": "第四条归口管理部门主要职责计划财务部" + }, + "Tax Control System DetailsVAT Special Invoice": { + "chunk_ids": [ + "chunk-74c01decac4a10cd40a491786743b0ee" + ], + "count": 1, + "create_time": 1779012079, + "update_time": 1779012079, + "_id": "Tax Control System DetailsVAT Special Invoice" + }, + "Operating Department IndividualProcurement Management Regulations": { + "chunk_ids": [ + "chunk-74c01decac4a10cd40a491786743b0ee" + ], + "count": 1, + "create_time": 1779012081, + "update_time": 1779012081, + "_id": "Operating Department IndividualProcurement Management Regulations" + }, + "Business Original DocumentsOperator": { + "chunk_ids": [ + "chunk-74c01decac4a10cd40a491786743b0ee" + ], + "count": 1, + "create_time": 1779012094, + "update_time": 1779012094, + "_id": "Business Original DocumentsOperator" + }, + "Expenditure Reimbursement ApplicationTax Authority Recognized Invoice": { + "chunk_ids": [ + "chunk-74c01decac4a10cd40a491786743b0ee" + ], + "count": 1, + "create_time": 1779012094, + "update_time": 1779012094, + "_id": "Expenditure Reimbursement ApplicationTax Authority Recognized Invoice" + }, + "公司第十七条": { + "chunk_ids": [ + "chunk-e9438f69c9e221d9f0f00a05ad84eac6" + ], + "count": 1, + "create_time": 1779012094, + "update_time": 1779012094, + "_id": "公司第十七条" + }, + "OperatorThree Working Days Deadline": { + "chunk_ids": [ + "chunk-74c01decac4a10cd40a491786743b0ee" + ], + "count": 1, + "create_time": 1779012083, + "update_time": 1779012083, + "_id": "OperatorThree Working Days Deadline" + }, + "Departments And UnitsNight High-Speed Rail Provision": { + "chunk_ids": [ + "chunk-613d6dfd4c5e9c807229a3147f96b584" + ], + "count": 1, + "create_time": 1779012084, + "update_time": 1779012084, + "_id": "Departments And UnitsNight High-Speed Rail Provision" + }, + "公司第十八条": { + "chunk_ids": [ + "chunk-e9438f69c9e221d9f0f00a05ad84eac6" + ], + "count": 1, + "create_time": 1779012084, + "update_time": 1779012084, + "_id": "公司第十八条" + }, + "公司第十九条": { + "chunk_ids": [ + "chunk-e9438f69c9e221d9f0f00a05ad84eac6" + ], + "count": 1, + "create_time": 1779012084, + "update_time": 1779012084, + "_id": "公司第十九条" + }, + "报销标准变化情况远光软件股份有限公司": { + "chunk_ids": [ + "chunk-18d968b78afe916b419c1b5973421ebe" + ], + "count": 1, + "create_time": 1779012084, + "update_time": 1779012084, + "_id": "报销标准变化情况远光软件股份有限公司" + }, + "取消报销规定内容报销标准变化情况": { + "chunk_ids": [ + "chunk-18d968b78afe916b419c1b5973421ebe" + ], + "count": 1, + "create_time": 1779012085, + "update_time": 1779012085, + "_id": "取消报销规定内容报销标准变化情况" + }, + "Financial ReviewOperator": { + "chunk_ids": [ + "chunk-74c01decac4a10cd40a491786743b0ee" + ], + "count": 1, + "create_time": 1779012085, + "update_time": 1779012085, + "_id": "Financial ReviewOperator" + }, + "公司支出管理办法(2024)远光软件股份有限公司": { + "chunk_ids": [ + "chunk-dd87aa5bc62cc9587ecb4c26d35a5263" + ], + "count": 1, + "create_time": 1779012085, + "update_time": 1779012085, + "_id": "公司支出管理办法(2024)远光软件股份有限公司" + }, + "远光制度〔2024〕14号远光软件股份有限公司": { + "chunk_ids": [ + "chunk-dd87aa5bc62cc9587ecb4c26d35a5263" + ], + "count": 1, + "create_time": 1779012086, + "update_time": 1779012086, + "_id": "远光制度〔2024〕14号远光软件股份有限公司" + }, + "Departments And UnitsTaxi Usage Regulations": { + "chunk_ids": [ + "chunk-613d6dfd4c5e9c807229a3147f96b584" + ], + "count": 1, + "create_time": 1779012099, + "update_time": 1779012099, + "_id": "Departments And UnitsTaxi Usage Regulations" + }, + "控股子公司计划财务部": { + "chunk_ids": [ + "chunk-dd87aa5bc62cc9587ecb4c26d35a5263" + ], + "count": 1, + "create_time": 1779012099, + "update_time": 1779012099, + "_id": "控股子公司计划财务部" + }, + "公司第二十条": { + "chunk_ids": [ + "chunk-e9438f69c9e221d9f0f00a05ad84eac6" + ], + "count": 1, + "create_time": 1779012086, + "update_time": 1779012086, + "_id": "公司第二十条" + }, + "商旅系统差旅费": { + "chunk_ids": [ + "chunk-d26b288ed4001dc5c504dce0eb841362" + ], + "count": 1, + "create_time": 1779012086, + "update_time": 1779012086, + "_id": "商旅系统差旅费" + }, + "业务招待费差旅费": { + "chunk_ids": [ + "chunk-d26b288ed4001dc5c504dce0eb841362" + ], + "count": 1, + "create_time": 1779012089, + "update_time": 1779012089, + "_id": "业务招待费差旅费" + }, + "公司第二十一条": { + "chunk_ids": [ + "chunk-e9438f69c9e221d9f0f00a05ad84eac6" + ], + "count": 1, + "create_time": 1779012089, + "update_time": 1779012089, + "_id": "公司第二十一条" + }, + "广告宣传费第十六条": { + "chunk_ids": [ + "chunk-d26b288ed4001dc5c504dce0eb841362" + ], + "count": 1, + "create_time": 1779012089, + "update_time": 1779012089, + "_id": "广告宣传费第十六条" + }, + "组织人事部调动工作": { + "chunk_ids": [ + "chunk-d26b288ed4001dc5c504dce0eb841362" + ], + "count": 1, + "create_time": 1779012090, + "update_time": 1779012090, + "_id": "组织人事部调动工作" + }, + "会议费差旅费": { + "chunk_ids": [ + "chunk-d26b288ed4001dc5c504dce0eb841362" + ], + "count": 1, + "create_time": 1779012092, + "update_time": 1779012092, + "_id": "会议费差旅费" + }, + "业务招待费第十四条": { + "chunk_ids": [ + "chunk-d26b288ed4001dc5c504dce0eb841362" + ], + "count": 1, + "create_time": 1779012092, + "update_time": 1779012092, + "_id": "业务招待费第十四条" + }, + "会议费第十五条": { + "chunk_ids": [ + "chunk-d26b288ed4001dc5c504dce0eb841362" + ], + "count": 1, + "create_time": 1779012092, + "update_time": 1779012092, + "_id": "会议费第十五条" + }, + "会议费公司总裁": { + "chunk_ids": [ + "chunk-d26b288ed4001dc5c504dce0eb841362" + ], + "count": 1, + "create_time": 1779012093, + "update_time": 1779012093, + "_id": "会议费公司总裁" + }, + "总裁办无单报销": { + "chunk_ids": [ + "chunk-07de6ea74f60535b689f977295770273" + ], + "count": 1, + "create_time": 1779379014, + "update_time": 1779379014, + "_id": "总裁办无单报销" + }, + "AI预审完整性检查": { + "chunk_ids": [ + "chunk-1746bd83138e85e66a78e0cb9ad79272" + ], + "count": 1, + "create_time": 1779379014, + "update_time": 1779379014, + "_id": "AI预审完整性检查" + }, + "AI预审合规性检查": { + "chunk_ids": [ + "chunk-1746bd83138e85e66a78e0cb9ad79272" + ], + "count": 1, + "create_time": 1779379015, + "update_time": 1779379015, + "_id": "AI预审合规性检查" + }, + "Web端无单报销": { + "chunk_ids": [ + "chunk-07de6ea74f60535b689f977295770273" + ], + "count": 1, + "create_time": 1779379015, + "update_time": 1779379015, + "_id": "Web端无单报销" + }, + "完整性检查审核点": { + "chunk_ids": [ + "chunk-1746bd83138e85e66a78e0cb9ad79272" + ], + "count": 1, + "create_time": 1779379015, + "update_time": 1779379015, + "_id": "完整性检查审核点" + }, + "AI预审问题标注": { + "chunk_ids": [ + "chunk-1746bd83138e85e66a78e0cb9ad79272" + ], + "count": 1, + "create_time": 1779379015, + "update_time": 1779379015, + "_id": "AI预审问题标注" + }, + "合规性检查审核点": { + "chunk_ids": [ + "chunk-1746bd83138e85e66a78e0cb9ad79272" + ], + "count": 1, + "create_time": 1779379015, + "update_time": 1779379015, + "_id": "合规性检查审核点" + }, + "Pre-Review Result DisplayTrain Ticket Compliance Check": { + "chunk_ids": [ + "chunk-ce44e4483e4119265b43eacb72e0326a" + ], + "count": 1, + "create_time": 1779379015, + "update_time": 1779379015, + "_id": "Pre-Review Result DisplayTrain Ticket Compliance Check" + }, + "大型企业无单报销": { + "chunk_ids": [ + "chunk-07de6ea74f60535b689f977295770273" + ], + "count": 1, + "create_time": 1779379015, + "update_time": 1779379015, + "_id": "大型企业无单报销" + }, + "AI预审预审按钮": { + "chunk_ids": [ + "chunk-1746bd83138e85e66a78e0cb9ad79272" + ], + "count": 1, + "create_time": 1779379015, + "update_time": 1779379015, + "_id": "AI预审预审按钮" + }, + "状态栏配色方案": { + "chunk_ids": [ + "chunk-2224d777c0b72d0b2dab622c79096c2c" + ], + "count": 1, + "create_time": 1779379015, + "update_time": 1779379015, + "_id": "状态栏配色方案" + }, + "Flight Ticket Compliance CheckPre-Review Result Display": { + "chunk_ids": [ + "chunk-ce44e4483e4119265b43eacb72e0326a" + ], + "count": 1, + "create_time": 1779379015, + "update_time": 1779379015, + "_id": "Flight Ticket Compliance CheckPre-Review Result Display" + }, + "Matter ListMenu 2": { + "chunk_ids": [ + "chunk-99c6f377dff2b9a37a7214b7b05ea9a8" + ], + "count": 1, + "create_time": 1779379015, + "update_time": 1779379015, + "_id": "Matter ListMenu 2" + }, + "业务人员无单报销": { + "chunk_ids": [ + "chunk-07de6ea74f60535b689f977295770273" + ], + "count": 1, + "create_time": 1779379015, + "update_time": 1779379015, + "_id": "业务人员无单报销" + }, + "Menu 2Receipt-Free Reimbursement": { + "chunk_ids": [ + "chunk-99c6f377dff2b9a37a7214b7b05ea9a8" + ], + "count": 1, + "create_time": 1779379016, + "update_time": 1779379016, + "_id": "Menu 2Receipt-Free Reimbursement" + }, + "ERP无单报销": { + "chunk_ids": [ + "chunk-07de6ea74f60535b689f977295770273" + ], + "count": 1, + "create_time": 1779379016, + "update_time": 1779379016, + "_id": "ERP无单报销" + }, + "功能需求配色方案": { + "chunk_ids": [ + "chunk-2224d777c0b72d0b2dab622c79096c2c" + ], + "count": 1, + "create_time": 1779379016, + "update_time": 1779379016, + "_id": "功能需求配色方案" + }, + "Initiate MatterReceipt-Free Reimbursement": { + "chunk_ids": [ + "chunk-99c6f377dff2b9a37a7214b7b05ea9a8" + ], + "count": 1, + "create_time": 1779379016, + "update_time": 1779379016, + "_id": "Initiate MatterReceipt-Free Reimbursement" + }, + "AI AssistantMenu 2": { + "chunk_ids": [ + "chunk-99c6f377dff2b9a37a7214b7b05ea9a8" + ], + "count": 1, + "create_time": 1779379016, + "update_time": 1779379016, + "_id": "AI AssistantMenu 2" + }, + "Matter ListQ1 Quarterly Business Progress Report": { + "chunk_ids": [ + "chunk-99c6f377dff2b9a37a7214b7b05ea9a8" + ], + "count": 1, + "create_time": 1779379016, + "update_time": 1779379016, + "_id": "Matter ListQ1 Quarterly Business Progress Report" + }, + "Menu 2User Center": { + "chunk_ids": [ + "chunk-99c6f377dff2b9a37a7214b7b05ea9a8" + ], + "count": 1, + "create_time": 1779379016, + "update_time": 1779379016, + "_id": "Menu 2User Center" + }, + "2026 National AI Technology Summit in HefeiMatter List": { + "chunk_ids": [ + "chunk-99c6f377dff2b9a37a7214b7b05ea9a8" + ], + "count": 1, + "create_time": 1779379016, + "update_time": 1779379016, + "_id": "2026 National AI Technology Summit in HefeiMatter List" + }, + "Matter ListSmart Platform Jiangsu Province Company Operations Support": { + "chunk_ids": [ + "chunk-99c6f377dff2b9a37a7214b7b05ea9a8" + ], + "count": 1, + "create_time": 1779379017, + "update_time": 1779379017, + "_id": "Matter ListSmart Platform Jiangsu Province Company Operations Support" + }, + "Document UploadReceipt-Free Reimbursement": { + "chunk_ids": [ + "chunk-99c6f377dff2b9a37a7214b7b05ea9a8" + ], + "count": 1, + "create_time": 1779379017, + "update_time": 1779379017, + "_id": "Document UploadReceipt-Free Reimbursement" + }, + "Receipt-Free ReimbursementTime Track": { + "chunk_ids": [ + "chunk-99c6f377dff2b9a37a7214b7b05ea9a8" + ], + "count": 1, + "create_time": 1779379017, + "update_time": 1779379017, + "_id": "Receipt-Free ReimbursementTime Track" + }, + "Receipt-Free ReimbursementSubmit Reimbursement": { + "chunk_ids": [ + "chunk-99c6f377dff2b9a37a7214b7b05ea9a8" + ], + "count": 1, + "create_time": 1779379017, + "update_time": 1779379017, + "_id": "Receipt-Free ReimbursementSubmit Reimbursement" + } } \ No newline at end of file diff --git a/server/storage/knowledge/.lightrag/x_financial_knowledge/kv_store_text_chunks.json b/server/storage/knowledge/.lightrag/x_financial_knowledge/kv_store_text_chunks.json index f3bc5b1..dbcba52 100644 --- a/server/storage/knowledge/.lightrag/x_financial_knowledge/kv_store_text_chunks.json +++ b/server/storage/knowledge/.lightrag/x_financial_knowledge/kv_store_text_chunks.json @@ -1,112 +1,178 @@ -{ - "chunk-dd87aa5bc62cc9587ecb4c26d35a5263": { - "tokens": 1200, - "content": "商密【中】\n\n 远光软件股份有限公司文件\n\n 远光制度〔2024〕14 号\n\n关于颁布《公司支出管理办法(2024)》的\n 通知\n\n公司各部门、分支机构、子公司:\n 为适应公司业务发展需要,优化、完善支出和报销标准,规\n范支出业务审批和报销过程,防范经营风险,依据国家有关法\n律法规,参照国家电网公司和国网数科公司有关管理规定,结\n合市场经营环境和公司实际情况,在广泛征求意见的基础上,\n公司对《公司支出管理办法》进行了修订,现予颁布。本办法自\n颁布之日起施行,原办法同时废止。\n 特此通知。\n\n 附件:1.公司支出管理办法(2024)\n 2.修订说明\n\n 远光软件股份有限公司\n 2024 年 4 月 17 日\n\n远光软件股份有限公司 2024 年 4 月 17 日印发\n\n 第 1 页 共 20 页\n 商密【中】\n附件 1\n\n 公司支出管理办法(2024)\n 目录\n 第一章 总则.............................................................. 4\n\n 第一条 目的............................................................. 4\n\n 第二条 范围............................................................. 4\n\n 第三条 管理原则......................................................... 4\n\n 第二章 职责分工 .......................................................... 4\n\n 第四条 归口管理部门主要职责 ............................................. 4\n\n 第五条 计划财务部主要职责............................................... 5\n\n 第六条 经办部门(个人)主要职责 ......................................... 5\n\n 第七条 各级管理人员主要职责 ............................................. 5\n\n 第三章 支出报销申请与审批 ................................................ 6\n\n 第八条 支出报销申请..................................................... 6\n\n 第九条 支出报销审批..................................................... 7\n\n 第十条 支出成本中心归属................................................. 7\n\n 第四章 重点支出管理规定 .................................................. 7\n\n 第十一条 备用金借款....................................................... 7\n\n 第十二条 市内交通费....................................................... 8\n\n 第十三条 差旅费........................................................... 8\n\n 第十四条 业务招待费...................................................... 11\n\n 第十五条 会议费.......................................................... 11\n\n 第十六条 广告宣传费...................................................... 11\n\n 第十七条 培训费.......................................................... 12\n\n 第十八条 通信费.......................................................... 12\n\n 第 2 页 共 20 页\n 商密【中】\n 第十九条 邮递费.......................................................... 12\n\n 第二十条 薪酬福利支出.................................................... 12\n\n 第二十一条 对外捐赠支出 ................................................. 13\n\n 第二十二条 涉外业务汇率标准 ............................................. 13\n\n第五章 附则............................................................. 13\n\n 第二十三条 本办法的归口与实施 ........................................... 13\n\n 第二十四条 附件 ......................................................... 13\n\n 附表 1:员工支出报销审批权限表 ............................................ 14\n\n 附表 2:岗位支出报销审批权限表 ............................................ 15\n\n 附表 3:支出归口管理部门与归口业务范围 .................................... 18\n\n 第 3 页 共 20 页\n 商密【中】\n 第一章 总则\n\n第一条 目的\n\n 为适应远光软件股份有限公司(以下简称“公司”)业务发展需要,优化、完善\n\n支出和报销标准,规范支出业务审批和报销过程,防范经营风险,依据国家有关法律\n\n法规,参照国家电网公司和国网数科公司有关管理规定,结合市场经营环境和公司实\n\n际情况,在广泛征求意见的基础上,制定本办法。\n\n第二条 范围\n\n 本办法适用于公司各类成本费用和资本性支出。\n\n 本办法适用于全公司范围,包括:公司各部门、分支机构(非独立法人)、全资\n\n子公司。控股子公司应参照本办法制订支出管理办法,按子公司相关议事规则审批、\n\n报公司计划财务部备案后执行。\n\n第三条 管理原则\n\n 公司支出管理遵循“预算先行、厉行节约、效益优先,分级授权、分类控制、批\n\n办分离”的基本原则。\n\n 1 公司支出管理遵循预算先行的控制原则,应在预算目标范围内支出,并遵循\n\n 公司内控、预算、考核管理相关规定,预算外支出履行预算审批程序后执行。\n\n 2 各部门(分支机构)、各岗位应在部门(岗位)职责与授权业务范围内,秉\n\n 持厉行节约、效益优先原则,规范开展支出业务活动。\n\n 3 各级管理人员应根据其管理岗位,在公司支出授权审批范围和本人职责范\n\n 围内,履行支出审批职权,承担审批责任。岗位审批权限与职级待遇分离,\n\n 审", - "chunk_order_index": 0, - "full_doc_id": "2c1cb358f08d44ceb0e4d287133206ec", - "file_path": "/app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf", - "llm_cache_list": [], - "create_time": 1779011842, - "update_time": 1779011842, - "_id": "chunk-dd87aa5bc62cc9587ecb4c26d35a5263" - }, - "chunk-74c01decac4a10cd40a491786743b0ee": { - "tokens": 1200, - "content": "(分支机构)、各岗位应在部门(岗位)职责与授权业务范围内,秉\n\n 持厉行节约、效益优先原则,规范开展支出业务活动。\n\n 3 各级管理人员应根据其管理岗位,在公司支出授权审批范围和本人职责范\n\n 围内,履行支出审批职权,承担审批责任。岗位审批权限与职级待遇分离,\n\n 审批权限按管理岗位执行。\n\n 4 公司支出管理遵循批办分离的牵制原则,支出经办人和审批人不得为同一\n\n 人。\n\n 第二章 职责分工\n\n第四条 归口管理部门主要职责\n\n 公司实行支出归口管理,归口管理部门主要职责如下:\n\n 1 在遵循公司财务、采购、人资等相关制度规定的基础上,根据业务管理需要,\n\n 确定各项支出业务的开支范围、标准、方式和管理流程。\n\n 第 4 页 共 20 页\n 商密【中】\n 2 根据公司有关规定,对支出业务的合规性、预算(计划)执行控制情况等进\n\n 行检查、分析与监督。\n\n 支出归口管理部门与范围按“附表3”执行,部门职责变化时,相应调整归口分\n\n工。\n\n第五条 计划财务部主要职责\n\n 1 明确支出报销审批流程、审核要点和报销资料规范。\n\n 2 协助归口管理部门确定各项支出业务的开支范围和标准。\n\n 3 负责报销业务财务审核,对业务原始凭据的完整性、合规性进行审查,对报\n\n 销事项与业务原始凭据的业务关联性、内容一致性、金额准确性等进行复\n\n 核,可要求报销人提供不限于本办法规定的佐证资料。\n\n 4 办理报销业务的结算支付。\n\n 5 组织开展支出报销业务日常财务稽核与宣贯。\n\n第六条 经办部门(个人)主要职责\n\n 1 在部门(岗位)职责与授权业务范围内,秉持预算先行、厉行节约、效益优\n\n 先原则,规范开展支出业务活动。\n\n 2 业务经办过程中,应严格遵循开支范围和标准,切实履行业务流程与审批程\n\n 序,并遵循“发票、资金、物资”三流一致原则,及时取得真实、合规、关\n\n 联、完整的业务原始凭据,验证发票真伪。\n\n 3 各项物资(原材料、固定资产、无形资产、低值易耗品、办公用品)、服务、\n\n 外包分包业务的采购,应以经审核的需求计划(项目采购预算)为前提,并\n\n 严格遵循公司招标、采购与物资管理相关规定。\n\n 4 及时提交报销申请,履行报销审批流程,配合提供发票,以及不限于本办法\n\n 规定的业务佐证资料。\n\n 5 对支出业务的真实性、合规性、必要性、合理性以及业务原始凭据的真实性、\n\n 合规性、关联性、完整性,承担全部责任。\n\n第七条 各级管理人员主要职责\n\n 各级管理人员应在授权审批范围和职责范围内,履行支出报销审批职权,承担审\n\n批责任。\n\n 第 5 页 共 20 页\n 商密【中】\n 1 第一审批人:应对支出业务的真实性、合规性、必要性、合理性进行全面审\n\n 核,并承担审批责任。\n\n 2 后续审批人:应对支出业务的必要性、合理性进行审核,并承担审批责任。\n\n 第三章 支出报销申请与审批\n\n第八条 支出报销申请\n\n 1 申请方式\n\n 支出报销申请通过公司财务信息化系统实现(以下简称“系统单据”),财务原\n\n则上不接受“纸质申请单据”。\n\n (1)经办人应及时填写“系统单据”,并同步提交业务原始凭据。\n\n (2)除“员工薪酬、个人劳务报酬、出差补贴、专项补贴、往来款项支付”等支\n\n 出业务外,其他支出均需提交税务机关认可的票据。\n\n ① “工会经费、员工福利、职工活动、业务招待、车票、政府规费”以外的\n\n 支出,原则上均应取得增值税专用发票;应取得但未取得增值税专用发\n\n 票的,经办人应在“系统单据”中说明原因。\n\n ② 汇总开具的增值税发票,应附税控系统明细清单。\n\n (3)财务审核发现业务原始凭据不完整的,经办人应在三个工作日内补充并重新\n\n 提交至财务;经办人填单错误、业务原始凭据不合规,以及不能按时补充业\n\n 务原始凭据的,财务退单处理。", - "chunk_order_index": 1, - "full_doc_id": "2c1cb358f08d44ceb0e4d287133206ec", - "file_path": "/app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf", - "llm_cache_list": [], - "create_time": 1779011842, - "update_time": 1779011842, - "_id": "chunk-74c01decac4a10cd40a491786743b0ee" - }, - "chunk-061324cc36078214691a6fc1cd0aaeea": { - "tokens": 1200, - "content": "说明原因。\n\n ② 汇总开具的增值税发票,应附税控系统明细清单。\n\n (3)财务审核发现业务原始凭据不完整的,经办人应在三个工作日内补充并重新\n\n 提交至财务;经办人填单错误、业务原始凭据不合规,以及不能按时补充业\n\n 务原始凭据的,财务退单处理。\n\n 2 申请时限\n\n 支出报销申请时限指“业务完成日”至“附件影像资料挂接系统单据日”的期间。\n\n (1)公司各类支出报销结算申请时限为三个月。\n\n ① 逾期需说明原因,经分管领导审批后方可报销。\n\n ② 按自然月度计算并定期发生的费用支出,需月度结束后方可报销。\n\n ③ 差旅费原则上需在行程结束三个月内提交报销申请(连续出差超过一个\n\n 月时,原则上应按月报销),逾期不予报销出差补贴。\n\n (2)预付款项,原则上应在次月底前完成结算,不得长期挂账。\n\n 3 结算方式\n\n (1)员工支出业务:原则上采用“公对私”结算方式,报销申请审批通过后,公\n\n 第 6 页 共 20 页\n 商密【中】\n 司支付给经办人。\n\n (2)岗位支出业务:原则上采用“公对公”结算方式,报销申请审批通过后,公\n\n 司与供应商直接结算。结算起点(1000 元)以下、且确实无法与供应商直接\n\n 结算的小额支出,报销时应附向供应商付款凭据的截图佐证。\n\n第九条 支出报销审批\n\n 1 审批权限\n\n (1)预算内支出,按“附表 1、附表 2”执行。\n\n (2)预算外支出,经办部门提交预算调整申请,经公司总裁批准后,再按“附表\n\n 1、附表 2”执行。\n\n 2 审批时限\n\n 各级管理人员原则上应在待批单据流转至本岗位后三个工作日内完成审批。\n\n 3 财务审核时限\n\n (1)影像扫描:“系统单据和纸质原始凭据”流转至影像岗后,原则上应在一个\n\n 工作日内处理完毕。\n\n (2)审核与支付:已完成审批的系统单据,原则上应在三个工作日内处理完毕。\n\n第十条 支出成本中心归属\n\n 支出成本中心归属原则上基于责任原则与受益原则确定,特殊情况由相关业务\n\n部门协商确定。\n\n 第四章 重点支出管理规定\n\n第十一条 备用金借款\n\n 备用金是公司借支给正式员工,用于支付与公司经济业务相关的、必须预支且尚\n\n不具备报销条件的费用支出款项。\n\n 1 备用金借款必须是真实合法的经济业务,应遵循“前款不清、后款不借”的\n 原则,严禁以各种名义挪用公司资金。\n 2 非正式员工不得申请备用金借款。\n 3 备用金借款按季定期清理。季度不能及时报账核销的,借款人应向其分管领\n 导申请延期审批,但不得跨年。\n 4 员工备用金借款额度原则上不得超过一万元。\n\n 第 7 页 共 20 页\n 商密【中】\n第十二条 市内交通费\n 市内交通费是指员工为公司生产经营活动,在工作所在地发生的市内交通费用,\n包括工作时间内外出办理公事、夜间工作或非工作日发生的市内交通费用,不包括员\n工正常上下班所发生的交通费用、从居住地公出或公出结束返回居住地发生的市内\n交通费。\n 1 市内交通费凭据报销,应与工作实际相符,严禁报销与工作无关的交通费,\n 不接受充值预付费方式的交通费。\n 2 基于厉行节约原则,鼓励员工选择公交、地铁等公共交通出行。出租车仅限\n “紧急公务、接送客户、夜间工作至 22:00 后、以及其他确有需要的特别情\n 形”等事项的市内交通使用,由部门负责人从严管理。\n第十三条 差旅费\n 差旅费是指员工因公出差所发生的交通费、住宿费、出差补贴等。\n 各部门(单位)应严格执行出差审批程序,从严控制出差人数和出差天数,严禁\n无实质内容、无明确公务目的的差旅活动。部门副职及以下员工出差需通过公司商旅\n系统事前审批。\n 1 交通费\n 表1 交通工具等级标准\n 国内(含港澳台)、国外", - "chunk_order_index": 2, - "full_doc_id": "2c1cb358f08d44ceb0e4d287133206ec", - "file_path": "/app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf", - "llm_cache_list": [], - "create_time": 1779011842, - "update_time": 1779011842, - "_id": "chunk-061324cc36078214691a6fc1cd0aaeea" - }, - "chunk-613d6dfd4c5e9c807229a3147f96b584": { - "tokens": 1200, - "content": "费、住宿费、出差补贴等。\n 各部门(单位)应严格执行出差审批程序,从严控制出差人数和出差天数,严禁\n无实质内容、无明确公务目的的差旅活动。部门副职及以下员工出差需通过公司商旅\n系统事前审批。\n 1 交通费\n 表1 交通工具等级标准\n 国内(含港澳台)、国外\n 其他交通工具\n 员工职级\n 飞机 火车 轮船 (不含小汽\n 车)\n公司领导、高层经理、\n 中层经理 火车硬席(硬\n 经济舱 卧、硬座)、\n(P5 及以上、外聘专\n 家) 高铁/动车二\n 三等舱 凭据报销\n 等座,全列软\n基层经理、其他人员 经济舱 席列车二等软\n (P4 及以下) (注 3) 座\n\n 第 8 页 共 20 页\n 商密【中】\n 国内(含港澳台)、国外\n 其他交通工具\n 员工职级\n 飞机 火车 轮船 (不含小汽\n 车)\n注 1:交通工具选乘应遵循“性价比优先”原则。\n注 2:基层经理及以下人员(P4 及以下)乘坐飞机需事前报经部门负责人审批。基层经\n理(P4)应选乘 6 折及以下经济舱、其他人员(P1-P3)应选乘 5 折及以下经济舱。\n注 3:夜间乘坐高铁/动车 6 小时以上时,可选乘卧铺。\n注 4:出差人员应当严格执行交通工具等级标准,确因紧急公务、特别情形等事项导致\n交通工具超过规定标准时,超标 20%以内时由部门负责人审批,超标 20%以上时需分管\n领导审批。\n注 5:公司已为员工购买了商业保险(含交通险),出差期间发生的保险费不再报销。\n注 6:出租车仅限“紧急公务、接送客户、夜间工作至 22:00 后、以及其他确有需要的\n特别情形”等事项的市内交通使用,由部门负责人从严管理。往返机场、车站、港口,\n原则上应选择“公交车、轨道交通”。\n注 7:自驾车出差发生的路桥费、停车费、油费、电费等据实报销,由部门负责人从严\n管理。自驾发生事故或违章罚款等造成的损失,责任自负。\n 2 住宿费\n (1)酒店住宿\n\n 表2 酒店住宿限额标准\n\n 单位:人民币元\n 国内\n 员工职级 直辖市/特区/ 国外\n 省会城市 其他地区\n 港澳台\n 公司领导\n 500 450 400 800\n (P8及以上)\n 高层经理\n 450 400 350 700\n (P7)\n 中层经理、基层经理\n 400 350 300 600\n(P4~P6、外聘专家)\n\n 其他员工 350 300 250 500\n注1:出差人员应严格执行住宿限额标准,确因紧急公务、特别情形等事项导致住宿超\n过规定标准时,超标20%以内时由部门负责人审批,超标20%以上时需分管领导审批。\n注2:外出参加会议、培训,统一安排食宿的,会议期间的住宿费按外部会议组织方通\n知标准凭据报销。不统一安排食宿的,按照上表标准执行。\n\n (2)异地工作用房\n\n ① 因公长期出差人员申请异地工作用房的,按照《公司物业租赁管理办法》\n\n 第 9 页 共 20 页\n 商密【中】\n 执行。\n\n ② 异地工作用房产生的租金、房屋初始配置费、物业管理费、取暖费、水电\n\n 燃气支出(含公摊)、网络宽带费等费用,按照《公司物业租赁管理办法》确\n\n 定标准进行报销。\n\n 3 出差补贴\n\n 出差补贴按出差自然天数(日历天数)进行报销,具体标准如下:\n\n 表3 出差补贴标准\n\n 单位:人民币元/天\n\n 国内\n补助类型 项目 国外\n 港澳台 直辖市/特区/西藏 其他地区\n\n 餐补 自行解决餐食 75 65 55 140\n全额\n补助 基本\n 基本出差补贴 35 35 35 35\n 补助\n 合计 110 100 90 175\n注:因组织安排、销售、推广、调", - "chunk_order_index": 3, - "full_doc_id": "2c1cb358f08d44ceb0e4d287133206ec", - "file_path": "/app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf", - "llm_cache_list": [], - "create_time": 1779011842, - "update_time": 1779011842, - "_id": "chunk-613d6dfd4c5e9c807229a3147f96b584" - }, - "chunk-d26b288ed4001dc5c504dce0eb841362": { - "tokens": 1200, - "content": "直辖市/特区/西藏 其他地区\n\n 餐补 自行解决餐食 75 65 55 140\n全额\n补助 基本\n 基本出差补贴 35 35 35 35\n 补助\n 合计 110 100 90 175\n注:因组织安排、销售、推广、调研、培训、会议、研讨、借调等出差,主办方统一安排\n餐食的,不再报销餐补。\n 4 差旅费其他注意事项\n\n (1)因公发生的订票、签转、退票等费用凭据报销,由部门负责人审核确认。\n\n (2)出差记录链条中断时,应提供业务佐证材料:\n\n ① 登机牌、高速道路通行记录、其他道路通行记录、租车记录等。\n\n ② 支付记录。\n\n ③ 出差审批邮件、短信、微信等。\n\n (3)出差或调动工作期间,经部门负责人批准就近回家省亲办事的,其绕道交通\n\n 费,扣除出差直线单程交通费,多开支的部分由个人自理。绕道和在家期间\n\n 不得报销住宿费、出差补贴。\n\n (4)出差交通费原始凭据丢失的,提供情况说明和订单详情、支付截图等佐证材\n\n 料,可按票面价值的 75%报销,未提供的,不予报销。通过商旅订票未取得\n\n 火车票的,从差旅补贴或其他差旅杂费中扣减。\n\n (5)探亲路费应严格遵循《公司员工探亲管理办法》相关规定,不得以因公差旅\n\n 第 10 页 共 20 页\n 商密【中】\n 方式报销,不享受出差补贴。探亲路费原始凭据丢失的,不允许报销。\n\n (6)员工工作地调动时,所发生的行李、家具等邮寄费,在每人每公里 1 元以内\n\n 凭据报销,超过部分自理。\n\n (7)经组织安排到异地挂职锻炼、培养锻炼、人才帮扶、借调支援等工作人员,\n\n 在途期间的交通费、餐补和基本补助按出差规定执行;在异地单位工作期间,\n\n 不适用出差补贴标准规定,按照组织人事部确定的挂职人员报销标准执行;\n\n 所在单位不安排住宿的,住宿标准按公司酒店住宿限额标准执行。\n\n (8)境外出差(港澳台与国外出差)应单列预算、事前履行经费申请与审批程序。\n\n (9)以上涉及事前审批的事项,以公司商旅系统审批截图或审批邮件为报销必备\n\n 附件。\n\n(10)因公出差原则上应使用商旅系统统一预定,特殊情况未通过商旅系统下单\n\n的,应邮件知会商旅客服并抄送部门负责人。\n\n第十四条 业务招待费\n\n 业务招待费是指各级单位正常生产经营管理过程中需要发生的、用于必要招待\n\n的各项费用,包括用于接待客户和相关单位的餐饮等合理支出。未能“公对公”结算\n\n的,应附“向供应商付款凭据”佐证。\n\n第十五条 会议费\n\n 会议费是指公司主办或承办会议发生的会场租金、文件资料、设备租金等支出,\n\n以及参加外部会议所发生的会务相关支出。\n\n 1 公司主办或承办的会议\n\n (1)会议费中不得列支与会议无关的旅游观光、宴请、礼品馈赠等支出。\n\n (2)经费预算 30,000 元及以上(包括不在会议费列支,但与会议直接相关的培训\n\n 费、差旅费等全部支出)的公司内部会议、研讨与集中培训,需事前报请公\n\n 司总裁审批。\n\n (3)报销时应附:经审批的会议申请与预算、会议通知、参会人员签到表、会议\n\n 开支明细等业务佐证材料,会务费发票应附服务方费用明细清单。\n\n 2 参加外部会议的,报销时应附会议通知、参会回执等业务佐证材料。\n\n第十六条 广告宣传费\n\n 第 11 页 共 20 页\n 商密【中】\n 广告宣传费是指展示企业形象、宣传企业文化及营销活动中推广企业产品、业务\n\n所发生的支出,包括广告费和业务宣传费。\n\n 1 广告费\n\n 广告费指公司通过各种公开媒体宣传所发生的费用,报销时应附广告投放等业\n\n务佐证材料。\n\n 2 业务宣传费\n\n 业务宣传费是指公司自身开展宣传与营销活动所发生的费用,包括未通过媒体\n\n传播的广告性支出,以及发放的印有公司标志的礼品、纪念品等。业务宣传", - "chunk_order_index": 4, - "full_doc_id": "2c1cb358f08d44ceb0e4d287133206ec", - "file_path": "/app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf", - "llm_cache_list": [], - "create_time": 1779011842, - "update_time": 1779011842, - "_id": "chunk-d26b288ed4001dc5c504dce0eb841362" - }, - "chunk-e9438f69c9e221d9f0f00a05ad84eac6": { - "tokens": 1200, - "content": "费。\n\n 1 广告费\n\n 广告费指公司通过各种公开媒体宣传所发生的费用,报销时应附广告投放等业\n\n务佐证材料。\n\n 2 业务宣传费\n\n 业务宣传费是指公司自身开展宣传与营销活动所发生的费用,包括未通过媒体\n\n传播的广告性支出,以及发放的印有公司标志的礼品、纪念品等。业务宣传费报销时\n\n应附活动方案、费用预算等业务佐证材料,并需遵循公司采购与物资管理相关规定。\n\n第十七条 培训费\n\n 培训费是指公司安排、主办或承办培训发生的学费、书籍杂费、师资费、资料费、\n\n场地费、设备材料费、住宿费、交通费等,以及员工根据工作需要,经归口管理部门\n\n批准参加外部培训、考证、教育产生的相关费用。\n\n 1 报销资格按《公司员工教育培训管理办法》认定标准执行。\n\n 2 经归口管理部门认定符合办法标准的,培训期间的主要交通费(往返)、住\n\n 宿费按出差规定标准执行,其他费用自理。\n\n第十八条 通信费\n\n 通信费是指为满足公司日常办公需要发生的电话、传真、集团网、网络连接等支\n\n出,其中员工通讯费按《公司员工因公通讯费用实施细则》执行。\n\n第十九条 邮递费\n\n 邮递费是指公司因业务需要邮递物品而支付的费用,包括邮件费、托运费、快递\n\n费等,员工报销的应附快递底单,单位统一结算的应附寄件明细清单与支出分摊表。\n\n第二十条 薪酬福利支出\n\n 1 公司相关制度规定的职工薪资、奖励提成、福利费支出,按公司相关制度规\n\n 定执行。\n\n 2 临时的奖励及福利支出,需事先计划并报公司总裁审批,具体支出时由分管\n\n 领导根据已批准的计划审批。\n\n 3 职工福利费由组织人事部实行年度计划管理,对未纳入福利计划的福利项\n\n 第 12 页 共 20 页\n 商密【中】\n 目,不得列支和报销。\n\n 4 薪酬福利支出事前审批程序以组织人事部规定标准执行。\n\n 5 职工活动支出,按照《公司团建管理办法》或《工会经费管理办法》执行。\n\n第二十一条 对外捐赠支出\n\n 公司对外捐赠支出由品牌及市场运营中心归口管理,并严格预算单控,未纳入对\n\n外捐赠预算的,不得对外捐赠。\n\n 1 预算内对外捐赠事项发生时,实施捐赠的业务部门应提出捐赠申请,详细说\n\n 明捐赠事由、捐赠对象、捐赠金额等内容,经业务部门负责人审批,品牌及\n\n 市场运营中心归口审核,业务部门分管领导审批后执行。\n\n 2 未纳入预算的对外捐赠事项,实施捐赠的业务部门应提出捐赠申请,详细说\n\n 明捐赠必要性,履行对外捐赠的预算调整决策程序,并纳入预算范围后方可\n\n 实施。\n\n 3 捐赠事项完成后,实施捐赠的业务部门应将捐赠活动的凭据资料报品牌及\n\n 市场运营中心备案,凭据资料包括但不限于发票、收据、捐赠协议、接收函、\n\n 捐赠清单等。\n\n第二十二条 涉外业务汇率标准\n\n 以人民币结算的,凭据报销;以外币结算的,按支付凭据所载汇率折算,支付凭\n\n据未载明汇率的按业务发生月第一个交易日“中国银行外汇折算价”执行,中国银行\n\n无折算价的币种按“中国外汇交易中心参考汇率”执行。\n\n 第五章 附则\n\n第二十三条 本办法的归口与实施\n\n 1 本办法自颁布之日起施行,原办法同时废止。\n\n 2 本办法由公司计划财务部负责制定、修订、解释及实施协调工作。\n\n第二十四条 附件\n\n 附表1:员工支出报销审批权限表\n\n 附表2:岗位支出报销审批权限表\n\n 附表3:支出归口管理部门与归口业务范围\n\n 第 13 页 共 20 页\n 商密【中】\n 附表 1:员工支出报销审批权限表\n 单位:人民币万元\n 审批权限\n 部门经理/\n 支出项目 总监/ 副总裁/ 高级副总裁/ 补充说明\n 机构总经理/ 总裁\n 一级部门总经理 总工程师 各委员会主任\n 事业部总经理\n\n 业务招待 0", - "chunk_order_index": 5, - "full_doc_id": "2c1cb358f08d44ceb0e4d287133206ec", - "file_path": "/app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf", - "llm_cache_list": [], - "create_time": 1779011842, - "update_time": 1779011842, - "_id": "chunk-e9438f69c9e221d9f0f00a05ad84eac6" - }, - "chunk-9841d66d8fb8548aab40220663a51693": { - "tokens": 1200, - "content": "附表 1:员工支出报销审批权限表\n 单位:人民币万元\n 审批权限\n 部门经理/\n 支出项目 总监/ 副总裁/ 高级副总裁/ 补充说明\n 机构总经理/ 总裁\n 一级部门总经理 总工程师 各委员会主任\n 事业部总经理\n\n 业务招待 0.5 1 2 3 15\n\n 因公借款 0.5 1 2 3 15\n员工支出\n\n 1.差旅费、市内交通。\n 其他支出 1 2 3 5 50 2.客服及商务、教育、邮递。\n 3.职工活动等其他临时性支出。\n\n 第 14 页 共 20 页\n 商密【中】\n 附表 2:岗位支出报销审批权限表\n 单位:人民币万元\n\n 审批权限\n\n 支出项目 部门经理/ 总监/ 补充说明\n 高级\n 机构总经理/ 一级部门 副总裁 总裁\n 副总裁\n 事业部总经理 总经理\n\n 资产采购 1 2 10 15 200 包括固定资产、无形资产、低值易耗品。\n资本性 基建工程 —— —— 5 10 50\n支出\n 股权投资、\n —— —— —— —— —— 由董事长审批。\n 兼并收购\n 1.生产采购:产品生产用原材料、辅助\n 材料、机物料等。\n 材料采购 —— 10 20 30 500\n 2.项目采购:项目外采的设备、软件、公\n 有云资源等。\n 分包外包\n —— 10 20 30 500\n (内部单位) 1.研发、实施、运维、服务等分包外包。\n 分包外包 2.委托加工、项目土建装修等。\n收益性 —— 10 20 30 200\n (外部单位)\n支出\n 1.投标相关保证金:投标保证金、质保\n 保证金 5 50 100 200 500 金、履约保证金。\n 2.招标相关保证金。\n 1.销售退款。\n 销售退款 5 10 30 50 200\n 2.代付款(代收后)。\n 不含水电及杂费,需经业务归口部门审\n 房屋租金 5 10 20 30 200\n 批。\n\n 第 15 页 共 20 页\n 商密【中】\n 公司统一结算或批量采购的:\n 1.食堂采购、通勤车。\n 统结支出\n 2.交通费、住宿费。\n 3.业务招待费、通讯费等。\n 代付子公司\n 代付子公司投标支出。\n 经营支出\n 1.广告费。\n 市场营销 2.业务宣传费:业务宣传、企业文化宣\n 传、市场活动、营销活动。\n\n 专项服务、 1 3 5 10 50 外部单位与个人提供的咨询、培训、劳务\n 外聘劳务 等服务(非专家意见、非鉴证报告)。\n\n 国家机关、事业单位、代行政府职能的\n 政府规费\n 社会团体收费。\n 慰问救济、对\n —— —— 1 2 10 公司制度外的慰问救济捐赠。\n 外捐赠\n 税费支出 50 100 200 300 500 增值税及各类附加费、所得税等。\n\n 其他支出 1 2 3 5 50 设备租赁、公务车支出等\n\n 资金转户/调拨 50 —— —— 2000 3000\n\n财务专用 银行手续费\n 5 10 30 50 200\n 错付退款 不含销售退款。\n\n 其他支付 —— —— —— 15 50 出纳提现等。\n\n 第 16 页 共 20 页\n 商密【中】\n注 1:上述权限额度均含本数,各级管理人员权限指各自职责范围内审批权限。\n注 2:上述权限中业务流转执行以组织关系为基准的逐级审批规则。特殊事项经决策后,可越级至终审岗审批。\n注 3:仅结算业务,由业务部门审批确定是否达到财务入账条件,并按照上述对应支出项目权限审批。\n注 4:代付", - "chunk_order_index": 6, - "full_doc_id": "2c1cb358f08d44ceb0e4d287133206ec", - "file_path": "/app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf", - "llm_cache_list": [], - "create_time": 1779011842, - "update_time": 1779011842, - "_id": "chunk-9841d66d8fb8548aab40220663a51693" - }, - "chunk-afc57a0e9548d1f484da6df6c182676b": { - "tokens": 1200, - "content": "】\n注 1:上述权限额度均含本数,各级管理人员权限指各自职责范围内审批权限。\n注 2:上述权限中业务流转执行以组织关系为基准的逐级审批规则。特殊事项经决策后,可越级至终审岗审批。\n注 3:仅结算业务,由业务部门审批确定是否达到财务入账条件,并按照上述对应支出项目权限审批。\n注 4:代付子公司经营支出原则上与子公司按季度汇总结算。\n注 5:薪酬福利支出分配计划审批按照人事归口管理部门规定执行。\n注 6:上述权限不含协管、高级顾问、顾问及主持工作人员,公司如有其相关文件通知,从其规定授权。\n注 7:全资子公司总经理由母公司未明确层级管理人员担任的,审批权限按“总监/一级部门总经理”执行。\n注 8:全资子公司员工薪资、奖金提成、福利支出、临时的奖励及福利支出审批按照人事归口管理部门规定执行。\n注 9:全资子公司其他部门经理,按照公司 1 号文对应岗位授权,由平级人员分角色担任的,按最高岗位授权,逐级审批。\n\n 第 17 页 共 20 页\n 商密【中】\n 附表 3:支出归口管理部门与归口业务范围\n 归口管理部门 归口业务范围\n 1.党建支出。\n办公室(党委办公室)\n 2.公务车支出。\n 工会委员会 工会支出。\n 1.投标业务支出:标书费、投标保证金、中标服务费(或保险)等。\n 营销中心 2.机构营销业务支出:客服及商务支出、营销活动支出。\n 3.客户培训、销售退款等支出。\n 1.广告费支出。\n品牌及市场运营中心 2.业务宣传支出:业务宣传、文化宣传、市场活动。\n 3.对外捐赠支出。\n 1.薪酬福利(不含食堂、误餐)、外聘劳务、员工保险支出。\n 组织人事部 2.探亲差旅、条件艰苦及安全风险较高区域补助等支出。\n 3.其他福利支出。\n 1.招聘业务。\n 人力资源服务部\n 2.员工教育培训支出。\n 1.员工备用金、差旅费、市内交通费、出国经费、误餐费支出。\n 计划财务部 2.税金及附加、审计评估、财务费用支出。\n 3.客服及商务支出。\n 产业投资部 股权投资支出、并购业务支出。\n证券与法律事务部 法律事务类支出、上市信披类支出、商标注册类支出。\n 产品规划设计部 知识产权类支出、信息技术咨询类支出、研发活动类支出。\n DAP 研发中心 研究开发过程中支付给外单位的检测、评测、测试及化验等支出。\n 1.IT 类资产的购置(建造)、租入、运维、修理等支出。\n 信息管理部\n 2.网络使用费支出。\n 1.非 IT 类资产的购置、租入、运维、修理、装修等支出,财产保险支出。\n 2.食堂支出。\n 后勤服务部\n 3.办公费用支出。\n 4.商旅统付结算。\n\n 第 18 页 共 20 页\n 商密【中】\n附件 2\n\n 修订说明\n\n 《公司支出管理办法》修订涉及修改报销标准 2 项,取消报销规定 1 项,新增\n\n报销规定 2 项,审批权限变化 2 项,具体情况如下。\n\n 一、报销标准变化情况\n\n 只调整了差旅费、异地调动邮寄费两项内容。\n\n 1.差旅费。只调整了公司领导出差交通工具标准和出差补贴。\n\n 出差交通工具标准:公司领导(P8)乘坐火车标准(由“不限”标准调低为\n\n“二等座”)、轮船标准(由“二等舱”调低为“三等舱”)。\n\n 出差补贴:原制度描述出差补助为包干制,实际执行时在两项补助之外还存在\n\n报销打车费情况,故取消了原制度中“包干”表述。\n\n 2.异地调动邮寄费。将原制度“可凭据报销一次个人物品邮寄费用,金额超过\n\n1000 元的需事前审批”,调整为“1 元/人/公里内报销,超标自理”。\n\n 二、取消报销规定内容\n\n 因公用车补贴已纳入工资内发放,新制度中取消该费用相关表述。\n\n 三、新增规定内容\n\n 1.异地挂职锻炼补贴标准。经组织安排到异地挂职锻炼、培养锻炼、", - "chunk_order_index": 7, - "full_doc_id": "2c1cb358f08d44ceb0e4d287133206ec", - "file_path": "/app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf", - "llm_cache_list": [], - "create_time": 1779011842, - "update_time": 1779011842, - "_id": "chunk-afc57a0e9548d1f484da6df6c182676b" - }, - "chunk-18d968b78afe916b419c1b5973421ebe": { - "tokens": 1200, - "content": "1000 元的需事前审批”,调整为“1 元/人/公里内报销,超标自理”。\n\n 二、取消报销规定内容\n\n 因公用车补贴已纳入工资内发放,新制度中取消该费用相关表述。\n\n 三、新增规定内容\n\n 1.异地挂职锻炼补贴标准。经组织安排到异地挂职锻炼、培养锻炼、人才帮\n\n扶、借调支援等工作人员,在途期间的交通费、餐补和基本补助按出差规定执行;\n\n在异地单位工作期间,不适用出差补贴标准规定,按照组织人事部确定的挂职人员\n\n报销标准执行;所在单位不安排住宿的,住宿标准按公司酒店住宿限额标准执行。\n\n 2.对使用商旅订票进行了规范。因公出差原则上应使用商旅系统统一预定。\n\n 四、审批权限变化情况\n\n 只调整了“投标保证金”“审批流转程序”两项内容:\n\n 1.调整投标保证金审批权限。因对投标缴纳保证金的时效性要求较高,为提高\n\n审批效率,调整投标保证金审批权限,具体如下(单位:万元):\n\n 第 19 页 共 20 页\n 商密【中】\n 审批权限\n\n 部门经理/\n支出项目 总监/ 副总裁/ 高级副总裁/\n 机构总经理/ 总裁\n 一级部门总经理 总工程师 各委员会主任\n 事业部总经理\n\n保证金 5 50 100 200 500\n\n 2.明确支出审批流转程序。业务流转执行以组织关系为基准的逐级审批规则。\n\n 特殊事项经决策后,可越级至终审岗审批。\n\n 第 20 页 共 20 页\n 商密【中】\n\n# 章节导航\n\n以下内容由入库阶段从制度原文中提取,供检索时优先理解制度层级、条目和标准所在章节。\n\n- 第一章 总则.............................................................. 4\n- 第二章 职责分工 .......................................................... 4\n- 第三章 支出报销申请与审批 ................................................ 6\n- 第四章 重点支出管理规定 .................................................. 7\n- 第五章 附则............................................................. 13\n- 第一章 总则\n- 第二章 职责分工\n- 第三章 支出报销申请与审批\n- 第四章 重点支出管理规定\n- 第五章 附则\n- 一、报销标准变化情况\n- 二、取消报销规定内容\n\n# 重点章节摘录\n\n## 第一章 总则.............................................................. 4\n\n第一条 目的............................................................. 4;第二条 范围............................................................. 4;第三条 管理原则......................................................... 4\n\n## 第二章 职责分工 .......................................................... 4\n\n第四条 归口管理部门主要职责 ............................................. 4;第五条 计划财务部主要职责............................................... 5;第六条 经办部门(个人)主要职责 ......................................... 5\n\n## 第三章 支出报销申请与审批 ................................................ 6\n\n第八条 支出报销申请..................................................... 6;第九条 支出报销审批..................................................... 7;第十条 支出成本中心归属................................................. 7\n\n## 第四章 重点支出管理规定 .................................................. 7\n\n第十一条 备用金借款....................................................... 7;第十二条 市内交通费....................................................... 8;第十三条 差旅费........................................................... 8\n\n## 第五章 附则............................................................. 13\n\n第二十三条 本办法的归口与实施 ........................................... 13;第二十四条 附件 ......................................................... 13;附表 1:员工支出报销审批权限表 ............................................ 14\n\n## 第一章 总则\n\n第一条 目的;为适应远光软件股份有限公司(以下简称“公司”)业务发展需要,优化、完善;支出和报销标准,规范支出业务审批和报销过程,防范经营风险,依据国家有关法律\n\n## 第二章 职责分工\n\n第四条 归口管理部门主要职责;公司实行支出归口管理,归口管理部门主要职责如下:;1 在遵循公司财务、采购、人资等相关制度规定的基础上,根据业务管理需要,\n\n## 第三章 支出报销申请与审批\n\n第八条 支出报销申请;1 申请方式;支出报销申请通过公司财务信息化系统实现(以下简称“系统单据”),财务原\n\n# 问答线索补充\n\n以下内容由入库阶段根据章节标题、条款、列表、键值对与相邻正文提炼,供问答检索时优先命中更短、更直接的制度依据。\n\n- 第一章 总则.............................................................. 4:第一条 目的............................................................. 4\n- 第一章 总则.............................................................. 4:第二条 范围............................................................. 4\n- 第一章 总则................................", - "chunk_order_index": 8, - "full_doc_id": "2c1cb358f08d44ceb0e4d287133206ec", - "file_path": "/app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf", - "llm_cache_list": [], - "create_time": 1779011842, - "update_time": 1779011842, - "_id": "chunk-18d968b78afe916b419c1b5973421ebe" - }, - "chunk-aa5435156b829944c173fa1d2d7a93d4": { - "tokens": 1020, - "content": "问答线索补充\n\n以下内容由入库阶段根据章节标题、条款、列表、键值对与相邻正文提炼,供问答检索时优先命中更短、更直接的制度依据。\n\n- 第一章 总则.............................................................. 4:第一条 目的............................................................. 4\n- 第一章 总则.............................................................. 4:第二条 范围............................................................. 4\n- 第一章 总则.............................................................. 4:第三条 管理原则......................................................... 4\n- 第二章 职责分工 .......................................................... 4:第四条 归口管理部门主要职责 ............................................. 4\n- 第二章 职责分工 .......................................................... 4:第五条 计划财务部主要职责............................................... 5\n- 第二章 职责分工 .......................................................... 4:第六条 经办部门(个人)主要职责 ......................................... 5\n- 第二章 职责分工 .......................................................... 4:第七条 各级管理人员主要职责 ............................................. 5\n- 第三章 支出报销申请与审批 ................................................ 6:第八条 支出报销申请..................................................... 6\n- 第三章 支出报销申请与审批 ................................................ 6:第九条 支出报销审批..................................................... 7\n- 第三章 支出报销申请与审批 ................................................ 6:第十条 支出成本中心归属................................................. 7\n- 第四章 重点支出管理规定 .................................................. 7:第十一条 备用金借款....................................................... 7\n- 第四章 重点支出管理规定 .................................................. 7:第十二条 市内交通费....................................................... 8\n- 第四章 重点支出管理规定 .................................................. 7:第十三条 差旅费........................................................... 8\n- 第四章 重点支出管理规定 .................................................. 7:第十四条 业务招待费...................................................... 11\n- 第五章 附则............................................................. 13:第二十三条 本办法的归口与实施 ........................................... 13\n- 第五章 附则............................................................. 13:第二十四条 附件 ......................................................... 13\n- 第五章 附则............................................................. 13:第 3 页 共 20 页\n- 第一章 总则:第一条 目的\n- 第一章 总则:为适应远光软件股份有限公司(以下简称“公司”)业务发展需要,优化、完善\n- 第一章 总则:支出和报销标准,规范支出业务审批和报销过程,防范经营风险,依据国家有关法律\n- 第一章 总则:第二条 范围\n- 第二章 职责分工:第四条 归口管理部门主要职责\n- 第二章 职责分工:1 在遵循公司财务、采购、人资等相关制度规定的基础上,根据业务管理需要,\n- 第二章 职责分工:确定各项支出业务的开支范围、标准、方式和管理流程\n\n# 结构化表格补充\n\n以下表格由知识归纳阶段依据原文重新整理,供问答检索时优先理解行列关系。\n\n## 表1 交通工具等级标准\n\n| 员工职级 | 飞机 | 火车 | 轮船 | 其他交通工具(不含小汽车) |\n|---|:---:|:---:|:---:|:---:|\n| 公司领导、高层经理、中层经理(P5及以上、外聘专家) | 经济舱 | 火车硬席(硬卧、硬座)、高铁/动车二等座,全列软席列车二等软座 | 三等舱 | 凭据报销 |\n| 基层经理、其他人员(P4及以下) | 经济舱 | 火车硬席(硬卧、硬座)、高铁/动车二等座,全列软席列车二等软座 | 三等舱 | 凭据报销 |\n\n## 表3 出差补贴标准\n\n| 补助类型 | 项目 | 港澳台 | 直辖市/特区/西藏 | 其他地区 | 国外 |\n|---------|------|--------|------------------|---------|------|\n| 餐补 | 自行解决餐食 | 75 | 65 | 55 | 140 |\n| 基本补助 | 基本出差补贴 | 35 | 35 | 35 | 35 |\n| 合计 | - | 110 | 100 | 90 | 175 |", - "chunk_order_index": 9, - "full_doc_id": "2c1cb358f08d44ceb0e4d287133206ec", - "file_path": "/app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf", - "llm_cache_list": [], - "create_time": 1779011842, - "update_time": 1779011842, - "_id": "chunk-aa5435156b829944c173fa1d2d7a93d4" - } +{ + "chunk-dd87aa5bc62cc9587ecb4c26d35a5263": { + "tokens": 1200, + "content": "商密【中】\n\n 远光软件股份有限公司文件\n\n 远光制度〔2024〕14 号\n\n关于颁布《公司支出管理办法(2024)》的\n 通知\n\n公司各部门、分支机构、子公司:\n 为适应公司业务发展需要,优化、完善支出和报销标准,规\n范支出业务审批和报销过程,防范经营风险,依据国家有关法\n律法规,参照国家电网公司和国网数科公司有关管理规定,结\n合市场经营环境和公司实际情况,在广泛征求意见的基础上,\n公司对《公司支出管理办法》进行了修订,现予颁布。本办法自\n颁布之日起施行,原办法同时废止。\n 特此通知。\n\n 附件:1.公司支出管理办法(2024)\n 2.修订说明\n\n 远光软件股份有限公司\n 2024 年 4 月 17 日\n\n远光软件股份有限公司 2024 年 4 月 17 日印发\n\n 第 1 页 共 20 页\n 商密【中】\n附件 1\n\n 公司支出管理办法(2024)\n 目录\n 第一章 总则.............................................................. 4\n\n 第一条 目的............................................................. 4\n\n 第二条 范围............................................................. 4\n\n 第三条 管理原则......................................................... 4\n\n 第二章 职责分工 .......................................................... 4\n\n 第四条 归口管理部门主要职责 ............................................. 4\n\n 第五条 计划财务部主要职责............................................... 5\n\n 第六条 经办部门(个人)主要职责 ......................................... 5\n\n 第七条 各级管理人员主要职责 ............................................. 5\n\n 第三章 支出报销申请与审批 ................................................ 6\n\n 第八条 支出报销申请..................................................... 6\n\n 第九条 支出报销审批..................................................... 7\n\n 第十条 支出成本中心归属................................................. 7\n\n 第四章 重点支出管理规定 .................................................. 7\n\n 第十一条 备用金借款....................................................... 7\n\n 第十二条 市内交通费....................................................... 8\n\n 第十三条 差旅费........................................................... 8\n\n 第十四条 业务招待费...................................................... 11\n\n 第十五条 会议费.......................................................... 11\n\n 第十六条 广告宣传费...................................................... 11\n\n 第十七条 培训费.......................................................... 12\n\n 第十八条 通信费.......................................................... 12\n\n 第 2 页 共 20 页\n 商密【中】\n 第十九条 邮递费.......................................................... 12\n\n 第二十条 薪酬福利支出.................................................... 12\n\n 第二十一条 对外捐赠支出 ................................................. 13\n\n 第二十二条 涉外业务汇率标准 ............................................. 13\n\n第五章 附则............................................................. 13\n\n 第二十三条 本办法的归口与实施 ........................................... 13\n\n 第二十四条 附件 ......................................................... 13\n\n 附表 1:员工支出报销审批权限表 ............................................ 14\n\n 附表 2:岗位支出报销审批权限表 ............................................ 15\n\n 附表 3:支出归口管理部门与归口业务范围 .................................... 18\n\n 第 3 页 共 20 页\n 商密【中】\n 第一章 总则\n\n第一条 目的\n\n 为适应远光软件股份有限公司(以下简称“公司”)业务发展需要,优化、完善\n\n支出和报销标准,规范支出业务审批和报销过程,防范经营风险,依据国家有关法律\n\n法规,参照国家电网公司和国网数科公司有关管理规定,结合市场经营环境和公司实\n\n际情况,在广泛征求意见的基础上,制定本办法。\n\n第二条 范围\n\n 本办法适用于公司各类成本费用和资本性支出。\n\n 本办法适用于全公司范围,包括:公司各部门、分支机构(非独立法人)、全资\n\n子公司。控股子公司应参照本办法制订支出管理办法,按子公司相关议事规则审批、\n\n报公司计划财务部备案后执行。\n\n第三条 管理原则\n\n 公司支出管理遵循“预算先行、厉行节约、效益优先,分级授权、分类控制、批\n\n办分离”的基本原则。\n\n 1 公司支出管理遵循预算先行的控制原则,应在预算目标范围内支出,并遵循\n\n 公司内控、预算、考核管理相关规定,预算外支出履行预算审批程序后执行。\n\n 2 各部门(分支机构)、各岗位应在部门(岗位)职责与授权业务范围内,秉\n\n 持厉行节约、效益优先原则,规范开展支出业务活动。\n\n 3 各级管理人员应根据其管理岗位,在公司支出授权审批范围和本人职责范\n\n 围内,履行支出审批职权,承担审批责任。岗位审批权限与职级待遇分离,\n\n 审", + "chunk_order_index": 0, + "full_doc_id": "2c1cb358f08d44ceb0e4d287133206ec", + "file_path": "/app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf", + "llm_cache_list": [], + "create_time": 1779011842, + "update_time": 1779011842, + "_id": "chunk-dd87aa5bc62cc9587ecb4c26d35a5263" + }, + "chunk-74c01decac4a10cd40a491786743b0ee": { + "tokens": 1200, + "content": "(分支机构)、各岗位应在部门(岗位)职责与授权业务范围内,秉\n\n 持厉行节约、效益优先原则,规范开展支出业务活动。\n\n 3 各级管理人员应根据其管理岗位,在公司支出授权审批范围和本人职责范\n\n 围内,履行支出审批职权,承担审批责任。岗位审批权限与职级待遇分离,\n\n 审批权限按管理岗位执行。\n\n 4 公司支出管理遵循批办分离的牵制原则,支出经办人和审批人不得为同一\n\n 人。\n\n 第二章 职责分工\n\n第四条 归口管理部门主要职责\n\n 公司实行支出归口管理,归口管理部门主要职责如下:\n\n 1 在遵循公司财务、采购、人资等相关制度规定的基础上,根据业务管理需要,\n\n 确定各项支出业务的开支范围、标准、方式和管理流程。\n\n 第 4 页 共 20 页\n 商密【中】\n 2 根据公司有关规定,对支出业务的合规性、预算(计划)执行控制情况等进\n\n 行检查、分析与监督。\n\n 支出归口管理部门与范围按“附表3”执行,部门职责变化时,相应调整归口分\n\n工。\n\n第五条 计划财务部主要职责\n\n 1 明确支出报销审批流程、审核要点和报销资料规范。\n\n 2 协助归口管理部门确定各项支出业务的开支范围和标准。\n\n 3 负责报销业务财务审核,对业务原始凭据的完整性、合规性进行审查,对报\n\n 销事项与业务原始凭据的业务关联性、内容一致性、金额准确性等进行复\n\n 核,可要求报销人提供不限于本办法规定的佐证资料。\n\n 4 办理报销业务的结算支付。\n\n 5 组织开展支出报销业务日常财务稽核与宣贯。\n\n第六条 经办部门(个人)主要职责\n\n 1 在部门(岗位)职责与授权业务范围内,秉持预算先行、厉行节约、效益优\n\n 先原则,规范开展支出业务活动。\n\n 2 业务经办过程中,应严格遵循开支范围和标准,切实履行业务流程与审批程\n\n 序,并遵循“发票、资金、物资”三流一致原则,及时取得真实、合规、关\n\n 联、完整的业务原始凭据,验证发票真伪。\n\n 3 各项物资(原材料、固定资产、无形资产、低值易耗品、办公用品)、服务、\n\n 外包分包业务的采购,应以经审核的需求计划(项目采购预算)为前提,并\n\n 严格遵循公司招标、采购与物资管理相关规定。\n\n 4 及时提交报销申请,履行报销审批流程,配合提供发票,以及不限于本办法\n\n 规定的业务佐证资料。\n\n 5 对支出业务的真实性、合规性、必要性、合理性以及业务原始凭据的真实性、\n\n 合规性、关联性、完整性,承担全部责任。\n\n第七条 各级管理人员主要职责\n\n 各级管理人员应在授权审批范围和职责范围内,履行支出报销审批职权,承担审\n\n批责任。\n\n 第 5 页 共 20 页\n 商密【中】\n 1 第一审批人:应对支出业务的真实性、合规性、必要性、合理性进行全面审\n\n 核,并承担审批责任。\n\n 2 后续审批人:应对支出业务的必要性、合理性进行审核,并承担审批责任。\n\n 第三章 支出报销申请与审批\n\n第八条 支出报销申请\n\n 1 申请方式\n\n 支出报销申请通过公司财务信息化系统实现(以下简称“系统单据”),财务原\n\n则上不接受“纸质申请单据”。\n\n (1)经办人应及时填写“系统单据”,并同步提交业务原始凭据。\n\n (2)除“员工薪酬、个人劳务报酬、出差补贴、专项补贴、往来款项支付”等支\n\n 出业务外,其他支出均需提交税务机关认可的票据。\n\n ① “工会经费、员工福利、职工活动、业务招待、车票、政府规费”以外的\n\n 支出,原则上均应取得增值税专用发票;应取得但未取得增值税专用发\n\n 票的,经办人应在“系统单据”中说明原因。\n\n ② 汇总开具的增值税发票,应附税控系统明细清单。\n\n (3)财务审核发现业务原始凭据不完整的,经办人应在三个工作日内补充并重新\n\n 提交至财务;经办人填单错误、业务原始凭据不合规,以及不能按时补充业\n\n 务原始凭据的,财务退单处理。", + "chunk_order_index": 1, + "full_doc_id": "2c1cb358f08d44ceb0e4d287133206ec", + "file_path": "/app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf", + "llm_cache_list": [], + "create_time": 1779011842, + "update_time": 1779011842, + "_id": "chunk-74c01decac4a10cd40a491786743b0ee" + }, + "chunk-061324cc36078214691a6fc1cd0aaeea": { + "tokens": 1200, + "content": "说明原因。\n\n ② 汇总开具的增值税发票,应附税控系统明细清单。\n\n (3)财务审核发现业务原始凭据不完整的,经办人应在三个工作日内补充并重新\n\n 提交至财务;经办人填单错误、业务原始凭据不合规,以及不能按时补充业\n\n 务原始凭据的,财务退单处理。\n\n 2 申请时限\n\n 支出报销申请时限指“业务完成日”至“附件影像资料挂接系统单据日”的期间。\n\n (1)公司各类支出报销结算申请时限为三个月。\n\n ① 逾期需说明原因,经分管领导审批后方可报销。\n\n ② 按自然月度计算并定期发生的费用支出,需月度结束后方可报销。\n\n ③ 差旅费原则上需在行程结束三个月内提交报销申请(连续出差超过一个\n\n 月时,原则上应按月报销),逾期不予报销出差补贴。\n\n (2)预付款项,原则上应在次月底前完成结算,不得长期挂账。\n\n 3 结算方式\n\n (1)员工支出业务:原则上采用“公对私”结算方式,报销申请审批通过后,公\n\n 第 6 页 共 20 页\n 商密【中】\n 司支付给经办人。\n\n (2)岗位支出业务:原则上采用“公对公”结算方式,报销申请审批通过后,公\n\n 司与供应商直接结算。结算起点(1000 元)以下、且确实无法与供应商直接\n\n 结算的小额支出,报销时应附向供应商付款凭据的截图佐证。\n\n第九条 支出报销审批\n\n 1 审批权限\n\n (1)预算内支出,按“附表 1、附表 2”执行。\n\n (2)预算外支出,经办部门提交预算调整申请,经公司总裁批准后,再按“附表\n\n 1、附表 2”执行。\n\n 2 审批时限\n\n 各级管理人员原则上应在待批单据流转至本岗位后三个工作日内完成审批。\n\n 3 财务审核时限\n\n (1)影像扫描:“系统单据和纸质原始凭据”流转至影像岗后,原则上应在一个\n\n 工作日内处理完毕。\n\n (2)审核与支付:已完成审批的系统单据,原则上应在三个工作日内处理完毕。\n\n第十条 支出成本中心归属\n\n 支出成本中心归属原则上基于责任原则与受益原则确定,特殊情况由相关业务\n\n部门协商确定。\n\n 第四章 重点支出管理规定\n\n第十一条 备用金借款\n\n 备用金是公司借支给正式员工,用于支付与公司经济业务相关的、必须预支且尚\n\n不具备报销条件的费用支出款项。\n\n 1 备用金借款必须是真实合法的经济业务,应遵循“前款不清、后款不借”的\n 原则,严禁以各种名义挪用公司资金。\n 2 非正式员工不得申请备用金借款。\n 3 备用金借款按季定期清理。季度不能及时报账核销的,借款人应向其分管领\n 导申请延期审批,但不得跨年。\n 4 员工备用金借款额度原则上不得超过一万元。\n\n 第 7 页 共 20 页\n 商密【中】\n第十二条 市内交通费\n 市内交通费是指员工为公司生产经营活动,在工作所在地发生的市内交通费用,\n包括工作时间内外出办理公事、夜间工作或非工作日发生的市内交通费用,不包括员\n工正常上下班所发生的交通费用、从居住地公出或公出结束返回居住地发生的市内\n交通费。\n 1 市内交通费凭据报销,应与工作实际相符,严禁报销与工作无关的交通费,\n 不接受充值预付费方式的交通费。\n 2 基于厉行节约原则,鼓励员工选择公交、地铁等公共交通出行。出租车仅限\n “紧急公务、接送客户、夜间工作至 22:00 后、以及其他确有需要的特别情\n 形”等事项的市内交通使用,由部门负责人从严管理。\n第十三条 差旅费\n 差旅费是指员工因公出差所发生的交通费、住宿费、出差补贴等。\n 各部门(单位)应严格执行出差审批程序,从严控制出差人数和出差天数,严禁\n无实质内容、无明确公务目的的差旅活动。部门副职及以下员工出差需通过公司商旅\n系统事前审批。\n 1 交通费\n 表1 交通工具等级标准\n 国内(含港澳台)、国外", + "chunk_order_index": 2, + "full_doc_id": "2c1cb358f08d44ceb0e4d287133206ec", + "file_path": "/app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf", + "llm_cache_list": [], + "create_time": 1779011842, + "update_time": 1779011842, + "_id": "chunk-061324cc36078214691a6fc1cd0aaeea" + }, + "chunk-613d6dfd4c5e9c807229a3147f96b584": { + "tokens": 1200, + "content": "费、住宿费、出差补贴等。\n 各部门(单位)应严格执行出差审批程序,从严控制出差人数和出差天数,严禁\n无实质内容、无明确公务目的的差旅活动。部门副职及以下员工出差需通过公司商旅\n系统事前审批。\n 1 交通费\n 表1 交通工具等级标准\n 国内(含港澳台)、国外\n 其他交通工具\n 员工职级\n 飞机 火车 轮船 (不含小汽\n 车)\n公司领导、高层经理、\n 中层经理 火车硬席(硬\n 经济舱 卧、硬座)、\n(P5 及以上、外聘专\n 家) 高铁/动车二\n 三等舱 凭据报销\n 等座,全列软\n基层经理、其他人员 经济舱 席列车二等软\n (P4 及以下) (注 3) 座\n\n 第 8 页 共 20 页\n 商密【中】\n 国内(含港澳台)、国外\n 其他交通工具\n 员工职级\n 飞机 火车 轮船 (不含小汽\n 车)\n注 1:交通工具选乘应遵循“性价比优先”原则。\n注 2:基层经理及以下人员(P4 及以下)乘坐飞机需事前报经部门负责人审批。基层经\n理(P4)应选乘 6 折及以下经济舱、其他人员(P1-P3)应选乘 5 折及以下经济舱。\n注 3:夜间乘坐高铁/动车 6 小时以上时,可选乘卧铺。\n注 4:出差人员应当严格执行交通工具等级标准,确因紧急公务、特别情形等事项导致\n交通工具超过规定标准时,超标 20%以内时由部门负责人审批,超标 20%以上时需分管\n领导审批。\n注 5:公司已为员工购买了商业保险(含交通险),出差期间发生的保险费不再报销。\n注 6:出租车仅限“紧急公务、接送客户、夜间工作至 22:00 后、以及其他确有需要的\n特别情形”等事项的市内交通使用,由部门负责人从严管理。往返机场、车站、港口,\n原则上应选择“公交车、轨道交通”。\n注 7:自驾车出差发生的路桥费、停车费、油费、电费等据实报销,由部门负责人从严\n管理。自驾发生事故或违章罚款等造成的损失,责任自负。\n 2 住宿费\n (1)酒店住宿\n\n 表2 酒店住宿限额标准\n\n 单位:人民币元\n 国内\n 员工职级 直辖市/特区/ 国外\n 省会城市 其他地区\n 港澳台\n 公司领导\n 500 450 400 800\n (P8及以上)\n 高层经理\n 450 400 350 700\n (P7)\n 中层经理、基层经理\n 400 350 300 600\n(P4~P6、外聘专家)\n\n 其他员工 350 300 250 500\n注1:出差人员应严格执行住宿限额标准,确因紧急公务、特别情形等事项导致住宿超\n过规定标准时,超标20%以内时由部门负责人审批,超标20%以上时需分管领导审批。\n注2:外出参加会议、培训,统一安排食宿的,会议期间的住宿费按外部会议组织方通\n知标准凭据报销。不统一安排食宿的,按照上表标准执行。\n\n (2)异地工作用房\n\n ① 因公长期出差人员申请异地工作用房的,按照《公司物业租赁管理办法》\n\n 第 9 页 共 20 页\n 商密【中】\n 执行。\n\n ② 异地工作用房产生的租金、房屋初始配置费、物业管理费、取暖费、水电\n\n 燃气支出(含公摊)、网络宽带费等费用,按照《公司物业租赁管理办法》确\n\n 定标准进行报销。\n\n 3 出差补贴\n\n 出差补贴按出差自然天数(日历天数)进行报销,具体标准如下:\n\n 表3 出差补贴标准\n\n 单位:人民币元/天\n\n 国内\n补助类型 项目 国外\n 港澳台 直辖市/特区/西藏 其他地区\n\n 餐补 自行解决餐食 75 65 55 140\n全额\n补助 基本\n 基本出差补贴 35 35 35 35\n 补助\n 合计 110 100 90 175\n注:因组织安排、销售、推广、调", + "chunk_order_index": 3, + "full_doc_id": "2c1cb358f08d44ceb0e4d287133206ec", + "file_path": "/app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf", + "llm_cache_list": [], + "create_time": 1779011842, + "update_time": 1779011842, + "_id": "chunk-613d6dfd4c5e9c807229a3147f96b584" + }, + "chunk-d26b288ed4001dc5c504dce0eb841362": { + "tokens": 1200, + "content": "直辖市/特区/西藏 其他地区\n\n 餐补 自行解决餐食 75 65 55 140\n全额\n补助 基本\n 基本出差补贴 35 35 35 35\n 补助\n 合计 110 100 90 175\n注:因组织安排、销售、推广、调研、培训、会议、研讨、借调等出差,主办方统一安排\n餐食的,不再报销餐补。\n 4 差旅费其他注意事项\n\n (1)因公发生的订票、签转、退票等费用凭据报销,由部门负责人审核确认。\n\n (2)出差记录链条中断时,应提供业务佐证材料:\n\n ① 登机牌、高速道路通行记录、其他道路通行记录、租车记录等。\n\n ② 支付记录。\n\n ③ 出差审批邮件、短信、微信等。\n\n (3)出差或调动工作期间,经部门负责人批准就近回家省亲办事的,其绕道交通\n\n 费,扣除出差直线单程交通费,多开支的部分由个人自理。绕道和在家期间\n\n 不得报销住宿费、出差补贴。\n\n (4)出差交通费原始凭据丢失的,提供情况说明和订单详情、支付截图等佐证材\n\n 料,可按票面价值的 75%报销,未提供的,不予报销。通过商旅订票未取得\n\n 火车票的,从差旅补贴或其他差旅杂费中扣减。\n\n (5)探亲路费应严格遵循《公司员工探亲管理办法》相关规定,不得以因公差旅\n\n 第 10 页 共 20 页\n 商密【中】\n 方式报销,不享受出差补贴。探亲路费原始凭据丢失的,不允许报销。\n\n (6)员工工作地调动时,所发生的行李、家具等邮寄费,在每人每公里 1 元以内\n\n 凭据报销,超过部分自理。\n\n (7)经组织安排到异地挂职锻炼、培养锻炼、人才帮扶、借调支援等工作人员,\n\n 在途期间的交通费、餐补和基本补助按出差规定执行;在异地单位工作期间,\n\n 不适用出差补贴标准规定,按照组织人事部确定的挂职人员报销标准执行;\n\n 所在单位不安排住宿的,住宿标准按公司酒店住宿限额标准执行。\n\n (8)境外出差(港澳台与国外出差)应单列预算、事前履行经费申请与审批程序。\n\n (9)以上涉及事前审批的事项,以公司商旅系统审批截图或审批邮件为报销必备\n\n 附件。\n\n(10)因公出差原则上应使用商旅系统统一预定,特殊情况未通过商旅系统下单\n\n的,应邮件知会商旅客服并抄送部门负责人。\n\n第十四条 业务招待费\n\n 业务招待费是指各级单位正常生产经营管理过程中需要发生的、用于必要招待\n\n的各项费用,包括用于接待客户和相关单位的餐饮等合理支出。未能“公对公”结算\n\n的,应附“向供应商付款凭据”佐证。\n\n第十五条 会议费\n\n 会议费是指公司主办或承办会议发生的会场租金、文件资料、设备租金等支出,\n\n以及参加外部会议所发生的会务相关支出。\n\n 1 公司主办或承办的会议\n\n (1)会议费中不得列支与会议无关的旅游观光、宴请、礼品馈赠等支出。\n\n (2)经费预算 30,000 元及以上(包括不在会议费列支,但与会议直接相关的培训\n\n 费、差旅费等全部支出)的公司内部会议、研讨与集中培训,需事前报请公\n\n 司总裁审批。\n\n (3)报销时应附:经审批的会议申请与预算、会议通知、参会人员签到表、会议\n\n 开支明细等业务佐证材料,会务费发票应附服务方费用明细清单。\n\n 2 参加外部会议的,报销时应附会议通知、参会回执等业务佐证材料。\n\n第十六条 广告宣传费\n\n 第 11 页 共 20 页\n 商密【中】\n 广告宣传费是指展示企业形象、宣传企业文化及营销活动中推广企业产品、业务\n\n所发生的支出,包括广告费和业务宣传费。\n\n 1 广告费\n\n 广告费指公司通过各种公开媒体宣传所发生的费用,报销时应附广告投放等业\n\n务佐证材料。\n\n 2 业务宣传费\n\n 业务宣传费是指公司自身开展宣传与营销活动所发生的费用,包括未通过媒体\n\n传播的广告性支出,以及发放的印有公司标志的礼品、纪念品等。业务宣传", + "chunk_order_index": 4, + "full_doc_id": "2c1cb358f08d44ceb0e4d287133206ec", + "file_path": "/app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf", + "llm_cache_list": [], + "create_time": 1779011842, + "update_time": 1779011842, + "_id": "chunk-d26b288ed4001dc5c504dce0eb841362" + }, + "chunk-e9438f69c9e221d9f0f00a05ad84eac6": { + "tokens": 1200, + "content": "费。\n\n 1 广告费\n\n 广告费指公司通过各种公开媒体宣传所发生的费用,报销时应附广告投放等业\n\n务佐证材料。\n\n 2 业务宣传费\n\n 业务宣传费是指公司自身开展宣传与营销活动所发生的费用,包括未通过媒体\n\n传播的广告性支出,以及发放的印有公司标志的礼品、纪念品等。业务宣传费报销时\n\n应附活动方案、费用预算等业务佐证材料,并需遵循公司采购与物资管理相关规定。\n\n第十七条 培训费\n\n 培训费是指公司安排、主办或承办培训发生的学费、书籍杂费、师资费、资料费、\n\n场地费、设备材料费、住宿费、交通费等,以及员工根据工作需要,经归口管理部门\n\n批准参加外部培训、考证、教育产生的相关费用。\n\n 1 报销资格按《公司员工教育培训管理办法》认定标准执行。\n\n 2 经归口管理部门认定符合办法标准的,培训期间的主要交通费(往返)、住\n\n 宿费按出差规定标准执行,其他费用自理。\n\n第十八条 通信费\n\n 通信费是指为满足公司日常办公需要发生的电话、传真、集团网、网络连接等支\n\n出,其中员工通讯费按《公司员工因公通讯费用实施细则》执行。\n\n第十九条 邮递费\n\n 邮递费是指公司因业务需要邮递物品而支付的费用,包括邮件费、托运费、快递\n\n费等,员工报销的应附快递底单,单位统一结算的应附寄件明细清单与支出分摊表。\n\n第二十条 薪酬福利支出\n\n 1 公司相关制度规定的职工薪资、奖励提成、福利费支出,按公司相关制度规\n\n 定执行。\n\n 2 临时的奖励及福利支出,需事先计划并报公司总裁审批,具体支出时由分管\n\n 领导根据已批准的计划审批。\n\n 3 职工福利费由组织人事部实行年度计划管理,对未纳入福利计划的福利项\n\n 第 12 页 共 20 页\n 商密【中】\n 目,不得列支和报销。\n\n 4 薪酬福利支出事前审批程序以组织人事部规定标准执行。\n\n 5 职工活动支出,按照《公司团建管理办法》或《工会经费管理办法》执行。\n\n第二十一条 对外捐赠支出\n\n 公司对外捐赠支出由品牌及市场运营中心归口管理,并严格预算单控,未纳入对\n\n外捐赠预算的,不得对外捐赠。\n\n 1 预算内对外捐赠事项发生时,实施捐赠的业务部门应提出捐赠申请,详细说\n\n 明捐赠事由、捐赠对象、捐赠金额等内容,经业务部门负责人审批,品牌及\n\n 市场运营中心归口审核,业务部门分管领导审批后执行。\n\n 2 未纳入预算的对外捐赠事项,实施捐赠的业务部门应提出捐赠申请,详细说\n\n 明捐赠必要性,履行对外捐赠的预算调整决策程序,并纳入预算范围后方可\n\n 实施。\n\n 3 捐赠事项完成后,实施捐赠的业务部门应将捐赠活动的凭据资料报品牌及\n\n 市场运营中心备案,凭据资料包括但不限于发票、收据、捐赠协议、接收函、\n\n 捐赠清单等。\n\n第二十二条 涉外业务汇率标准\n\n 以人民币结算的,凭据报销;以外币结算的,按支付凭据所载汇率折算,支付凭\n\n据未载明汇率的按业务发生月第一个交易日“中国银行外汇折算价”执行,中国银行\n\n无折算价的币种按“中国外汇交易中心参考汇率”执行。\n\n 第五章 附则\n\n第二十三条 本办法的归口与实施\n\n 1 本办法自颁布之日起施行,原办法同时废止。\n\n 2 本办法由公司计划财务部负责制定、修订、解释及实施协调工作。\n\n第二十四条 附件\n\n 附表1:员工支出报销审批权限表\n\n 附表2:岗位支出报销审批权限表\n\n 附表3:支出归口管理部门与归口业务范围\n\n 第 13 页 共 20 页\n 商密【中】\n 附表 1:员工支出报销审批权限表\n 单位:人民币万元\n 审批权限\n 部门经理/\n 支出项目 总监/ 副总裁/ 高级副总裁/ 补充说明\n 机构总经理/ 总裁\n 一级部门总经理 总工程师 各委员会主任\n 事业部总经理\n\n 业务招待 0", + "chunk_order_index": 5, + "full_doc_id": "2c1cb358f08d44ceb0e4d287133206ec", + "file_path": "/app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf", + "llm_cache_list": [], + "create_time": 1779011842, + "update_time": 1779011842, + "_id": "chunk-e9438f69c9e221d9f0f00a05ad84eac6" + }, + "chunk-9841d66d8fb8548aab40220663a51693": { + "tokens": 1200, + "content": "附表 1:员工支出报销审批权限表\n 单位:人民币万元\n 审批权限\n 部门经理/\n 支出项目 总监/ 副总裁/ 高级副总裁/ 补充说明\n 机构总经理/ 总裁\n 一级部门总经理 总工程师 各委员会主任\n 事业部总经理\n\n 业务招待 0.5 1 2 3 15\n\n 因公借款 0.5 1 2 3 15\n员工支出\n\n 1.差旅费、市内交通。\n 其他支出 1 2 3 5 50 2.客服及商务、教育、邮递。\n 3.职工活动等其他临时性支出。\n\n 第 14 页 共 20 页\n 商密【中】\n 附表 2:岗位支出报销审批权限表\n 单位:人民币万元\n\n 审批权限\n\n 支出项目 部门经理/ 总监/ 补充说明\n 高级\n 机构总经理/ 一级部门 副总裁 总裁\n 副总裁\n 事业部总经理 总经理\n\n 资产采购 1 2 10 15 200 包括固定资产、无形资产、低值易耗品。\n资本性 基建工程 —— —— 5 10 50\n支出\n 股权投资、\n —— —— —— —— —— 由董事长审批。\n 兼并收购\n 1.生产采购:产品生产用原材料、辅助\n 材料、机物料等。\n 材料采购 —— 10 20 30 500\n 2.项目采购:项目外采的设备、软件、公\n 有云资源等。\n 分包外包\n —— 10 20 30 500\n (内部单位) 1.研发、实施、运维、服务等分包外包。\n 分包外包 2.委托加工、项目土建装修等。\n收益性 —— 10 20 30 200\n (外部单位)\n支出\n 1.投标相关保证金:投标保证金、质保\n 保证金 5 50 100 200 500 金、履约保证金。\n 2.招标相关保证金。\n 1.销售退款。\n 销售退款 5 10 30 50 200\n 2.代付款(代收后)。\n 不含水电及杂费,需经业务归口部门审\n 房屋租金 5 10 20 30 200\n 批。\n\n 第 15 页 共 20 页\n 商密【中】\n 公司统一结算或批量采购的:\n 1.食堂采购、通勤车。\n 统结支出\n 2.交通费、住宿费。\n 3.业务招待费、通讯费等。\n 代付子公司\n 代付子公司投标支出。\n 经营支出\n 1.广告费。\n 市场营销 2.业务宣传费:业务宣传、企业文化宣\n 传、市场活动、营销活动。\n\n 专项服务、 1 3 5 10 50 外部单位与个人提供的咨询、培训、劳务\n 外聘劳务 等服务(非专家意见、非鉴证报告)。\n\n 国家机关、事业单位、代行政府职能的\n 政府规费\n 社会团体收费。\n 慰问救济、对\n —— —— 1 2 10 公司制度外的慰问救济捐赠。\n 外捐赠\n 税费支出 50 100 200 300 500 增值税及各类附加费、所得税等。\n\n 其他支出 1 2 3 5 50 设备租赁、公务车支出等\n\n 资金转户/调拨 50 —— —— 2000 3000\n\n财务专用 银行手续费\n 5 10 30 50 200\n 错付退款 不含销售退款。\n\n 其他支付 —— —— —— 15 50 出纳提现等。\n\n 第 16 页 共 20 页\n 商密【中】\n注 1:上述权限额度均含本数,各级管理人员权限指各自职责范围内审批权限。\n注 2:上述权限中业务流转执行以组织关系为基准的逐级审批规则。特殊事项经决策后,可越级至终审岗审批。\n注 3:仅结算业务,由业务部门审批确定是否达到财务入账条件,并按照上述对应支出项目权限审批。\n注 4:代付", + "chunk_order_index": 6, + "full_doc_id": "2c1cb358f08d44ceb0e4d287133206ec", + "file_path": "/app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf", + "llm_cache_list": [], + "create_time": 1779011842, + "update_time": 1779011842, + "_id": "chunk-9841d66d8fb8548aab40220663a51693" + }, + "chunk-afc57a0e9548d1f484da6df6c182676b": { + "tokens": 1200, + "content": "】\n注 1:上述权限额度均含本数,各级管理人员权限指各自职责范围内审批权限。\n注 2:上述权限中业务流转执行以组织关系为基准的逐级审批规则。特殊事项经决策后,可越级至终审岗审批。\n注 3:仅结算业务,由业务部门审批确定是否达到财务入账条件,并按照上述对应支出项目权限审批。\n注 4:代付子公司经营支出原则上与子公司按季度汇总结算。\n注 5:薪酬福利支出分配计划审批按照人事归口管理部门规定执行。\n注 6:上述权限不含协管、高级顾问、顾问及主持工作人员,公司如有其相关文件通知,从其规定授权。\n注 7:全资子公司总经理由母公司未明确层级管理人员担任的,审批权限按“总监/一级部门总经理”执行。\n注 8:全资子公司员工薪资、奖金提成、福利支出、临时的奖励及福利支出审批按照人事归口管理部门规定执行。\n注 9:全资子公司其他部门经理,按照公司 1 号文对应岗位授权,由平级人员分角色担任的,按最高岗位授权,逐级审批。\n\n 第 17 页 共 20 页\n 商密【中】\n 附表 3:支出归口管理部门与归口业务范围\n 归口管理部门 归口业务范围\n 1.党建支出。\n办公室(党委办公室)\n 2.公务车支出。\n 工会委员会 工会支出。\n 1.投标业务支出:标书费、投标保证金、中标服务费(或保险)等。\n 营销中心 2.机构营销业务支出:客服及商务支出、营销活动支出。\n 3.客户培训、销售退款等支出。\n 1.广告费支出。\n品牌及市场运营中心 2.业务宣传支出:业务宣传、文化宣传、市场活动。\n 3.对外捐赠支出。\n 1.薪酬福利(不含食堂、误餐)、外聘劳务、员工保险支出。\n 组织人事部 2.探亲差旅、条件艰苦及安全风险较高区域补助等支出。\n 3.其他福利支出。\n 1.招聘业务。\n 人力资源服务部\n 2.员工教育培训支出。\n 1.员工备用金、差旅费、市内交通费、出国经费、误餐费支出。\n 计划财务部 2.税金及附加、审计评估、财务费用支出。\n 3.客服及商务支出。\n 产业投资部 股权投资支出、并购业务支出。\n证券与法律事务部 法律事务类支出、上市信披类支出、商标注册类支出。\n 产品规划设计部 知识产权类支出、信息技术咨询类支出、研发活动类支出。\n DAP 研发中心 研究开发过程中支付给外单位的检测、评测、测试及化验等支出。\n 1.IT 类资产的购置(建造)、租入、运维、修理等支出。\n 信息管理部\n 2.网络使用费支出。\n 1.非 IT 类资产的购置、租入、运维、修理、装修等支出,财产保险支出。\n 2.食堂支出。\n 后勤服务部\n 3.办公费用支出。\n 4.商旅统付结算。\n\n 第 18 页 共 20 页\n 商密【中】\n附件 2\n\n 修订说明\n\n 《公司支出管理办法》修订涉及修改报销标准 2 项,取消报销规定 1 项,新增\n\n报销规定 2 项,审批权限变化 2 项,具体情况如下。\n\n 一、报销标准变化情况\n\n 只调整了差旅费、异地调动邮寄费两项内容。\n\n 1.差旅费。只调整了公司领导出差交通工具标准和出差补贴。\n\n 出差交通工具标准:公司领导(P8)乘坐火车标准(由“不限”标准调低为\n\n“二等座”)、轮船标准(由“二等舱”调低为“三等舱”)。\n\n 出差补贴:原制度描述出差补助为包干制,实际执行时在两项补助之外还存在\n\n报销打车费情况,故取消了原制度中“包干”表述。\n\n 2.异地调动邮寄费。将原制度“可凭据报销一次个人物品邮寄费用,金额超过\n\n1000 元的需事前审批”,调整为“1 元/人/公里内报销,超标自理”。\n\n 二、取消报销规定内容\n\n 因公用车补贴已纳入工资内发放,新制度中取消该费用相关表述。\n\n 三、新增规定内容\n\n 1.异地挂职锻炼补贴标准。经组织安排到异地挂职锻炼、培养锻炼、", + "chunk_order_index": 7, + "full_doc_id": "2c1cb358f08d44ceb0e4d287133206ec", + "file_path": "/app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf", + "llm_cache_list": [], + "create_time": 1779011842, + "update_time": 1779011842, + "_id": "chunk-afc57a0e9548d1f484da6df6c182676b" + }, + "chunk-18d968b78afe916b419c1b5973421ebe": { + "tokens": 1200, + "content": "1000 元的需事前审批”,调整为“1 元/人/公里内报销,超标自理”。\n\n 二、取消报销规定内容\n\n 因公用车补贴已纳入工资内发放,新制度中取消该费用相关表述。\n\n 三、新增规定内容\n\n 1.异地挂职锻炼补贴标准。经组织安排到异地挂职锻炼、培养锻炼、人才帮\n\n扶、借调支援等工作人员,在途期间的交通费、餐补和基本补助按出差规定执行;\n\n在异地单位工作期间,不适用出差补贴标准规定,按照组织人事部确定的挂职人员\n\n报销标准执行;所在单位不安排住宿的,住宿标准按公司酒店住宿限额标准执行。\n\n 2.对使用商旅订票进行了规范。因公出差原则上应使用商旅系统统一预定。\n\n 四、审批权限变化情况\n\n 只调整了“投标保证金”“审批流转程序”两项内容:\n\n 1.调整投标保证金审批权限。因对投标缴纳保证金的时效性要求较高,为提高\n\n审批效率,调整投标保证金审批权限,具体如下(单位:万元):\n\n 第 19 页 共 20 页\n 商密【中】\n 审批权限\n\n 部门经理/\n支出项目 总监/ 副总裁/ 高级副总裁/\n 机构总经理/ 总裁\n 一级部门总经理 总工程师 各委员会主任\n 事业部总经理\n\n保证金 5 50 100 200 500\n\n 2.明确支出审批流转程序。业务流转执行以组织关系为基准的逐级审批规则。\n\n 特殊事项经决策后,可越级至终审岗审批。\n\n 第 20 页 共 20 页\n 商密【中】\n\n# 章节导航\n\n以下内容由入库阶段从制度原文中提取,供检索时优先理解制度层级、条目和标准所在章节。\n\n- 第一章 总则.............................................................. 4\n- 第二章 职责分工 .......................................................... 4\n- 第三章 支出报销申请与审批 ................................................ 6\n- 第四章 重点支出管理规定 .................................................. 7\n- 第五章 附则............................................................. 13\n- 第一章 总则\n- 第二章 职责分工\n- 第三章 支出报销申请与审批\n- 第四章 重点支出管理规定\n- 第五章 附则\n- 一、报销标准变化情况\n- 二、取消报销规定内容\n\n# 重点章节摘录\n\n## 第一章 总则.............................................................. 4\n\n第一条 目的............................................................. 4;第二条 范围............................................................. 4;第三条 管理原则......................................................... 4\n\n## 第二章 职责分工 .......................................................... 4\n\n第四条 归口管理部门主要职责 ............................................. 4;第五条 计划财务部主要职责............................................... 5;第六条 经办部门(个人)主要职责 ......................................... 5\n\n## 第三章 支出报销申请与审批 ................................................ 6\n\n第八条 支出报销申请..................................................... 6;第九条 支出报销审批..................................................... 7;第十条 支出成本中心归属................................................. 7\n\n## 第四章 重点支出管理规定 .................................................. 7\n\n第十一条 备用金借款....................................................... 7;第十二条 市内交通费....................................................... 8;第十三条 差旅费........................................................... 8\n\n## 第五章 附则............................................................. 13\n\n第二十三条 本办法的归口与实施 ........................................... 13;第二十四条 附件 ......................................................... 13;附表 1:员工支出报销审批权限表 ............................................ 14\n\n## 第一章 总则\n\n第一条 目的;为适应远光软件股份有限公司(以下简称“公司”)业务发展需要,优化、完善;支出和报销标准,规范支出业务审批和报销过程,防范经营风险,依据国家有关法律\n\n## 第二章 职责分工\n\n第四条 归口管理部门主要职责;公司实行支出归口管理,归口管理部门主要职责如下:;1 在遵循公司财务、采购、人资等相关制度规定的基础上,根据业务管理需要,\n\n## 第三章 支出报销申请与审批\n\n第八条 支出报销申请;1 申请方式;支出报销申请通过公司财务信息化系统实现(以下简称“系统单据”),财务原\n\n# 问答线索补充\n\n以下内容由入库阶段根据章节标题、条款、列表、键值对与相邻正文提炼,供问答检索时优先命中更短、更直接的制度依据。\n\n- 第一章 总则.............................................................. 4:第一条 目的............................................................. 4\n- 第一章 总则.............................................................. 4:第二条 范围............................................................. 4\n- 第一章 总则................................", + "chunk_order_index": 8, + "full_doc_id": "2c1cb358f08d44ceb0e4d287133206ec", + "file_path": "/app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf", + "llm_cache_list": [], + "create_time": 1779011842, + "update_time": 1779011842, + "_id": "chunk-18d968b78afe916b419c1b5973421ebe" + }, + "chunk-aa5435156b829944c173fa1d2d7a93d4": { + "tokens": 1020, + "content": "问答线索补充\n\n以下内容由入库阶段根据章节标题、条款、列表、键值对与相邻正文提炼,供问答检索时优先命中更短、更直接的制度依据。\n\n- 第一章 总则.............................................................. 4:第一条 目的............................................................. 4\n- 第一章 总则.............................................................. 4:第二条 范围............................................................. 4\n- 第一章 总则.............................................................. 4:第三条 管理原则......................................................... 4\n- 第二章 职责分工 .......................................................... 4:第四条 归口管理部门主要职责 ............................................. 4\n- 第二章 职责分工 .......................................................... 4:第五条 计划财务部主要职责............................................... 5\n- 第二章 职责分工 .......................................................... 4:第六条 经办部门(个人)主要职责 ......................................... 5\n- 第二章 职责分工 .......................................................... 4:第七条 各级管理人员主要职责 ............................................. 5\n- 第三章 支出报销申请与审批 ................................................ 6:第八条 支出报销申请..................................................... 6\n- 第三章 支出报销申请与审批 ................................................ 6:第九条 支出报销审批..................................................... 7\n- 第三章 支出报销申请与审批 ................................................ 6:第十条 支出成本中心归属................................................. 7\n- 第四章 重点支出管理规定 .................................................. 7:第十一条 备用金借款....................................................... 7\n- 第四章 重点支出管理规定 .................................................. 7:第十二条 市内交通费....................................................... 8\n- 第四章 重点支出管理规定 .................................................. 7:第十三条 差旅费........................................................... 8\n- 第四章 重点支出管理规定 .................................................. 7:第十四条 业务招待费...................................................... 11\n- 第五章 附则............................................................. 13:第二十三条 本办法的归口与实施 ........................................... 13\n- 第五章 附则............................................................. 13:第二十四条 附件 ......................................................... 13\n- 第五章 附则............................................................. 13:第 3 页 共 20 页\n- 第一章 总则:第一条 目的\n- 第一章 总则:为适应远光软件股份有限公司(以下简称“公司”)业务发展需要,优化、完善\n- 第一章 总则:支出和报销标准,规范支出业务审批和报销过程,防范经营风险,依据国家有关法律\n- 第一章 总则:第二条 范围\n- 第二章 职责分工:第四条 归口管理部门主要职责\n- 第二章 职责分工:1 在遵循公司财务、采购、人资等相关制度规定的基础上,根据业务管理需要,\n- 第二章 职责分工:确定各项支出业务的开支范围、标准、方式和管理流程\n\n# 结构化表格补充\n\n以下表格由知识归纳阶段依据原文重新整理,供问答检索时优先理解行列关系。\n\n## 表1 交通工具等级标准\n\n| 员工职级 | 飞机 | 火车 | 轮船 | 其他交通工具(不含小汽车) |\n|---|:---:|:---:|:---:|:---:|\n| 公司领导、高层经理、中层经理(P5及以上、外聘专家) | 经济舱 | 火车硬席(硬卧、硬座)、高铁/动车二等座,全列软席列车二等软座 | 三等舱 | 凭据报销 |\n| 基层经理、其他人员(P4及以下) | 经济舱 | 火车硬席(硬卧、硬座)、高铁/动车二等座,全列软席列车二等软座 | 三等舱 | 凭据报销 |\n\n## 表3 出差补贴标准\n\n| 补助类型 | 项目 | 港澳台 | 直辖市/特区/西藏 | 其他地区 | 国外 |\n|---------|------|--------|------------------|---------|------|\n| 餐补 | 自行解决餐食 | 75 | 65 | 55 | 140 |\n| 基本补助 | 基本出差补贴 | 35 | 35 | 35 | 35 |\n| 合计 | - | 110 | 100 | 90 | 175 |", + "chunk_order_index": 9, + "full_doc_id": "2c1cb358f08d44ceb0e4d287133206ec", + "file_path": "/app/server/storage/knowledge/报销制度/2c1cb358f08d44ceb0e4d287133206ec__远光《公司支出管理办法(2024)》.pdf", + "llm_cache_list": [], + "create_time": 1779011842, + "update_time": 1779011842, + "_id": "chunk-aa5435156b829944c173fa1d2d7a93d4" + }, + "chunk-07de6ea74f60535b689f977295770273": { + "tokens": 1200, + "content": "# 产品需求文档\n## 文档信息\n| 项目 | 内容 |\n|------|------|\n| 项目名称 |\n无单报销\n|\n| 版本 | V1.0 |\n| 日期 | 2026-05-06 |\n| 状态 | 正式版 |\n---\n## 1. 项目概述\n### 1.1 项目背景\n面向\n大型企业,\n从业务人员视角出发,解决现有ERP使用体验不佳的问题。\n在ERP的发展历程中,“单据化”曾是财务合规的一大进步,它确保了每笔支出都有据可查。但不可否认,传统的人工填单确实\n也制造了很多\n“枷锁”。在AI时代,解决这一困境的核心逻辑是从“人适应系统”\n转向\n“系统适应人”。\n### 1.2 产品定位\n| 属性 | 说明 |\n|------|------|\n| 产品类型 |\n无单报销工具\n(Web端) |\n| 核心价值 |\n全自动感知、智能风控\n|\n| 目标用户 | 企业业务人员(非财务专业人员) |\n| 使用场景 | 费用报销 |\n### 1.3 产品别名\n-\n产品名称:总裁办\n-\n系统定位:\n影子ERP(Shadow Ledger):本工具将前置于erp系统,用户只需要在工具中操作即完成,将ERP作为后端的\"数据库\"和\"归档库\"。\n零报销(Zero-Expense):业务整理完成即报销、入账,不是\"让报销更快\",而是\"让报销消失\"。\n即效合规:严格遵循财务风控边界,沉淀开箱即用的财务业务专业能力。\n---\n## 2. 用户角色\n### 2.1 系统用户\n| 角色 | 说明 | 权限范围 |\n|------|------|----------|\n| 业务人员 | 发起报销的一线员工 | 发起报销、查看进度、上传凭证 |\n### 2.2 AI助手角色\n| 角色ID | 角色名称 | 职责说明 |\n|--------|----------|----------|\n| 行政秘书 | 行政秘书 | 负责行政事务管理,包括日程安排、会议组织、对外接待等,配合总裁办高效运转 |\n| 费控专责 | 费控专责 | 负责费用审核与控制,确保费用报销符合公司制度和预算要求 |\n| 财务BP | 财务BP | 作为财务业务伙伴,为业务部门提供财务支持和专业建议 |\n| 采购专员 | 采购专员 | 负责采购流程管理,供应商评估与采购执行 |\n---\n## 3. 系统架构\n### 3.1 整体布局\n```\n┌─────────────────────────────────────────────────────────┐\n│ 标题栏 (35px) │\n├────┬────────────┬──────────────────────────────────────┤\n│ 活动栏 │ 侧边栏 │ 主内容区 │\n│(50px)│ (250px) │ │\n│ │ │ ┌────────────────────────────────┐ │\n│ │ │ │ 内容区域 │ │\n│ │ │ │ │ │\n│ │ │ ├────────────────────────────────┤ │\n│ │ │ │ 底部对话栏 (可选展开) │ │\n│ │ │ └────────────────────────────────┘ │\n├────┴────────────┴──────────────────────────────────────┤\n│ 状态栏 (22px) │\n└─────────────────────────────────────────────────────────┘\n```\n### 3.2 配色方案\n| CSS变量 | 颜色值 | 用途 |\n|---------|-------|------|\n| --bg-dark | #ffffff | 主背景色 |\n| --bg-sidebar | #f3f3f3 | 侧边栏背景 |\n| --bg-activity | #f3f3f3 | 活动栏背景 |\n| --bg-title | #dddddd | 标题栏背景 |\n| --bg-hover | #e8e8e8 | 悬停背景 |\n| --bg-active | #d4d4d4 | 激活背景 |\n| --border-color | #e1e1e1 | 边框色 |\n| --text-primary | #333333 | 主文字色 |\n| --text-secondary | #6e6e6e | 辅文字色 |\n| --text-bright | #000000 | 高亮文字 |\n| --accent | #007acc | 强调色(主按钮) |\n| --accent-hover | #005a9e | 强调色(悬停) |\n| --danger | #d32f2f | 危险/错误色 |\n| --icon-color | #333333 | 图标色 |\n| --transition | all 0.15s ease | 过渡动画 |\n---\n## 4. 功能需求\n### 4.1 功能模块总览\n```\n┌─────────────────────────────────────────────────────────────┐\n│ 总裁办 │\n├─────────────────────────────────────────────────────────────┤\n│\n菜单2\n. 事项\n列表\n│\n│ -\n全部\n事项 │\n├─────────────────────────────────────────────────────────────┤\n│\n菜单1\n. 无单报销 │\n│ - 发起事项 │\n│ -\n附件\n上传\n/小程序码上传\n│\n│ - 时间轨迹 │\n│ - AI预审 │\n│ - 提交报销 │\n├", + "chunk_order_index": 0, + "full_doc_id": "a8f8465df08e455ebe133351721d49f8", + "file_path": "/app/server/storage/knowledge/报销制度/a8f8465df08e455ebe133351721d49f8__无单需求文档0506.docx", + "llm_cache_list": [], + "create_time": 1779378923, + "update_time": 1779378923, + "_id": "chunk-07de6ea74f60535b689f977295770273" + }, + "chunk-99c6f377dff2b9a37a7214b7b05ea9a8": { + "tokens": 1200, + "content": "裁办 │\n├─────────────────────────────────────────────────────────────┤\n│\n菜单2\n. 事项\n列表\n│\n│ -\n全部\n事项 │\n├─────────────────────────────────────────────────────────────┤\n│\n菜单1\n. 无单报销 │\n│ - 发起事项 │\n│ -\n附件\n上传\n/小程序码上传\n│\n│ - 时间轨迹 │\n│ - AI预审 │\n│ - 提交报销 │\n├─────────────────────────────────────────────────────────────┤\n│\n功能点3\n. AI助手 │\n│ - 全局对话 │\n├─────────────────────────────────────────────────────────────┤\n│\n功能点\n4. 用户中心 │\n│ - 个人中心 │\n│ - 登出 │\n└─────────────────────────────────────────────────────────────┘\n```\n---\n### 4.2\n菜单2\n:事项\n列表\n#### 4.2.1 侧边栏菜单\n| 菜单项 | 显示内容 | 提醒 |\n|--------|---------|------|\n| 无单报销 | 主菜单 |\n无\n|\n|\n事项列表\n| 待办事项数 | 红色\n图标\n显示\n待办\n数量 |\n#### 4.2.2 功能说明\n-\n用户可查看待处理和已处理的事项列表\n-\n每条事项显示:事项摘要、金额、状态、截止时间\n-\n\n双击每条\n事项可查看详情\n- 列字段可筛选\n序\n业务类型\n事项摘要\n金额\n状态\n发起时间\n最后修改时间\n1\n差旅\nQ1季度业务进展汇报\n1678.20\n未提交\n2026-4-6 12:33\n:\n00\n2026-4-\n22\n12:33\n:\n00\n2\n差旅\n参加\n2026全国AI\n技术峰会(合肥)\n3498.39\n未提交\n2026-4-\n8\n\n0\n2:33\n:\n00\n2026-4-\n15\n\n12\n:\n41:\n00\n3\n差旅\n智慧平台江苏省公司运营支持\n1345.87\n已提交\n2026-4-\n12\n\n09\n:\n5\n3\n:12\n2026-4-\n15\n\n10\n:\n5\n3\n:00\n---\n### 4.3 模块2:无单报销\n#### 4.3.1 发起事项\n用户可通过以下方式发起报销:\n| 发起方式 | 说明 |\n|----------|------|\n| 发起事项 | 点击\"发起事项\"按钮,上传本机附件,系统自动整理账单 |\n| 小程序码 | 点击\"小程序码\"按钮,通过小程序扫码上传手机中的文件 |\n#### 4.3.2 凭证上传\n点击后弹出文件夹上传,或直接拖拽文件。\n| 功能点 | 说明 |\n|--------|------|\n| 拖拽上传 | 支持将文件拖入上传区域 |\n| 点击上传 | 点击上传区域选择文件 |\n| 文件格式 | 支持PDF、JPG、JPEG、PNG\n、XLSX\n|\n| 多文件上传 | 支持同时上传多个文件 |\n| 文件预览 | 上传后显示文件缩略图列表 |\n| 重置 | 支持清空已上传文件重新选择 |\n| 确定 | 确认文件并进入下一步 |\n点击确认后开始生成时间轨迹图。\n#### 4.3.3 时间轨迹\n上传文件后显示时间轨迹,格式如下:\n#####\n时间轨迹\n| 字段 | 说明 |\n|------|------|\n|\n名称\n|\n自动命名为摘要+时间轨迹图,如:“Q1季度业务进展汇报差旅时间轨迹图”\n\n、后续如有其他时间类型如:“高校教师产学研项目调研业务招待时间轨迹图”\n|\n|\n时间\n|\n年/月/日-年/月/日\n|\n|\n地点\n|\n如:北京-上海-北京\n|\n|\n总支出\n|\n等于商旅预订+线下支付,如:7655.00\n|\n|\n商旅预订\n|\n如:5990.00\n|\n|\n线下自付\n|\n如:1665.00\n|\n#####\n详细\n字段\n| 字段 | 说明 |\n|------|------|\n|\n时间\n|\n日/月\n|\n| 图标 | 交通\n(出发/到达)\n/住宿 |\n|\n城市\n|\n所在城市名称\n|\n|\n描述\n|\n如:北京大兴机场-武汉天河机场 CZ3118\n|\n| 金额 | 费用金额 |\n| 凭证缩略图 | 已上传凭证的缩略预览 |\n| 问题标记 | ⚠缺失凭证等问题的提示 |\n##### 账单项目类型\n| 类型 | 图标颜色 | 示例 |\n|------|---------|------|\n| 交通 | 蓝色 | 高铁、出租车 |\n| 住宿 | 紫色 | 酒店住宿 |\n| 商旅预订 | 绿色 | 带\"商旅预订\"标签 |\n|\n线下自付\n|\n橙\n色 | 带\"\n线下自付\n\"标签 |\n##### 问题项目标识\n-\n显示问题图标(⚠)\n-\n显示问题描述文字(如\"缺少支付凭证截图\")\n-\n提供\"补充上传\"按钮\n#### 4.3.4 凭证识别\n点击凭证缩略图可查看自动识别的", + "chunk_order_index": 1, + "full_doc_id": "a8f8465df08e455ebe133351721d49f8", + "file_path": "/app/server/storage/knowledge/报销制度/a8f8465df08e455ebe133351721d49f8__无单需求文档0506.docx", + "llm_cache_list": [], + "create_time": 1779378923, + "update_time": 1779378923, + "_id": "chunk-99c6f377dff2b9a37a7214b7b05ea9a8" + }, + "chunk-1746bd83138e85e66a78e0cb9ad79272": { + "tokens": 1200, + "content": "带\"商旅预订\"标签 |\n|\n线下自付\n|\n橙\n色 | 带\"\n线下自付\n\"标签 |\n##### 问题项目标识\n-\n显示问题图标(⚠)\n-\n显示问题描述文字(如\"缺少支付凭证截图\")\n-\n提供\"补充上传\"按钮\n#### 4.3.4 凭证识别\n点击凭证缩略图可查看自动识别的凭证信息:\n| 字段 | 说明 |\n|------|------|\n| 凭证标题 | 如\"高铁火车票\" |\n| 识别结果 | 各项识别内容(出发地、目的地、车次、座位、票价、日期等) |\n| 发票类型 | 凭证类型描述 |\n| 合规检查 | ✓ 通过 / ✗ 不通过 |\n##### 支持的凭证类型\n| 凭证类型 | 识别字段 |\n|----------|----------|\n| 火车票 | 出发地、目的地、车次、座位、票价、日期 |\n| 出租车发票\n及行程单\n| 车号、日期、时间、起点、终点、金额 |\n| 住宿发票\n及流水\n| 酒店名称、入住日期、退房日期、天数、房型、金额 |\n|\n公共交通\n发票\n及行程单\n| 日期、时间、起点、终点、金额 |\n|\n飞机\n票\n行程单\n| 出发地、目的地、\n航班号\n、座位、票价、日期\n、税额\n|\n#### 4.3.5 AI预审\n预审按钮在时间轨迹图的末尾行区域\n点击\"预审\"按钮执行AI预审:\n| 功能点 | 说明 |\n|--------|------|\n| 完整性检查 | 检查各项凭证是否完整 |\n| 合规性检查 | 检查是否符合费用标准 |\n| 问题标注 | 自动标注问题项 |\n附:审核点\n序\n检查项\n是/否\n类型\n1\n上传附件中是否有商旅附件信息?\n是(2)/否(提示:请补充商旅附件)\n完整性\n2\n检查商旅附件上是否有预订火车票信息?\n是(3)/否(✅)\n完整性\n3\n商旅附件预订火车票信息是否均有上传对应的报销凭证?\n是(✅)/否(提示:请补充xxx-xxx的火车票报销凭证)\n完整性\n4\n根据商旅附件上的出差起始地和到达地(如有途经地也要包含)检查出发和返回所到的城市轨迹是否为闭环,即有去有回?(远距离跨城:火车+火车、飞机+火车、飞机+飞机需要闭环;近距离跨城或市内:汽车+汽车、汽车+打车、打车+打车、打车+公交地铁、公共地铁+公交地铁、汽车+公交地铁需要闭环)\n是(✅)/否(5)\n完整性\n5\n如果商旅附件中有行程非闭环,需要检查此段行程是否有上传的对应的报销凭证,火车或飞机行程的,除了票据外,还需要检查是否有线下预订的审批邮件、线下预订的支付凭证截图。\n是(✅)/否(提示1:xxx-xxx行程断档,请提供相应的报销凭证,如是线下预订请提供审批邮件和支付截图。2:xxx-xxx行程火车/飞机票未通过商旅预订,请提供审批邮件和支付截图。)\n完整性\n6\n检查商旅附件上的酒店住宿城市与出差所在城市是否相符?\n是(✅)/否(提示:出差目的地为xxx,住宿城市为xxx,请解释说明)\n合规性\n7\n检查商旅附件上的酒店住宿天数(如有线下预订也要算上)与出差时间是否相符?(尤其是住宿天数大于出差天数时,并且出差天数根据交通轨迹来计算比商旅附件上的更准确)\n是(✅)/否(提示:出差天数\nx\n天,酒店住宿x天,请解释说明不符原因)\n合规性\n8\n检查上传附件中是否有酒店住宿凭证(发票、线下预订审批邮件、支付截图)?\n是(9)/否(✅)\n完整性\n9\n检查上传附件中的酒店住宿凭证,与商旅附件是否有重合?\n是(提示:线上线下酒店预订有重合,请检查)/否(✅)\n合规性\n10\n检查上传附件中的汽车、打车、公交地铁时间,与火车飞机的行程时间是否有重合?\n是(提示:xxx-xxx行程与xxx-xxx行程时间有重合,请检查)/否(✅)\n合规性\n11\n检查线下预订火车票是否超标?\n是(提示:火车票\nxxx\n超标,请检查)/否(✅)\n合规性\n12\n检查线下预订飞机票是否超标?\n是(提示:飞机票\nxxx\n超标,请检查)/否(✅)\n合规性\n13\n检查线下", + "chunk_order_index": 2, + "full_doc_id": "a8f8465df08e455ebe133351721d49f8", + "file_path": "/app/server/storage/knowledge/报销制度/a8f8465df08e455ebe133351721d49f8__无单需求文档0506.docx", + "llm_cache_list": [], + "create_time": 1779378923, + "update_time": 1779378923, + "_id": "chunk-1746bd83138e85e66a78e0cb9ad79272" + }, + "chunk-ce44e4483e4119265b43eacb72e0326a": { + "tokens": 1200, + "content": "xxx-xxx行程时间有重合,请检查)/否(✅)\n合规性\n11\n检查线下预订火车票是否超标?\n是(提示:火车票\nxxx\n超标,请检查)/否(✅)\n合规性\n12\n检查线下预订飞机票是否超标?\n是(提示:飞机票\nxxx\n超标,请检查)/否(✅)\n合规性\n13\n检查线下预订住宿酒店是否超标?\n是(提示:x月x日酒店住宿xxx元已超标,请检查)/否(✅)\n合规性\n14\n检查出租车行程时间是否在夜间22:00之后,如果不是需要补充说明\n是(提示:请补充打车说明)/否(✅)\n合规性\n15\n检查如果有出租车发票,需要同步提供行程单\n是(提示:请补充发票xxxx(金额xxx)对应的行程单)/否(✅)\n完整性\n16\n检查如果有机场大巴汽车票,需要同步提供车票或预订截图\n是(提示:请补充车票或预订截图/否(✅)\n完整性\n17\n检查如果有地铁发票,需要同步提提供地铁行程截图和支付截图\n是(提示:请补充行程截图和支付截图/否(✅)\n完整性\n18\n发票抬头检查,所有车票、发票抬头必须是\nxxxxxxx\n,否则为开错\n是(✅)/否(提示:票据xxxx抬头错误,请检查)\n合规性\n##### 预审结果\n-\n正常项目:标记为\"已修复\"/\"issue-fixed\"\n-\n问题项目:\n-\n显示\"⚠\"图标\n-\n显示问题描述\n-\n提供\"补充上传\"按钮\n-\n问题汇总:显示\"预审发现问题(N项)\"及具体描述\n##### 预审通过\n-\n提示\"预审通过!所有单据完整且合规。\"\n#### 4.3.6 提交报销\n点击\"去报销吧\"按钮:\n| 步骤 | 说明 |\n|------|------|\n| 确认提示 | \"请注意:总裁办去报销了,前期事务已完结且不可回退。\" |\n| 提交 | 确认后提交报销申请 |\n| 结果提示 | \"已提交报销申请,等待审批...\" |\n---\n### 4.4 模块3:AI助手\n#### 4.4.1 全局对话栏\n底部悬浮对话栏,支持快速交互:\n| 功能点 | 说明 |\n|--------|------|\n| 触发区域 | 点击展开对话栏 |\n| 展开/收起 | 点击按钮切换状态 |\n| 欢迎消息 | \"您好!有什么可以帮您?\" |\n| 快捷回复 | 显示可用的操作选项 |\n| 消息输入 | 支持输入文字消息 |\n| 发送 | 支持点击发送和回车发送 |\n##### 消息类型\n| 类型 | 说明 |\n|------|------|\n| 用户消息 | 右侧显示,蓝色背景 |\n| AI回复 | 左侧显示,灰色背景 |\n#### 4.4.2 召唤面板\n点击\"召唤\"入口显示召唤面板:\n| 功能 | 说明 |\n|------|------|\n| 模式切换 | 编辑指令 / 选择助理 |\n| 编辑指令 | 文本框输入自定义指令 |\n| 选择助理 | 预设助理卡片列表,单选 |\n##### 预设助理卡片\n| 卡片 | 内容 |\n|------|------|\n| 头像 | 渐变色背景 |\n| 名称 | 角色名称 |\n| 设置 | 点击可配置角色信息 |\n##### 角色配置弹窗\n| 字段 | 说明 |\n|------|------|\n| 角色名称 | 可编辑的助手名称 |\n| 角色设定 | 角色的职责描述 |\n| Prompt | AI提示词模板 |\n#### 4.4.3 角色Prompt模板\n| 角色 | Prompt格式 |\n|------|-----------|\n| 行政秘书 | 角色:{role}\\n\\n请帮我处理以下行政事务:\\n{task}\\n\\n要求:\\n1. 严格按照公司制度执行\\n2. 注意保密事项\\n3. 及时反馈进度 |\n| 费控专责 | 角色:{role}\\n\\n请帮我审核以下费用报销:\\n{expense}\\n\\n要求:\\n1. 核对发票真实性\\n2. 检查是否符合费用标准\\n3. 确认预算充足 |\n| 财务BP | 角色:{role}\\n\\n请帮我分析以下财务问题:\\n{question}\\n\\n要求:\\n1. 提供专业财务建议\\n2. 注意合规性\\n3. 兼顾业务发展 |\n| 采购专员 | 角色:{role}\\n\\n请帮我处理以下采购事项:\\n{purchase}\\n\\n要求:\\n1. 遵循采购流程\\n2. 比价择优\\n3. 记录台账 |\n---\n### 4.5 模块4:用户中心\n#### 4.5.1 用户菜单\n点击头像显示下拉菜单:\n| 项目 | 说明 |\n|------|------|", + "chunk_order_index": 3, + "full_doc_id": "a8f8465df08e455ebe133351721d49f8", + "file_path": "/app/server/storage/knowledge/报销制度/a8f8465df08e455ebe133351721d49f8__无单需求文档0506.docx", + "llm_cache_list": [], + "create_time": 1779378923, + "update_time": 1779378923, + "_id": "chunk-ce44e4483e4119265b43eacb72e0326a" + }, + "chunk-2187fa0609874bdda339c9850da45a26": { + "tokens": 1134, + "content": "业务发展 |\n| 采购专员 | 角色:{role}\\n\\n请帮我处理以下采购事项:\\n{purchase}\\n\\n要求:\\n1. 遵循采购流程\\n2. 比价择优\\n3. 记录台账 |\n---\n### 4.5 模块4:用户中心\n#### 4.5.1 用户菜单\n点击头像显示下拉菜单:\n| 项目 | 说明 |\n|------|------|\n| 用户名 | 当前登录用户 |\n| 组织 | 所属组织名称(如\"Ashy有限公司本部\") |\n| 设置 | 跳转设置页面 |\n| 登出 | 退出登录 |\n---\n### 4.6 模块5:扫码上传\n#### 4.6.1 扫码入口\n| 位置 | 形式 |\n|------|------|\n| 活动栏 | 扫码图标按钮 |\n| 主内容区 | 小程序码卡片(悬浮) |\n| 底部浮动 | 扫码图标(悬停提示) |\n#### 4.6.2 功能说明\n-\n点击提示:\"请使用小程序码扫码,在手机上选择文件上传\"\n---\n### 4.7 模块6:状态栏\n底部状态栏显示:\n| 显示内容 | 说明 |\n|----------|------|\n| 行列号 | 当前光标位置 |\n| 编码 | UTF-8 |\n| 工作台 | 总裁办 |\n---\n## 5. 界面要求\n### 5.1 布局规格\n| 区域 | 高度/宽度 | 说明 |\n|------|-----------|------|\n| 标题栏 | 35px | 顶部固定 |\n| 活动栏 | 50px | 左侧固定 |\n| 侧边栏 | 250px | 可折叠 |\n| 状态栏 | 22px | 底部固定 |\n| 底部对话栏 | 可变 | 展开高度280px,收起高度约44px |\n### 5.2 交互规范\n| 交互 | 效果 |\n|------|------|\n| 按钮悬停 | 背景色变化,transition 0.15s |\n| 卡片悬停 | 背景色变化 |\n| 模态框 | 点击外部关闭 |\n| 下拉菜单 | 点击外部关闭 |\n| 侧边栏折叠 | 宽度过渡0.2s |\n---\n## 6. 数据流程\n### 6.1 报销流程\n```\n1. 发起事项 → 2. 上传凭证 → 3. 生成时间轨迹 → 4. AI预审\n(循环)\n→ 5.\n修改(循环)\n→\n6\n.\n提\n交报销\n```\n### 6.2 凭证处理流程\n```\n上传文件 → 自动识别 → 生成时间轨迹 → 显示凭证缩略图 → 可查看详情\n```\n### 6.3 AI预审流程\n```\n点击预审 → 检查完整性 → 检查合规性 → 标注问题 → 显示结果\n```\n---\n\n# 问答线索补充\n\n以下内容由入库阶段根据章节标题、条款、列表、键值对与相邻正文提炼,供问答检索时优先命中更短、更直接的制度依据。\n\n- 正文:# 产品需求文档\n- 正文:## 1. 项目概述\n- 正文:### 1.1 项目背景\n- 正文:从业务人员视角出发,解决现有ERP使用体验不佳的问题\n- 正文:“枷锁”\n- 正文:在AI时代,解决这一困境的核心逻辑是从“人适应系统”\n- 正文:“系统适应人”\n- 正文:### 1.2 产品定位\n- 正文:无单报销工具\n- 正文:### 1.3 产品别名\n- 正文:产品名称:总裁办\n- 正文:影子ERP(Shadow Ledger):本工具将前置于erp系统,用户只需要在工具中操作即完成,将ERP作为后端的\"数据库\"和\"归档库\"\n- 正文:零报销(Zero-Expense):业务整理完成即报销、入账,不是\"让报销更快\",而是\"让报销消失\"\n- 正文:即效合规:严格遵循财务风控边界,沉淀开箱即用的财务业务专业能力\n- 正文:## 2. 用户角色\n- 正文:### 2.1 系统用户\n- 正文:### 2.2 AI助手角色\n- 正文:## 3. 系统架构\n- 正文:### 3.1 整体布局\n- 正文:│ 标题栏 (35px) │\n- 正文:│(50px)│ (250px) │ │\n- 正文:│ 状态栏 (22px) │\n- 正文:### 3.2 配色方案\n- 正文:## 4. 功能需求", + "chunk_order_index": 4, + "full_doc_id": "a8f8465df08e455ebe133351721d49f8", + "file_path": "/app/server/storage/knowledge/报销制度/a8f8465df08e455ebe133351721d49f8__无单需求文档0506.docx", + "llm_cache_list": [], + "create_time": 1779378923, + "update_time": 1779378923, + "_id": "chunk-2187fa0609874bdda339c9850da45a26" + }, + "chunk-2224d777c0b72d0b2dab622c79096c2c": { + "tokens": 34, + "content": "│ 状态栏 (22px) │\n- 正文:### 3.2 配色方案\n- 正文:## 4. 功能需求", + "chunk_order_index": 5, + "full_doc_id": "a8f8465df08e455ebe133351721d49f8", + "file_path": "/app/server/storage/knowledge/报销制度/a8f8465df08e455ebe133351721d49f8__无单需求文档0506.docx", + "llm_cache_list": [], + "create_time": 1779378923, + "update_time": 1779378923, + "_id": "chunk-2224d777c0b72d0b2dab622c79096c2c" + } } \ No newline at end of file diff --git a/server/tests/test_expense_claim_service.py b/server/tests/test_expense_claim_service.py index 15766fc..2bda007 100644 --- a/server/tests/test_expense_claim_service.py +++ b/server/tests/test_expense_claim_service.py @@ -136,7 +136,9 @@ def test_save_or_submit_preview_does_not_create_claim_without_explicit_action() assert result["preview_only"] is True assert result["status"] == "preview" - assert "差旅费按“交通票据金额 + 住宿标准 × 出差天数 + 出差补贴 × 出差天数”估算" in result["message"] + assert "报销测算参考:" in result["message"] + assert "| 项目 | 当前信息 | 复核口径 |" in result["message"] + assert "交通票据金额 + 住宿标准" not in result["message"] assert _count_claims(db) == before_count @@ -598,6 +600,91 @@ def test_upsert_draft_from_ontology_supports_link_or_create_for_multi_documents( assert float(new_claim.amount) == 50.5 +def test_link_existing_draft_blocks_duplicate_uploaded_invoice() -> None: + user_id = "duplicate@example.com" + + with build_session() as db: + employee = Employee( + employee_no="E5010", + name="重复票据员工", + email=user_id, + ) + db.add(employee) + db.flush() + existing_claim = ExpenseClaim( + claim_no="EXP-202605-021", + employee_id=employee.id, + employee_name="重复票据员工", + department_name="销售部", + project_code=None, + expense_type="transport", + reason="原有交通报销", + location="上海", + amount=Decimal("32.50"), + currency="CNY", + invoice_count=1, + occurred_at=datetime(2026, 5, 13, tzinfo=UTC), + status="draft", + approval_stage="待提交", + risk_flags_json=[], + ) + existing_claim.items = [ + ExpenseClaimItem( + claim_id=existing_claim.id, + item_date=date(2026, 5, 13), + item_type="transport", + item_reason="原有交通报销", + item_location="上海", + item_amount=Decimal("32.50"), + invoice_id="didi-trip.png", + ) + ] + db.add(existing_claim) + db.commit() + + context_json = { + "name": "重复票据员工", + "review_action": "link_to_existing_draft", + "draft_claim_id": existing_claim.id, + "attachment_names": ["didi-trip.png"], + "attachment_count": 1, + "ocr_documents": [ + { + "filename": "didi-trip.png", + "summary": "滴滴出行 支付金额 32.50 元", + "text": "滴滴出行 支付金额 32.50 元", + "document_type": "taxi_receipt", + "scene_code": "transport", + "document_fields": [{"key": "amount", "label": "支付金额", "value": "32.50"}], + } + ], + } + ontology = SemanticOntologyService(db).parse( + OntologyParseRequest( + query="把这张票据关联到已有草稿", + user_id=user_id, + context_json=context_json, + ) + ) + + result = ExpenseClaimService(db).upsert_draft_from_ontology( + run_id=ontology.run_id, + user_id=user_id, + message="把这张票据关联到已有草稿", + ontology=ontology, + context_json=context_json, + ) + + db.refresh(existing_claim) + assert result["duplicate_attachment_blocked"] is True + assert result["submission_blocked"] is True + assert "重复" in result["message"] + assert "重新上传不同的票据" in result["message"] + assert len(existing_claim.items) == 1 + assert existing_claim.invoice_count == 1 + assert float(existing_claim.amount) == 32.5 + + def test_upsert_travel_draft_uses_ticket_item_types_and_auto_allowance() -> None: user_id = "travel-allowance@example.com" diff --git a/server/tests/test_user_agent_service.py b/server/tests/test_user_agent_service.py index 3f75d40..e8a3399 100644 --- a/server/tests/test_user_agent_service.py +++ b/server/tests/test_user_agent_service.py @@ -16,114 +16,114 @@ from app.schemas.user_agent import UserAgentCitation, UserAgentRequest, UserAgen 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]: - engine = create_engine( - "sqlite+pysqlite:///:memory:", - connect_args={"check_same_thread": False}, - poolclass=StaticPool, - ) - Base.metadata.create_all(bind=engine) - return sessionmaker(bind=engine, autoflush=False, autocommit=False) - - -def test_user_agent_query_returns_readable_answer_and_actions() -> None: - session_factory = build_session_factory() - with session_factory() as db: - ontology = SemanticOntologyService(db).parse( - OntologyParseRequest( - query="张三 4 月差旅报销金额是多少", - user_id="pytest", - ) - ) - response = UserAgentService(db).respond( - UserAgentRequest( - run_id=ontology.run_id, - user_id="pytest", - message="张三 4 月差旅报销金额是多少", - ontology=ontology, - tool_payload={"record_count": 2, "total_amount": 8800.0}, - ) - ) - - assert "8800.00" in response.answer - assert len(response.suggested_actions) >= 1 - - -def test_user_agent_returns_readable_query_answer_when_runtime_model_is_skipped(monkeypatch) -> None: - session_factory = build_session_factory() - with session_factory() as db: - ontology = SemanticOntologyService(db).parse( - OntologyParseRequest( - query="张三 4 月差旅报销金额是多少", - user_id="pytest", - ) - ) - service = UserAgentService(db) - monkeypatch.setattr(service, "_generate_answer_with_model", lambda *args, **kwargs: "这是模型回答") - - response = service.respond( - UserAgentRequest( - run_id=ontology.run_id, - user_id="pytest", - message="张三 4 月差旅报销金额是多少", - ontology=ontology, - tool_payload={"record_count": 2, "total_amount": 8800.0}, - ) - ) - - assert "共 2 笔" in response.answer - assert "8800.00" in response.answer - - -def test_user_agent_sanitizes_model_thinking_blocks() -> None: - session_factory = build_session_factory() - with session_factory() as db: - service = UserAgentService(db) - - assert ( - service._sanitize_model_answer("内部推理\n最终答复") - == "最终答复" - ) - - -def test_user_agent_rejects_visible_reasoning_drafts() -> None: - session_factory = build_session_factory() - with session_factory() as db: - service = UserAgentService(db) - - assert ( - service._sanitize_model_answer( - "用户问的是:住宿费怎么算?\n让我分析一下:\n1. 实体识别..." - ) - is None - ) - - + + +def build_session_factory() -> sessionmaker[Session]: + engine = create_engine( + "sqlite+pysqlite:///:memory:", + connect_args={"check_same_thread": False}, + poolclass=StaticPool, + ) + Base.metadata.create_all(bind=engine) + return sessionmaker(bind=engine, autoflush=False, autocommit=False) + + +def test_user_agent_query_returns_readable_answer_and_actions() -> None: + session_factory = build_session_factory() + with session_factory() as db: + ontology = SemanticOntologyService(db).parse( + OntologyParseRequest( + query="张三 4 月差旅报销金额是多少", + user_id="pytest", + ) + ) + response = UserAgentService(db).respond( + UserAgentRequest( + run_id=ontology.run_id, + user_id="pytest", + message="张三 4 月差旅报销金额是多少", + ontology=ontology, + tool_payload={"record_count": 2, "total_amount": 8800.0}, + ) + ) + + assert "8800.00" in response.answer + assert len(response.suggested_actions) >= 1 + + +def test_user_agent_returns_readable_query_answer_when_runtime_model_is_skipped(monkeypatch) -> None: + session_factory = build_session_factory() + with session_factory() as db: + ontology = SemanticOntologyService(db).parse( + OntologyParseRequest( + query="张三 4 月差旅报销金额是多少", + user_id="pytest", + ) + ) + service = UserAgentService(db) + monkeypatch.setattr(service, "_generate_answer_with_model", lambda *args, **kwargs: "这是模型回答") + + response = service.respond( + UserAgentRequest( + run_id=ontology.run_id, + user_id="pytest", + message="张三 4 月差旅报销金额是多少", + ontology=ontology, + tool_payload={"record_count": 2, "total_amount": 8800.0}, + ) + ) + + assert "共 2 笔" in response.answer + assert "8800.00" in response.answer + + +def test_user_agent_sanitizes_model_thinking_blocks() -> None: + session_factory = build_session_factory() + with session_factory() as db: + service = UserAgentService(db) + + assert ( + service._sanitize_model_answer("内部推理\n最终答复") + == "最终答复" + ) + + +def test_user_agent_rejects_visible_reasoning_drafts() -> None: + session_factory = build_session_factory() + with session_factory() as db: + service = UserAgentService(db) + + assert ( + service._sanitize_model_answer( + "用户问的是:住宿费怎么算?\n让我分析一下:\n1. 实体识别..." + ) + is None + ) + + def test_user_agent_knowledge_prompt_enforces_knowledge_boundary() -> None: - session_factory = build_session_factory() - with session_factory() as db: - ontology = SemanticOntologyService(db).parse( - OntologyParseRequest( - query="住宿费标准是多少?", - user_id="pytest", - context_json={"session_type": "knowledge"}, - ) - ) - service = UserAgentService(db) + session_factory = build_session_factory() + with session_factory() as db: + ontology = SemanticOntologyService(db).parse( + OntologyParseRequest( + query="住宿费标准是多少?", + user_id="pytest", + context_json={"session_type": "knowledge"}, + ) + ) + service = UserAgentService(db) messages = service._build_model_messages( - UserAgentRequest( - run_id=ontology.run_id, - user_id="pytest", - message="住宿费标准是多少?", - ontology=ontology, - tool_payload={"result_type": "knowledge_search", "hits": []}, - ), - citations=[], - suggested_actions=[], - risk_flags=[], - draft_payload=None, + UserAgentRequest( + run_id=ontology.run_id, + user_id="pytest", + message="住宿费标准是多少?", + ontology=ontology, + tool_payload={"result_type": "knowledge_search", "hits": []}, + ), + citations=[], + suggested_actions=[], + risk_flags=[], + draft_payload=None, fallback_answer="", ) assert "只能依据 facts.tool_payload.hits、facts.knowledge_answer_evidence" in messages[0]["content"] @@ -441,61 +441,61 @@ def test_user_agent_model_prompt_supports_contextual_personalization() -> None: with session_factory() as db: ontology = SemanticOntologyService(db).parse( OntologyParseRequest( - query="我能坐什么舱位?", - user_id="pytest", - ) - ) - service = UserAgentService(db) - messages = service._build_model_messages( - UserAgentRequest( - run_id=ontology.run_id, - user_id="pytest", - message="我能坐什么舱位?", - ontology=ontology, - context_json={ - "name": "张三", - "position": "财务分析师", - "grade": "P5", - "role": "财务人员", - "role_codes": ["finance"], - }, - tool_payload={}, - ), - citations=[], - suggested_actions=[], - risk_flags=[], - draft_payload=None, - fallback_answer="", - ) - - system_prompt = messages[0]["content"] - user_prompt = messages[1]["content"] + query="我能坐什么舱位?", + user_id="pytest", + ) + ) + service = UserAgentService(db) + messages = service._build_model_messages( + UserAgentRequest( + run_id=ontology.run_id, + user_id="pytest", + message="我能坐什么舱位?", + ontology=ontology, + context_json={ + "name": "张三", + "position": "财务分析师", + "grade": "P5", + "role": "财务人员", + "role_codes": ["finance"], + }, + tool_payload={}, + ), + citations=[], + suggested_actions=[], + risk_flags=[], + draft_payload=None, + fallback_answer="", + ) + + system_prompt = messages[0]["content"] + user_prompt = messages[1]["content"] assert "context.user_grade" in system_prompt assert "conversation_history" in user_prompt - assert '"user_name": "张三"' in user_prompt - assert '"user_position": "财务分析师"' in user_prompt - assert '"user_grade": "P5"' in user_prompt - - + assert '"user_name": "张三"' in user_prompt + assert '"user_position": "财务分析师"' in user_prompt + assert '"user_grade": "P5"' in user_prompt + + def test_user_agent_guides_generic_expense_request() -> None: session_factory = build_session_factory() with session_factory() as db: - ontology = SemanticOntologyService(db).parse( - OntologyParseRequest( - query="我要报销", - user_id="pytest", - ) - ) - response = UserAgentService(db).respond( - UserAgentRequest( - run_id=ontology.run_id, - user_id="pytest", - message="我要报销", - ontology=ontology, - tool_payload={"record_count": 9, "total_amount": 12345.0}, - ) - ) - + ontology = SemanticOntologyService(db).parse( + OntologyParseRequest( + query="我要报销", + user_id="pytest", + ) + ) + response = UserAgentService(db).respond( + UserAgentRequest( + run_id=ontology.run_id, + user_id="pytest", + message="我要报销", + ontology=ontology, + tool_payload={"record_count": 9, "total_amount": 12345.0}, + ) + ) + assert response.review_payload is None assert response.draft_payload is None assert "请先在下面选择报销场景" in response.answer @@ -605,67 +605,68 @@ def test_user_agent_continues_identification_after_expense_type_selection() -> N def test_user_agent_guides_implicit_expense_draft_request() -> None: session_factory = build_session_factory() with session_factory() as db: - today = datetime.now(UTC).date().isoformat() - ontology = SemanticOntologyService(db).parse( - OntologyParseRequest( - query="我今天去客户现场,招待了客户,花销了1000元", - user_id="pytest", - ) - ) - response = UserAgentService(db).respond( - UserAgentRequest( - run_id=ontology.run_id, - user_id="pytest", - message="我今天去客户现场,招待了客户,花销了1000元", - ontology=ontology, - tool_payload={"draft_only": True}, - ) - ) - - assert response.review_payload is not None - assert response.answer == response.review_payload.body_message - assert response.review_payload.intent_summary.startswith("识别到您希望报销一笔“业务招待费”费用。") + today = datetime.now(UTC).date().isoformat() + ontology = SemanticOntologyService(db).parse( + OntologyParseRequest( + query="我今天去客户现场,招待了客户,花销了1000元", + user_id="pytest", + ) + ) + response = UserAgentService(db).respond( + UserAgentRequest( + run_id=ontology.run_id, + user_id="pytest", + message="我今天去客户现场,招待了客户,花销了1000元", + ontology=ontology, + tool_payload={"draft_only": True}, + ) + ) + + assert response.review_payload is not None + assert response.answer == response.review_payload.body_message + assert response.review_payload.intent_summary.startswith("识别到您希望报销一笔“业务招待费”费用:") + assert "基础信息识别结果:" in response.review_payload.intent_summary assert response.review_payload.missing_slots == ["客户名称", "参与人员", "票据附件"] assert [item.action_type for item in response.review_payload.confirmation_actions] == [ "save_draft", ] - - slot_map = {item.key: item for item in response.review_payload.slot_cards} - assert slot_map["expense_type"].value == "业务招待费" - assert slot_map["time_range"].value == today - assert slot_map["time_range"].raw_value == "今天" - assert slot_map["location"].value == "客户现场" - assert slot_map["amount"].value == "1000.00元" - - + + slot_map = {item.key: item for item in response.review_payload.slot_cards} + assert slot_map["expense_type"].value == "业务招待费" + assert slot_map["time_range"].value == today + assert slot_map["time_range"].raw_value == "今天" + assert slot_map["location"].value == "客户现场" + assert slot_map["amount"].value == "1000.00元" + + def test_user_agent_guides_narrative_with_day_before_yesterday() -> None: session_factory = build_session_factory() with session_factory() as db: ontology = SemanticOntologyService(db).parse( OntologyParseRequest( - query="我前天请客户吃饭花了200元", - user_id="pytest", - context_json={ - "client_now_iso": "2026-05-12T16:30:00.000Z", - "client_timezone_offset_minutes": -480, - }, - ) - ) - response = UserAgentService(db).respond( - UserAgentRequest( - run_id=ontology.run_id, - user_id="pytest", - message="我前天请客户吃饭花了200元", - ontology=ontology, - 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} + query="我前天请客户吃饭花了200元", + user_id="pytest", + context_json={ + "client_now_iso": "2026-05-12T16:30:00.000Z", + "client_timezone_offset_minutes": -480, + }, + ) + ) + response = UserAgentService(db).respond( + UserAgentRequest( + run_id=ontology.run_id, + user_id="pytest", + message="我前天请客户吃饭花了200元", + ontology=ontology, + 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["time_range"].raw_value == "前天" assert slot_map["time_range"].value == "2026-05-11" - assert "时间为 2026-05-11" in response.review_payload.intent_summary + assert "时间:2026-05-11" in response.review_payload.intent_summary def test_user_agent_guides_riding_fare_as_transport_expense() -> None: @@ -883,175 +884,175 @@ def test_user_agent_attachment_only_upload_uses_generic_scene_reason_without_fab session_factory = build_session_factory() with session_factory() as db: ontology = SemanticOntologyService(db).parse( - OntologyParseRequest( - query="我上传了 1 份票据,请结合附件名称给出报销建议并尽量生成草稿。", - user_id="pytest", - context_json={ - "attachment_names": ["didi-trip.png"], - "attachment_count": 1, - "ocr_documents": [ - { - "filename": "didi-trip.png", - "summary": "滴滴出行 订单金额 32 元", - "text": "滴滴出行 订单金额 32 元", - "document_type": "taxi_receipt", - "scene_code": "transport", - } - ], - "user_input_text": "", - }, - ) - ) - response = UserAgentService(db).respond( - UserAgentRequest( - run_id=ontology.run_id, - user_id="pytest", - message="我上传了 1 份票据,请结合附件名称给出报销建议并尽量生成草稿。\n附件名称:didi-trip.png", - ontology=ontology, - context_json={ - "attachment_names": ["didi-trip.png"], - "attachment_count": 1, - "ocr_documents": [ - { - "filename": "didi-trip.png", - "summary": "滴滴出行 订单金额 32 元", - "text": "滴滴出行 订单金额 32 元", - "document_type": "taxi_receipt", - "scene_code": "transport", - } - ], - "user_input_text": "", - }, - 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["reason"].value == "交通出行" - assert slot_map["reason"].status == "inferred" - - -def test_user_agent_transport_flow_infers_reason_and_does_not_require_location_or_merchant() -> None: - session_factory = build_session_factory() - with session_factory() as db: - ontology = SemanticOntologyService(db).parse( - OntologyParseRequest( - query="我上传了交通票据,帮我生成报销草稿", - user_id="pytest", - ) - ) - response = UserAgentService(db).respond( - UserAgentRequest( - run_id=ontology.run_id, - user_id="pytest", - message="我上传了交通票据,帮我生成报销草稿", - ontology=ontology, - context_json={ - "attachment_names": ["didi-trip.png"], - "attachment_count": 1, - "ocr_documents": [ - { - "filename": "didi-trip.png", - "summary": "滴滴出行 支付金额 32 元", - "text": "滴滴出行 支付金额 32 元", - "document_type": "taxi_receipt", - "scene_code": "transport", - "scene_label": "交通票据", - } - ], - }, - 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["reason"].value == "交通出行" - assert slot_map["reason"].status == "inferred" - assert "酒店/商户" not in response.review_payload.missing_slots - assert "地点" not in response.review_payload.missing_slots - assert "事由说明" not in response.review_payload.missing_slots - - -def test_user_agent_risk_response_includes_rule_citations() -> None: - session_factory = build_session_factory() - with session_factory() as db: - ontology = SemanticOntologyService(db).parse( - OntologyParseRequest( - query="检查重复报销风险", - user_id="pytest", - ) - ) - response = UserAgentService(db).respond( - UserAgentRequest( - run_id=ontology.run_id, - user_id="pytest", - message="检查重复报销风险", - ontology=ontology, - tool_payload={"risk_flags": ["duplicate_expense"]}, - ) - ) - - assert response.risk_flags == ["duplicate_expense"] - assert any(item.source_type == "rule" for item in response.citations) - assert "duplicate_expense" in response.answer - - -def test_user_agent_draft_returns_structured_payload() -> None: - session_factory = build_session_factory() - with session_factory() as db: - ontology = SemanticOntologyService(db).parse( - OntologyParseRequest( - query="帮我生成张三4月差旅报销草稿", - user_id="pytest", - ) - ) - response = UserAgentService(db).respond( - UserAgentRequest( - run_id=ontology.run_id, - user_id="pytest", - message="帮我生成张三4月差旅报销草稿", - ontology=ontology, - tool_payload={"draft_only": True}, - ) - ) - - assert response.draft_payload is not None - assert response.draft_payload.confirmation_required is True - assert response.review_payload is not None - assert response.review_payload.can_proceed is False + OntologyParseRequest( + query="我上传了 1 份票据,请结合附件名称给出报销建议并尽量生成草稿。", + user_id="pytest", + context_json={ + "attachment_names": ["didi-trip.png"], + "attachment_count": 1, + "ocr_documents": [ + { + "filename": "didi-trip.png", + "summary": "滴滴出行 订单金额 32 元", + "text": "滴滴出行 订单金额 32 元", + "document_type": "taxi_receipt", + "scene_code": "transport", + } + ], + "user_input_text": "", + }, + ) + ) + response = UserAgentService(db).respond( + UserAgentRequest( + run_id=ontology.run_id, + user_id="pytest", + message="我上传了 1 份票据,请结合附件名称给出报销建议并尽量生成草稿。\n附件名称:didi-trip.png", + ontology=ontology, + context_json={ + "attachment_names": ["didi-trip.png"], + "attachment_count": 1, + "ocr_documents": [ + { + "filename": "didi-trip.png", + "summary": "滴滴出行 订单金额 32 元", + "text": "滴滴出行 订单金额 32 元", + "document_type": "taxi_receipt", + "scene_code": "transport", + } + ], + "user_input_text": "", + }, + 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["reason"].value == "交通出行" + assert slot_map["reason"].status == "inferred" + + +def test_user_agent_transport_flow_infers_reason_and_does_not_require_location_or_merchant() -> None: + session_factory = build_session_factory() + with session_factory() as db: + ontology = SemanticOntologyService(db).parse( + OntologyParseRequest( + query="我上传了交通票据,帮我生成报销草稿", + user_id="pytest", + ) + ) + response = UserAgentService(db).respond( + UserAgentRequest( + run_id=ontology.run_id, + user_id="pytest", + message="我上传了交通票据,帮我生成报销草稿", + ontology=ontology, + context_json={ + "attachment_names": ["didi-trip.png"], + "attachment_count": 1, + "ocr_documents": [ + { + "filename": "didi-trip.png", + "summary": "滴滴出行 支付金额 32 元", + "text": "滴滴出行 支付金额 32 元", + "document_type": "taxi_receipt", + "scene_code": "transport", + "scene_label": "交通票据", + } + ], + }, + 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["reason"].value == "交通出行" + assert slot_map["reason"].status == "inferred" + assert "酒店/商户" not in response.review_payload.missing_slots + assert "地点" not in response.review_payload.missing_slots + assert "事由说明" not in response.review_payload.missing_slots + + +def test_user_agent_risk_response_includes_rule_citations() -> None: + session_factory = build_session_factory() + with session_factory() as db: + ontology = SemanticOntologyService(db).parse( + OntologyParseRequest( + query="检查重复报销风险", + user_id="pytest", + ) + ) + response = UserAgentService(db).respond( + UserAgentRequest( + run_id=ontology.run_id, + user_id="pytest", + message="检查重复报销风险", + ontology=ontology, + tool_payload={"risk_flags": ["duplicate_expense"]}, + ) + ) + + assert response.risk_flags == ["duplicate_expense"] + assert any(item.source_type == "rule" for item in response.citations) + assert "duplicate_expense" in response.answer + + +def test_user_agent_draft_returns_structured_payload() -> None: + session_factory = build_session_factory() + with session_factory() as db: + ontology = SemanticOntologyService(db).parse( + OntologyParseRequest( + query="帮我生成张三4月差旅报销草稿", + user_id="pytest", + ) + ) + response = UserAgentService(db).respond( + UserAgentRequest( + run_id=ontology.run_id, + user_id="pytest", + message="帮我生成张三4月差旅报销草稿", + ontology=ontology, + tool_payload={"draft_only": True}, + ) + ) + + assert response.draft_payload is not None + assert response.draft_payload.confirmation_required is True + assert response.review_payload is not None + assert response.review_payload.can_proceed is False assert response.review_payload.missing_slots == ["金额", "事由说明", "票据附件"] assert [item.action_type for item in response.review_payload.confirmation_actions] == [ "save_draft", ] - assert response.answer == response.review_payload.body_message - - + assert response.answer == response.review_payload.body_message + + def test_user_agent_returns_draft_limit_message_when_save_is_blocked() -> None: - session_factory = build_session_factory() - with session_factory() as db: - ontology = SemanticOntologyService(db).parse( - OntologyParseRequest( - query="请按当前识别信息保存报销草稿", - user_id="pytest", - ) - ) - response = UserAgentService(db).respond( - UserAgentRequest( - run_id=ontology.run_id, - user_id="pytest", - message="请按当前识别信息保存报销草稿", - ontology=ontology, - context_json={"review_action": "save_draft"}, - tool_payload={ - "draft_limit_reached": True, - "message": "你当前已保存 3 个草稿,请先完成已保存的草稿,才能再次新建草稿。", - "status": "blocked", - }, - ) - ) - + session_factory = build_session_factory() + with session_factory() as db: + ontology = SemanticOntologyService(db).parse( + OntologyParseRequest( + query="请按当前识别信息保存报销草稿", + user_id="pytest", + ) + ) + response = UserAgentService(db).respond( + UserAgentRequest( + run_id=ontology.run_id, + user_id="pytest", + message="请按当前识别信息保存报销草稿", + ontology=ontology, + context_json={"review_action": "save_draft"}, + tool_payload={ + "draft_limit_reached": True, + "message": "你当前已保存 3 个草稿,请先完成已保存的草稿,才能再次新建草稿。", + "status": "blocked", + }, + ) + ) + assert ( response.answer == "你当前已保存 3 个草稿,请先完成已保存的草稿,才能再次新建草稿。" @@ -1096,265 +1097,265 @@ def test_user_agent_returns_submitted_draft_payload_for_review_next_step() -> No def test_user_agent_builds_review_payload_for_multi_document_expense_flow() -> None: - session_factory = build_session_factory() - with session_factory() as db: - yesterday = (datetime.now(UTC).date() - timedelta(days=1)).isoformat() - ontology = SemanticOntologyService(db).parse( - OntologyParseRequest( - query="我昨天去上海出差,还请客户A吃饭,帮我生成报销草稿", - user_id="pytest", - context_json={ - "attachment_names": ["机票行程单.png", "餐饮发票.jpg"], - "attachment_count": 2, - "ocr_documents": [ - { - "filename": "机票行程单.png", - "summary": "机票行程单 上海-北京 金额 680 元", - "text": "机票行程单 上海-北京 金额 680 元", - "avg_score": 0.93, - "warnings": [], - }, - { - "filename": "餐饮发票.jpg", - "summary": "餐饮发票 客户招待 金额 320 元", - "text": "餐饮发票 客户招待 金额 320 元", - "avg_score": 0.91, - "warnings": [], - }, - ], - }, - ) - ) - response = UserAgentService(db).respond( - UserAgentRequest( - run_id=ontology.run_id, - user_id="pytest", - message="我昨天去上海出差,还请客户A吃饭,帮我生成报销草稿", - ontology=ontology, - context_json={ - "name": "张三", - "attachment_names": ["机票行程单.png", "餐饮发票.jpg"], - "attachment_count": 2, - "ocr_documents": [ - { - "filename": "机票行程单.png", - "summary": "机票行程单 上海-北京 金额 680 元", - "text": "机票行程单 上海-北京 金额 680 元", - "avg_score": 0.93, - "warnings": [], - }, - { - "filename": "餐饮发票.jpg", - "summary": "餐饮发票 客户招待 金额 320 元", - "text": "餐饮发票 客户招待 金额 320 元", - "avg_score": 0.91, - "warnings": [], - }, - ], - }, - tool_payload={"draft_only": True, "claim_no": "EXP-202605-009", "status": "draft"}, - ) - ) - - assert response.review_payload is not None - assert len(response.review_payload.document_cards) == 2 - assert len(response.review_payload.claim_groups) == 2 + session_factory = build_session_factory() + with session_factory() as db: + yesterday = (datetime.now(UTC).date() - timedelta(days=1)).isoformat() + ontology = SemanticOntologyService(db).parse( + OntologyParseRequest( + query="我昨天去上海出差,还请客户A吃饭,帮我生成报销草稿", + user_id="pytest", + context_json={ + "attachment_names": ["机票行程单.png", "餐饮发票.jpg"], + "attachment_count": 2, + "ocr_documents": [ + { + "filename": "机票行程单.png", + "summary": "机票行程单 上海-北京 金额 680 元", + "text": "机票行程单 上海-北京 金额 680 元", + "avg_score": 0.93, + "warnings": [], + }, + { + "filename": "餐饮发票.jpg", + "summary": "餐饮发票 客户招待 金额 320 元", + "text": "餐饮发票 客户招待 金额 320 元", + "avg_score": 0.91, + "warnings": [], + }, + ], + }, + ) + ) + response = UserAgentService(db).respond( + UserAgentRequest( + run_id=ontology.run_id, + user_id="pytest", + message="我昨天去上海出差,还请客户A吃饭,帮我生成报销草稿", + ontology=ontology, + context_json={ + "name": "张三", + "attachment_names": ["机票行程单.png", "餐饮发票.jpg"], + "attachment_count": 2, + "ocr_documents": [ + { + "filename": "机票行程单.png", + "summary": "机票行程单 上海-北京 金额 680 元", + "text": "机票行程单 上海-北京 金额 680 元", + "avg_score": 0.93, + "warnings": [], + }, + { + "filename": "餐饮发票.jpg", + "summary": "餐饮发票 客户招待 金额 320 元", + "text": "餐饮发票 客户招待 金额 320 元", + "avg_score": 0.91, + "warnings": [], + }, + ], + }, + tool_payload={"draft_only": True, "claim_no": "EXP-202605-009", "status": "draft"}, + ) + ) + + assert response.review_payload is not None + assert len(response.review_payload.document_cards) == 2 + assert len(response.review_payload.claim_groups) == 2 assert response.review_payload.missing_slots == ["参与人员"] assert [item.action_type for item in response.review_payload.confirmation_actions] == [ "save_draft", ] - assert any(item.scene_label == "业务招待费" for item in response.review_payload.document_cards) - assert f"时间为 {yesterday}" in response.review_payload.intent_summary - slot_map = {item.key: item for item in response.review_payload.slot_cards} - assert slot_map["time_range"].value == yesterday - assert slot_map["time_range"].raw_value == "昨天" - - -def test_user_agent_sums_multi_document_amounts_from_synonym_fields() -> None: - session_factory = build_session_factory() - with session_factory() as db: - ontology = SemanticOntologyService(db).parse( - OntologyParseRequest( - query="我上传了两张交通票据,帮我生成报销草稿", - user_id="pytest", - context_json={ - "attachment_names": ["滴滴行程单.png", "停车票.jpg"], - "attachment_count": 2, - "ocr_documents": [ - { - "filename": "滴滴行程单.png", - "summary": "滴滴出行电子行程单", - "text": "滴滴出行 订单金额 ¥32.50", - "avg_score": 0.94, - "document_fields": [ - {"key": "amount", "label": "支付金额", "value": "32.50"}, - ], - "warnings": [], - }, - { - "filename": "停车票.jpg", - "summary": "停车票", - "text": "停车费 合计 18 元", - "avg_score": 0.92, - "document_fields": [ - {"key": "total_amount", "label": "合计金额", "value": "18"}, - ], - "warnings": [], - }, - ], - }, - ) - ) - - response = UserAgentService(db).respond( - UserAgentRequest( - run_id=ontology.run_id, - user_id="pytest", - message="我上传了两张交通票据,帮我生成报销草稿", - ontology=ontology, - context_json={ - "attachment_names": ["滴滴行程单.png", "停车票.jpg"], - "attachment_count": 2, - "ocr_documents": [ - { - "filename": "滴滴行程单.png", - "summary": "滴滴出行电子行程单", - "text": "滴滴出行 订单金额 ¥32.50", - "avg_score": 0.94, - "document_fields": [ - {"key": "amount", "label": "支付金额", "value": "32.50"}, - ], - "warnings": [], - }, - { - "filename": "停车票.jpg", - "summary": "停车票", - "text": "停车费 合计 18 元", - "avg_score": 0.92, - "document_fields": [ - {"key": "total_amount", "label": "合计金额", "value": "18"}, - ], - "warnings": [], - }, - ], - }, - 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["amount"].value == "50.50元" - document_field_labels = [ - field.label - for card in response.review_payload.document_cards - for field in card.fields - ] - assert "金额" in document_field_labels - - -def test_user_agent_prefers_larger_decimal_amount_from_ocr_text_candidates() -> None: - session_factory = build_session_factory() - with session_factory() as db: - ontology = SemanticOntologyService(db).parse( - OntologyParseRequest( - query="我上传了打车票据,帮我生成报销草稿", - user_id="pytest", - context_json={ - "attachment_names": ["滴滴行程单.png"], - "attachment_count": 1, - "ocr_documents": [ - { - "filename": "滴滴行程单.png", - "summary": "滴滴出行电子行程单", - "text": "滴滴出行 支付金额 1 元,实付 13.4 元,订单号 12345678", - "avg_score": 0.94, - "warnings": [], - }, - ], - }, - ) - ) - - response = UserAgentService(db).respond( - UserAgentRequest( - run_id=ontology.run_id, - user_id="pytest", - message="我上传了打车票据,帮我生成报销草稿", - ontology=ontology, - context_json={ - "attachment_names": ["滴滴行程单.png"], - "attachment_count": 1, - "ocr_documents": [ - { - "filename": "滴滴行程单.png", - "summary": "滴滴出行电子行程单", - "text": "滴滴出行 支付金额 1 元,实付 13.4 元,订单号 12345678", - "avg_score": 0.94, - "warnings": [], - }, - ], - }, - 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["amount"].value == "13.40元" - - + assert any(item.scene_label == "业务招待费" for item in response.review_payload.document_cards) + assert f"时间:{yesterday}" in response.review_payload.intent_summary + slot_map = {item.key: item for item in response.review_payload.slot_cards} + assert slot_map["time_range"].value == yesterday + assert slot_map["time_range"].raw_value == "昨天" + + +def test_user_agent_sums_multi_document_amounts_from_synonym_fields() -> None: + session_factory = build_session_factory() + with session_factory() as db: + ontology = SemanticOntologyService(db).parse( + OntologyParseRequest( + query="我上传了两张交通票据,帮我生成报销草稿", + user_id="pytest", + context_json={ + "attachment_names": ["滴滴行程单.png", "停车票.jpg"], + "attachment_count": 2, + "ocr_documents": [ + { + "filename": "滴滴行程单.png", + "summary": "滴滴出行电子行程单", + "text": "滴滴出行 订单金额 ¥32.50", + "avg_score": 0.94, + "document_fields": [ + {"key": "amount", "label": "支付金额", "value": "32.50"}, + ], + "warnings": [], + }, + { + "filename": "停车票.jpg", + "summary": "停车票", + "text": "停车费 合计 18 元", + "avg_score": 0.92, + "document_fields": [ + {"key": "total_amount", "label": "合计金额", "value": "18"}, + ], + "warnings": [], + }, + ], + }, + ) + ) + + response = UserAgentService(db).respond( + UserAgentRequest( + run_id=ontology.run_id, + user_id="pytest", + message="我上传了两张交通票据,帮我生成报销草稿", + ontology=ontology, + context_json={ + "attachment_names": ["滴滴行程单.png", "停车票.jpg"], + "attachment_count": 2, + "ocr_documents": [ + { + "filename": "滴滴行程单.png", + "summary": "滴滴出行电子行程单", + "text": "滴滴出行 订单金额 ¥32.50", + "avg_score": 0.94, + "document_fields": [ + {"key": "amount", "label": "支付金额", "value": "32.50"}, + ], + "warnings": [], + }, + { + "filename": "停车票.jpg", + "summary": "停车票", + "text": "停车费 合计 18 元", + "avg_score": 0.92, + "document_fields": [ + {"key": "total_amount", "label": "合计金额", "value": "18"}, + ], + "warnings": [], + }, + ], + }, + 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["amount"].value == "50.50元" + document_field_labels = [ + field.label + for card in response.review_payload.document_cards + for field in card.fields + ] + assert "金额" in document_field_labels + + +def test_user_agent_prefers_larger_decimal_amount_from_ocr_text_candidates() -> None: + session_factory = build_session_factory() + with session_factory() as db: + ontology = SemanticOntologyService(db).parse( + OntologyParseRequest( + query="我上传了打车票据,帮我生成报销草稿", + user_id="pytest", + context_json={ + "attachment_names": ["滴滴行程单.png"], + "attachment_count": 1, + "ocr_documents": [ + { + "filename": "滴滴行程单.png", + "summary": "滴滴出行电子行程单", + "text": "滴滴出行 支付金额 1 元,实付 13.4 元,订单号 12345678", + "avg_score": 0.94, + "warnings": [], + }, + ], + }, + ) + ) + + response = UserAgentService(db).respond( + UserAgentRequest( + run_id=ontology.run_id, + user_id="pytest", + message="我上传了打车票据,帮我生成报销草稿", + ontology=ontology, + context_json={ + "attachment_names": ["滴滴行程单.png"], + "attachment_count": 1, + "ocr_documents": [ + { + "filename": "滴滴行程单.png", + "summary": "滴滴出行电子行程单", + "text": "滴滴出行 支付金额 1 元,实付 13.4 元,订单号 12345678", + "avg_score": 0.94, + "warnings": [], + }, + ], + }, + 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["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( - query="我上传了打车票据,帮我生成报销草稿", - user_id="pytest", - context_json={ - "attachment_names": ["滴滴行程单.png"], - "attachment_count": 1, - "ocr_documents": [ - { - "filename": "滴滴行程单.png", - "summary": "滴滴出行电子行程单", - "text": "滴滴出行 实付 13.4 元", - "avg_score": 0.94, - "preview_kind": "image", - "preview_data_url": "data:image/png;base64,ZmFrZQ==", - "warnings": [], - }, - ], - }, - ) - ) - - response = UserAgentService(db).respond( - UserAgentRequest( - run_id=ontology.run_id, - user_id="pytest", - message="我上传了打车票据,帮我生成报销草稿", - ontology=ontology, - context_json={ - "attachment_names": ["滴滴行程单.png"], - "attachment_count": 1, - "ocr_documents": [ - { - "filename": "滴滴行程单.png", - "summary": "滴滴出行电子行程单", - "text": "滴滴出行 实付 13.4 元", - "avg_score": 0.94, - "preview_kind": "image", - "preview_data_url": "data:image/png;base64,ZmFrZQ==", - "warnings": [], - }, - ], - }, - tool_payload={"draft_only": True}, - ) - ) - - assert response.review_payload is not None + query="我上传了打车票据,帮我生成报销草稿", + user_id="pytest", + context_json={ + "attachment_names": ["滴滴行程单.png"], + "attachment_count": 1, + "ocr_documents": [ + { + "filename": "滴滴行程单.png", + "summary": "滴滴出行电子行程单", + "text": "滴滴出行 实付 13.4 元", + "avg_score": 0.94, + "preview_kind": "image", + "preview_data_url": "data:image/png;base64,ZmFrZQ==", + "warnings": [], + }, + ], + }, + ) + ) + + response = UserAgentService(db).respond( + UserAgentRequest( + run_id=ontology.run_id, + user_id="pytest", + message="我上传了打车票据,帮我生成报销草稿", + ontology=ontology, + context_json={ + "attachment_names": ["滴滴行程单.png"], + "attachment_count": 1, + "ocr_documents": [ + { + "filename": "滴滴行程单.png", + "summary": "滴滴出行电子行程单", + "text": "滴滴出行 实付 13.4 元", + "avg_score": 0.94, + "preview_kind": "image", + "preview_data_url": "data:image/png;base64,ZmFrZQ==", + "warnings": [], + }, + ], + }, + tool_payload={"draft_only": True}, + ) + ) + + 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,") @@ -2041,36 +2042,87 @@ def test_user_agent_prompts_existing_draft_association_choice_for_multi_document with session_factory() as db: ontology = SemanticOntologyService(db).parse( OntologyParseRequest( - query="我上传了两张票据,帮我生成报销草稿", - user_id="pytest", - ) - ) - - response = UserAgentService(db).respond( - UserAgentRequest( - run_id=ontology.run_id, - user_id="pytest", - message="我上传了两张票据,帮我生成报销草稿", - ontology=ontology, - context_json={ - "attachment_names": ["滴滴行程单.png", "餐饮发票.jpg"], - "attachment_count": 2, - "ocr_documents": [ - {"filename": "滴滴行程单.png", "summary": "滴滴出行 金额 32 元", "text": "滴滴出行 金额 32 元"}, - {"filename": "餐饮发票.jpg", "summary": "餐饮发票 金额 68 元", "text": "餐饮发票 金额 68 元"}, - ], - }, - tool_payload={ - "pending_association_decision": True, - "association_candidate_claim_no": "EXP-202605-008", - }, - ) - ) - - assert response.review_payload is not None + query="我上传了两张票据,帮我生成报销草稿", + user_id="pytest", + ) + ) + + response = UserAgentService(db).respond( + UserAgentRequest( + run_id=ontology.run_id, + user_id="pytest", + message="我上传了两张票据,帮我生成报销草稿", + ontology=ontology, + context_json={ + "attachment_names": ["滴滴行程单.png", "餐饮发票.jpg"], + "attachment_count": 2, + "ocr_documents": [ + {"filename": "滴滴行程单.png", "summary": "滴滴出行 金额 32 元", "text": "滴滴出行 金额 32 元"}, + {"filename": "餐饮发票.jpg", "summary": "餐饮发票 金额 68 元", "text": "餐饮发票 金额 68 元"}, + ], + }, + tool_payload={ + "pending_association_decision": True, + "association_candidate_claim_no": "EXP-202605-008", + }, + ) + ) + + assert response.review_payload is not None assert response.review_payload.can_proceed is False assert [item.action_type for item in response.review_payload.confirmation_actions] == [ "link_to_existing_draft", "create_new_claim_from_documents", ] - assert "EXP-202605-008" in response.answer + assert "EXP-202605-008" in response.answer + + +def test_user_agent_reports_duplicate_invoice_block_when_linking_draft() -> None: + session_factory = build_session_factory() + with session_factory() as db: + ontology = SemanticOntologyService(db).parse( + OntologyParseRequest( + query="把这张票据关联到已有草稿", + user_id="pytest-duplicate", + ) + ) + + response = UserAgentService(db).respond( + UserAgentRequest( + run_id=ontology.run_id, + user_id="pytest-duplicate", + message="把这张票据关联到已有草稿", + ontology=ontology, + context_json={ + "review_action": "link_to_existing_draft", + "attachment_names": ["didi-trip.png"], + "attachment_count": 1, + "ocr_documents": [ + { + "filename": "didi-trip.png", + "summary": "滴滴出行 支付金额 32.50 元", + "text": "滴滴出行 支付金额 32.50 元", + } + ], + }, + tool_payload={ + "review_action": "link_to_existing_draft", + "duplicate_attachment_blocked": True, + "duplicate_invoice_blocked": True, + "submission_blocked": True, + "submission_blocked_reasons": [ + "检测到本次上传的票据与草稿 EXP-202605-021 中已有票据重复:didi-trip.png。请重新上传不同的票据后再归集。" + ], + "message": "检测到本次上传的票据与草稿 EXP-202605-021 中已有票据重复:didi-trip.png。请重新上传不同的票据后再归集。", + "claim_id": "claim-duplicate", + "claim_no": "EXP-202605-021", + "status": "blocked", + }, + ) + ) + + assert "重复" in response.answer + assert "重新上传不同的票据" in response.answer + assert "已将本次上传" not in response.answer + assert response.review_payload is not None + assert response.review_payload.can_proceed is False diff --git a/web/src/assets/styles/views/travel-reimbursement-create-view-part3.css b/web/src/assets/styles/views/travel-reimbursement-create-view-part3.css index f5484f4..e7d50c5 100644 --- a/web/src/assets/styles/views/travel-reimbursement-create-view-part3.css +++ b/web/src/assets/styles/views/travel-reimbursement-create-view-part3.css @@ -200,7 +200,7 @@ } .review-message-block { - margin-top: 8px; + margin-top: 10px; } .review-summary { @@ -208,12 +208,12 @@ color: #1f2937; font-size: var(--wb-fs-bubble); line-height: 1.58; - white-space: pre-line; + white-space: normal; } .review-plain-followup { display: grid; - gap: 7px; + gap: 10px; padding: 0; color: #334155; font-size: var(--wb-fs-bubble); @@ -225,13 +225,31 @@ } .review-plain-lead { - color: #334155; + margin: 0 0 2px; + padding-left: 8px; + border-left: 3px solid #2563eb; + color: #0f172a; + font-size: max(13px, calc(var(--wb-fs-bubble) + 1px)); + font-weight: 820; + line-height: 1.42; + letter-spacing: 0; +} + +.review-plain-lead.danger { + border-left-color: #dc2626; + color: #b91c1c; +} + +.review-plain-summary { + margin: 0; + color: #64748b; + line-height: 1.62; } .review-plain-list { display: grid; - gap: 4px; - margin: 0; + gap: 7px; + margin: 2px 0 0; padding: 0 0 0 18px; } @@ -247,11 +265,14 @@ } .review-plain-note { + margin-top: 2px; color: #64748b; } .review-inline-save-copy { + margin-top: 46px !important; color: #475569; + line-height: 1.62; } .review-inline-draft-link { diff --git a/web/src/assets/styles/views/travel-reimbursement-create-view-part4.css b/web/src/assets/styles/views/travel-reimbursement-create-view-part4.css index e5cb425..cb19200 100644 --- a/web/src/assets/styles/views/travel-reimbursement-create-view-part4.css +++ b/web/src/assets/styles/views/travel-reimbursement-create-view-part4.css @@ -185,7 +185,7 @@ --wb-fs-welcome: 16px; } - .assistant-modal-stage .message-answer-markdown table { + .assistant-modal-stage .message-answer-markdown :deep(table) { font-size: 12px; } 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 2a36c76..62fe91e 100644 --- a/web/src/assets/styles/views/travel-reimbursement-create-view.css +++ b/web/src/assets/styles/views/travel-reimbursement-create-view.css @@ -661,7 +661,7 @@ .message-answer-content { display: grid; - gap: 7px; + gap: 9px; } .message-answer-content p, @@ -672,15 +672,33 @@ margin: 0; } -.message-answer-markdown h1, -.message-answer-markdown h2, -.message-answer-markdown h3, -.message-answer-markdown h4 { - margin: 0; +.message-answer-markdown :deep(h1), +.message-answer-markdown :deep(h2), +.message-answer-markdown :deep(h3), +.message-answer-markdown :deep(h4) { + margin: 12px 0 4px; color: #0f172a; - font-size: var(--wb-fs-md-h3); - font-weight: 750; - line-height: 1.46; + font-size: max(13px, calc(var(--wb-fs-bubble) + 1px)); + font-weight: 820; + line-height: 1.42; + letter-spacing: 0; +} + +.message-answer-markdown :deep(h1:first-child), +.message-answer-markdown :deep(h2:first-child), +.message-answer-markdown :deep(h3:first-child), +.message-answer-markdown :deep(h4:first-child) { + margin-top: 0; +} + +.message-answer-markdown :deep(h3) { + padding-left: 8px; + border-left: 3px solid #2563eb; +} + +.message-answer-markdown :deep(h3 + p), +.message-answer-markdown :deep(h3 + .markdown-table-wrap) { + margin-top: 6px; } .message-answer-markdown { @@ -690,26 +708,31 @@ line-height: 1.58; } -.message-answer-markdown p, -.message-answer-markdown li, -.message-answer-markdown td, -.message-answer-markdown th, -.message-answer-markdown blockquote { +.message-answer-markdown :deep(p), +.message-answer-markdown :deep(li), +.message-answer-markdown :deep(td), +.message-answer-markdown :deep(th), +.message-answer-markdown :deep(blockquote) { font-size: inherit; color: inherit; line-height: 1.58; } -.message-answer-markdown ul, -.message-answer-markdown ol { +.message-answer-markdown :deep(p) { + margin: 0; +} + +.message-answer-markdown :deep(ul), +.message-answer-markdown :deep(ol) { + margin: 0; padding-left: 20px; } -.message-answer-markdown strong { +.message-answer-markdown :deep(strong) { color: #0f172a; } -.message-answer-markdown blockquote { +.message-answer-markdown :deep(blockquote) { padding: 8px 10px; border-left: 3px solid #cbd5e1; border-radius: 0 10px 10px 0; @@ -717,14 +740,14 @@ color: #475569; } -.message-answer-markdown code { +.message-answer-markdown :deep(code) { padding: 2px 6px; border-radius: 6px; background: #e2e8f0; font-size: 12px; } -.message-answer-markdown pre { +.message-answer-markdown :deep(pre) { overflow-x: auto; padding: 12px; border-radius: 14px; @@ -732,47 +755,64 @@ color: #e2e8f0; } -.message-answer-markdown pre code { +.message-answer-markdown :deep(pre code) { padding: 0; background: transparent; color: inherit; } -.message-answer-markdown a { +.message-answer-markdown :deep(a) { color: #2563eb; text-decoration: underline; } -.message-answer-markdown table { - width: auto; +.message-answer-markdown :deep(.markdown-table-wrap) { + width: 100%; max-width: 100%; + margin: 8px 0 10px; + overflow-x: auto; border: 1px solid #dbe4ee; - border-radius: 16px; - border-collapse: collapse; - background: linear-gradient(180deg, #ffffff 0%, #f8fbff 100%); + border-radius: 10px; + background: #fff; + box-shadow: 0 8px 20px rgba(15, 23, 42, 0.05); +} + +.message-answer-markdown :deep(table) { + width: 100%; + min-width: 460px; + border: 0; + border-collapse: separate; + border-spacing: 0; + background: #fff; font-size: inherit; } -.message-answer-markdown th, -.message-answer-markdown td { - padding: 10px 12px; +.message-answer-markdown :deep(th), +.message-answer-markdown :deep(td) { + padding: 8px 10px; border-bottom: 1px solid #e2e8f0; text-align: left; - white-space: nowrap; + vertical-align: top; + white-space: normal; } -.message-answer-markdown th { - background: #eff6ff; +.message-answer-markdown :deep(th) { + background: #f8fafc; color: #0f172a; - font-weight: 850; + font-weight: 760; + border-bottom-color: #cbd5e1; } -.message-answer-markdown td { +.message-answer-markdown :deep(td) { color: #334155; - font-weight: 650; + font-weight: 520; } -.message-answer-markdown tbody tr:last-child td { +.message-answer-markdown :deep(tbody tr:nth-child(even) td) { + background: #fbfdff; +} + +.message-answer-markdown :deep(tbody tr:last-child td) { border-bottom: 0; } diff --git a/web/src/services/ocr.js b/web/src/services/ocr.js index e69be2f..34ee8cd 100644 --- a/web/src/services/ocr.js +++ b/web/src/services/ocr.js @@ -1,6 +1,6 @@ import { apiRequest } from './api.js' -export function recognizeOcrFiles(files) { +export function recognizeOcrFiles(files, options = {}) { const formData = new FormData() for (const file of files) { formData.append('files', file) @@ -9,6 +9,7 @@ export function recognizeOcrFiles(files) { return apiRequest('/ocr/recognize', { method: 'POST', body: formData, - contentType: null + contentType: null, + ...options }) } diff --git a/web/src/utils/markdown.js b/web/src/utils/markdown.js index c084894..0a44083 100644 --- a/web/src/utils/markdown.js +++ b/web/src/utils/markdown.js @@ -6,7 +6,78 @@ const markdown = new MarkdownIt({ breaks: true }) +const defaultTableOpen = markdown.renderer.rules.table_open +const defaultTableClose = markdown.renderer.rules.table_close + +markdown.renderer.rules.table_open = (tokens, idx, options, env, self) => ( + `
${defaultTableOpen ? defaultTableOpen(tokens, idx, options, env, self) : ''}` +) + +markdown.renderer.rules.table_close = (tokens, idx, options, env, self) => ( + `${defaultTableClose ? defaultTableClose(tokens, idx, options, env, self) : '
'}
` +) + +const ALLOWED_COLON_HEADING_TITLES = new Set([ + '基础信息识别结果', + '报销测算参考', + '补充信息' +]) + +function splitColonHeadingLine(line) { + const rawLine = String(line || '') + const trimmed = rawLine.trim() + if (!trimmed || trimmed.startsWith('|') || /^#{1,6}\s/.test(trimmed)) { + return [rawLine] + } + + const chineseColonIndex = trimmed.indexOf(':') + const asciiColonIndex = trimmed.indexOf(':') + const colonIndexes = [chineseColonIndex, asciiColonIndex].filter((index) => index > 0) + if (!colonIndexes.length) { + return [rawLine] + } + + const colonIndex = Math.min(...colonIndexes) + const title = trimmed.slice(0, colonIndex + 1) + const titleText = title.slice(0, -1) + const body = trimmed.slice(colonIndex + 1).trim() + if (!ALLOWED_COLON_HEADING_TITLES.has(titleText)) { + return [rawLine] + } + + return body ? [`### ${title}`, '', body] : [`### ${title}`] +} + +function normalizeColonHeadings(text) { + const lines = String(text || '').replace(/\r\n?/g, '\n').split('\n') + const normalizedLines = [] + let inFence = false + + lines.forEach((line) => { + if (/^\s*(```|~~~)/.test(line)) { + inFence = !inFence + normalizedLines.push(line) + return + } + if (inFence) { + normalizedLines.push(line) + return + } + + const nextLines = splitColonHeadingLine(line) + if (nextLines[0]?.startsWith('### ') && normalizedLines.length) { + const previousLine = normalizedLines[normalizedLines.length - 1] + if (String(previousLine || '').trim()) { + normalizedLines.push('') + } + } + normalizedLines.push(...nextLines) + }) + + return normalizedLines.join('\n').replace(/\n{3,}/g, '\n\n') +} + export function renderMarkdown(text = '') { - const normalized = String(text || '').trim() + const normalized = normalizeColonHeadings(text).trim() return normalized ? markdown.render(normalized) : '' } diff --git a/web/src/views/TravelReimbursementCreateView.vue b/web/src/views/TravelReimbursementCreateView.vue index 26db9b5..105aca7 100644 --- a/web/src/views/TravelReimbursementCreateView.vue +++ b/web/src/views/TravelReimbursementCreateView.vue @@ -88,9 +88,10 @@
-

{{ followup.lead }}

+

+ {{ followup.lead }} +

+

+ {{ followup.summary }} +

  • { + const label = String(field?.label || '').trim() + const value = String(field?.value || '').trim() + return label && value ? `- ${label}:${value}` : '' + }) + .filter(Boolean) + + if (fieldLines.length) { + return fieldLines.slice(0, 8) + } + + const summary = String(document?.summary || document?.text || '').trim() + if (summary) { + return [`- 识别内容:${summary}`] + } + + return ['- 识别内容:暂未提取到结构化字段,请以票据原件为准。'] +} + +export function buildAttachmentAssociationConfirmationMessage({ + claimNo = '', + claimTitle = '', + fileNames = [], + ocrDocuments = [] +} = {}) { + const documents = Array.isArray(ocrDocuments) && ocrDocuments.length + ? ocrDocuments + : (Array.isArray(fileNames) ? fileNames : []) + .map((filename) => ({ filename })) + .filter((item) => String(item.filename || '').trim()) + const targetLines = [ + claimNo ? `- 草稿单号:${claimNo}` : '', + claimTitle ? `- 单据说明:${claimTitle}` : '', + `- 本次待归集附件:${documents.length || fileNames.length || 0} 份` + ].filter(Boolean) + + const documentBlocks = documents.map((document, index) => { + const filename = String(document?.filename || '').trim() || `附件 ${index + 1}` + const typeLabel = resolveAssociationDocumentTypeLabel(document) + const contentLines = buildAssociationDocumentContentLines(document) + return [ + `附件 ${index + 1}:${filename}`, + '', + `附件类型:${typeLabel}`, + '', + ...contentLines + ].join('\n') + }) + + return [ + '已识别附件信息:', + '', + documentBlocks.join('\n\n'), + '', + '请问是否确定将票据信息归集到单据:', + '', + targetLines.join('\n'), + '', + `如果 [确认](${ATTACHMENT_ASSOCIATION_CONFIRM_HREF}) 该信息,我将直接将票据进行归集。` + ] + .filter((part) => String(part || '').trim()) + .join('\n') +} + export function normalizeReviewDocumentFieldKey(label) { const compact = String(label || '').replace(/\s+/g, '').toLowerCase() if (!compact) return '' diff --git a/web/src/views/scripts/travelReimbursementConversationModel.js b/web/src/views/scripts/travelReimbursementConversationModel.js index a4e98a8..257d181 100644 --- a/web/src/views/scripts/travelReimbursementConversationModel.js +++ b/web/src/views/scripts/travelReimbursementConversationModel.js @@ -167,6 +167,7 @@ export function createMessage(role, text, attachments = [], extras = {}) { draftPayload: null, reviewPayload: null, riskFlags: [], + pendingAttachmentAssociation: null, ...extras } } @@ -666,6 +667,7 @@ export function serializeSessionMessages(messages) { draftPayload: message.draftPayload || null, reviewPayload: message.reviewPayload || null, riskFlags: Array.isArray(message.riskFlags) ? message.riskFlags : [], + pendingAttachmentAssociation: message.pendingAttachmentAssociation || null, assistantName: message.assistantName || '', isWelcome: Boolean(message.isWelcome), welcomeQuickActions: Array.isArray(message.welcomeQuickActions) ? message.welcomeQuickActions : [] diff --git a/web/src/views/scripts/travelReimbursementReviewModel.js b/web/src/views/scripts/travelReimbursementReviewModel.js index 394c334..d9baca5 100644 --- a/web/src/views/scripts/travelReimbursementReviewModel.js +++ b/web/src/views/scripts/travelReimbursementReviewModel.js @@ -224,14 +224,22 @@ export function resolveReviewMissingSlotCards(reviewPayload) { export function resolveReviewExtraMissingLabels(reviewPayload) { const labels = Array.isArray(reviewPayload?.missing_slots) - ? reviewPayload.missing_slots.map((item) => String(item || '').trim()).filter(Boolean) + ? reviewPayload.missing_slots + .map((item) => { + if (item && typeof item === 'object') { + return String(item.label || item.title || item.key || '').trim() + } + return String(item || '').trim() + }) + .filter(Boolean) : [] if (!labels.length) return [] const slotLabels = new Set( - (Array.isArray(reviewPayload?.slot_cards) ? reviewPayload.slot_cards : []) - .map((item) => String(item?.label || item?.key || '').trim()) - .filter(Boolean) + (Array.isArray(reviewPayload?.slot_cards) ? reviewPayload.slot_cards : []).flatMap((item) => [ + String(item?.label || '').trim(), + String(item?.key || '').trim() + ]).filter(Boolean) ) return labels.filter((label) => !slotLabels.has(label)) } @@ -1239,23 +1247,66 @@ function buildReviewPlainFollowupItem(item, pendingMode) { } } +const REVIEW_PENDING_SUMMARY_TEMPLATES = [ + ({ issueSummary }) => `当前还有 ${issueSummary}。请核查对话中的文字说明;如果想先暂存,也可以点击对话文字中的“草稿”。`, + ({ issueSummary }) => `我这边看到还有 ${issueSummary},建议先把下方内容核对一下;暂时不处理也没关系,可以点击“草稿”先保存。`, + ({ issueSummary }) => `下方还有 ${issueSummary},需要你确认。信息没补齐前可以先核查说明,后续需要暂存时点“草稿”。`, + ({ issueSummary }) => `这笔报销还有 ${issueSummary},尚未完全确认。请先看一下下面的补充项;需要中途保存时,可以点“草稿”。`, + ({ issueSummary }) => `目前还有 ${issueSummary}。你可以先按下面的提示补充,也可以稍后再处理,点击“草稿”即可暂存当前信息。`, + ({ issueSummary }) => `还有 ${issueSummary},建议先核对下面说明;如果票据或金额暂时不全,可以通过“草稿”保留当前进度。`, + ({ issueSummary }) => `这次识别结果里还有 ${issueSummary}。请重点看下面几项,暂不提交时可以点“草稿”保存。`, + ({ issueSummary }) => `我还需要你确认 ${issueSummary}。下面列出了具体内容;如果现在不方便补齐,可以先点“草稿”。`, + ({ issueSummary }) => `当前还有 ${issueSummary},需要进一步处理。请根据下面提示核查,待补充完再继续;临时保存可点击“草稿”。`, + ({ issueSummary }) => `本次报销还有 ${issueSummary},请先检查下面的补充项;想先留存当前识别结果时可以点“草稿”。` +] + +function buildStableTemplateIndex(signature, total) { + const source = String(signature || '') + let hash = 0 + for (let index = 0; index < source.length; index += 1) { + hash = ((hash << 5) - hash + source.charCodeAt(index)) >>> 0 + } + return total ? hash % total : 0 +} + +function buildReviewPendingSummary(pendingCount, riskCount, signature = '') { + const issueParts = [] + if (pendingCount) { + issueParts.push(`${pendingCount} 项信息待补充`) + } + if (riskCount) { + issueParts.push(`${riskCount} 条风险提醒`) + } + const issueSummary = issueParts.length ? issueParts.join('、') : '一些细节还需要进一步确认' + const templateIndex = buildStableTemplateIndex(signature || issueSummary, REVIEW_PENDING_SUMMARY_TEMPLATES.length) + return REVIEW_PENDING_SUMMARY_TEMPLATES[templateIndex]({ issueSummary }) +} + export function buildReviewPlainFollowupCopy(reviewPayload) { const todoItems = buildReviewTodoItems(reviewPayload) const pendingCount = countReviewPendingItems(reviewPayload) const riskBriefs = resolvePresentationRiskBriefs(reviewPayload) + const extraMissingCount = resolveReviewExtraMissingLabels(reviewPayload).length - if (pendingCount || resolveReviewExtraMissingLabels(reviewPayload).length) { + if (pendingCount || extraMissingCount) { + const summarySignature = [ + pendingCount || extraMissingCount, + riskBriefs.length, + ...todoItems.map((item) => `${item.key}:${item.title}:${item.status}`) + ].join('|') return { - lead: '我还需要你核查或补充下面这些信息:', + lead: '补充信息:', + tone: 'danger', + summary: buildReviewPendingSummary(pendingCount || extraMissingCount, riskBriefs.length, summarySignature), items: todoItems.map((item) => buildReviewPlainFollowupItem(item, true)), - notes: riskBriefs.length - ? [`另外还有 ${riskBriefs.length} 条风险提醒,提交前建议一起确认。`] - : [] + notes: [] } } return { lead: todoItems.length ? '我已整理出当前识别到的关键信息:' : '当前关键信息已基本整理完成。', + tone: 'neutral', + summary: '', items: todoItems.map((item) => buildReviewPlainFollowupItem(item, false)), notes: [ reviewPayload?.can_proceed ? '确认无误后,可以继续下一步。' : '', diff --git a/web/src/views/scripts/useTravelReimbursementReviewDrawer.js b/web/src/views/scripts/useTravelReimbursementReviewDrawer.js index ee9c647..b86db21 100644 --- a/web/src/views/scripts/useTravelReimbursementReviewDrawer.js +++ b/web/src/views/scripts/useTravelReimbursementReviewDrawer.js @@ -103,15 +103,15 @@ export function useTravelReimbursementReviewDrawer({ const isReviewFlowDrawer = computed(() => reviewDrawerMode.value === REVIEW_DRAWER_MODE_FLOW) const reviewDrawerTitle = computed(() => ( isReviewDocumentDrawer.value - ? '绁ㄦ嵁璇嗗埆缁撴灉' + ? '票据识别结果' : isReviewRiskDrawer.value - ? '椋庨櫓鎻愮ず' + ? '风险提示' : isReviewFlowDrawer.value - ? '璋冪敤娴佺▼' - : '鎶ラ攢璇嗗埆鏍稿' + ? '执行流程' + : '报销识别核对' )) const reviewDocumentDrawerLabel = computed(() => ( - '鍗曟嵁璇嗗埆' + '单据识别' )) const reviewDocumentDrawerIcon = computed(() => ( isReviewDocumentDrawer.value @@ -119,7 +119,7 @@ export function useTravelReimbursementReviewDrawer({ : 'mdi mdi-file-document-multiple-outline' )) const reviewRiskDrawerLabel = computed(() => ( - '鏄剧ず椋庨櫓' + '显示风险' )) const reviewRiskDrawerIcon = computed(() => ( isReviewRiskDrawer.value @@ -127,7 +127,7 @@ export function useTravelReimbursementReviewDrawer({ : 'mdi mdi-shield-alert-outline' )) const reviewFlowDrawerLabel = computed(() => ( - '璋冪敤娴佺▼' + '执行流程' )) const reviewFlowDrawerIcon = computed(() => ( isReviewFlowDrawer.value @@ -253,7 +253,7 @@ export function useTravelReimbursementReviewDrawer({ ) { nextForm.reason_value = String(reviewInlineForm.value.reason_value || '').trim() if (!nextForm.reason_value) { - setInlineReviewFieldError('scene', '璇烽€夋嫨鈥滃叾浠栧満鏅€濆悗锛岃琛ュ厖鍏蜂綋浜嬬敱') + setInlineReviewFieldError('scene', '请选择“其他场景”后,请补充具体事由') reviewInlineForm.value = nextForm return false } @@ -262,14 +262,14 @@ export function useTravelReimbursementReviewDrawer({ } if (activeEditorKey === 'occurred_date' && nextForm.occurred_date && !isValidIsoDateString(nextForm.occurred_date)) { - setInlineReviewFieldError('occurred_date', `璇疯緭鍏ユ纭殑鏃堕棿鏍煎紡锛?{DATE_INPUT_FORMAT}`) + setInlineReviewFieldError('occurred_date', `请输入正确的时间格式:${DATE_INPUT_FORMAT}`) return false } if (activeEditorKey === 'amount' && nextForm.amount) { const normalizedAmount = normalizeAmountValue(nextForm.amount) if (!normalizedAmount) { - setInlineReviewFieldError('amount', '璇疯緭鍏ユ纭殑鏁板瓧閲戦锛屼緥濡?200 鎴?200.50') + setInlineReviewFieldError('amount', '请输入正确的数字金额,例如 200 或 200.50') return false } nextForm.amount = normalizedAmount diff --git a/web/src/views/scripts/useTravelReimbursementSubmitComposer.js b/web/src/views/scripts/useTravelReimbursementSubmitComposer.js index fe91149..ae7afe2 100644 --- a/web/src/views/scripts/useTravelReimbursementSubmitComposer.js +++ b/web/src/views/scripts/useTravelReimbursementSubmitComposer.js @@ -1,3 +1,8 @@ +import { + ATTACHMENT_ASSOCIATION_CONFIRM_HREF, + buildAttachmentAssociationConfirmationMessage +} from './travelReimbursementAttachmentModel.js' + export function useTravelReimbursementSubmitComposer(ctx) { const { MAX_ATTACHMENTS, @@ -74,6 +79,87 @@ export function useTravelReimbursementSubmitComposer(ctx) { uploadDecisionDialogOpen, toast } = ctx + + const pendingAttachmentAssociations = new Map() + + function createPendingAttachmentAssociationId() { + return `attachment-association-${Date.now()}-${Math.random().toString(16).slice(2)}` + } + + function normalizeRecognizedAttachmentData(data) { + if (!data || typeof data !== 'object') { + return null + } + const documents = Array.isArray(data.ocrDocuments) ? data.ocrDocuments : [] + if (!documents.length) { + return null + } + return { + ocrPayload: data.ocrPayload || null, + ocrSummary: String(data.ocrSummary || '').trim(), + ocrDocuments: documents, + ocrFilePreviews: Array.isArray(data.ocrFilePreviews) ? data.ocrFilePreviews : [] + } + } + + function buildConfirmedAssociationText(message) { + return String(message?.text || '').replace( + `[确认](${ATTACHMENT_ASSOCIATION_CONFIRM_HREF})`, + '已确认' + ) + } + + async function confirmPendingAttachmentAssociation(message) { + if (submitting.value || sessionSwitchBusy.value) return null + + const pending = message?.pendingAttachmentAssociation && typeof message.pendingAttachmentAssociation === 'object' + ? message.pendingAttachmentAssociation + : null + const associationId = String(pending?.id || '').trim() + if (!associationId || pending?.status === 'confirmed') { + return null + } + + const runtime = pendingAttachmentAssociations.get(associationId) + if (!runtime || !Array.isArray(runtime.files) || !runtime.files.length) { + toast('当前会话里没有可归集的附件原件,请重新上传票据后再确认。') + return null + } + + pending.status = 'confirmed' + message.pendingAttachmentAssociation = pending + message.text = buildConfirmedAssociationText(message) + message.meta = ['已确认归集'] + persistSessionState() + + return submitComposer({ + rawText: `确认将本次上传的 ${runtime.fileNames.length} 份票据归集到草稿 ${runtime.claimNo || '当前草稿'}`, + userText: `确认归集到草稿 ${runtime.claimNo || '当前草稿'}`, + files: runtime.files, + uploadDisposition: 'continue_existing', + skipUploadDecisionPrompt: true, + skipDraftAssociationPrompt: true, + pendingText: runtime.claimNo + ? `正在将票据归集到草稿 ${runtime.claimNo}...` + : '正在将票据归集到当前草稿...', + associationConfirmed: true, + recognizedAttachmentData: { + ocrPayload: runtime.ocrPayload, + ocrSummary: runtime.ocrSummary, + ocrDocuments: runtime.ocrDocuments, + ocrFilePreviews: runtime.ocrFilePreviews + }, + extraContext: { + ...runtime.extraContext, + review_action: 'link_to_existing_draft', + draft_claim_id: runtime.claimId, + selected_claim_id: runtime.claimId, + selected_claim_no: runtime.claimNo, + attachment_association_confirmed: true + } + }) + } + function buildBackendMessage(rawText, fileNames, ocrSummary = '') { const parts = [] const normalizedText = String(rawText || '').trim() @@ -128,6 +214,11 @@ export function useTravelReimbursementSubmitComposer(ctx) { ? initialExtraContext : mergeBusinessTimeIntoExtraContext(initialExtraContext, selectedBusinessTimeContext) const reviewAction = String(extraContext.review_action || '').trim() + const attachmentAssociationConfirmed = Boolean( + options.associationConfirmed || + extraContext.attachment_association_confirmed || + reviewAction === 'link_to_existing_draft' + ) const hasSelectedExpenseType = Boolean( extraContext.expense_scene_selection || String(extraContext.review_form_values?.expense_type || extraContext.review_form_values?.reimbursement_type || '').trim() @@ -305,21 +396,100 @@ export function useTravelReimbursementSubmitComposer(ctx) { let ocrSummary = '' let ocrDocuments = [] let ocrFilePreviews = [] + const recognizedAttachmentData = normalizeRecognizedAttachmentData(options.recognizedAttachmentData) if (files.length) { const ocrStartedAt = Date.now() startFlowStep('ocr', { detail: `正在识别 ${files.length} 份附件...`, startedAt: ocrStartedAt }) - try { - ocrPayload = await recognizeOcrFiles(files) - ocrSummary = buildOcrSummary(ocrPayload) - ocrDocuments = normalizeOcrDocuments(ocrPayload) - ocrFilePreviews = buildOcrFilePreviews(ocrPayload) + if (recognizedAttachmentData) { + ocrPayload = recognizedAttachmentData.ocrPayload + ocrSummary = recognizedAttachmentData.ocrSummary || buildOcrSummaryFromDocuments(recognizedAttachmentData.ocrDocuments) + ocrDocuments = [...recognizedAttachmentData.ocrDocuments] + ocrFilePreviews = [...recognizedAttachmentData.ocrFilePreviews] rememberFilePreviews(ocrFilePreviews) - completeFlowStep('ocr', `识别到 ${ocrDocuments.length || files.length} 张票据`, Date.now() - ocrStartedAt) - } catch (error) { - console.warn('OCR request failed:', error) - completeFlowStep('ocr', 'OCR识别失败,已继续使用附件名称', Date.now() - ocrStartedAt) + completeFlowStep('ocr', `复用已确认的 ${ocrDocuments.length || files.length} 张票据识别结果`, Date.now() - ocrStartedAt) + } else { + try { + ocrPayload = await recognizeOcrFiles(files, { + timeoutMs: 90000, + timeoutMessage: '票据 OCR 识别超时,已继续使用附件名称处理。' + }) + ocrSummary = buildOcrSummary(ocrPayload) + ocrDocuments = normalizeOcrDocuments(ocrPayload) + ocrFilePreviews = buildOcrFilePreviews(ocrPayload) + rememberFilePreviews(ocrFilePreviews) + completeFlowStep('ocr', `识别到 ${ocrDocuments.length || files.length} 张票据`, Date.now() - ocrStartedAt) + } catch (error) { + console.warn('OCR request failed:', error) + completeFlowStep('ocr', 'OCR识别失败,已继续使用附件名称', Date.now() - ocrStartedAt) + } } + + if (resolvedUploadDisposition === 'continue_existing') { + replaceMessage(pendingMessage.id, { + ...pendingMessage, + text: attachmentAssociationConfirmed + ? '票据识别已完成,正在把本次附件归集到已选择的草稿...' + : '票据识别已完成,正在整理归集前确认信息...', + meta: attachmentAssociationConfirmed ? ['正在归集'] : ['等待确认归集'] + }) + persistSessionState() + } + } + + const associationTargetClaimId = String(extraContext.draft_claim_id || draftClaimId.value || '').trim() + const associationTargetClaimNo = String( + extraContext.selected_claim_no || + extraContext.draft_claim_no || + '' + ).trim() + if ( + files.length && + resolvedUploadDisposition === 'continue_existing' && + associationTargetClaimId && + !attachmentAssociationConfirmed + ) { + const associationId = createPendingAttachmentAssociationId() + const pendingAssociation = { + id: associationId, + status: 'pending', + claimId: associationTargetClaimId, + claimNo: associationTargetClaimNo, + fileNames + } + pendingAttachmentAssociations.set(associationId, { + files, + fileNames, + ocrPayload, + ocrSummary, + ocrDocuments, + ocrFilePreviews, + filePreviews, + claimId: associationTargetClaimId, + claimNo: associationTargetClaimNo, + extraContext: { + ...extraContext, + draft_claim_id: associationTargetClaimId, + selected_claim_id: associationTargetClaimId, + selected_claim_no: associationTargetClaimNo + } + }) + replaceMessage(pendingMessage.id, createMessage( + 'assistant', + buildAttachmentAssociationConfirmationMessage({ + claimNo: associationTargetClaimNo, + fileNames, + ocrDocuments + }), + [], + { + meta: ['等待确认归集'], + pendingAttachmentAssociation: pendingAssociation + } + )) + persistSessionState() + nextTick(scrollToBottom) + return null } let effectiveFileNames = [...fileNames] @@ -359,6 +529,16 @@ export function useTravelReimbursementSubmitComposer(ctx) { }) const backendMessage = buildBackendMessage(rawText, effectiveFileNames, effectiveOcrSummary) + const orchestratorOptions = isKnowledgeSession.value + ? { + timeoutMs: 18000, + timeoutMessage: '知识问答整理超时,已停止等待。建议缩小问题范围或稍后重试。' + } + : { + timeoutMs: 120000, + timeoutMessage: '票据归集处理超时,当前仍停留在原草稿,请稍后重试或重新选择附件。' + } + const payload = await runOrchestrator( { source: 'user_message', @@ -393,12 +573,7 @@ export function useTravelReimbursementSubmitComposer(ctx) { ...extraContext } }, - isKnowledgeSession.value - ? { - timeoutMs: 18000, - timeoutMessage: '知识问答整理超时,已停止等待。建议缩小问题范围或稍后重试。' - } - : {} + orchestratorOptions ) responsePayload = payload flowRunId.value = String(payload?.run_id || '').trim() @@ -413,35 +588,42 @@ export function useTravelReimbursementSubmitComposer(ctx) { ? '' : String(payload?.result?.draft_payload?.claim_id || '').trim() || draftClaimId.value - replaceMessage( - pendingMessage.id, - createMessage('assistant', payload?.result?.answer || payload?.result?.message || '智能体已完成处理。', [], { - meta: buildMessageMeta(payload, effectiveFileNames), - citations: Array.isArray(payload?.result?.citations) ? payload.result.citations : [], - suggestedActions: Array.isArray(payload?.result?.suggested_actions) - ? payload.result.suggested_actions - : [], - queryPayload: normalizeExpenseQueryPayload(payload?.result?.query_payload), - draftPayload: payload?.result?.draft_payload || null, - reviewPayload: payload?.result?.review_payload || null, - riskFlags: Array.isArray(payload?.result?.risk_flags) ? payload.result.risk_flags : [] - }) - ) + const reviewActionResult = String(extraContext.review_action || '').trim() + const resultClaimNo = String(payload?.result?.draft_payload?.claim_no || '').trim() + const fallbackAnswer = reviewActionResult === 'link_to_existing_draft' + ? (resultClaimNo ? `已将本次上传的票据关联到草稿 ${resultClaimNo}。` : '已将本次上传的票据关联到现有草稿。') + : '智能体已完成处理。' + const assistantMessage = createMessage('assistant', payload?.result?.answer || payload?.result?.message || fallbackAnswer, [], { + meta: buildMessageMeta(payload, effectiveFileNames), + citations: Array.isArray(payload?.result?.citations) ? payload.result.citations : [], + suggestedActions: Array.isArray(payload?.result?.suggested_actions) + ? payload.result.suggested_actions + : [], + queryPayload: normalizeExpenseQueryPayload(payload?.result?.query_payload), + draftPayload: payload?.result?.draft_payload || null, + reviewPayload: payload?.result?.review_payload || null, + riskFlags: Array.isArray(payload?.result?.risk_flags) ? payload.result.risk_flags : [] + }) + replaceMessage(pendingMessage.id, assistantMessage) currentInsight.value = buildAgentInsight( payload, effectiveFileNames, mergeFilePreviews(filePreviews, ocrFilePreviews) ) completeFlowResult(payload, flowRunDetail) + persistSessionState() + nextTick(scrollToBottom) const resolvedDraftClaimId = String(payload?.result?.draft_payload?.claim_id || draftClaimId.value || '').trim() if (!isKnowledgeSession.value && resolvedDraftClaimId && files.length) { - try { - await syncComposerFilesToDraft(resolvedDraftClaimId, files) - } catch (error) { - console.warn('Failed to persist composer attachments to draft claim:', error) - toast(error?.message || '票据已识别,但附件原件保存失败,请重试上传。') - } + void syncComposerFilesToDraft(resolvedDraftClaimId, files) + .then(() => { + persistSessionState() + }) + .catch((error) => { + console.warn('Failed to persist composer attachments to draft claim:', error) + toast(error?.message || '票据已归集到草稿,但附件原件保存失败,请在单据详情中重新上传。') + }) } } catch (error) { clearFlowSimulationTimers() @@ -458,6 +640,7 @@ export function useTravelReimbursementSubmitComposer(ctx) { ) ) currentInsight.value = buildErrorInsight(error, fileNames) + persistSessionState() } finally { submitting.value = false composerUploadIntent.value = '' @@ -469,6 +652,7 @@ export function useTravelReimbursementSubmitComposer(ctx) { return { + confirmPendingAttachmentAssociationInternal: confirmPendingAttachmentAssociation, submitComposerInternal: submitComposer } } diff --git a/web/tests/attachment-association-confirmation.test.mjs b/web/tests/attachment-association-confirmation.test.mjs new file mode 100644 index 0000000..eb491bc --- /dev/null +++ b/web/tests/attachment-association-confirmation.test.mjs @@ -0,0 +1,34 @@ +import assert from 'node:assert/strict' +import test from 'node:test' + +import { + ATTACHMENT_ASSOCIATION_CONFIRM_HREF, + buildAttachmentAssociationConfirmationMessage +} from '../src/views/scripts/travelReimbursementAttachmentModel.js' + +test('attachment association prompt prints recognized receipt details before confirmation link', () => { + const message = buildAttachmentAssociationConfirmationMessage({ + claimNo: 'EXP-202605-001', + fileNames: ['train-ticket.pdf'], + ocrDocuments: [ + { + filename: 'train-ticket.pdf', + document_type: 'train_ticket', + scene_label: '差旅票据', + summary: '铁路电子客票 武汉-上海 票价 354 元', + document_fields: [ + { key: 'route', label: '行程', value: '武汉-上海' }, + { key: 'amount', label: '票价', value: '354.00' }, + { key: 'date', label: '乘车日期', value: '2026-02-20' } + ] + } + ] + }) + + assert.match(message, /已识别附件信息:/) + assert.match(message, /附件类型:差旅票据/) + assert.match(message, /行程:武汉-上海/) + assert.match(message, /票价:354.00/) + assert.match(message, /草稿单号:EXP-202605-001/) + assert.match(message, new RegExp(`\\[确认\\]\\(${ATTACHMENT_ASSOCIATION_CONFIRM_HREF}\\)`)) +}) diff --git a/web/tests/travel-reimbursement-review-drawer-switch.test.mjs b/web/tests/travel-reimbursement-review-drawer-switch.test.mjs index 6012459..c1de56d 100644 --- a/web/tests/travel-reimbursement-review-drawer-switch.test.mjs +++ b/web/tests/travel-reimbursement-review-drawer-switch.test.mjs @@ -156,19 +156,19 @@ test('review drawer save action is disabled while receipt recognition is submitt ) }) -test('draft creation waits for composer attachments to be persisted before leaving submit state', () => { +test('draft creation starts composer attachment persistence after response rendering', () => { assert.match( submitComposerScript, - /try \{\s*await syncComposerFilesToDraft\(resolvedDraftClaimId, files\)\s*\} catch \(error\) \{/s + /void syncComposerFilesToDraft\(resolvedDraftClaimId, files\)\s*\.then\(\(\) => \{\s*persistSessionState\(\)\s*\}\)\s*\.catch\(\(error\) => \{/s ) assert.doesNotMatch( submitComposerScript, - /syncComposerFilesToDraft\(resolvedDraftClaimId, files\)\.catch/ + /await syncComposerFilesToDraft\(resolvedDraftClaimId, files\)/ ) assert.ok( - submitComposerScript.indexOf('await syncComposerFilesToDraft(resolvedDraftClaimId, files)') < - submitComposerScript.indexOf('submitting.value = false'), - 'attachment persistence should finish before submit state is cleared' + submitComposerScript.indexOf('replaceMessage(pendingMessage.id, assistantMessage)') < + submitComposerScript.indexOf('void syncComposerFilesToDraft(resolvedDraftClaimId, files)'), + 'assistant response should render before background attachment persistence starts' ) assert.match(attachmentsScript, /function normalizeAttachmentMatchName\(value\)/) assert.match(attachmentsScript, /const normalizedMatchBuckets = new Map\(\)/)