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);
|
|||
|
|
}
|
|||
|
|
}
|