deliveryman-api/app/api/endpoints/merchant_complaint.py
2025-03-20 09:10:27 +08:00

138 lines
4.5 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

from fastapi import APIRouter, Depends, HTTPException, Query
from sqlalchemy.orm import Session
from sqlalchemy import and_, desc, func
from typing import Optional, List
from app.core.response import success_response
from app.api.deps import get_db, get_current_user, get_admin_user
from app.models.merchant_complaint import MerchantComplaintDB, MerchantComplaintCreate, MerchantComplaintInfo, MerchantComplaintUpdate, ComplaintStatus
from app.models.user import UserDB
from app.models.merchant import MerchantDB
from datetime import datetime
from app.core.wecombot import WecomBot
router = APIRouter()
@router.get("/get_reason_list")
async def get_reason_list(
db: Session = Depends(get_db)
):
"""
获取投诉原因列表
"""
# 获取投诉原因列表
reason_list = [
"商家不让使用快捷买单",
"商家引导用户使用其他支付方式",
"商家存在食品安全问题",
"商家涉及违法违规行为"
]
return success_response(data={"items": reason_list}, message="投诉原因列表获取成功")
@router.post("/")
async def create_complaint(
complaint: MerchantComplaintCreate,
db: Session = Depends(get_db),
current_user: UserDB = Depends(get_current_user)
):
"""
创建商家投诉
"""
try:
# 检查商家是否存在
merchant = db.query(MerchantDB).filter(MerchantDB.id == complaint.merchant_id).first()
if not merchant:
raise HTTPException(status_code=404, detail="商家不存在")
# 创建投诉记录
db_complaint = MerchantComplaintDB(
user_id=current_user.userid, # 使用当前用户ID而不是请求中的user_id
merchant_id=complaint.merchant_id,
content=complaint.content,
image_urls=complaint.image_urls,
status=ComplaintStatus.PENDING # 默认状态为等待处理
)
db.add(db_complaint)
db.commit()
db.refresh(db_complaint)
# 发送企业微信消息
await WecomBot().send_merchant_complaint(db_complaint)
return success_response(data={"id": db_complaint.id}, message="投诉提交成功")
except Exception as e:
raise HTTPException(status_code=500, detail=str(e))
@router.get("/")
async def get_complaints(
status: Optional[ComplaintStatus] = None,
merchant_id: Optional[int] = None,
start_time: Optional[datetime] = None,
end_time: Optional[datetime] = None,
skip: int = Query(0, ge=0),
limit: int = Query(10, ge=1, le=100),
db: Session = Depends(get_db),
current_user: UserDB = Depends(get_current_user)
):
"""
获取当前用户的投诉列表
"""
# 构建查询条件
conditions = [MerchantComplaintDB.user_id == current_user.userid]
if status:
conditions.append(MerchantComplaintDB.status == status)
if merchant_id:
conditions.append(MerchantComplaintDB.merchant_id == merchant_id)
if start_time:
conditions.append(MerchantComplaintDB.create_time >= start_time)
if end_time:
conditions.append(MerchantComplaintDB.create_time <= end_time)
# 查询总数
total = db.query(func.count(MerchantComplaintDB.id)).filter(and_(*conditions)).scalar()
# 查询数据
complaints = db.query(MerchantComplaintDB).filter(and_(*conditions)).order_by(
desc(MerchantComplaintDB.create_time)
).offset(skip).limit(limit).all()
# 获取商家名称
result = []
for complaint in complaints:
complaint_info = MerchantComplaintInfo.model_validate(complaint)
complaint_info.merchant_name = complaint.merchant.name
complaint_info.user_name = complaint.user.nickname
result.append(complaint_info)
return success_response(data={
"total": total,
"items": result
})
@router.put("/{complaint_id}")
async def update_complaint_status(
complaint_id: int,
complaint_update: MerchantComplaintUpdate,
db: Session = Depends(get_db),
_: UserDB = Depends(get_admin_user) # 确保只有管理员可以修改状态
):
"""
更新投诉状态(仅管理员可用)
"""
# 查询投诉记录
complaint = db.query(MerchantComplaintDB).filter(MerchantComplaintDB.id == complaint_id).first()
if not complaint:
raise HTTPException(status_code=404, detail="投诉记录不存在")
# 更新状态
complaint.status = complaint_update.status
db.commit()
db.refresh(complaint)
return success_response(message="投诉状态更新成功")