refactor: 优化响应格式和错误处理 fix: 修复文件上传类型校验和删除无用PDF文件 perf: 添加估值评估审核时间字段和查询条件 docs: 更新Docker镜像版本至v1.8 test: 添加响应格式检查脚本 style: 统一API响应数据结构 chore: 清理无用静态文件和更新构建脚本
102 lines
4.5 KiB
Python
102 lines
4.5 KiB
Python
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, AppUserUpdateSchema
|
|
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": getattr(u, "notes", "") or "",
|
|
"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="用户不存在")
|
|
# if payload.remark is not None:
|
|
# user.notes = payload.remark
|
|
# await user.save()
|
|
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,
|
|
created_at=r.created_at.isoformat() if r.created_at else "",
|
|
) 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="获取成功")
|
|
|
|
|
|
@admin_app_users_router.put("/{user_id}", summary="更新App用户信息", response_model=BasicResponse[dict])
|
|
async def update_app_user(user_id: int, data: AppUserUpdateSchema):
|
|
user = await app_user_controller.update_user_info(user_id, data)
|
|
if not user:
|
|
raise HTTPException(status_code=404, detail="用户不存在")
|
|
return Success(data={
|
|
"id": user.id,
|
|
"phone": user.phone,
|
|
"wechat": getattr(user, "alias", None),
|
|
"company_name": getattr(user, "company_name", None),
|
|
"company_address": getattr(user, "company_address", None),
|
|
"company_contact": getattr(user, "company_contact", None),
|
|
"company_phone": getattr(user, "company_phone", None),
|
|
"company_email": getattr(user, "company_email", None),
|
|
"is_active": user.is_active,
|
|
"created_at": user.created_at.isoformat() if user.created_at else "",
|
|
"updated_at": user.updated_at.isoformat() if user.updated_at else "",
|
|
"remaining_quota": int(getattr(user, "remaining_quota", 0) or 0),
|
|
}, msg="更新成功")
|