From 63a8f2ac62a892722a2878c48d8eed0e6b297c54 Mon Sep 17 00:00:00 2001 From: wucongxing8150 <815046773@qq.com> Date: Tue, 7 May 2024 09:16:26 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E4=BA=86=E6=B5=8B=E8=AF=95?= =?UTF-8?q?=E7=8E=AF=E5=A2=83=E4=B8=B4=E6=97=B6=E9=80=80=E6=AC=BE=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/Controller/TestController.php | 467 ++++++++++++++++++++++++++- app/Services/PatientOrderService.php | 1 + app/Utils/Auth.php | 2 +- config/routes.php | 2 +- 4 files changed, 462 insertions(+), 10 deletions(-) diff --git a/app/Controller/TestController.php b/app/Controller/TestController.php index c209ab5..8435533 100644 --- a/app/Controller/TestController.php +++ b/app/Controller/TestController.php @@ -20,11 +20,19 @@ use App\Model\DoctorConfigHealthPackage; use App\Model\DoctorInquiryTime; use App\Model\HospitalDepartmentCustom; use App\Model\Order; +use App\Model\OrderCoupon; +use App\Model\OrderDetection; +use App\Model\OrderDetectionRefund; use App\Model\OrderInquiryCase; use App\Model\OrderInquiryRefund; use App\Model\OrderPrescriptionProduct; use App\Model\OrderProduct; use App\Model\OrderProductItem; +use App\Model\OrderProductRefund; +use App\Model\OrderRefund; +use App\Model\OrderServicePackage; +use App\Model\OrderServicePackageInquiry; +use App\Model\OrderServicePackageProduct; use App\Model\OrderServicePackageRefund; use App\Model\PatientFamily; use App\Model\ReportRegulatory; @@ -41,8 +49,10 @@ use App\Services\InquiryService; use App\Services\MessagePush; use App\Services\OrderPrescriptionService; use App\Services\OrderProductService; +use App\Services\OrderService; use App\Services\OrderServicePackageService; use App\Services\PatientOrderService; +use App\Services\UserCouponService; use App\Services\UserDoctorService; use App\Utils\Data; use App\Utils\Jwt; @@ -57,11 +67,13 @@ use Extend\RegulatoryPlatform\regulatoryPlatform; use Extend\TencentIm\RecentContact; use Extend\VerifyDun\IdCard; use Extend\Wechat\Wechat; +use Extend\Wechat\WechatPay; use GuzzleHttp\Client; use Hyperf\Amqp\Producer; use Hyperf\Cache\Cache; use Hyperf\DbConnection\Db; use Hyperf\Redis\Redis; +use Hyperf\Snowflake\IdGeneratorInterface; use Hyperf\Utils\ApplicationContext; use Hyperf\Utils\Coroutine\Concurrent; use Intervention\Image\ImageManager; @@ -176,15 +188,8 @@ class TestController extends AbstractController throw new BusinessException("处方药品数据错误4"); } - $OrderPrescriptionService = new OrderPrescriptionService(); - $result = $OrderPrescriptionService->reportPrescription( - $order_inquiry->toArray(), - $order_prescription->toArray(), - $order_prescription_product->toArray(), - $order_product->toArray() - ); - dump($result); + } // 上报监管平台 @@ -466,6 +471,452 @@ class TestController extends AbstractController // 退款 public function refund(){ + $order_no = $this->request->input('order_no'); + Db::beginTransaction(); + try { + // 获取订单数据 + $params = array(); + $params['order_no'] = $order_no; + $order = Order::getOne($params); + if (empty($order)) { + Db::rollBack(); + return fail(HttpEnumCode::HTTP_ERROR, "未查询到对应订单数据"); + } + + // 修改订单为取消 + $data = array(); + $data['cancel_status'] = 1; + $data['cancel_time'] = date("Y-m-d H:i:s", time()); + $data['cancel_remarks'] = "主动取消"; // 取消订单备注 + $data['updated_at'] = date("Y-m-d H:i:s", time()); + + $params = array(); + $params['order_no'] = $order_no; + Order::edit($params, $data); + + // 处理对应订单 + switch ($order['order_type']) { + case 1: // 问诊订单 + // 获取订单数据 + $params = array(); + $params['inquiry_no'] = $order_no; + $order_inquiry = OrderInquiry::getOne($params); + if (empty($order_inquiry)) { + Db::rollBack(); + return fail(HttpEnumCode::HTTP_ERROR, "未查询到对应订单数据"); + } + + // 修改问诊订单为取消 + $data = array(); + $data['inquiry_status'] = 7; + $data['cancel_time'] = date("Y-m-d H:i:s", time()); + $data['cancel_reason'] = 2; // 取消订单原因(1:医生未接诊 2:主动取消 3:无可分配医生 4:客服取消 5:支付超时) + $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); + + break; + case 3: // 检测订单 + // 获取订单数据 + $params = array(); + $params['detection_no'] = $order_no; + $order_detection = OrderDetection::getOne($params); + if (empty($order_detection)) { + Db::rollBack(); + return fail(HttpEnumCode::HTTP_ERROR, "未查询到对应订单数据"); + } + + // 修改检测订单为取消 + $data = array(); + $data['detection_status'] = 5; + $data['cancel_time'] = date("Y-m-d H:i:s", time()); + $data['cancel_reason'] = 1; // 取消订单原因(1:主动取消 2:客服取消 3:支付超时) + $data['updated_at'] = date("Y-m-d H:i:s", time()); + + $params = array(); + $params['order_detection_id'] = $order_detection['order_detection_id']; + OrderDetection::editOrderDetection($params, $data); + + break; + case 4: // 健康包订单 + case 5: // 随访包订单 + // 获取订单数据 + $params = array(); + $params['order_service_no'] = $order_no; + $order_service_package = OrderServicePackage::getOne($params); + if (empty($order_service_package)) { + Db::rollBack(); + return fail(HttpEnumCode::HTTP_ERROR, "未查询到对应订单数据"); + } + + // 修改服务包订单为取消 + $data = array(); + $data['order_service_status'] = 5; + $data['cancel_time'] = date("Y-m-d H:i:s", time()); + $data['cancel_remarks'] = "主动取消"; + $data['updated_at'] = date("Y-m-d H:i:s", time()); + + $params = array(); + $params['order_service_id'] = $order_service_package['order_service_id']; + OrderServicePackage::edit($params, $data); + + // 获取问诊订单数据-此处只会存在一个 + $params = array(); + $params['order_service_id'] = $order_service_package['order_service_id']; + $order_service_package_inquirys = OrderServicePackageInquiry::getList($params); + if (empty($order_service_package_inquirys)){ + Db::rollBack(); + return fail(HttpEnumCode::HTTP_ERROR, "未查询到对应订单数据"); + } + + foreach ($order_service_package_inquirys as $order_service_package_inquiry){ + $params = array(); + $params['inquiry_no'] = $order_service_package_inquiry['inquiry_no']; + $order_inquiry = OrderInquiry::getOne($params); + if (empty($order_inquiry)) { + Db::rollBack(); + return fail(HttpEnumCode::HTTP_ERROR, "未查询到对应订单数据"); + } + + if (in_array($order_inquiry['inquiry_status'], [5, 6 , 7])) { + continue; + } + + if ($order_inquiry['inquiry_refund_status'] == 1) { + // 问诊订单退款状态(0:无退款 1:申请退款 2:退款中 3:退款成功 4:拒绝退款 5:退款关闭) + continue; + } + + if ($order_inquiry['inquiry_refund_status'] == 2) { + // 问诊订单退款状态(0:无退款 1:申请退款 2:退款中 3:退款成功 4:拒绝退款 5:退款关闭) + continue; + } + + // 修改问诊订单为取消 + $data = array(); + $data['inquiry_status'] = 7; + $data['cancel_time'] = date("Y-m-d H:i:s", time()); + $data['cancel_reason'] = 2; // 取消订单原因(1:医生未接诊 2:主动取消 3:无可分配医生 4:客服取消 5:支付超时) + $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); + } + + break; + default: + Db::rollBack(); + return fail(HttpEnumCode::HTTP_ERROR, "未查询到对应订单数据"); + } + + // 检测支付状态,判断是否需要退款处理 + if ($order['pay_status'] == 2 && $order['refund_status'] != 3) { + // 系统退款编号 + $generator = $this->container->get(IdGeneratorInterface::class); + $refund_no = $generator->generate(); + + // 检测订单金额 + if ($order['payment_amount_total'] > 0) { + // 发起退款 + $WechatPay = new WechatPay(1, $order['order_type']); + + $options = array(); + $options['transaction_id'] = $order['escrow_trade_no']; + $options['out_refund_no'] = (string)$refund_no; + $options['reason'] = "主动取消"; + $options['amount'] = [ + 'refund' => (int)round($order['payment_amount_total'] * 100), + 'total' => (int)round($order['payment_amount_total'] * 100), + 'currency' => "CNY", + ]; + + $refund_result = $WechatPay->refund($options); + + // 处理订单退款状态 + // 问诊订单退款状态(0:无退款 1:申请退款 2:退款中 3:退款成功 4:拒绝退款 5:退款关闭) + $success_time = ""; + if ($refund_result['status'] == "SUCCESS") { + // 退款成功 + $refund_status = 3; + $success_time = $refund_result['success_time']; + } elseif ($refund_result['status'] == "CLOSED") { + // 退款关闭 + $refund_status = 5; + } elseif ($refund_result['status'] == "PROCESSING") { + // 退款处理中 + $refund_status = 2; + } elseif ($refund_result['status'] == "ABNORMAL") { + // 退款异常,此情况不处理,进行短信通知 + Db::rollBack(); + return fail(HttpEnumCode::HTTP_ERROR, "订单退款状态异常"); + } else { + Db::rollBack(); + return fail(HttpEnumCode::HTTP_ERROR, "订单退款状态异常"); + } + + $refund_id = $refund_result['refund_id']; + } else { + // 模拟退款 + $refund_status = 3; + + $generator = $this->container->get(IdGeneratorInterface::class); + $refund_id = "模拟退款:" . $generator->generate(); + $success_time = date("Y-m-d H:i:s", time()); + + // 模拟退款时手动退还优惠卷 + if (!empty($order['coupon_amount_total']) && $order['coupon_amount_total'] > 0) { + // 获取该订单全部优惠卷数据 + $params = array(); + $params['order_id'] = $order['order_id']; + $order_coupons = OrderCoupon::getList($params); + if (!empty($order_coupons)) { + $userCouponService = new UserCouponService(); + foreach ($order_coupons as $order_coupon) { + // 退还优惠卷 + $userCouponService->returnUserCoupon($order_coupon['user_coupon_id']); + + // 发送站内消息-优惠卷退还 + $MessagePush = new MessagePush($order_coupon['user_id']); + $MessagePush->patientRefundCoupon($order_coupon['coupon_name']); + } + } + } + } + + // 新增退款表 + $data = array(); + $data['order_id'] = $order['order_id']; + $data['patient_id'] = $order['patient_id']; + $data['order_no'] = $order['order_no']; + $data['refund_no'] = $refund_no; + $data['inquiry_refund_no'] = $refund_no; + $data['refund_id'] = $refund_id; + $data['refund_status'] = $refund_status; + $data['refund_total'] = $order['payment_amount_total']; + $data['refund_reason'] = "主动取消"; + if ($refund_status == 3 && !empty($success_time)) { + $data['success_time'] = date("Y-m-d H:i:s", strtotime($success_time)); // 退款成功时间 + } + $order_refund = OrderRefund::addOrderRefund($data); + if (empty($order_refund)) { + Db::rollBack(); + return fail(HttpEnumCode::HTTP_ERROR, "添加退款表失败"); + } + + switch ($order['order_type']) { + case 1: // 问诊订单 + // 获取订单数据 + $params = array(); + $params['inquiry_no'] = $order_no; + $order_inquiry = OrderInquiry::getOne($params); + if (empty($order_inquiry)) { + Db::rollBack(); + return fail(HttpEnumCode::HTTP_ERROR, "订单数据为空"); + } + + // 新增退款表 + $data = array(); + $data['patient_id'] = $order['patient_id']; + $data['order_inquiry_id'] = $order_inquiry['order_inquiry_id']; + $data['inquiry_no'] = $order_inquiry['inquiry_no']; + $data['inquiry_refund_no'] = $refund_no; + $data['refund_id'] = $refund_id; + $data['inquiry_refund_status'] = $refund_status; + $data['refund_total'] = $order_inquiry['payment_amount_total']; + $data['refund_reason'] = "主动取消"; + if ($refund_status == 3 && !empty($success_time)) { + $data['success_time'] = date("Y-m-d H:i:s", strtotime($success_time)); // 退款成功时间 + } + + $order_inquiry_refund = OrderInquiryRefund::addOrderInquiryRefund($data); + if (empty($order_inquiry_refund)) { + Db::rollBack(); + return fail(HttpEnumCode::HTTP_ERROR, "添加退款表失败"); + } + + // 修改问诊订单表状态 + $data = array(); + $data['inquiry_refund_status'] = $refund_status; + + $params = array(); + $params['order_inquiry_id'] = $order_inquiry['order_inquiry_id']; + OrderInquiry::edit($params, $data); + + break; + case 2: // 药品订单 + // 获取药品订单数据 + $params = array(); + $params['order_product_no'] = $order['order_no']; + $order_product = OrderProduct::getOne($params); + if (empty($order_product)){ + Db::rollBack(); + return fail(HttpEnumCode::HTTP_ERROR, "订单数据为空"); + } + + $data = array(); + $data['patient_id'] = $order_product['patient_id']; + $data['order_product_id'] = $order_product['order_product_id']; + $data['order_product_no'] = $order_product['order_product_no']; + $data['product_refund_no'] = $refund_no; + $data['refund_id'] = $refund_id; + $data['product_refund_status'] = $refund_status; + $data['refund_total'] = $order_product['payment_amount_total']; + $data['refund_reason'] = "主动取消"; + + if ($refund_status == 3 && !empty($success_time)) { + $data['success_time'] = date("Y-m-d H:i:s", strtotime($success_time)); // 退款成功时间 + } + + $order_product_refund = OrderProductRefund::addOrderProductRefund($data); + if (empty($order_product_refund)) { + Db::rollBack(); + return fail(HttpEnumCode::HTTP_ERROR, "添加退款表失败"); + } + + // 修改药品订单表状态 + $data = array(); + $data['refund_status'] = $refund_status; + + $params = array(); + $params['order_product_id'] = $order_product['order_product_id']; + OrderProduct::edit($params,$data); + + // 获取问诊订单数据 + $params = array(); + $params['order_inquiry_id'] = $order_product['order_inquiry_id']; + $order_inquiry = OrderInquiry::getOne($params); + if (empty($order_inquiry)){ + Db::rollBack(); + return fail(HttpEnumCode::HTTP_ERROR, "订单数据为空"); + } + + // 获取订单商品订单列表 + $params = array(); + $params['order_product_id'] = $order_product['order_product_id']; + $order_product_items = OrderProductItem::getList($params); + if (empty($order_product_items)){ + Db::rollBack(); + return fail(HttpEnumCode::HTTP_ERROR, "订单数据为空"); + } + + // 获取患者家庭成员进行中的服务包订单-健康包 + $OrderServicePackageService = new OrderServicePackageService(); + $order_service_package = $OrderServicePackageService->getPatientFamilyInProgressServicePackage($order_inquiry['user_id'],$order_inquiry['family_id'],$order_inquiry['doctor_id'],1); + if (!empty($order_service_package)){ + // 回退服务包已使用药品数量 + foreach ($order_product_items as $order_product_item){ + $params = array(); + $params['order_service_id'] = $order_service_package['order_service_id']; + $params['order_product_id'] = $order_product_item['order_product_id']; + $params['product_item_id'] = $order_product_item['product_item_id']; + $params['product_id'] = $order_product_item['product_id']; + $order_service_package_product = OrderServicePackageProduct::getOne($params); + if (!empty($order_service_package_product)){ + $params = array(); + $params['service_product_id'] = $order_service_package_product['service_product_id']; + + $data = array(); + $data['used_quantity'] = 0; + OrderServicePackageProduct::edit($params,$data); + } + } + } + + break; + case 3: // 检测订单 + // 获取订单数据 + $params = array(); + $params['detection_no'] = $order_no; + $order_detection = OrderDetection::getOne($params); + if (empty($order_detection)) { + Db::rollBack(); + return fail(HttpEnumCode::HTTP_ERROR, "订单数据为空"); + } + + // 新增退款表 + $data = array(); + $data['patient_id'] = $order['patient_id']; + $data['order_detection_id'] = $order_detection['order_detection_id']; + $data['detection_no'] = $order_detection['detection_no']; + $data['detection_refund_no'] = $refund_no; + $data['refund_id'] = $refund_id; + $data['detection_refund_status'] = $refund_status; + $data['refund_total'] = $order_detection['payment_amount_total']; + $data['refund_reason'] = "主动取消"; + if ($refund_status == 3 && !empty($success_time)) { + $data['success_time'] = date("Y-m-d H:i:s", strtotime($success_time)); // 退款成功时间 + } + $order_detection_refund = OrderDetectionRefund::add($data); + if (empty($order_detection_refund)) { + Db::rollBack(); + return fail(HttpEnumCode::HTTP_ERROR, "添加退款表失败"); + } + + // 修改问诊订单表状态 + $data = array(); + $data['detection_refund_status'] = $refund_status; + + $params = array(); + $params['order_detection_id'] = $order_detection['order_detection_id']; + OrderDetection::editOrderDetection($params, $data); + + break; + case 4: // 健康包订单 + case 5: // 随访包订单订单 + // 获取订单数据 + $params = array(); + $params['order_service_no'] = $order_no; + $order_service_package = OrderServicePackage::getOne($params); + if (empty($order_service_package)) { + Db::rollBack(); + return fail(HttpEnumCode::HTTP_ERROR, "订单数据为空"); + } + + // 新增服务包退款表 + $data = array(); + $data['patient_id'] = $order['patient_id']; + $data['order_service_id'] = $order_service_package['order_service_id']; + $data['order_service_no'] = $order_service_package['order_service_no']; + $data['service_refund_no'] = $refund_no; + $data['refund_id'] = $refund_id; + $data['refund_status'] = $refund_status; + $data['refund_total'] = $order_service_package['payment_amount_total']; + $data['refund_reason'] = "主动取消"; + if ($refund_status == 3 && !empty($success_time)) { + $data['success_time'] = date("Y-m-d H:i:s", strtotime($success_time)); // 退款成功时间 + } + $order_service_package_refund = OrderServicePackageRefund::addOrderServicePackageRefund($data); + if (empty($order_service_package_refund)) { + Db::rollBack(); + return fail(HttpEnumCode::HTTP_ERROR, "添加退款表失败"); + } + + // 修改订单表状态 + $data = array(); + $data['refund_status'] = $refund_status; + + $params = array(); + $params['order_service_id'] = $order_service_package['order_service_id']; + OrderServicePackage::edit($params, $data); + + break; + default: + Db::rollBack(); + return fail(HttpEnumCode::HTTP_ERROR, "订单类型错误"); + } + } + + + Db::commit(); + }catch (\Throwable $e){ + Db::rollBack(); + return fail(HttpEnumCode::HTTP_ERROR, $e->getMessage()); + } + + return success(); } } \ No newline at end of file diff --git a/app/Services/PatientOrderService.php b/app/Services/PatientOrderService.php index c31911e..2818f40 100644 --- a/app/Services/PatientOrderService.php +++ b/app/Services/PatientOrderService.php @@ -2718,6 +2718,7 @@ class PatientOrderService extends BaseService $params['order_no'] = $order_no; $order = Order::getOne($params); if (empty($order)) { + Db::rollBack(); return fail(HttpEnumCode::HTTP_ERROR, "非法订单"); } diff --git a/app/Utils/Auth.php b/app/Utils/Auth.php index f559945..0ddcb95 100644 --- a/app/Utils/Auth.php +++ b/app/Utils/Auth.php @@ -38,7 +38,7 @@ class Auth "/popup" => "get", // 获取弹窗数据 "/basic/keyword/search" => "get", // 获取热门搜索关键词 "/test/uninquiry" => "get", // 获取未接诊的医生 - "/test/refund" => "get", // 测试退款 + "/test/refund" => "post", // 测试退款 "/test" => "get", // 测试 "/callback/detection" => "post", // 检测所结果回调 "/callback/video/trtc" => "post", // 音视频回调 diff --git a/config/routes.php b/config/routes.php index 1261d9e..7eb22ce 100644 --- a/config/routes.php +++ b/config/routes.php @@ -897,7 +897,7 @@ Router::addGroup('/test', function () { // // Router::get('/uninquiry', [TestController::class, 'uninquiry']); // 模拟退款 - Router::get('/refund', [TestController::class, 'refund']); + Router::post('/refund', [TestController::class, 'refund']); });