增加配送员分佣设置
This commit is contained in:
parent
2fa1ed11e1
commit
0dbf1c65f2
@ -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(
|
||||||
|
|||||||
@ -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)
|
||||||
|
|||||||
@ -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 连接
|
||||||
@ -249,28 +249,45 @@ async def update_user_info(
|
|||||||
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()
|
||||||
@ -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()
|
||||||
|
|||||||
@ -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"): # 商家商品订单
|
||||||
|
|||||||
@ -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 = "订单预计今晚前送达,请注意查收"
|
||||||
|
|||||||
@ -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
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user