80 lines
3.1 KiB
PHP
80 lines
3.1 KiB
PHP
<?php
|
||
|
||
namespace App\Console\Commands;
|
||
|
||
use App\Business\StoreViolationAlertCalculator;
|
||
use Illuminate\Console\Command;
|
||
use Illuminate\Support\Facades\DB;
|
||
use Modules\EcommerceFinance\Repositories\StoreViolationRecordRepository;
|
||
|
||
/**
|
||
* 店铺违规信息预警:按当前字典/归属重新计算全部记录的预警派生字段。
|
||
*
|
||
* 用于字典维护或店铺归属调整后的校准;不触碰处理状态、忽略原因与推送状态。
|
||
*/
|
||
class RecalcStoreViolationAlerts extends Command
|
||
{
|
||
protected $signature = 'store-violations:recalc-alerts
|
||
{--platform= : 只重算指定平台}
|
||
{--chunk=500 : 每批更新行数}';
|
||
|
||
protected $description = '重算店铺违规记录的预警级别、责任人与处理截止';
|
||
|
||
public function handle(StoreViolationAlertCalculator $calculator, StoreViolationRecordRepository $repository): int
|
||
{
|
||
if (! $repository->available()) {
|
||
$this->error('统一表 store_violation_records 尚未建立。');
|
||
|
||
return self::FAILURE;
|
||
}
|
||
|
||
$connection = DB::connection((string) config('upstream_mirrors.connection', 'business_mirror'));
|
||
$chunk = max(min((int) $this->option('chunk'), 2000), 100);
|
||
$platform = trim((string) $this->option('platform'));
|
||
$total = 0;
|
||
|
||
$query = $connection->table(StoreViolationRecordRepository::TABLE)
|
||
->select(['id', 'platform', 'violation_no', 'shop_name', 'violation_type', 'violation_reason', 'violation_date', 'appeal_deadline'])
|
||
->orderBy('id');
|
||
if ($platform !== '') {
|
||
$query->where('platform', $platform);
|
||
}
|
||
|
||
$query->chunk($chunk, function ($rows) use ($calculator, $connection, &$total): void {
|
||
$updates = [];
|
||
foreach ($rows as $row) {
|
||
$matchType = trim((string) ($row->violation_type ?? '')) !== ''
|
||
? (string) $row->violation_type
|
||
: ($row->violation_reason ?? null);
|
||
|
||
// upsert 的插入侧会校验非空列,带上 platform / violation_no 以通过严格模式;
|
||
// 命中已有记录时只会更新派生字段(update 列表)。
|
||
$updates[] = [
|
||
'id' => $row->id,
|
||
'platform' => (string) $row->platform,
|
||
'violation_no' => (string) ($row->violation_no ?? ''),
|
||
] + $calculator->calculate(
|
||
(string) $row->platform,
|
||
$row->shop_name,
|
||
$matchType,
|
||
$row->violation_date ? (string) $row->violation_date : null,
|
||
$row->appeal_deadline ? (string) $row->appeal_deadline : null,
|
||
);
|
||
}
|
||
|
||
if ($updates !== []) {
|
||
$connection->table(StoreViolationRecordRepository::TABLE)->upsert(
|
||
$updates,
|
||
['id'],
|
||
StoreViolationRecordRepository::ALERT_DERIVED_COLUMNS,
|
||
);
|
||
$total += count($updates);
|
||
}
|
||
});
|
||
|
||
$this->info(sprintf('预警重算完成:%d 行。', $total));
|
||
|
||
return self::SUCCESS;
|
||
}
|
||
}
|