企微短剧业务系统

ChatGroupMassMsgService.php 6.8KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199
  1. <?php
  2. /**
  3. * Created by PhpStorm.
  4. * User: shensong
  5. * Date: 2022/11/14
  6. * Time: 17:08
  7. */
  8. namespace App\Service\ChatGroup;
  9. use App\Log;
  10. use App\Models\ChatGroupMassMsg;
  11. use App\Models\ChatGroupMassMsgBehavior;
  12. use App\Service\MaterialService;
  13. use App\Support\EmailQueue;
  14. class ChatGroupMassMsgService
  15. {
  16. public static function getChatMessage($params, &$errno)
  17. {
  18. try {
  19. // 查询群发规则
  20. $massMsgInfo = ChatGroupMassMsg::query()
  21. ->where('id', $params['rule_id'])
  22. ->first();
  23. // 查询对应的商品链接
  24. $logInfo = ChatGroupMassMsgBehavior::query()
  25. ->where('rule_id', $params['rule_id'])
  26. ->where('chat_id', $params['chat_id'])
  27. ->first();
  28. # 处理附件内容中的素材ID
  29. $attachments = json_decode($massMsgInfo['attachments'], true);
  30. $attachments = MaterialService::mediaIdReplace($attachments, $params['corpid']);
  31. # 处理包含雷达的附件信息
  32. $attachments = MaterialService::radarAttachment($attachments, $params['corpid'], $logInfo['sender_id'], 2, $params['rule_id']);
  33. # 处理附件内容中的链接
  34. $attachments = MaterialService::itemUrlReplace($attachments, $logInfo['item_url']);
  35. $attachments = MaterialService::turnToH5($attachments);
  36. $data = [
  37. 'text' => [
  38. 'content' => $massMsgInfo['content']
  39. ],
  40. 'attachments' => $attachments,
  41. 'status' => $logInfo['status'],
  42. ];
  43. return $data;
  44. } catch (\Exception $e) {
  45. EmailQueue::rPush('客户群群发信息处理成链接类型消息体过程发生异常', $e->getTraceAsString(), [
  46. 'song.shen@kuxuan-inc.com'],
  47. '猎羽');
  48. Log::logError('客户群群发信息处理成链接类型消息体过程发生异常', [
  49. 'file' => $e->getFile(),
  50. 'line' => $e->getLine(),
  51. 'msg' => $e->getMessage(),
  52. 'trace'=> $e->getTraceAsString(),
  53. ], 'ChatGroupMassMsgH5Trace');
  54. $errno = 500;
  55. return [];
  56. }
  57. }
  58. public static function report($params, &$errno, $type, $errmsg)
  59. {
  60. if(1 != $type) {// 非发送成功的情况,记录日志
  61. Log::logInfo('客户群群发上报记录', array_merge($params, ['type' => $type, 'errmsg' => $errmsg]), 'ChatGroupSendMassMsgReport');
  62. return ;
  63. }
  64. $params['click_time'] = date('Y-m-d H:i:s');
  65. $log = ChatGroupMassMsgBehavior::query()
  66. ->where('rule_id', $params['rule_id'])
  67. ->where('chat_id', $params['chat_id'])
  68. ->first();
  69. if(empty($log)){
  70. EmailQueue::rPush('客户群群发记录信息获取失败', json_encode([
  71. 'params' => $params
  72. ], 256), 'song.shen@kuxuan-inc.com', '猎羽');
  73. $errno = 500;
  74. return ;
  75. }
  76. if(1 == $log->status){
  77. return ;
  78. }
  79. $res = ChatGroupMassMsgBehavior::query()
  80. ->where('rule_id', $params['rule_id'])
  81. ->where('chat_id', $params['chat_id'])
  82. ->update($params);
  83. # 检测群聊是否全部发送完成
  84. $count = ChatGroupMassMsgBehavior::query()
  85. ->where('rule_id', $params['rule_id'])
  86. ->whereIn('status', [-1, 0])
  87. ->count();
  88. if(0 == $count) {
  89. $status = ChatGroupMassMsg::query()->where('id', $params['rule_id'])->value('enable');
  90. if(4 != $status){
  91. # 修改状态为发送完成
  92. ChatGroupMassMsgRuleService::updateStatus($params['rule_id'], 4);
  93. }
  94. }
  95. return ;
  96. }
  97. public static function getRuleSendResult($datum)
  98. {
  99. $chatStat = ChatGroupMassMsgBehavior::query()
  100. ->selectRaw('count(1) as total, sum(if(status = 1, 1, 0)) as success, sum(if(status = 0, 1, 0)) as fail')
  101. ->where('corpid', $datum->corpid)
  102. ->where('rule_id', $datum->rule_id)
  103. ->first();
  104. $senderTotal = ChatGroupMassMsgBehavior::query()
  105. ->selectRaw('count(distinct(sender_id)) as total')
  106. ->where('corpid', $datum->corpid)
  107. ->where('rule_id', $datum->rule_id)
  108. ->first();
  109. $senderSuccess = ChatGroupMassMsgBehavior::query()
  110. ->selectRaw('count(distinct(sender_id)) as success')
  111. ->where('corpid', $datum->corpid)
  112. ->where('rule_id', $datum->rule_id)
  113. ->where('status', 1)
  114. ->first();
  115. $senderFail = ChatGroupMassMsgBehavior::query()
  116. ->selectRaw('count(distinct(sender_id)) as fail')
  117. ->where('corpid', $datum->corpid)
  118. ->where('rule_id', $datum->rule_id)
  119. ->where('status', 0)
  120. ->first();
  121. $data = [
  122. 'send_chat_total' => $chatStat->total ?? 0, // 群聊总数
  123. 'send_chat_success' => $chatStat->success ?? 0, // 送达群聊
  124. 'send_chat_fail' => $chatStat->fail ?? 0, // 未送达群聊
  125. 'send_user_total' => $senderTotal->total ?? 0, // 群主总数
  126. 'send_user_success' => $senderSuccess->success ?? 0, // 已发送群主
  127. 'send_user_fail' => $senderFail->fail ?? 0, // 未发送群主
  128. ];
  129. return $data;
  130. }
  131. public static function welcomeTemplateAttachmentVerify($attachments) {
  132. $typeArr = array_keys($attachments);
  133. # 验证是否只选择了一种附件
  134. if(count($typeArr) == 0 || count($typeArr) > 1) {
  135. return 2320; // 仅可选择一种附件类型
  136. }
  137. # 每一种附件的格式分别去验证
  138. $type = $typeArr[0];
  139. switch ($type) {
  140. case 'image':
  141. if(empty($attachments[$type]['media_id'])) {
  142. return 2322;
  143. }
  144. break;
  145. case 'link':
  146. case 'promote':
  147. if(empty($attachments[$type]['title']) || empty($attachments[$type]['url'])) {
  148. return 2323;
  149. }
  150. break;
  151. case 'miniprogram':
  152. if(empty($attachments[$type]['title']) || empty($attachments[$type]['pic_media_id'])
  153. || empty($attachments[$type]['appid']) || empty($attachments[$type]['page'])) {
  154. return 2324;
  155. }
  156. break;
  157. case 'file':
  158. case 'video':
  159. if(empty($attachments[$type]['media_id'])) {
  160. return 2325;
  161. }
  162. break;
  163. default:
  164. return 2321;// 附件类型不合法
  165. break;
  166. }
  167. }
  168. }