增加合伙人后台接口
This commit is contained in:
parent
1dabf231b1
commit
15df98e8ac
@ -49,4 +49,13 @@ async def get_merchant_user(
|
|||||||
"""验证商家权限"""
|
"""验证商家权限"""
|
||||||
if UserRole.MERCHANT not in current_user.roles:
|
if UserRole.MERCHANT not in current_user.roles:
|
||||||
raise HTTPException(status_code=403, detail="需要商家权限")
|
raise HTTPException(status_code=403, detail="需要商家权限")
|
||||||
|
return current_user
|
||||||
|
|
||||||
|
|
||||||
|
async def get_partner_user(
|
||||||
|
current_user: UserDB = Depends(get_current_user)
|
||||||
|
) -> UserDB:
|
||||||
|
"""验证合伙人权限"""
|
||||||
|
if UserRole.PARTNER not in current_user.roles:
|
||||||
|
raise HTTPException(status_code=403, detail="需要合伙人权限")
|
||||||
return current_user
|
return current_user
|
||||||
@ -147,6 +147,13 @@ def calculate_price(price_request: OrderPriceCalculateRequest,user: UserDB,db: S
|
|||||||
|
|
||||||
return result
|
return result
|
||||||
|
|
||||||
|
def calculate_delivery_share(order: ShippingOrderDB, deliveryman: UserDB) -> float:
|
||||||
|
if deliveryman.delivery_commission_fixed > 0:
|
||||||
|
return deliveryman.delivery_commission_fixed
|
||||||
|
elif deliveryman.delivery_commission_rate > 0:
|
||||||
|
return round(order.original_amount_with_additional_fee * (deliveryman.delivery_commission_rate / 100.0), 2)
|
||||||
|
else:
|
||||||
|
return 0
|
||||||
|
|
||||||
def format_delivery_time(delivery_date: datetime, time_period_name: str) -> str:
|
def format_delivery_time(delivery_date: datetime, time_period_name: str) -> str:
|
||||||
if delivery_date == datetime.now().date():
|
if delivery_date == datetime.now().date():
|
||||||
@ -408,15 +415,6 @@ 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
|
|
||||||
if current_user.delivery_commission_fixed > 0:
|
|
||||||
deliveryman_share = current_user.delivery_commission_fixed
|
|
||||||
elif current_user.delivery_commission_rate > 0:
|
|
||||||
deliveryman_share = round(order.original_amount_with_additional_fee * (current_user.delivery_commission_rate / 100.0), 2)
|
|
||||||
else:
|
|
||||||
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(
|
||||||
@ -501,7 +499,7 @@ async def get_order_detail(
|
|||||||
"point_discount_amount": order.point_discount_amount,
|
"point_discount_amount": order.point_discount_amount,
|
||||||
"coupon_id": order.coupon_id,
|
"coupon_id": order.coupon_id,
|
||||||
"final_amount": order.final_amount,
|
"final_amount": order.final_amount,
|
||||||
"deliveryman_share": deliveryman_share,
|
"deliveryman_share": order.delivery_share if order.delivery_share > 0 else calculate_delivery_share(order, current_user),
|
||||||
"status": order.status,
|
"status": order.status,
|
||||||
"complete_images": order.optimized_complete_images,
|
"complete_images": order.optimized_complete_images,
|
||||||
"packages": package_list,
|
"packages": package_list,
|
||||||
@ -1166,21 +1164,13 @@ async def deliveryman_complete_order(
|
|||||||
|
|
||||||
# 更新完成时间
|
# 更新完成时间
|
||||||
order.completed_time = datetime.now()
|
order.completed_time = datetime.now()
|
||||||
|
|
||||||
# 计算配送员分账金额
|
|
||||||
if current_user.delivery_commission_rate > 0:
|
|
||||||
deliveryman_share = order.original_amount_with_additional_fee * current_user.delivery_commission_rate / 100
|
|
||||||
elif current_user.delivery_commission_fixed > 0:
|
|
||||||
deliveryman_share = current_user.delivery_commission_fixed
|
|
||||||
else:
|
|
||||||
deliveryman_share = 0
|
|
||||||
|
|
||||||
# 使用账户管理器处理分账
|
# 使用账户管理器处理分账
|
||||||
if deliveryman_share > 0:
|
if order.delivery_share > 0:
|
||||||
account_manager = AccountManager(db)
|
account_manager = AccountManager(db)
|
||||||
account_manager.change_balance(
|
account_manager.change_balance(
|
||||||
user_id=order.deliveryman_user_id,
|
user_id=order.deliveryman_user_id,
|
||||||
amount=deliveryman_share,
|
amount= order.delivery_share,
|
||||||
description=f"配送订单收益",
|
description=f"配送订单收益",
|
||||||
transaction_id=orderid
|
transaction_id=orderid
|
||||||
)
|
)
|
||||||
@ -1275,11 +1265,15 @@ async def deliveryman_receive_order(
|
|||||||
).all()
|
).all()
|
||||||
|
|
||||||
try:
|
try:
|
||||||
|
|
||||||
# 更新订单状态和配送员ID
|
# 更新订单状态和配送员ID
|
||||||
order.status = OrderStatus.RECEIVED
|
order.status = OrderStatus.RECEIVED
|
||||||
order.deliveryman_user_id = deliveryman.userid
|
order.deliveryman_user_id = deliveryman.userid
|
||||||
order.received_time = datetime.now()
|
order.received_time = datetime.now()
|
||||||
|
|
||||||
|
# 接单就确认收益
|
||||||
|
order.delivery_share = calculate_delivery_share(order, deliveryman)
|
||||||
|
|
||||||
db.commit()
|
db.commit()
|
||||||
|
|
||||||
# 发送企业微信消息
|
# 发送企业微信消息
|
||||||
|
|||||||
168
app/api/endpoints/partner.py
Normal file
168
app/api/endpoints/partner.py
Normal file
@ -0,0 +1,168 @@
|
|||||||
|
from fastapi import APIRouter, Depends, Query
|
||||||
|
from sqlalchemy.orm import Session
|
||||||
|
from sqlalchemy import func, and_, distinct
|
||||||
|
from app.models.database import get_db
|
||||||
|
from app.models.user_account import UserAccountDB, AccountDetailDB, AccountDetailType
|
||||||
|
from app.models.user import UserDB
|
||||||
|
from app.api.deps import get_current_user
|
||||||
|
from app.core.response import success_response, ResponseModel
|
||||||
|
from datetime import datetime, timedelta
|
||||||
|
from decimal import Decimal
|
||||||
|
from typing import Optional
|
||||||
|
from pydantic import BaseModel
|
||||||
|
from app.models.community_set_mapping import CommunitySetMapping
|
||||||
|
from app.models.community_set import CommunitySet
|
||||||
|
from app.models.order import ShippingOrderDB, OrderStatus
|
||||||
|
from app.models.community import CommunityDB
|
||||||
|
|
||||||
|
router = APIRouter()
|
||||||
|
|
||||||
|
@router.get("/summary", response_model=ResponseModel)
|
||||||
|
async def partner_summary(
|
||||||
|
db: Session = Depends(get_db),
|
||||||
|
current_user: UserDB = Depends(get_current_user)
|
||||||
|
):
|
||||||
|
"""获取合伙人收益汇总"""
|
||||||
|
|
||||||
|
# 获取当前用户管理的小区ID列表,直接在数据库层面去重
|
||||||
|
community_ids = db.query(CommunitySetMapping.community_id)\
|
||||||
|
.join(CommunitySet, CommunitySetMapping.set_id == CommunitySet.id)\
|
||||||
|
.filter(CommunitySet.user_id == current_user.userid)\
|
||||||
|
.distinct()\
|
||||||
|
.all()
|
||||||
|
|
||||||
|
# 将结果转换为简单列表
|
||||||
|
community_ids = [community_id[0] for community_id in community_ids]
|
||||||
|
|
||||||
|
# 总订单数
|
||||||
|
total_order_count = db.query(ShippingOrderDB).filter(
|
||||||
|
ShippingOrderDB.address_community_id.in_(community_ids),
|
||||||
|
ShippingOrderDB.status == OrderStatus.COMPLETED
|
||||||
|
).count()
|
||||||
|
|
||||||
|
# 获取当前小区今日、昨日订单量
|
||||||
|
today_start = datetime.now().replace(hour=0, minute=0, second=0, microsecond=0)
|
||||||
|
today_end = datetime.now().replace(hour=23, minute=59, second=59, microsecond=999999)
|
||||||
|
yesterday_start = today_start - timedelta(days=1)
|
||||||
|
yesterday_end = today_end - timedelta(days=1)
|
||||||
|
|
||||||
|
today_order_count = db.query(ShippingOrderDB).filter(
|
||||||
|
ShippingOrderDB.address_community_id.in_(community_ids),
|
||||||
|
ShippingOrderDB.create_time >= today_start,
|
||||||
|
ShippingOrderDB.create_time <= today_end,
|
||||||
|
ShippingOrderDB.status == OrderStatus.COMPLETED
|
||||||
|
).count()
|
||||||
|
|
||||||
|
yesterday_order_count = db.query(ShippingOrderDB).filter(
|
||||||
|
ShippingOrderDB.address_community_id.in_(community_ids),
|
||||||
|
ShippingOrderDB.create_time >= yesterday_start,
|
||||||
|
ShippingOrderDB.create_time <= yesterday_end,
|
||||||
|
ShippingOrderDB.status == OrderStatus.COMPLETED
|
||||||
|
).count()
|
||||||
|
|
||||||
|
# 总营收
|
||||||
|
total_income = db.query(func.sum(ShippingOrderDB.original_amount + ShippingOrderDB.additional_fee_amount)).filter(
|
||||||
|
ShippingOrderDB.address_community_id.in_(community_ids),
|
||||||
|
ShippingOrderDB.status == OrderStatus.COMPLETED
|
||||||
|
).scalar()
|
||||||
|
|
||||||
|
# 获取今日、昨日收益
|
||||||
|
today_income = db.query(func.sum(ShippingOrderDB.original_amount + ShippingOrderDB.additional_fee_amount)).filter(
|
||||||
|
ShippingOrderDB.address_community_id.in_(community_ids),
|
||||||
|
ShippingOrderDB.create_time >= today_start,
|
||||||
|
ShippingOrderDB.create_time <= today_end,
|
||||||
|
ShippingOrderDB.status == OrderStatus.COMPLETED
|
||||||
|
).scalar()
|
||||||
|
|
||||||
|
yesterday_income = db.query(func.sum(ShippingOrderDB.original_amount + ShippingOrderDB.additional_fee_amount)).filter(
|
||||||
|
ShippingOrderDB.address_community_id.in_(community_ids),
|
||||||
|
ShippingOrderDB.create_time >= yesterday_start,
|
||||||
|
ShippingOrderDB.create_time <= yesterday_end,
|
||||||
|
ShippingOrderDB.status == OrderStatus.COMPLETED
|
||||||
|
).scalar()
|
||||||
|
|
||||||
|
return success_response(data=
|
||||||
|
{"community_count": len(community_ids),
|
||||||
|
"total_order_count": total_order_count,
|
||||||
|
"today_order_count": today_order_count,
|
||||||
|
"yesterday_order_count": yesterday_order_count,
|
||||||
|
"total_order_amount": 0 if total_income is None else total_income,
|
||||||
|
"today_order_amount": 0 if today_income is None else today_income,
|
||||||
|
"yesterday_order_amount": 0 if yesterday_income is None else yesterday_income})
|
||||||
|
|
||||||
|
|
||||||
|
@router.get("/community_list", response_model=ResponseModel)
|
||||||
|
async def partner_community_list(
|
||||||
|
db: Session = Depends(get_db),
|
||||||
|
skip: int = 0,
|
||||||
|
limit: int = 10,
|
||||||
|
current_user: UserDB = Depends(get_current_user)
|
||||||
|
):
|
||||||
|
"""获取合伙人小区列表"""
|
||||||
|
# 获取当前用户管理的小区ID列表,直接在数据库层面去重
|
||||||
|
community_ids = db.query(CommunitySetMapping.community_id)\
|
||||||
|
.join(CommunitySet, CommunitySetMapping.set_id == CommunitySet.id)\
|
||||||
|
.filter(CommunitySet.user_id == current_user.userid)\
|
||||||
|
.distinct()\
|
||||||
|
.offset(skip)\
|
||||||
|
.limit(limit)\
|
||||||
|
.all()
|
||||||
|
|
||||||
|
total_count = db.query(CommunitySetMapping.community_id)\
|
||||||
|
.join(CommunitySet, CommunitySetMapping.set_id == CommunitySet.id)\
|
||||||
|
.filter(CommunitySet.user_id == current_user.userid)\
|
||||||
|
.distinct()\
|
||||||
|
.count()
|
||||||
|
|
||||||
|
# 将结果转换为简单列表
|
||||||
|
community_ids = [community_id[0] for community_id in community_ids]
|
||||||
|
|
||||||
|
results = []
|
||||||
|
for community_id in community_ids:
|
||||||
|
community = db.query(CommunityDB).filter(CommunityDB.id == community_id).first()
|
||||||
|
|
||||||
|
# 获取今日、昨日订单量
|
||||||
|
today_start = datetime.now().replace(hour=0, minute=0, second=0, microsecond=0)
|
||||||
|
today_end = datetime.now().replace(hour=23, minute=59, second=59, microsecond=999999)
|
||||||
|
yesterday_start = today_start - timedelta(days=1)
|
||||||
|
yesterday_end = today_end - timedelta(days=1)
|
||||||
|
|
||||||
|
today_order_count = db.query(ShippingOrderDB).filter(
|
||||||
|
ShippingOrderDB.address_community_id == community_id,
|
||||||
|
ShippingOrderDB.create_time >= today_start,
|
||||||
|
ShippingOrderDB.create_time <= today_end,
|
||||||
|
ShippingOrderDB.status == OrderStatus.COMPLETED
|
||||||
|
).count()
|
||||||
|
|
||||||
|
yesterday_order_count = db.query(ShippingOrderDB).filter(
|
||||||
|
ShippingOrderDB.address_community_id == community_id,
|
||||||
|
ShippingOrderDB.create_time >= yesterday_start,
|
||||||
|
ShippingOrderDB.create_time <= yesterday_end,
|
||||||
|
ShippingOrderDB.status == OrderStatus.COMPLETED
|
||||||
|
).count()
|
||||||
|
|
||||||
|
# 获取今日、昨日收益
|
||||||
|
today_income = db.query(func.sum(ShippingOrderDB.original_amount + ShippingOrderDB.additional_fee_amount)).filter(
|
||||||
|
ShippingOrderDB.address_community_id == community_id,
|
||||||
|
ShippingOrderDB.create_time >= today_start,
|
||||||
|
ShippingOrderDB.create_time <= today_end,
|
||||||
|
ShippingOrderDB.status == OrderStatus.COMPLETED
|
||||||
|
).scalar()
|
||||||
|
|
||||||
|
yesterday_income = db.query(func.sum(ShippingOrderDB.original_amount + ShippingOrderDB.additional_fee_amount)).filter(
|
||||||
|
ShippingOrderDB.address_community_id == community_id,
|
||||||
|
ShippingOrderDB.create_time >= yesterday_start,
|
||||||
|
ShippingOrderDB.create_time <= yesterday_end,
|
||||||
|
ShippingOrderDB.status == OrderStatus.COMPLETED
|
||||||
|
).scalar()
|
||||||
|
|
||||||
|
results.append({
|
||||||
|
"community_id": community_id,
|
||||||
|
"community_name": community.name,
|
||||||
|
"today_order_count": today_order_count,
|
||||||
|
"yesterday_order_count": yesterday_order_count,
|
||||||
|
"today_income": 0 if today_income is None else today_income,
|
||||||
|
"yesterday_income": 0 if yesterday_income is None else yesterday_income
|
||||||
|
})
|
||||||
|
|
||||||
|
return success_response(data={"items": results, "total": total_count})
|
||||||
@ -13,6 +13,7 @@ from app.core.config import settings
|
|||||||
from app.core.wecombot import WecomBot
|
from app.core.wecombot import WecomBot
|
||||||
from app.api.endpoints import wecom
|
from app.api.endpoints import wecom
|
||||||
from app.api.endpoints import feedback
|
from app.api.endpoints import feedback
|
||||||
|
from app.api.endpoints import partner
|
||||||
from starlette.middleware.sessions import SessionMiddleware
|
from starlette.middleware.sessions import SessionMiddleware
|
||||||
import os
|
import os
|
||||||
|
|
||||||
@ -49,6 +50,7 @@ app.include_router(dashboard.router, prefix="/api/dashboard", tags=["仪表盘"]
|
|||||||
app.include_router(wechat.router,prefix="/api/wechat",tags=["微信"])
|
app.include_router(wechat.router,prefix="/api/wechat",tags=["微信"])
|
||||||
app.include_router(mp.router, prefix="/api/mp", tags=["微信公众号"])
|
app.include_router(mp.router, prefix="/api/mp", tags=["微信公众号"])
|
||||||
app.include_router(wecom.router, prefix="/api/wecom", tags=["企业微信"])
|
app.include_router(wecom.router, prefix="/api/wecom", tags=["企业微信"])
|
||||||
|
app.include_router(partner.router, prefix="/api/partner", tags=["合伙人"])
|
||||||
app.include_router(user.router, prefix="/api/user", tags=["用户"])
|
app.include_router(user.router, prefix="/api/user", tags=["用户"])
|
||||||
app.include_router(bank_card.router, prefix="/api/bank-cards", tags=["用户银行卡"])
|
app.include_router(bank_card.router, prefix="/api/bank-cards", tags=["用户银行卡"])
|
||||||
app.include_router(withdraw.router, prefix="/api/withdraw", tags=["提现"])
|
app.include_router(withdraw.router, prefix="/api/withdraw", tags=["提现"])
|
||||||
@ -58,11 +60,11 @@ app.include_router(point_product_order.router, prefix="/api/point-product-orders
|
|||||||
app.include_router(account.router, prefix="/api/account", tags=["账户"])
|
app.include_router(account.router, prefix="/api/account", tags=["账户"])
|
||||||
app.include_router(address.router, prefix="/api/address", tags=["配送地址"])
|
app.include_router(address.router, prefix="/api/address", tags=["配送地址"])
|
||||||
app.include_router(community.router, prefix="/api/community", tags=["社区"])
|
app.include_router(community.router, prefix="/api/community", tags=["社区"])
|
||||||
app.include_router(community_building.router, prefix="/api/community/building", tags=["社区楼栋"])
|
|
||||||
app.include_router(community_set.router, prefix="/api/community-sets", tags=["社区集合"])
|
app.include_router(community_set.router, prefix="/api/community-sets", tags=["社区集合"])
|
||||||
app.include_router(community_set_mapping.router, prefix="/api/community-set-mappings", tags=["社区集合映射"])
|
app.include_router(community_set_mapping.router, prefix="/api/community-set-mappings", tags=["社区集合映射"])
|
||||||
app.include_router(timeperiod.router, prefix="/api/time-periods", tags=["配送时段"])
|
app.include_router(timeperiod.router, prefix="/api/time-periods", tags=["配送时段"])
|
||||||
app.include_router(community_timeperiod.router, prefix="/api/community-time-periods", tags=["社区配送时段"])
|
app.include_router(community_timeperiod.router, prefix="/api/community-time-periods", tags=["社区配送时段"])
|
||||||
|
app.include_router(community_building.router, prefix="/api/community/building", tags=["社区楼栋"])
|
||||||
app.include_router(station.router, prefix="/api/station", tags=["驿站"])
|
app.include_router(station.router, prefix="/api/station", tags=["驿站"])
|
||||||
app.include_router(order.router, prefix="/api/order", tags=["订单"])
|
app.include_router(order.router, prefix="/api/order", tags=["订单"])
|
||||||
app.include_router(order_additional_fee.router, prefix="/api/order-additional-fee", tags=["订单加价"])
|
app.include_router(order_additional_fee.router, prefix="/api/order-additional-fee", tags=["订单加价"])
|
||||||
|
|||||||
@ -67,6 +67,7 @@ class ShippingOrderDB(Base):
|
|||||||
|
|
||||||
delivery_method = Column(Enum(DeliveryMethod), nullable=False)
|
delivery_method = Column(Enum(DeliveryMethod), nullable=False)
|
||||||
delivery_date = Column(Date, nullable=False, default=datetime.now().date())
|
delivery_date = Column(Date, nullable=False, default=datetime.now().date())
|
||||||
|
delivery_share = Column(Float, default=0) # 配送费分润
|
||||||
package_count = Column(Integer, nullable=False)
|
package_count = Column(Integer, nullable=False)
|
||||||
original_amount = Column(Float, nullable=False)
|
original_amount = Column(Float, nullable=False)
|
||||||
coupon_discount_amount = Column(Float, default=0)
|
coupon_discount_amount = Column(Float, default=0)
|
||||||
@ -179,6 +180,7 @@ class OrderInfo(BaseModel):
|
|||||||
create_time: datetime
|
create_time: datetime
|
||||||
delivery_method: DeliveryMethod
|
delivery_method: DeliveryMethod
|
||||||
delivery_date: date
|
delivery_date: date
|
||||||
|
delivery_share: float = 0
|
||||||
|
|
||||||
deliveryman_user_id: Optional[int] = None
|
deliveryman_user_id: Optional[int] = None
|
||||||
|
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user