diff --git a/Server/application/api/controller/WebSocketController.php b/Server/application/api/controller/WebSocketController.php index 191e9f50..e0662a79 100644 --- a/Server/application/api/controller/WebSocketController.php +++ b/Server/application/api/controller/WebSocketController.php @@ -200,14 +200,18 @@ class WebSocketController extends BaseController * @param array $data 消息数据 * @return array */ - protected function sendMessage($data) + protected function sendMessage($data,$receive = true) { $this->checkConnection(); try { $this->client->send(json_encode($data)); - $response = $this->client->receive(); - return json_decode($response, true); + if ($receive){ + $response = $this->client->receive(); + return json_decode($response, true); + }else{ + return ['code' => 200, 'msg' => '成功']; + } } catch (\Exception $e) { Log::error("发送消息失败:" . $e->getMessage()); $this->reconnect(); @@ -787,57 +791,6 @@ class WebSocketController extends BaseController } - /** - * 邀请好友入群 - * @param array $data 请求参数 - * @return string JSON响应 - */ - public function CmdChatroomInvite($data = []) - { - try { - // 参数验证 - if (empty($data)) { - return json_encode(['code' => 400, 'msg' => '参数缺失']); - } - - // 验证必要参数 - if (empty($data['wechatChatroomId'])) { - return json_encode(['code' => 400, 'msg' => '群ID不能为空']); - } - if (empty($data['wechatFriendId'])) { - return json_encode(['code' => 400, 'msg' => '好友ID不能为空']); - } - - if (!is_array($data['wechatFriendId'])) { - return json_encode(['code' => 400, 'msg' => '好友数据格式必须为数组']); - } - - if (empty($data['wechatAccountId'])) { - return json_encode(['code' => 400, 'msg' => '微信账号ID不能为空']); - } - - // 构建请求参数 - $params = [ - "cmdType" => "CmdChatroomInvite", - "seq" => time(), - "wechatChatroomId" => $data['wechatChatroomId'], - "wechatFriendId" => $data['wechatFriendId'], - "wechatAccountId" => $data['wechatAccountId'] - ]; - - // 记录请求日志 - Log::info('邀请好友入群请求:' . json_encode($params, 256)); - - $message = $this->sendMessage($params); - return json_encode(['code' => 200, 'msg' => '邀请成功', 'data' => $message]); - } catch (\Exception $e) { - // 记录错误日志 - Log::error('邀请好友入群异常:' . $e->getMessage()); - // 返回错误响应 - return json_encode(['code' => 500, 'msg' => '邀请好友入群异常:' . $e->getMessage()]); - } - } - /** * 添加群好友 * @param $data @@ -887,4 +840,162 @@ class WebSocketController extends BaseController return json_encode(['code' => 500, 'msg' => '添加群好友异常:' . $e->getMessage()]); } } + + /** + * 创建群聊 + * @param array $data 请求参数 + * @return string JSON响应 + */ + public function CmdChatroomCreate($data = []) + { + try { + // 参数验证 + if (empty($data)) { + return json_encode(['code' => 400, 'msg' => '参数缺失']); + } + + // 验证必要参数 + if (empty($data['chatroomName'])) { + return json_encode(['code' => 400, 'msg' => '群名称不能为空']); + } + + if (empty($data['wechatFriendIds']) || !is_array($data['wechatFriendIds'])) { + return json_encode(['code' => 400, 'msg' => '好友ID列表不能为空且必须为数组']); + } + + if (count($data['wechatFriendIds']) < 2) { + return json_encode(['code' => 400, 'msg' => '创建群聊至少需要2个好友']); + } + + if (empty($data['wechatAccountId'])) { + return json_encode(['code' => 400, 'msg' => '微信账号ID不能为空']); + } + + // 构建请求参数 + $params = [ + "cmdType" => "CmdChatroomCreate", + "seq" => time(), + "wechatAccountId" => $data['wechatAccountId'], + "chatroomName" => $data['chatroomName'], + "wechatFriendIds" => $data['wechatFriendIds'] + ]; + // 记录请求日志 + Log::info('创建群聊请求:' . json_encode($params, 256)); + + $message = $this->sendMessage($params,false); + return json_encode(['code' => 200, 'msg' => '群聊创建成功', 'data' => $message]); + } catch (\Exception $e) { + // 记录错误日志 + Log::error('创建群聊异常:' . $e->getMessage()); + // 返回错误响应 + return json_encode(['code' => 500, 'msg' => '创建群聊异常:' . $e->getMessage()]); + } + } + + + /** + * 邀请好友入群 + * @param array $data 请求参数 + * @return string JSON响应 + */ + public function CmdChatroomInvite($data = []) + { + try { + // 参数验证 + if (empty($data)) { + return json_encode(['code' => 400, 'msg' => '参数缺失']); + } + + // 验证必要参数 + if (empty($data['wechatChatroomId'])) { + return json_encode(['code' => 400, 'msg' => '群ID不能为空']); + } + if (empty($data['wechatFriendIds'])) { + return json_encode(['code' => 400, 'msg' => '好友ID不能为空']); + } + + if (!is_array($data['wechatFriendIds'])) { + return json_encode(['code' => 400, 'msg' => '好友数据格式必须为数组']); + } + + + // 构建请求参数 + $params = [ + "cmdType" => "CmdChatroomInvite", + "seq" => time(), + "wechatChatroomId" => $data['wechatChatroomId'], + "wechatFriendIds" => $data['wechatFriendIds'] + ]; + + // 记录请求日志 + Log::info('邀请好友入群请求:' . json_encode($params, 256)); + $message = $this->sendMessage($params,false); + return json_encode(['code' => 200, 'msg' => '邀请成功', 'data' => $message]); + } catch (\Exception $e) { + // 记录错误日志 + Log::error('邀请好友入群异常:' . $e->getMessage()); + // 返回错误响应 + return json_encode(['code' => 500, 'msg' => '邀请好友入群异常:' . $e->getMessage()]); + } + } + + + + /** + * 修改群信息(群昵称和群公告) + * @param array $data 请求参数 + * @return string JSON响应 + */ + public function CmdChatroomModifyInfo($data = []) + { + try { + // 参数验证 + if (empty($data)) { + return json_encode(['code' => 400, 'msg' => '参数缺失']); + } + + // 验证必要参数 + if (empty($data['wechatChatroomId'])) { + return json_encode(['code' => 400, 'msg' => '群ID不能为空']); + } + + if (empty($data['wechatAccountId'])) { + return json_encode(['code' => 400, 'msg' => '微信账号ID不能为空']); + } + + // 检查是否至少提供了一个修改项 + if (empty($data['chatroomName']) && !isset($data['announce'])) { + return json_encode(['code' => 400, 'msg' => '请至少提供群昵称或群公告中的一个参数']); + } + + + if (!empty($data['chatroomName'])) { + $extra = [ + "chatroomName" => $data['chatroomName'] + ]; + } else { + $extra = [ + "announce" => $data['announce'] + ]; + } + + $params = [ + "chatroomOperateType" => !empty($data['chatroomName']) ? 6 : 5, + "cmdType" => "CmdChatroomOperate", + "extra" => json_encode($extra,256), + "seq" => time(), + "wechatAccountId" => $data['wechatAccountId'], + "wechatChatroomId" => $data['wechatChatroomId'] + ]; + // 记录请求日志 + Log::info('创建群聊请求:' . json_encode($params, 256)); + $message = $this->sendMessage($params,false); + return json_encode(['code' => 200, 'msg' => '群聊创建成功', 'data' => $message]); + } catch (\Exception $e) { + Log::error('修改群信息异常: ' . $e->getMessage()); + return json_encode(['code' => 500, 'msg' => '修改群信息失败: ' . $e->getMessage()]); + } + } + + } \ No newline at end of file diff --git a/Server/application/api/controller/WechatChatroomController.php b/Server/application/api/controller/WechatChatroomController.php index 1fb4938d..744ad822 100644 --- a/Server/application/api/controller/WechatChatroomController.php +++ b/Server/application/api/controller/WechatChatroomController.php @@ -13,16 +13,12 @@ class WechatChatroomController extends BaseController * 获取微信群聊列表 * @return \think\response\Json */ - public function getlist($pageIndex = '',$pageSize = '',$isInner = false, $isDel = '') + public function getlist($data = [],$isInner = false, $isDel = '') { // 获取授权token - $authorization = trim($this->request->header('authorization', $this->authorization)); + $authorization = $this->authorization; if (empty($authorization)) { - if($isInner){ return json_encode(['code'=>500,'msg'=>'缺少授权信息']); - }else{ - return errorJson('缺少授权信息'); - } } try { @@ -36,15 +32,15 @@ class WechatChatroomController extends BaseController // 构建请求参数 $params = [ - 'keyword' => $this->request->param('keyword', ''), - 'wechatAccountKeyword' => $this->request->param('wechatAccountKeyword', ''), - 'isDeleted' => $this->request->param('isDeleted', $isDeleted), - 'allotAccountId' => $this->request->param('allotAccountId', ''), - 'groupId' => $this->request->param('groupId', ''), - 'wechatChatroomId' => $this->request->param('wechatChatroomId', 0), - 'memberKeyword' => $this->request->param('memberKeyword', ''), - 'pageIndex' => !empty($pageIndex) ? $pageIndex : input('pageIndex', 0), - 'pageSize' => !empty($pageSize) ? $pageSize : input('pageSize', 20) + 'keyword' => $data['keyword'] ?? '', + 'wechatAccountKeyword' => $data['wechatAccountKeyword'] ?? '', + 'isDeleted' => $data['isDeleted'] ?? $isDeleted , + 'allotAccountId' => $data['allotAccountId'] ?? '', + 'groupId' => $data['groupId'] ?? '', + 'wechatChatroomId' => $data['wechatChatroomId'] ?? '', + 'memberKeyword' => $data['memberKeyword'] ?? '', + 'pageIndex' => $data['pageIndex'] ?? 1, + 'pageSize' => $data['pageSize'] ?? 20 ]; // 设置请求头 diff --git a/Server/application/command.php b/Server/application/command.php index a1319c07..cc0dbacf 100644 --- a/Server/application/command.php +++ b/Server/application/command.php @@ -27,12 +27,14 @@ return [ 'allotrule:autocreate' => 'app\command\AutoCreateAllotRulesCommand', // 自动创建分配规则 √ 'content:collect' => 'app\command\ContentCollectCommand', // 内容采集任务 √ 'moments:collect' => 'app\command\WechatMomentsCommand', // 朋友圈采集任务 - 'workbench:autoLike' => 'app\command\WorkbenchAutoLikeCommand', // 工作台自动点赞任务 - 'workbench:moments' => 'app\command\WorkbenchMomentsCommand', // 工作台朋友圈同步任务 - 'sync:wechatData' => 'app\command\SyncWechatDataToCkbTask', // 同步微信数据到存客宝 - 'sync:allFriends' => 'app\command\SyncAllFriendsCommand', // 同步所有在线好友 - 'workbench:trafficDistribute' => 'app\command\WorkbenchTrafficDistributeCommand', // 工作台流量分发任务 - 'workbench:groupPush' => 'app\command\WorkbenchGroupPushCommand', // 工作台群组同步任务 'switch:friends' => 'app\command\SwitchFriendsCommand', 'call-recording:list' => 'app\command\CallRecordingListCommand', // 通话记录列表 √ + 'sync:wechatData' => 'app\command\SyncWechatDataToCkbTask', // 同步微信数据到存客宝 + 'sync:allFriends' => 'app\command\SyncAllFriendsCommand', // 同步所有在线好友 + + 'workbench:autoLike' => 'app\command\WorkbenchAutoLikeCommand', // 工作台自动点赞任务 + 'workbench:moments' => 'app\command\WorkbenchMomentsCommand', // 工作台朋友圈同步任务 + 'workbench:trafficDistribute' => 'app\command\WorkbenchTrafficDistributeCommand', // 工作台流量分发任务 + 'workbench:groupPush' => 'app\command\WorkbenchGroupPushCommand', // 工作台群推送任务 + 'workbench:groupCreate' => 'app\command\WorkbenchGroupCreateCommand', // 工作台群创建任务 ]; diff --git a/Server/application/command/WorkbenchGroupCreateCommand.php b/Server/application/command/WorkbenchGroupCreateCommand.php new file mode 100644 index 00000000..daa70309 --- /dev/null +++ b/Server/application/command/WorkbenchGroupCreateCommand.php @@ -0,0 +1,76 @@ +setName('workbench:groupCreate') + ->setDescription('工作台群创建同步任务队列') + ->addOption('jobId', null, Option::VALUE_OPTIONAL, '任务ID,用于区分不同实例', date('YmdHis') . rand(1000, 9999)); + } + + protected function execute(Input $input, Output $output) + { + $output->writeln('开始处理工作台群创建同步任务...'); + + try { + // 获取任务ID + $jobId = $input->getOption('jobId'); + + $output->writeln('任务ID: ' . $jobId); + + // 检查队列是否已经在运行 + $queueLockKey = "queue_lock:{$this->queueName}"; + Cache::rm($queueLockKey); + if (Cache::get($queueLockKey)) { + $output->writeln("队列 {$this->queueName} 已经在运行中,跳过执行"); + Log::warning("队列 {$this->queueName} 已经在运行中,跳过执行"); + return false; + } + + // 设置队列运行锁,有效期1小时 + Cache::set($queueLockKey, $jobId, 3600); + $output->writeln("已设置队列运行锁,键名:{$queueLockKey},值:{$jobId},有效期:1小时"); + + // 将任务添加到队列 + $this->addToQueue($jobId, $queueLockKey); + + $output->writeln('工作台群发同步任务已添加到队列'); + } catch (\Exception $e) { + Log::error('工作台群发同步任务添加失败:' . $e->getMessage()); + $output->writeln('工作台群发同步任务添加失败:' . $e->getMessage()); + return false; + } + + return true; + } + + /** + * 添加任务到队列 + * @param string $jobId 任务ID + * @param string $queueLockKey 队列锁键名 + */ + public function addToQueue($jobId = '', $queueLockKey = '') + { + $data = [ + 'jobId' => $jobId, + 'queueLockKey' => $queueLockKey + ]; + + // 添加到队列,设置任务名为 workbench_groupCreate + Queue::push(WorkbenchGroupCreateJob::class, $data, $this->queueName); + } +} \ No newline at end of file diff --git a/Server/application/cunkebao/controller/WorkbenchController.php b/Server/application/cunkebao/controller/WorkbenchController.php index 4a699e02..735624b7 100644 --- a/Server/application/cunkebao/controller/WorkbenchController.php +++ b/Server/application/cunkebao/controller/WorkbenchController.php @@ -248,7 +248,7 @@ class WorkbenchController extends Controller if (!empty($item->momentsSync)) { $item->config = $item->momentsSync; $item->config->devices = json_decode($item->config->devices, true); - $item->config->contentLibraries = json_decode($item->config->contentLibraries, true); + $item->config->contentGroups = json_decode($item->config->contentLibraries, true); //同步记录 $sendNum = Db::name('workbench_moments_sync_item')->where(['workbenchId' => $item->id])->count(); $item->syncCount = $sendNum; @@ -257,15 +257,14 @@ class WorkbenchController extends Controller // 获取内容库名称 - if (!empty($item->config->contentLibraries)) { - $libraryNames = ContentLibrary::whereIn('id', $item->config->contentLibraries) - ->column('name'); - $item->config->contentLibraryNames = $libraryNames; + if (!empty($item->config->contentGroups)) { + $libraryNames = ContentLibrary::where('id', 'in', $item->config->contentGroups)->select(); + $item->config->contentGroupsOptions = $libraryNames; } else { - $item->config->contentLibraryNames = []; + $item->config->contentGroupsOptions = []; } } - unset($item->momentsSync, $item->moments_sync); + unset($item->momentsSync, $item->moments_sync,$item->config->contentLibraries); break; case self::TYPE_GROUP_PUSH: if (!empty($item->groupPush)) { diff --git a/Server/application/job/WorkbenchGroupCreateJob.php b/Server/application/job/WorkbenchGroupCreateJob.php new file mode 100644 index 00000000..da212d25 --- /dev/null +++ b/Server/application/job/WorkbenchGroupCreateJob.php @@ -0,0 +1,304 @@ +logJobStart($jobId, $queueLockKey); + $this->execute(); + $this->handleJobSuccess($job, $queueLockKey); + return true; + } catch (\Exception $e) { + return $this->handleJobError($e, $job, $queueLockKey); + } + } + + /** + * 执行任务 + * @throws \Exception + */ + public function execute() + { + try { + // 获取所有工作台 + $workbenches = Workbench::where(['status' => 1, 'type' => 4, 'isDel' => 0])->order('id desc')->select(); + foreach ($workbenches as $workbench) { + // 获取工作台配置 + $config = WorkbenchGroupCreate::where('workbenchId', $workbench->id)->find(); + if (!$config) { + continue; + } + $config['poolGroups'] = json_decode($config['poolGroups'], true); + $config['devices'] = json_decode($config['devices'], true); + if (empty($config['poolGroups']) || empty($config['devices'])) { + continue; + } + //群主及内部成员 + $groupMember = Db::name('device_wechat_login')->alias('dwl') + ->join(['s2_wechat_account' => 'a'], 'dwl.wechatId = a.wechatId') + ->whereIn('dwl.deviceId', $config['devices']) + ->group('a.id') + ->column('a.wechatId'); + if (empty($groupMember)) { + continue; + } + $groupMemberWechatId = Db::table('s2_wechat_friend') + ->where('ownerWechatId', $groupMember[0]) + ->whereIn('wechatId', $groupMember) + ->column('id,wechatId'); + if (empty($groupMemberWechatId)) { + continue; + } + $groupMemberId = array_keys($groupMemberWechatId); + + + //流量池用户 + $poolItem = Db::name('traffic_source_package_item') + ->whereIn('packageId', $config['poolGroups']) + ->group('identifier') + ->column('identifier'); + + if (empty($poolItem)) { + continue; + } + + //群用户 + $groupUser = Db::name('workbench_group_create_item') + ->where('workbenchId', $workbench->id) + ->whereIn('wechatId', $poolItem) + ->group('wechatId') + ->column('wechatId'); + + //待入群的用户 + $joinUser = array_diff($poolItem, $groupUser); + if (empty($joinUser)) { + continue; + } + + + //随机群人数 + $groupRandNum = mt_rand($config['groupSizeMin'], $config['groupSizeMax']) - count($groupMember); + + //待加入用户 + $addGroupUser = []; + $totalRows = count($joinUser); + for ($i = 0; $i < $totalRows; $i += $groupRandNum) { + $batchRows = array_slice($joinUser, $i, $groupRandNum); + if (!empty($batchRows)) { + $user = []; + foreach ($batchRows as $row) { + $user[] = $row; + } + $addGroupUser[] = $user; + } + } + + + foreach ($addGroupUser as $key => $val) { + //判断第一组用户是否满足创建群的条件 + $friendIds = Db::name('wechat_friendship')->alias('f') + ->join(['s2_wechat_account' => 'a'], 'f.ownerWechatId=a.wechatId') + ->where('f.companyId', $workbench->companyId) + ->whereIn('f.wechatId', $val) + ->group('f.wechatId') + ->column('f.id,f.wechatId,a.id as wechatAccountId'); + // 整理数组:按wechatAccountId分组,值为对应的id数组 + $groupedFriends = []; + $wechatAccountIds = []; + $wechatIds = []; + foreach ($friendIds as $friend) { + $wechatAccountId = $friend['wechatAccountId']; + if (!in_array($wechatAccountId, $wechatAccountIds)) { + $wechatAccountIds[] = $wechatAccountId; + } + $friendId = $friend['id']; + if (!isset($groupedFriends[$wechatAccountId])) { + $groupedFriends[$wechatAccountId] = []; + } + $groupedFriends[$wechatAccountId][] = $friendId; + $wechatIds[$friendId] = $friend['wechatId']; + } + //==================== 群相关功能开始 =========================== + $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]); + //拉人进群 $webSocket->CmdChatroomInvite(['wechatChatroomId' => 830794, 'wechatFriendIds' => [21168549]]); + //修改群名称 $webSocket->CmdChatroomModifyInfo(['wechatChatroomId' => 830794, 'wechatAccountId' => 300745,'chatroomName' => 'test111']); + //修改群公告 $webSocket->CmdChatroomModifyInfo(['wechatChatroomId' => 830794, 'wechatAccountId' => 300745,'announce' => 'test111']); + //建群 $webSocket->CmdChatroomCreate(['chatroomName' => '聊天测试群', 'wechatFriendIds' => [17453051,17453058],'wechatAccountId' => 300745]); + + + foreach ($groupedFriends as $wechatAccountId => $friendId) { + //列出所有群 + $group = ''; + $groupMemberNum = 0; + $groupIds = Db::name('workbench_group_create_item')->where(['workbenchId' => $workbench->id])->group('groupId')->column('groupId'); + if (!empty($groupIds)) { + //最新创建的群 + $group = Db::name('wechat_group')->where(['wechatAccountId' => $wechatAccountId])->whereIn('id', $groupIds)->order('createTime DESC')->find(); + //群用户数量 + if (!empty($group)) { + $groupMemberNum = Db::name('wechat_group_member')->where('groupId', $group['id'])->count(); + } + } + + exit_data($group); + + + //拉群或者建群 + $wechatFriendIds = array_merge($friendId, $groupMemberId); + if ($groupMemberNum == 0 || (count($wechatFriendIds) + $groupMemberNum) >= $groupRandNum) { + if (count($groupIds) > 0) { + $chatroomName = $config['groupNameTemplate'] . count($groupIds) + 1 . '群'; + } else { + $chatroomName = $config['groupNameTemplate']; + } + $webSocket->CmdChatroomCreate(['chatroomName' => $chatroomName, 'wechatFriendIds' => $wechatFriendIds,'wechatAccountId' => $wechatAccountId]); + } else { + $webSocket->CmdChatroomInvite(['wechatChatroomId' => $group['id'], 'wechatFriendIds' => $wechatFriendIds]); + } + + $installData = []; + + //记录进群人员 + foreach ($wechatFriendIds as $v) { + $installData[] = [ + 'workbenchId' => $workbench->id, + 'friendId' => $v, + 'wechatId' => !empty($wechatIds[$v]) ? $wechatIds[$v] : $groupMemberWechatId[$v], + 'groupId' => $group['id'], + 'wechatAccountId' => $wechatAccountId, + 'createTime' => time(), + ]; + } + Db::name('workbench_group_create_item')->insertAll($installData); + } + } + } + } catch (\Exception $e) { + Log::error("消息群发任务异常: " . $e->getMessage()); + throw $e; + } + } + + + /** + * 获取设备列表 + * @param Workbench $workbench 工作台 + * @param WorkbenchGroupPush $config 配置 + * @return array|bool + */ + protected function isCreate($workbench, $config, $groupIds = []) + { + // 检查发送间隔(新逻辑:根据startTime、endTime、maxPerDay动态计算) + $today = date('Y-m-d'); + $startTimestamp = strtotime($today . ' ' . $config['startTime'] . ':00'); + $endTimestamp = strtotime($today . ' ' . $config['endTime'] . ':00'); + + // 如果时间不符,则跳过 + if ($startTimestamp > time() || $endTimestamp < time() || empty($groupIds)) { + return false; + } + + // 查询今日建群数量 + $count = Db::name('wechat_group') + ->whereIn('id', $groupIds) + ->whereTime('createTime', 'between', [$startTimestamp, $endTimestamp]) + ->count(); + if ($count >= $config['maxGroupsPerDay']) { + return false; + } + return true; + } + + + /** + * 记录任务开始 + * @param string $jobId + * @param string $queueLockKey + */ + protected function logJobStart($jobId, $queueLockKey) + { + Log::info('开始处理工作台消息群发任务: ' . json_encode([ + 'jobId' => $jobId, + 'queueLockKey' => $queueLockKey + ])); + } + + /** + * 处理任务成功 + * @param Job $job + * @param string $queueLockKey + */ + protected function handleJobSuccess($job, $queueLockKey) + { + $job->delete(); + Cache::rm($queueLockKey); + Log::info('工作台消息群发任务执行成功'); + } + + /** + * 处理任务错误 + * @param \Exception $e + * @param Job $job + * @param string $queueLockKey + * @return bool + */ + protected function handleJobError(\Exception $e, $job, $queueLockKey) + { + Log::error('工作台消息群发任务异常:' . $e->getMessage()); + + if (!empty($queueLockKey)) { + Cache::rm($queueLockKey); + Log::info("由于异常释放队列锁: {$queueLockKey}"); + } + + if ($job->attempts() > self::MAX_RETRY_ATTEMPTS) { + $job->delete(); + } else { + $job->release(Config::get('queue.failed_delay', 10)); + } + + return false; + } +} \ No newline at end of file