update
This commit is contained in:
parent
e6f266b5b1
commit
5ca85d9edb
178
app/api/endpoints/order_additional_fee.py
Normal file
178
app/api/endpoints/order_additional_fee.py
Normal file
@ -0,0 +1,178 @@
|
|||||||
|
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="您无权查看该订单的加价请求")
|
||||||
|
|
||||||
|
# 获取加价请求列表
|
||||||
|
fee_requests = db.query(OrderAdditionalFeeDB).filter(
|
||||||
|
OrderAdditionalFeeDB.orderid == orderid
|
||||||
|
).order_by(OrderAdditionalFeeDB.create_time.desc()).all()
|
||||||
|
|
||||||
|
return success_response(data=[
|
||||||
|
OrderAdditionalFeeInfo.model_validate(req) for req in fee_requests
|
||||||
|
])
|
||||||
|
|
||||||
|
@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)}")
|
||||||
@ -1,6 +1,6 @@
|
|||||||
from fastapi import FastAPI
|
from fastapi import FastAPI
|
||||||
from fastapi.middleware.cors import CORSMiddleware
|
from fastapi.middleware.cors import CORSMiddleware
|
||||||
from app.api.endpoints import wechat,user, address, community, station, order, coupon, community_building, upload, merchant, merchant_product, merchant_order, point, config, merchant_category, log, account,merchant_pay_order, message, bank_card, withdraw, mp, point_product, point_product_order, coupon_activity, ocr, dashboard, wecom, feedback, timeperiod, community_timeperiod
|
from app.api.endpoints import wechat,user, address, community, station, order, coupon, community_building, upload, merchant, merchant_product, merchant_order, point, config, merchant_category, log, account,merchant_pay_order, message, bank_card, withdraw, mp, point_product, point_product_order, coupon_activity, ocr, dashboard, wecom, feedback, timeperiod, community_timeperiod, order_additional_fee
|
||||||
from app.models.database import Base, engine
|
from app.models.database import Base, engine
|
||||||
from fastapi.exceptions import RequestValidationError
|
from fastapi.exceptions import RequestValidationError
|
||||||
from fastapi.responses import JSONResponse
|
from fastapi.responses import JSONResponse
|
||||||
@ -61,8 +61,11 @@ app.include_router(account.router, prefix="/api/account", tags=["账户"])
|
|||||||
app.include_router(address.router, prefix="/api/address", tags=["配送地址"])
|
app.include_router(address.router, prefix="/api/address", tags=["配送地址"])
|
||||||
app.include_router(community.router, prefix="/api/community", tags=["社区"])
|
app.include_router(community.router, prefix="/api/community", tags=["社区"])
|
||||||
app.include_router(community_building.router, prefix="/api/community/building", tags=["社区楼栋"])
|
app.include_router(community_building.router, prefix="/api/community/building", tags=["社区楼栋"])
|
||||||
|
app.include_router(timeperiod.router, prefix="/api/time-periods", tags=["配送时段"])
|
||||||
|
app.include_router(community_timeperiod.router, prefix="/api/community-time-periods", tags=["社区配送时段"])
|
||||||
app.include_router(station.router, prefix="/api/station", tags=["驿站"])
|
app.include_router(station.router, prefix="/api/station", tags=["驿站"])
|
||||||
app.include_router(order.router, prefix="/api/order", tags=["订单"])
|
app.include_router(order.router, prefix="/api/order", tags=["订单"])
|
||||||
|
app.include_router(order_additional_fee.router, prefix="/api/order-additional-fee", tags=["订单加价"])
|
||||||
app.include_router(coupon.router, prefix="/api/coupon", tags=["抵扣券"])
|
app.include_router(coupon.router, prefix="/api/coupon", tags=["抵扣券"])
|
||||||
app.include_router(coupon_activity.router, prefix="/api/coupon-activities", tags=["抵扣券活动"])
|
app.include_router(coupon_activity.router, prefix="/api/coupon-activities", tags=["抵扣券活动"])
|
||||||
app.include_router(merchant.router, prefix="/api/merchant", tags=["商家"])
|
app.include_router(merchant.router, prefix="/api/merchant", tags=["商家"])
|
||||||
@ -76,8 +79,7 @@ app.include_router(config.router, prefix="/api/config", tags=["系统配置"])
|
|||||||
app.include_router(log.router, prefix="/api/logs", tags=["系统日志"])
|
app.include_router(log.router, prefix="/api/logs", tags=["系统日志"])
|
||||||
app.include_router(ocr.router, prefix="/api/ai/ocr", tags=["图像识别"])
|
app.include_router(ocr.router, prefix="/api/ai/ocr", tags=["图像识别"])
|
||||||
app.include_router(feedback.router, prefix="/api/feedback", tags=["反馈"])
|
app.include_router(feedback.router, prefix="/api/feedback", tags=["反馈"])
|
||||||
app.include_router(timeperiod.router, prefix="/api/time-periods", tags=["配送时段"])
|
|
||||||
app.include_router(community_timeperiod.router, prefix="/api/community-time-periods", tags=["社区配送时段"])
|
|
||||||
|
|
||||||
@app.get("/")
|
@app.get("/")
|
||||||
async def root():
|
async def root():
|
||||||
|
|||||||
@ -71,6 +71,7 @@ class ShippingOrderDB(Base):
|
|||||||
original_amount = Column(Float, nullable=False)
|
original_amount = Column(Float, nullable=False)
|
||||||
coupon_discount_amount = Column(Float, default=0)
|
coupon_discount_amount = Column(Float, default=0)
|
||||||
point_discount_amount = Column(Float, default=0)
|
point_discount_amount = Column(Float, default=0)
|
||||||
|
additional_fee_amount = Column(Float, default=0)
|
||||||
coupon_id = Column(Integer, ForeignKey("user_coupons.id"), nullable=True)
|
coupon_id = Column(Integer, ForeignKey("user_coupons.id"), nullable=True)
|
||||||
final_amount = Column(Float, nullable=False)
|
final_amount = Column(Float, nullable=False)
|
||||||
status = Column(Enum(OrderStatus), nullable=False, default=OrderStatus.CREATED)
|
status = Column(Enum(OrderStatus), nullable=False, default=OrderStatus.CREATED)
|
||||||
@ -161,11 +162,12 @@ class OrderInfo(BaseModel):
|
|||||||
pickup_images_count: int
|
pickup_images_count: int
|
||||||
package_count: int
|
package_count: int
|
||||||
pickup_code_count: int
|
pickup_code_count: int
|
||||||
original_amount: float
|
original_amount: float = 0
|
||||||
coupon_discount_amount: float
|
coupon_discount_amount: float = 0
|
||||||
point_discount_amount: float = 0
|
point_discount_amount: float = 0
|
||||||
coupon_id: Optional[int]
|
additional_fee_amount: float = 0
|
||||||
final_amount: float
|
coupon_id: Optional[int] = None
|
||||||
|
final_amount: float = 0
|
||||||
status: OrderStatus
|
status: OrderStatus
|
||||||
complete_images: Optional[str] = None
|
complete_images: Optional[str] = None
|
||||||
optimized_complete_images: Optional[List[str]] = None
|
optimized_complete_images: Optional[List[str]] = None
|
||||||
|
|||||||
54
app/models/order_additional_fee.py
Normal file
54
app/models/order_additional_fee.py
Normal file
@ -0,0 +1,54 @@
|
|||||||
|
from sqlalchemy import Column, Integer, String, DateTime, ForeignKey, Enum, DECIMAL, JSON
|
||||||
|
from sqlalchemy.sql import func
|
||||||
|
from pydantic import BaseModel, Field
|
||||||
|
from typing import Optional, List
|
||||||
|
from datetime import datetime
|
||||||
|
from .database import Base
|
||||||
|
import enum
|
||||||
|
|
||||||
|
class AdditionalFeeResult(str, enum.Enum):
|
||||||
|
PENDING = "PENDING" # 待处理
|
||||||
|
ACCEPTED = "ACCEPTED" # 已接受
|
||||||
|
REJECTED = "REJECTED" # 已拒绝
|
||||||
|
|
||||||
|
class OrderAdditionalFeeDB(Base):
|
||||||
|
__tablename__ = "order_additional_fees"
|
||||||
|
|
||||||
|
id = Column(Integer, primary_key=True, autoincrement=True)
|
||||||
|
orderid = Column(String(32), ForeignKey("shipping_orders.orderid"), nullable=False, index=True)
|
||||||
|
order_user_id = Column(Integer, ForeignKey("users.userid"), nullable=False)
|
||||||
|
deliveryman_id = Column(Integer, ForeignKey("users.userid"), nullable=False)
|
||||||
|
reason = Column(String(200), nullable=False)
|
||||||
|
photo_urls = Column(JSON, nullable=True) # 存储照片URL的JSON数组
|
||||||
|
additional_fee_amount = Column(DECIMAL(10, 2), nullable=False)
|
||||||
|
result = Column(Enum(AdditionalFeeResult), nullable=False, default=AdditionalFeeResult.PENDING)
|
||||||
|
create_time = Column(DateTime(timezone=True), server_default=func.now())
|
||||||
|
update_time = Column(DateTime(timezone=True), onupdate=func.now())
|
||||||
|
|
||||||
|
# Pydantic 模型
|
||||||
|
class OrderAdditionalFeeCreate(BaseModel):
|
||||||
|
orderid: str
|
||||||
|
reason: str = Field(..., max_length=200)
|
||||||
|
photo_urls: Optional[List[str]] = None
|
||||||
|
additional_fee_amount: float = Field(..., gt=0)
|
||||||
|
|
||||||
|
class OrderAdditionalFeeUpdate(BaseModel):
|
||||||
|
id: int
|
||||||
|
reason: str
|
||||||
|
photo_urls: Optional[List[str]]
|
||||||
|
additional_fee_amount: float
|
||||||
|
|
||||||
|
class OrderAdditionalFeeInfo(BaseModel):
|
||||||
|
id: int
|
||||||
|
orderid: str
|
||||||
|
order_user_id: int
|
||||||
|
deliveryman_id: int
|
||||||
|
reason: str
|
||||||
|
photo_urls: Optional[List[str]]
|
||||||
|
additional_fee_amount: float
|
||||||
|
result: AdditionalFeeResult
|
||||||
|
create_time: datetime
|
||||||
|
update_time: Optional[datetime] = None
|
||||||
|
|
||||||
|
class Config:
|
||||||
|
from_attributes = True
|
||||||
Loading…
Reference in New Issue
Block a user