企微短剧业务系统

ChatGroupMassMsgRuleService.php 45KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089
  1. <?php
  2. /**
  3. * Created by PhpStorm.
  4. * User: shensong
  5. * Date: 2022/7/27
  6. * Time: 10:54
  7. */
  8. namespace App\Service\ChatGroup;
  9. use App\Log;
  10. use App\Models\AuthorizeCorp;
  11. use App\Models\ChatGroup;
  12. use App\Models\ChatGroupMassMsg;
  13. use App\Models\ChatGroupMassMsgBehavior;
  14. use App\Models\ChatGroupMassMsgLog;
  15. use App\Models\ChatGroupMassMsgRecord;
  16. use App\Models\DjDepartment;
  17. use App\Models\DjUser;
  18. use App\Models\Es\ChatGroupMassMsgLogEs;
  19. use App\Models\Es\ChatGroupMember;
  20. use App\Models\OperationGroup;
  21. use App\Models\System\Users;
  22. use App\Service\ApplicationMsgService;
  23. use App\Service\MassMsgRuleService;
  24. use App\Service\RadarService;
  25. use App\Support\EmailQueue;
  26. class ChatGroupMassMsgRuleService
  27. {
  28. public static function setChatGroupMassMsg($ruleId, $params)
  29. {
  30. try {
  31. # 校验附件信息合法性
  32. $attachmentsVerifyCode = MassMsgRuleService::attachmentsVerify($params['attachments'], $params['corpid']);
  33. if($attachmentsVerifyCode) {
  34. Log::logError('ChatGroupMassMsgRuleService.setChatGroupMassMsg', [
  35. 'params' => array_merge(['rule_id' => $ruleId], $params),
  36. 'err_code' => $attachmentsVerifyCode,
  37. 'err_msg' => '设置客户群群发规则时验证附件信息失败',
  38. ], 'interface');
  39. return $attachmentsVerifyCode;
  40. }
  41. if($ruleId){ // 编辑群发规则
  42. # 判断是否为未发送状态
  43. $ruleInfo = ChatGroupMassMsg::query()
  44. ->where('id', $ruleId)
  45. ->first();
  46. if(!isset($ruleInfo->enable) || !in_array($ruleInfo->enable, [-1, 1])) {
  47. Log::logError('ChatGroupMassMsgRuleService.setChatGroupMassMsg', [
  48. 'params' => array_merge(['rule_id' => $ruleId], $params),
  49. 'err_code' => $attachmentsVerifyCode,
  50. 'err_msg' => '此状态客户群群发规则暂不支持编辑操作',
  51. ], 'interface');
  52. return 2102;
  53. }
  54. $result = ChatGroupMassMsg::query()
  55. ->where('id', $ruleId)
  56. ->update($params);
  57. } else {
  58. # 设置新群发规则
  59. $massMsgModel = new ChatGroupMassMsg();
  60. $massMsgModel->admin_id = $params['admin_id'];
  61. $massMsgModel->corpid = $params['corpid'];
  62. $massMsgModel->name = $params['name'];
  63. $massMsgModel->send_type = $params['send_type'];
  64. $massMsgModel->send_time = $params['send_time'];
  65. $massMsgModel->senders = $params['senders'];
  66. $massMsgModel->content = $params['content'];
  67. $massMsgModel->attachments = $params['attachments'];
  68. $result = $massMsgModel->save();
  69. $ruleId = isset($massMsgModel->id) ? $massMsgModel->id : '';
  70. }
  71. if(!$result) {
  72. Log::logError('ChatGroupMassMsgRuleService.setChatGroupMassMsg', [
  73. 'params' => array_merge(['rule_id' => $ruleId], $params),
  74. 'err_code' => $attachmentsVerifyCode,
  75. 'err_msg' => '客户群群发规则设置失败,请重试',
  76. ], 'interface');
  77. return 2103;
  78. }
  79. } catch (\Exception $e) {
  80. Log::logError('ChatGroupMassMsgRuleService.setChatGroupMassMsg', [
  81. 'file' => $e->getFile(),
  82. 'line' => $e->getLine(),
  83. 'msg' => $e->getMessage(),
  84. 'params' => array_merge(['rule_id' => $ruleId], $params),
  85. 'trace' => $e->getTraceAsString(),
  86. ], 'interface');
  87. EmailQueue::rPush('设置客户群群发规则异常', json_encode([
  88. 'file' => $e->getFile(),
  89. 'line' => $e->getLine(),
  90. 'msg' => $e->getMessage(),
  91. 'params' => array_merge(['rule_id' => $ruleId], $params),
  92. 'trace' => $e->getTraceAsString(),
  93. ]), ['song.shen@kuxuan-inc.com'], '设置客户群群发规则异常');
  94. return 2101;
  95. }
  96. return 0;
  97. }
  98. /**
  99. * 更新群发规则状态
  100. * @param $ruleId integer 群发规则ID
  101. * @param $status integer 群发规则待更新到的状态值 状态 -2:已删除 -1:发送失败 1:待发送 2:正在发送中 3:待客服确认 4:发送完成
  102. * @return int
  103. * */
  104. public static function updateStatus($ruleId, $status)
  105. {
  106. # 修改群发规则状态为已发送
  107. $updateStatus = ChatGroupMassMsg::updateRuleStatus($ruleId, $status);
  108. if(!$updateStatus) {
  109. Log::logError('ChatGroupMassMsgRuleService.updateStatus', [
  110. 'err_msg' => '客户群群发规则状态更新失败',
  111. 'rule_id' => $ruleId,
  112. 'status' => $status
  113. ], 'interface');
  114. }
  115. return $updateStatus;
  116. }
  117. /**
  118. * 获取群发列表
  119. * @param $corpid string 企业ID
  120. * @param $creatorId integer 创建人ID集合
  121. * @param $sendTimeStart string 发送时间查询-起始时间
  122. * @param $sendTimeEnd string 发送时间查询-结束时间
  123. * @param $createTimeStart string 创建时间查询-结束时间
  124. * @param $createTimeEnd string 创建时间查询-结束时间
  125. * @param $sortColumn string 排序字段
  126. * @param $sortMethod string 排序方式*
  127. * @param $page integer 当前页码数
  128. * @param $pageSize integer 每页显示条数
  129. * @param $errno int 错误码
  130. * @param $ruleName string 群发标题
  131. * @return mixed
  132. * */
  133. public static function ruleList(
  134. $corpid, $creatorId, $sendTimeStart, $sendTimeEnd, $createTimeStart, $createTimeEnd, $sortColumn, $sortMethod,
  135. $page, $pageSize, &$errno, $ruleName
  136. )
  137. {
  138. try{
  139. list($list, $count) = ChatGroupMassMsg::getRuleLists($corpid, $creatorId, $sendTimeStart, $sendTimeEnd,
  140. $createTimeStart, $createTimeEnd, $sortColumn, $sortMethod, $page, $pageSize, $ruleName);
  141. # 获取创建人信息
  142. $adminIds = $list->pluck('admin_id');
  143. $adminData = Users::select(['id','name'])->whereIn('id', $adminIds)->get();
  144. # 按规则统计客户群群发的发送情况
  145. $ruleIds = $list->pluck('rule_id');
  146. # 群主统计
  147. $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')
  148. ->whereIn('rule_id', $ruleIds)->groupBy(['rule_id'])->get();
  149. # 发送群聊统计
  150. // $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')
  151. // ->whereIn('rule_id', $ruleIds)->groupBy(['rule_id'])->get();
  152. $chatGroupData = ChatGroupMassMsgLogEs::getChatGroupData($ruleIds);
  153. $errStatData = ChatGroupMassMsgRecord::query()->select(['errcode', 'rule_id', 'sender', 'corpid'])
  154. ->whereIn('rule_id', $ruleIds)->where('errcode', '!=', 0)->get();
  155. $senderIdList = [];
  156. foreach ($errStatData as $item) {
  157. $senderIdList[] = '("'.$item['corpid'].'","'.$item['sender'].'")';
  158. }
  159. if(!empty($senderIdList)) {
  160. $senderInfoList = DjUser::query()->whereRaw('(corpid, user_id) in ('. implode(',', $senderIdList).')')
  161. ->where('enable', 1)->get();
  162. } else {
  163. $senderInfoList = DjUser::query()->where('enable', 1)->get();
  164. }
  165. $corpInfoList = AuthorizeCorp::query()->get();
  166. $errcodeConf = config('qyWechat.errcode');
  167. # 处理数据
  168. foreach($list as $datum) {
  169. # 创建人信息
  170. $adminInfo = $adminData->where('id', $datum->admin_id)->first();
  171. $datum->creator = isset($adminInfo->name) ? $adminInfo->name : '';
  172. // if(1 == $datum->send_mode) {
  173. $senderStatInfo = $senderData->where('rule_id', $datum->rule_id)->first();
  174. $datum->send_user_success = $senderStatInfo->send_user_success ?? 0;
  175. $datum->send_user_fail = $senderStatInfo->send_user_fail ?? 0;
  176. // $chatStatInfo = $chatGroupData->where('rule_id', $datum->rule_id)->first();
  177. $chatStatInfo = $chatGroupData[$datum->rule_id] ?? [];
  178. $datum->send_chat_success = $chatStatInfo['send_chat_success'] ?? 0;
  179. $datum->send_chat_fail = $chatStatInfo['send_chat_fail'] ?? 0;
  180. // } else {
  181. // $sendStatInfo = ChatGroupMassMsgService::getRuleSendResult($datum);
  182. // $datum->send_user_success = $sendStatInfo['send_user_success'];
  183. // $datum->send_user_fail = $sendStatInfo['send_user_fail'];
  184. // $datum->send_chat_success = $sendStatInfo['send_chat_success'];
  185. // $datum->send_chat_fail = $sendStatInfo['send_chat_fail'];
  186. // }
  187. # 查询失败信息
  188. $errList = $errStatData->where('rule_id', $datum->rule_id)->all();
  189. $err_msg_list = [];
  190. if(!empty($errList)){
  191. foreach ($errList as $item) {// 无可发送的客户
  192. $err_msg = $errcodeConf[$item['errcode']] ?? null;
  193. if(60111 == $item['errcode']) {//UserID不存在
  194. // 当出现此种错误时,将客服名称一并拼接起来展示
  195. $senderName = $senderInfoList->where('corpid', $item['corpid'])
  196. ->where('user_id', $item['sender'])->first();
  197. $senderName = $senderName->name ?? '';
  198. if(1 == $datum->operate_type) {
  199. $err_msg = $senderName.$err_msg;
  200. } else {
  201. $corpName = $corpInfoList->where('corpid', $item['corpid'])->first();
  202. $corpName = $corpName->corp_name ?? '';
  203. $err_msg = $corpName.$senderName.$err_msg;
  204. }
  205. }
  206. $err_msg = $datum->enable != -1 ? '部分失败由于'.$err_msg : $err_msg;
  207. if(!empty($err_msg) && !in_array($err_msg, $err_msg_list)) {
  208. $err_msg_list[] = $err_msg;
  209. }
  210. }
  211. }
  212. $datum->err_msg = $err_msg_list;
  213. unset($datum->admin_id);
  214. }
  215. } catch (\Exception $exception){
  216. Log::logError('ChatGroupMassMsgRuleService.ruleList', [
  217. 'params' => [
  218. 'corpid' => $corpid,
  219. 'creator_id' => $creatorId,
  220. 'send_time_start' => $sendTimeStart,
  221. 'send_time_end' => $sendTimeEnd,
  222. 'create_time_start' => $createTimeStart,
  223. 'create_time_end' => $createTimeEnd,
  224. 'sort_column' => $sortColumn,
  225. 'sort_method' => $sortMethod,
  226. 'page' => $page,
  227. 'page_size' => $pageSize,
  228. 'errno' => $errno
  229. ],
  230. 'err_msg' => '客户群群发规则列表响应异常',
  231. 'line' => $exception->getLine(),
  232. 'message' => $exception->getMessage(),
  233. ], 'interface');
  234. EmailQueue::rPush('客户群群发规则列表响应异常', json_encode([
  235. 'message' => $exception->getMessage(),
  236. ]), ['song.shen@kuxuan-inc.com', 'xiaohua.hou@kuxuan-inc.com'], '客户群群发规则列表响应异常');
  237. $errno = 2105;
  238. return [[], 0];
  239. }
  240. return [$list, $count];
  241. }
  242. public static function getRuleSendResult($datum)
  243. {
  244. $data = [
  245. 'send_chat_total'=>0,
  246. 'send_chat_success' =>0,
  247. 'send_chat_fail' => 0,
  248. 'send_user_total' => 0,
  249. 'send_user_success' => 0,
  250. 'send_user_fail' => 0,
  251. ];
  252. $senders = [];
  253. $recordList = ChatGroupMassMsgRecord::where('rule_id', $datum->rule_id)->get();
  254. foreach($recordList as $record) {
  255. $data['send_user_total']++;
  256. if(2 == $record->status) {
  257. $data['send_user_success']++;
  258. } else {
  259. $data['send_user_fail']++;
  260. }
  261. $senders[] = $record->sender;
  262. }
  263. $corpidList = explode(',', $datum->corpid);
  264. $sendChatCount = ChatGroup::whereIn('corpid', $corpidList)
  265. ->whereIn('owner', $senders)->where('status', 1)
  266. ->count();
  267. $data['send_chat_total'] = $sendChatCount;
  268. // $sendChatSuccess = ChatGroupMassMsgLog::where('rule_id', $datum->rule_id)
  269. // ->where('status', 1)->count();
  270. $sendChatSuccess = ChatGroupMassMsgLogEs::getSendChatCount($datum->rule_id, 1);
  271. $data['send_chat_success'] = $sendChatSuccess;
  272. $data['send_chat_fail'] = $data['send_chat_total'] - $data['send_chat_success'];
  273. return $data;
  274. }
  275. /**
  276. * 客户群群发规则详情
  277. */
  278. public static function ruleDetail($corpid, $ruleId, &$errno)
  279. {
  280. $requestData = [
  281. 'corpid' => $corpid,
  282. 'rule_id' => $ruleId,
  283. 'errno' => $errno
  284. ];
  285. try{
  286. $detail = ChatGroupMassMsg::selectRaw('id as rule_id, admin_id, corpid, name, send_type, send_time, senders, content,
  287. attachments, enable, send_mode, item_id, chat_groups, operate_type')
  288. ->whereRaw('FIND_IN_SET("'.$corpid.'", `corpid`)')
  289. ->where('id', $ruleId)
  290. ->first();
  291. if(empty($detail)) {
  292. Log::logError('ChatGroupMassMsgRuleService.ruleDetail', [
  293. 'err_msg' => '获取客户群群发规则基础信息失败',
  294. 'params' => $requestData,
  295. ], 'interface');
  296. return [];
  297. }
  298. # 获取创建人信息
  299. $detail->creator = Users::where('id', $detail->admin_id)->value('name');
  300. $attachments = json_decode($detail->attachments, true);
  301. if(!empty($attachments)) {
  302. foreach ($attachments as $key=>&$attachment) {
  303. if(isset($attachment['msgtype']) && $attachment['msgtype'] == 'radar') { // 雷达附件信息回显
  304. $radarId = $attachment['radar']['radar_id'] ?? 0;
  305. $radarInfo = RadarService::getRadarContent($corpid, $radarId);
  306. if(empty($radarInfo)) {
  307. unset($attachment[$key]);
  308. continue;
  309. }
  310. $attachment['radar'] = $radarInfo;
  311. }
  312. }
  313. }
  314. if($detail->enable == 4) {
  315. # 消息条数
  316. $contentCount = empty($detail->content) ? 0 : 1;
  317. $attachmentCount = empty($detail->attachments) ? 0 : count($attachments);
  318. $detail->msg_count = $contentCount + $attachmentCount;
  319. $detail->attachments = json_encode($attachments, 256);
  320. if(1 == $detail->send_mode) { // 按群主
  321. # 统计发送情况
  322. $sendStatInfo = ChatGroupMassMsgRuleService::getRuleSendResult($detail);
  323. } else {
  324. $sendStatInfo = ChatGroupMassMsgService::getRuleSendResult($detail);
  325. }
  326. $chatList = self::getChatList($detail, $ruleId);
  327. $detail->send_user_success = $sendStatInfo['send_user_success'];
  328. $detail->send_user_fail = $sendStatInfo['send_user_fail'];
  329. $detail->send_chat_success = $sendStatInfo['send_chat_success'];
  330. $detail->send_chat_fail = $sendStatInfo['send_chat_fail'];
  331. # 群发对象
  332. $detail->chat_name = $chatList->pluck('name')->toArray();
  333. $detail->chat_count = $chatList->count();
  334. }
  335. } catch (\Exception $exception) {
  336. Log::logError('ChatGroupMassMsgRuleService.ruleDetail', [
  337. 'params' => $requestData,
  338. 'err_msg' => '客户群群发规则详情响应异常',
  339. 'file' => $exception->getFile(),
  340. 'line' => $exception->getLine(),
  341. 'message' => $exception->getMessage(),
  342. 'trace' => $exception->getTraceAsString()
  343. ], 'interface');
  344. EmailQueue::rPush('客户群群发规则详情响应异常', json_encode([
  345. 'params' => $requestData,
  346. 'file' => $exception->getFile(),
  347. 'line' => $exception->getLine(),
  348. 'message' => $exception->getMessage(),
  349. 'trace' => $exception->getTraceAsString()
  350. ]), ['song.shen@kuxuan-inc.com', 'xiaohua.hou@kuxuan-inc.com'], '客户群群发规则详情响应异常');
  351. $errno = 2104;
  352. return [];
  353. }
  354. return $detail;
  355. }
  356. /**
  357. * 客户群群发规则详情
  358. * */
  359. public static function ruleDetailNew($corpid, $ruleId, &$errno)
  360. {
  361. try {
  362. # 获取规则详情
  363. $detail = ChatGroupMassMsg::selectRaw('id as rule_id, admin_id, corpid, name, send_type, send_time, senders, content,
  364. attachments, enable, send_mode, item_id, chat_groups, operate_type')
  365. ->whereRaw('FIND_IN_SET("'.$corpid.'", `corpid`)')
  366. ->where('id', $ruleId)
  367. ->first();
  368. if(empty($detail)) {
  369. $errno = 2106;
  370. return [];
  371. }
  372. # 处理附件中的雷达信息
  373. $attachments = json_decode($detail->attachments, true);
  374. if(!empty($attachments)) {
  375. foreach ($attachments as $key=>&$attachment) {
  376. if(isset($attachment['msgtype']) && $attachment['msgtype'] == 'radar') { // 雷达附件信息回显
  377. $radarId = $attachment['radar']['radar_id'] ?? 0;
  378. $radarInfo = RadarService::getRadarContent($corpid, $radarId);
  379. if(empty($radarInfo)) {
  380. unset($attachment[$key]);
  381. continue;
  382. }
  383. $attachment['radar'] = $radarInfo;
  384. }
  385. }
  386. }
  387. # 处理群主信息
  388. $senderData = null;
  389. if($detail->operate_type == 1) { // 单企微
  390. # 获取企微名称
  391. $corpName = AuthorizeCorp::where('corpid', $detail->corpid)->value('corp_name');
  392. if(!empty($detail->senders)) {
  393. $senderIdList = explode(',', $detail->senders);
  394. } else {
  395. $senderIdList = null;
  396. }
  397. $senderList = DjUser::where('corpid', $detail->corpid)->where(function($query) use($senderIdList) {
  398. if(!empty($senderIdList)) {
  399. $query->whereIn('user_id', $senderIdList);
  400. } else {
  401. $query->where('status', 1)->where('enable', 1);
  402. }
  403. })->pluck('name');
  404. $senderData[] = [
  405. 'corp_name' => $corpName,
  406. 'sender_list' => $senderList
  407. ];
  408. } else { // 多企微
  409. $senders = json_decode($detail->senders, true);
  410. $corpidList = array_column($senders, 'corpid');
  411. $corpList = AuthorizeCorp::select('corpid', 'corp_name')->whereIn('corpid', $corpidList)->get();
  412. foreach ($senders as $item) {
  413. $corpInfo = $corpList->where('corpid', $item['corpid'])->first();
  414. $corpName = $corpInfo->corp_name ?? '';
  415. $senderIdList = explode(',', $item['sender_list']);
  416. $senderList = DjUser::where('corpid', $item['corpid'])->where(function($query) use($senderIdList) {
  417. if(!empty($senderIdList)) $query->whereIn('user_id', $senderIdList);
  418. })->pluck('name');
  419. $senderData[] = [
  420. 'corp_name' => $corpName,
  421. 'sender_list' => $senderList
  422. ];
  423. }
  424. }
  425. $detail->sender_data = $senderData;
  426. if(in_array($detail->enable, [2,3,4])) {
  427. # 统计发送群聊数据
  428. // $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")
  429. // ->where('rule_id', $ruleId)
  430. // ->first();
  431. //
  432. // $detail->send_chat_success = $sendStat->send_success ?? 0;
  433. // $detail->send_chat_fail = $sendStat->send_fail ?? 0;
  434. // $detail->member_count = $sendStat->member_count ?? 0;
  435. $sendStat = ChatGroupMassMsgLogEs::getServiceData([$ruleId]);
  436. $detail->send_chat_success = $sendStat['send_chat_success'] ?? 0;
  437. $detail->send_chat_fail = $sendStat['send_chat_fail'] ?? 0;
  438. $detail->success_member_count = $sendStat['success_member_count'] ?? 0;
  439. $detail->fail_member_count = $sendStat['fail_member_count'] ?? 0;
  440. # 统计发送群主数据
  441. $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")
  442. ->where('rule_id', $ruleId)
  443. ->first();
  444. $detail->send_user_success = $senderStat->send_success ?? 0;
  445. $detail->wait_send_user = $senderStat->wait_send ?? 0;
  446. $detail->send_user_fail = $senderStat->send_fail ?? 0;
  447. }
  448. } catch (\Exception $e) {
  449. Log::logError('客户群群发规则详情响应异常', [
  450. 'corpid' => $corpid,
  451. 'rule_id' => $ruleId,
  452. 'line' => $e->getLine(),
  453. 'msg' => $e->getMessage(),
  454. ], 'ChatGroupRuleDetail');
  455. EmailQueue::rPush('客户群群发规则详情响应异常', $e->getTraceAsString(), ['xiaohua.hou@kuxuan-inc.com'], '猎羽');
  456. $errno = 2104;
  457. return [];
  458. }
  459. return $detail;
  460. }
  461. public static function getChatList($detail, $ruleId)
  462. {
  463. if(1 == $detail->send_mode) {
  464. // 发送记录列表
  465. $sendUserList = ChatGroupMassMsgRecord::query()
  466. ->where('rule_id', $ruleId)
  467. ->get();
  468. if($sendUserList->isNotEmpty()) {
  469. $sendUserSuccess = $sendUserFail = 0;
  470. $senders = [];
  471. foreach($sendUserList as $item) {
  472. if(2 == $item->status) {
  473. $sendUserSuccess++;
  474. } else {
  475. $sendUserFail++;
  476. }
  477. $senders[] = $item->sender;
  478. }
  479. } else {
  480. if(empty($detail->senders)) {
  481. $senders = ChatGroup::query()
  482. ->where('corpid', $detail->corpid)
  483. ->where('status', 1)
  484. ->pluck('owner')
  485. ->toArray();
  486. $senders = empty($senders) ? [] : array_unique($senders);
  487. } else {
  488. $senders = explode(',', $detail->senders);
  489. }
  490. }
  491. // 根据群主获取所有群聊
  492. $chatList = ChatGroup::query()
  493. ->where('corpid', $detail->corpid)
  494. ->whereIn('owner', $senders)
  495. ->where('status', 1)
  496. ->get();
  497. } else {
  498. $chatIdList = ChatGroupMassMsgBehavior::query()
  499. ->where('rule_id', $detail->rule_id)
  500. ->pluck('chat_id')
  501. ->toArray();
  502. $chatList = ChatGroup::query()
  503. ->where('corpid', $detail->corpid)
  504. ->whereIn('chat_id', $chatIdList)
  505. ->where('status', 1)
  506. ->get();
  507. }
  508. return $chatList;
  509. }
  510. /**
  511. * 群发消息开启禁用
  512. */
  513. public static function updateRuleStatus($corpid, $ruleId, $status)
  514. {
  515. $requestData = [
  516. 'corpid' => $corpid,
  517. 'rule_id' => $ruleId,
  518. 'status' => $status,
  519. ];
  520. try{
  521. # 验证规则是否存在
  522. $msg = ChatGroupMassMsg::query()
  523. ->where('id', $ruleId)
  524. ->first();
  525. if(empty($msg)) {
  526. Log::logError('ChatGroupMassMsgRuleService.updateRuleStatus', [
  527. 'err_msg' => '客户群群发消息规则不存在',
  528. 'params' => $requestData,
  529. ], 'interface');
  530. return 2106;
  531. }
  532. # 判断是否可以禁用
  533. if(0 == $status && $msg->enable != 1){
  534. Log::logError('ChatGroupMassMsgRuleService.updateRuleStatus', [
  535. 'err_msg' => '此状态客户群群发规则暂不可禁用',
  536. 'params' => $requestData,
  537. ], 'interface');
  538. return 2111;
  539. }
  540. # 变更规则状态
  541. $result = ChatGroupMassMsg::query()
  542. ->where('id', $ruleId)
  543. ->update(['enable' => $status]);
  544. if(!$result) {
  545. Log::logError('ChatGroupMassMsgRuleService.updateRuleStatus', [
  546. 'err_msg' => '客户群群发消息规则状态更新失败',
  547. 'params' => $requestData,
  548. ], 'interface');
  549. return 2107;
  550. }
  551. } catch (\Exception $exception) {
  552. Log::logError('ChatGroupMassMsgRuleService.updateRuleStatus', [
  553. 'params' => $requestData,
  554. 'err_msg' => '修改客户群群发规则状态响应异常',
  555. 'file' => $exception->getFile(),
  556. 'line' => $exception->getLine(),
  557. 'message' => $exception->getMessage(),
  558. 'trace' => $exception->getTraceAsString()
  559. ], 'interface');
  560. EmailQueue::rPush('修改客户群群发规则状态响应异常', json_encode([
  561. 'params' => $requestData,
  562. 'file' => $exception->getFile(),
  563. 'line' => $exception->getLine(),
  564. 'message' => $exception->getMessage(),
  565. 'trace' => $exception->getTraceAsString()
  566. ]), ['song.shen@kuxuan-inc.com'], '修改客户群群发规则状态响应异常');
  567. return 2107;
  568. }
  569. return 0;
  570. }
  571. /**
  572. * 消息提醒
  573. * @param $corpid string 企微id
  574. * @param $ruleId integer 群发规则id
  575. * @return integer
  576. */
  577. public static function noticeUser($corpid, $ruleId)
  578. {
  579. $requestData = [
  580. 'corpid' => $corpid,
  581. 'rule_id' => $ruleId
  582. ];
  583. try{
  584. #获取规则信息
  585. $rule_info = ChatGroupMassMsg::where("corpid",$corpid)
  586. ->where("id",$ruleId)->first();
  587. if(empty($rule_info)) return 1001; //参数错误
  588. #检查是否是待发送状态
  589. if(!in_array($rule_info->enable,[3])) return 2108; //只有待客服确认状态可以操作提醒
  590. #已发送过的成员名单集合
  591. $sent_user_id_arr = ChatGroupMassMsgRecord::where("rule_id",$ruleId)
  592. ->where('status', 1)->pluck("sender")->toArray(); //已发送过的成员列表
  593. if(empty($sent_user_id_arr)) return 2109; //群发消息指定成员为空
  594. # 发送消息提醒
  595. $responseData = ApplicationMsgService::sendTextMsg($corpid, '请及时确认客户群发群发消息任务。', $sent_user_id_arr);
  596. if(isset($responseData['errcode']) && $responseData['errcode'] != 0) {
  597. $logData = [
  598. 'err_msg' => '发送客户群群发消息提醒失败',
  599. 'corpid' => $corpid,
  600. 'rule_id' => $ruleId,
  601. 'responseData' => $responseData
  602. ];
  603. EmailQueue::rPush('发送客户群群发消息提醒失败', json_encode($logData, JSON_UNESCAPED_UNICODE), ['song.shen@kuxuan-inc.com'], '发送客户群群发消息提醒失败');
  604. Log::logError('ChatGroupMassMsgRuleService.noticeUser', $logData, 'interface');
  605. return 2512;
  606. }
  607. } catch (\Exception $exception) {
  608. Log::logError('ChatGroupMassMsgRuleService.noticeUser', [
  609. 'params' => $requestData,
  610. 'err_msg' => '客户群群发消息提醒响应异常',
  611. 'file' => $exception->getFile(),
  612. 'line' => $exception->getLine(),
  613. 'message' => $exception->getMessage(),
  614. 'trace' => $exception->getTraceAsString()
  615. ], 'interface');
  616. EmailQueue::rPush('客户群群发消息提醒响应异常', json_encode([
  617. 'params' => $requestData,
  618. 'file' => $exception->getFile(),
  619. 'line' => $exception->getLine(),
  620. 'message' => $exception->getMessage(),
  621. 'trace' => $exception->getTraceAsString()
  622. ]), ['song.shen@kuxuan-inc.com'], '客户群群发消息提醒响应异常');
  623. return 2512;
  624. }
  625. return 0;
  626. }
  627. /**
  628. * 客户群群发详情-客户群接收详情
  629. * @param $corpid string 企微id
  630. * @param $ruleId integer 群发规则id
  631. * @param $chatGroupName string 群聊
  632. * @param $senderList array 群主id
  633. * @param $status int 送达状态 1已发送 2未发送 3发送失败
  634. * @param $errno int 错误码
  635. * @return array
  636. */
  637. public static function chatGroupReceiveDetailNew($ruleId, $chatGroupName, $senderList, $status, &$errno, $page, $pageSize)
  638. {
  639. if(3 == $status) { # 发送失败
  640. list($list, $count) = ChatGroupMassMsgRecord::getSendFailOwnerList($ruleId, $senderList, $page, $pageSize);
  641. $list = json_decode(json_encode($list), 1);
  642. $errcodeConf = config('qyWechat.errcode');
  643. } else {
  644. # 获取规则对应的企微id集合
  645. $ruleDetail = ChatGroupMassMsg::where('id', $ruleId)->first();
  646. $corpidList = explode(',', $ruleDetail->corpid);
  647. $chatIdList = [];
  648. if($chatGroupName) {
  649. $chatIdList = ChatGroup::where('name', 'like', '%'.$chatGroupName.'%')->whereIn('corpid', $corpidList)
  650. ->where('enable', 1)->where('status', 1)
  651. ->pluck('chat_id');
  652. }
  653. # 查询客户群群发记录
  654. // list($list, $count) = ChatGroupMassMsgLog::getSendDetail($ruleId, $chatIdList, $corpidList, $senderList, $status, $page, $pageSize);
  655. list($list, $count) = ChatGroupMassMsgLogEs::getSendDetail($ruleId, $chatIdList, $corpidList, $senderList, $status, $page, $pageSize);
  656. $chatIds = array_column($list, 'chat_id');
  657. $chatGroupData = ChatGroup::select('chat_id', 'name')->whereIn('chat_id', $chatIds)->get();
  658. }
  659. $corpidList = array_column($list, 'corpid');
  660. $userIds = array_column($list, 'sender');
  661. $userData = DjUser::select('user_id', 'name')->whereIn('user_id', $userIds)->whereIn('corpid', $corpidList)->get();
  662. $corpList = AuthorizeCorp::select('corpid', 'corp_name')->whereIn('corpid', $corpidList)->get();
  663. # 补充信息
  664. foreach ($list as &$item) {
  665. if(isset($item['chat_id'])) {
  666. # 群名称
  667. $chatInfo = $chatGroupData->where('chat_id', $item['chat_id'])->first();
  668. }
  669. $item['name'] = $chatInfo->name ?? '';
  670. $item['chat_member_count'] = '-';
  671. # 群主
  672. $userInfo = $userData->where('user_id', $item['sender'])->first();
  673. $item['owner_name'] = $userInfo->name ?? '';
  674. # 所属企微
  675. if(!$item['corpid']) { // 历史数据未保存corpid,默认为单企微的corpid
  676. $item['corpid'] = $ruleDetail->corpid;
  677. }
  678. $corpInfo = $corpList->where('corpid', $item['corpid'])->first();
  679. $item['department_name'] = $corpInfo->corp_name ?? '';
  680. if(isset($item['errcode'])) {
  681. $err_msg = $errcodeConf[$item['errcode']] ?? null;
  682. if(60111 == $item['errcode']) {//UserID不存在
  683. $err_msg = $item['department_name'].$item['owner_name'].$err_msg;
  684. }
  685. $item['err_msg'] = $err_msg;
  686. }
  687. }
  688. return [$list, $count];
  689. }
  690. /**
  691. * 客户群群发详情-客户群接收详情
  692. * @param $corpid string 企微id
  693. * @param $ruleId integer 群发规则id
  694. * @param $chatGroupName string 群聊
  695. * @param $senderList array 群主id
  696. * @param $status int 送达状态 1已发送 2未发送 3发送失败
  697. * @param $errno int 错误码
  698. * @return array
  699. */
  700. public static function chatGroupReceiveDetail($corpid, $ruleId, $chatGroupName, $senderList, $status, $errno, $page, $pageSize)
  701. {
  702. $requestData = [
  703. 'corpid' => $corpid,
  704. 'rule_id' => $ruleId,
  705. 'chat_group_name' => $chatGroupName,
  706. 'sender_list' => $senderList,
  707. 'status' => $status
  708. ];
  709. try{
  710. $massMsg = ChatGroupMassMsg::where('id', $ruleId)->first();
  711. if(empty($massMsg)) return [[], 0];
  712. if(2 == $massMsg->send_mode) {
  713. list($chatGroupList, $chatGroupCount) = self::chatGroupReceiveDetailByChat($corpid, $ruleId
  714. , $chatGroupName, $senderList, $status, $errno, $page, $pageSize);
  715. return [$chatGroupList, $chatGroupCount];
  716. }
  717. # 根据群发规则id查询本次群发所有相关群主
  718. $senders = ChatGroupMassMsgRecord::where('rule_id', $ruleId)->get();
  719. if($senders->isNotEmpty()) {
  720. $senders = $senders->pluck('sender')->toArray();
  721. } else {
  722. if(empty($massMsg->senders)) {
  723. $senders = ChatGroup::where('corpid', $massMsg->corpid)
  724. ->where('status', 1)->pluck('owner')->toArray();
  725. $senders = empty($senders) ? [] : array_unique($senders);
  726. } else {
  727. $senders = explode(',', $massMsg->senders);
  728. }
  729. }
  730. if(empty($senders)) {
  731. Log::logInfo('ChatGroupMassMsgRuleService.chatGroupReceiveDetail', [
  732. 'params' => $requestData,
  733. 'err_msg' => '查询客户群群发群主列表为空',
  734. ], 'interface');
  735. return [[], 0];
  736. }
  737. $chatIdList = null;
  738. $notSendSenders = null;
  739. $sendLogList = null;
  740. # 如果筛选了送达状态,则提前通过日志表或者记录表将未发送人说或者发送成功以及失败群聊id查询出来
  741. switch($status) {
  742. case 2:// 群主未发送
  743. $notSendSenders = ChatGroupMassMsgRecord::where('rule_id', $ruleId)
  744. ->whereIn('status', [0, 1])->pluck('sender')
  745. ->toArray();
  746. if(empty($notSendSenders)) {
  747. Log::logInfo('ChatGroupMassMsgRuleService.chatGroupReceiveDetail', [
  748. 'params' => $requestData,
  749. 'err_msg' => '查询客户群群发未发送状态群主列表为空',
  750. ], 'interface');
  751. return [[], 0];
  752. }
  753. break;
  754. case 1: // 群主已发送
  755. case 3: // 发送失败
  756. $sendLogList = ChatGroupMassMsgLog::where('rule_id', $ruleId)
  757. ->where('status', $status)
  758. ->get();
  759. $chatIdList = $sendLogList->pluck('chat_id')->toArray();
  760. break;
  761. default:
  762. $sendLogList = ChatGroupMassMsgLog::where('rule_id', $ruleId)->get();
  763. break;
  764. }
  765. # 客户群条件查询
  766. $chatGroupQuery = ChatGroup::select(['chat_id', 'name', 'owner'])
  767. ->where('corpid', $corpid)->where('status', 1)->whereIn('owner', $senders)
  768. ->where(function($query) use ($status, $senderList, $chatIdList, $chatGroupName, $notSendSenders) {
  769. if(!is_null($chatGroupName)) $query->where('name', 'like', '%'.$chatGroupName.'%');
  770. if(!is_null($status)) {
  771. switch($status) {
  772. case 1: // 群主已发送
  773. case 3: // 发送失败
  774. $query->whereIn('chat_id', $chatIdList);
  775. break;
  776. case 2: // 群主未发送
  777. $query->whereIn('owner', $notSendSenders);
  778. break;
  779. }
  780. }
  781. if(!is_null($senderList)) $query->whereIn('owner', $senderList);
  782. });
  783. $chatGroupCount = $chatGroupQuery->count();
  784. $chatGroupList = $chatGroupQuery->offset(($page - 1) * $pageSize)
  785. ->limit($pageSize)
  786. ->get();
  787. # 提取本页中群主id以及群聊id,为后面数据拼接做准备
  788. $chatGroupIds = $chatGroupList->pluck('chat_id')->toArray();
  789. $senders = $chatGroupList->pluck('owner')->toArray();
  790. # 群主信息
  791. $userList = DjUser::whereIn('user_id', $senders)->where('corpid', $corpid)->get();
  792. // 查询部门列表
  793. $departmentList = DjDepartment::selectRaw('department_id, name as department_name')
  794. ->where('enable', 1)->where('corpid', $corpid)->get()
  795. ->keyBy('department_id')
  796. ->toArray();
  797. $chatGroupMemberCountList = ChatGroupMember::groupMemberCount($corpid, $chatGroupIds);
  798. # 循环数据处理,将需要的数据拼接在一起
  799. foreach($chatGroupList as &$item) {
  800. # 群主名称
  801. $ownerInfo = $userList->where('user_id', $item->owner)->first();
  802. $item->owner_name = isset($ownerInfo->name) ? $ownerInfo->name : null;
  803. # 群主部门,只展示最后一个
  804. if(isset($ownerInfo->department)){
  805. $departmentIdData = explode(',', $ownerInfo->department);
  806. $departmentId = $departmentIdData[count($departmentIdData)-1];
  807. $item->department_name = isset($departmentList[$departmentId]['department_name']) ?
  808. $departmentList[$departmentId]['department_name'] : '';
  809. } else {
  810. $item->department_name = '';
  811. }
  812. # 群聊人数
  813. $item->chat_member_count = isset($chatGroupMemberCountList[$item->chat_id]) ? $chatGroupMemberCountList[$item->chat_id] : 0;
  814. # 发送状态
  815. if($sendLogList) {
  816. $sendInfo = $sendLogList->where('chat_id', $item->chat_id)->first();
  817. $item->send_status = isset($sendInfo->status) ? $sendInfo->status : 2;
  818. # 发送时间
  819. $item->send_time = isset($sendInfo->send_time) ? $sendInfo->send_time : null;
  820. } else {
  821. $item->send_status = 2;
  822. # 发送时间
  823. $item->send_time = null;
  824. }
  825. }
  826. return [$chatGroupList, $chatGroupCount];
  827. } catch (\Exception $exception) {
  828. Log::logError('ChatGroupMassMsgRuleService.chatGroupReceiveDetail', [
  829. 'params' => $requestData,
  830. 'err_msg' => '客户群群发详情-客户群接收详情响应异常',
  831. 'file' => $exception->getFile(),
  832. 'line' => $exception->getLine(),
  833. 'message' => $exception->getMessage(),
  834. 'trace' => $exception->getTraceAsString()
  835. ], 'interface');
  836. EmailQueue::rPush('客户群群发详情-客户群接收详情响应异常', json_encode([
  837. 'params' => $requestData,
  838. 'file' => $exception->getFile(),
  839. 'line' => $exception->getLine(),
  840. 'message' => $exception->getMessage(),
  841. 'trace' => $exception->getTraceAsString()
  842. ]), ['song.shen@kuxuan-inc.com'], '客户群群发详情-客户群接收详情响应异常');
  843. $errno = 400;
  844. return [[], 0];
  845. }
  846. }
  847. public static function chatGroupReceiveDetailByChat($corpid, $ruleId, $chatGroupName, $senderList, $status, $errno
  848. , $page, $pageSize) {
  849. $sendChatIdList = ChatGroupMassMsgBehavior::where('rule_id', $ruleId)
  850. ->where(function($query) use ($senderList, $status) {
  851. if($senderList) $query->whereIn('sender_id', $senderList);
  852. switch($status) {
  853. case 2:// 群主未发送
  854. $query->where('status', 0);
  855. break;
  856. case 1: // 群主已发送
  857. $query->where('status', 1);
  858. break;
  859. case 3: // 发送失败
  860. $query->where('status', '-1');
  861. break;
  862. default:
  863. break;
  864. }
  865. })->get();
  866. if($sendChatIdList->isEmpty()){
  867. return [[], 0];
  868. }
  869. $senders = $sendChatIdList->pluck('sender_id')->toArray();
  870. $chatGroupIds = $sendChatIdList->pluck('chat_id')->toArray();
  871. # 群主信息
  872. $userList = DjUser::whereIn('user_id', $senders)->where('corpid', $corpid)->get();
  873. // 查询部门列表
  874. $departmentList = DjDepartment::selectRaw('department_id, name as department_name')
  875. ->where('enable', 1)
  876. ->where('corpid', $corpid)
  877. ->get()
  878. ->keyBy('department_id')
  879. ->toArray();
  880. $chatGroupMemberCountList = ChatGroupMember::groupMemberCount($corpid, $chatGroupIds);
  881. $chatGroupQuery = ChatGroup::select('chat_id', 'name', 'owner')
  882. ->where('corpid', $corpid)
  883. ->where('status', 1)
  884. ->whereIn('chat_id', $chatGroupIds)
  885. ->where(function($query) use ($chatGroupName) {
  886. if($chatGroupName) $query->where('name', 'like', '%' . $chatGroupName . '%');
  887. });
  888. $chatGroupCount = $chatGroupQuery->count();
  889. $chatGroupList = $chatGroupQuery->offset(($page - 1) * $pageSize)
  890. ->limit($pageSize)
  891. ->get();
  892. # 循环数据处理,将需要的数据拼接在一起
  893. foreach($chatGroupList as &$item) {
  894. # 群主名称
  895. $ownerInfo = $userList->where('user_id', $item->owner)->first();
  896. $item->owner_name = isset($ownerInfo->name) ? $ownerInfo->name : null;
  897. # 群主部门,只展示最后一个
  898. if(isset($ownerInfo->department)){
  899. $departmentIdData = explode(',', $ownerInfo->department);
  900. $departmentId = $departmentIdData[count($departmentIdData)-1];
  901. $item->department_name = isset($departmentList[$departmentId]['department_name']) ?
  902. $departmentList[$departmentId]['department_name'] : '';
  903. } else {
  904. $item->department_name = '';
  905. }
  906. # 群聊人数
  907. $item->chat_member_count = isset($chatGroupMemberCountList[$item->chat_id]) ? $chatGroupMemberCountList[$item->chat_id] : 0;
  908. # 发送状态
  909. $sendInfo = $sendChatIdList->where('chat_id', $item->chat_id)->first();
  910. $item->send_status = self::getSendStatus($sendInfo->status);
  911. # 发送时间
  912. $item->send_time = isset($sendInfo->click_time) ? $sendInfo->click_time : null;
  913. }
  914. return [$chatGroupList, $chatGroupCount];
  915. }
  916. public static function getSendStatus($status)
  917. {
  918. switch($status){
  919. case 0:
  920. return 2;
  921. case 1:
  922. return 1;
  923. case -1:
  924. return 3;
  925. default:
  926. return 2;
  927. }
  928. }
  929. }