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] # 积分记录列表 })