This commit is contained in:
aaron 2025-03-23 09:48:53 +08:00
parent d5a306d06b
commit d2edbceb5b
6 changed files with 100 additions and 29 deletions

View File

@ -62,7 +62,7 @@ async def create_merchant_order(
# 创建订单
pay_amount = float(product.sale_price) * order.qty
gift_points = pay_amount * float(product.gift_points_rate) / 100 * settings.POINT_RATIO
gift_points = int(pay_amount * float(product.gift_points_rate) / 100 * settings.POINT_RATIO)
db_order = MerchantOrderDB(
order_id=order_id,
user_id=current_user.userid,
@ -75,7 +75,15 @@ async def create_merchant_order(
pay_amount=pay_amount,
gift_points=gift_points,
status=MerchantOrderStatus.CREATED,
order_verify_code=verify_code
order_verify_code=verify_code,
# 复制商品快照数据
product_delivery_type=product.delivery_type,
product_pickup_place=product.pickup_place,
product_pickup_time_from=product.pickup_time_from,
product_pickup_time_to=product.pickup_time_to,
product_delivery_time_type=product.delivery_time_type,
product_delivery_date=product.delivery_date,
)
try:
@ -246,6 +254,13 @@ async def accept_order(
try:
order.status = MerchantOrderStatus.DELIVERING
# 如果是及时达则设置配送截止时间为1小时后
if product.delivery_time_type == DeliveryTimeType.IMMEDIATE:
order.product_delivery_deadline_time = datetime.now() + timedelta(hours=1)
else:
order.product_delivery_deadline_time = None
db.commit()
return success_response(data=MerchantOrderInfo.model_validate(order))

View File

@ -75,10 +75,7 @@ async def update_product(
@router.get("/list", response_model=ResponseModel)
async def list_merchant_products(
user_id: Optional[int] = None,
merchant_id: Optional[int] = None,
longitude: Optional[float] = None,
latitude: Optional[float] = None,
skip: int = 0,
limit: int = 20,
db: Session = Depends(get_db)
@ -89,27 +86,13 @@ async def list_merchant_products(
joinedload(MerchantProductDB.merchant)
)
# 如果指定了用户ID添加筛选条件
if user_id:
query = query.filter(MerchantProductDB.merchant_id == user_id)
# 如果指定了经纬度只返回2公里内的商品
if longitude and latitude:
#使用 SQL 函数计算
query = query.filter(
func.ST_Distance(
func.ST_SetSRID(func.ST_MakePoint(longitude, latitude), 4326),
MerchantProductDB.longitude,
MerchantProductDB.latitude
) <= 2000
)
# 如果指定了商家ID添加筛选条件
if merchant_id:
query = query.filter(MerchantProductDB.merchant_id == merchant_id)
total = query.count()
results = query.order_by(
MerchantProductDB.recommend.asc(),
MerchantProductDB.create_time.desc()
).offset(skip).limit(limit).all()

View File

@ -1,12 +1,13 @@
from sqlalchemy import Column, String, Integer, DateTime, ForeignKey, Enum, Boolean
from sqlalchemy import Column, String, Integer, DateTime, ForeignKey, Enum, Boolean, Date, Time
from sqlalchemy.dialects.mysql import DECIMAL
from sqlalchemy.sql import func
from pydantic import BaseModel, Field
from typing import Optional
from datetime import datetime
from datetime import datetime, date, time
from .database import Base
from .merchant_product import DeliveryType, DeliveryTimeType
import random
import time
import time as time_module
import enum
class MerchantOrderStatus(str, enum.Enum):
@ -39,6 +40,16 @@ class MerchantOrderDB(Base):
order_verify_code = Column(String(21), unique=True, nullable=False)
verify_time = Column(DateTime(timezone=True), nullable=True)
verify_user_id = Column(Integer, ForeignKey("users.userid"), nullable=True)
# 商品快照数据
product_delivery_type = Column(Enum(DeliveryType), nullable=True) # 配送类型快照
product_pickup_place = Column(String(200), nullable=True) # 自提点快照
product_pickup_time_from = Column(Time, nullable=True) # 自提开始时间快照
product_pickup_time_to = Column(Time, nullable=True) # 自提结束时间快照
product_delivery_time_type = Column(Enum(DeliveryTimeType), nullable=True) # 配送时间类型快照
product_delivery_date = Column(Date, nullable=True) # 配送日期快照
product_delivery_deadline_time = Column(DateTime(timezone=True), nullable=True) # 配送截止时间快照
create_time = Column(DateTime(timezone=True), server_default=func.now())
update_time = Column(DateTime(timezone=True), onupdate=func.now())
transaction_id = Column(String(64)) # 微信支付交易号
@ -71,6 +82,16 @@ class MerchantOrderInfo(BaseModel):
order_verify_code: str
verify_time: Optional[datetime]
verify_user_id: Optional[int]
# 商品快照数据
product_delivery_type: Optional[DeliveryType] = None # 配送类型快照
product_pickup_place: Optional[str] = None # 自提点快照
product_pickup_time_from: Optional[time] = None # 自提开始时间快照
product_pickup_time_to: Optional[time] = None # 自提结束时间快照
product_delivery_time_type: Optional[DeliveryTimeType] = None # 配送时间类型快照
product_delivery_date: Optional[date] = None # 配送日期快照
product_delivery_deadline_time: Optional[datetime] = None # 配送截止时间快照
create_time: datetime
update_time: Optional[datetime]
product_name: Optional[str] = None

View File

@ -1,9 +1,9 @@
from sqlalchemy import Column, String, Integer, Float, DateTime, ForeignKey, Enum, Boolean, Date, Text
from sqlalchemy import Column, String, Integer, Float, DateTime, ForeignKey, Enum, Boolean, Date, Text, Time
from sqlalchemy.dialects.mysql import DECIMAL
from sqlalchemy.sql import func
from pydantic import BaseModel, Field
from typing import Optional, List
from datetime import datetime, date
from datetime import datetime, date, time
from .database import Base
from sqlalchemy.orm import relationship
import enum
@ -54,9 +54,12 @@ class MerchantProductDB(Base):
is_sellout = Column(Boolean, nullable=False, default=False) # 是否售罄
delivery_type = Column(Enum(DeliveryType), nullable=False, default=DeliveryType.DELIVERY) # 配送类型
pickup_place = Column(String(200), nullable=True) # 自提点
pickup_time = Column(DateTime(timezone=True), nullable=True) # 自提时间
pickup_time_from = Column(Time, nullable=True) # 自提开始时间
pickup_time_to = Column(Time, nullable=True) # 自提结束时间
delivery_time_type = Column(Enum(DeliveryTimeType), nullable=False, default=DeliveryTimeType.IMMEDIATE) # 配送时间类型
delivery_date = Column(Date, nullable=True) # 配送日期,仅对定时送有效
delivery_deadline_time = Column(Time, nullable=True) # 配送截止时间
recommend = Column(Boolean, nullable=False, default=False) # 是否为平台推荐商品
create_time = Column(DateTime(timezone=True), server_default=func.now())
update_time = Column(DateTime(timezone=True), onupdate=func.now())
status = Column(Enum(ProductStatus), nullable=False, default=ProductStatus.UNLISTING)
@ -87,12 +90,15 @@ class MerchantProductCreate(BaseModel):
is_sellout: bool = Field(False) # 是否售罄
delivery_type: DeliveryType = Field(DeliveryType.DELIVERY) # 配送类型
pickup_place: Optional[str] = Field(None, max_length=200) # 自提点
pickup_time: Optional[datetime] = Field(None) # 自提时间
pickup_time_from: Optional[time] = Field(None) # 自提开始时间
pickup_time_to: Optional[time] = Field(None) # 自提结束时间
delivery_time_type: DeliveryTimeType = Field(DeliveryTimeType.IMMEDIATE) # 配送时间类型
delivery_date: Optional[date] = Field(None) # 配送日期
delivery_deadline_time: Optional[time] = Field(None) # 配送截止时间
status: ProductStatus = ProductStatus.UNLISTING
promotion_text: Optional[str] = Field(None, max_length=100) # 促销文本
gift_points_rate: Optional[float] = Field(10.00, ge=0, le=100) # 购买赠送积分比例
recommend: bool = Field(False) # 是否为平台推荐商品
class MerchantProductUpdate(BaseModel):
name: Optional[str] = Field(None, max_length=100)
@ -112,12 +118,15 @@ class MerchantProductUpdate(BaseModel):
is_sellout: Optional[bool] = None # 是否售罄
delivery_type: Optional[DeliveryType] = None # 配送类型
pickup_place: Optional[str] = Field(None, max_length=200) # 自提点
pickup_time: Optional[datetime] = None # 自提时间
pickup_time_from: Optional[time] = None # 自提开始时间
pickup_time_to: Optional[time] = None # 自提结束时间
delivery_time_type: Optional[DeliveryTimeType] = None # 配送时间类型
delivery_date: Optional[date] = None # 配送日期
delivery_deadline_time: Optional[time] = None # 配送截止时间
status: Optional[ProductStatus] = None
promotion_text: Optional[str] = Field(None, max_length=100) # 促销文本
gift_points_rate: Optional[float] = Field(None, ge=0, le=100) # 购买赠送积分比例
recommend: Optional[bool] = None # 是否为平台推荐商品
class MerchantProductInfo(BaseModel):
id: int
@ -141,11 +150,14 @@ class MerchantProductInfo(BaseModel):
is_sellout: bool # 是否售罄
delivery_type: DeliveryType # 配送类型
pickup_place: Optional[str] = None # 自提点
pickup_time: Optional[datetime] = None # 自提时间
pickup_time_from: Optional[time] = None # 自提开始时间
pickup_time_to: Optional[time] = None # 自提结束时间
delivery_time_type: DeliveryTimeType # 配送时间类型
delivery_date: Optional[date] = None # 配送日期
delivery_deadline_time: Optional[time] = None # 配送截止时间
gift_points_rate: float
promotion_text: Optional[str] = None # 促销文本
recommend: bool = False # 是否为平台推荐商品
create_time: datetime
update_time: Optional[datetime]
status: ProductStatus

View File

@ -112,3 +112,43 @@ ALTER TABLE merchant_orders
MODIFY COLUMN status ENUM('CREATED', 'PENDING', 'DELIVERING', 'PICKUP_READY', 'COMPLETED', 'CANCELLED', 'REFUNDING', 'REFUNDED')
NOT NULL DEFAULT 'CREATED' COMMENT '订单状态';
-- ====FINISH 3.22====
ALTER TABLE merchant_products
ADD COLUMN recommend BOOLEAN NOT NULL DEFAULT FALSE COMMENT '是否为平台推荐商品' AFTER delivery_date;
-- 1. 重命名pickup_time为pickup_time_from
ALTER TABLE merchant_products
CHANGE COLUMN pickup_time pickup_time_from TIME COMMENT '自提开始时间';
-- 2. 添加pickup_time_to字段
ALTER TABLE merchant_products
ADD COLUMN pickup_time_to TIME COMMENT '自提结束时间' AFTER pickup_time_from;
-- 添加配送类型快照字段
ALTER TABLE merchant_orders
ADD COLUMN product_delivery_type ENUM('DELIVERY', 'PICKUP') COMMENT '配送类型快照' AFTER verify_user_id;
-- 添加自提点快照字段
ALTER TABLE merchant_orders
ADD COLUMN product_pickup_place VARCHAR(200) COMMENT '自提点快照' AFTER product_delivery_type;
-- 添加自提开始时间快照字段
ALTER TABLE merchant_orders
ADD COLUMN product_pickup_time_from TIME COMMENT '自提开始时间快照' AFTER product_pickup_place;
-- 添加自提结束时间快照字段
ALTER TABLE merchant_orders
ADD COLUMN product_pickup_time_to TIME COMMENT '自提结束时间快照' AFTER product_pickup_time_from;
-- 添加配送时间类型快照字段
ALTER TABLE merchant_orders
ADD COLUMN product_delivery_time_type ENUM('IMMEDIATE', 'SCHEDULED') COMMENT '配送时间类型快照' AFTER product_pickup_time_to;
-- 添加配送日期快照字段
ALTER TABLE merchant_orders
ADD COLUMN product_delivery_date DATE COMMENT '配送日期快照' AFTER product_delivery_time_type;
-- 添加配送截止时间快照字段
ALTER TABLE merchant_orders
ADD COLUMN product_delivery_deadline_time DATETIME COMMENT '配送截止时间快照' AFTER product_delivery_date;

Binary file not shown.