from fastapi import APIRouter, Query, Depends, HTTPException from typing import Optional from app.schemas.base import Success, SuccessExtra, BasicResponse, PageResponse from app.schemas.app_user import AppUserQuotaUpdateSchema, AppUserQuotaLogOut from app.controllers.app_user import app_user_controller from app.models.user import AppUser, AppUserQuotaLog from app.core.dependency import DependAuth, DependPermission, AuthControl admin_app_users_router = APIRouter(dependencies=[DependAuth, DependPermission], tags=["admin-App用户管理"]) @admin_app_users_router.get("/list", summary="App用户列表", response_model=PageResponse[dict]) async def list_app_users( phone: Optional[str] = Query(None), wechat: Optional[str] = Query(None), page: int = Query(1, ge=1), page_size: int = Query(10, ge=1, le=100), ): qs = AppUser.filter() if phone: qs = qs.filter(phone__icontains=phone) if wechat: qs = qs.filter(alias__icontains=wechat) total = await qs.count() rows = await qs.order_by("-created_at").offset((page - 1) * page_size).limit(page_size) items = [] for u in rows: items.append({ "id": u.id, "phone": u.phone, "wechat": u.alias, "created_at": u.created_at.isoformat() if u.created_at else "", "notes": "", "remaining_count": int(getattr(u, "remaining_quota", 0) or 0), "user_type": None, }) return SuccessExtra(data=items, total=total, page=page, page_size=page_size, msg="获取成功") @admin_app_users_router.post("/quota", summary="调整用户剩余估值次数", response_model=BasicResponse[dict]) async def update_quota(payload: AppUserQuotaUpdateSchema, operator=Depends(AuthControl.is_authed)): user = await app_user_controller.update_quota( operator_id=getattr(operator, "id", 0), operator_name=getattr(operator, "username", "admin"), user_id=payload.user_id, target_count=payload.target_count, delta=payload.delta, op_type=payload.op_type, remark=payload.remark, ) if not user: raise HTTPException(status_code=404, detail="用户不存在") return Success(data={"user_id": user.id, "remaining_quota": user.remaining_quota}, msg="调整成功") @admin_app_users_router.get("/{user_id}/quota-logs", summary="用户估值次数操作日志", response_model=PageResponse[AppUserQuotaLogOut]) async def quota_logs(user_id: int, page: int = Query(1, ge=1), page_size: int = Query(10, ge=1, le=100)): qs = AppUserQuotaLog.filter(app_user_id=user_id) total = await qs.count() rows = await qs.order_by("-created_at").offset((page - 1) * page_size).limit(page_size) models = [ AppUserQuotaLogOut( id=r.id, app_user_id=r.app_user_id, operator_id=r.operator_id, operator_name=r.operator_name, before_count=r.before_count, after_count=r.after_count, op_type=r.op_type, remark=r.remark, ) for r in rows ] data_items = [m.model_dump() for m in models] return SuccessExtra(data=data_items, total=total, page=page, page_size=page_size, msg="获取成功")