diff --git a/app/api/endpoints/merchant_order.py b/app/api/endpoints/merchant_order.py index c425724..97b8095 100644 --- a/app/api/endpoints/merchant_order.py +++ b/app/api/endpoints/merchant_order.py @@ -16,6 +16,7 @@ from app.models.user import UserDB from app.core.response import success_response, error_response, ResponseModel from datetime import datetime, timezone from app.models.merchant import MerchantDB +from app.models.user_point_log import UserPointLogDB, PointChangeType router = APIRouter() @@ -67,9 +68,18 @@ async def create_order( order_verify_code=verify_code ) - # 扣除用户积分 + # 扣除用户积分并记录日志 if deduct_amount > 0: current_user.points -= deduct_amount + + # 记录积分变动日志 + point_log = UserPointLogDB( + user_id=current_user.userid, + change_amount=-deduct_amount, # 负数表示扣减 + type=PointChangeType.CONSUME_DEDUCT, + remark=f"订单{order_id}消费抵扣" + ) + db.add(point_log) db.add(db_order) @@ -230,7 +240,11 @@ async def confirm_refund( current_user: UserDB = Depends(get_admin_user) ): """确认退款(管理员)""" - order = db.query(MerchantOrderDB).filter( + # 查询订单和用户信息 + order = db.query(MerchantOrderDB).join( + UserDB, + MerchantOrderDB.user_id == UserDB.userid + ).filter( MerchantOrderDB.order_id == order_id, MerchantOrderDB.status == MerchantOrderStatus.REFUNDING # 只能确认退款中的订单 ).first() @@ -238,10 +252,24 @@ async def confirm_refund( if not order: return error_response(code=404, message="订单不存在或状态不正确") - # 更新状态为已退款 - order.status = MerchantOrderStatus.REFUNDED - try: + # 更新状态为已退款 + order.status = MerchantOrderStatus.REFUNDED + + # 如果有积分抵扣,返还积分 + if order.deduct_amount > 0: + # 返还用户积分 + order.user.points += float(order.deduct_amount) + + # 记录积分变动日志 + point_log = UserPointLogDB( + user_id=order.user_id, + change_amount=float(order.deduct_amount), # 正数表示返还 + type=PointChangeType.CONSUME_RETURN, + remark=f"订单{order_id}退款返还" + ) + db.add(point_log) + db.commit() return success_response( message="退款确认成功", diff --git a/app/models/user_point_log.py b/app/models/user_point_log.py new file mode 100644 index 0000000..c8b7f67 --- /dev/null +++ b/app/models/user_point_log.py @@ -0,0 +1,33 @@ +from sqlalchemy import Column, Integer, DateTime, ForeignKey, Enum, String +from sqlalchemy.sql import func +from .database import Base +import enum +from pydantic import BaseModel +from datetime import datetime +from typing import Optional + +class PointChangeType(str, enum.Enum): + CONSUME_RETURN = "CONSUME_RETURN" # 消费返还 + CONSUME_DEDUCT = "CONSUME_DEDUCT" # 消费抵扣 + SYSTEM_SEND = "SYSTEM_SEND" # 系统发放 + +class UserPointLogDB(Base): + __tablename__ = "user_point_logs" + + id = Column(Integer, primary_key=True, autoincrement=True) + user_id = Column(Integer, ForeignKey("users.userid"), nullable=False) + change_amount = Column(Integer, nullable=False) # 变动数量,正数为增加,负数为减少 + type = Column(Enum(PointChangeType), nullable=False) + remark = Column(String(200)) # 备注说明 + create_time = Column(DateTime(timezone=True), server_default=func.now()) + +class UserPointLogInfo(BaseModel): + id: int + user_id: int + change_amount: int + type: PointChangeType + remark: Optional[str] + create_time: datetime + + class Config: + from_attributes = True \ No newline at end of file