1
0
forked from erp-dev/erp
Files
erpnew/business/management/commands/sync_external_customer_finance.py
2026-05-19 23:41:34 +08:00

65 lines
2.7 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
from django.core.management.base import BaseCommand, CommandError
from basic_info import models as basic_models
from business.external_finance_sync import sync_customer_finance
from django.conf import settings
class Command(BaseCommand):
help = '按指定客户名从 HaoBuYe 外部财务接口同步收款/退款到 ReceiptOrder'
def add_arguments(self, parser):
parser.add_argument('customer_name', type=str, help='外部客户名称(精确匹配)')
parser.add_argument('--operator-id', type=int, default=None, help='本地经办人 Employee.id')
parser.add_argument(
'--allow-create-customer',
action='store_true',
default=False,
help='当本地客户不存在时自动创建',
)
parser.add_argument(
'--dry-run',
action='store_true',
default=False,
help='仅拉取和校验,不实际写入',
)
parser.add_argument(
'--force-update',
action='store_true',
default=False,
help='当已有记录与外部数据不一致时,强制用外部数据覆盖本地记录',
)
parser.add_argument(
'--progress-every',
type=int,
default=200,
help='长任务进度输出步长,默认每 200 条输出一次',
)
def handle(self, *args, **options):
customer_name = str(options['customer_name'] or '').strip()
operator_id = options.get('operator_id') or getattr(settings, 'HAOBUYE_FINANCE_SYNC_OPERATOR_ID', 0)
if not operator_id:
raise CommandError('必须提供 --operator-id或配置 HAOBUYE_FINANCE_SYNC_OPERATOR_ID')
try:
operator = basic_models.Employee.objects.select_related('merchant').get(id=operator_id)
except basic_models.Employee.DoesNotExist as exc:
raise CommandError(f'经办人不存在: {operator_id}') from exc
try:
self.stdout.write(f'[sync] 开始处理客户: {customer_name}')
payload = sync_customer_finance(
customer_name=customer_name,
operator=operator,
allow_create_customer=options['allow_create_customer'],
dry_run=bool(options['dry_run']),
force_update=bool(options['force_update']),
progress_callback=lambda message: self.stdout.write(f'[sync] {message}'),
progress_every=max(1, int(options.get('progress_every') or 200)),
)
except Exception as exc:
raise CommandError(str(exc)) from exc
self.stdout.write(self.style.SUCCESS(str(payload)))