123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089 |
- <?php
- /**
- * Created by PhpStorm.
- * User: shensong
- * Date: 2022/7/27
- * Time: 10:54
- */
- namespace App\Service\ChatGroup;
- use App\Log;
- use App\Models\AuthorizeCorp;
- use App\Models\ChatGroup;
- use App\Models\ChatGroupMassMsg;
- use App\Models\ChatGroupMassMsgBehavior;
- use App\Models\ChatGroupMassMsgLog;
- use App\Models\ChatGroupMassMsgRecord;
- use App\Models\DjDepartment;
- use App\Models\DjUser;
- use App\Models\Es\ChatGroupMassMsgLogEs;
- use App\Models\Es\ChatGroupMember;
- use App\Models\OperationGroup;
- use App\Models\System\Users;
- use App\Service\ApplicationMsgService;
- use App\Service\MassMsgRuleService;
- use App\Service\RadarService;
- use App\Support\EmailQueue;
- class ChatGroupMassMsgRuleService
- {
- public static function setChatGroupMassMsg($ruleId, $params)
- {
- try {
- # 校验附件信息合法性
- $attachmentsVerifyCode = MassMsgRuleService::attachmentsVerify($params['attachments'], $params['corpid']);
- if($attachmentsVerifyCode) {
- Log::logError('ChatGroupMassMsgRuleService.setChatGroupMassMsg', [
- 'params' => 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;
- }
- }
- }
|