59 lines
2.4 KiB
PHP
59 lines
2.4 KiB
PHP
<?php
|
||
|
||
namespace Modules\EcommerceFinance\Console;
|
||
|
||
use Illuminate\Console\Command;
|
||
use Illuminate\Support\Carbon;
|
||
use Modules\EcommerceFinance\Services\Jushuitan\ShippingReplicaSynchronizer;
|
||
|
||
/**
|
||
* 发货数据同步:从经营分析副本库(operations_replica)直读聚水潭发货明细,清洗进本地展示表。
|
||
*
|
||
* php artisan jushuitan:sync-shipping --from=2026-09-01 --to=2026-09-17 # 按发货时间窗口拉全量
|
||
* php artisan jushuitan:sync-shipping --days=3 # 滚动最近 3 天(每日调度用)
|
||
* php artisan jushuitan:sync-shipping # 最近 2000 条(快速看效果)
|
||
*
|
||
* 按 id 去重 upsert,任何时候补拉早期区间都不会重复。
|
||
*/
|
||
class SyncJushuitanShipping extends Command
|
||
{
|
||
protected $signature = 'jushuitan:sync-shipping {--from=} {--to=} {--days=} {--limit=2000}';
|
||
|
||
protected $description = '从经营分析副本库直读聚水潭发货明细,清洗写入 caiwu 发货数据表';
|
||
|
||
public function handle(): int
|
||
{
|
||
@ini_set('memory_limit', '1536M');
|
||
@set_time_limit(0);
|
||
$from = $this->option('from') ? Carbon::parse($this->option('from')) : null;
|
||
$to = $this->option('to') ? Carbon::parse($this->option('to')) : null;
|
||
|
||
// --days=N:滚动最近 N 天(含今天)。显式 --from/--to 优先。
|
||
if (! $from && ! $to && $this->option('days')) {
|
||
$days = max((int) $this->option('days'), 1);
|
||
$from = now()->startOfDay()->subDays($days - 1);
|
||
$to = now()->startOfDay()->addDay();
|
||
}
|
||
|
||
$limit = (int) ($this->option('limit') ?: 2000);
|
||
|
||
$range = ($from && $to) ? $from->toDateString() . ' ~ ' . $to->toDateString() : '最近 ' . $limit . ' 条';
|
||
$this->info('开始从副本库同步发货明细(' . $range . ')...');
|
||
$progress = function (string $msg): void {
|
||
$this->info(' ' . $msg);
|
||
if (function_exists('fflush')) {
|
||
@fflush(STDOUT);
|
||
}
|
||
};
|
||
try {
|
||
$result = ShippingReplicaSynchronizer::make()->sync($from, $to, $limit, $progress);
|
||
} catch (\Throwable $e) {
|
||
$this->error('同步失败:' . $e->getMessage());
|
||
return self::FAILURE;
|
||
}
|
||
|
||
$this->info('完成:写入 ' . ($result['processed'] ?? 0) . ' 条发货明细。');
|
||
return self::SUCCESS;
|
||
}
|
||
}
|