财务接口按俱乐部过滤,日收支只读daily_income_stat与daily_payout_stat

This commit is contained in:
XingQue
2026-06-24 22:22:12 +08:00
parent 8e5db24bad
commit 7f2f0caaa1
6 changed files with 260 additions and 133 deletions

View File

@@ -6939,23 +6939,27 @@ class CaiwuView(APIView):
today_start = datetime.combine(today, datetime.min.time())
today_end = today_start + timedelta(days=1)
# 四个板子 + 累计:全平台 daily_income_stat / daily_payout_stat 按 date 汇总(不按俱乐部缩范围)
today_inc = DailyIncomeStat.query.filter(date=today).aggregate(
total_amount=Sum('total_amount'),
total_count=Sum('total_count'),
from jituan.services.club_context import (
filter_club_char_field,
filter_queryset_by_club,
resolve_club_id_from_request,
resolve_club_scope,
)
from jituan.services.daily_finance_display import (
cumulative_income_payout,
daily_stats_for_request,
sum_payout_stat_for_date,
today_income_for_dashboard,
)
today_income_amount = float(today_inc['total_amount'] or 0.00)
today_income_count = int(today_inc['total_count'] or 0)
today_pay = DailyPayoutStat.query.filter(date=today).aggregate(
total_amount=Sum('total_amount'),
total_count=Sum('total_count'),
)
today_payout_amount = float(today_pay['total_amount'] or 0.00)
today_payout_count = int(today_pay['total_count'] or 0)
order_qs = filter_queryset_by_club(Order.query.all(), request, club_field='ClubID')
# 四个板子:按 Header 俱乐部范围读 daily_income_stat / daily_payout_stat
today_income_amount, today_income_count = today_income_for_dashboard(today, request)
today_payout_amount, today_payout_count = sum_payout_stat_for_date(today, request)
# 今日订单(已付款及之后的状态)
today_orders = Order.query.filter(
today_orders = order_qs.filter(
CreateTime__gte=today_start,
CreateTime__lt=today_end,
Status__in=[1,2,3,4,5,6,7,8]
@@ -6982,7 +6986,8 @@ class CaiwuView(APIView):
today_tuikuan_amount = float(today_tuikuan.aggregate(total=Sum('Amount'))['total'] or 0.00)
# 今日充值会员充值leixing=1, zhuangtai=3
today_chongzhi = Czjilu.query.filter(
cz_qs = filter_club_char_field(Czjilu.query.all(), request, field='club_id')
today_chongzhi = cz_qs.filter(
CreateTime__gte=today_start,
CreateTime__lt=today_end,
leixing=1,
@@ -6991,8 +6996,9 @@ class CaiwuView(APIView):
today_chongzhi_count = today_chongzhi.count()
today_chongzhi_amount = float(today_chongzhi.aggregate(total=Sum('jine'))['total'] or 0.00)
# 今日新增会员:从购买记录表统计今天创建的用户(去重)
new_huiyuan_user_ids = Huiyuangoumai.query.filter(
# 今日新增会员
hy_qs = filter_club_char_field(Huiyuangoumai.query.all(), request, field='club_id')
new_huiyuan_user_ids = hy_qs.filter(
CreateTime__gte=today_start,
CreateTime__lt=today_end
).values_list('yonghu_id', flat=True).distinct()
@@ -7001,7 +7007,7 @@ class CaiwuView(APIView):
# 新增会员充值总额(这些用户今天的会员充值金额)
today_new_huiyuan_amount = 0.0
if new_huiyuan_user_ids:
amount_sum = Czjilu.query.filter(
amount_sum = cz_qs.filter(
CreateTime__gte=today_start,
CreateTime__lt=today_end,
yonghuid__in=new_huiyuan_user_ids,
@@ -7016,49 +7022,17 @@ class CaiwuView(APIView):
all_zuzhang_yue = float(UserZuzhang.query.aggregate(total=Sum('ketixian_jine'))['total'] or 0.00)
all_shangjia_yue = float(UserShangjia.query.aggregate(total=Sum('yue'))['total'] or 0.00)
# 累计收支 / 利润:日统计表全平台各行相加
total_income = float(DailyIncomeStat.query.aggregate(total=Sum('total_amount'))['total'] or 0.00)
total_payout = float(DailyPayoutStat.query.aggregate(total=Sum('total_amount'))['total'] or 0.00)
platform_profit = round(total_income - total_payout, 2)
# 累计收支 / 利润(当前俱乐部视图范围)
total_income, total_payout, platform_profit = cumulative_income_payout(request)
# 近30天每日收支明细全平台
daily_stats = []
since = today - timedelta(days=30)
income_by_date = {
str(row['date']): {
'income': float(row['total_amount'] or 0),
'income_count': int(row['total_count'] or 0),
}
for row in DailyIncomeStat.query.filter(date__gte=since).values('date').annotate(
total_amount=Sum('total_amount'),
total_count=Sum('total_count'),
)
}
payout_by_date = {
str(row['date']): float(row['total_amount'] or 0)
for row in DailyPayoutStat.query.filter(date__gte=since).values('date').annotate(
total_amount=Sum('total_amount'),
)
}
all_dates = sorted(
set(income_by_date.keys()) | set(payout_by_date.keys()),
reverse=True,
)[:30]
for d in all_dates:
inc = income_by_date.get(d, {'income': 0.0, 'income_count': 0})
payout_amt = payout_by_date.get(d, 0.00)
daily_stats.append({
'date': d,
'income': inc['income'],
'income_count': inc['income_count'],
'payout': payout_amt,
'profit': round(inc['income'] - payout_amt, 2),
})
daily_stats = daily_stats_for_request(request, days=30)
return Response({
'code': 0,
'msg': 'ok',
'data': {
'club_id': resolve_club_id_from_request(request),
'scope': resolve_club_scope(request),
'today_income': round(today_income_amount, 2),
'today_income_count': today_income_count,
'today_payout': round(today_payout_amount, 2),