创建服务包订单新增是否怀孕,取消为接诊订单增加服务包问诊订单处理、新增服务包订单退款逻辑处理

This commit is contained in:
wucongxing8150 2024-04-12 09:53:10 +08:00
parent 605a069e07
commit cde261be5d
8 changed files with 675 additions and 76 deletions

View File

@ -8,6 +8,7 @@ use App\Constants\HttpEnumCode;
use App\Model\Order; use App\Model\Order;
use App\Model\OrderInquiry; use App\Model\OrderInquiry;
use App\Model\OrderInquiryCoupon; use App\Model\OrderInquiryCoupon;
use App\Model\OrderServicePackageInquiry;
use App\Model\UserCoupon; use App\Model\UserCoupon;
use App\Model\UserDoctor; use App\Model\UserDoctor;
use App\Services\ImService; use App\Services\ImService;
@ -61,10 +62,11 @@ class CancelUnInquiryOrdersDelayDirectConsumer extends ConsumerMessage
$res = $Utils->checkHandleNumber($redis_key); $res = $Utils->checkHandleNumber($redis_key);
if (!$res) { if (!$res) {
Log::getInstance("queue-CancelUnInquiryOrders")->error("超出最大执行次数或检测错误"); Log::getInstance("queue-CancelUnInquiryOrders")->error("超出最大执行次数或检测错误");
return Result::ACK;
} }
}catch (\Throwable $e){ }catch (\Throwable $e){
Log::getInstance("queue-CancelUnInquiryOrders")->error($e->getMessage()); Log::getInstance("queue-CancelUnInquiryOrders")->error($e->getMessage());
return Result::ACK; return Result::REQUEUE;
} }
Db::beginTransaction(); Db::beginTransaction();
@ -147,6 +149,27 @@ class CancelUnInquiryOrdersDelayDirectConsumer extends ConsumerMessage
$OrderService->orderRefund($order_inquiry['inquiry_no'], "医生未接诊"); $OrderService->orderRefund($order_inquiry['inquiry_no'], "医生未接诊");
} }
// 服务包问诊订单处理
if ($order_inquiry['inquiry_type'] == 1){
if ($order_inquiry['inquiry_mode'] == 8 || $order_inquiry['inquiry_mode'] == 9){
// 获取服务包订单数据
$params = array();
$params['order_inquiry_id'] = $order_inquiry['order_inquiry_id'];
$order_service_package_inquiry = OrderServicePackageInquiry::getList($params);
if (empty($order_service_package_inquiry)){
Db::rollBack();
Log::getInstance("queue-CancelUnInquiryOrders")->error("获取服务包订单数据失败");
return Result::ACK;
}
if (count($order_service_package_inquiry) == 1){
// 首单服务包问诊订单,但问诊订单未接诊,执行服务包退款
$OrderService = new OrderService();
$OrderService->orderRefund($order_service_package_inquiry['order_service_no'], "医生未接诊");
}
}
}
Db::commit(); Db::commit();
} catch (\Exception $e) { } catch (\Exception $e) {
Db::rollBack(); Db::rollBack();

View File

@ -60,11 +60,12 @@ class CancelUnpayOrdersDelayDirectConsumer extends ConsumerMessage
$res = $Utils->checkHandleNumber($redis_key); $res = $Utils->checkHandleNumber($redis_key);
if (!$res) { if (!$res) {
Log::getInstance("queue-CancelUnpayOrders")->error("超出最大执行次数或检测错误"); Log::getInstance("queue-CancelUnpayOrders")->error("超出最大执行次数或检测错误");
return Result::ACK;
} }
}catch (\Throwable $e){ }catch (\Throwable $e){
Log::getInstance("queue-CancelUnpayOrders")->error($e->getMessage()); Log::getInstance("queue-CancelUnpayOrders")->error($e->getMessage());
return Result::ACK; return Result::REQUEUE;
} }
Db::beginTransaction(); Db::beginTransaction();

View File

@ -2690,6 +2690,13 @@ class CallBackController extends AbstractController
} }
} }
// 是否备孕、妊娠、哺乳期0:否 1:是)
if (array_key_exists("is_pregnant", $order_service_package_case)) {
if ($order_service_package_case['is_pregnant'] !== null) {
$data['is_pregnant'] = $order_service_package_case['is_pregnant']; // 是否备孕、妊娠、哺乳期0:否 1:是)
}
}
$order_inquiry_case = OrderInquiryCase::addOrderInquiryCase($data); $order_inquiry_case = OrderInquiryCase::addOrderInquiryCase($data);
if (empty($order_inquiry_case)) { if (empty($order_inquiry_case)) {
Db::rollBack(); Db::rollBack();

View File

@ -58,7 +58,7 @@ class OrderServicePackageController extends AbstractController
$request->scene('addServiceInquiryOrder')->validateResolved(); $request->scene('addServiceInquiryOrder')->validateResolved();
$OrderServicePackageService = new OrderServicePackageService(); $OrderServicePackageService = new OrderServicePackageService();
$data = $OrderServicePackageService->addPatientServiceOrder(); $data = $OrderServicePackageService->addServiceInquiryOrder();
return $this->response->json($data); return $this->response->json($data);
} }

View File

