- 新增违规字典表 store_violation_rules 与推送日志表 store_violation_push_logs;统一表增加预警派生字段(迁移,全部可空带索引) - 预警计算:按平台+违规类型匹配字典(去括号后 相等/前缀/分词/宽松/关键词),匹配不到=不提醒;责任人取店铺账号镜像运营负责人并回退店铺档案;处理截止=申诉截止优先,否则级别天数(P0+1/P1+2/P2+3,当天23:59:59) - 页面:新增预警级别(红/橙/绿标签)、责任人、处理截止、是否超时、推送状态5列;级别/责任人(含我的待办)/超时筛选;默认视图(需提醒&未处理)与全部数据切换;行内 认领/完成/忽略(忽略必填原因) - 处理状态扩为 未处理/处理中/处理完成/已忽略,导入兼容旧值(已处理/无需处理) - 新增「预览统计」页面:平台Tab联动 + 4张KPI卡(今日新增/待处理/P0未处理/已超时)+ 需提醒未处理预览列表与认领 - 群推送先留接口:P0/P1 每天09:00起每5分钟即时推送(责任人、处理建议、去认领签名链接);P2每日10:00汇总(含超时未认领点名);防重与推送日志;新命令 push-instant/push-digest - 同步与导入自动计算派生字段;新增 store-violations:recalc-alerts 重算命令;生产 cron 已登记推送任务 - 测试:StoreViolation 系列 + 部署调度 + 导航 共42项/453断言通过
74 lines
2.8 KiB
PHP
74 lines
2.8 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', '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);
|
|
|
|
$updates[] = ['id' => $row->id] + $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;
|
|
}
|
|
}
|