55 lines
2.2 KiB
PHP
Executable File
55 lines
2.2 KiB
PHP
Executable File
<?php
|
||
|
||
declare(strict_types=1);
|
||
|
||
namespace app\common\command;
|
||
|
||
use app\adminapi\logic\tcm\DiagnosisLogic;
|
||
use think\console\Command;
|
||
use think\console\Input;
|
||
use think\console\input\Option;
|
||
use think\console\Output;
|
||
use think\facade\Log;
|
||
|
||
/**
|
||
* 回调实时归档之外的定时补拉;按患者轮转,覆盖没有更新诊单的旧患者。
|
||
*/
|
||
class SyncImChatArchive extends Command
|
||
{
|
||
protected function configure()
|
||
{
|
||
$this->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("<error>{$e}</error>");
|
||
Log::error('sync_im_chat_archive: ' . $e);
|
||
}
|
||
// 项目调度器 Console::call 不转发命令退出码,抛错才能写入定时任务失败状态。
|
||
throw new \RuntimeException('IM 聊天归档未完全同步:' . implode(';', $stats['errors']));
|
||
}
|
||
return 0;
|
||
}
|
||
}
|