@ -0,0 +1,81 @@
<?php
declare(strict_types=1);
namespace App\Model;
use Carbon\Carbon;
use Hyperf\Database\Model\Collection;
use Hyperf\Snowflake\Concern\Snowflake;
/**
* @property int $service_inquiry_id 主键id
* @property int $order_service_id 订单-服务包id
* @property int $order_inquiry_id 订单-问诊id
* @property string $order_service_no 服务包系统订单编号
* @property string $inquiry_no 问诊系统订单编号
* @property int $inquiry_status 问诊订单状态1:待支付 2:待分配 3:待接诊 4:已接诊 5:已完成 6:已结束 7:已取消)
* @property Carbon $created_at 创建时间
* @property Carbon $updated_at 修改时间
*/
class OrderServicePackageInquiry extends Model
{
use Snowflake;
/**
* The table associated with the model.
*/
protected ?string $table = 'order_service_package_inquiry';
/**
* The attributes that are mass assignable.
*/
protected array $fillable = ['service_inquiry_id', 'order_service_id', 'order_inquiry_id', 'order_service_no', 'inquiry_no', 'inquiry_status', 'created_at', 'updated_at'];
protected string $primaryKey = "service_inquiry_id";
/**
* 获取信息-单条
* @param array $params
* @param array $fields
* @return object|null
*/
public static function getOne(array $params, array $fields = ['*']): object|null
{
return self::where($params)->first($fields);
}
/**
* 多条
* @param array $params
* @param array $fields
* @return Collection|array
*/
public static function getList(array $params, array $fields = ['*']): Collection|array
{
return self::where($params)->get($fields);
}
/**
* 新增
* @param array $data
* @return OrderServicePackageInquiry|\Hyperf\Database\Model\Model
*/
public static function addOrderServicePackageInquiry(array $data): \Hyperf\Database\Model\Model|OrderServicePackageInquiry
{
return self::create($data);
}
/**
* 修改
* @param array $params
* @param array $data
* @return int
*/
public static function edit(array $params = [], array $data = []): int
{
return self::where($params)->update($data);
}
}

View File

@ -2127,7 +2127,7 @@ class InquiryService extends BaseService
/** /**
* 获取患者在某一时间段的服务包问诊订单-创建时间 * 获取患者在某一时间段的服务包问诊订单-创建时间
* @param string|int $order_service_type * @param string|int $order_service_type 服务包类型1:健康包 2:随访包)
* @param string $patient_id * @param string $patient_id
* @param string $doctor_id * @param string $doctor_id
* @param string $start_date * @param string $start_date

View File

@ -97,9 +97,13 @@ class OrderService extends BaseService
$result = $OrderProductService->cancelUnpayProductOrder($order['order_no'], $cancel_reason, $cancel_remarks); $result = $OrderProductService->cancelUnpayProductOrder($order['order_no'], $cancel_reason, $cancel_remarks);
} elseif ($order['order_type'] == 3) { } elseif ($order['order_type'] == 3) {
// 检测订单 // 检测订单
$DetectionService = new DetectionService();
$result = $DetectionService->cancelUnpayDetectionOrder($order['order_no'], $cancel_reason, $cancel_remarks);
} elseif ($order['order_type'] == 4 ||$order['order_type'] == 5 ) {
// 服务包订单
$OrderServicePackageService = new OrderServicePackageService(); $OrderServicePackageService = new OrderServicePackageService();
$result = $OrderServicePackageService->cancelUnpayServiceOrder($order['order_no'], $cancel_reason, $cancel_remarks); $result = $OrderServicePackageService->cancelUnpayServiceOrder($order['order_no'], $cancel_reason, $cancel_remarks);
}else{ } else{
$result['status'] = 0; $result['status'] = 0;
$result['message'] = "订单类型错误"; $result['message'] = "订单类型错误";
} }
@ -162,6 +166,9 @@ class OrderService extends BaseService
} elseif ($order['order_type'] == 3) { } elseif ($order['order_type'] == 3) {
// 检测检测订单可退款状态 // 检测检测订单可退款状态
$this->checkOrderDetectionStatusForRefund($order['order_no']); $this->checkOrderDetectionStatusForRefund($order['order_no']);
} elseif ($order['order_type'] == 4 || $order['order_type'] == 5) {
// 检测服务包订单可退款状态
$this->checkOrderServiceStatusForRefund($order['order_no']);
} else { } else {
throw new BusinessException("订单类型错误"); throw new BusinessException("订单类型错误");
} }
@ -375,11 +382,46 @@ class OrderService extends BaseService
$params['order_detection_id'] = $order_detection['order_detection_id']; $params['order_detection_id'] = $order_detection['order_detection_id'];
OrderDetection::editOrderDetection($params, $data); OrderDetection::editOrderDetection($params, $data);
break;
case 4: // 服务包订单
// 获取订单数据
$params = array();
$params['order_service_no'] = $order_no;
$order_service_package = OrderServicePackage::getOne($params);
if (empty($order_service_package)) {
throw new BusinessException("订单数据为空");
}
// 新增退款表
$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['detection_refund_status'] = $refund_status;
$data['refund_total'] = $order_service_package['payment_amount_total'];
$data['refund_reason'] = $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)) {
throw new BusinessException("添加退款表失败");
}
// 修改问诊订单表状态
$data = array();
$data['refund_status'] = $refund_status;
$params = array();
$params['order_service_id'] = $order_service_package['order_service_id'];
OrderServicePackage::edit($params, $data);
break; break;
default: default:
throw new BusinessException("订单类型错误"); throw new BusinessException("订单类型错误");
} }
} catch (\Throwable $e) { } catch (\Throwable $e) {
throw new BusinessException($e->getMessage()); throw new BusinessException($e->getMessage());
} }
@ -637,7 +679,7 @@ class OrderService extends BaseService
} }
// 检测问诊订单状态 // 检测问诊订单状态
if (!in_array($order_detection['detection_status'], [2, 5])) { if (!in_array($order_detection['detection_status'], [2, 3])) {
// 检测订单状态(1:待支付 2:待绑定 3:检测中 4:检测完成 5:已取消) // 检测订单状态(1:待支付 2:待绑定 3:检测中 4:检测完成 5:已取消)
throw new BusinessException("订单状态错误"); throw new BusinessException("订单状态错误");
} }
@ -654,4 +696,37 @@ class OrderService extends BaseService
throw new BusinessException("订单支付状态错误"); throw new BusinessException("订单支付状态错误");
} }
} }
/**
* 检测服务包订单可退款状态
* @param string $order_no
*/
public function checkOrderServiceStatusForRefund(string $order_no): void
{
// 获取订单数据
$params = array();
$params['order_service_no'] = $order_no;
$order_service_package = OrderServicePackage::getOne($params);
if (empty($order_service_package)) {
throw new BusinessException("订单数据为空");
}
// 检测问诊订单状态
if (!in_array($order_service_package['order_service_status'], [2, 3])) {
// 订单状态1:待支付 2:未开始 3:服务中 4:服务完成 5:服务取消)
throw new BusinessException("订单状态错误");
}
// 检测订单退款状态
if (in_array($order_service_package['refund_status'], [2, 3, 5, 6])) {
// 检测订单退款状态0:无退款 1:申请退款 2:退款中 3:退款成功 4:拒绝退款 5:退款关闭 6:退款异常)
throw new BusinessException("订单退款状态错误");
}
// 检测支付状态
if ($order_service_package['pay_status'] != 2) {
// 支付状态1:未支付 2:已支付 3:支付中 4:支付失败 5:支付超时 6:支付关闭 7:已撤销 8:转入退款)
throw new BusinessException("订单支付状态错误");
}
}
} }

