完善积分变化的日志记录。
This commit is contained in:
parent
9e8bb7747f
commit
13c7ab3655
@ -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="退款确认成功",
|
||||||
|
|||||||
33
app/models/user_point_log.py
Normal file
33
app/models/user_point_log.py
Normal 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
|
||||||
Loading…
Reference in New Issue
Block a user