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})