View File

@ -5,10 +5,13 @@ namespace App\Services;
use App\Amqp\Producer\CancelUnInquiryOrdersDelayDirectProducer; use App\Amqp\Producer\CancelUnInquiryOrdersDelayDirectProducer;
use App\Amqp\Producer\CancelUnpayOrdersDelayDirectProducer; use App\Amqp\Producer\CancelUnpayOrdersDelayDirectProducer;
use App\Constants\HttpEnumCode; use App\Constants\HttpEnumCode;
use App\Exception\BusinessException;
use App\Model\DiseaseClass; use App\Model\DiseaseClass;
use App\Model\DoctorConfigFollowPackage; use App\Model\DoctorConfigFollowPackage;
use App\Model\DoctorConfigFollowPackageItem; use App\Model\DoctorConfigFollowPackageItem;
use App\Model\DoctorConfigHealthPackage; use App\Model\DoctorConfigHealthPackage;
use App\Model\DoctorInquiryConfig;
use App\Model\HealthPackage;
use App\Model\InquiryCaseProduct; use App\Model\InquiryCaseProduct;
use App\Model\Order; use App\Model\Order;
use App\Model\OrderCoupon; use App\Model\OrderCoupon;
@ -48,8 +51,8 @@ class OrderServicePackageService extends BaseService
$service_type = $this->request->input("service_type");// 服务包类型 1健康 2随访 $service_type = $this->request->input("service_type");// 服务包类型 1健康 2随访
$follow_package_item_id = $this->request->input("follow_package_item_id"); $follow_package_item_id = $this->request->input("follow_package_item_id");
if ($service_type == 2){ if ($service_type == 2) {
if (empty($follow_package_item_id)){ if (empty($follow_package_item_id)) {
return fail(); return fail();
} }
} }
@ -69,20 +72,21 @@ class OrderServicePackageService extends BaseService
return fail(HttpEnumCode::HTTP_ERROR, "患者信息错误"); return fail(HttpEnumCode::HTTP_ERROR, "患者信息错误");
} }
if ($service_type == 1){ if ($service_type == 1) {
$inquiry_mode = 8; $inquiry_mode = 8;
}else{ } else {
$inquiry_mode = 9; $inquiry_mode = 9;
} }
// 检测是否存在同类型未完成的问诊订单 // 检测是否存在同类型未完成的问诊订单
$PatientOrderService = new PatientOrderService(); $PatientOrderService = new PatientOrderService();
$order_inquiry_id = $PatientOrderService->getNotFinishedOrderInquiry(1,$inquiry_mode,$user_info['client_user_id']); $order_inquiry_id = $PatientOrderService->getNotFinishedOrderInquiry(1, $inquiry_mode, $user_info['client_user_id']);
if (!empty($order_inquiry_id)) { if (!empty($order_inquiry_id)) {
// 获取问诊订单数据 // 获取问诊订单数据
$params = array(); $params = array();
$params['order_inquiry_id'] = $order_inquiry_id; $params['order_inquiry_id'] = $order_inquiry_id;
$order_inquiry = OrderInquiry::getOne($params); $order_inquiry = OrderInquiry::getOne($params);
if (empty($order_inquiry)){ if (empty($order_inquiry)) {
return fail(HttpEnumCode::SERVER_ERROR); return fail(HttpEnumCode::SERVER_ERROR);
} }
@ -110,22 +114,22 @@ class OrderServicePackageService extends BaseService
$params['family_id'] = $family_id; $params['family_id'] = $family_id;
$params['order_service_type'] = $service_type; $params['order_service_type'] = $service_type;
$order_service_status = ['1','2','3']; $order_service_status = ['1', '2', '3'];
$order_service_package = OrderServicePackage::getStatusOne($params,$order_service_status); $order_service_package = OrderServicePackage::getStatusOne($params, $order_service_status);
if (empty($order_service_package)){ if (empty($order_service_package)) {
$result['message'] = "未购买"; $result['message'] = "未购买";
return success($result); return success($result);
} }
// 检测服务包订单订单状态 // 检测服务包订单订单状态
if ($order_service_package['order_service_status'] == 1){ if ($order_service_package['order_service_status'] == 1) {
$result['status'] = 2; $result['status'] = 2;
$result['message'] = "存在未支付订单"; $result['message'] = "存在未支付订单";
$result['data']['order_no'] = $order_service_package['order_service_no']; $result['data']['order_no'] = $order_service_package['order_service_no'];
return success($result); return success($result);
} }
if ($order_service_package['order_service_status'] == 2){ if ($order_service_package['order_service_status'] == 2) {
$result['status'] = 2; $result['status'] = 2;
$result['message'] = "您已购买该服务包,请耐心等待医生接诊"; $result['message'] = "您已购买该服务包,请耐心等待医生接诊";
$result['data']['order_no'] = $order_service_package['order_service_no']; $result['data']['order_no'] = $order_service_package['order_service_no'];
@ -136,32 +140,32 @@ class OrderServicePackageService extends BaseService
$params = array(); $params = array();
$params['order_service_no'] = $order_service_package['order_service_no']; $params['order_service_no'] = $order_service_package['order_service_no'];
$order_service_package_detail = OrderServicePackageDetail::getOne($params); $order_service_package_detail = OrderServicePackageDetail::getOne($params);
if (empty($order_service_package_detail)){ if (empty($order_service_package_detail)) {
return fail(HttpEnumCode::SERVER_ERROR); return fail(HttpEnumCode::SERVER_ERROR);
} }
// 检测随访包 // 检测随访包
if ($service_type == 2){ if ($service_type == 2) {
// 检测服务周期是否相同,相同表示购买的同一个随访包 // 检测服务周期是否相同,相同表示购买的同一个随访包
$params = array(); $params = array();
$params['follow_package_item_id'] = $follow_package_item_id; $params['follow_package_item_id'] = $follow_package_item_id;
$doctor_config_follow_package_item = DoctorConfigFollowPackageItem::getOne($params); $doctor_config_follow_package_item = DoctorConfigFollowPackageItem::getOne($params);
if (empty($doctor_config_follow_package_item)){ if (empty($doctor_config_follow_package_item)) {
return fail(HttpEnumCode::HTTP_ERROR,"随访包选择错误"); return fail(HttpEnumCode::HTTP_ERROR, "随访包选择错误");
} }
$params = array(); $params = array();
$params['follow_package_id'] = $doctor_config_follow_package_item['follow_package_id']; $params['follow_package_id'] = $doctor_config_follow_package_item['follow_package_id'];
$params['doctor_id'] = $doctor_id; $params['doctor_id'] = $doctor_id;
$doctor_config_follow_package = DoctorConfigFollowPackage::getOne($params); $doctor_config_follow_package = DoctorConfigFollowPackage::getOne($params);
if (empty($doctor_config_follow_package)){ if (empty($doctor_config_follow_package)) {
return fail(HttpEnumCode::HTTP_ERROR,"随访包选择错误"); return fail(HttpEnumCode::HTTP_ERROR, "随访包选择错误");
} }
} }
// 处理问诊次数 // 处理问诊次数
// 3.5号购买每月2次问诊次数。今天5.3,属于第几个月,这个月的开始时间和结束时间 // 3.5号购买每月2次问诊次数。今天5.3,属于第几个月,这个月的开始时间和结束时间
if ($order_service_package_detail['monthly_frequency'] != 0){ if ($order_service_package_detail['monthly_frequency'] != 0) {
$month_inquiry_count = 0; // 当前所属月问诊次数 $month_inquiry_count = 0; // 当前所属月问诊次数
// 获取当月问诊次数 // 获取当月问诊次数
@ -179,12 +183,12 @@ class OrderServicePackageService extends BaseService
$start_date = date('Y-m-d 00:00:00', strtotime($end_date . "-30 days")); $start_date = date('Y-m-d 00:00:00', strtotime($end_date . "-30 days"));
$InquiryService = new InquiryService(); $InquiryService = new InquiryService();
$order_inquiry = $InquiryService->getPatientServiceInquiry($service_type,$user_info['client_user_id'],$doctor_id,$start_date,$end_date); $order_inquiry = $InquiryService->getPatientServiceInquiry($service_type, $user_info['client_user_id'], $doctor_id, $start_date, $end_date);
if (!empty($order_inquiry)){ if (!empty($order_inquiry)) {
$month_inquiry_count = count($order_inquiry); $month_inquiry_count = count($order_inquiry);
} }
if ($month_inquiry_count >= $order_service_package_detail['monthly_frequency']){ if ($month_inquiry_count >= $order_service_package_detail['monthly_frequency']) {
// 超出当月问诊次数 // 超出当月问诊次数
$result['status'] = 3; $result['status'] = 3;
$result['message'] = "超出服务包所包含的当月问诊次数"; $result['message'] = "超出服务包所包含的当月问诊次数";
@ -218,6 +222,12 @@ class OrderServicePackageService extends BaseService
$user_info = $this->request->getAttribute("userInfo") ?? []; $user_info = $this->request->getAttribute("userInfo") ?? [];
$request_params = $this->request->all(); $request_params = $this->request->all();
// 检测参数
if ($request_params['service_type'] == 2) {
if (empty($request_params['follow_package_item_id'])) {
return fail(HttpEnumCode::CLIENT_HTTP_ERROR);
}
}
// 检测家庭成员是否存在 // 检测家庭成员是否存在
$params = array(); $params = array();
$params['family_id'] = $request_params['family_id']; $params['family_id'] = $request_params['family_id'];
@ -230,13 +240,13 @@ class OrderServicePackageService extends BaseService
// 检测是否存在同类型未完成的问诊订单 // 检测是否存在同类型未完成的问诊订单
$PatientOrderService = new PatientOrderService(); $PatientOrderService = new PatientOrderService();
$order_inquiry_id = $PatientOrderService->getNotFinishedOrderInquiry($request_params['inquiry_type'],$request_params['inquiry_mode'],$user_info['client_user_id']); $order_inquiry_id = $PatientOrderService->getNotFinishedOrderInquiry($request_params['inquiry_type'], $request_params['inquiry_mode'], $user_info['client_user_id']);
if (!empty($order_inquiry_id)) { if (!empty($order_inquiry_id)) {
// 获取问诊订单数据 // 获取问诊订单数据
$params = array(); $params = array();
$params['order_inquiry_id'] = $order_inquiry_id; $params['order_inquiry_id'] = $order_inquiry_id;
$order_inquiry = OrderInquiry::getOne($params); $order_inquiry = OrderInquiry::getOne($params);
if (empty($order_inquiry)){ if (empty($order_inquiry)) {
return fail(HttpEnumCode::SERVER_ERROR); return fail(HttpEnumCode::SERVER_ERROR);
} }
@ -287,7 +297,7 @@ class OrderServicePackageService extends BaseService
$inquiry_pay_channel = 1; $inquiry_pay_channel = 1;
} elseif ($request_params['client_type'] == 2) { } elseif ($request_params['client_type'] == 2) {
$inquiry_pay_channel = 2; $inquiry_pay_channel = 2;
}else{ } else {
return fail(HttpEnumCode::HTTP_ERROR, "支付方式错误"); return fail(HttpEnumCode::HTTP_ERROR, "支付方式错误");
} }
@ -315,18 +325,18 @@ class OrderServicePackageService extends BaseService
$params['family_id'] = $request_params['family_id']; $params['family_id'] = $request_params['family_id'];
$params['order_service_type'] = $request_params['service_type']; $params['order_service_type'] = $request_params['service_type'];
$order_service_status = ['1','2','3']; $order_service_status = ['1', '2', '3'];
$order_service_package = OrderServicePackage::getStatusOne($params,$order_service_status); $order_service_package = OrderServicePackage::getStatusOne($params, $order_service_status);
if (!empty($order_service_package)){ if (!empty($order_service_package)) {
// 检测服务包订单订单状态 // 检测服务包订单订单状态
if ($order_service_package['order_service_status'] == 1){ if ($order_service_package['order_service_status'] == 1) {
$result['status'] = 2; $result['status'] = 2;
$result['message'] = "存在未支付订单"; $result['message'] = "存在未支付订单";
$result['data']['order_no'] = (string)$order_service_package['order_service_no']; $result['data']['order_no'] = (string)$order_service_package['order_service_no'];
return success($result); return success($result);
} }
if ($order_service_package['order_service_status'] == 2){ if ($order_service_package['order_service_status'] == 2) {
$result['status'] = 2; $result['status'] = 2;
$result['message'] = "您已购买该服务包,请耐心等待医生接诊"; $result['message'] = "您已购买该服务包,请耐心等待医生接诊";
$result['data']['order_no'] = (string)$order_service_package['order_service_no']; $result['data']['order_no'] = (string)$order_service_package['order_service_no'];
@ -334,68 +344,113 @@ class OrderServicePackageService extends BaseService
} }
} }
// 检测随访包是否存在 // 获取医生图文问诊价格
if ($request_params['service_type'] == 2){ $params = array();
if (empty($request_params['follow_package_item_id'])){ $params['doctor_id'] = $order_service_package['doctor_id'];
return fail(HttpEnumCode::SERVER_ERROR, "订单创建失败"); $params['inquiry_type'] = 1;
$params['inquiry_mode'] = 1;
$doctor_inquiry_config = DoctorInquiryConfig::getOne($params);
if (empty($doctor_inquiry_config)){
return fail(HttpEnumCode::HTTP_ERROR, "订单创建失败");
}
$service_price = 0; // 订单金额
$service_period = null; // 服务周期(天)
$service_count = null; // 总服务次数0表示不限次
$monthly_frequency = null; // 每月次数0表示不限次
$single_inquiry_price = null; // 单次图文问诊价格
// 健康包
if ($request_params['service_type'] == 1) {
// 健康包
$params = array();
$params['doctor_id'] = $request_params['doctor_id'];
$doctor_config_health_package = DoctorConfigHealthPackage::getOne($params);
if (empty($doctor_config_health_package)) {
return fail(HttpEnumCode::HTTP_ERROR, "订单创建失败");
} }
$params = array();
$params['package_id'] = $doctor_config_health_package['package_id'];
$health_package = HealthPackage::getOne($params);
if (empty($health_package)){
throw new BusinessException("创建订单失败");
}
// 订单金额
$service_price = $doctor_config_health_package['service_price'];
// 服务周期(天)
$service_period = 90;
// 总服务次数0表示不限次
$service_count = $health_package['service_count'];
// 每月次数0表示不限次
$monthly_frequency = $health_package['monthly_frequency'];
// 单次图文问诊价格
$single_inquiry_price = $doctor_inquiry_config['inquiry_price'];
}
// 随访包
if ($request_params['service_type'] == 2) {
$params = array(); $params = array();
$params['follow_package_item_id'] = $request_params['follow_package_item_id']; $params['follow_package_item_id'] = $request_params['follow_package_item_id'];
$doctor_config_follow_package_item = DoctorConfigFollowPackageItem::getOne($params); $doctor_config_follow_package_item = DoctorConfigFollowPackageItem::getOne($params);
if (empty($doctor_config_follow_package_item)){ if (empty($doctor_config_follow_package_item)) {
return fail(HttpEnumCode::HTTP_ERROR,"随访包选择错误"); return fail(HttpEnumCode::HTTP_ERROR, "随访包选择错误");
} }
$params = array(); $params = array();
$params['follow_package_id'] = $doctor_config_follow_package_item['follow_package_id']; $params['follow_package_id'] = $doctor_config_follow_package_item['follow_package_id'];
$params['doctor_id'] = $request_params['doctor_id']; $params['doctor_id'] = $request_params['doctor_id'];
$doctor_config_follow_package = DoctorConfigFollowPackage::getOne($params); $doctor_config_follow_package = DoctorConfigFollowPackage::getOne($params);
if (empty($doctor_config_follow_package)){ if (empty($doctor_config_follow_package)) {
return fail(HttpEnumCode::HTTP_ERROR,"随访包选择错误"); return fail(HttpEnumCode::HTTP_ERROR, "随访包选择错误");
}
}
// 处理订单金额
$service_price = 0;
if ($request_params['service_type'] == 1){
// 健康包
$params = array();
$params['doctor_id'] = $request_params['doctor_id'];
$doctor_config_health_package = DoctorConfigHealthPackage::getOne($params);
if (empty($doctor_config_health_package)){
return fail(HttpEnumCode::HTTP_ERROR,"订单创建失败");
}
$service_price = $doctor_config_health_package['service_price'];
}
if ($request_params['service_type'] == 2){
$params = array();
$params['follow_package_item_id'] = $request_params['follow_package_item_id'];
$doctor_config_follow_package_item = DoctorConfigFollowPackageItem::getOne($params);
if (empty($doctor_config_follow_package_item)){
return fail(HttpEnumCode::HTTP_ERROR,"随访包选择错误");
} }
// 订单金额
$service_price = $doctor_config_follow_package_item['service_price']; $service_price = $doctor_config_follow_package_item['service_price'];
// 服务周期(天)
$service_period = $doctor_config_follow_package_item['service_period'];
// 总服务次数0表示不限次
if ($doctor_config_follow_package['monthly_frequency'] != 0){
$service_count = $service_period / 30 * $doctor_config_follow_package['monthly_frequency'];
}else{
$service_count = $doctor_config_follow_package['service_count'];
} }
if ($service_price <= 0){ // 每月次数0表示不限次
return fail(HttpEnumCode::HTTP_ERROR,"订单创建失败"); $monthly_frequency = $doctor_config_follow_package['monthly_frequency'];
// 单次图文问诊价格
$single_inquiry_price = $doctor_inquiry_config['inquiry_price'];
} }
// 订单类型 // 判断数据
if ($service_price <= 0) {
return fail(HttpEnumCode::HTTP_ERROR, "订单创建失败");
}
if ($service_period === null || $service_count === null || $monthly_frequency === null || $single_inquiry_price === null){
return fail(HttpEnumCode::HTTP_ERROR, "订单创建失败");
}
// 处理订单类型
$order_type = ""; $order_type = "";
if ($request_params['service_type'] == 1){ if ($request_params['service_type'] == 1) {
$order_type = 5; $order_type = 5;
} }
if ($request_params['service_type'] == 2){ if ($request_params['service_type'] == 2) {
$order_type = 4; $order_type = 4;
} }
if (empty($order_type)){ if (empty($order_type)) {
return fail(HttpEnumCode::HTTP_ERROR,"订单创建失败"); return fail(HttpEnumCode::HTTP_ERROR, "订单创建失败");
} }
Db::beginTransaction(); Db::beginTransaction();
@ -447,7 +502,23 @@ class OrderServicePackageService extends BaseService
$data['patient_sex'] = $patient_family['sex'];// 患者性别-就诊人0:未知 1:男 2:女) $data['patient_sex'] = $patient_family['sex'];// 患者性别-就诊人0:未知 1:男 2:女)
$data['patient_age'] = getIdCardAge($patient_family['id_number']);// 患者年龄-就诊人 $data['patient_age'] = getIdCardAge($patient_family['id_number']);// 患者年龄-就诊人
$order_service_package = OrderServicePackage::addOrderServicePackage($data); $order_service_package = OrderServicePackage::addOrderServicePackage($data);
if (empty($order_service_package)){ if (empty($order_service_package)) {
Db::rollBack();
return fail(HttpEnumCode::SERVER_ERROR, "订单创建失败");
}
// 生成服务包订单详情
$data = array();
$data['order_service_id'] = $order_service_package['order_service_id'];
$data['order_id'] = $order_service_package['order_id'];
$data['order_service_no'] = $order_service_package['order_service_no'];
$data['service_period'] = $service_period; // 服务周期(天)
$data['service_count'] = $service_count; // 总服务次数0表示不限次
$data['monthly_frequency'] = $monthly_frequency; // 每月次数0表示不限次
$data['single_inquiry_price'] = $single_inquiry_price; // 单次图文问诊价格
$data['service_price'] = $service_price; // 总服务价格
$order_service_package_detail = OrderServicePackageDetail::addOrderServicePackageDetail($data);
if (empty($order_service_package_detail)){
Db::rollBack(); Db::rollBack();
return fail(HttpEnumCode::SERVER_ERROR, "订单创建失败"); return fail(HttpEnumCode::SERVER_ERROR, "订单创建失败");
} }
@ -506,7 +577,7 @@ class OrderServicePackageService extends BaseService
// 增加至未支付取消订单延迟队列 // 增加至未支付取消订单延迟队列
$time = 60 * 30; $time = 60 * 30;
if (\Hyperf\Config\config('app_env') == "dev"){ if (\Hyperf\Config\config('app_env') == "dev") {
$time = 60 * 5; $time = 60 * 5;
} }
@ -534,6 +605,348 @@ class OrderServicePackageService extends BaseService
return success($result); return success($result);
} }
/**
* 创建服务包问诊订单
* @return array
*/
public function addServiceInquiryOrder(): array
{
$user_info = $this->request->getAttribute("userInfo") ?? [];
$order_no = $this->request->input("order_no");
try {
// 检测患者是否购买服务包
$params = array();
$params['user_id'] = $user_info['user_id'];
$params['patient_id'] = $user_info['client_user_id'];
$params['order_service_no'] = $order_no;
$order_service_package = OrderServicePackage::getOne($params);
if (empty($order_service_package)) {
return fail(HttpEnumCode::HTTP_ERROR, "患者未购买该服务包");
}
// 检测服务包订单订单状态
if ($order_service_package['order_service_status'] == 1) {
return fail(HttpEnumCode::HTTP_ERROR);
}
if ($order_service_package['order_service_status'] == 2) {
return fail(HttpEnumCode::HTTP_ERROR);
}
// 获取服务包订单详情
$params = array();
$params['order_service_no'] = $order_service_package['order_service_no'];
$order_service_package_detail = OrderServicePackageDetail::getOne($params);
if (empty($order_service_package_detail)) {
return fail(HttpEnumCode::SERVER_ERROR);
}
// 处理问诊类型
if ($order_service_package['order_service_type'] == 1) {
$inquiry_mode = 8;
} else {
$inquiry_mode = 9;
}
// 检测是否存在同类型未完成的问诊订单
$PatientOrderService = new PatientOrderService();
$order_inquiry_id = $PatientOrderService->getNotFinishedOrderInquiry(1, $inquiry_mode, $user_info['client_user_id']);
if (!empty($order_inquiry_id)) {
return fail(HttpEnumCode::HTTP_ERROR, "存在进行中的问诊订单,无法再次创建");
}
// 检测当前医生是否和患者存在未完成问诊订单
$InquiryService = new InquiryService();
$order_inquiry = $InquiryService->checkPatientDoctorProgressInquiry($user_info['client_user_id'], $order_service_package['doctor_id']);
if (!empty($order_inquiry)) {
return fail(HttpEnumCode::HTTP_ERROR, "存在问诊中订单,无法再次创建");
}
// 检测问诊次数
// 3.5号购买每月2次问诊次数。今天5.3,属于第几个月,这个月的开始时间和结束时间
if ($order_service_package_detail['monthly_frequency'] != 0) {
$month_inquiry_count = 0; // 当前所属月问诊次数
// 获取当月问诊次数
// 获取开启服务日期和今日的相差天数
$diff = abs(time() - strtotime($order_service_package['start_time']));
$diff_days = ceil($diff / (60 * 60 * 24)); // 转换为天数
// 获取当前月次
$month_time = ceil($diff_days / 30);
$days = (int)$month_time * 30;
// 获取开始日期
$end_date = date('Y-m-d 23:59:59', strtotime($order_service_package['start_time'] . " +$days days"));
$start_date = date('Y-m-d 00:00:00', strtotime($end_date . "-30 days"));
$InquiryService = new InquiryService();
$order_inquiry = $InquiryService->getPatientServiceInquiry($order_service_package['order_service_type'], $user_info['client_user_id'], $order_service_package['doctor_id'], $start_date, $end_date);
if (!empty($order_inquiry)) {
$month_inquiry_count = count($order_inquiry);
}
if ($month_inquiry_count >= $order_service_package_detail['monthly_frequency']) {
return fail(HttpEnumCode::HTTP_ERROR, "超出服务包所包含的当月问诊次数");
}
}
// 获取患者家庭成员信息表
$params = array();
$params['family_id'] = $order_service_package['family_id'];
$params['patient_id'] = $order_service_package['patient_id'];
$patient_family = PatientFamily::getOne($params);
if (empty($patient_family)) {
return fail(HttpEnumCode::HTTP_ERROR, "家庭成员数据错误");
}
// 获取患者家庭成员信息表-健康情况
$params = array();
$params['family_id'] = $order_service_package['family_id'];
$patient_family_health = PatientFamilyHealth::getOne($params);
// 获取患者家庭成员信息表-个人情况
$params = array();
$params['family_id'] = $order_service_package['family_id'];
$patient_family_personal = PatientFamilyPersonal::getOne($params);
// 检测医生状态
$params = array();
$params['doctor_id'] = $order_service_package['doctor_id'];
$doctor = UserDoctor::getOne($params);
if (empty($doctor)) {
return fail(HttpEnumCode::HTTP_ERROR, "未知医生");
}
if ($doctor['idcard_status'] != 1) {
return fail(HttpEnumCode::HTTP_ERROR, "当前医生无法接诊,请重新选择");
}
if ($doctor['iden_auth_status'] != 1) {
return fail(HttpEnumCode::HTTP_ERROR, "当前医生无法接诊,请重新选择");
}
// 获取检测病例数据
$params = array();
$params['order_service_id'] = $order_service_package['order_service_id'];
$order_service_package_case = OrderServicePackageCase::getOne($params);
if (empty($order_service_package_case)) {
return fail(HttpEnumCode::HTTP_ERROR, "问诊病例数据错误");
}
$order_service_package_case = $order_service_package_case->toArray();
}catch (\Throwable $e){
return fail(HttpEnumCode::HTTP_ERROR, $e->getMessage());
}
Db::beginTransaction();
try {
$generator = $this->container->get(IdGeneratorInterface::class);
// 新增订单表
$data = array();
$data['user_id'] = $order_service_package['user_id'];
$data['patient_id'] = $order_service_package['client_user_id'];
$data['doctor_id'] = $order_service_package['doctor_id'];
if ($order_service_package['order_service_type'] == 1){
$data['order_type'] = 5; // 订单类型1:问诊订单 2:药品订单 3:检测订单 4:随访包订单 5:健康包订单)
}else{
$data['order_type'] = 4; // 订单类型1:问诊订单 2:药品订单 3:检测订单 4:随访包订单 5:健康包订单)
}
$data['inquiry_pay_channel'] = 3; // 支付渠道1:小程序支付 2:微信扫码支付)
$data['pay_status'] = 2; // 1:待支付
$data['order_no'] = "I" . $generator->generate(); // 订单编号
$data['amount_total'] = 0; // 订单金额
$data['coupon_amount_total'] = 0; // 优惠卷总金额
$data['payment_amount_total'] = 0; // 实际付款金额
$order = Order::addOrder($data);
if (empty($order)) {
Db::rollBack();
return fail(HttpEnumCode::HTTP_ERROR, "订单创建失败");
}
// 新增问诊订单
$data = array();
$data['user_id'] = $order_service_package['user_id'];
$data['patient_id'] = $order_service_package['patient_id'];
$data['doctor_id'] = $order_service_package['doctor_id'];
$data['family_id'] = $order_service_package['family_id'];
$data['inquiry_type'] = 1; // 订单类型1:专家问诊 2:快速问诊 3:公益问诊 4:问诊购药 5:检测)
if ($order_service_package['order_service_type'] == 1){
$data['inquiry_mode'] = 8; // 接诊方式1:图文 2:视频 3:语音 4:电话 5:会员 6:疑难会诊 7:附赠 8:健康包 9:随访包)
}else{
$data['inquiry_mode'] = 9; // 接诊方式1:图文 2:视频 3:语音 4:电话 5:会员 6:疑难会诊 7:附赠 8:健康包 9:随访包)
}
$data['inquiry_status'] = 3; // 问诊订单状态1:待支付 2:待分配 3:待接诊 4:已接诊 5:已完成 6:已结束 7:已取消)
$data['inquiry_pay_channel'] = 3; // 支付渠道1:小程序支付 2:微信扫码支付 3:模拟支付)
$data['inquiry_pay_status'] = 2; // 支付状态1:未支付 2:已支付 3:支付中 4:支付失败 5:支付超时 6:支付关闭 7:已撤销 8:转入退款)
$data['inquiry_no'] = $order['order_no'];// 订单编号
$data['escrow_trade_no'] = "GD" . $generator->generate(); // 第三方支付流水号
$data['amount_total'] = 0;// 订单金额
$data['coupon_amount_total'] = 0;// 优惠卷总金额
$data['payment_amount_total'] = 0;// 实际付款金额
$data['pay_time'] = date('Y-m-d H:i:s', time());// 支付时间
$data['reception_time'] = date('Y-m-d H:i:s', time());// 接诊时间
$data['patient_name'] = $patient_family['card_name'];// 患者姓名-就诊人
$data['patient_name_mask'] = $patient_family['card_name_mask'];// 患者姓名-就诊人(掩码)
$data['patient_sex'] = $patient_family['sex'];// 患者性别-就诊人0:未知 1:男 2:女)
$data['patient_age'] = $patient_family['age'];// 患者年龄-就诊人
$order_inquiry = OrderInquiry::addOrderInquiry($data);
if (empty($order_inquiry)) {
Db::rollBack();
return fail(HttpEnumCode::HTTP_ERROR, "订单创建失败");
}
// 新增问诊订单病例
$data = array();
$data['user_id'] = $order_service_package['user_id'];
$data['patient_id'] = $order_service_package['client_user_id'];
$data['order_inquiry_id'] = $order_inquiry['order_inquiry_id'];// 订单-问诊id
$data['family_id'] = $patient_family['family_id']; // 家庭成员id
$data['relation'] = $patient_family['relation']; // 与患者关系1:本人 2:父母 3:爱人 4:子女 5:亲戚 6:其他
$data['name'] = $patient_family['card_name']; // 患者名称
$data['sex'] = $patient_family['sex']; // 患者性别0:未知 1:男 2:女)
$data['disease_class_id'] = $order_service_package_case['disease_class_id']; // 疾病分类id-系统
$data['disease_class_name'] = $order_service_package_case['disease_class_name']; // 疾病名称-系统
$data['diagnosis_date'] = $order_service_package_case['diagnosis_date']; // 确诊日期
$data['disease_desc'] = $order_service_package_case['disease_desc']; // 病情描述(主诉)
$data['diagnose_images'] = $order_service_package_case['diagnose_images'] ?? ""; // 复诊凭证(多个使用逗号分隔)
if ($patient_family['age'] != null) {
$data['age'] = getIdCardAge($patient_family['id_number']);// 患者年龄
}
// 身高cm
if ($patient_family['height'] != null) {
$data['height'] = $patient_family['height'];
}
// 体重kg
if ($patient_family['weight'] != null) {
$data['weight'] = $patient_family['weight'];
}
// 职业id-职业名称
if ($patient_family['job_id'] != null) {
$data['job_id'] = $patient_family['job_id'];
if ($patient_family['job_name'] != null) {
$data['job_name'] = $patient_family['job_name'];
}
}
// 民族id-民族名称
if ($patient_family['nation_id'] != null) {
$data['nation_id'] = $patient_family['nation_id'];
if ($patient_family['nation_name'] != null) {
$data['nation_name'] = $patient_family['nation_name'];
}
}
// 婚姻状况
if ($patient_family['marital_status'] != null) {
$data['marital_status'] = $patient_family['marital_status'];
}
// 家庭成员-健康情况
if (!empty($patient_family_health)) {
if ($patient_family_health['diagnosis_hospital'] != null) {
$data['diagnosis_hospital'] = $patient_family_health['diagnosis_hospital']; // 确诊医院
}
if ($patient_family_health['is_take_medicine'] != null) {
$data['is_take_medicine'] = $patient_family_health['is_take_medicine']; // 正在服药
if ($patient_family_health['drugs_name'] != null) {
$data['drugs_name'] = $patient_family_health['drugs_name']; // 正在服药名称
}
}
}
// 家庭成员-个人情况
if (!empty($patient_family_personal)) {
if ($patient_family_personal['drink_wine_status'] != null) {
$data['drink_wine_status'] = $patient_family_personal['drink_wine_status']; // 饮酒状态
}
if ($patient_family_personal['smoke_status'] != null) {
$data['smoke_status'] = $patient_family_personal['smoke_status']; // 吸烟状态
}
if ($patient_family_personal['chemical_compound_status'] != null) {
$data['chemical_compound_status'] = $patient_family_personal['chemical_compound_status']; // 化合物状态
if ($patient_family_personal['chemical_compound_describe'] != null) {
$data['chemical_compound_describe'] = $patient_family_personal['chemical_compound_describe']; // 化合物描述
}
}
if ($patient_family_personal['is_operation'] != null) {
$data['is_operation'] = $patient_family_personal['is_operation']; // 是否存在手术
if ($patient_family_personal['operation'] != null) {
$data['operation'] = $patient_family_personal['operation']; // 手术描述
}
}
}
// 过敏史
if (array_key_exists("is_allergy_history", $order_service_package_case)) {
if ($order_service_package_case['is_allergy_history'] !== null) {
$data['is_allergy_history'] = $order_service_package_case['is_allergy_history']; // 是否存在过敏史0:否 1:是)
if ($order_service_package_case['allergy_history'] != "") {
$data['allergy_history'] = $order_service_package_case['allergy_history']; // 过敏史描述
}
}
}
// 家族病史
if (array_key_exists("is_family_history", $order_service_package_case)) {
if ($order_service_package_case['is_family_history'] !== null) {
$data['is_family_history'] = $order_service_package_case['is_family_history']; // 是否存在家族病史0:否 1:是)
if ($order_service_package_case['family_history'] != "") {
$data['family_history'] = $order_service_package_case['family_history']; // 家族病史描述
}
}
}
// 是否备孕、妊娠、哺乳期0:否 1:是)
if (array_key_exists("is_pregnant", $order_service_package_case)) {
if ($order_service_package_case['is_pregnant'] !== null) {
$data['is_pregnant'] = $order_service_package_case['is_pregnant']; // 是否备孕、妊娠、哺乳期0:否 1:是)
}
}
$order_inquiry_case = OrderInquiryCase::addOrderInquiryCase($data);
if (empty($order_inquiry_case)) {
Db::rollBack();
return fail(HttpEnumCode::HTTP_ERROR, "订单创建失败");
}
// 加入未接诊取消订单延迟队列
$time = 60 * 60 * 24;
if (\Hyperf\Config\config('app_env') == "dev"){
$time = 60 * 10;
}
$data = array();
$data['order_inquiry_id'] = $order_inquiry['order_inquiry_id'];
$data['order_no'] = $order_inquiry['inquiry_no'];
$message = new CancelUnInquiryOrdersDelayDirectProducer($data);
$message->setDelayMs(1000 * $time);
$producer = $this->container->get(Producer::class);
$res = $producer->produce($message);
if (!$res) {
Db::rollBack();
return fail(HttpEnumCode::HTTP_ERROR, "订单创建失败");
}
Db::commit();
}catch (\Throwable $e){
Db::rollBack();
return fail(HttpEnumCode::HTTP_ERROR, $e->getMessage());
}
return success();
}
/** /**
* 取消未支付检测订单 * 取消未支付检测订单
* @param string|int $order_no * @param string|int $order_no
@ -613,5 +1026,4 @@ class OrderServicePackageService extends BaseService
return $result; return $result;
} }
} }