企微短剧业务系统

MassMsgRetried.php 5.1KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131
  1. <?php
  2. namespace App\Console\Commands;
  3. use App\Log;
  4. use App\Models\Es\MassMsgSendDetailEs;
  5. use App\Models\MassMsg;
  6. use App\Models\MassMsgRecord;
  7. use App\RedisModel;
  8. use App\Service\MassMsgCreateService;
  9. use App\Service\MaterialService;
  10. use App\Support\EmailQueue;
  11. use Illuminate\Console\Command;
  12. use Illuminate\Support\Facades\DB;
  13. class MassMsgRetried extends Command
  14. {
  15. protected $signature = 'MassMsgRetried';
  16. protected $description = '对需要执行重试的群发消息进行重发';
  17. public function handle()
  18. {
  19. DB::connection()->disableQueryLog();
  20. $beginTime = time();
  21. $this->info(date('m-d H:i:s') . ' 开始整理');
  22. while(true) {
  23. $result = $this->msgRetry();
  24. if(!$result) sleep(1);
  25. $now = time();
  26. // 超过10分钟,主动停止循环
  27. if ($now - $beginTime > 600) {
  28. break;
  29. }
  30. sleep(1);
  31. }
  32. $this->info(date('Y-m-d H:i:s') . ' 整理结束');
  33. }
  34. private function msgRetry()
  35. {
  36. # 取出数据
  37. $dataJson = RedisModel::rPop(MassMsgRecord::MASS_MSG_RETRIED_RDS);
  38. if(empty($dataJson))
  39. return false;
  40. try {
  41. $ruleInfo = json_decode($dataJson, true);
  42. $corpid = $ruleInfo['corpid'];
  43. $ruleId = $ruleInfo['rule_id'];
  44. $sender = $ruleInfo['sender'];
  45. $msgId = $ruleInfo['msg_id'];
  46. $sendTime = $ruleInfo['send_time'];
  47. $createTime = $ruleInfo['create_time'];
  48. $content = $ruleInfo['content'];
  49. $attachments = $ruleInfo['attachments'];
  50. # 查询需要重试的客户信息
  51. $externalUserIdList = MassMsgSendDetailEs::massMsgSendFailUser($ruleId, $sendTime, $corpid, $sender, $msgId, 2);
  52. if(count($externalUserIdList)) {
  53. $externalUserIds = array_column($externalUserIdList, 'external_userid');
  54. # 处理附件内容
  55. $attachments = MaterialService::radarAttachment($attachments, $corpid, $sender, 2, $ruleId, 1);
  56. $responseData = MassMsgCreateService::addMsgTemplate($corpid, $externalUserIds, $sender, $content, $attachments, $ruleId);
  57. Log::logInfo('群发重试返回结果', [
  58. 'corpid' => $corpid,
  59. 'sender' => $sender,
  60. 'response' => $responseData,
  61. 'rule_id' => $ruleId,
  62. 'content' => $content,
  63. 'attachments' => $attachments
  64. ], 'MassMsgRetried');
  65. # 群发消息创建成功后逻辑处理
  66. $status = 1;
  67. if(isset($responseData['errcode']) && $responseData['errcode']) {
  68. Log::logError('群发消息创建失败', [
  69. 'response' => $responseData,
  70. 'rule_id' => $ruleId,
  71. 'content' => $content,
  72. 'attachments' => $attachments
  73. ], 'MassMsgSend-Fail');
  74. $status = -1;
  75. }
  76. $msgIdNew = isset($responseData['msgid']) ? $responseData['msgid'] : '';
  77. $errMsg = $responseData['errmsg'] ?? null;
  78. $result = MassMsgRecord::writeLog(
  79. $msgIdNew, $corpid, $sendTime, 1, $status, $errMsg, $createTime, $ruleId,
  80. $sender, $responseData['errcode'], 2, 1, date('Y-m-d H:i:s')
  81. );
  82. if(!$result) {
  83. Log::logError('群发消息记录写入失败', [
  84. 'response' => $responseData,
  85. 'rule_info' => $ruleInfo
  86. ], 'MassMsgRetried');
  87. }
  88. if($msgId) {
  89. $msgRecordInfo = array(
  90. 'msg_id' => $msgIdNew, 'corpid' => $corpid, 'sender' => $sender,
  91. 'rule_id' => $ruleId, 'expire_time' => time() + 86400 * 3, 'old_msg_id' => $msgId
  92. );
  93. # 加入获取群发成员发送任务结果队列失败
  94. $result = RedisModel::lPush(MassMsg::MASS_MSG_TASK_STATUS_GET_RDS, json_encode($msgRecordInfo));
  95. if(!$result) {
  96. EmailQueue::rPush('加入获取重试群发发送结果队列失败', json_encode($msgRecordInfo, JSON_UNESCAPED_UNICODE), ['xiaohua.hou@kuxuan-inc.com'], '猎羽');
  97. Log::logError('重试群发信息插入队列失败', $msgRecordInfo, 'MassMsgRetried');
  98. }
  99. }
  100. }
  101. } catch (\Exception $e) {
  102. EmailQueue::rPush('创建企业群发流程出现异常', $e->getTraceAsString(), ['xiaohua.hou@kuxuan-inc.com'], '创建企业群发流程出现异常');
  103. Log::logError('创建企业群发流程出现异常', [
  104. 'line' => $e->getLine(),
  105. 'msg' => $e->getMessage(),
  106. 'param' => $dataJson
  107. ], 'MassMsgRetried');
  108. return false;
  109. }
  110. return true;
  111. }
  112. }