From 8154b2639d0f53d80faeaa98d4bad084589e864c Mon Sep 17 00:00:00 2001 From: XingQue Date: Wed, 24 Jun 2026 22:27:31 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BB=8A=E6=97=A5=E6=94=B6=E5=85=A5=E7=AC=94?= =?UTF-8?q?=E6=95=B0=E5=8F=AA=E8=AF=BBdaily=5Fincome=5Fstat.total=5Fcount?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- jituan/services/daily_finance_display.py | 72 +++++------------------- 1 file changed, 14 insertions(+), 58 deletions(-) diff --git a/jituan/services/daily_finance_display.py b/jituan/services/daily_finance_display.py index c9bc5d0..f8eb85f 100644 --- a/jituan/services/daily_finance_display.py +++ b/jituan/services/daily_finance_display.py @@ -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