array_merge(['rule_id' => $ruleId], $params), 'err_code' => $attachmentsVerifyCode, 'err_msg' => '设置客户群群发规则时验证附件信息失败', ], 'interface'); return $attachmentsVerifyCode; } if($ruleId){ // 编辑群发规则 # 判断是否为未发送状态 $ruleInfo = ChatGroupMassMsg::query() ->where('id', $ruleId) ->first(); if(!isset($ruleInfo->enable) || !in_array($ruleInfo->enable, [-1, 1])) { Log::logError('ChatGroupMassMsgRuleService.setChatGroupMassMsg', [ 'params' => array_merge(['rule_id' => $ruleId], $params), 'err_code' => $attachmentsVerifyCode, 'err_msg' => '此状态客户群群发规则暂不支持编辑操作', ], 'interface'); return 2102; } $result = ChatGroupMassMsg::query() ->where('id', $ruleId) ->update($params); } else { # 设置新群发规则 $massMsgModel = new ChatGroupMassMsg(); $massMsgModel->admin_id = $params['admin_id']; $massMsgModel->corpid = $params['corpid']; $massMsgModel->name = $params['name']; $massMsgModel->send_type = $params['send_type']; $massMsgModel->send_time = $params['send_time']; $massMsgModel->senders = $params['senders']; $massMsgModel->content = $params['content']; $massMsgModel->attachments = $params['attachments']; $result = $massMsgModel->save(); $ruleId = isset($massMsgModel->id) ? $massMsgModel->id : ''; } if(!$result) { Log::logError('ChatGroupMassMsgRuleService.setChatGroupMassMsg', [ 'params' => array_merge(['rule_id' => $ruleId], $params), 'err_code' => $attachmentsVerifyCode, 'err_msg' => '客户群群发规则设置失败,请重试', ], 'interface'); return 2103; } } catch (\Exception $e) { Log::logError('ChatGroupMassMsgRuleService.setChatGroupMassMsg', [ 'file' => $e->getFile(), 'line' => $e->getLine(), 'msg' => $e->getMessage(), 'params' => array_merge(['rule_id' => $ruleId], $params), 'trace' => $e->getTraceAsString(), ], 'interface'); EmailQueue::rPush('设置客户群群发规则异常', json_encode([ 'file' => $e->getFile(), 'line' => $e->getLine(), 'msg' => $e->getMessage(), 'params' => array_merge(['rule_id' => $ruleId], $params), 'trace' => $e->getTraceAsString(), ]), ['song.shen@kuxuan-inc.com'], '设置客户群群发规则异常'); return 2101; } return 0; } /** * 更新群发规则状态 * @param $ruleId integer 群发规则ID * @param $status integer 群发规则待更新到的状态值 状态 -2:已删除 -1:发送失败 1:待发送 2:正在发送中 3:待客服确认 4:发送完成 * @return int * */ public static function updateStatus($ruleId, $status) { # 修改群发规则状态为已发送 $updateStatus = ChatGroupMassMsg::updateRuleStatus($ruleId, $status); if(!$updateStatus) { Log::logError('ChatGroupMassMsgRuleService.updateStatus', [ 'err_msg' => '客户群群发规则状态更新失败', 'rule_id' => $ruleId, 'status' => $status ], 'interface'); } return $updateStatus; } /** * 获取群发列表 * @param $corpid string 企业ID * @param $creatorId integer 创建人ID集合 * @param $sendTimeStart string 发送时间查询-起始时间 * @param $sendTimeEnd string 发送时间查询-结束时间 * @param $createTimeStart string 创建时间查询-结束时间 * @param $createTimeEnd string 创建时间查询-结束时间 * @param $sortColumn string 排序字段 * @param $sortMethod string 排序方式* * @param $page integer 当前页码数 * @param $pageSize integer 每页显示条数 * @param $errno int 错误码 * @param $ruleName string 群发标题 * @return mixed * */ public static function ruleList( $corpid, $creatorId, $sendTimeStart, $sendTimeEnd, $createTimeStart, $createTimeEnd, $sortColumn, $sortMethod, $page, $pageSize, &$errno, $ruleName ) { try{ list($list, $count) = ChatGroupMassMsg::getRuleLists($corpid, $creatorId, $sendTimeStart, $sendTimeEnd, $createTimeStart, $createTimeEnd, $sortColumn, $sortMethod, $page, $pageSize, $ruleName); # 获取创建人信息 $adminIds = $list->pluck('admin_id'); $adminData = Users::select(['id','name'])->whereIn('id', $adminIds)->get(); # 按规则统计客户群群发的发送情况 $ruleIds = $list->pluck('rule_id'); # 群主统计 $senderData = ChatGroupMassMsgRecord::selectRaw('rule_id, count(CASE WHEN status=2 THEN 1 END) AS send_user_success, count(CASE WHEN status !=2 THEN 1 END) AS send_user_fail') ->whereIn('rule_id', $ruleIds)->groupBy(['rule_id'])->get(); # 发送群聊统计 // $chatGroupData = ChatGroupMassMsgLog::selectRaw('rule_id, count(CASE WHEN status=1 THEN 1 END) AS send_chat_success, count(CASE WHEN status !=1 THEN 1 END) AS send_chat_fail') // ->whereIn('rule_id', $ruleIds)->groupBy(['rule_id'])->get(); $chatGroupData = ChatGroupMassMsgLogEs::getChatGroupData($ruleIds); $errStatData = ChatGroupMassMsgRecord::query()->select(['errcode', 'rule_id', 'sender', 'corpid']) ->whereIn('rule_id', $ruleIds)->where('errcode', '!=', 0)->get(); $senderIdList = []; foreach ($errStatData as $item) { $senderIdList[] = '("'.$item['corpid'].'","'.$item['sender'].'")'; } if(!empty($senderIdList)) { $senderInfoList = DjUser::query()->whereRaw('(corpid, user_id) in ('. implode(',', $senderIdList).')') ->where('enable', 1)->get(); } else { $senderInfoList = DjUser::query()->where('enable', 1)->get(); } $corpInfoList = AuthorizeCorp::query()->get(); $errcodeConf = config('qyWechat.errcode'); # 处理数据 foreach($list as $datum) { # 创建人信息 $adminInfo = $adminData->where('id', $datum->admin_id)->first(); $datum->creator = isset($adminInfo->name) ? $adminInfo->name : ''; // if(1 == $datum->send_mode) { $senderStatInfo = $senderData->where('rule_id', $datum->rule_id)->first(); $datum->send_user_success = $senderStatInfo->send_user_success ?? 0; $datum->send_user_fail = $senderStatInfo->send_user_fail ?? 0; // $chatStatInfo = $chatGroupData->where('rule_id', $datum->rule_id)->first(); $chatStatInfo = $chatGroupData[$datum->rule_id] ?? []; $datum->send_chat_success = $chatStatInfo['send_chat_success'] ?? 0; $datum->send_chat_fail = $chatStatInfo['send_chat_fail'] ?? 0; // } else { // $sendStatInfo = ChatGroupMassMsgService::getRuleSendResult($datum); // $datum->send_user_success = $sendStatInfo['send_user_success']; // $datum->send_user_fail = $sendStatInfo['send_user_fail']; // $datum->send_chat_success = $sendStatInfo['send_chat_success']; // $datum->send_chat_fail = $sendStatInfo['send_chat_fail']; // } # 查询失败信息 $errList = $errStatData->where('rule_id', $datum->rule_id)->all(); $err_msg_list = []; if(!empty($errList)){ foreach ($errList as $item) {// 无可发送的客户 $err_msg = $errcodeConf[$item['errcode']] ?? null; if(60111 == $item['errcode']) {//UserID不存在 // 当出现此种错误时,将客服名称一并拼接起来展示 $senderName = $senderInfoList->where('corpid', $item['corpid']) ->where('user_id', $item['sender'])->first(); $senderName = $senderName->name ?? ''; if(1 == $datum->operate_type) { $err_msg = $senderName.$err_msg; } else { $corpName = $corpInfoList->where('corpid', $item['corpid'])->first(); $corpName = $corpName->corp_name ?? ''; $err_msg = $corpName.$senderName.$err_msg; } } $err_msg = $datum->enable != -1 ? '部分失败由于'.$err_msg : $err_msg; if(!empty($err_msg) && !in_array($err_msg, $err_msg_list)) { $err_msg_list[] = $err_msg; } } } $datum->err_msg = $err_msg_list; unset($datum->admin_id); } } catch (\Exception $exception){ Log::logError('ChatGroupMassMsgRuleService.ruleList', [ 'params' => [ 'corpid' => $corpid, 'creator_id' => $creatorId, 'send_time_start' => $sendTimeStart, 'send_time_end' => $sendTimeEnd, 'create_time_start' => $createTimeStart, 'create_time_end' => $createTimeEnd, 'sort_column' => $sortColumn, 'sort_method' => $sortMethod, 'page' => $page, 'page_size' => $pageSize, 'errno' => $errno ], 'err_msg' => '客户群群发规则列表响应异常', 'line' => $exception->getLine(), 'message' => $exception->getMessage(), ], 'interface'); EmailQueue::rPush('客户群群发规则列表响应异常', json_encode([ 'message' => $exception->getMessage(), ]), ['song.shen@kuxuan-inc.com', 'xiaohua.hou@kuxuan-inc.com'], '客户群群发规则列表响应异常'); $errno = 2105; return [[], 0]; } return [$list, $count]; } public static function getRuleSendResult($datum) { $data = [ 'send_chat_total'=>0, 'send_chat_success' =>0, 'send_chat_fail' => 0, 'send_user_total' => 0, 'send_user_success' => 0, 'send_user_fail' => 0, ]; $senders = []; $recordList = ChatGroupMassMsgRecord::where('rule_id', $datum->rule_id)->get(); foreach($recordList as $record) { $data['send_user_total']++; if(2 == $record->status) { $data['send_user_success']++; } else { $data['send_user_fail']++; } $senders[] = $record->sender; } $corpidList = explode(',', $datum->corpid); $sendChatCount = ChatGroup::whereIn('corpid', $corpidList) ->whereIn('owner', $senders)->where('status', 1) ->count(); $data['send_chat_total'] = $sendChatCount; // $sendChatSuccess = ChatGroupMassMsgLog::where('rule_id', $datum->rule_id) // ->where('status', 1)->count(); $sendChatSuccess = ChatGroupMassMsgLogEs::getSendChatCount($datum->rule_id, 1); $data['send_chat_success'] = $sendChatSuccess; $data['send_chat_fail'] = $data['send_chat_total'] - $data['send_chat_success']; return $data; } /** * 客户群群发规则详情 */ public static function ruleDetail($corpid, $ruleId, &$errno) { $requestData = [ 'corpid' => $corpid, 'rule_id' => $ruleId, 'errno' => $errno ]; try{ $detail = ChatGroupMassMsg::selectRaw('id as rule_id, admin_id, corpid, name, send_type, send_time, senders, content, attachments, enable, send_mode, item_id, chat_groups, operate_type') ->whereRaw('FIND_IN_SET("'.$corpid.'", `corpid`)') ->where('id', $ruleId) ->first(); if(empty($detail)) { Log::logError('ChatGroupMassMsgRuleService.ruleDetail', [ 'err_msg' => '获取客户群群发规则基础信息失败', 'params' => $requestData, ], 'interface'); return []; } # 获取创建人信息 $detail->creator = Users::where('id', $detail->admin_id)->value('name'); $attachments = json_decode($detail->attachments, true); if(!empty($attachments)) { foreach ($attachments as $key=>&$attachment) { if(isset($attachment['msgtype']) && $attachment['msgtype'] == 'radar') { // 雷达附件信息回显 $radarId = $attachment['radar']['radar_id'] ?? 0; $radarInfo = RadarService::getRadarContent($corpid, $radarId); if(empty($radarInfo)) { unset($attachment[$key]); continue; } $attachment['radar'] = $radarInfo; } } } if($detail->enable == 4) { # 消息条数 $contentCount = empty($detail->content) ? 0 : 1; $attachmentCount = empty($detail->attachments) ? 0 : count($attachments); $detail->msg_count = $contentCount + $attachmentCount; $detail->attachments = json_encode($attachments, 256); if(1 == $detail->send_mode) { // 按群主 # 统计发送情况 $sendStatInfo = ChatGroupMassMsgRuleService::getRuleSendResult($detail); } else { $sendStatInfo = ChatGroupMassMsgService::getRuleSendResult($detail); } $chatList = self::getChatList($detail, $ruleId); $detail->send_user_success = $sendStatInfo['send_user_success']; $detail->send_user_fail = $sendStatInfo['send_user_fail']; $detail->send_chat_success = $sendStatInfo['send_chat_success']; $detail->send_chat_fail = $sendStatInfo['send_chat_fail']; # 群发对象 $detail->chat_name = $chatList->pluck('name')->toArray(); $detail->chat_count = $chatList->count(); } } catch (\Exception $exception) { Log::logError('ChatGroupMassMsgRuleService.ruleDetail', [ 'params' => $requestData, 'err_msg' => '客户群群发规则详情响应异常', 'file' => $exception->getFile(), 'line' => $exception->getLine(), 'message' => $exception->getMessage(), 'trace' => $exception->getTraceAsString() ], 'interface'); EmailQueue::rPush('客户群群发规则详情响应异常', json_encode([ 'params' => $requestData, 'file' => $exception->getFile(), 'line' => $exception->getLine(), 'message' => $exception->getMessage(), 'trace' => $exception->getTraceAsString() ]), ['song.shen@kuxuan-inc.com', 'xiaohua.hou@kuxuan-inc.com'], '客户群群发规则详情响应异常'); $errno = 2104; return []; } return $detail; } /** * 客户群群发规则详情 * */ public static function ruleDetailNew($corpid, $ruleId, &$errno) { try { # 获取规则详情 $detail = ChatGroupMassMsg::selectRaw('id as rule_id, admin_id, corpid, name, send_type, send_time, senders, content, attachments, enable, send_mode, item_id, chat_groups, operate_type') ->whereRaw('FIND_IN_SET("'.$corpid.'", `corpid`)') ->where('id', $ruleId) ->first(); if(empty($detail)) { $errno = 2106; return []; } # 处理附件中的雷达信息 $attachments = json_decode($detail->attachments, true); if(!empty($attachments)) { foreach ($attachments as $key=>&$attachment) { if(isset($attachment['msgtype']) && $attachment['msgtype'] == 'radar') { // 雷达附件信息回显 $radarId = $attachment['radar']['radar_id'] ?? 0; $radarInfo = RadarService::getRadarContent($corpid, $radarId); if(empty($radarInfo)) { unset($attachment[$key]); continue; } $attachment['radar'] = $radarInfo; } } } # 处理群主信息 $senderData = null; if($detail->operate_type == 1) { // 单企微 # 获取企微名称 $corpName = AuthorizeCorp::where('corpid', $detail->corpid)->value('corp_name'); if(!empty($detail->senders)) { $senderIdList = explode(',', $detail->senders); } else { $senderIdList = null; } $senderList = DjUser::where('corpid', $detail->corpid)->where(function($query) use($senderIdList) { if(!empty($senderIdList)) { $query->whereIn('user_id', $senderIdList); } else { $query->where('status', 1)->where('enable', 1); } })->pluck('name'); $senderData[] = [ 'corp_name' => $corpName, 'sender_list' => $senderList ]; } else { // 多企微 $senders = json_decode($detail->senders, true); $corpidList = array_column($senders, 'corpid'); $corpList = AuthorizeCorp::select('corpid', 'corp_name')->whereIn('corpid', $corpidList)->get(); foreach ($senders as $item) { $corpInfo = $corpList->where('corpid', $item['corpid'])->first(); $corpName = $corpInfo->corp_name ?? ''; $senderIdList = explode(',', $item['sender_list']); $senderList = DjUser::where('corpid', $item['corpid'])->where(function($query) use($senderIdList) { if(!empty($senderIdList)) $query->whereIn('user_id', $senderIdList); })->pluck('name'); $senderData[] = [ 'corp_name' => $corpName, 'sender_list' => $senderList ]; } } $detail->sender_data = $senderData; if(in_array($detail->enable, [2,3,4])) { # 统计发送群聊数据 // $sendStat = ChatGroupMassMsgLog::selectRaw("count(CASE WHEN status IN (0,2,3) THEN 1 END) as send_fail, count(CASE WHEN status = 1 THEN 1 END) AS send_success, sum(member_count) as member_count") // ->where('rule_id', $ruleId) // ->first(); // // $detail->send_chat_success = $sendStat->send_success ?? 0; // $detail->send_chat_fail = $sendStat->send_fail ?? 0; // $detail->member_count = $sendStat->member_count ?? 0; $sendStat = ChatGroupMassMsgLogEs::getServiceData([$ruleId]); $detail->send_chat_success = $sendStat['send_chat_success'] ?? 0; $detail->send_chat_fail = $sendStat['send_chat_fail'] ?? 0; $detail->success_member_count = $sendStat['success_member_count'] ?? 0; $detail->fail_member_count = $sendStat['fail_member_count'] ?? 0; # 统计发送群主数据 $senderStat = ChatGroupMassMsgRecord::selectRaw("count(CASE WHEN status IN (1,3) THEN 1 END) as wait_send, count(CASE WHEN status = 2 THEN 1 END) AS send_success, count(CASE WHEN status=-1 THEN 1 END) as send_fail") ->where('rule_id', $ruleId) ->first(); $detail->send_user_success = $senderStat->send_success ?? 0; $detail->wait_send_user = $senderStat->wait_send ?? 0; $detail->send_user_fail = $senderStat->send_fail ?? 0; } } catch (\Exception $e) { Log::logError('客户群群发规则详情响应异常', [ 'corpid' => $corpid, 'rule_id' => $ruleId, 'line' => $e->getLine(), 'msg' => $e->getMessage(), ], 'ChatGroupRuleDetail'); EmailQueue::rPush('客户群群发规则详情响应异常', $e->getTraceAsString(), ['xiaohua.hou@kuxuan-inc.com'], '猎羽'); $errno = 2104; return []; } return $detail; } public static function getChatList($detail, $ruleId) { if(1 == $detail->send_mode) { // 发送记录列表 $sendUserList = ChatGroupMassMsgRecord::query() ->where('rule_id', $ruleId) ->get(); if($sendUserList->isNotEmpty()) { $sendUserSuccess = $sendUserFail = 0; $senders = []; foreach($sendUserList as $item) { if(2 == $item->status) { $sendUserSuccess++; } else { $sendUserFail++; } $senders[] = $item->sender; } } else { if(empty($detail->senders)) { $senders = ChatGroup::query() ->where('corpid', $detail->corpid) ->where('status', 1) ->pluck('owner') ->toArray(); $senders = empty($senders) ? [] : array_unique($senders); } else { $senders = explode(',', $detail->senders); } } // 根据群主获取所有群聊 $chatList = ChatGroup::query() ->where('corpid', $detail->corpid) ->whereIn('owner', $senders) ->where('status', 1) ->get(); } else { $chatIdList = ChatGroupMassMsgBehavior::query() ->where('rule_id', $detail->rule_id) ->pluck('chat_id') ->toArray(); $chatList = ChatGroup::query() ->where('corpid', $detail->corpid) ->whereIn('chat_id', $chatIdList) ->where('status', 1) ->get(); } return $chatList; } /** * 群发消息开启禁用 */ public static function updateRuleStatus($corpid, $ruleId, $status) { $requestData = [ 'corpid' => $corpid, 'rule_id' => $ruleId, 'status' => $status, ]; try{ # 验证规则是否存在 $msg = ChatGroupMassMsg::query() ->where('id', $ruleId) ->first(); if(empty($msg)) { Log::logError('ChatGroupMassMsgRuleService.updateRuleStatus', [ 'err_msg' => '客户群群发消息规则不存在', 'params' => $requestData, ], 'interface'); return 2106; } # 判断是否可以禁用 if(0 == $status && $msg->enable != 1){ Log::logError('ChatGroupMassMsgRuleService.updateRuleStatus', [ 'err_msg' => '此状态客户群群发规则暂不可禁用', 'params' => $requestData, ], 'interface'); return 2111; } # 变更规则状态 $result = ChatGroupMassMsg::query() ->where('id', $ruleId) ->update(['enable' => $status]); if(!$result) { Log::logError('ChatGroupMassMsgRuleService.updateRuleStatus', [ 'err_msg' => '客户群群发消息规则状态更新失败', 'params' => $requestData, ], 'interface'); return 2107; } } catch (\Exception $exception) { Log::logError('ChatGroupMassMsgRuleService.updateRuleStatus', [ 'params' => $requestData, 'err_msg' => '修改客户群群发规则状态响应异常', 'file' => $exception->getFile(), 'line' => $exception->getLine(), 'message' => $exception->getMessage(), 'trace' => $exception->getTraceAsString() ], 'interface'); EmailQueue::rPush('修改客户群群发规则状态响应异常', json_encode([ 'params' => $requestData, 'file' => $exception->getFile(), 'line' => $exception->getLine(), 'message' => $exception->getMessage(), 'trace' => $exception->getTraceAsString() ]), ['song.shen@kuxuan-inc.com'], '修改客户群群发规则状态响应异常'); return 2107; } return 0; } /** * 消息提醒 * @param $corpid string 企微id * @param $ruleId integer 群发规则id * @return integer */ public static function noticeUser($corpid, $ruleId) { $requestData = [ 'corpid' => $corpid, 'rule_id' => $ruleId ]; try{ #获取规则信息 $rule_info = ChatGroupMassMsg::where("corpid",$corpid) ->where("id",$ruleId)->first(); if(empty($rule_info)) return 1001; //参数错误 #检查是否是待发送状态 if(!in_array($rule_info->enable,[3])) return 2108; //只有待客服确认状态可以操作提醒 #已发送过的成员名单集合 $sent_user_id_arr = ChatGroupMassMsgRecord::where("rule_id",$ruleId) ->where('status', 1)->pluck("sender")->toArray(); //已发送过的成员列表 if(empty($sent_user_id_arr)) return 2109; //群发消息指定成员为空 # 发送消息提醒 $responseData = ApplicationMsgService::sendTextMsg($corpid, '请及时确认客户群发群发消息任务。', $sent_user_id_arr); if(isset($responseData['errcode']) && $responseData['errcode'] != 0) { $logData = [ 'err_msg' => '发送客户群群发消息提醒失败', 'corpid' => $corpid, 'rule_id' => $ruleId, 'responseData' => $responseData ]; EmailQueue::rPush('发送客户群群发消息提醒失败', json_encode($logData, JSON_UNESCAPED_UNICODE), ['song.shen@kuxuan-inc.com'], '发送客户群群发消息提醒失败'); Log::logError('ChatGroupMassMsgRuleService.noticeUser', $logData, 'interface'); return 2512; } } catch (\Exception $exception) { Log::logError('ChatGroupMassMsgRuleService.noticeUser', [ 'params' => $requestData, 'err_msg' => '客户群群发消息提醒响应异常', 'file' => $exception->getFile(), 'line' => $exception->getLine(), 'message' => $exception->getMessage(), 'trace' => $exception->getTraceAsString() ], 'interface'); EmailQueue::rPush('客户群群发消息提醒响应异常', json_encode([ 'params' => $requestData, 'file' => $exception->getFile(), 'line' => $exception->getLine(), 'message' => $exception->getMessage(), 'trace' => $exception->getTraceAsString() ]), ['song.shen@kuxuan-inc.com'], '客户群群发消息提醒响应异常'); return 2512; } return 0; } /** * 客户群群发详情-客户群接收详情 * @param $corpid string 企微id * @param $ruleId integer 群发规则id * @param $chatGroupName string 群聊 * @param $senderList array 群主id * @param $status int 送达状态 1已发送 2未发送 3发送失败 * @param $errno int 错误码 * @return array */ public static function chatGroupReceiveDetailNew($ruleId, $chatGroupName, $senderList, $status, &$errno, $page, $pageSize) { if(3 == $status) { # 发送失败 list($list, $count) = ChatGroupMassMsgRecord::getSendFailOwnerList($ruleId, $senderList, $page, $pageSize); $list = json_decode(json_encode($list), 1); $errcodeConf = config('qyWechat.errcode'); } else { # 获取规则对应的企微id集合 $ruleDetail = ChatGroupMassMsg::where('id', $ruleId)->first(); $corpidList = explode(',', $ruleDetail->corpid); $chatIdList = []; if($chatGroupName) { $chatIdList = ChatGroup::where('name', 'like', '%'.$chatGroupName.'%')->whereIn('corpid', $corpidList) ->where('enable', 1)->where('status', 1) ->pluck('chat_id'); } # 查询客户群群发记录 // list($list, $count) = ChatGroupMassMsgLog::getSendDetail($ruleId, $chatIdList, $corpidList, $senderList, $status, $page, $pageSize); list($list, $count) = ChatGroupMassMsgLogEs::getSendDetail($ruleId, $chatIdList, $corpidList, $senderList, $status, $page, $pageSize); $chatIds = array_column($list, 'chat_id'); $chatGroupData = ChatGroup::select('chat_id', 'name')->whereIn('chat_id', $chatIds)->get(); } $corpidList = array_column($list, 'corpid'); $userIds = array_column($list, 'sender'); $userData = DjUser::select('user_id', 'name')->whereIn('user_id', $userIds)->whereIn('corpid', $corpidList)->get(); $corpList = AuthorizeCorp::select('corpid', 'corp_name')->whereIn('corpid', $corpidList)->get(); # 补充信息 foreach ($list as &$item) { if(isset($item['chat_id'])) { # 群名称 $chatInfo = $chatGroupData->where('chat_id', $item['chat_id'])->first(); } $item['name'] = $chatInfo->name ?? ''; $item['chat_member_count'] = '-'; # 群主 $userInfo = $userData->where('user_id', $item['sender'])->first(); $item['owner_name'] = $userInfo->name ?? ''; # 所属企微 if(!$item['corpid']) { // 历史数据未保存corpid,默认为单企微的corpid $item['corpid'] = $ruleDetail->corpid; } $corpInfo = $corpList->where('corpid', $item['corpid'])->first(); $item['department_name'] = $corpInfo->corp_name ?? ''; if(isset($item['errcode'])) { $err_msg = $errcodeConf[$item['errcode']] ?? null; if(60111 == $item['errcode']) {//UserID不存在 $err_msg = $item['department_name'].$item['owner_name'].$err_msg; } $item['err_msg'] = $err_msg; } } return [$list, $count]; } /** * 客户群群发详情-客户群接收详情 * @param $corpid string 企微id * @param $ruleId integer 群发规则id * @param $chatGroupName string 群聊 * @param $senderList array 群主id * @param $status int 送达状态 1已发送 2未发送 3发送失败 * @param $errno int 错误码 * @return array */ public static function chatGroupReceiveDetail($corpid, $ruleId, $chatGroupName, $senderList, $status, $errno, $page, $pageSize) { $requestData = [ 'corpid' => $corpid, 'rule_id' => $ruleId, 'chat_group_name' => $chatGroupName, 'sender_list' => $senderList, 'status' => $status ]; try{ $massMsg = ChatGroupMassMsg::where('id', $ruleId)->first(); if(empty($massMsg)) return [[], 0]; if(2 == $massMsg->send_mode) { list($chatGroupList, $chatGroupCount) = self::chatGroupReceiveDetailByChat($corpid, $ruleId , $chatGroupName, $senderList, $status, $errno, $page, $pageSize); return [$chatGroupList, $chatGroupCount]; } # 根据群发规则id查询本次群发所有相关群主 $senders = ChatGroupMassMsgRecord::where('rule_id', $ruleId)->get(); if($senders->isNotEmpty()) { $senders = $senders->pluck('sender')->toArray(); } else { if(empty($massMsg->senders)) { $senders = ChatGroup::where('corpid', $massMsg->corpid) ->where('status', 1)->pluck('owner')->toArray(); $senders = empty($senders) ? [] : array_unique($senders); } else { $senders = explode(',', $massMsg->senders); } } if(empty($senders)) { Log::logInfo('ChatGroupMassMsgRuleService.chatGroupReceiveDetail', [ 'params' => $requestData, 'err_msg' => '查询客户群群发群主列表为空', ], 'interface'); return [[], 0]; } $chatIdList = null; $notSendSenders = null; $sendLogList = null; # 如果筛选了送达状态,则提前通过日志表或者记录表将未发送人说或者发送成功以及失败群聊id查询出来 switch($status) { case 2:// 群主未发送 $notSendSenders = ChatGroupMassMsgRecord::where('rule_id', $ruleId) ->whereIn('status', [0, 1])->pluck('sender') ->toArray(); if(empty($notSendSenders)) { Log::logInfo('ChatGroupMassMsgRuleService.chatGroupReceiveDetail', [ 'params' => $requestData, 'err_msg' => '查询客户群群发未发送状态群主列表为空', ], 'interface'); return [[], 0]; } break; case 1: // 群主已发送 case 3: // 发送失败 $sendLogList = ChatGroupMassMsgLog::where('rule_id', $ruleId) ->where('status', $status) ->get(); $chatIdList = $sendLogList->pluck('chat_id')->toArray(); break; default: $sendLogList = ChatGroupMassMsgLog::where('rule_id', $ruleId)->get(); break; } # 客户群条件查询 $chatGroupQuery = ChatGroup::select(['chat_id', 'name', 'owner']) ->where('corpid', $corpid)->where('status', 1)->whereIn('owner', $senders) ->where(function($query) use ($status, $senderList, $chatIdList, $chatGroupName, $notSendSenders) { if(!is_null($chatGroupName)) $query->where('name', 'like', '%'.$chatGroupName.'%'); if(!is_null($status)) { switch($status) { case 1: // 群主已发送 case 3: // 发送失败 $query->whereIn('chat_id', $chatIdList); break; case 2: // 群主未发送 $query->whereIn('owner', $notSendSenders); break; } } if(!is_null($senderList)) $query->whereIn('owner', $senderList); }); $chatGroupCount = $chatGroupQuery->count(); $chatGroupList = $chatGroupQuery->offset(($page - 1) * $pageSize) ->limit($pageSize) ->get(); # 提取本页中群主id以及群聊id,为后面数据拼接做准备 $chatGroupIds = $chatGroupList->pluck('chat_id')->toArray(); $senders = $chatGroupList->pluck('owner')->toArray(); # 群主信息 $userList = DjUser::whereIn('user_id', $senders)->where('corpid', $corpid)->get(); // 查询部门列表 $departmentList = DjDepartment::selectRaw('department_id, name as department_name') ->where('enable', 1)->where('corpid', $corpid)->get() ->keyBy('department_id') ->toArray(); $chatGroupMemberCountList = ChatGroupMember::groupMemberCount($corpid, $chatGroupIds); # 循环数据处理,将需要的数据拼接在一起 foreach($chatGroupList as &$item) { # 群主名称 $ownerInfo = $userList->where('user_id', $item->owner)->first(); $item->owner_name = isset($ownerInfo->name) ? $ownerInfo->name : null; # 群主部门,只展示最后一个 if(isset($ownerInfo->department)){ $departmentIdData = explode(',', $ownerInfo->department); $departmentId = $departmentIdData[count($departmentIdData)-1]; $item->department_name = isset($departmentList[$departmentId]['department_name']) ? $departmentList[$departmentId]['department_name'] : ''; } else { $item->department_name = ''; } # 群聊人数 $item->chat_member_count = isset($chatGroupMemberCountList[$item->chat_id]) ? $chatGroupMemberCountList[$item->chat_id] : 0; # 发送状态 if($sendLogList) { $sendInfo = $sendLogList->where('chat_id', $item->chat_id)->first(); $item->send_status = isset($sendInfo->status) ? $sendInfo->status : 2; # 发送时间 $item->send_time = isset($sendInfo->send_time) ? $sendInfo->send_time : null; } else { $item->send_status = 2; # 发送时间 $item->send_time = null; } } return [$chatGroupList, $chatGroupCount]; } catch (\Exception $exception) { Log::logError('ChatGroupMassMsgRuleService.chatGroupReceiveDetail', [ 'params' => $requestData, 'err_msg' => '客户群群发详情-客户群接收详情响应异常', 'file' => $exception->getFile(), 'line' => $exception->getLine(), 'message' => $exception->getMessage(), 'trace' => $exception->getTraceAsString() ], 'interface'); EmailQueue::rPush('客户群群发详情-客户群接收详情响应异常', json_encode([ 'params' => $requestData, 'file' => $exception->getFile(), 'line' => $exception->getLine(), 'message' => $exception->getMessage(), 'trace' => $exception->getTraceAsString() ]), ['song.shen@kuxuan-inc.com'], '客户群群发详情-客户群接收详情响应异常'); $errno = 400; return [[], 0]; } } public static function chatGroupReceiveDetailByChat($corpid, $ruleId, $chatGroupName, $senderList, $status, $errno , $page, $pageSize) { $sendChatIdList = ChatGroupMassMsgBehavior::where('rule_id', $ruleId) ->where(function($query) use ($senderList, $status) { if($senderList) $query->whereIn('sender_id', $senderList); switch($status) { case 2:// 群主未发送 $query->where('status', 0); break; case 1: // 群主已发送 $query->where('status', 1); break; case 3: // 发送失败 $query->where('status', '-1'); break; default: break; } })->get(); if($sendChatIdList->isEmpty()){ return [[], 0]; } $senders = $sendChatIdList->pluck('sender_id')->toArray(); $chatGroupIds = $sendChatIdList->pluck('chat_id')->toArray(); # 群主信息 $userList = DjUser::whereIn('user_id', $senders)->where('corpid', $corpid)->get(); // 查询部门列表 $departmentList = DjDepartment::selectRaw('department_id, name as department_name') ->where('enable', 1) ->where('corpid', $corpid) ->get() ->keyBy('department_id') ->toArray(); $chatGroupMemberCountList = ChatGroupMember::groupMemberCount($corpid, $chatGroupIds); $chatGroupQuery = ChatGroup::select('chat_id', 'name', 'owner') ->where('corpid', $corpid) ->where('status', 1) ->whereIn('chat_id', $chatGroupIds) ->where(function($query) use ($chatGroupName) { if($chatGroupName) $query->where('name', 'like', '%' . $chatGroupName . '%'); }); $chatGroupCount = $chatGroupQuery->count(); $chatGroupList = $chatGroupQuery->offset(($page - 1) * $pageSize) ->limit($pageSize) ->get(); # 循环数据处理,将需要的数据拼接在一起 foreach($chatGroupList as &$item) { # 群主名称 $ownerInfo = $userList->where('user_id', $item->owner)->first(); $item->owner_name = isset($ownerInfo->name) ? $ownerInfo->name : null; # 群主部门,只展示最后一个 if(isset($ownerInfo->department)){ $departmentIdData = explode(',', $ownerInfo->department); $departmentId = $departmentIdData[count($departmentIdData)-1]; $item->department_name = isset($departmentList[$departmentId]['department_name']) ? $departmentList[$departmentId]['department_name'] : ''; } else { $item->department_name = ''; } # 群聊人数 $item->chat_member_count = isset($chatGroupMemberCountList[$item->chat_id]) ? $chatGroupMemberCountList[$item->chat_id] : 0; # 发送状态 $sendInfo = $sendChatIdList->where('chat_id', $item->chat_id)->first(); $item->send_status = self::getSendStatus($sendInfo->status); # 发送时间 $item->send_time = isset($sendInfo->click_time) ? $sendInfo->click_time : null; } return [$chatGroupList, $chatGroupCount]; } public static function getSendStatus($status) { switch($status){ case 0: return 2; case 1: return 1; case -1: return 3; default: return 2; } } }