56 lines
1.9 KiB
PHP
56 lines
1.9 KiB
PHP
<?php
|
||
|
||
namespace App\Console\Commands;
|
||
|
||
use App\Business\KukaPostingBase\KukaPostingMaterialMapSynchronizer;
|
||
use Illuminate\Console\Command;
|
||
use InvalidArgumentException;
|
||
|
||
class SyncKukaPostingMaterialMap extends Command
|
||
{
|
||
protected $signature = 'business-mirror:sync-kuka-posting-material-map
|
||
{--company=1 : 公司 ID}
|
||
{--period= : 只匹配指定账期,格式 YYYY-MM}
|
||
{--dry-run : 只读取和校验,不覆盖镜像}
|
||
{--json : 输出 JSON}';
|
||
|
||
protected $description = '按货号从家具产品开发数据库匹配唯一物料编号';
|
||
|
||
public function handle(KukaPostingMaterialMapSynchronizer $synchronizer): int
|
||
{
|
||
$companyId = (int) $this->option('company');
|
||
if ($companyId <= 0) {
|
||
throw new InvalidArgumentException('公司 ID 必须为正整数。');
|
||
}
|
||
|
||
$period = trim((string) $this->option('period'));
|
||
if ($period !== '' && preg_match('/^\d{4}-(0[1-9]|1[0-2])$/', $period) !== 1) {
|
||
throw new InvalidArgumentException('账期格式必须为 YYYY-MM。');
|
||
}
|
||
|
||
$result = $synchronizer->sync(
|
||
$companyId,
|
||
$period === '' ? null : $period,
|
||
(bool) $this->option('dry-run'),
|
||
);
|
||
|
||
if ((bool) $this->option('json')) {
|
||
$this->line(json_encode($result, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES));
|
||
} else {
|
||
$this->info(sprintf(
|
||
'物料映射%s完成:货号 %d,唯一匹配 %d,未匹配 %d,冲突 %d;直接物料编号 %d,档案条码 %d,品牌SKU %d。',
|
||
$result['dry_run'] ? '校验' : '同步',
|
||
$result['items'],
|
||
$result['matched'],
|
||
$result['unmatched'],
|
||
$result['ambiguous'],
|
||
$result['direct'],
|
||
$result['archive'],
|
||
$result['brand_sku'],
|
||
));
|
||
}
|
||
|
||
return self::SUCCESS;
|
||
}
|
||
}
|