174 lines
6.0 KiB
PHP
174 lines
6.0 KiB
PHP
<?php
|
||
|
||
namespace app\common\command;
|
||
|
||
use app\common\service\DemandGroupChatService;
|
||
use think\console\Command;
|
||
use think\console\Input;
|
||
use think\console\Output;
|
||
use think\console\input\Argument;
|
||
|
||
/**
|
||
* 企业微信沟通群管理
|
||
*
|
||
* 交互模式:php think groupChat:manage
|
||
* 直接执行:php think groupChat:manage stat|sync|refresh|refreshOne|recycle
|
||
*
|
||
* 新增功能:在 $actions 里加一项,并实现同名方法即可
|
||
*/
|
||
class GroupChat extends Command
|
||
{
|
||
/**
|
||
* 功能菜单 功能名 => [菜单说明, 处理方法]
|
||
* @var array
|
||
*/
|
||
protected $actions = [
|
||
'stat' => ['查看群池状态', 'stat'],
|
||
'sync' => ['同步企业微信客户群,补充群池', 'syncList'],
|
||
'refresh' => ['刷新所有已分配群的二维码', 'refreshAll'],
|
||
'refreshOne' => ['刷新指定需求群的二维码', 'refreshOne'],
|
||
'recycle' => ['回收指定需求占用的群,归还群池', 'recycle'],
|
||
];
|
||
|
||
protected function configure()
|
||
{
|
||
$this->setName('groupChat:manage')
|
||
->addArgument('action', Argument::OPTIONAL, '要执行的功能:' . implode('|', array_keys($this->actions)))
|
||
->setDescription('企业微信沟通群管理:群池同步 / 二维码刷新 / 回收 / 状态查看');
|
||
}
|
||
|
||
protected function execute(Input $input, Output $output)
|
||
{
|
||
$action = trim((string)$input->getArgument('action'));
|
||
if ($action === '') {
|
||
$this->showMenu($input, $output);
|
||
return;
|
||
}
|
||
$this->dispatch($action, $input, $output);
|
||
}
|
||
|
||
/**
|
||
* 交互菜单
|
||
*/
|
||
protected function showMenu(Input $input, Output $output)
|
||
{
|
||
$choices = array_merge(array_keys($this->actions), ['exit']);
|
||
while (true) {
|
||
$output->writeln('');
|
||
$output->writeln('<info>企业微信沟通群管理</info>');
|
||
foreach ($this->actions as $key => $item) {
|
||
$output->writeln(sprintf(' %-12s%s', $key, $item[0]));
|
||
}
|
||
$output->writeln(sprintf(' %-12s%s', 'exit', '退出'));
|
||
|
||
$action = $output->choice($input, '请选择要执行的功能', $choices, 'stat');
|
||
if ($action === 'exit') {
|
||
$output->writeln('<info>已退出</info>');
|
||
return;
|
||
}
|
||
$this->dispatch($action, $input, $output);
|
||
}
|
||
}
|
||
|
||
/**
|
||
* 调度到具体处理方法
|
||
*/
|
||
protected function dispatch($action, Input $input, Output $output)
|
||
{
|
||
if (!isset($this->actions[$action])) {
|
||
$output->writeln("<error>未知功能:{$action}</error>");
|
||
$output->writeln('可用功能:' . implode('、', array_keys($this->actions)));
|
||
return;
|
||
}
|
||
$method = $this->actions[$action][1];
|
||
try {
|
||
$this->$method($input, $output);
|
||
} catch (\Exception $e) {
|
||
$output->writeln('<error>执行失败:' . $e->getMessage() . '</error>');
|
||
}
|
||
}
|
||
|
||
/**
|
||
* 查看群池状态
|
||
*/
|
||
protected function stat(Input $input, Output $output)
|
||
{
|
||
$stat = DemandGroupChatService::stat();
|
||
$output->writeln(sprintf(
|
||
'群总数:%d 空闲:%d 已分配:%d 无二维码:%d',
|
||
$stat['total'],
|
||
$stat['free'],
|
||
$stat['used'],
|
||
$stat['no_qrcode']
|
||
));
|
||
if ($stat['free'] < 3) {
|
||
$output->writeln('<comment>提示:空闲群不足 3 个,请先在企微建群,再执行 sync 补充</comment>');
|
||
}
|
||
}
|
||
|
||
/**
|
||
* 同步企业微信客户群
|
||
*/
|
||
protected function syncList(Input $input, Output $output)
|
||
{
|
||
$output->writeln('<comment>正在从企业微信拉取客户群列表...</comment>');
|
||
$num = DemandGroupChatService::syncList();
|
||
$output->writeln($num > 0
|
||
? "<info>已新入库 {$num} 个群</info>"
|
||
: '<comment>没有新的群需要入库(群主名下暂无新增客户群)</comment>');
|
||
$this->stat($input, $output);
|
||
}
|
||
|
||
/**
|
||
* 刷新所有已分配群的二维码
|
||
*/
|
||
protected function refreshAll(Input $input, Output $output)
|
||
{
|
||
$output->writeln('<comment>正在刷新已分配群的二维码...</comment>');
|
||
$res = DemandGroupChatService::refreshAll();
|
||
$output->writeln(sprintf('共 %d 个:成功 %d,失败 %d', $res['total'], $res['success'], $res['fail']));
|
||
if ($res['fail']) {
|
||
$output->writeln('<error>失败的需求ID:' . implode(', ', $res['failDemandIds']) . ',详情见日志</error>');
|
||
}
|
||
}
|
||
|
||
/**
|
||
* 刷新指定需求群的二维码
|
||
*/
|
||
protected function refreshOne(Input $input, Output $output)
|
||
{
|
||
$demandId = (int)$output->ask($input, '请输入需求ID', '');
|
||
if (!$demandId) {
|
||
$output->writeln('<error>需求ID不能为空</error>');
|
||
return;
|
||
}
|
||
if (!DemandGroupChatService::refreshByDemand($demandId)) {
|
||
$output->writeln("<error>需求 {$demandId} 没有已分配的沟通群,或刷新失败,详情见日志</error>");
|
||
return;
|
||
}
|
||
$output->writeln("<info>需求 {$demandId} 的群二维码已刷新</info>");
|
||
}
|
||
|
||
/**
|
||
* 回收指定需求占用的群
|
||
*/
|
||
protected function recycle(Input $input, Output $output)
|
||
{
|
||
$demandId = (int)$output->ask($input, '请输入要回收的需求ID', '');
|
||
if (!$demandId) {
|
||
$output->writeln('<error>需求ID不能为空</error>');
|
||
return;
|
||
}
|
||
if (!$output->confirm($input, "确认回收需求 {$demandId} 占用的沟通群?", false)) {
|
||
$output->writeln('<comment>已取消</comment>');
|
||
return;
|
||
}
|
||
if (!DemandGroupChatService::recycle($demandId)) {
|
||
$output->writeln("<error>需求 {$demandId} 没有已分配的沟通群</error>");
|
||
return;
|
||
}
|
||
$output->writeln("<info>需求 {$demandId} 的沟通群已归还群池</info>");
|
||
$this->stat($input, $output);
|
||
}
|
||
}
|