deliveryman-api/app/api/endpoints/point.py
2025-02-13 16:24:30 +08:00

73 lines
2.3 KiB
Python

from fastapi import APIRouter, Depends
from sqlalchemy.orm import Session
from app.models.point import PointRecordDB, PointRecordCreate, PointRecordInfo
from app.models.user import UserDB
from app.models.database import get_db
from app.api.deps import get_current_user, get_admin_user
from app.core.response import success_response, error_response, ResponseModel
from typing import List
from decimal import Decimal
router = APIRouter()
@router.post("", response_model=ResponseModel)
async def add_points(
record: PointRecordCreate,
db: Session = Depends(get_db),
admin: UserDB = Depends(get_admin_user) # 仅管理员可操作
):
"""增加用户积分"""
user = db.query(UserDB).filter(UserDB.userid == record.user_id).first()
if not user:
return error_response(code=404, message="用户不存在")
# 创建积分记录
point_record = PointRecordDB(
user_id=record.user_id,
points=record.points,
description=record.description
)
db.add(point_record)
# 更新用户积分
user.points = user.points + Decimal(str(record.points))
try:
db.commit()
db.refresh(point_record)
return success_response(data=PointRecordInfo.model_validate(point_record))
except Exception as e:
db.rollback()
return error_response(code=500, message=f"操作失败: {str(e)}")
@router.get("/records", response_model=ResponseModel)
async def get_point_records(
skip: int = 0,
limit: int = 20,
db: Session = Depends(get_db),
current_user: UserDB = Depends(get_current_user)
):
"""积分明细"""
# 获取总记录数
total = db.query(PointRecordDB).filter(
PointRecordDB.user_id == current_user.userid
).count()
# 获取分页数据
records = db.query(PointRecordDB).filter(
PointRecordDB.user_id == current_user.userid
).order_by(
PointRecordDB.create_time.desc()
).offset(skip).limit(limit).all()
# 获取用户当前总积分
total_points = db.query(UserDB.points).filter(
UserDB.userid == current_user.userid
).scalar()
return success_response(data={
"total": total, # 总记录数
"total_points": total_points, # 当前总积分
"items": [PointRecordInfo.model_validate(r) for r in records] # 积分记录列表
})