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

335 lines
12 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\Model\DoctorInquiryConfig;
use App\Model\DoctorInquiryPriceRecord;
use App\Model\SystemInquiryConfig;
use App\Model\UserDoctor;
use Hyperf\DbConnection\Db;
/**
* 医生问诊
*/
class DoctorInquiryService extends BaseService
{
/**
* 获取医生问诊配置
* @return array
*/
public function getInquiryConfig(): array
{
$user_info = $this->request->getAttribute("userInfo") ?? [];
$inquiry_type = $this->request->input('inquiry_type');// 接诊类型1:专家问诊 2:快速问诊 3:公益问诊)
$inquiry_mode = $this->request->input('inquiry_mode');// 接诊方式1:图文 2:视频 3:语音 4:电话 5:会员)
$result = array();
$result['info'] = array(); // 配置信息
$result['config'] = array(); // 系统配置
// 获取医生信息
$params = array();
$params['doctor_id'] = $user_info['client_user_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['idcard_status'] != 1){
return fail(HttpEnumCode::HTTP_ERROR, "请先进行实名认证");
}
if ($doctor['iden_auth_status'] != 1){
return fail(HttpEnumCode::HTTP_ERROR, "请先进行身份认证");
}
// 接诊开关
$result['info']['is_open'] = 0;
if ($inquiry_type == 1){
// 专家
$result['info']['is_open'] = $doctor['is_img_expert_reception'];
}elseif ($inquiry_type == 2){
// 快速
$result['info']['is_open'] = $doctor['is_img_quick_reception'];
}elseif ($inquiry_type == 3){
// 公益
$result['info']['is_open'] = $doctor['is_img_welfare_reception'];
}
// 接诊价格
$result['info']['inquiry_price'] = 0;
// 接诊人数
$result['info']['work_num_day'] = 30;
// 系统问诊配置表
$params = array();
$params['inquiry_type'] = $inquiry_type;
$params['inquiry_mode'] = $inquiry_mode;
$system_inquiry_config = SystemInquiryConfig::getOne($params);
if (empty($system_inquiry_config)){
return fail(HttpEnumCode::SERVER_ERROR);
}
// 医生接诊配置表
$params = array();
$params['doctor_id'] = $user_info['client_user_id'];
$params['inquiry_type'] = $inquiry_type;
$params['inquiry_mode'] = $inquiry_mode;
$doctor_inquiry_config = DoctorInquiryConfig::getOne($params);
if (empty($doctor_inquiry_config)){
// 接诊价格
$result['info']['inquiry_price'] = $system_inquiry_config['inquiry_price'] ?: 0;
if ($inquiry_type == 3){
// 公益问诊,存在价格档次,默认第一档
$inquiry_price = explode(',',$system_inquiry_config['inquiry_price']);
$result['info']['inquiry_price'] = $inquiry_price[0];
}
}else{
// 接诊价格
$result['info']['inquiry_price'] = $doctor_inquiry_config['inquiry_price'] ?: 0;
if ($inquiry_type == 2){
// 快速-系统配置
$result['info']['inquiry_price'] = $system_inquiry_config['inquiry_price'];
}
$result['info']['work_num_day'] = $doctor_inquiry_config['work_num_day'] ?: 0;
}
// 每日最大接诊数量
$result['config']['max_work_num_day'] = $system_inquiry_config['max_work_num_day'];
// 最低接诊价格(专家问诊)
$result['config']['min_inquiry_price'] = $system_inquiry_config['min_inquiry_price'] ?: 0;
// 最高接诊价格(专家问诊)
$result['config']['max_inquiry_price'] = $system_inquiry_config['max_inquiry_price'] ?: 0;
// 默认价格
$result['config']['default_inquiry_price'] = $system_inquiry_config['max_inquiry_price'] ?: 0;
// 沟通次数0为不限制次数
$result['config']['times_number'] = $system_inquiry_config['times_number'];
// 沟通时长分钟0为不限制时长
$result['config']['duration'] = $system_inquiry_config['duration'];
return success($result);
}
/**
* 医生问诊开关
* @return array
*/
public function putInquiryOpen(): array
{
$user_info = $this->request->getAttribute("userInfo") ?? [];
$inquiry_type = $this->request->input('inquiry_type');// 接诊类型1:专家问诊 2:快速问诊 3:公益问诊)
$inquiry_mode = $this->request->input('inquiry_mode');// 接诊方式1:图文 2:视频 3:语音 4:电话 5:会员)
$is_open = $this->request->input('is_open');// 是否开启1:开启 0:关闭)
// 获取医生信息
$params = array();
$params['doctor_id'] = $user_info['client_user_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['idcard_status'] != 1){
return fail(HttpEnumCode::HTTP_ERROR, "请先进行实名认证");
}
if ($doctor['iden_auth_status'] != 1){
return fail(HttpEnumCode::HTTP_ERROR, "请先进行身份认证");
}
// 医生接诊配置表
$params = array();
$params['doctor_id'] = $user_info['client_user_id'];
$params['inquiry_type'] = $inquiry_type;
$params['inquiry_mode'] = $inquiry_mode;
$doctor_inquiry_config = DoctorInquiryConfig::getOne($params);
if (empty($doctor_inquiry_config)){
if ($inquiry_type != 2){
// 快速问诊可能会存在未创建的情况
return fail(HttpEnumCode::HTTP_ERROR, "请先完善问诊配置");
}
}
Db::beginTransaction();
try {
$params = array();
$params['doctor_id'] = $user_info['client_user_id'];
$data = array();
if ($inquiry_type == 1){
// 专家
$data['is_img_expert_reception'] = $is_open;
}elseif ($inquiry_type == 2){
// 快速
$data['is_img_quick_reception'] = $is_open;
}elseif ($inquiry_type == 3){
// 公益
$data['is_img_welfare_reception'] = $is_open;
}
UserDoctor::editUserDoctor($params,$data);
if ($inquiry_type == 2){
// 系统问诊配置表
$params = array();
$params['inquiry_type'] = $inquiry_type;
$params['inquiry_mode'] = $inquiry_mode;
$system_inquiry_config = SystemInquiryConfig::getOne($params);
if (empty($system_inquiry_config)){
Db::rollBack();
return fail(HttpEnumCode::SERVER_ERROR);
}
// 快速问诊,需创建
$data = array();
$data['doctor_id'] = $user_info['client_user_id'];
$data['system_inquiry_config_id'] = $system_inquiry_config['system_inquiry_config_id'];
$data['inquiry_type'] = $inquiry_type;
$data['inquiry_mode'] = $inquiry_mode;
$data['work_num_day'] = $system_inquiry_config['max_work_num_day'] ?: 0;
$data['inquiry_price'] = $system_inquiry_config['inquiry_price'];
$doctor_inquiry_config = DoctorInquiryConfig::addInquiryConfig($data);
if (empty($doctor_inquiry_config)){
Db::rollBack();
return fail(HttpEnumCode::SERVER_ERROR);
}
}
Db::commit();
} catch (\Exception $e) {
Db::rollBack();
return fail(HttpEnumCode::HTTP_ERROR, $e->getMessage());
}
return success();
}
/**
* 修改医生问诊配置
* @return array
*/
public function putInquiryConfig(): array
{
$user_info = $this->request->getAttribute("userInfo") ?? [];
$inquiry_type = $this->request->input('inquiry_type');// 接诊类型1:专家问诊 2:快速问诊 3:公益问诊)
$inquiry_mode = $this->request->input('inquiry_mode');// 接诊方式1:图文 2:视频 3:语音 4:电话 5:会员)
$inquiry_price = $this->request->input('inquiry_price');// 接诊价格
$work_num_day = $this->request->input('work_num_day');// 每日接诊数量
if ($inquiry_type == 2){
// 快速问诊无需配置
return fail();
}
// 获取医生信息
$params = array();
$params['doctor_id'] = $user_info['client_user_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['idcard_status'] != 1){
return fail(HttpEnumCode::HTTP_ERROR, "请先进行实名认证");
}
if ($doctor['iden_auth_status'] != 1){
return fail(HttpEnumCode::HTTP_ERROR, "请先进行身份认证");
}
// 系统问诊配置表
$params = array();
$params['inquiry_type'] = $inquiry_type;
$params['inquiry_mode'] = $inquiry_mode;
$system_inquiry_config = SystemInquiryConfig::getOne($params);
if (empty($system_inquiry_config)){
return fail(HttpEnumCode::SERVER_ERROR);
}
// 验证-每日接诊数量
if ($work_num_day > $system_inquiry_config['max_work_num_day']){
return fail(HttpEnumCode::HTTP_ERROR,"超出每日最大接诊数量");
}
// 验证-问诊价格
// 义诊时不判断,义诊为选择价格,价格后台可调节
if ($inquiry_type == 3){
if (!empty($system_inquiry_config['min_inquiry_price']) && !empty($system_inquiry_config['max_inquiry_price'])){
if ($inquiry_price > $system_inquiry_config['max_inquiry_price'] || $inquiry_price < $system_inquiry_config['min_inquiry_price']){
return fail(HttpEnumCode::HTTP_ERROR,"问诊价格填写错误");
}
}
}
// 开启事务锁
Db::beginTransaction();
try {
// 医生接诊配置表
$params = array();
$params['doctor_id'] = $user_info['client_user_id'];
$params['inquiry_type'] = $inquiry_type;
$params['inquiry_mode'] = $inquiry_mode;
$doctor_inquiry_config = DoctorInquiryConfig::getOne($params);
if (empty($doctor_inquiry_config)){
// 创建
$data = array();
$data['doctor_id'] = $user_info['client_user_id'];
$data['system_inquiry_config_id'] = $system_inquiry_config['system_inquiry_config_id'];
$data['inquiry_type'] = $inquiry_type;
$data['inquiry_mode'] = $inquiry_mode;
$data['work_num_day'] = $work_num_day;
$data['inquiry_price'] = $inquiry_price;
$doctor_inquiry_config = DoctorInquiryConfig::addInquiryConfig($data);
if (empty($doctor_inquiry_config)){
Db::rollBack();
return fail(HttpEnumCode::SERVER_ERROR);
}
}else{
// 修改
if ($doctor_inquiry_config['work_num_day'] != $work_num_day || $doctor_inquiry_config['inquiry_price'] != $inquiry_price){
$params = array();
$params['inquiry_config_id'] = $doctor_inquiry_config['inquiry_config_id'];
$data = array();
$data['work_num_day'] = $work_num_day;
$data['inquiry_price'] = $inquiry_price;
DoctorInquiryConfig::editInquiryConfig($params,$data);
}
}
Db::commit();
} catch (\Exception $e) {
Db::rollBack();
return fail(HttpEnumCode::HTTP_ERROR, $e->getMessage());
}
return success();
}
}