Files
cunkebao_v3/Server/application/command/WorkbenchImportContactCommand.php

125 lines
3.8 KiB
PHP
Raw Normal View History

2025-09-10 16:58:22 +08:00
<?php
namespace app\command;
use app\job\WorkbenchImportContactJob;
use think\console\Command;
use think\console\Input;
use think\console\Output;
use think\facade\Log;
use think\facade\Cache;
use think\Queue;
/**
* 工作台通讯录导入命令
* Class WorkbenchImportContactCommand
* @package app\command
*/
class WorkbenchImportContactCommand extends Command
{
/**
* 配置命令
*/
protected function configure()
{
$this->setName('workbench:import-contact')
->setDescription('执行工作台通讯录导入任务');
}
/**
* 执行命令
* @param Input $input
* @param Output $output
* @return int
*/
protected function execute(Input $input, Output $output)
{
$output->writeln('开始执行工作台通讯录导入任务...');
try {
// 检查是否有任务正在执行
$lockKey = 'workbench_import_contact_lock';
if (Cache::has($lockKey)) {
$output->writeln('通讯录导入任务正在执行中,跳过本次执行');
return 0;
}
// 设置执行锁,防止重复执行
Cache::set($lockKey, time(), 3600); // 1小时锁定时间
// 生成任务ID
$jobId = 'workbench_import_contact_' . date('YmdHis') . '_' . mt_rand(1000, 9999);
// 准备任务数据
$jobData = [
'jobId' => $jobId,
'queueLockKey' => $lockKey,
'executeTime' => time()
];
// 判断是否使用队列
if ($this->shouldUseQueue()) {
// 推送到队列
Queue::push(WorkbenchImportContactJob::class, $jobData, 'workbench_import_contact');
$output->writeln("通讯录导入任务已推送到队列任务ID: {$jobId}");
} else {
// 直接执行
$job = new WorkbenchImportContactJob();
$result = $job->execute();
// 释放锁
Cache::rm($lockKey);
if ($result !== false) {
$output->writeln('通讯录导入任务执行成功');
} else {
$output->writeln('通讯录导入任务执行失败');
return 1;
}
}
} catch (\Exception $e) {
// 释放锁
Cache::rm($lockKey ?? '');
$errorMsg = '通讯录导入任务执行异常: ' . $e->getMessage();
$output->writeln($errorMsg);
Log::error($errorMsg);
return 1;
}
return 0;
}
/**
* 判断是否应该使用队列
* @return bool
*/
protected function shouldUseQueue()
{
// 检查队列配置是否启用
$queueConfig = config('queue');
if (empty($queueConfig) || !isset($queueConfig['default'])) {
return false;
}
// 检查队列连接是否可用
try {
$connection = $queueConfig['connections'][$queueConfig['default']] ?? [];
if (empty($connection)) {
return false;
}
// 如果是数据库队列,检查表是否存在
if ($connection['type'] === 'database') {
$tableName = $connection['table'] ?? 'jobs';
$exists = \think\Db::query("SHOW TABLES LIKE '{$tableName}'");
return !empty($exists);
}
return true;
} catch (\Exception $e) {
Log::warning('队列检查失败,将使用同步执行: ' . $e->getMessage());
return false;
}
}
}