feat: Airwallex 发卡管理后台完整实现

- 后端: FastAPI + SQLAlchemy + SQLite, JWT认证, 代理支持的AirwallexClient
- 前端: React 18 + Vite + Ant Design 5, 中文界面
- 功能: 卡片管理, 持卡人管理, 交易记录, API令牌, 系统设置, 审计日志
- 第三方API: X-API-Key认证, 权限控制
- Docker部署: docker-compose编排前后端
This commit is contained in:
zqq61
2026-03-15 23:05:08 +08:00
commit 4f53889a8e
98 changed files with 10847 additions and 0 deletions

View File

@@ -0,0 +1,42 @@
"""
Models for the Airwallex Issuing Transaction API.
"""
from typing import Optional, List, Dict, Any
from datetime import datetime
from pydantic import Field
from .base import AirwallexModel
from .issuing_common import Merchant, RiskDetails, HasMoreResponse
class Transaction(AirwallexModel):
"""Model for an Airwallex issuing transaction."""
resource_name: str = "issuing/transactions"
acquiring_institution_identifier: Optional[str] = Field(None, description="Unique Identifier for acquiring institution")
auth_code: Optional[str] = Field(None, description="Authorization Code")
billing_amount: float = Field(..., description="Billing amount")
billing_currency: str = Field(..., description="Billing Currency")
card_id: str = Field(..., description="Unique Identifier for card")
card_nickname: Optional[str] = Field(None, description="The nickname of the card used")
client_data: Optional[str] = Field(None, description="Client data stored against the card record")
digital_wallet_token_id: Optional[str] = Field(None, description="Unique Identifier for digital token")
failure_reason: Optional[str] = Field(None, description="The reason why this transaction failed")
lifecycle_id: Optional[str] = Field(None, description="Lifecycle ID")
masked_card_number: str = Field(..., description="Masked card number")
matched_authorizations: Optional[List[str]] = Field(None, description="Matched authorization IDs")
merchant: Optional[Merchant] = Field(None, description="Merchant details")
network_transaction_id: Optional[str] = Field(None, description="Network transaction ID")
posted_date: Optional[datetime] = Field(None, description="Posted date")
retrieval_ref: Optional[str] = Field(None, description="Retrieval reference number")
risk_details: Optional[RiskDetails] = Field(None, description="Risk details")
status: str = Field(..., description="Transaction status")
transaction_amount: float = Field(..., description="Transaction amount")
transaction_currency: str = Field(..., description="Transaction currency")
transaction_date: datetime = Field(..., description="Transaction date")
transaction_id: str = Field(..., description="Transaction ID")
transaction_type: str = Field(..., description="Transaction type")
class TransactionListResponse(HasMoreResponse):
"""Model for transaction list response."""
items: List[Transaction] = Field(..., description="List of transactions")