addOption('from', null, InputOption::VALUE_OPTIONAL, '开始日期(含),格式 YYYY-MM-DD'); $this->addOption('to', null, InputOption::VALUE_OPTIONAL, '结束日期(含),格式 YYYY-MM-DD'); $this->addOption('limit', null, InputOption::VALUE_OPTIONAL, '最多处理用户数(按 user_id 去重后)', '0'); $this->addOption('dry-run', null, InputOption::VALUE_NONE, '仅预览,不落库'); } protected function execute(InputInterface $input, OutputInterface $output): int { $dateFrom = strval($input->getOption('from') ?? ''); $dateTo = strval($input->getOption('to') ?? ''); $limitRaw = strval($input->getOption('limit') ?? '0'); $dryRun = boolval($input->getOption('dry-run')); if ($dateFrom !== '' && !$this->isValidDate($dateFrom)) { $output->writeln('参数 --from 日期格式错误,需为 YYYY-MM-DD'); return self::FAILURE; } if ($dateTo !== '' && !$this->isValidDate($dateTo)) { $output->writeln('参数 --to 日期格式错误,需为 YYYY-MM-DD'); return self::FAILURE; } if (!is_numeric($limitRaw)) { $output->writeln('参数 --limit 必须是数字'); return self::FAILURE; } $limit = intval($limitRaw); if ($limit < 0) { $output->writeln('参数 --limit 不能小于 0'); return self::FAILURE; } $service = new MallDailyPushBackfill(); $result = $service->backfill( $dateFrom === '' ? null : $dateFrom, $dateTo === '' ? null : $dateTo, $limit, $dryRun ); $output->writeln('DailyPush 用户回补完成'); $output->writeln('dry_run: ' . ($result['dry_run'] ? 'true' : 'false')); $output->writeln('scanned_rows: ' . strval($result['scanned_rows'])); $output->writeln('target_users: ' . strval($result['target_users'])); $output->writeln('processed_users: ' . strval($result['processed_users'])); $output->writeln('created_users: ' . strval($result['created_users'])); $output->writeln('updated_users: ' . strval($result['updated_users'])); $output->writeln('unchanged_users: ' . strval($result['unchanged_users'])); $output->writeln('failed_users: ' . strval($result['failed_users'])); $errors = $result['errors']; if (is_array($errors) && !empty($errors)) { $output->writeln('错误明细:'); foreach ($errors as $err) { $uid = strval($err['user_id'] ?? ''); $msg = strval($err['message'] ?? ''); $output->writeln("- user_id={$uid}, message={$msg}"); } } return self::SUCCESS; } private function isValidDate(string $value): bool { $dt = \DateTime::createFromFormat('Y-m-d', $value); if (!$dt) { return false; } return $dt->format('Y-m-d') === $value; } }