hospital-applets-api/app/Amqp/Consumer/CancelUnInquiryOrdersDelayDirectConsumer.php
2024-05-09 13:35:09 +08:00

271 lines
12 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\Model\Order;
use App\Model\OrderInquiry;
use App\Model\OrderInquiryCoupon;
use App\Model\OrderServicePackage;
use App\Model\OrderServicePackageInquiry;
use App\Model\UserCoupon;
use App\Model\UserDoctor;
use App\Services\ImService;
use App\Services\InquiryService;
use App\Services\MessagePush;
use App\Services\OrderService;
use App\Services\OrderServicePackageService;
use App\Utils\Log;
use App\Utils\Utils;
use Hyperf\Amqp\Message\ConsumerDelayedMessageTrait;
use Hyperf\Amqp\Message\ProducerDelayedMessageTrait;
use Hyperf\Amqp\Message\Type;
use Hyperf\Amqp\Result;
use Hyperf\Amqp\Annotation\Consumer;
use Hyperf\Amqp\Message\ConsumerMessage;
use Hyperf\DbConnection\Db;
use Hyperf\Redis\Redis;
use PhpAmqpLib\Message\AMQPMessage;
use Psr\Container\ContainerExceptionInterface;
use Psr\Container\NotFoundExceptionInterface;
/**
* 取消未接诊问诊订单
*/
#[Consumer(nums: 1)]
class CancelUnInquiryOrdersDelayDirectConsumer extends ConsumerMessage
{
use ProducerDelayedMessageTrait;
use ConsumerDelayedMessageTrait;
protected string $exchange = 'amqp.delay.direct';
protected ?string $queue = 'cancel.uninquiry.orders.delay.queue';
protected string $type = Type::DIRECT; //Type::FANOUT;
protected string|array $routingKey = 'CancelUnInquiryOrders';
/**
* @param $data
* @param AMQPMessage $message
* @return string
*/
public function consumeMessage($data, AMQPMessage $message): string
{
Log::getInstance("queue-CancelUnInquiryOrders")->info(json_encode($data, JSON_UNESCAPED_UNICODE));
try {
// 检测执行次数
$Utils = new Utils();
$redis_key = "orderRefund" . $data['order_inquiry_id'];
$res = $Utils->checkHandleNumber($redis_key);
if (!$res) {
Log::getInstance("queue-CancelUnInquiryOrders")->error("超出最大执行次数或检测错误");
return Result::ACK;
}
}catch (\Throwable $e){
Log::getInstance("queue-CancelUnInquiryOrders")->error($e->getMessage());
return Result::REQUEUE;
}
Db::beginTransaction();
try {
// 获取问诊订单数据
$params = array();
$params['order_inquiry_id'] = $data['order_inquiry_id'];
$order_inquiry = OrderInquiry::getOne($params);
if (empty($order_inquiry)){
Db::rollBack();
Log::getInstance("queue-CancelUnInquiryOrders")->error("未找到对应问诊订单" );
return Result::ACK;
}
// 检测订单状态
if ($order_inquiry['inquiry_status'] == 7) {
// 问诊订单状态1:待支付 2:待分配 3:待接诊 4:已接诊 5:已完成 6:已结束 7:已取消)
Db::rollBack();
Log::getInstance("queue-CancelUnInquiryOrders")->info("订单已取消" );
return Result::ACK;
}
if ($order_inquiry['inquiry_status'] == 4) {
// 问诊订单状态1:待支付 2:待分配 3:待接诊 4:已接诊 5:已完成 6:已结束 7:已取消)
Db::rollBack();
Log::getInstance("queue-CancelUnInquiryOrders")->info("订单已接诊" );
return Result::ACK;
}
if ($order_inquiry['inquiry_status'] != 3) {
// 问诊订单状态1:待支付 2:待分配 3:待接诊 4:已接诊 5:已完成 6:已结束 7:已取消)
Db::rollBack();
Log::getInstance("queue-CancelUnInquiryOrders")->error("订单状态非待接诊" );
return Result::DROP;
}
if (!in_array($order_inquiry['inquiry_refund_status'], [0, 4, 5])) {
// 问诊订单退款状态0:无退款 1:申请退款 2:退款中 3:退款成功 4:拒绝退款 5:退款关闭)
Db::rollBack();
Log::getInstance("queue-CancelUnInquiryOrders")->error("订单正在退款中" );
return Result::DROP;
}
// 取消订单
$order_data = array();
$order_data['cancel_status'] = 1;
$order_data['cancel_time'] = date("Y-m-d H:i:s", time());
$order_data['cancel_remarks'] = "医生未接诊";
$order_data['updated_at'] = date("Y-m-d H:i:s", time());
$params = array();
$params['order_id'] = $order_inquiry['order_id'];
Order::edit($params, $order_data);
// 取消问诊订单
$order_inquiry_data = array();
$order_inquiry_data['inquiry_status'] = 7;
$order_inquiry_data['cancel_time'] = date("Y-m-d H:i:s", time());
$order_inquiry_data['cancel_reason'] = 1; // 取消订单原因1:医生未接诊 2:主动取消 3:无可分配医生 4:客服取消 5:支付超时)
$order_inquiry_data['cancel_remarks'] = "医生未接诊"; // 取消订单备注
$order_inquiry_data['updated_at'] = date("Y-m-d H:i:s", time());
$params = array();
$params['order_inquiry_id'] = $order_inquiry['order_inquiry_id'];
OrderInquiry::edit($params, $order_inquiry_data);
// 订单退款
if ($order_inquiry['inquiry_pay_status'] == 2) {
// 检测问诊订单执行退款次数
$redis_key = "orderRefund" . $order_inquiry['inquiry_no'];
$res = $Utils->checkHandleNumber($redis_key);
if (!$res) {
Db::rollBack();
Log::getInstance("queue-CancelUnInquiryOrders")->error("超出最大退款次数");
return Result::ACK;
}
$OrderService = new OrderService();
$OrderService->orderRefund($order_inquiry['inquiry_no'], "医生未接诊");
}
// 服务包问诊订单处理
if ($order_inquiry['inquiry_type'] == 1){
if ($order_inquiry['inquiry_mode'] == 8 || $order_inquiry['inquiry_mode'] == 9){
$OrderServicePackageService = new OrderServicePackageService();
// 获取服务包订单编号-通过问诊订单id
$order_service_no = $OrderServicePackageService->getOrderServiceNoByOrderInquiryId($order_inquiry['inquiry_no']);
// 检测问诊是否服务包首次问诊
$is_first = $OrderServicePackageService->isFirstInquiryServicePackage($order_service_no);
if ($is_first){
// 取消订单
$order_data = array();
$order_data['cancel_status'] = 1;
$order_data['cancel_time'] = date("Y-m-d H:i:s", time());
$data['cancel_reason'] = 1; // 取消订单原因1:医生未接受服务 2:主动取消 4:客服取消 5:支付超时)
$order_data['cancel_remarks'] = "医生72小时内未接受服务已进行退款处理请注意查看账户信息。";
$order_data['updated_at'] = date("Y-m-d H:i:s", time());
$params = array();
$params['order_no'] = $order_service_no;
Order::edit($params, $order_data);
// 取消服务包订单
$order_service_package_data = array();
$order_service_package_data['order_service_status'] = 5;
$order_service_package_data['cancel_time'] = date("Y-m-d H:i:s", time());
$order_service_package_data['cancel_remarks'] = "医生72小时内未接受服务已进行退款处理请注意查看账户信息。"; // 取消订单备注
$order_service_package_data['updated_at'] = date("Y-m-d H:i:s", time());
$params = array();
$params['order_service_no'] = $order_service_no;
OrderServicePackage::edit($params, $order_service_package_data);
// 如果是服务包的首单问诊订单即执行服务包退款
$OrderService = new OrderService();
$OrderService->orderRefund($order_service_no, "医生72小时内未接受服务已进行退款处理请注意查看账户信息。");
}
}
}
Db::commit();
} catch (\Exception $e) {
Db::rollBack();
Log::getInstance("queue-CancelUnInquiryOrders")->error($e->getMessage());
return Result::REQUEUE;
}
Log::getInstance("queue-CancelUnInquiryOrders")->info("取消未接诊问诊订单成功");
Log::getInstance("queue-CancelUnInquiryOrders")->info("开始发送IM消息");
try {
// 获取订单医生数据
$params = array();
$params['doctor_id'] = $order_inquiry['doctor_id'];
$user_doctor = UserDoctor::getOne($params);
if (empty($user_doctor)) {
Log::getInstance("queue-CancelUnInquiryOrders")->error("医生数据错误");
return Result::ACK;
}
// 发送IM消息-医生未接诊
$imService = new ImService();
$imService->doctorUnInquiry($order_inquiry,$user_doctor['user_id'],$order_inquiry['user_id']);
// 发送IM消息-问诊退款
$imService->inquiryRefund($order_inquiry,$user_doctor['user_id'],$order_inquiry['user_id']);
// 处理服务包情况
if ($order_inquiry['inquiry_mode'] == 8 || $order_inquiry['inquiry_mode'] == 9) {
$OrderServicePackageService = new OrderServicePackageService();
// 获取服务包订单编号-通过问诊订单id
$order_service_no = $OrderServicePackageService->getOrderServiceNoByOrderInquiryId($order_inquiry['inquiry_no']);
// 检测问诊是否服务包首次问诊
$is_first = $OrderServicePackageService->isFirstInquiryServicePackage($order_service_no);
if ($is_first){
// 患者-医生未接受服务包订单
$MessagePush = new MessagePush($order_inquiry['user_id'],$order_inquiry['inquiry_no']);
$MessagePush->patientDoctorNoAcceptServicePackage();
}else{
// 发送站内、订阅消息-患者-医生未接诊
$MessagePush = new MessagePush($order_inquiry['user_id'],$order_inquiry['inquiry_no']);
$MessagePush->patientNoInquiry();
}
}else{
// 发送站内、订阅消息-患者-医生未接诊
$MessagePush = new MessagePush($order_inquiry['user_id'],$order_inquiry['inquiry_no']);
$MessagePush->patientNoInquiry();
}
// 发送站内、订阅消息-医生-超时未接诊
$MessagePush = new MessagePush($user_doctor['user_id'],$order_inquiry['inquiry_no']);
$MessagePush->doctorNoInquiry();
if (!empty($order_inquiry['coupon_amount_total']) && $order_inquiry['coupon_amount_total'] > 0) {
// 获取用户优惠卷信息
$params = array();
$params['order_inquiry_id'] = $order_inquiry['order_inquiry_id'];
$order_inquiry_coupon = OrderInquiryCoupon::getOne($params);
if (!empty($order_inquiry_coupon)){
// 发送站内消息-优惠卷退还
$MessagePush = new MessagePush($order_inquiry['user_id'], $order_inquiry['inquiry_no']);
$MessagePush->patientRefundCoupon($order_inquiry_coupon['coupon_name']);
}
}
Log::getInstance("queue-CancelUnInquiryOrders")->info("发送IM消息成功");
} catch (\Exception $e) {
// 验证失败
Log::getInstance("queue-CancelUnInquiryOrders")->info("发送IM消息失败" . $e->getMessage());
}
return Result::ACK;
}
}