forked from erp-dev/erp
65 lines
2.7 KiB
Python
65 lines
2.7 KiB
Python
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)))
|