hospital-applets-api/app/Services/OrderInquiryService.php
2023-02-17 17:10:16 +08:00

257 lines
11 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?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;
}
}