From d2edbceb5b3c13e3373ec673412e854261f62409 Mon Sep 17 00:00:00 2001 From: aaron <> Date: Sun, 23 Mar 2025 09:48:53 +0800 Subject: [PATCH] update --- app/api/endpoints/merchant_order.py | 19 ++++++++++-- app/api/endpoints/merchant_product.py | 19 +----------- app/models/merchant_order.py | 27 +++++++++++++++-- app/models/merchant_product.py | 24 ++++++++++++---- app/sql/v1.1.sql | 40 ++++++++++++++++++++++++++ jobs.sqlite | Bin 24576 -> 24576 bytes 6 files changed, 100 insertions(+), 29 deletions(-) diff --git a/app/api/endpoints/merchant_order.py b/app/api/endpoints/merchant_order.py index 0a45f38..653afaa 100644 --- a/app/api/endpoints/merchant_order.py +++ b/app/api/endpoints/merchant_order.py @@ -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)) diff --git a/app/api/endpoints/merchant_product.py b/app/api/endpoints/merchant_product.py index 7587ea7..0bea133 100644 --- a/app/api/endpoints/merchant_product.py +++ b/app/api/endpoints/merchant_product.py @@ -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() diff --git a/app/models/merchant_order.py b/app/models/merchant_order.py index 6ab656d..875e9a0 100644 --- a/app/models/merchant_order.py +++ b/app/models/merchant_order.py @@ -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 diff --git a/app/models/merchant_product.py b/app/models/merchant_product.py index 63bdcc5..de37477 100644 --- a/app/models/merchant_product.py +++ b/app/models/merchant_product.py @@ -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 diff --git a/app/sql/v1.1.sql b/app/sql/v1.1.sql index 2d937df..049634f 100644 --- a/app/sql/v1.1.sql +++ b/app/sql/v1.1.sql @@ -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; \ No newline at end of file diff --git a/jobs.sqlite b/jobs.sqlite index 1379f7a20a03c598a9f691f0a6ac072a40ff1f0d..7c03c4e0b422e9ddbb9a63eca6fe958d2f3790af 100644 GIT binary patch delta 82 zcmZoTz}Rqrae_4C(up$8j7v8rn_W@`MszyBcsG-W$|7X_6O!14Xjh0 jCOf*zY`!cl%K{YtD9@z80~BZGU}j-V2kH86&!_+ZXxkaw delta 82 zcmZoTz}Rqrae_3X_e2?IM(>RY`9jS19^BY$>n_W@`MszyBcu3cW$|7X_Ipn|8d#?~ jO?Gsb*?d`AmIWyOQJzVG2Pn?W!OX$}4Co>2h+#z`I4