fix: 恢复 repair 重复记账 + 禁用错误补账命令
This commit is contained in:
@@ -1,102 +1,15 @@
|
||||
"""补记漏掉的微信收入统计(今日或指定日期已支付但未入账的单据)。"""
|
||||
from datetime import date, datetime, timedelta
|
||||
|
||||
"""【已废弃】请用 sync_daily_income_from_log,本命令曾导致重复记账。"""
|
||||
from django.core.management.base import BaseCommand
|
||||
from django.db.models import Q
|
||||
|
||||
from config.models import PlatformIncomeLog
|
||||
from jituan.constants import CLUB_ID_DEFAULT
|
||||
from jituan.services.szjilu_accounting import repair_wechat_income_if_missing
|
||||
from orders.models import Order
|
||||
from products.models import Czjilu
|
||||
|
||||
|
||||
class Command(BaseCommand):
|
||||
help = '扫描已支付订单/充值单,补记 daily_income_stat(幂等,可重复执行)'
|
||||
|
||||
def add_arguments(self, parser):
|
||||
parser.add_argument(
|
||||
'--date',
|
||||
type=str,
|
||||
default='',
|
||||
help='补记日期 YYYY-MM-DD,默认今天',
|
||||
)
|
||||
parser.add_argument(
|
||||
'--days',
|
||||
type=int,
|
||||
default=1,
|
||||
help='从指定日期起向前补几天,默认 1(仅当天)',
|
||||
)
|
||||
help = '已废弃:勿使用。请改用 python manage.py sync_daily_income_from_log --reset-day'
|
||||
|
||||
def handle(self, *args, **options):
|
||||
if options['date']:
|
||||
end_day = date.fromisoformat(options['date'])
|
||||
else:
|
||||
end_day = date.today()
|
||||
days = max(1, int(options['days'] or 1))
|
||||
start_day = end_day - timedelta(days=days - 1)
|
||||
|
||||
repaired = 0
|
||||
skipped = 0
|
||||
errors = 0
|
||||
|
||||
for day in range(days):
|
||||
d = start_day + timedelta(days=day)
|
||||
day_start = datetime.combine(d, datetime.min.time())
|
||||
day_end = day_start + timedelta(days=1)
|
||||
self.stdout.write(f'扫描 {d} ...')
|
||||
|
||||
orders = Order.query.filter(
|
||||
CreateTime__gte=day_start,
|
||||
CreateTime__lt=day_end,
|
||||
Status__in=[1, 2, 3, 4, 5, 6, 7, 8],
|
||||
)
|
||||
for od in orders:
|
||||
club_id = getattr(od, 'ClubID', None) or CLUB_ID_DEFAULT
|
||||
ref = f'order:{od.OrderID}'
|
||||
try:
|
||||
ok = self._repair_one(od.Amount, club_id, biz_ref=ref)
|
||||
if ok:
|
||||
repaired += 1
|
||||
self.stdout.write(f' + 订单 {od.OrderID} {od.Amount}元 club={club_id}')
|
||||
else:
|
||||
skipped += 1
|
||||
except Exception as exc:
|
||||
errors += 1
|
||||
self.stderr.write(f' ! 订单 {od.OrderID} 失败: {exc}')
|
||||
|
||||
cz_orders = Czjilu.query.filter(
|
||||
CreateTime__gte=day_start,
|
||||
CreateTime__lt=day_end,
|
||||
zhuangtai=3,
|
||||
).filter(
|
||||
Q(leixing__in=[1, 2, 3, 4]) | Q(leixing__isnull=False),
|
||||
)
|
||||
for cz in cz_orders:
|
||||
club_id = getattr(cz, 'club_id', None) or CLUB_ID_DEFAULT
|
||||
ref = f'cz:{cz.dingdan_id}'
|
||||
try:
|
||||
ok = self._repair_one(cz.jine, club_id, biz_ref=ref)
|
||||
if ok:
|
||||
repaired += 1
|
||||
self.stdout.write(f' + 充值 {cz.dingdan_id} {cz.jine}元 leixing={cz.leixing} club={club_id}')
|
||||
else:
|
||||
skipped += 1
|
||||
except Exception as exc:
|
||||
errors += 1
|
||||
self.stderr.write(f' ! 充值 {cz.dingdan_id} 失败: {exc}')
|
||||
|
||||
self.stdout.write(self.style.SUCCESS(
|
||||
f'完成:新补记 {repaired} 笔,已存在跳过 {skipped} 笔,失败 {errors} 笔',
|
||||
self.stderr.write(self.style.ERROR(
|
||||
'repair_wechat_income 已禁用(会对已入账订单重复加钱)。\n'
|
||||
'纠正今日虚高请执行:\n'
|
||||
' python manage.py sync_daily_income_from_log --reset-day\n'
|
||||
'可选同时重算累计:\n'
|
||||
' python manage.py sync_daily_income_from_log --reset-day --sync-szjilu'
|
||||
))
|
||||
|
||||
def _repair_one(self, amount, club_id, biz_ref):
|
||||
"""幂等补记;若仅有孤儿幂等日志无日统计,删日志后重试一次。"""
|
||||
ref = (biz_ref or '').strip()
|
||||
ok = repair_wechat_income_if_missing(amount, club_id, biz_ref=ref)
|
||||
if ok:
|
||||
return True
|
||||
if PlatformIncomeLog.objects.filter(biz_ref=ref).exists():
|
||||
PlatformIncomeLog.objects.filter(biz_ref=ref).delete()
|
||||
return repair_wechat_income_if_missing(amount, club_id, biz_ref=ref)
|
||||
return False
|
||||
|
||||
Reference in New Issue
Block a user