438 lines
20 KiB
PHP
438 lines
20 KiB
PHP
<?php
|
||
|
||
namespace App\Services;
|
||
|
||
use App\Amqp\Producer\CancelUnpayOrdersDelayDirectProducer;
|
||
use App\Constants\HttpEnumCode;
|
||
use App\Model\DiseaseClass;
|
||
use App\Model\InquiryCaseProduct;
|
||
use App\Model\OrderInquiry;
|
||
use App\Model\OrderInquiryCase;
|
||
use App\Model\OrderInquiryCoupon;
|
||
use App\Model\PatientFamily;
|
||
use App\Model\PatientFamilyHealth;
|
||
use App\Model\PatientFamilyPersonal;
|
||
use App\Model\Product;
|
||
use App\Model\UserDoctor;
|
||
use App\Utils\PcreMatch;
|
||
use Extend\Wechat\WechatPay;
|
||
use Hyperf\Amqp\Producer;
|
||
use Hyperf\DbConnection\Db;
|
||
use Hyperf\Snowflake\IdGeneratorInterface;
|
||
use Psr\Container\ContainerExceptionInterface;
|
||
use Psr\Container\NotFoundExceptionInterface;
|
||
|
||
/**
|
||
* 问诊
|
||
*/
|
||
class InquiryService extends BaseService
|
||
{
|
||
/**
|
||
* 创建问诊订单
|
||
* @return array
|
||
* @throws ContainerExceptionInterface
|
||
* @throws NotFoundExceptionInterface
|
||
*/
|
||
public function addInquiryOrder(): array
|
||
{
|
||
$user_info = $this->request->getAttribute("userInfo") ?? [];
|
||
$request_params = $this->request->all();
|
||
|
||
// 检测家庭成员是否存在
|
||
$params = array();
|
||
$params['family_id'] = $request_params['family_id'];
|
||
$params['patient_id'] = $user_info['client_user_id'];
|
||
$params['status'] = 1;
|
||
$patient_family = PatientFamily::getOne($params);
|
||
if (empty($patient_family)) {
|
||
return fail(HttpEnumCode::HTTP_ERROR, "患者信息错误");
|
||
}
|
||
|
||
// 检测当前家庭成员是否存在未完成的问诊订单
|
||
$UserPatientService = new UserPatientService();
|
||
$res = $UserPatientService->getNotFinishedOrdeInquiry($user_info['client_user_id']);
|
||
if (!empty($res)) {
|
||
return fail(HttpEnumCode::HTTP_ERROR, "当前患者存在进行中的问诊订单");
|
||
}
|
||
|
||
// 是否为孕妇
|
||
if (!empty($request_params['is_pregnant'])) {
|
||
return fail(HttpEnumCode::HTTP_ERROR, "请您到线下问诊");
|
||
}
|
||
|
||
// 检测所患疾病是否正确
|
||
$params = array();
|
||
$params['disease_class_id'] = $request_params['disease_class_id'];
|
||
$params['disease_class_status'] = 1;
|
||
$disease_class = DiseaseClass::getOne($params);
|
||
if (empty($disease_class)) {
|
||
return fail(HttpEnumCode::HTTP_ERROR, "疾病信息填写错误");
|
||
}
|
||
|
||
// 获取当前问诊医生信息
|
||
// 专家问诊-公益问诊
|
||
if ($request_params['inquiry_type'] == 3 || $request_params['inquiry_type'] == 1) {
|
||
if (empty($request_params['doctor_id'])) {
|
||
return fail(HttpEnumCode::HTTP_ERROR, "未选择医生");
|
||
}
|
||
|
||
$params = array();
|
||
$params['doctor_id'] = $request_params['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, "当前医生无法接诊,请重新选择");
|
||
}
|
||
}
|
||
|
||
// 获取问诊价格
|
||
$DoctorInquiryService = new DoctorInquiryService();
|
||
$inquiry_price = $DoctorInquiryService->getDoctorInquiryPrice($request_params['inquiry_type'], $request_params['inquiry_mode'], $request_params['doctor_id'] ?? "");
|
||
|
||
// 获取可用优惠卷
|
||
$CouponService = new CouponService();
|
||
$user_coupon = $CouponService->getUserUsableCouponOne($user_info['user_id'], $request_params['inquiry_type']);
|
||
|
||
// 确定支付渠道
|
||
// 支付渠道(1:小程序支付 2:微信扫码支付)
|
||
if ($request_params['client_type'] == 1){
|
||
$inquiry_pay_channel = 1;
|
||
}elseif ($request_params['client_type'] == 2){
|
||
$inquiry_pay_channel = 2;
|
||
}
|
||
|
||
Db::beginTransaction();
|
||
|
||
$generator = $this->container->get(IdGeneratorInterface::class);
|
||
|
||
try {
|
||
// 实际付款金额
|
||
$coupon_price = $user_coupon['coupon']['coupon_price'] ?? 0;
|
||
$payment_amount_total = $inquiry_price - $coupon_price;
|
||
|
||
// 生成问诊订单
|
||
$data = array();
|
||
$data['user_id'] = $user_info['user_id'];
|
||
$data['patient_id'] = $user_info['client_user_id'];
|
||
$data['doctor_id'] = $request_params['doctor_id'] ?? "";
|
||
$data['family_id'] = $request_params['family_id'];
|
||
$data['inquiry_type'] = $request_params['inquiry_type'];
|
||
$data['inquiry_mode'] = $request_params['inquiry_mode'];
|
||
$data['inquiry_status'] = 1;// 1:待支付
|
||
$data['inquiry_pay_channel'] = $inquiry_pay_channel ?? 0;// 支付渠道(1:小程序支付 2:微信扫码支付)
|
||
$data['inquiry_no'] = $generator->generate();// 订单编号
|
||
$data['amount_total'] = $inquiry_price;// 订单金额
|
||
$data['payment_amount_total'] = $payment_amount_total;// 实际付款金额
|
||
$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::SERVER_ERROR, "订单创建失败");
|
||
}
|
||
|
||
// 处理复诊凭证
|
||
if (!empty($request_params['diagnose_images'])) {
|
||
// 医师资格证
|
||
$diagnose_images = implode(',', $request_params['diagnose_images']);
|
||
$diagnose_images = PcreMatch::pregRemoveOssWebsite($diagnose_images);
|
||
}
|
||
|
||
// 增加患者问诊病例
|
||
$data = array();
|
||
$data['user_id'] = $user_info['user_id'];
|
||
$data['patient_id'] = $user_info['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; // 患者性别(0:未知 1:男 2:女)
|
||
$data['age'] = $patient_family['age'] ?? null; // 患者年龄
|
||
$data['height'] = $request_params['height'] ?? $patient_family['height'] ?: null; // 身高(cm)
|
||
$data['weight'] = $request_params['weight'] ?? $patient_family['weight'] ?: null;; // 体重(kg)
|
||
$data['disease_class_id'] = $disease_class['disease_class_id']; // 疾病分类id-系统
|
||
$data['disease_class_name'] = $disease_class['disease_class_name']; // 疾病名称-系统
|
||
$data['diagnosis_date'] = $request_params['diagnosis_date'] ?: null; // 确诊日期
|
||
$data['disease_desc'] = $request_params['disease_desc'] ?: null; // 病情描述(主诉)
|
||
$data['diagnose_images'] = $diagnose_images ?? ""; // 复诊凭证(多个使用逗号分隔)
|
||
$data['is_allergy_history'] = $request_params['is_allergy_history'] ?: 0; // 是否存在过敏史(0:否 1:是)
|
||
$data['allergy_history'] = $request_params['allergy_history'] ?? null; // 过敏史描述
|
||
$data['is_family_history'] = $request_params['is_family_history'] ?: 0; // 是否存在家族病史(0:否 1:是)
|
||
$data['family_history'] = $request_params['family_history'] ?? null; // 家族病史描述
|
||
$data['is_pregnant'] = $request_params['is_pregnant'] ?: 0; // 是否备孕、妊娠、哺乳期(0:否 1:是)
|
||
$order_inquiry_case = OrderInquiryCase::addOrderInquiryCase($data);
|
||
if (empty($order_inquiry_case)) {
|
||
Db::rollBack();
|
||
return fail(HttpEnumCode::SERVER_ERROR, "订单创建失败");
|
||
}
|
||
|
||
// 增加问诊优惠卷表
|
||
if (!empty($user_coupon)){
|
||
$data = array();
|
||
$data['order_inquiry_id'] = $order_inquiry['order_inquiry_id'];// 订单-问诊id
|
||
$data['user_coupon_id'] = $user_coupon['user_coupon_id'];
|
||
$data['coupon_name'] = $user_coupon['coupon']['coupon_name'];
|
||
$data['coupon_use_price'] = $user_coupon['coupon']['coupon_price'];
|
||
$order_inquiry_coupon = OrderInquiryCoupon::addOrderInquiryCoupon($data);
|
||
if (empty($order_inquiry_coupon)){
|
||
Db::rollBack();
|
||
return fail(HttpEnumCode::SERVER_ERROR, "订单创建失败");
|
||
}
|
||
}
|
||
|
||
// 意向用药处理
|
||
if ($request_params['inquiry_type'] == 4 && !empty($request_params['product'])) {
|
||
foreach ($request_params['product'] as $item) {
|
||
$params = array();
|
||
$params['product_id'] = $item['product_id'];
|
||
$product = Product::getWithAmountOne($params);
|
||
if (empty($product)) {
|
||
Db::rollBack();
|
||
return fail(HttpEnumCode::HTTP_ERROR, "意向药品错误");
|
||
}
|
||
|
||
// 检测商品库存
|
||
// if (!empty($product['ProductPlatformAmount'])) {
|
||
// if ($item['product_num'] > $product['ProductPlatformAmount']['real_stock']) {
|
||
// // 此处是否需要特殊返回
|
||
// Db::rollBack();
|
||
// return fail(HttpEnumCode::HTTP_ERROR, "意向药品库存不足");
|
||
// }
|
||
// }
|
||
|
||
// 用药意向是否和过敏史重叠
|
||
if (!empty($request_params['allergy_history'])) {
|
||
$res = strpos($request_params['allergy_history'], $product['product_name']);
|
||
if ($res !== false) {
|
||
Db::rollBack();
|
||
return fail(HttpEnumCode::HTTP_ERROR, "过敏史中存在意向用药,请您仔细检查");
|
||
}
|
||
}
|
||
|
||
// 新增病例商品表
|
||
$data = array();
|
||
$data['inquiry_case_id'] = $order_inquiry_case['inquiry_case_id'];
|
||
$data['product_id'] = $item['product_id'];
|
||
$data['case_product_num'] = $item['product_num'];
|
||
$inquiry_case_product = InquiryCaseProduct::addInquiryCaseProduct($data);
|
||
if (empty($inquiry_case_product)) {
|
||
Db::rollBack();
|
||
return fail(HttpEnumCode::SERVER_ERROR, "订单创建失败");
|
||
}
|
||
|
||
// 锁定库存
|
||
// 实际库存-1
|
||
// $params = array();
|
||
// $params['amount_id'] = $product['ProductPlatformAmount']['amount_id'];
|
||
// ProductPlatformAmount::dec($params,'real_stock',$item['product_num']);
|
||
//
|
||
// // 锁定库存+1
|
||
// ProductPlatformAmount::inc($params,'lock_stock',$item['product_num']);
|
||
}
|
||
}
|
||
|
||
// 发起支付
|
||
$WechatPay = new WechatPay(1);
|
||
|
||
// 获取预支付交易会话标识
|
||
$total = $inquiry_price * 100;
|
||
$prepay = $WechatPay->getJsapiPrepayId($order_inquiry['inquiry_no'],$total,$user_info['open_id']);
|
||
if (empty($prepay)){
|
||
Db::rollBack();
|
||
return fail(HttpEnumCode::SERVER_ERROR, "订单创建失败");
|
||
}
|
||
|
||
// 获取小程序支付配置
|
||
$pay_config = $WechatPay->getAppletsPayConfig($prepay['prepay_id']);
|
||
|
||
// 增加至退款延迟队列
|
||
// $data = array();
|
||
// $data['order_inquiry_id'] = $order_inquiry['order_inquiry_id'];
|
||
//
|
||
// $message = new CancelUnpayOrdersDelayDirectProducer($data);
|
||
// $message->setDelayMs(60 * 30 * 1000);
|
||
// $producer = $this->container->get(Producer::class) ;
|
||
// $res = $producer->produce($message);
|
||
// if(!$res){
|
||
// Db::rollBack();
|
||
// return fail(HttpEnumCode::SERVER_ERROR, "订单创建失败");
|
||
// }
|
||
|
||
Db::commit();
|
||
} catch (\Exception $e) {
|
||
Db::rollBack();
|
||
return fail(HttpEnumCode::HTTP_ERROR, $e->getMessage());
|
||
}
|
||
|
||
$result = array();
|
||
$result['amount_total'] = $inquiry_price; // 订单金额
|
||
$result['inquiry_no'] = $order_inquiry['inquiry_no']; // 订单编号
|
||
$result['order_inquiry_id'] = $order_inquiry['order_inquiry_id']; // 订单主键id
|
||
$result['created_at'] = date('Y-m-d H:i:s',strtotime($order_inquiry['created_at'])); // 创建时间
|
||
$result['inquiry_type'] = $order_inquiry['inquiry_type']; // 订单类型(1:专家问诊 2:快速问诊 3:公益问诊 4:问诊购药)
|
||
$result['pay_config'] = $pay_config; // 小程序支付配置
|
||
|
||
return success($result);
|
||
}
|
||
|
||
/**
|
||
* 获取患者问诊病例
|
||
* @return array
|
||
*/
|
||
public function getPatientInquiryCase(): array
|
||
{
|
||
$user_info = $this->request->getAttribute("userInfo") ?? [];
|
||
$inquiry_case_id = $this->request->route('inquiry_case_id');
|
||
|
||
// 获取病例信息
|
||
$params = array();
|
||
$params['inquiry_case_id'] = $inquiry_case_id;
|
||
$order_inquiry_case = OrderInquiryCase::getOne($params);
|
||
if (empty($order_inquiry_case)){
|
||
return fail();
|
||
}
|
||
|
||
// 获取患者家庭成员信息表-基本信息
|
||
$params = array();
|
||
$params['family_id'] = $order_inquiry_case['family_id'];
|
||
$patient_family = PatientFamily::getOne($params);
|
||
$order_inquiry_case['height'] = $order_inquiry_case['height'] ?: $patient_family['height'] ?: NULL;
|
||
$order_inquiry_case['weight'] = $order_inquiry_case['weight'] ?: $patient_family['weight'] ?: NULL;
|
||
$order_inquiry_case['job_name'] = $patient_family['job_name'] ?? "";
|
||
$order_inquiry_case['nation_name'] = $patient_family['nation_name'] ?? "";
|
||
|
||
// 获取患者家庭成员信息表-健康情况
|
||
$params = array();
|
||
$params['family_id'] = $order_inquiry_case['family_id'];
|
||
$patient_family_health = PatientFamilyHealth::getOne($params);
|
||
$order_inquiry_case['diagnosis_hospital'] = $patient_family_health['diagnosis_hospital'] ?? "";
|
||
|
||
// 获取患者家庭成员信息表-个人情况
|
||
$params = array();
|
||
$params['family_id'] = $order_inquiry_case['family_id'];
|
||
$patient_family_personal = PatientFamilyPersonal::getOne($params);
|
||
$order_inquiry_case['drink_wine_status'] = $patient_family_personal['drink_wine_status'] ?? 1;
|
||
$order_inquiry_case['smoke_status'] = $patient_family_personal['smoke_status'] ?? 1;
|
||
$order_inquiry_case['chemical_compound_status'] = $patient_family_personal['chemical_compound_status'] ?? 1;
|
||
$order_inquiry_case['chemical_compound_describe'] = $patient_family_personal['chemical_compound_describe'] ?? "";
|
||
$order_inquiry_case['is_operation'] = $patient_family_personal['is_operation'] ?? 0;
|
||
$order_inquiry_case['operation'] = $patient_family_personal['operation'] ?? "";
|
||
|
||
// 获取用药意向
|
||
$product = [];
|
||
$fields = [
|
||
'inquiry_case_id',
|
||
'product_id',
|
||
'case_product_num',
|
||
];
|
||
$params = array();
|
||
$params['inquiry_case_id'] = $order_inquiry_case['inquiry_case_id'];
|
||
$inquiry_case_product = InquiryCaseProduct::getWithProductList($params,$fields);
|
||
if (!empty($inquiry_case_product)){
|
||
foreach ($inquiry_case_product as &$item){
|
||
if (!empty($item['Product'])){
|
||
$product[] = $item['Product']['product_name'] . ' ' . $item['Product']['product_spec'] . '(' . $item['case_product_num'] . $item['Product']['packaging_unit'] . ')';
|
||
}
|
||
}
|
||
}
|
||
|
||
$order_inquiry_case['product'] = $product;
|
||
unset($inquiry_case_product);
|
||
|
||
// 复诊凭证
|
||
if (!empty($order_inquiry_case['diagnose_images'])){
|
||
$diagnose_images = explode(',',$order_inquiry_case['diagnose_images']);
|
||
foreach ($diagnose_images as &$item){
|
||
$item = addAliyunOssWebsite($item);
|
||
}
|
||
|
||
$order_inquiry_case['diagnose_images'] = $diagnose_images;
|
||
}
|
||
|
||
return success($order_inquiry_case->toArray());
|
||
}
|
||
|
||
/**
|
||
* 获取医生未接诊订单数量
|
||
* @param string $doctor_id 医生id
|
||
* @return int
|
||
*/
|
||
public function getDoctorNotAcceptedInquiryNum(string $doctor_id): int
|
||
{
|
||
$params = array();
|
||
$params['doctor_id'] = $doctor_id;
|
||
$params['inquiry_status'] = 3; // 待接诊
|
||
$params['inquiry_refund_status'] = 0; // 无退款
|
||
|
||
$order_inquiry_count = OrderInquiry::getCount($params);
|
||
if (!empty($order_inquiry_count) || $order_inquiry_count != 0) {
|
||
$not_accepted_inquiry_num = $order_inquiry_count;
|
||
} else {
|
||
$not_accepted_inquiry_num = $order_inquiry_count;
|
||
}
|
||
|
||
return $not_accepted_inquiry_num;
|
||
}
|
||
|
||
/**
|
||
* 获取医生接诊中订单数量
|
||
* @param string $doctor_id 医生id
|
||
* @return int
|
||
*/
|
||
public function getDoctorAcceptingInquiryNum(string $doctor_id): int
|
||
{
|
||
$params = array();
|
||
$params['doctor_id'] = $doctor_id;
|
||
$params['inquiry_status'] = 4; // 已接诊
|
||
$params['inquiry_refund_status'] = 0; // 无退款
|
||
|
||
$order_inquiry_count = OrderInquiry::getCount($params);
|
||
if (!empty($order_inquiry_count) || $order_inquiry_count != 0) {
|
||
$accepting_inquiry_num = $order_inquiry_count;
|
||
} else {
|
||
$accepting_inquiry_num = $order_inquiry_count;
|
||
}
|
||
|
||
return $accepting_inquiry_num;
|
||
}
|
||
|
||
/**
|
||
* 获取医生当日接诊的订单金额
|
||
* 状态:已接诊-已完成
|
||
* @param string $doctor_id
|
||
* @param string $date
|
||
* @return float
|
||
*/
|
||
public function getDoctorDayAmountTotal(string $doctor_id, string $date): float
|
||
{
|
||
// 获取当天开始时间
|
||
$start_date = date('Y-m-d 00:00:00', strtotime($date));
|
||
|
||
// 获取当天结束时间
|
||
$end_date = date('Y-m-d 23:59:59', strtotime($date));
|
||
|
||
// 获取医生当日接诊订单金额
|
||
$params = array();
|
||
$params['doctor_id'] = $doctor_id;
|
||
$params['inquiry_refund_status'] = 0; // 问诊订单退款状态(0:无退款 1:申请退款 2:退款中 3:退款成功 4:拒绝退款 5:退款关闭)
|
||
$params['inquiry_pay_status'] = 2; // 支付状态(1:未支付 2:已支付 3:支付中 4:支付失败 5:支付超时 6:支付关闭 7:已撤销 8:转入退款)
|
||
$params['settlement_status'] = 0; // 订单与医生结算状态(0:未结算 1:已结算)
|
||
|
||
$reception_time = [$start_date, $end_date];
|
||
|
||
$inquiry_status_params = [4, 5]; // 问诊订单状态(1:待支付 2:待分配 3:待接诊 4:已接诊 5:已完成 6:已结束 7:已取消)
|
||
|
||
$amount_total_sum = OrderInquiry::getOrderInquiryAmountTotalSum($params, $reception_time, $inquiry_status_params);
|
||
|
||
return $amount_total_sum ?: 0;
|
||
}
|
||
} |