今日收入笔数只读daily_income_stat.total_count

This commit is contained in:
XingQue
2026-06-24 22:27:31 +08:00
parent 7f2f0caaa1
commit 8154b2639d

View File

@@ -1,16 +1,10 @@
"""财务看板:只读 daily_income_stat / daily_payout_stat支持按俱乐部 Header 过滤。"""
"""财务看板:只读 daily_income_stat / daily_payout_stat 表字段,支持按俱乐部 Header 过滤。"""
from datetime import date, timedelta
from decimal import Decimal
from django.db.models import Sum
from config.models import DailyIncomeStat, DailyPayoutStat
from jituan.constants import CLUB_ID_DEFAULT, DATA_SCOPE_ALL
from jituan.services.club_context import filter_club_char_field, resolve_club_scope
from jituan.services.szjilu_accounting import (
collect_today_live_wechat_payments,
normalize_szjilu_club_id,
)
from jituan.services.club_context import filter_club_char_field
def _income_qs(request):
@@ -25,64 +19,30 @@ def _payout_qs(request):
return filter_club_char_field(DailyPayoutStat.objects.all(), request, field='club_id')
def _payment_matches_request(club_id, request):
if request is None or resolve_club_scope(request) == DATA_SCOPE_ALL:
return True
from jituan.services.club_context import resolve_club_id_from_request
cid = resolve_club_id_from_request(request)
ic = normalize_szjilu_club_id(club_id)
if cid == CLUB_ID_DEFAULT:
return ic == CLUB_ID_DEFAULT
return ic == cid
def sum_income_stat_for_date(stat_date, request=None):
amount = Decimal('0')
count = 0
for row in _income_qs(request).filter(date=stat_date).iterator():
amount += Decimal(str(row.total_amount or 0))
count += int(row.total_count or 0)
return float(amount), count
"""金额 = Sum(total_amount),笔数 = Sum(total_count),与库里 SQL 一致。"""
agg = _income_qs(request).filter(date=stat_date).aggregate(
total_amount=Sum('total_amount'),
total_count=Sum('total_count'),
)
return float(agg['total_amount'] or 0), int(agg['total_count'] or 0)
def sum_payout_stat_for_date(stat_date, request=None):
amount = Decimal('0')
count = 0
for row in _payout_qs(request).filter(date=stat_date).iterator():
amount += Decimal(str(row.total_amount or 0))
count += int(row.total_count or 0)
return float(amount), count
def count_live_income_payments(stat_date, request=None):
"""当日真实微信支付笔数(去重),可按俱乐部过滤。"""
items = collect_today_live_wechat_payments(stat_date)
if request is None:
return len(items)
return sum(
1 for _ref, cid, _jine, _kind in items
if _payment_matches_request(cid, request)
agg = _payout_qs(request).filter(date=stat_date).aggregate(
total_amount=Sum('total_amount'),
total_count=Sum('total_count'),
)
return float(agg['total_amount'] or 0), int(agg['total_count'] or 0)
def today_income_for_dashboard(stat_date=None, request=None):
"""
今日收入:金额与笔数均来自 daily_income_stat按俱乐部过滤
笔数若被 repair 虚增,用当日真实支付笔数校正。
"""
"""今日收入:只读 daily_income_stat.total_amount / total_count不扫订单。"""
stat_date = stat_date or date.today()
amount, table_count = sum_income_stat_for_date(stat_date, request)
live_count = count_live_income_payments(stat_date, request)
if live_count > 0 and table_count > live_count:
display_count = live_count
else:
display_count = table_count
return amount, display_count
return sum_income_stat_for_date(stat_date, request)
def cumulative_income_payout(request=None):
"""累计收入/支出/利润(按当前俱乐部视图范围)。"""
total_income = float(
_income_qs(request).aggregate(t=Sum('total_amount'))['t'] or 0
)
@@ -93,7 +53,6 @@ def cumulative_income_payout(request=None):
def daily_stats_for_request(request=None, days=30):
"""近 N 天每日收支(按俱乐部视图)。"""
since = date.today() - timedelta(days=days)
income_by_date = {
str(row['date']): {
@@ -130,8 +89,5 @@ def daily_stats_for_request(request=None, days=30):
def income_count_for_summary_date(stat_date, request=None):
if stat_date == date.today():
_, count = today_income_for_dashboard(stat_date, request)
return count
_, count = sum_income_stat_for_date(stat_date, request)
return count