增加配送员分佣设置

This commit is contained in:
aaron 2025-02-24 00:13:30 +08:00
parent 2fa1ed11e1
commit 0dbf1c65f2
6 changed files with 82 additions and 37 deletions

View File

@ -220,12 +220,13 @@ async def verify_order(
# 对商家进行结算 # 对商家进行结算
account_manager = AccountManager(db) account_manager = AccountManager(db)
settlement_amount = float(order.MerchantProductDB.settlement_amount) settlement_amount = float(order.MerchantProductDB.settlement_amount)
account_manager.change_balance( if settlement_amount > 0:
user_id=order.MerchantDB.user_id, account_manager.change_balance(
amount=settlement_amount, user_id=order.MerchantDB.user_id,
description=f"团购券核销", amount=settlement_amount,
transaction_id=order.MerchantOrderDB.order_id description=f"团购券核销",
) transaction_id=order.MerchantOrderDB.order_id
)
db.commit() db.commit()
return success_response( return success_response(

View File

@ -320,28 +320,31 @@ async def get_order_detail(
if not order: if not order:
return error_response(code=404, message="订单不存在") return error_response(code=404, message="订单不存在")
deliveryman_share = 0
# 如果有配送员 id则获取配送员信息 # 如果有配送员 id则获取配送员信息
if order.deliveryman_user_id: if order.deliveryman_user_id:
deliveryman_user = db.query(UserDB).filter( deliveryman_user = db.query(UserDB).filter(
UserDB.userid == order.deliveryman_user_id UserDB.userid == order.deliveryman_user_id
).first() ).first()
deliveryman_user_name = deliveryman_user.nickname
deliveryman_user_avatar = deliveryman_user.optimized_avatar if deliveryman_user:
deliveryman_user_phone = deliveryman_user.phone deliveryman_user_name = deliveryman_user.nickname
delivery_count = db.query(ShippingOrderDB).filter( deliveryman_user_avatar = deliveryman_user.optimized_avatar
ShippingOrderDB.deliveryman_user_id == order.deliveryman_user_id, deliveryman_user_phone = deliveryman_user.phone
ShippingOrderDB.status == OrderStatus.COMPLETED delivery_count = db.query(ShippingOrderDB).filter(
).count() 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: else:
delivery_count = 0 delivery_count = 0
deliveryman_user_name = None deliveryman_user_name = None
deliveryman_user_avatar = None deliveryman_user_avatar = None
deliveryman_user_phone = None deliveryman_user_phone = None
# 计算配送员分账金额
deliveryman_share = round(order.original_amount * settings.ORDER_DELIVERYMAN_SHARE_RATIO, 1)
# 查询包裹信息 # 查询包裹信息
packages = db.query( packages = db.query(
ShippingOrderPackageDB ShippingOrderPackageDB
@ -932,7 +935,7 @@ async def complete_order(
order.completed_time = datetime.now() 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) account_manager = AccountManager(db)

View File

@ -23,7 +23,7 @@ from app.models.user_auth import UserAuthDB, UserAuthCreate, UserAuthInfo
from app.core.qcloud import qcloud_manager from app.core.qcloud import qcloud_manager
from app.models.merchant import MerchantDB from app.models.merchant import MerchantDB
from app.models.address import AddressDB, AddressInfo from app.models.address import AddressDB, AddressInfo
from app.models.user import UserUpdateRoles, UserUpdateDeliveryCommissionRate
router = APIRouter() router = APIRouter()
# Redis 连接 # Redis 连接
@ -248,30 +248,47 @@ async def update_user_info(
except Exception as e: except Exception as e:
db.rollback() db.rollback()
return error_response(code=500, message=f"更新失败: {str(e)}") 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) @router.put("/roles", response_model=ResponseModel)
async def update_user_roles( async def update_user_roles(
user_id: int, update_data: UserUpdateRoles,
roles: List[UserRole],
db: Session = Depends(get_db), db: Session = Depends(get_db),
admin: UserDB = Depends(get_admin_user) 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: if not user:
return error_response(code=404, message="用户不存在") return error_response(code=404, message="用户不存在")
# 确保至少有一个角色 # 确保至少有一个角色
if not roles: if not update_data.roles:
return error_response(code=400, message="用户必须至少有一个角色") return error_response(code=400, message="用户必须至少有一个角色")
# 确保普通用户角色始终存在 # 确保普通用户角色始终存在
if UserRole.USER not in roles: if UserRole.USER not in update_data.roles:
roles.append(UserRole.USER) update_data.roles.append(UserRole.USER)
# 更新角色 # 更新角色
user.roles = list(set(roles)) # 去重 user.roles = list(set(update_data.roles)) # 去重
try: try:
db.commit() db.commit()
db.refresh(user) db.refresh(user)
@ -381,6 +398,7 @@ async def get_list(
limit: int = 10, limit: int = 10,
role: Optional[str] = None, role: Optional[str] = None,
phone: Optional[str] = None, # 手机号精确查询 phone: Optional[str] = None, # 手机号精确查询
community_id: Optional[int] = None,
db: Session = Depends(get_db), db: Session = Depends(get_db),
admin: UserDB = Depends(get_admin_user) admin: UserDB = Depends(get_admin_user)
): ):
@ -402,6 +420,10 @@ async def get_list(
if phone: if phone:
query = query.filter(UserDB.phone == phone) query = query.filter(UserDB.phone == phone)
# 如果指定了小区ID添加精确匹配条件
if community_id:
query = query.filter(UserDB.community_id == community_id)
total = query.count() total = query.count()
results = query.order_by( results = query.order_by(
UserDB.create_time.desc() UserDB.create_time.desc()

View File

@ -230,16 +230,26 @@ async def payment_notify(
order.pay_time = datetime.fromisoformat(success_time.replace('Z', '+00:00')) 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) # if deliveryman_share > 0:
account_manager.change_balance( # account_manager = AccountManager(db)
user_id=order.deliveryman_user_id, # account_manager.change_balance(
amount=deliveryman_share, # user_id=order.deliveryman_user_id,
description=f"配送订单结算", # amount=deliveryman_share,
transaction_id=order.orderid # description=f"配送订单结算",
) # transaction_id=order.orderid
# )
elif out_trade_no.startswith("M"): # 商家商品订单 elif out_trade_no.startswith("M"): # 商家商品订单

View File

@ -16,7 +16,6 @@ class Settings(BaseSettings):
ORDER_BASE_PRICE: float = 3.0 # 基础费用 ORDER_BASE_PRICE: float = 3.0 # 基础费用
ORDER_EXTRA_PACKAGE_PRICE: float = 0.5 # 额外包裹费用 ORDER_EXTRA_PACKAGE_PRICE: float = 0.5 # 额外包裹费用
ORDER_EXTRA_PACKAGE_THRESHOLD: int = 5 # 额外收费阈值 ORDER_EXTRA_PACKAGE_THRESHOLD: int = 5 # 额外收费阈值
ORDER_DELIVERYMAN_SHARE_RATIO: float = 0.8 # 配送员分账比例
#订单创建成功文案 #订单创建成功文案
ORDER_SUCCESS_TODAY_TEXT: str = "订单预计今晚前送达,请注意查收" ORDER_SUCCESS_TODAY_TEXT: str = "订单预计今晚前送达,请注意查收"

View File

@ -41,6 +41,7 @@ class UserDB(Base):
update_time = Column(DateTime(timezone=True), onupdate=func.now()) update_time = Column(DateTime(timezone=True), onupdate=func.now())
community_id = Column(Integer, ForeignKey("communities.id"), nullable=True) # 归属小区 community_id = Column(Integer, ForeignKey("communities.id"), nullable=True) # 归属小区
is_auth = Column(Boolean, nullable=False, default=False) is_auth = Column(Boolean, nullable=False, default=False)
delivery_commission_rate = Column(Integer, nullable=False, default=0) # 配送佣金比例
@property @property
def optimized_avatar(self): def optimized_avatar(self):
@ -71,6 +72,7 @@ class UserInfo(BaseModel):
community_id: Optional[int] = None community_id: Optional[int] = None
community_name: Optional[str] = None community_name: Optional[str] = None
is_auth: bool = False is_auth: bool = False
delivery_commission_rate: Optional[int] = None
class Config: class Config:
from_attributes = True from_attributes = True
@ -103,6 +105,14 @@ class ChangePasswordRequest(BaseModel):
verify_code: str = Field(..., min_length=6, max_length=6) verify_code: str = Field(..., min_length=6, max_length=6)
new_password: str = Field(..., min_length=6, max_length=20) 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: def generate_user_code(db=None) -> str:
"""生成6位大写字母+数字的用户编码""" """生成6位大写字母+数字的用户编码"""
chars = string.ascii_uppercase + string.digits chars = string.ascii_uppercase + string.digits