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 from app.models.address import AddressDB from app.models.user import UserRole from app.core.response import error_response 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() # 根据地址获取当前小区的用户量 user_count = db.query(AddressDB).filter( AddressDB.community_id == community_id, AddressDB.is_default == True ).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 == 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, "user_count": user_count, "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}) @router.get("/community/{community_id}", response_model=ResponseModel) async def partner_community_detail( community_id: int, db: Session = Depends(get_db), current_user: UserDB = Depends(get_current_user) ): """获取合伙人小区详情""" community = db.query(CommunityDB).filter(CommunityDB.id == community_id).first() if not community: return error_response(message="小区不存在") community_sets = db.query(CommunitySet).filter( CommunitySet.community_set_mappings.any( CommunitySetMapping.community_id == community_id ) ).all() partner_ids = [sets.user_id for sets in community_sets] # 获取Partner列表 partner_list = db.query(UserDB).filter(UserDB.userid.in_(partner_ids)).all() partner_names = ",".join([partner.nickname for partner in partner_list]) # 小区用户数 user_count = db.query(AddressDB).filter( AddressDB.community_id == community_id, AddressDB.is_default == True ).count() # 小区订单总量 total_order_count = db.query(ShippingOrderDB).filter( ShippingOrderDB.address_community_id == community_id, 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 == 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() # 小区总营收 total_income = db.query(func.sum(ShippingOrderDB.original_amount + ShippingOrderDB.additional_fee_amount)).filter( ShippingOrderDB.address_community_id == community_id, ShippingOrderDB.status == OrderStatus.COMPLETED ).scalar() # 小区今日、昨日收益 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() # 配送员列表, 只查询有配送员的小区 delivery_list = db.query(UserDB).filter(UserDB.community_id == community_id, UserDB.roles.contains(UserRole.DELIVERYMAN)).all() delivery_data = [] for delivery in delivery_list: # 累计订单数,累计收益 total_order_count = db.query(ShippingOrderDB).filter( ShippingOrderDB.address_community_id == community_id, ShippingOrderDB.status == OrderStatus.COMPLETED, ShippingOrderDB.deliveryman_user_id == delivery.userid ).count() total_income = db.query(func.sum(ShippingOrderDB.original_amount + ShippingOrderDB.additional_fee_amount)).filter( ShippingOrderDB.address_community_id == community_id, ShippingOrderDB.status == OrderStatus.COMPLETED, ShippingOrderDB.deliveryman_user_id == delivery.userid ).scalar() # 今日订单数,昨日订单数 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, ShippingOrderDB.deliveryman_user_id == delivery.userid ).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, ShippingOrderDB.deliveryman_user_id == delivery.userid ).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, ShippingOrderDB.deliveryman_user_id == delivery.userid ).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, ShippingOrderDB.deliveryman_user_id == delivery.userid ).scalar() delivery_data.append({ "delivery_id": delivery.userid, "delivery_name": delivery.nickname, "total_order_count": total_order_count, "total_income": 0 if total_income is None else total_income, "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={ "community_name": community.name, "partner_names": partner_names, "user_count": user_count, "total_order_count": total_order_count, "yesterday_order_count": yesterday_order_count, "total_income": 0 if total_income is None else total_income, "today_income": 0 if today_income is None else today_income, "yesterday_income": 0 if yesterday_income is None else yesterday_income, "delivery_list": delivery_data })