From 0dbf1c65f27fb9fffc73833d5d2bfce48462f951 Mon Sep 17 00:00:00 2001 From: aaron <> Date: Mon, 24 Feb 2025 00:13:30 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E9=85=8D=E9=80=81=E5=91=98?= =?UTF-8?q?=E5=88=86=E4=BD=A3=E8=AE=BE=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/api/endpoints/merchant_order.py | 13 +++++----- app/api/endpoints/order.py | 27 ++++++++++--------- app/api/endpoints/user.py | 40 ++++++++++++++++++++++------- app/api/endpoints/wechat.py | 28 +++++++++++++------- app/core/config.py | 1 - app/models/user.py | 10 ++++++++ 6 files changed, 82 insertions(+), 37 deletions(-) diff --git a/app/api/endpoints/merchant_order.py b/app/api/endpoints/merchant_order.py index 50f69c0..d2e2aca 100644 --- a/app/api/endpoints/merchant_order.py +++ b/app/api/endpoints/merchant_order.py @@ -220,12 +220,13 @@ async def verify_order( # 对商家进行结算 account_manager = AccountManager(db) settlement_amount = float(order.MerchantProductDB.settlement_amount) - account_manager.change_balance( - user_id=order.MerchantDB.user_id, - amount=settlement_amount, - description=f"团购券核销", - transaction_id=order.MerchantOrderDB.order_id - ) + if settlement_amount > 0: + account_manager.change_balance( + user_id=order.MerchantDB.user_id, + amount=settlement_amount, + description=f"团购券核销", + transaction_id=order.MerchantOrderDB.order_id + ) db.commit() return success_response( diff --git a/app/api/endpoints/order.py b/app/api/endpoints/order.py index a43d82e..f4152b0 100644 --- a/app/api/endpoints/order.py +++ b/app/api/endpoints/order.py @@ -320,28 +320,31 @@ async def get_order_detail( if not order: return error_response(code=404, message="订单不存在") + deliveryman_share = 0 + # 如果有配送员 id,则获取配送员信息 if order.deliveryman_user_id: deliveryman_user = db.query(UserDB).filter( 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.deliveryman_user_id, - ShippingOrderDB.status == OrderStatus.COMPLETED - ).count() + + if deliveryman_user: + 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.deliveryman_user_id, + ShippingOrderDB.status == OrderStatus.COMPLETED + ).count() + + # 计算配送员分账金额 + deliveryman_share = round(order.original_amount * deliveryman_user.delivery_commission_rate / 100, 1) else: delivery_count = 0 deliveryman_user_name = None deliveryman_user_avatar = None deliveryman_user_phone = None - # 计算配送员分账金额 - deliveryman_share = round(order.original_amount * settings.ORDER_DELIVERYMAN_SHARE_RATIO, 1) - - # 查询包裹信息 packages = db.query( ShippingOrderPackageDB @@ -932,7 +935,7 @@ async def complete_order( order.completed_time = datetime.now() # 计算配送员分账金额 - deliveryman_share = order.original_amount * settings.ORDER_DELIVERYMAN_SHARE_RATIO + deliveryman_share = order.original_amount * current_user.delivery_commission_rate / 100 # 使用账户管理器处理分账 account_manager = AccountManager(db) diff --git a/app/api/endpoints/user.py b/app/api/endpoints/user.py index f618dbb..727ad6e 100644 --- a/app/api/endpoints/user.py +++ b/app/api/endpoints/user.py @@ -23,7 +23,7 @@ from app.models.user_auth import UserAuthDB, UserAuthCreate, UserAuthInfo from app.core.qcloud import qcloud_manager from app.models.merchant import MerchantDB from app.models.address import AddressDB, AddressInfo - +from app.models.user import UserUpdateRoles, UserUpdateDeliveryCommissionRate router = APIRouter() # Redis 连接 @@ -248,30 +248,47 @@ async def update_user_info( except Exception as e: db.rollback() return error_response(code=500, message=f"更新失败: {str(e)}") + +@router.put("/delivery-commission-rate", response_model=ResponseModel) +async def update_delivery_commission_rate( + update_data: UserUpdateDeliveryCommissionRate, + db: Session = Depends(get_db), + current_user: UserDB = Depends(get_admin_user) +): + """更新配送佣金比例""" + user = db.query(UserDB).filter(UserDB.userid == update_data.user_id).first() + + if not user: + return error_response(code=404, message="用户不存在") + + user.delivery_commission_rate = update_data.delivery_commission_rate + db.commit() + db.refresh(user) + + return success_response(message="配送佣金比例更新成功") @router.put("/roles", response_model=ResponseModel) async def update_user_roles( - user_id: int, - roles: List[UserRole], + update_data: UserUpdateRoles, db: Session = Depends(get_db), admin: UserDB = Depends(get_admin_user) ): """更新用户角色(管理员)""" - user = db.query(UserDB).filter(UserDB.userid == user_id).first() + user = db.query(UserDB).filter(UserDB.userid == update_data.user_id).first() if not user: return error_response(code=404, message="用户不存在") # 确保至少有一个角色 - if not roles: + if not update_data.roles: return error_response(code=400, message="用户必须至少有一个角色") # 确保普通用户角色始终存在 - if UserRole.USER not in roles: - roles.append(UserRole.USER) + if UserRole.USER not in update_data.roles: + update_data.roles.append(UserRole.USER) # 更新角色 - user.roles = list(set(roles)) # 去重 - + user.roles = list(set(update_data.roles)) # 去重 + try: db.commit() db.refresh(user) @@ -381,6 +398,7 @@ async def get_list( limit: int = 10, role: Optional[str] = None, phone: Optional[str] = None, # 手机号精确查询 + community_id: Optional[int] = None, db: Session = Depends(get_db), admin: UserDB = Depends(get_admin_user) ): @@ -402,6 +420,10 @@ async def get_list( if phone: query = query.filter(UserDB.phone == phone) + # 如果指定了小区ID,添加精确匹配条件 + if community_id: + query = query.filter(UserDB.community_id == community_id) + total = query.count() results = query.order_by( UserDB.create_time.desc() diff --git a/app/api/endpoints/wechat.py b/app/api/endpoints/wechat.py index 82af73a..23eebf5 100644 --- a/app/api/endpoints/wechat.py +++ b/app/api/endpoints/wechat.py @@ -230,16 +230,26 @@ async def payment_notify( order.pay_time = datetime.fromisoformat(success_time.replace('Z', '+00:00')) # 计算配送员分账金额 - deliveryman_share = order.final_amount * settings.ORDER_DELIVERYMAN_SHARE_RATIO + # if order.deliveryman_user_id: + # deliveryman_user = db.query(UserDB).filter( + # UserDB.userid == order.deliveryman_user_id + # ).first() + # if deliveryman_user: + # deliveryman_share = order.final_amount * deliveryman_user.delivery_commission_rate / 100 + # else: + # deliveryman_share = 0 + # else: + # deliveryman_share = 0 - # 使用账户管理器处理分账 - account_manager = AccountManager(db) - account_manager.change_balance( - user_id=order.deliveryman_user_id, - amount=deliveryman_share, - description=f"配送订单结算", - transaction_id=order.orderid - ) + # # 使用账户管理器处理分账 + # if deliveryman_share > 0: + # account_manager = AccountManager(db) + # account_manager.change_balance( + # user_id=order.deliveryman_user_id, + # amount=deliveryman_share, + # description=f"配送订单结算", + # transaction_id=order.orderid + # ) elif out_trade_no.startswith("M"): # 商家商品订单 diff --git a/app/core/config.py b/app/core/config.py index a2947dc..3595da6 100644 --- a/app/core/config.py +++ b/app/core/config.py @@ -16,7 +16,6 @@ class Settings(BaseSettings): ORDER_BASE_PRICE: float = 3.0 # 基础费用 ORDER_EXTRA_PACKAGE_PRICE: float = 0.5 # 额外包裹费用 ORDER_EXTRA_PACKAGE_THRESHOLD: int = 5 # 额外收费阈值 - ORDER_DELIVERYMAN_SHARE_RATIO: float = 0.8 # 配送员分账比例 #订单创建成功文案 ORDER_SUCCESS_TODAY_TEXT: str = "订单预计今晚前送达,请注意查收" diff --git a/app/models/user.py b/app/models/user.py index 80c5f1d..c35df70 100644 --- a/app/models/user.py +++ b/app/models/user.py @@ -41,6 +41,7 @@ class UserDB(Base): update_time = Column(DateTime(timezone=True), onupdate=func.now()) community_id = Column(Integer, ForeignKey("communities.id"), nullable=True) # 归属小区 is_auth = Column(Boolean, nullable=False, default=False) + delivery_commission_rate = Column(Integer, nullable=False, default=0) # 配送佣金比例 @property def optimized_avatar(self): @@ -71,6 +72,7 @@ class UserInfo(BaseModel): community_id: Optional[int] = None community_name: Optional[str] = None is_auth: bool = False + delivery_commission_rate: Optional[int] = None class Config: from_attributes = True @@ -103,6 +105,14 @@ class ChangePasswordRequest(BaseModel): verify_code: str = Field(..., min_length=6, max_length=6) new_password: str = Field(..., min_length=6, max_length=20) +class UserUpdateRoles(BaseModel): + user_id: int + roles: List[UserRole] + +class UserUpdateDeliveryCommissionRate(BaseModel): + user_id: int + delivery_commission_rate: int + def generate_user_code(db=None) -> str: """生成6位大写字母+数字的用户编码""" chars = string.ascii_uppercase + string.digits