123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131 |
- <?php
- namespace App\Console\Commands;
- use App\Log;
- use App\Models\Es\MassMsgSendDetailEs;
- use App\Models\MassMsg;
- use App\Models\MassMsgRecord;
- use App\RedisModel;
- use App\Service\MassMsgCreateService;
- use App\Service\MaterialService;
- use App\Support\EmailQueue;
- use Illuminate\Console\Command;
- use Illuminate\Support\Facades\DB;
- class MassMsgRetried extends Command
- {
- protected $signature = 'MassMsgRetried';
- protected $description = '对需要执行重试的群发消息进行重发';
- public function handle()
- {
- DB::connection()->disableQueryLog();
- $beginTime = time();
- $this->info(date('m-d H:i:s') . ' 开始整理');
- while(true) {
- $result = $this->msgRetry();
- if(!$result) sleep(1);
- $now = time();
- // 超过10分钟,主动停止循环
- if ($now - $beginTime > 600) {
- break;
- }
- sleep(1);
- }
- $this->info(date('Y-m-d H:i:s') . ' 整理结束');
- }
- private function msgRetry()
- {
- # 取出数据
- $dataJson = RedisModel::rPop(MassMsgRecord::MASS_MSG_RETRIED_RDS);
- if(empty($dataJson))
- return false;
- try {
- $ruleInfo = json_decode($dataJson, true);
- $corpid = $ruleInfo['corpid'];
- $ruleId = $ruleInfo['rule_id'];
- $sender = $ruleInfo['sender'];
- $msgId = $ruleInfo['msg_id'];
- $sendTime = $ruleInfo['send_time'];
- $createTime = $ruleInfo['create_time'];
- $content = $ruleInfo['content'];
- $attachments = $ruleInfo['attachments'];
- # 查询需要重试的客户信息
- $externalUserIdList = MassMsgSendDetailEs::massMsgSendFailUser($ruleId, $sendTime, $corpid, $sender, $msgId, 2);
- if(count($externalUserIdList)) {
- $externalUserIds = array_column($externalUserIdList, 'external_userid');
- # 处理附件内容
- $attachments = MaterialService::radarAttachment($attachments, $corpid, $sender, 2, $ruleId, 1);
- $responseData = MassMsgCreateService::addMsgTemplate($corpid, $externalUserIds, $sender, $content, $attachments, $ruleId);
- Log::logInfo('群发重试返回结果', [
- 'corpid' => $corpid,
- 'sender' => $sender,
- 'response' => $responseData,
- 'rule_id' => $ruleId,
- 'content' => $content,
- 'attachments' => $attachments
- ], 'MassMsgRetried');
- # 群发消息创建成功后逻辑处理
- $status = 1;
- if(isset($responseData['errcode']) && $responseData['errcode']) {
- Log::logError('群发消息创建失败', [
- 'response' => $responseData,
- 'rule_id' => $ruleId,
- 'content' => $content,
- 'attachments' => $attachments
- ], 'MassMsgSend-Fail');
- $status = -1;
- }
- $msgIdNew = isset($responseData['msgid']) ? $responseData['msgid'] : '';
- $errMsg = $responseData['errmsg'] ?? null;
- $result = MassMsgRecord::writeLog(
- $msgIdNew, $corpid, $sendTime, 1, $status, $errMsg, $createTime, $ruleId,
- $sender, $responseData['errcode'], 2, 1, date('Y-m-d H:i:s')
- );
- if(!$result) {
- Log::logError('群发消息记录写入失败', [
- 'response' => $responseData,
- 'rule_info' => $ruleInfo
- ], 'MassMsgRetried');
- }
- if($msgId) {
- $msgRecordInfo = array(
- 'msg_id' => $msgIdNew, 'corpid' => $corpid, 'sender' => $sender,
- 'rule_id' => $ruleId, 'expire_time' => time() + 86400 * 3, 'old_msg_id' => $msgId
- );
- # 加入获取群发成员发送任务结果队列失败
- $result = RedisModel::lPush(MassMsg::MASS_MSG_TASK_STATUS_GET_RDS, json_encode($msgRecordInfo));
- if(!$result) {
- EmailQueue::rPush('加入获取重试群发发送结果队列失败', json_encode($msgRecordInfo, JSON_UNESCAPED_UNICODE), ['xiaohua.hou@kuxuan-inc.com'], '猎羽');
- Log::logError('重试群发信息插入队列失败', $msgRecordInfo, 'MassMsgRetried');
- }
- }
- }
- } catch (\Exception $e) {
- EmailQueue::rPush('创建企业群发流程出现异常', $e->getTraceAsString(), ['xiaohua.hou@kuxuan-inc.com'], '创建企业群发流程出现异常');
- Log::logError('创建企业群发流程出现异常', [
- 'line' => $e->getLine(),
- 'msg' => $e->getMessage(),
- 'param' => $dataJson
- ], 'MassMsgRetried');
- return false;
- }
- return true;
- }
- }
|