69 lines
2.8 KiB
Python
69 lines
2.8 KiB
Python
"""
|
||
恢复 daily_income_stat(每日收入统计表)全表数据。
|
||
|
||
repair_wechat_income 对该表的破坏:
|
||
- 把扫描到的每笔订单/充值重复写入 daily_income_stat
|
||
- 金额记到「执行命令那天」,不是真实支付日
|
||
- 含退款单(Status=5)也被当成收入加进去
|
||
|
||
本命令按 platform_income_log + 无日志的已支付单,重建整张 daily_income_stat。
|
||
不碰 daily_payout_stat,不碰 szjilu,不删订单。
|
||
|
||
预览:python manage.py restore_finance_stats
|
||
执行:python manage.py restore_finance_stats --yes
|
||
"""
|
||
from datetime import date
|
||
|
||
from django.core.management.base import BaseCommand
|
||
from django.db.models import Sum
|
||
|
||
from config.models import DailyIncomeStat, DailyPayoutStat
|
||
from jituan.services.szjilu_accounting import rebuild_daily_income_stat_table
|
||
|
||
|
||
class Command(BaseCommand):
|
||
help = '恢复 daily_income_stat 全表(财务四个板子读这张表)'
|
||
|
||
def add_arguments(self, parser):
|
||
parser.add_argument('--yes', action='store_true', help='确认写入数据库')
|
||
|
||
def handle(self, *args, **options):
|
||
dry_run = not options['yes']
|
||
|
||
if dry_run:
|
||
self.stdout.write(self.style.WARNING('【预览】未改数据库\n'))
|
||
else:
|
||
self.stdout.write(self.style.WARNING('【执行】重建 daily_income_stat...\n'))
|
||
|
||
r = rebuild_daily_income_stat_table(dry_run=dry_run)
|
||
|
||
self.stdout.write(f' 支付笔数(去重): {r["payment_rows"]}')
|
||
self.stdout.write(f' 其中日志: {r["from_log"]}')
|
||
self.stdout.write(f' 补漏订单: {r["gap_orders"]}')
|
||
self.stdout.write(f' 补漏充值: {r["gap_cz"]}')
|
||
self.stdout.write(f' 日统计行数: {r["daily_rows"]}')
|
||
self.stdout.write(f' 恢复前 daily 合计: {r["before_daily_total"]:.2f} 元')
|
||
self.stdout.write(self.style.SUCCESS(
|
||
f' 恢复后 daily 合计: {r["after_daily_total"]:.2f} 元'
|
||
))
|
||
self.stdout.write(f' 其中今日收入: {r["today_amount"]:.2f} 元 / {r["today_count"]} 笔')
|
||
|
||
payout_today = DailyPayoutStat.objects.filter(date=date.today()).aggregate(
|
||
t=Sum('total_amount'),
|
||
)['t'] or 0
|
||
self.stdout.write(
|
||
f' (未动)今日支出表: {float(payout_today):.2f} 元'
|
||
)
|
||
|
||
if dry_run:
|
||
self.stdout.write(self.style.WARNING(
|
||
'\n预览数字合理后执行:\n'
|
||
' python manage.py restore_finance_stats --yes\n'
|
||
'然后 push 代码并刷新财务页。'
|
||
))
|
||
else:
|
||
check = DailyIncomeStat.objects.aggregate(t=Sum('total_amount'))['t'] or 0
|
||
self.stdout.write(self.style.SUCCESS(
|
||
f'\n完成。数据库 daily_income_stat 合计: {float(check):.2f} 元'
|
||
))
|