Files
cunkebao_v3/Server/application/job/WorkbenchGroupCreateAdminFriendJob.php
2025-12-10 17:58:08 +08:00

156 lines
5.4 KiB
PHP
Raw Permalink 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\job;
use app\api\controller\WebSocketController;
use think\facade\Log;
use think\facade\Env;
use think\Db;
use think\queue\Job;
use think\facade\Cache;
use think\facade\Config;
/**
* 工作台群创建-拉管理员好友任务
* Class WorkbenchGroupCreateAdminFriendJob
* @package app\job
*/
class WorkbenchGroupCreateAdminFriendJob
{
/**
* 最大重试次数
*/
const MAX_RETRY_ATTEMPTS = 3;
/**
* 成员类型常量
*/
const MEMBER_TYPE_ADMIN_FRIEND = 4;
/**
* 状态常量
*/
const STATUS_SUCCESS = 2;
const STATUS_ADMIN_FRIEND_ADDED = 4;
/**
* 队列任务处理
* @param Job $job 队列任务
* @param array $data 任务数据
* @return bool
*/
public function fire(Job $job, $data)
{
$workbenchId = $data['workbenchId'] ?? 0;
$wechatAccountId = $data['wechatAccountId'] ?? 0;
$groupId = $data['groupId'] ?? 0;
$chatroomId = $data['chatroomId'] ?? '';
$adminFriendIds = $data['adminFriendIds'] ?? [];
$poolUsers = $data['poolUsers'] ?? [];
try {
if (empty($adminFriendIds) || empty($poolUsers)) {
Log::info("管理员好友或流量池用户为空跳过。工作台ID: {$workbenchId}");
$job->delete();
return true;
}
// 获取管理员信息
$adminFriends = Db::table('s2_wechat_friend')
->where('id', 'in', $adminFriendIds)
->column('id,wechatId,ownerWechatId');
if (empty($adminFriends)) {
Log::warning("未找到管理员好友信息。工作台ID: {$workbenchId}");
$job->delete();
return true;
}
// 获取微信账号信息
$wechatAccount = Db::table('s2_wechat_account')->where('id', $wechatAccountId)->find();
if (empty($wechatAccount)) {
Log::error("未找到微信账号。微信账号ID: {$wechatAccountId}");
$job->delete();
return false;
}
// 从流量池用户中查找每个管理员的好友
// 管理员的好友从s2_wechat_friend表中查找ownerWechatId=管理员的wechatId且wechatId在流量池用户中
$allAdminFriendIds = [];
foreach ($adminFriends as $adminFriend) {
$adminWechatId = $adminFriend['wechatId'];
// 从好友表中查找该管理员的好友(在流量池用户中)
$adminFriendsList = Db::table('s2_wechat_friend')
->where('ownerWechatId', $adminWechatId)
->whereIn('wechatId', $poolUsers)
->column('id,wechatId');
if (!empty($adminFriendsList)) {
$allAdminFriendIds = array_merge($allAdminFriendIds, array_keys($adminFriendsList));
}
}
$allAdminFriendIds = array_unique($allAdminFriendIds);
if (empty($allAdminFriendIds)) {
Log::info("未找到管理员的好友跳过拉人。工作台ID: {$workbenchId}");
$job->delete();
return true;
}
// 初始化WebSocket
$toAccountId = '';
$username = Env::get('api.username2', '');
$password = Env::get('api.password2', '');
if (!empty($username) || !empty($password)) {
$toAccountId = Db::name('users')->where('account', $username)->value('s2_accountId');
}
$webSocket = new WebSocketController(['userName' => $username, 'password' => $password, 'accountId' => $toAccountId]);
// 拉管理员好友进群
$inviteResult = $webSocket->CmdChatroomInvite([
'wechatChatroomId' => $groupId,
'wechatFriendIds' => $allAdminFriendIds
]);
// 记录管理员好友进群
$installData = [];
foreach ($allAdminFriendIds as $friendId) {
$friendInfo = Db::table('s2_wechat_friend')->where('id', $friendId)->find();
$installData[] = [
'workbenchId' => $workbenchId,
'friendId' => $friendId,
'wechatId' => $friendInfo['wechatId'] ?? '',
'groupId' => $groupId,
'wechatAccountId' => $wechatAccountId,
'status' => self::STATUS_ADMIN_FRIEND_ADDED,
'memberType' => self::MEMBER_TYPE_ADMIN_FRIEND,
'retryCount' => 0,
'chatroomId' => $chatroomId,
'createTime' => time(),
];
}
if (!empty($installData)) {
Db::name('workbench_group_create_item')->insertAll($installData);
Log::info("管理员好友已拉入群。工作台ID: {$workbenchId}, 群ID: {$groupId}, 好友数: " . count($installData));
}
$job->delete();
return true;
} catch (\Exception $e) {
Log::error("拉管理员好友任务异常:{$e->getMessage()}");
if ($job->attempts() > self::MAX_RETRY_ATTEMPTS) {
$job->delete();
} else {
$job->release(Config::get('queue.failed_delay', 10));
}
return false;
}
}
}