增加了测试环境临时退款。

This commit is contained in:
wucongxing8150 2024-05-07 09:16:26 +08:00
parent dce334826d
commit 63a8f2ac62
4 changed files with 462 additions and 10 deletions

View File

@ -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();
}
}

View File

@ -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, "非法订单");
}

View File

@ -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", // 音视频回调

View File

@ -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']);
});