完善积分变化的日志记录。

This commit is contained in:
aaron 2025-01-13 22:03:58 +08:00
parent 9e8bb7747f
commit 13c7ab3655
2 changed files with 66 additions and 5 deletions

View File

@ -16,6 +16,7 @@ from app.models.user import UserDB
from app.core.response import success_response, error_response, ResponseModel from app.core.response import success_response, error_response, ResponseModel
from datetime import datetime, timezone from datetime import datetime, timezone
from app.models.merchant import MerchantDB from app.models.merchant import MerchantDB
from app.models.user_point_log import UserPointLogDB, PointChangeType
router = APIRouter() router = APIRouter()
@ -67,9 +68,18 @@ async def create_order(
order_verify_code=verify_code order_verify_code=verify_code
) )
# 扣除用户积分 # 扣除用户积分并记录日志
if deduct_amount > 0: if deduct_amount > 0:
current_user.points -= deduct_amount 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) db.add(db_order)
@ -230,7 +240,11 @@ async def confirm_refund(
current_user: UserDB = Depends(get_admin_user) 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.order_id == order_id,
MerchantOrderDB.status == MerchantOrderStatus.REFUNDING # 只能确认退款中的订单 MerchantOrderDB.status == MerchantOrderStatus.REFUNDING # 只能确认退款中的订单
).first() ).first()
@ -238,10 +252,24 @@ async def confirm_refund(
if not order: if not order:
return error_response(code=404, message="订单不存在或状态不正确") return error_response(code=404, message="订单不存在或状态不正确")
# 更新状态为已退款
order.status = MerchantOrderStatus.REFUNDED
try: 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() db.commit()
return success_response( return success_response(
message="退款确认成功", message="退款确认成功",

View File

@ -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