diff --git a/app/api/endpoints/account.py b/app/api/endpoints/account.py index a85eca3..a67a20a 100644 --- a/app/api/endpoints/account.py +++ b/app/api/endpoints/account.py @@ -89,6 +89,7 @@ class AccountDetailItem(BaseModel): amount: float type: AccountDetailType description: str + transaction_id: Optional[str] = None create_time: datetime class Config: @@ -136,6 +137,7 @@ async def list_account_details( "amount": float(detail.amount), "type": detail.type, "description": detail.description, + "transaction_id": detail.transaction_id, "create_time": detail.create_time } for detail in details diff --git a/app/api/endpoints/merchant_order.py b/app/api/endpoints/merchant_order.py index 527225d..955d9c6 100644 --- a/app/api/endpoints/merchant_order.py +++ b/app/api/endpoints/merchant_order.py @@ -184,7 +184,8 @@ async def verify_order( account_manager.change_balance( user_id=order.MerchantDB.user_id, amount=settlement_amount, - description=f"{order.MerchantProductDB.name} 订单核销" + description=f"{order.MerchantProductDB.name} 订单核销", + transaction_id=order.MerchantOrderDB.order_id ) db.commit() diff --git a/app/core/account.py b/app/core/account.py index a1a9313..c62a9a8 100644 --- a/app/core/account.py +++ b/app/core/account.py @@ -1,6 +1,7 @@ from sqlalchemy.orm import Session from app.models.user_account import UserAccountDB, AccountDetailDB, AccountDetailType from decimal import Decimal +from typing import Optional class AccountManager: """用户账户管理类""" @@ -24,7 +25,13 @@ class AccountManager: return account - def change_balance(self, user_id: int, amount: float, description: str) -> UserAccountDB: + def change_balance( + self, + user_id: int, + amount: float, + description: str, + transaction_id: Optional[str] = None + ) -> UserAccountDB: """ 变更用户余额 @@ -32,6 +39,7 @@ class AccountManager: user_id: 用户ID amount: 变更金额(正数为收入,负数为支出) description: 变更说明 + transaction_id: 关联订单号 Returns: 更新后的账户信息 @@ -57,7 +65,8 @@ class AccountManager: user_id=user_id, amount=decimal_amount, type=AccountDetailType.INCOME if decimal_amount > 0 else AccountDetailType.EXPENSE, - description=description + description=description, + transaction_id=transaction_id ) self.db.add(detail) diff --git a/app/models/merchant_order.py b/app/models/merchant_order.py index 2853e8f..67d5738 100644 --- a/app/models/merchant_order.py +++ b/app/models/merchant_order.py @@ -67,7 +67,7 @@ def generate_order_id() -> str: date_str = now.strftime('%Y%m%d') # 取时间戳后7位 timestamp = str(int(time.time() * 1000))[-7:] - return f"{date_str}{timestamp}" + return f"M{date_str}{timestamp}" def generate_verify_code() -> str: """生成21位数字核销码""" diff --git a/app/models/order.py b/app/models/order.py index f939eeb..42d196b 100644 --- a/app/models/order.py +++ b/app/models/order.py @@ -116,7 +116,7 @@ def generate_order_id() -> str: date_str = now.strftime('%Y%m%d') # 8位日期 # 生成6位序号(毫秒级时间戳后6位) timestamp = str(int(now.timestamp() * 1000))[-6:] - return f"{date_str}{timestamp}" + return f"D{date_str}{timestamp}" class OrderPriceInfo(BaseModel): package_count: int diff --git a/app/models/user_account.py b/app/models/user_account.py index a8a6c3a..4a2e1e4 100644 --- a/app/models/user_account.py +++ b/app/models/user_account.py @@ -29,6 +29,7 @@ class AccountDetailDB(Base): amount = Column(DECIMAL(10, 2), nullable=False) type = Column(Enum(AccountDetailType), nullable=False) description = Column(String(200), nullable=False) + transaction_id = Column(String(64), nullable=True) # 关联订单号 create_time = Column(DateTime(timezone=True), server_default=func.now()) # Pydantic 模型