123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199 |
- <?php
- /**
- * Created by PhpStorm.
- * User: shensong
- * Date: 2022/11/14
- * Time: 17:08
- */
- namespace App\Service\ChatGroup;
- use App\Log;
- use App\Models\ChatGroupMassMsg;
- use App\Models\ChatGroupMassMsgBehavior;
- use App\Service\MaterialService;
- use App\Support\EmailQueue;
- class ChatGroupMassMsgService
- {
- public static function getChatMessage($params, &$errno)
- {
- try {
- // 查询群发规则
- $massMsgInfo = ChatGroupMassMsg::query()
- ->where('id', $params['rule_id'])
- ->first();
- // 查询对应的商品链接
- $logInfo = ChatGroupMassMsgBehavior::query()
- ->where('rule_id', $params['rule_id'])
- ->where('chat_id', $params['chat_id'])
- ->first();
- # 处理附件内容中的素材ID
- $attachments = json_decode($massMsgInfo['attachments'], true);
- $attachments = MaterialService::mediaIdReplace($attachments, $params['corpid']);
- # 处理包含雷达的附件信息
- $attachments = MaterialService::radarAttachment($attachments, $params['corpid'], $logInfo['sender_id'], 2, $params['rule_id']);
- # 处理附件内容中的链接
- $attachments = MaterialService::itemUrlReplace($attachments, $logInfo['item_url']);
- $attachments = MaterialService::turnToH5($attachments);
- $data = [
- 'text' => [
- 'content' => $massMsgInfo['content']
- ],
- 'attachments' => $attachments,
- 'status' => $logInfo['status'],
- ];
- return $data;
- } catch (\Exception $e) {
- EmailQueue::rPush('客户群群发信息处理成链接类型消息体过程发生异常', $e->getTraceAsString(), [
- 'song.shen@kuxuan-inc.com'],
- '猎羽');
- Log::logError('客户群群发信息处理成链接类型消息体过程发生异常', [
- 'file' => $e->getFile(),
- 'line' => $e->getLine(),
- 'msg' => $e->getMessage(),
- 'trace'=> $e->getTraceAsString(),
- ], 'ChatGroupMassMsgH5Trace');
- $errno = 500;
- return [];
- }
- }
- public static function report($params, &$errno, $type, $errmsg)
- {
- if(1 != $type) {// 非发送成功的情况,记录日志
- Log::logInfo('客户群群发上报记录', array_merge($params, ['type' => $type, 'errmsg' => $errmsg]), 'ChatGroupSendMassMsgReport');
- return ;
- }
- $params['click_time'] = date('Y-m-d H:i:s');
- $log = ChatGroupMassMsgBehavior::query()
- ->where('rule_id', $params['rule_id'])
- ->where('chat_id', $params['chat_id'])
- ->first();
- if(empty($log)){
- EmailQueue::rPush('客户群群发记录信息获取失败', json_encode([
- 'params' => $params
- ], 256), 'song.shen@kuxuan-inc.com', '猎羽');
- $errno = 500;
- return ;
- }
- if(1 == $log->status){
- return ;
- }
- $res = ChatGroupMassMsgBehavior::query()
- ->where('rule_id', $params['rule_id'])
- ->where('chat_id', $params['chat_id'])
- ->update($params);
- # 检测群聊是否全部发送完成
- $count = ChatGroupMassMsgBehavior::query()
- ->where('rule_id', $params['rule_id'])
- ->whereIn('status', [-1, 0])
- ->count();
- if(0 == $count) {
- $status = ChatGroupMassMsg::query()->where('id', $params['rule_id'])->value('enable');
- if(4 != $status){
- # 修改状态为发送完成
- ChatGroupMassMsgRuleService::updateStatus($params['rule_id'], 4);
- }
- }
- return ;
- }
- public static function getRuleSendResult($datum)
- {
- $chatStat = ChatGroupMassMsgBehavior::query()
- ->selectRaw('count(1) as total, sum(if(status = 1, 1, 0)) as success, sum(if(status = 0, 1, 0)) as fail')
- ->where('corpid', $datum->corpid)
- ->where('rule_id', $datum->rule_id)
- ->first();
- $senderTotal = ChatGroupMassMsgBehavior::query()
- ->selectRaw('count(distinct(sender_id)) as total')
- ->where('corpid', $datum->corpid)
- ->where('rule_id', $datum->rule_id)
- ->first();
- $senderSuccess = ChatGroupMassMsgBehavior::query()
- ->selectRaw('count(distinct(sender_id)) as success')
- ->where('corpid', $datum->corpid)
- ->where('rule_id', $datum->rule_id)
- ->where('status', 1)
- ->first();
- $senderFail = ChatGroupMassMsgBehavior::query()
- ->selectRaw('count(distinct(sender_id)) as fail')
- ->where('corpid', $datum->corpid)
- ->where('rule_id', $datum->rule_id)
- ->where('status', 0)
- ->first();
- $data = [
- 'send_chat_total' => $chatStat->total ?? 0, // 群聊总数
- 'send_chat_success' => $chatStat->success ?? 0, // 送达群聊
- 'send_chat_fail' => $chatStat->fail ?? 0, // 未送达群聊
- 'send_user_total' => $senderTotal->total ?? 0, // 群主总数
- 'send_user_success' => $senderSuccess->success ?? 0, // 已发送群主
- 'send_user_fail' => $senderFail->fail ?? 0, // 未发送群主
- ];
- return $data;
- }
- public static function welcomeTemplateAttachmentVerify($attachments) {
- $typeArr = array_keys($attachments);
- # 验证是否只选择了一种附件
- if(count($typeArr) == 0 || count($typeArr) > 1) {
- return 2320; // 仅可选择一种附件类型
- }
- # 每一种附件的格式分别去验证
- $type = $typeArr[0];
- switch ($type) {
- case 'image':
- if(empty($attachments[$type]['media_id'])) {
- return 2322;
- }
- break;
- case 'link':
- case 'promote':
- if(empty($attachments[$type]['title']) || empty($attachments[$type]['url'])) {
- return 2323;
- }
- break;
- case 'miniprogram':
- if(empty($attachments[$type]['title']) || empty($attachments[$type]['pic_media_id'])
- || empty($attachments[$type]['appid']) || empty($attachments[$type]['page'])) {
- return 2324;
- }
- break;
- case 'file':
- case 'video':
- if(empty($attachments[$type]['media_id'])) {
- return 2325;
- }
- break;
- default:
- return 2321;// 附件类型不合法
- break;
- }
- }
- }
|