update
This commit is contained in:
parent
d5a306d06b
commit
d2edbceb5b
@ -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))
|
||||
|
||||
@ -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()
|
||||
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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;
|
||||
BIN
jobs.sqlite
BIN
jobs.sqlite
Binary file not shown.
Loading…
Reference in New Issue
Block a user