deliveryman-api/app/api/endpoints/order_additional_fee.py
2025-03-07 14:11:29 +08:00

176 lines
6.1 KiB
Python

from fastapi import APIRouter, Depends, Query
from sqlalchemy.orm import Session
from app.models.order_additional_fee import (
OrderAdditionalFeeDB,
OrderAdditionalFeeCreate,
OrderAdditionalFeeUpdate,
OrderAdditionalFeeInfo,
AdditionalFeeResult
)
from app.models.order import ShippingOrderDB, OrderStatus
from app.models.database import get_db
from app.api.deps import get_current_user, get_deliveryman_user
from app.models.user import UserDB
from app.core.response import success_response, error_response, ResponseModel
from typing import List, Optional
from datetime import datetime
import aiohttp
from app.core.config import settings
router = APIRouter()
@router.post("", response_model=ResponseModel)
async def create_additional_fee_request(
fee_request: OrderAdditionalFeeCreate,
db: Session = Depends(get_db),
deliveryman: UserDB = Depends(get_deliveryman_user)
):
"""创建加价请求(配送员)"""
# 检查订单是否存在
order = db.query(ShippingOrderDB).filter(
ShippingOrderDB.orderid == fee_request.orderid
).first()
if not order:
return error_response(code=404, message="订单不存在")
# 检查是否是该订单的配送员
if order.deliveryman_user_id != deliveryman.userid:
return error_response(code=403, message="您不是该订单的配送员")
# 检查是否已经有未处理的加价请求
existing_request = db.query(OrderAdditionalFeeDB).filter(
OrderAdditionalFeeDB.orderid == fee_request.orderid
).first()
if existing_request:
return error_response(code=400, message="该订单已有未处理的加价请求")
# 创建加价请求
db_fee_request = OrderAdditionalFeeDB(
orderid=fee_request.orderid,
order_user_id=order.userid,
deliveryman_id=deliveryman.userid,
reason=fee_request.reason,
photo_urls=fee_request.photo_urls,
additional_fee_amount=fee_request.additional_fee_amount,
result=AdditionalFeeResult.PENDING
)
db.add(db_fee_request)
try:
db.commit()
db.refresh(db_fee_request)
# TODO: 发送通知给用户
return success_response(data=OrderAdditionalFeeInfo.model_validate(db_fee_request))
except Exception as e:
db.rollback()
return error_response(code=500, message=f"创建加价请求失败: {str(e)}")
@router.get("/order/{orderid}", response_model=ResponseModel)
async def get_order_additional_fees(
orderid: str,
db: Session = Depends(get_db),
current_user: UserDB = Depends(get_current_user)
):
"""获取订单的加价请求列表"""
# 检查订单是否存在
order = db.query(ShippingOrderDB).filter(
ShippingOrderDB.orderid == orderid
).first()
if not order:
return error_response(code=404, message="订单不存在")
# 检查是否是订单相关人员
if order.userid != current_user.userid and order.deliveryman_user_id != current_user.userid:
return error_response(code=403, message="您无权查看该订单的加价请求")
# 获取加价请求列表
request = db.query(OrderAdditionalFeeDB).filter(
OrderAdditionalFeeDB.orderid == orderid
).order_by(OrderAdditionalFeeDB.create_time.desc()).first()
return success_response(data=OrderAdditionalFeeInfo.model_validate(request))
@router.put("/{request_id}/accept", response_model=ResponseModel)
async def accept_additional_fee(
request_id: int,
db: Session = Depends(get_db),
current_user: UserDB = Depends(get_current_user)
):
"""接受加价请求(用户)"""
# 获取加价请求
fee_request = db.query(OrderAdditionalFeeDB).filter(
OrderAdditionalFeeDB.id == request_id
).first()
if not fee_request:
return error_response(code=404, message="加价请求不存在")
# 检查是否是订单用户
if fee_request.order_user_id != current_user.userid:
return error_response(code=403, message="您无权处理该加价请求")
# 检查请求状态
if fee_request.result != AdditionalFeeResult.PENDING:
return error_response(code=400, message="该加价请求已处理")
# 更新请求状态
fee_request.result = AdditionalFeeResult.ACCEPTED
# 更新订单金额
order = db.query(ShippingOrderDB).filter(
ShippingOrderDB.orderid == fee_request.orderid
).first()
if order:
order.additional_fee_amount = float(fee_request.additional_fee_amount)
order.final_amount = float(order.final_amount) + float(fee_request.additional_fee_amount)
try:
db.commit()
# TODO: 发送通知给配送员
return success_response(message="已接受加价请求")
except Exception as e:
db.rollback()
return error_response(code=500, message=f"处理加价请求失败: {str(e)}")
# 更新加价请求
@router.put("/{request_id}", response_model=ResponseModel)
async def update_additional_fee(
request_id: int,
fee_request: OrderAdditionalFeeUpdate,
db: Session = Depends(get_db),
current_user: UserDB = Depends(get_current_user)
):
"""更新加价请求"""
# 获取加价请求
fee_request = db.query(OrderAdditionalFeeDB).filter(
OrderAdditionalFeeDB.id == request_id
).first()
if not fee_request:
return error_response(code=404, message="加价请求不存在")
# 检查是否是订单用户
if fee_request.order_user_id != current_user.userid:
return error_response(code=403, message="您无权处理该加价请求")
# 更新加价请求
fee_request.reason = fee_request.reason
fee_request.photo_urls = fee_request.photo_urls
fee_request.additional_fee_amount = fee_request.additional_fee_amount
try:
db.commit()
db.refresh(fee_request)
return success_response(data=OrderAdditionalFeeInfo.model_validate(fee_request))
except Exception as e:
db.rollback()
return error_response(code=500, message=f"更新加价请求失败: {str(e)}")