update
This commit is contained in:
parent
a12ed5d934
commit
d33be5dda7
@ -35,6 +35,7 @@ from app.models.merchant_product import DeliveryType, DeliveryTimeType
|
|||||||
from datetime import timedelta
|
from datetime import timedelta
|
||||||
from fastapi import BackgroundTasks
|
from fastapi import BackgroundTasks
|
||||||
from app.core.mpmessage import sent_merchant_order_status_change_message
|
from app.core.mpmessage import sent_merchant_order_status_change_message
|
||||||
|
from sqlalchemy.orm import joinedload
|
||||||
router = APIRouter()
|
router = APIRouter()
|
||||||
|
|
||||||
@router.post("", response_model=ResponseModel)
|
@router.post("", response_model=ResponseModel)
|
||||||
@ -120,7 +121,7 @@ async def create_merchant_order(
|
|||||||
@router.get("/merchant", response_model=ResponseModel)
|
@router.get("/merchant", response_model=ResponseModel)
|
||||||
async def get_merchant_orders(
|
async def get_merchant_orders(
|
||||||
skip: int = 0,
|
skip: int = 0,
|
||||||
limit: int = 100,
|
limit: int = 20,
|
||||||
delivery_type: Optional[DeliveryType] = None,
|
delivery_type: Optional[DeliveryType] = None,
|
||||||
delivery_time_type: Optional[DeliveryTimeType] = None,
|
delivery_time_type: Optional[DeliveryTimeType] = None,
|
||||||
status: Optional[MerchantOrderStatus] = None,
|
status: Optional[MerchantOrderStatus] = None,
|
||||||
@ -128,8 +129,19 @@ async def get_merchant_orders(
|
|||||||
merchant_user: UserDB = Depends(get_merchant_user)
|
merchant_user: UserDB = Depends(get_merchant_user)
|
||||||
):
|
):
|
||||||
"""获取商家订单列表"""
|
"""获取商家订单列表"""
|
||||||
|
merchant = db.query(MerchantDB).filter(
|
||||||
|
MerchantDB.user_id == merchant_user.userid
|
||||||
|
).first()
|
||||||
|
|
||||||
|
if not merchant:
|
||||||
|
return error_response(code=404, message="商家不存在")
|
||||||
|
|
||||||
query = db.query(MerchantOrderDB).filter(
|
query = db.query(MerchantOrderDB).filter(
|
||||||
MerchantOrderDB.merchant_id == merchant_user.userid
|
MerchantOrderDB.merchant_id == merchant.id
|
||||||
|
).options(
|
||||||
|
joinedload(MerchantOrderDB.merchant_product),
|
||||||
|
joinedload(MerchantOrderDB.merchant),
|
||||||
|
joinedload(MerchantOrderDB.address)
|
||||||
).order_by(
|
).order_by(
|
||||||
MerchantOrderDB.create_time.desc()
|
MerchantOrderDB.create_time.desc()
|
||||||
)
|
)
|
||||||
@ -148,23 +160,21 @@ async def get_merchant_orders(
|
|||||||
query = query.filter(
|
query = query.filter(
|
||||||
MerchantOrderDB.status == status
|
MerchantOrderDB.status == status
|
||||||
)
|
)
|
||||||
|
total = query.count()
|
||||||
orders = query.offset(skip).limit(limit).all()
|
orders = query.offset(skip).limit(limit).all()
|
||||||
|
|
||||||
result = []
|
result = []
|
||||||
for order in orders:
|
for order in orders:
|
||||||
product = db.query(MerchantProductDB).filter(
|
|
||||||
MerchantProductDB.id == order.merchant_product_id
|
|
||||||
).first()
|
|
||||||
merchant = db.query(MerchantDB).filter(
|
|
||||||
MerchantDB.id == product.merchant_id
|
|
||||||
).first()
|
|
||||||
result.append({
|
result.append({
|
||||||
"order" : MerchantOrderInfo.model_validate(order),
|
"order" : MerchantOrderInfo.model_validate(order),
|
||||||
"product" : MerchantProductInfo.model_validate(product),
|
"product" : MerchantProductInfo.model_validate(order.merchant_product),
|
||||||
"merchant" : MerchantInfo.model_validate(merchant)
|
"merchant" : MerchantInfo.model_validate(order.merchant),
|
||||||
|
"address" : AddressInfo.model_validate(order.address)
|
||||||
})
|
})
|
||||||
return success_response(data=result)
|
return success_response(data={
|
||||||
|
"total": total,
|
||||||
|
"items": result
|
||||||
|
})
|
||||||
|
|
||||||
@router.get("/user", response_model=ResponseModel)
|
@router.get("/user", response_model=ResponseModel)
|
||||||
async def get_user_orders(
|
async def get_user_orders(
|
||||||
@ -174,11 +184,14 @@ async def get_user_orders(
|
|||||||
current_user: UserDB = Depends(get_current_user)
|
current_user: UserDB = Depends(get_current_user)
|
||||||
):
|
):
|
||||||
"""获取用户的订单列表"""
|
"""获取用户的订单列表"""
|
||||||
orders = db.query(MerchantOrderDB).filter(
|
query = db.query(MerchantOrderDB).filter(
|
||||||
MerchantOrderDB.user_id == current_user.userid
|
MerchantOrderDB.user_id == current_user.userid
|
||||||
).order_by(
|
).order_by(
|
||||||
MerchantOrderDB.create_time.desc()
|
MerchantOrderDB.create_time.desc()
|
||||||
).offset(skip).limit(limit).all()
|
)
|
||||||
|
|
||||||
|
total = query.count()
|
||||||
|
orders = query.offset(skip).limit(limit).all()
|
||||||
|
|
||||||
result = []
|
result = []
|
||||||
for order in orders:
|
for order in orders:
|
||||||
@ -196,7 +209,10 @@ async def get_user_orders(
|
|||||||
})
|
})
|
||||||
|
|
||||||
|
|
||||||
return success_response(data=result)
|
return success_response(data={
|
||||||
|
"total": total,
|
||||||
|
"items": result
|
||||||
|
})
|
||||||
|
|
||||||
@router.put("/{order_id}/user/cancel", response_model=ResponseModel)
|
@router.put("/{order_id}/user/cancel", response_model=ResponseModel)
|
||||||
async def cancel_order(
|
async def cancel_order(
|
||||||
@ -245,12 +261,11 @@ async def complete_order(
|
|||||||
if not order:
|
if not order:
|
||||||
return error_response(code=404, message="订单不存在")
|
return error_response(code=404, message="订单不存在")
|
||||||
|
|
||||||
if order.status not in [MerchantOrderStatus.DELIVERING, MerchantOrderStatus.PICKUP_READY]:
|
if order.status not in [MerchantOrderStatus.DELIVERING]:
|
||||||
return error_response(code=400, message="订单状态不正确")
|
return error_response(code=400, message="订单状态不正确")
|
||||||
|
|
||||||
try:
|
try:
|
||||||
order.status = MerchantOrderStatus.COMPLETED
|
order.status = MerchantOrderStatus.COMPLETED
|
||||||
db.commit()
|
|
||||||
|
|
||||||
# 如果订单有赠送积分,增加积分
|
# 如果订单有赠送积分,增加积分
|
||||||
if order.gift_points > 0:
|
if order.gift_points > 0:
|
||||||
@ -270,6 +285,10 @@ async def complete_order(
|
|||||||
product = db.query(MerchantProductDB).filter(
|
product = db.query(MerchantProductDB).filter(
|
||||||
MerchantProductDB.id == order.merchant_product_id
|
MerchantProductDB.id == order.merchant_product_id
|
||||||
).first()
|
).first()
|
||||||
|
if product:
|
||||||
|
product.sold_total += order.qty
|
||||||
|
|
||||||
|
db.commit()
|
||||||
|
|
||||||
if user and user.mp_openid:
|
if user and user.mp_openid:
|
||||||
data={
|
data={
|
||||||
@ -374,7 +393,7 @@ async def query_verify(
|
|||||||
MerchantProductDB.merchant_id == MerchantDB.id
|
MerchantProductDB.merchant_id == MerchantDB.id
|
||||||
).filter(
|
).filter(
|
||||||
MerchantOrderDB.order_verify_code == verify_code,
|
MerchantOrderDB.order_verify_code == verify_code,
|
||||||
MerchantOrderDB.status == MerchantOrderStatus.DELIVERING,
|
MerchantOrderDB.status == MerchantOrderStatus.PICKUP_READY,
|
||||||
MerchantDB.user_id == merchant_user.userid
|
MerchantDB.user_id == merchant_user.userid
|
||||||
).first()
|
).first()
|
||||||
|
|
||||||
@ -400,7 +419,7 @@ async def verify_order(
|
|||||||
MerchantProductDB.merchant_id == MerchantDB.id
|
MerchantProductDB.merchant_id == MerchantDB.id
|
||||||
).filter(
|
).filter(
|
||||||
MerchantOrderDB.order_verify_code == request.verify_code,
|
MerchantOrderDB.order_verify_code == request.verify_code,
|
||||||
MerchantOrderDB.status == MerchantOrderStatus.DELIVERING,
|
MerchantOrderDB.status == MerchantOrderStatus.PICKUP_READY,
|
||||||
MerchantDB.user_id == merchant_user.userid
|
MerchantDB.user_id == merchant_user.userid
|
||||||
).first()
|
).first()
|
||||||
|
|
||||||
@ -434,6 +453,10 @@ async def verify_order(
|
|||||||
description=f"团购券核销",
|
description=f"团购券核销",
|
||||||
transaction_id=order.MerchantOrderDB.order_id
|
transaction_id=order.MerchantOrderDB.order_id
|
||||||
)
|
)
|
||||||
|
|
||||||
|
# 更新商品销量
|
||||||
|
if order.MerchantProductDB:
|
||||||
|
order.MerchantProductDB.sold_total += order.MerchantOrderDB.qty
|
||||||
|
|
||||||
db.commit()
|
db.commit()
|
||||||
return success_response(
|
return success_response(
|
||||||
|
|||||||
@ -18,6 +18,7 @@ from app.models.merchant_product import OperationType, DeliveryType, DeliveryTim
|
|||||||
from app.models.merchant import MerchantInfo
|
from app.models.merchant import MerchantInfo
|
||||||
from app.models.address import AddressDB, AddressInfo, AddressType
|
from app.models.address import AddressDB, AddressInfo, AddressType
|
||||||
from app.api.deps import get_current_user
|
from app.api.deps import get_current_user
|
||||||
|
from app.core.config import settings
|
||||||
|
|
||||||
router = APIRouter()
|
router = APIRouter()
|
||||||
|
|
||||||
@ -109,10 +110,9 @@ async def list_merchant_products(
|
|||||||
product_info = MerchantProductInfo.model_validate(product)
|
product_info = MerchantProductInfo.model_validate(product)
|
||||||
products.append({
|
products.append({
|
||||||
**product_info.model_dump(),
|
**product_info.model_dump(),
|
||||||
"merchant_name": product.merchant.name,
|
|
||||||
"operation_type_name": "蜂快" if product.operation_type == OperationType.SELF_OPERATED else "业主",
|
|
||||||
"delivery_type_name": "配送到家" if product.delivery_type == DeliveryType.DELIVERY else "自提",
|
"delivery_type_name": "配送到家" if product.delivery_type == DeliveryType.DELIVERY else "自提",
|
||||||
"delivery_time_type_name": "及时达" if product.delivery_time_type == DeliveryTimeType.IMMEDIATE else "定时达"
|
"delivery_time_type_name": "小时达" if product.delivery_time_type == DeliveryTimeType.IMMEDIATE else "社区团购",
|
||||||
|
"pickup_time_format": f"{product.delivery_date.strftime('%m月%d日')} {product.pickup_time_from.strftime('%H:%M')}~{product.pickup_time_to.strftime('%H:%M')}" if product.delivery_date and product.pickup_time_from and product.pickup_time_to else None
|
||||||
})
|
})
|
||||||
|
|
||||||
return success_response(data={
|
return success_response(data={
|
||||||
@ -141,8 +141,12 @@ async def get_product(
|
|||||||
|
|
||||||
result = {
|
result = {
|
||||||
**product_info.model_dump(),
|
**product_info.model_dump(),
|
||||||
"gift_points" : int(float(product.gift_points_rate) / 10 * float(product.sale_price)),
|
"gift_points" : int(float(product.gift_points_rate) / 100 * float(product.sale_price)) * settings.POINT_RATIO,
|
||||||
"merchant": merchant.model_dump()
|
"merchant": merchant.model_dump(),
|
||||||
|
"delivery_type_name": "配送到家" if product.delivery_type == DeliveryType.DELIVERY else "自提",
|
||||||
|
"delivery_time_type_name": "小时达" if product.delivery_time_type == DeliveryTimeType.IMMEDIATE else "社区团购",
|
||||||
|
"pickup_time_format": f"{product.delivery_date.strftime('%m月%d日')} {product.pickup_time_from.strftime('%H:%M')}~{product.pickup_time_to.strftime('%H:%M')}" if product.delivery_date and product.pickup_time_from and product.pickup_time_to else None
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
# 获取默认地址
|
# 获取默认地址
|
||||||
|
|||||||
@ -9,6 +9,7 @@ from .merchant_product import DeliveryType, DeliveryTimeType
|
|||||||
import random
|
import random
|
||||||
import time as time_module
|
import time as time_module
|
||||||
import enum
|
import enum
|
||||||
|
from sqlalchemy.orm import relationship
|
||||||
|
|
||||||
class MerchantOrderStatus(str, enum.Enum):
|
class MerchantOrderStatus(str, enum.Enum):
|
||||||
CREATED = "CREATED" # 已创建(待支付)
|
CREATED = "CREATED" # 已创建(待支付)
|
||||||
@ -57,6 +58,10 @@ class MerchantOrderDB(Base):
|
|||||||
refund_transaction_id = Column(String(64)) # 微信退款交易号
|
refund_transaction_id = Column(String(64)) # 微信退款交易号
|
||||||
refund_time = Column(DateTime(timezone=True), nullable=True)
|
refund_time = Column(DateTime(timezone=True), nullable=True)
|
||||||
|
|
||||||
|
merchant_product = relationship("MerchantProductDB", backref="merchant_orders")
|
||||||
|
merchant = relationship("MerchantDB", backref="merchant_orders")
|
||||||
|
address = relationship("AddressDB", backref="merchant_orders")
|
||||||
|
|
||||||
|
|
||||||
class MerchantOrderCreate(BaseModel):
|
class MerchantOrderCreate(BaseModel):
|
||||||
merchant_product_id: int
|
merchant_product_id: int
|
||||||
|
|||||||
BIN
jobs.sqlite
BIN
jobs.sqlite
Binary file not shown.
Loading…
Reference in New Issue
Block a user