Files
code-bang/backend/application/common/command/GroupChat.php
T
2026-09-29 16:24:19 +08:00

174 lines
6.0 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<?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);
}
}