171 lines
7.5 KiB
Python
171 lines
7.5 KiB
Python
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})
|