hospital-applets-api/app/Amqp/Consumer/SendSubMessageConsumer.php

157 lines
5.4 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?php
declare(strict_types=1);
namespace App\Amqp\Consumer;
use App\Constants\HttpEnumCode;
use App\Exception\BusinessException;
use App\Model\LogMessagePush;
use App\Model\SubTemplate;
use App\Model\User;
use App\Model\UserDoctor;
use App\Model\UserPatient;
use App\Services\UserService;
use App\Utils\Log;
use Extend\Wechat\Wechat;
use Hyperf\Amqp\Result;
use Hyperf\Amqp\Annotation\Consumer;
use Hyperf\Amqp\Message\ConsumerMessage;
use PhpAmqpLib\Message\AMQPMessage;
use Psr\Container\ContainerExceptionInterface;
use Psr\Container\NotFoundExceptionInterface;
use Symfony\Contracts\HttpClient\Exception\ClientExceptionInterface;
use Symfony\Contracts\HttpClient\Exception\DecodingExceptionInterface;
use Symfony\Contracts\HttpClient\Exception\RedirectionExceptionInterface;
use Symfony\Contracts\HttpClient\Exception\ServerExceptionInterface;
use Symfony\Contracts\HttpClient\Exception\TransportExceptionInterface;
/**
* 发送订阅消息
*/
#[Consumer(exchange: 'amqp.direct', routingKey: 'SendSubMessage', queue: 'send.sub.message.queue', nums: 1)]
class SendSubMessageConsumer extends ConsumerMessage
{
/**
* @param $data
* [
* "push_user_id" // 用户id被推送者
* "template_title" // 推送的模版名称
* "params" => [ // 推送所需的参数
* "page" // 跳转页面
* "data" => [
* "thing1" => [
* "value" => [
* "参数1"
* ]
* ]
* ]
*
* ]
* ]
* @param AMQPMessage $message
* @return string
* @throws ContainerExceptionInterface
* @throws NotFoundExceptionInterface
* @throws ClientExceptionInterface
* @throws DecodingExceptionInterface
* @throws RedirectionExceptionInterface
* @throws ServerExceptionInterface
* @throws TransportExceptionInterface
*/
public function consumeMessage($data, AMQPMessage $message): string
{
try {
// 获取被推送用户信息
$params = array();
$params['user_id'] = $data['push_user_id'];
$user = User::getOne($params);
if (empty($user)){
$this->addMessagePushLog($data,"未查询到被推送用户信息");
return Result::ACK;
}
// 获取open_id
$UserService = new UserService();
$open_id = $UserService->getOpenIdWithUserId($user['user_id'],$user['user_type']);
if (empty($open_id)){
$this->addMessagePushLog($data,"未获取到被推送用户open_id");
return Result::ACK;
}
// 获取订阅消息模版数据
$params = array();
$params['client_type'] = $user['user_type']; // 客户端类型1:患者端 2:医师端 3:药师端)
$params['template_title'] = $data['template_title'];
$sub_template = SubTemplate::getOne($params);
if (empty($sub_template)){
$this->addMessagePushLog($data,"未查询到推送模版id");
return Result::ACK;
}
$sub_template = $sub_template->toArray();
// 处理发送环境
$miniprogram_state = "developer";
if (env("APP_ENV") == "prod"){
$miniprogram_state = "formal";
}
$options = [
"template_id" => $sub_template['wx_template_id'],
"page" => $data['params']['page'],
"touser" => $open_id,
"data" => $data['params']['data'],
"miniprogram_state" => $miniprogram_state,
"lang" => "zh_CN",
];
// 发起推送
$Wechat = new Wechat($user['user_type']);
$result = $Wechat->sendSubscribeMessage($options);
Log::getInstance()->info("订阅消息推送成功:" . $result);
// 记录推送记录
$this->addMessagePushLog($data,"",$sub_template['wx_template_id'],1,json_encode($options,JSON_UNESCAPED_UNICODE));
} catch (\Exception $e) {
$this->addMessagePushLog($data,$e->getMessage());
return Result::ACK;
}
return Result::ACK;
}
/**
* 增加日志
* @param array $params 推送参数
* @param string $wx_template_id 微信推送模版id
* @param int $status 推送状态1:成功 2:失败)
* @param string $fail_reason 推送失败原因
* @param string $content 推送内容
*/
public function addMessagePushLog(array $params,string $fail_reason = '',string $wx_template_id = "",int $status = 2,string $content = '')
{
$data = array();
$data['push_user_id'] = $params['push_user_id'];
$data['template_title'] = $params['template_title'];
if (!empty($wx_template_id)){
$data['wx_template_id'] = $wx_template_id;
}
$data['params'] = json_encode($params,JSON_UNESCAPED_UNICODE);
$data['status'] = $status;
if (!empty($fail_reason)){
$data['fail_reason'] = $fail_reason;
}
if (!empty($content)){
$data['content'] = $content;
}
$log_message_push = LogMessagePush::addLogMessagePush($data);
if (empty($log_message_push)){
Log::getInstance()->error("增加推送日志失败:" . json_encode($data,JSON_UNESCAPED_UNICODE));
}
}
}