setName('sync_im_chat_archive') ->setDescription('同步诊单腾讯云 IM 聊天记录到数据库归档') ->addOption('since-days', null, Option::VALUE_OPTIONAL, '仅处理最近 N 天内更新过的诊单;默认0,覆盖旧患者聊天', '0') ->addOption('limit', 'l', Option::VALUE_OPTIONAL, '本轮最多处理的诊单数量(1-500)', '50') ->addOption('diagnosis-id', null, Option::VALUE_OPTIONAL, '只同步指定诊单 ID,设置后忽略 since-days', '0'); } protected function execute(Input $input, Output $output) { $sinceDays = (int)$input->getOption('since-days'); $sinceDays = max(0, $sinceDays); $limit = (int)$input->getOption('limit'); $onlyId = (int)$input->getOption('diagnosis-id'); $only = $onlyId > 0 ? $onlyId : null; if ($only !== null) { $output->writeln("同步诊单 ID={$only} ..."); } else { $output->writeln('同步 IM 归档:since-days=' . ($sinceDays > 0 ? $sinceDays : '不限制') . ", limit={$limit}"); } $stats = DiagnosisLogic::syncImChatArchiveBatch($sinceDays, $limit, $only); $output->writeln("处理患者诊单数: {$stats['diagnoses']},新归档消息数: {$stats['inserted']}"); if (!empty($stats['errors'])) { foreach ($stats['errors'] as $e) { $output->writeln("{$e}"); Log::error('sync_im_chat_archive: ' . $e); } // 项目调度器 Console::call 不转发命令退出码,抛错才能写入定时任务失败状态。 throw new \RuntimeException('IM 聊天归档未完全同步:' . implode(';', $stats['errors'])); } return 0; } }