257 lines
11 KiB
PHP
257 lines
11 KiB
PHP
<?php
|
||
|
||
namespace App\Services;
|
||
|
||
use App\Constants\HttpEnumCode;
|
||
use App\Exception\BusinessException;
|
||
use App\Model\DiseaseClass;
|
||
use App\Model\DoctorInquiryConfig;
|
||
use App\Model\OrderInquiry;
|
||
use App\Model\PatientFamily;
|
||
use App\Model\Product;
|
||
use App\Model\SystemInquiryConfig;
|
||
use App\Model\UserDoctor;
|
||
use Hyperf\DbConnection\Db;
|
||
use Hyperf\Snowflake\IdGeneratorInterface;
|
||
|
||
/**
|
||
* 问诊订单
|
||
*/
|
||
class OrderInquiryService extends BaseService
|
||
{
|
||
/**
|
||
* 获取医生未接诊订单数量
|
||
* @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;
|
||
}
|
||
|
||
// 创建问诊订单
|
||
public function addInquiryOrder(){
|
||
$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,"患者信息错误");
|
||
}
|
||
|
||
// 检测当前家庭成员是否和医生有未完成订单
|
||
$params = array();
|
||
$params[] = ['patient_id','=',$user_info['client_user_id']];
|
||
$params[] = ['family_id','=',$request_params['family_id']];
|
||
$params[] = ['inquiry_mode','=',1];
|
||
$params[] = ['inquiry_status','in',[1,2,3,4]]; // 1:待支付 2:待分配 3:待接诊 4:已接诊 5:已完成 6:已结束 7:已取消
|
||
$params[] = ['inquiry_refund_status','=',0];
|
||
$order_inquiry_count = OrderInquiry::getCount($params);
|
||
if ($order_inquiry_count != 0){
|
||
return fail(HttpEnumCode::HTTP_ERROR,"当前患者存在进行中的问诊订单");
|
||
}
|
||
|
||
// 问诊购药情况
|
||
if ($request_params['inquiry_type'] == 4){
|
||
// 问诊购药情况下是否包含用药意向
|
||
if (!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)){
|
||
return fail(HttpEnumCode::HTTP_ERROR,"意向药品错误");
|
||
}
|
||
|
||
// 检测商品库存
|
||
if (!empty($product['ProductPlatformAmount'])){
|
||
if ($item['product_num'] > $product['ProductPlatformAmount']['real_stock']){
|
||
// 此处是否需要特殊返回
|
||
return fail(HttpEnumCode::HTTP_ERROR,"意向药品库存不足");
|
||
}
|
||
}
|
||
|
||
// 用药意向是否和过敏史重叠
|
||
if (!empty($request_params['allergy_history'])){
|
||
$res = strpos($request_params['allergy_history'],$product['product_name']);
|
||
if ($res !== false){
|
||
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,"当前医生无法接诊,请重新选择");
|
||
}
|
||
}
|
||
|
||
// 获取问诊价格
|
||
$inquiry_price = $this->getDoctorInquiryPrice($request_params['inquiry_type'],$request_params['inquiry_mode'],$request_params['doctor_id'] ?? "");
|
||
|
||
// 获取可用优惠卷
|
||
$CouponService = new CouponService();
|
||
$user_coupon = $CouponService->getUserUsableCoupon($user_info['user_id'],$request_params['inquiry_type'],1);
|
||
|
||
Db::beginTransaction();
|
||
|
||
$generator = $this->container->get(IdGeneratorInterface::class);
|
||
|
||
try {
|
||
// 生成问诊订单
|
||
$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_no'] = $generator->generate();// 订单编号
|
||
$data['amount_total'] = $inquiry_price ?? 0;// 订单金额
|
||
$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::addUserDoctor($data);
|
||
if (empty($order_inquiry)){
|
||
return fail(HttpEnumCode::SERVER_ERROR,"订单创建失败");
|
||
}
|
||
|
||
// 增加患者问诊病例
|
||
$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'] = $patient_family['card_name']; // 疾病名称-系统
|
||
$data['diagnosis_date'] = $patient_family['card_name']; // 确诊日期
|
||
$data['disease_desc'] = $patient_family['card_name']; // 病情描述(主诉)
|
||
$data['diagnose_images'] = $patient_family['card_name']; // 复诊凭证(多个使用逗号分隔)
|
||
$data['is_allergy_history'] = $patient_family['card_name']; // 是否存在过敏史(0:否 1:是)
|
||
$data['allergy_history'] = $patient_family['card_name']; // 过敏史描述
|
||
$data['is_family_history'] = $patient_family['card_name']; // 是否存在家族病史(0:否 1:是)
|
||
$data['family_history'] = $patient_family['card_name']; // 家族病史描述
|
||
|
||
} catch (\Exception $e) {
|
||
Db::rollBack();
|
||
return fail(HttpEnumCode::HTTP_ERROR, $e->getMessage());
|
||
}
|
||
|
||
// 添加患者病例
|
||
// 添加至具体队列
|
||
|
||
}
|
||
|
||
/**
|
||
* 获取问诊价格
|
||
* @param string|int $inquiry_type 订单类型(1:专家问诊 2:快速问诊 3:公益问诊 4:问诊购药)
|
||
* @param string|int $inquiry_mode 订单问诊方式(1:图文 2:视频 3:语音 4:电话 5:会员)
|
||
* @param string|int $doctor_id 医生id
|
||
* @return int
|
||
*/
|
||
public function getDoctorInquiryPrice(string|int $inquiry_type, string|int $inquiry_mode,string|int $doctor_id): int
|
||
{
|
||
if (empty($doctor_id)){
|
||
throw new BusinessException();
|
||
}
|
||
|
||
$params = array();
|
||
$params['doctor_id'] = $doctor_id;
|
||
$params['inquiry_type'] = $inquiry_type;
|
||
$params['inquiry_mode'] = $inquiry_mode;
|
||
$doctor_inquiry_config = DoctorInquiryConfig::getInquiryConfigOne($params);
|
||
if (empty($doctor_inquiry_config)){
|
||
throw new BusinessException( "当前医生未开通对应服务,请重新选择",HttpEnumCode::HTTP_ERROR);
|
||
}
|
||
|
||
$inquiry_price = $doctor_inquiry_config['inquiry_price'] ?: 0;
|
||
|
||
if ($inquiry_type == 2){
|
||
$inquiry_price = $doctor_inquiry_config['SystemInquiryConfig']['inquiry_price'];
|
||
}
|
||
|
||
return $inquiry_price;
|
||
}
|
||
} |