药品订单取消、创建药品订单

This commit is contained in:
wucongxing8150 2024-04-18 17:19:40 +08:00
parent 95cf4e47d5
commit 98cc84a75d
3 changed files with 235 additions and 99 deletions

View File

@ -108,6 +108,8 @@ class PatientOrderController extends AbstractController
/**
* 药品订单取消支付
* @return ResponseInterface
* @throws ContainerExceptionInterface
* @throws NotFoundExceptionInterface
*/
public function putPatientProductOrderCancelPay(): ResponseInterface
{
@ -147,7 +149,7 @@ class PatientOrderController extends AbstractController
* 模拟支付成功-金额为0时使用
* @return ResponseInterface
* @throws ContainerExceptionInterface
* @throws NotFoundExceptionInterface|GuzzleException
* @throws NotFoundExceptionInterface
*/
public function addPatientOrderPay(): ResponseInterface
{

View File

@ -24,6 +24,7 @@ class PatientOrderRequest extends FormRequest
"order_no"// 订单编号
],
'addPatientOrderPay' => [ // 模拟支付成功-金额为0时使用
"order_type", // 订单类型1:问诊订单 2:药品订单 3:检测订单 4:随访包订单 5:健康包订单)
"order_no"// 订单编号
],
'addPatientProductOrder' => [ // 创建药品订单

View File

@ -6,9 +6,11 @@ use App\Amqp\Producer\AssignDoctorDelayDirectProducer;
use App\Amqp\Producer\CancelUnInquiryOrdersDelayDirectProducer;
use App\Amqp\Producer\CancelUnpayOrdersDelayDirectProducer;
use App\Amqp\Producer\DoctorNotYetInquiryDelayDirectProducer;
use App\Amqp\Producer\GrantUserCouponDelayDirectProducer;
use App\Constants\DoctorTitleCode;
use App\Constants\HttpEnumCode;
use App\Model\BasicLogisticsCompany;
use App\Model\Coupon;
use App\Model\DetectionProject;
use App\Model\DiseaseClass;
use App\Model\DoctorInquiryConfig;
@ -654,6 +656,8 @@ class PatientOrderService extends BaseService
/**
* 药品订单取消支付
* @return array
* @throws ContainerExceptionInterface
* @throws NotFoundExceptionInterface
*/
public function putPatientProductOrderCancelPay(): array
{
@ -661,8 +665,18 @@ class PatientOrderService extends BaseService
$order_product_id = $this->request->route('order_product_id');
Db::beginTransaction();
$redis = $this->container->get(Redis::class);
$redis_key = "order_product_lock_" . $order_product_id;
$redis_lock = $redis->setnx($redis_key, 1);
if (!$redis_lock) {
// 设置失败,表示已经设置该值
return fail(HttpEnumCode::HTTP_SUCCESS, "请您稍后重试");
}
// 设置过期时间
$redis->expire($redis_key, 3);
Db::beginTransaction();
try {
// 获取药品订单数据
$params = array();
@ -1126,123 +1140,242 @@ class PatientOrderService extends BaseService
{
$user_info = $this->request->getAttribute("userInfo") ?? [];
$order_type = $this->request->input('order_type');
$order_no = $this->request->input('order_no');
Db::beginTransaction();
try {
// 问诊订单
$params = array();
$params['inquiry_no'] = $order_no;
$params['patient_id'] = $user_info['client_user_id'];
$order_inquiry = OrderInquiry::getOne($params);
if (empty($order_inquiry)) {
Db::rollBack();
return fail(HttpEnumCode::HTTP_ERROR, "非法订单");
}
switch ($order_type) {
case 1: // 问诊订单
$params = array();
$params['inquiry_no'] = $order_no;
$params['patient_id'] = $user_info['client_user_id'];
$order_inquiry = OrderInquiry::getOne($params);
if (empty($order_inquiry)) {
Db::rollBack();
return fail(HttpEnumCode::HTTP_ERROR, "非法订单");
}
// 获取病例数据
$params = array();
$params['order_inquiry_id'] = $order_inquiry['order_inquiry_id'];
$order_inquiry_case = OrderInquiryCase::getOne($params);
if (empty($order_inquiry_case)) {
Db::rollBack();
return fail(HttpEnumCode::HTTP_ERROR, "患者病例错误");
}
// 获取病例数据
$params = array();
$params['order_inquiry_id'] = $order_inquiry['order_inquiry_id'];
$order_inquiry_case = OrderInquiryCase::getOne($params);
if (empty($order_inquiry_case)) {
Db::rollBack();
return fail(HttpEnumCode::HTTP_ERROR, "患者病例错误");
}
// 验证订单状态
if ($order_inquiry['inquiry_status'] != 1) {
Db::rollBack();
// 问诊订单状态1:待支付 2:待分配 3:待接诊 4:已接诊 5:已完成 6:已结束 7:已取消)
return fail(HttpEnumCode::HTTP_ERROR, "支付失败");
}
// 验证订单状态
if ($order_inquiry['inquiry_status'] != 1) {
// 问诊订单状态1:待支付 2:待分配 3:待接诊 4:已接诊 5:已完成 6:已结束 7:已取消)
Db::rollBack();
return fail(HttpEnumCode::HTTP_ERROR, "支付失败");
}
// 验证支付金额
if ($order_inquiry['payment_amount_total'] != 0) {
Db::rollBack();
return fail(HttpEnumCode::HTTP_ERROR, "支付失败");
}
// 验证支付金额
if ($order_inquiry['payment_amount_total'] != 0) {
Db::rollBack();
return fail(HttpEnumCode::HTTP_ERROR, "支付失败");
}
$generator = $this->container->get(IdGeneratorInterface::class);
$escrow_trade_no = "GD" . $generator->generate(); // 第三方支付流水号
// 修改问诊订单支付状态
$data = array();
$data['inquiry_pay_channel'] = 3; // 支付渠道1:小程序支付 2:微信扫码支付 3:模拟支付)
$data['inquiry_pay_status'] = 2;
if ($order_inquiry['inquiry_type'] == 1 || $order_inquiry['inquiry_type'] == 3) {
// 专家-公益
$data['inquiry_status'] = 3;// 3:待接诊
} elseif ($order_inquiry['inquiry_type'] == 2 || $order_inquiry['inquiry_type'] == 4) {
// 快速-购药
$data['inquiry_status'] = 2;// 2:待分配
}
$generator = $this->container->get(IdGeneratorInterface::class);
$escrow_trade_no = "GD" . $generator->generate(); // 第三方支付流水号
$data['escrow_trade_no'] = $escrow_trade_no;
$data['pay_time'] = date('Y-m-d H:i:s', time());// 支付时间
$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, $data);
// 修改问诊订单支付状态
$data = array();
$data['inquiry_pay_channel'] = 3; // 支付渠道1:小程序支付 2:微信扫码支付 3:模拟支付)
$data['inquiry_pay_status'] = 2;
if ($order_inquiry['inquiry_type'] == 1 || $order_inquiry['inquiry_type'] == 3) {
// 专家-公益
$data['inquiry_status'] = 3;// 3:待接诊
} elseif ($order_inquiry['inquiry_type'] == 2 || $order_inquiry['inquiry_type'] == 4) {
// 快速-购药
$data['inquiry_status'] = 2;// 2:待分配
}
// 修改订单表支付状态
$data = array();
$data['pay_status'] = 2;
$data['pay_time'] = date('Y-m-d H:i:s', time());// 支付时间
$data['escrow_trade_no'] = $escrow_trade_no;
$data['updated_at'] = date('Y-m-d H:i:s', time());
$data['escrow_trade_no'] = $escrow_trade_no;
$data['pay_time'] = date('Y-m-d H:i:s', time());// 支付时间
$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, $data);
$params = array();
$params['order_no'] = $order_inquiry['inquiry_no'];
Order::edit($params,$data);
// 修改订单表支付状态
$data = array();
$data['pay_status'] = 2;
$data['pay_time'] = date('Y-m-d H:i:s', time());// 支付时间
$data['escrow_trade_no'] = $escrow_trade_no;
$data['updated_at'] = date('Y-m-d H:i:s', time());
// 处理队列
if ($order_inquiry['inquiry_type'] == 2 || $order_inquiry['inquiry_type'] == 4) {
// 快速-购药
// 加入分配医生队列
$data = array();
$data['order_inquiry_id'] = $order_inquiry['order_inquiry_id'];
$params = array();
$params['order_no'] = $order_inquiry['inquiry_no'];
Order::edit($params,$data);
$message = new AssignDoctorDelayDirectProducer($data);
$message->setDelayMs(1000 * 5);
$producer = $this->container->get(Producer::class);
$res = $producer->produce($message);
if (!$res) {
// 加入分配医生队列-快速-购药
if ($order_inquiry['inquiry_type'] == 2 || $order_inquiry['inquiry_type'] == 4) {
$data = array();
$data['order_inquiry_id'] = $order_inquiry['order_inquiry_id'];
$message = new AssignDoctorDelayDirectProducer($data);
$message->setDelayMs(1000 * 5);
$producer = $this->container->get(Producer::class);
$res = $producer->produce($message);
if (!$res) {
Db::rollBack();
return fail(HttpEnumCode::HTTP_ERROR, "分配医生失败");
}
}
// 发送首条im消息-专家-公益
if ($order_inquiry['inquiry_type'] == 1 || $order_inquiry['inquiry_type'] == 3) {
// 获取订单医生数据
$params = array();
$params['doctor_id'] = $order_inquiry['doctor_id'];
$user_doctor = UserDoctor::getOne($params);
if (empty($user_doctor)) {
Db::rollBack();
return fail(HttpEnumCode::HTTP_ERROR, "医生数据错误");
}
// 发送im消息
$imService = new ImService();
// 等待医生接诊
$imService->waitDoctorInquiry($order_inquiry, $user_doctor['user_id'], $order_inquiry['user_id']);
// 发送站内、订阅失败发送短信消息-医生有新问诊
$MessagePush = new MessagePush($user_doctor['user_id'], $order_inquiry['order_inquiry_id']);
$MessagePush->doctorHaveNewInquiry();
// 加入xx时间未接诊通知队列
$data = array();
$data['order_inquiry_id'] = $order_inquiry['order_inquiry_id'];
$time = 1000 * 60 * 60 * 2;
$message = new DoctorNotYetInquiryDelayDirectProducer($data);
$message->setDelayMs($time);
$producer = $this->container->get(Producer::class);
$producer->produce($message);
}
break;
case 2: // 药品订单
$params = array();
$params['order_product_no'] = $order_no;
$params['patient_id'] = $user_info['client_user_id'];
$order_product = OrderProduct::getOne($params);
if (empty($order_product)) {
Db::rollBack();
return fail(HttpEnumCode::HTTP_ERROR, "非法订单");
}
// 验证订单状态
if ($order_product['order_product_status'] != 1) {
// 订单状态1:待支付 2:待发货 3:已发货 4:已签收 5:已取消)
Db::rollBack();
return fail(HttpEnumCode::HTTP_ERROR, "支付失败");
}
// 验证支付金额
if ($order_product['payment_amount_total'] != 0) {
Db::rollBack();
return fail(HttpEnumCode::HTTP_ERROR, "支付失败");
}
$generator = $this->container->get(IdGeneratorInterface::class);
$escrow_trade_no = "GD" . $generator->generate(); // 第三方支付流水号
// 修改药品订单支付状态
$data = array();
$data['order_product_status'] = 2;
$data['pay_status'] = 2;
$data['pay_channel'] = 3; // 支付渠道1:小程序支付 2:微信扫码支付 3:模拟支付)
$data['escrow_trade_no'] = $escrow_trade_no;
$data['pay_time'] = date('Y-m-d H:i:s', time());// 支付时间
$data['updated_at'] = date('Y-m-d H:i:s', time());
$params = array();
$params['order_product_id'] = $order_product['order_product_id'];
OrderProduct::edit($params, $data);
// 修改订单表支付状态
$data = array();
$data['pay_status'] = 2;
$data['pay_time'] = date('Y-m-d H:i:s', time());// 支付时间
$data['escrow_trade_no'] = $escrow_trade_no;
$data['updated_at'] = date('Y-m-d H:i:s', time());
$params = array();
$params['order_no'] = $order_product['order_product_no'];
Order::edit($params,$data);
try {
if ($order_product['coupon_amount_total'] > 0){
// 获取药品订单优惠卷数据
$params = array();
$params['order_product_id'] = $order_product['order_product_id'];
$order_product_coupons = OrderProductCoupon::getList($params);
if (!empty($order_product_coupons)){
foreach ($order_product_coupons as $order_product_coupon){
// 获取用户优惠卷数据
$params = array();
$params['user_coupon_id'] = $order_product_coupon['user_coupon_id'];
$user_coupon = UserCoupon::getOne($params);
if (!empty($user_coupon)){
// 获取优惠卷数据
$params = array();
$params['coupon_id'] = $user_coupon['coupon_id'];
$coupon = Coupon::getOne($params);
if (!empty($coupon)){
if ($coupon['reissue_interval_days'] > 0){
$data = array();
$data['coupon_id'] = $coupon['coupon_id'];
$data['user_id'] = $user_coupon['user_id'];
$time = $coupon['reissue_interval_days'] * 24 * 60 * 60 * 1000;
$message = new GrantUserCouponDelayDirectProducer($data);
$message->setDelayMs($time);
$producer = $this->container->get(Producer::class);
$res = $producer->produce($message);
if (!$res) {
Log::getInstance("PatientOrderService-addPatientOrderPay")->error("再次发放优惠卷失败");
}
Log::getInstance("PatientOrderService-addPatientOrderPay")->info("再次发放优惠卷成功");
}
}
}
}
}
}
}catch (\Throwable $e){
// 此处异常不做处理
Log::getInstance("PatientOrderService-addPatientOrderPay")->error($e->getMessage());
}
break;
case 3: // 检测订单
Db::rollBack();
return fail(HttpEnumCode::HTTP_ERROR, "分配医生失败");
}
} elseif ($order_inquiry['inquiry_type'] == 1 || $order_inquiry['inquiry_type'] == 3) {
// 专家-公益发送im消息
// 获取订单医生数据
$params = array();
$params['doctor_id'] = $order_inquiry['doctor_id'];
$user_doctor = UserDoctor::getOne($params);
if (empty($user_doctor)) {
return fail(HttpEnumCode::HTTP_ERROR, "非法订单类型");
break;
case 4: // 健康包订单
Db::rollBack();
return fail(HttpEnumCode::HTTP_ERROR, "医生数据错误");
}
return fail(HttpEnumCode::HTTP_ERROR, "非法订单类型");
// 发送im消息
$imService = new ImService();
break;
case 5: // 随访包订单
// 等待医生接诊
$imService->waitDoctorInquiry($order_inquiry, $user_doctor['user_id'], $order_inquiry['user_id']);
// 发送站内、订阅失败发送短信消息-医生有新问诊
$MessagePush = new MessagePush($user_doctor['user_id'], $order_inquiry['order_inquiry_id']);
$MessagePush->doctorHaveNewInquiry();
// 加入xx时间未接诊通知队列
$data = array();
$data['order_inquiry_id'] = $order_inquiry['order_inquiry_id'];
$time = 1000 * 60 * 60 * 2;
$message = new DoctorNotYetInquiryDelayDirectProducer($data);
$message->setDelayMs($time);
$producer = $this->container->get(Producer::class);
$producer->produce($message);
Db::rollBack();
return fail(HttpEnumCode::HTTP_ERROR, "非法订单类型");
break;
default:
Db::rollBack();
return fail(HttpEnumCode::HTTP_ERROR, "支付失败");
}
Db::commit();
} catch (\Exception $e) {
}catch (\Throwable $e){
Db::rollBack();
return fail(HttpEnumCode::SERVER_ERROR, $e->getMessage());
}