This commit is contained in:
aaron 2025-02-15 16:23:23 +08:00
parent cdd070131f
commit ab5d42fb65
4 changed files with 117 additions and 127 deletions

View File

@ -8,7 +8,7 @@ from app.models.database import get_db
from app.api.deps import get_current_user
from app.models.user import UserDB
from app.core.response import success_response, error_response, ResponseModel
from app.models.community_building import CommunityBuildingDB
router = APIRouter()
@router.post("", response_model=ResponseModel)
@ -26,10 +26,22 @@ async def create_address(
)
).update({"is_default": False})
# 查询社区名字和楼栋名字
community = db.query(CommunityDB).filter(
CommunityDB.id == address.community_id
).first()
community_building = db.query(CommunityBuildingDB).filter(
CommunityBuildingDB.id == address.community_building_id
).first()
db_address = AddressDB(
user_id=current_user.userid,
community_name=community.name,
community_building_name=community_building.building_name,
**address.model_dump()
)
db.add(db_address)
db.commit()
db.refresh(db_address)
@ -80,7 +92,9 @@ async def update_address(
if not db_address:
return error_response(code=404, message="地址不存在")
update_data = address.model_dump(exclude_unset=True)
if update_data.get("is_default"):
db.query(AddressDB).filter(
and_(
@ -92,6 +106,18 @@ async def update_address(
for key, value in update_data.items():
setattr(db_address, key, value)
# 查询社区名字和楼栋名字
community = db.query(CommunityDB).filter(
CommunityDB.id == address.community_id
).first()
community_building = db.query(CommunityBuildingDB).filter(
CommunityBuildingDB.id == address.community_building_id
).first()
db_address.community_name = community.name
db_address.community_building_name = community_building.building_name
db.commit()
db.refresh(db_address)
return success_response(data=AddressInfo.model_validate(db_address))

View File

@ -29,6 +29,7 @@ from app.models.community_building import CommunityBuildingDB
from app.models.station import StationDB
from app.models.point import PointRecordDB, PointRecordType
from app.core.utils import CommonUtils
import logging
router = APIRouter()
@ -126,7 +127,7 @@ async def pre_order(
return success_response(data=price_info)
@router.post("", response_model=ResponseModel)
async def create_shipping_order(
async def create_order(
order: OrderCreate,
db: Session = Depends(get_db),
current_user: UserDB = Depends(get_current_user)
@ -159,11 +160,21 @@ async def create_shipping_order(
# 更新优惠券状态
user_coupon.status = CouponStatus.USED
# 查询地址信息
address = db.query(AddressDB).filter(
AddressDB.id == order.addressid
).first()
# 创建订单
db_order = ShippingOrderDB(
orderid=orderid,
userid=current_user.userid,
addressid=order.addressid,
address_customer_name=address.name,
address_customer_phone=address.phone,
address_customer_gender=address.gender,
address_community_name=address.community_name,
address_community_building_name=address.community_building_name,
address_detail=address.address_detail,
package_count=price_info.package_count,
original_amount=original_amount,
coupon_discount_amount=coupon_discount,
@ -177,9 +188,15 @@ async def create_shipping_order(
# 创建订单包裹
for package in order.price_request.packages:
station = db.query(StationDB).filter(
StationDB.id == package.station_id
).first()
db_package = ShippingOrderPackageDB(
orderid=orderid,
station_id=package.station_id,
station_name=station.name,
pickup_codes=package.pickup_codes
)
db.add(db_package)
@ -237,21 +254,7 @@ async def get_order_detail(
"""获取订单详情"""
# 使用 join 查询获取订单和相关地址信息
order = db.query(
ShippingOrderDB,
AddressDB.name.label('address_name'),
AddressDB.phone.label('address_phone'),
AddressDB.address_detail.label('address_detail'),
CommunityBuildingDB.building_name.label('building_name'),
CommunityDB.name.label('community_name')
).join(
AddressDB,
ShippingOrderDB.addressid == AddressDB.id
).join(
CommunityBuildingDB,
AddressDB.community_building_id == CommunityBuildingDB.id
).join(
CommunityDB,
CommunityBuildingDB.community_id == CommunityDB.id
ShippingOrderDB
).filter(
ShippingOrderDB.orderid == orderid
).first()
@ -260,7 +263,7 @@ async def get_order_detail(
return error_response(code=404, message="订单不存在")
# 检查权限
if order.ShippingOrderDB.userid != current_user.userid and UserRole.ADMIN not in current_user.roles:
if order.userid != current_user.userid and UserRole.ADMIN not in current_user.roles:
return error_response(code=403, message="无权查看此订单")
# 查询包裹信息,包含驿站名称
@ -275,15 +278,15 @@ async def get_order_detail(
).all()
# 如果有配送员 id则获取配送员信息
if order.ShippingOrderDB.deliveryman_user_id:
if order.deliveryman_user_id:
deliveryman_user = db.query(UserDB).filter(
UserDB.userid == order.ShippingOrderDB.deliveryman_user_id
UserDB.userid == order.deliveryman_user_id
).first()
deliveryman_user_name = deliveryman_user.nickname
deliveryman_user_avatar = deliveryman_user.optimized_avatar
deliveryman_user_phone = deliveryman_user.phone
delivery_count = db.query(ShippingOrderDB).filter(
ShippingOrderDB.deliveryman_user_id == order.ShippingOrderDB.deliveryman_user_id,
ShippingOrderDB.deliveryman_user_id == order.deliveryman_user_id,
ShippingOrderDB.status == OrderStatus.COMPLETED
).count()
else:
@ -294,29 +297,28 @@ async def get_order_detail(
# 构建响应数据
order_data = {
"orderid": order.ShippingOrderDB.orderid,
"userid": order.ShippingOrderDB.userid,
"addressid": order.ShippingOrderDB.addressid,
"package_count": order.ShippingOrderDB.package_count,
"original_amount": order.ShippingOrderDB.original_amount,
"coupon_discount_amount": order.ShippingOrderDB.coupon_discount_amount,
"coupon_id": order.ShippingOrderDB.coupon_id,
"final_amount": order.ShippingOrderDB.final_amount,
"status": order.ShippingOrderDB.status,
"complete_images": order.ShippingOrderDB.complete_images.split(",") if order.ShippingOrderDB.complete_images else None,
"create_time": order.ShippingOrderDB.create_time,
"delivery_method": order.ShippingOrderDB.delivery_method,
"deliveryman_user_id": order.ShippingOrderDB.deliveryman_user_id,
"orderid": order.orderid,
"userid": order.userid,
"package_count": order.package_count,
"original_amount": order.original_amount,
"coupon_discount_amount": order.coupon_discount_amount,
"coupon_id": order.coupon_id,
"final_amount": order.final_amount,
"status": order.status,
"complete_images": order.complete_images.split(",") if order.complete_images else None,
"create_time": order.create_time,
"delivery_method": order.delivery_method,
"deliveryman_user_id": order.deliveryman_user_id,
"deliveryman_nickname": deliveryman_user_name,
"deliveryman_avatar": deliveryman_user_avatar,
"deliveryman_phone": deliveryman_user_phone,
"delivery_count": delivery_count,
# 地址相关信息
"address_name": order.address_name,
"address_phone": order.address_phone,
"address_name": order.address_customer_name,
"address_phone": order.address_customer_phone,
"address_detail": order.address_detail,
"building_name": order.building_name,
"community_name": order.community_name
"building_name": order.address_community_building_name,
"community_name": order.address_community_name
}
# 构建包裹信息,包含驿站名称
@ -344,21 +346,9 @@ async def get_user_orders(
):
"""获取用户订单列表"""
try:
# 查询订单和地址信息
# 查询订单
query = db.query(
ShippingOrderDB,
AddressDB,
CommunityBuildingDB,
CommunityDB
).join(
AddressDB,
ShippingOrderDB.addressid == AddressDB.id
).join(
CommunityBuildingDB,
AddressDB.community_building_id == CommunityBuildingDB.id
).join(
CommunityDB,
CommunityBuildingDB.community_id == CommunityDB.id
ShippingOrderDB
).filter(
ShippingOrderDB.userid == current_user.userid
)
@ -376,24 +366,20 @@ async def get_user_orders(
).offset(skip).limit(limit).all()
orders = []
for order, address, building, community in results:
for order in results:
# 查询订单包裹信息
packages = db.query(
ShippingOrderPackageDB,
StationDB.name.label('station_name')
).join(
StationDB,
ShippingOrderPackageDB.station_id == StationDB.id
ShippingOrderPackageDB
).filter(
ShippingOrderPackageDB.orderid == order.orderid
).all()
# 格式化包裹信息
package_list = [{
"id": package.ShippingOrderPackageDB.id,
"station_id": package.ShippingOrderPackageDB.station_id,
"id": package.id,
"station_id": package.station_id,
"station_name": package.station_name,
"pickup_codes": package.ShippingOrderPackageDB.pickup_codes
"pickup_codes": package.pickup_codes
} for package in packages]
orders.append({
@ -409,15 +395,11 @@ async def get_user_orders(
"final_amount": order.final_amount,
"packages": package_list,
"address": {
"id": address.id,
"name": address.name,
"phone": address.phone,
"community_id": community.id,
"community_name": community.name,
"building_id": building.id,
"building_name": building.building_name,
"building_number": building.building_number,
"address_detail": address.address_detail
"name": order.address_customer_name,
"phone": order.address_customer_phone,
"community_name": order.address_community_name,
"building_name": order.address_community_building_name,
"address_detail": order.address_detail
}
})
@ -502,21 +484,7 @@ async def get_deliveryman_orders(
"""获取配送员订单列表"""
# 基础查询
query = db.query(
ShippingOrderDB,
AddressDB,
CommunityBuildingDB,
CommunityDB
).join(
AddressDB,
ShippingOrderDB.addressid == AddressDB.id
).join(
CommunityBuildingDB,
AddressDB.community_building_id == CommunityBuildingDB.id
).join(
CommunityDB,
CommunityBuildingDB.community_id == CommunityDB.id
).filter(
CommunityDB.id == deliveryman.community_id
ShippingOrderDB
)
# 状态筛选
@ -566,15 +534,11 @@ async def get_deliveryman_orders(
"delivery_method": order.delivery_method,
"packages": package_list,
"address": {
"id": address.id,
"name": address.name,
"phone": address.phone,
"community_id": community.id,
"community_name": community.name,
"building_id": building.id,
"building_name": building.building_name,
"building_number": building.building_number,
"address_detail": address.address_detail
"name": order.address_customer_name,
"phone": order.address_customer_phone,
"community_name": order.address_community_name,
"building_name": order.address_community_building_name,
"address_detail": order.address_detail
}
})
@ -793,19 +757,7 @@ async def get_orders(
try:
# 构建基础查询
query = db.query(
ShippingOrderDB,
AddressDB,
CommunityBuildingDB,
CommunityDB
).join(
AddressDB,
ShippingOrderDB.addressid == AddressDB.id
).join(
CommunityBuildingDB,
AddressDB.community_building_id == CommunityBuildingDB.id
).join(
CommunityDB,
CommunityBuildingDB.community_id == CommunityDB.id
ShippingOrderDB
)
# 添加用户ID过滤
@ -862,15 +814,11 @@ async def get_orders(
"final_amount": order.final_amount,
"packages": package_list,
"address": {
"id": address.id,
"name": address.name,
"phone": address.phone,
"community_id": community.id,
"community_name": community.name,
"building_id": building.id,
"building_name": building.building_name,
"building_number": building.building_number,
"address_detail": address.address_detail
"name": order.address_customer_name,
"phone": order.address_customer_phone,
"community_name": order.address_community_name,
"building_name": order.address_community_building_name,
"address_detail": order.address_detail
}
})

View File

@ -12,6 +12,7 @@ class AddressDB(Base):
id = Column(Integer, primary_key=True, autoincrement=True)
user_id = Column(Integer, ForeignKey("users.userid"), index=True)
community_id = Column(Integer, index=True)
community_name = Column(String(100), nullable=True)
community_building_id = Column(Integer, ForeignKey("community_buildings.id"), nullable=True)
community_building_name = Column(String(100), nullable=True)
address_detail = Column(String(200))
@ -26,17 +27,15 @@ class AddressDB(Base):
class AddressCreate(BaseModel):
community_id: int
community_building_id: Optional[int] = None
community_building_name: Optional[str] = Field(None, max_length=100)
address_detail: str = Field(..., max_length=200)
name: str = Field(..., max_length=50)
phone: str = Field(..., pattern="^1[3-9]\d{9}$")
gender: Gender = Gender.UNKNOWN
is_default: bool = False
is_default: bool = True
class AddressUpdate(BaseModel):
community_id: Optional[int] = None
community_building_id: Optional[int] = None
community_building_name: Optional[str] = Field(None, max_length=100)
address_detail: Optional[str] = Field(None, max_length=200)
name: Optional[str] = Field(None, max_length=50)
phone: Optional[str] = Field(None, pattern="^1[3-9]\d{9}$")
@ -46,6 +45,7 @@ class AddressUpdate(BaseModel):
class AddressInfo(BaseModel):
id: int
community_id: int
community_name:Optional[str]
community_name: Optional[str] = None
community_building_id: Optional[int]
community_building_name: Optional[str]

View File

@ -5,6 +5,7 @@ from sqlalchemy.sql import func
from pydantic import BaseModel, Field
from .database import Base
import enum
from app.models.user import Gender
from app.core.imageprocessor import process_image, ImageFormat
class OrderStatus(str, enum.Enum):
@ -25,7 +26,18 @@ class ShippingOrderDB(Base):
orderid = Column(String(32), primary_key=True)
userid = Column(Integer, ForeignKey("users.userid"), index=True)
addressid = Column(Integer, ForeignKey("delivery_addresses.id"), index=True)
# 配送地址信息
address_customer_name = Column(String(50), nullable=False, default='') # 客户名称快照
address_customer_phone = Column(String(11), nullable=False, default='') # 客户电话快照
address_customer_gender = Column(Enum(Gender), nullable=False, default=Gender.UNKNOWN) # 客户性别快照
address_community_name = Column(String(50), nullable=False, default='') # 小区名称快照
address_community_building_name = Column(String(50), nullable=False, default='') # 楼栋名称快照
address_detail = Column(String(100), nullable=False, default='') # 详细地址快照
delivery_method = Column(Enum(DeliveryMethod), nullable=False)
package_count = Column(Integer, nullable=False)
original_amount = Column(Float, nullable=False)
coupon_discount_amount = Column(Float, default=0)
@ -36,11 +48,6 @@ class ShippingOrderDB(Base):
cancel_reason = Column(String(200), nullable=True) # 取消原因
complete_images = Column(String(1000), nullable=True) # 完成订单的图片URL多个URL用逗号分隔
create_time = Column(DateTime(timezone=True), server_default=func.now())
delivery_method = Column(
Enum(DeliveryMethod),
nullable=False,
default=DeliveryMethod.DELIVERY_AT_DOORSTEP
)
deliveryman_user_id = Column(Integer, ForeignKey("users.userid"), nullable=True)
cancel_user_id = Column(Integer, ForeignKey("users.userid"), nullable=True)
pay_status = Column(Boolean, default=False) # 支付状态
@ -60,6 +67,7 @@ class ShippingOrderPackageDB(Base):
id = Column(Integer, primary_key=True, autoincrement=True)
orderid = Column(String(32), ForeignKey("shipping_orders.orderid"), index=True)
station_id = Column(Integer, ForeignKey("stations.id"), index=True)
station_name = Column(String(50), nullable=False)
pickup_codes = Column(String(100), nullable=False)
create_time = Column(DateTime(timezone=True), server_default=func.now())
@ -84,7 +92,14 @@ class OrderCreate(BaseModel):
class OrderInfo(BaseModel):
orderid: str
userid: int
addressid: int
address_customer_name: str
address_customer_phone: str
address_community_name: str
address_community_building_name: str
address_detail: str
address_customer_gender: Gender
package_count: int
original_amount: float
coupon_discount_amount: float
@ -113,6 +128,7 @@ class OrderPackageInfo(BaseModel):
id: int
orderid: str
station_id: int
station_name: str
pickup_codes: str
create_time: datetime