hospital-applets-api/app/Services/DoctorAuthService.php
2024-03-28 10:26:21 +08:00

1189 lines
42 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\DoctorTitleCode;
use App\Constants\HttpEnumCode;
use App\Model\DiseaseClassExpertise;
use App\Model\DoctorExpertise;
use App\Model\DoctorIdenFail;
use App\Model\DoctorIntroductionRecord;
use App\Model\Hospital;
use App\Model\HospitalDepartmentCustom;
use App\Model\User;
use App\Model\UserDoctor;
use App\Model\UserDoctorInfo;
use App\Utils\Mask;
use App\Utils\PcreMatch;
use Extend\TencentIm\Profile;
use Extend\VerifyDun\IdCard;
use GuzzleHttp\Exception\GuzzleException;
use Hyperf\DbConnection\Db;
/**
* 医生身份认证
*/
class DoctorAuthService extends BaseService
{
/**
* 获取实名认证信息
* @return array
*/
public function getAuthReal(): array
{
$user_info = $this->request->getAttribute("userInfo") ?? [];
// 获取医生数据
$params = array();
$params['doctor_id'] = $user_info['client_user_id'];
$doctor = UserDoctor::getOne($params);
if (empty($doctor)) {
return fail(HttpEnumCode::HTTP_ERROR, "未知医生");
}
// 实名认证状态0:未认证 1:认证通过 2:认证失败)
if ($doctor['idcard_status'] == 0) {
return success();
}
// 获取医生详情数据
$params = array();
$params['doctor_id'] = $user_info['client_user_id'];
$params['card_type'] = 1;
$fields = [
'doctor_info_id',
'doctor_id',
'card_type',
'card_name',
'card_name_mask',
// 'card_num',
'card_num_mask',
];
$user_doctor_info = UserDoctorInfo::getOne($params, $fields);
if (empty($user_doctor_info)) {
return success();
}
return success($user_doctor_info->toArray());
}
/**
* 新增实名认证
* @return array
* @throws GuzzleException
*/
public function addAuthReal(): array
{
$user_info = $this->request->getAttribute("userInfo") ?? [];
$card_name = $this->request->input('card_name');
$card_num = $this->request->input('card_num');
// 身份证验证
$card_num = PcreMatch::pregIdCard($card_num);
if (empty($card_num)) {
return fail();
}
// 身份证最后一位x转换为大写
$card_num = PcreMatch::pregIdCardX($card_num);
if (empty($card_num)) {
return fail();
}
// 身份证掩码
$card_num_mask = Mask::maskIdCard($card_num);
// 姓名掩码
$card_name_mask = Mask::maskNameStr($card_name);
// 获取医生数据
$params = array();
$params['doctor_id'] = $user_info['client_user_id'];
$doctor = UserDoctor::getOne($params);
if (empty($doctor)) {
return fail(HttpEnumCode::HTTP_ERROR, "未知医生");
}
// 实名认证状态0:未认证 1:认证通过 2:认证失败)
if ($doctor['idcard_status'] == 1) {
return fail(HttpEnumCode::HTTP_ERROR, "已通过实名认证,无法修改");
}
// 检测身份证号是否已被实名认证
$params = array();
$params['card_num'] = $card_num;
$res = UserDoctorInfo::getExists($params);
if ($res){
return fail(HttpEnumCode::HTTP_ERROR,"实名信息已被其他账号绑定");
}
// 网易易盾认证
// 实人认证-生产环境开启
$app_env = config('app_env','dev');
if ($app_env != "dev"){
$IdCard = new IdCard();
$params = array();
$params['name'] = $card_name;
$params['cardNo'] = $card_num;
$res = $IdCard->checkIdCard($params);
if (!empty($res)) {
return fail(HttpEnumCode::HTTP_ERROR, $res);
}
}
Db::beginTransaction();
try {
// 获取医生详情数据
$params = array();
$params['doctor_id'] = $user_info['client_user_id'];
$user_doctor_info = UserDoctorInfo::getOne($params);
if (empty($user_doctor_info)) {
// 新增医生详情
$data = array();
$data['user_id'] = $user_info['user_id'];
$data['doctor_id'] = $user_info['client_user_id'];
$data['card_type'] = 1;
$data['card_name'] = $card_name;
$data['card_name_mask'] = $card_name_mask;
$data['card_num'] = $card_num;
$data['card_num_mask'] = $card_num_mask;
$user_doctor_info = UserDoctorInfo::addUserDoctorInfo($data);
if (empty($user_doctor_info)) {
Db::rollBack();
return fail(HttpEnumCode::SERVER_ERROR);
}
} else {
if (!empty($user_doctor_info['card_name']) || !empty($user_doctor_info['card_num'])) {
Db::rollBack();
return fail(HttpEnumCode::HTTP_ERROR, "不可修改");
}
// 已存在详情表数据,进行添加
$data = array();
$data['card_type'] = 1;
$data['card_name'] = $card_name;
$data['card_name_mask'] = $card_name_mask;
$data['card_num'] = $card_num;
$data['card_num_mask'] = $card_num_mask;
$data['updated_at'] = date('Y-m-d H:i:s', time());
$params = array();
$params['doctor_info_id'] = $user_doctor_info['doctor_info_id'];
$res = UserDoctorInfo::editUserDoctorInfo($params, $data);
if (!$res) {
Db::rollBack();
return fail(HttpEnumCode::SERVER_ERROR);
}
}
// 医生年龄
$age = getIdCardAge($card_num);
// 性别
$sex = getIdCardSex($card_num);
// 修改医生实名认证状态
$data = array();
$data['idcard_status'] = 1;
$data['user_name'] = $card_name;
$params = array();
$params['doctor_id'] = $user_info['client_user_id'];
$res = UserDoctor::editUserDoctor($params, $data);
if (!$res) {
Db::rollBack();
return fail(HttpEnumCode::SERVER_ERROR);
}
$data = array();
$data['age'] = $age;
$data['sex'] = $sex;
$data['user_name'] = $card_name;
$params = array();
$params['user_id'] = $user_info['user_id'];
$res = User::editUser($params, $data);
if (!$res) {
Db::rollBack();
return fail(HttpEnumCode::SERVER_ERROR);
}
// 修改im名称
$profile = new Profile();
$arg = array();
$arg['Tag_Profile_IM_Nick'] = $card_name;
$profile->setProfile($user_info['user_id'], $arg);
Db::commit();
} catch (\Exception $e) {
Db::rollBack();
return fail(HttpEnumCode::SERVER_ERROR, $e->getMessage());
}
return success();
}
/**
* 获取身份认证信息
* @return array
*/
public function getAuthIden(): array
{
$user_info = $this->request->getAttribute("userInfo") ?? [];
// 获取医生数据
$fields = [
'doctor_id',
'user_id',
'idcard_status',
'iden_auth_status',
'introduction_status',
'avatar',
'hospital_id',
'department_custom_id',
'department_custom_name',
'department_custom_mobile',
'doctor_title',
'brief_introduction',
'be_good_at',
];
$params = array();
$params['doctor_id'] = $user_info['client_user_id'];
$doctor = UserDoctor::getOne($params, $fields);
if (empty($doctor)) {
return fail(HttpEnumCode::HTTP_ERROR, "未知医生");
}
// 实名认证状态0:未认证 1:认证通过 2:认证失败)
if ($doctor['idcard_status'] != 1) {
return fail(HttpEnumCode::HTTP_ERROR, "请先实名认证");
}
$result = $doctor->toArray();
// 头像
if (!empty($doctor['avatar'])) {
$result['avatar'] = addAliyunOssWebsite($doctor['avatar']);
}
// 职称转换
$result['doctor_title_name'] = empty($doctor['doctor_title']) ? "" : DoctorTitleCode::getMessage($doctor['doctor_title']);
// 获取医生详情数据
$result['license_cert'] = [];
$result['qualification_cert'] = [];
$result['work_cert'] = [];
$params = array();
$params['doctor_id'] = $user_info['client_user_id'];
$user_doctor_info = UserDoctorInfo::getOne($params);
if (!empty($user_doctor_info)) {
// 医师执业证
if (!empty($user_doctor_info['license_cert'])) {
$license_cert = explode(',', $user_doctor_info['license_cert']);
foreach ($license_cert as &$item) {
$item = addAliyunOssWebsite($item);
}
$result['license_cert'] = $license_cert;
}
// 医师职称证
if (!empty($user_doctor_info['qualification_cert'])) {
$qualification_cert = explode(',', $user_doctor_info['qualification_cert']);
foreach ($qualification_cert as &$item) {
$item = addAliyunOssWebsite($item);
}
$result['qualification_cert'] = $qualification_cert;
}
// 医师资格证
if (!empty($user_doctor_info['work_cert'])) {
$work_cert = explode(',', $user_doctor_info['work_cert']);
foreach ($work_cert as &$item) {
$item = addAliyunOssWebsite($item);
}
$result['work_cert'] = $work_cert;
}
}
// 获取医生医院
$result['hospital'] = [];
$fields = [
'hospital_id',
'hospital_name',
'hospital_level_name',
'province_id',
'province',
'city_id',
'city',
'county_id',
'county',
];
$params = array();
$params['hospital_id'] = $doctor['hospital_id'];
$hospital = Hospital::getOne($params, $fields);
if (!empty($hospital)) {
$result['hospital'] = $hospital;
}
// 获取医生已选择专长
$UserDoctorService = new UserDoctorService();
$result['doctor_expertise'] = $UserDoctorService->getDoctorSelectedExpertise($doctor['doctor_id']);
// 获取用户邮箱
$result['email'] = "";
$params = array();
$params['user_id'] = $doctor['user_id'];
$user = User::getOne($params);
if (!empty($user)){
$result['email'] = $user['email'];
}
return success($result);
}
/**
* 新增身份认证信息
* @return array
* @throws GuzzleException
*/
public function addAuthIden(): array
{
$user_info = $this->request->getAttribute("userInfo") ?? [];
$request_params = $this->request->all();
// 获取医生数据
$params = array();
$params['doctor_id'] = $user_info['client_user_id'];
$doctor = UserDoctor::getOne($params);
if (empty($doctor)) {
return fail(HttpEnumCode::HTTP_ERROR, "未知医生");
}
// 实名认证状态0:未认证 1:认证通过 2:认证失败)
if ($doctor['idcard_status'] != 1) {
return fail(HttpEnumCode::HTTP_ERROR, "请先实名认证");
}
// 审核中
if ($doctor['iden_auth_status'] == 2) {
return fail(HttpEnumCode::HTTP_ERROR, "审核中,暂不允许修改");
}
// 获取用户数据
$params = array();
$params['user_id'] = $doctor['user_id'];
$user = User::getOne($params);
if (empty($user)){
return fail(HttpEnumCode::HTTP_ERROR, "用户错误");
}
// 组合存储数据
$doctor_data = array();// 医生
$user_data = array();// 用户
$doctor_info_data = array();// 医生详情
// 头像
$request_params['avatar'] = PcreMatch::pregRemoveOssWebsite($request_params['avatar']);
if ($doctor['avatar'] != $request_params['avatar']) {
$doctor_data['avatar'] = $request_params['avatar'];
}
// 职称
if ($doctor['doctor_title'] != $request_params['doctor_title']) {
$doctor_data['doctor_title'] = $request_params['doctor_title'];
}
// 医院
if ($doctor['hospital_id'] != $request_params['hospital_id']) {
$params = array();
$params['hospital_id'] = $request_params['hospital_id'];
$hospital = Hospital::getOne($params);
if (empty($hospital)) {
return fail(HttpEnumCode::HTTP_ERROR, "医院选择错误");
}
$doctor_data['hospital_id'] = $request_params['hospital_id'];
}
// 科室
if ($doctor['department_custom_id'] != $request_params['department_custom_id']) {
$params = array();
$params['department_custom_id'] = $request_params['department_custom_id'];
$hospital_department_custom = HospitalDepartmentCustom::getOne($params);
if (empty($hospital_department_custom)) {
return fail(HttpEnumCode::HTTP_ERROR, "科室选择错误");
}
$doctor_data['department_custom_id'] = $request_params['department_custom_id'];
$doctor_data['department_custom_name'] = $hospital_department_custom['department_custom_name'];
if (!empty($request_params['department_custom_name'])) {
$doctor_data['department_custom_name'] = $request_params['department_custom_name'];
}
}
// 科室电话
if ($doctor['department_custom_mobile'] != $request_params['department_custom_mobile']) {
$doctor_data['department_custom_mobile'] = $request_params['department_custom_mobile'];
}
// 医生简介
if ($doctor['brief_introduction'] != $request_params['brief_introduction']) {
$doctor_data['brief_introduction'] = $request_params['brief_introduction'];
}
// 擅长领域
if ($doctor['be_good_at'] != $request_params['be_good_at']) {
$doctor_data['be_good_at'] = $request_params['be_good_at'];
}
// 邮箱
if ($user['email'] != $request_params['email']) {
// 验证邮箱
$res = PcreMatch::validateEmail($request_params['email']);
if (!$res){
return fail(HttpEnumCode::HTTP_ERROR, "请填写正确邮箱");
}
$user_data['email'] = $request_params['email'];
}
// 身份认证
if ($request_params['source'] == 1){
// 获取医生详情数据
$params = array();
$params['doctor_id'] = $user_info['client_user_id'];
$user_doctor_info = UserDoctorInfo::getOne($params);
if (empty($user_doctor_info)) {
return fail(HttpEnumCode::SERVER_ERROR);
}
// 执业证-上传后无法修改
if (empty($user_doctor_info['license_cert']) || $doctor['iden_auth_status'] == 3){
$license_cert = implode(',', $request_params['license_cert']);
$license_cert = PcreMatch::pregRemoveOssWebsite($license_cert);
$doctor_info_data['license_cert'] = $license_cert;
}
// 医师资格证-上传后无法修改
if (empty($user_doctor_info['qualification_cert']) || $doctor['iden_auth_status'] == 3){
$qualification_cert = implode(',', $request_params['qualification_cert']);
$qualification_cert = PcreMatch::pregRemoveOssWebsite($qualification_cert);
$doctor_info_data['qualification_cert'] = $qualification_cert;
}
// 医师工作证-上传后无法修改
if (empty($user_doctor_info['work_cert']) || $doctor['iden_auth_status'] == 3){
$work_cert = implode(',', $request_params['work_cert']);
$work_cert = PcreMatch::pregRemoveOssWebsite($work_cert);
$doctor_info_data['work_cert'] = $work_cert;
}
}
//已选择专长列表
$expertise_ids = [];
// 获取医生专长
$params = array();
$params['doctor_id'] = $user_info['client_user_id'];
$doctor_expertise = DoctorExpertise::getList($params);
if (!empty($doctor_expertise)) {
$expertise_ids = array_column($doctor_expertise->toArray(), 'expertise_id');
}
// 对比已选择专长
// 对比专长是否删除
$is_delete_expertise = array_diff($request_params['doctor_expertise'], $expertise_ids);
if (empty($is_delete_expertise)) {
// 对比专长是否新增
$is_add_expertise = array_diff($expertise_ids, $request_params['doctor_expertise']);
}
// 专长是否改动false未改动 true已改动
$expertise_is_change = false;
if (!empty($is_delete_expertise) || !empty($is_add_expertise)) {
$expertise_is_change = true;
}
// 审核失败,重新提交
if ($doctor['iden_auth_status'] == 3){
// 获取认证失败字段
$params = array();
$params['doctor_id'] = $user_info['client_user_id'];
$doctor_iden_fails = DoctorIdenFail::getList($params);
if (!empty($doctor_iden_fails)){
foreach ($doctor_iden_fails as $doctor_iden_fail){
// 科室电话
if ($doctor_iden_fail['field_name'] == "department_custom_mobile") {
if ($doctor['department_custom_mobile'] == $request_params['department_custom_mobile']){
return fail(HttpEnumCode::HTTP_ERROR,"科室电话" . $doctor_iden_fail['fail_reason']);
}
}
// 医生简介
if ($doctor_iden_fail['field_name'] == "brief_introduction") {
if ($doctor['brief_introduction'] == $request_params['brief_introduction']){
return fail(HttpEnumCode::HTTP_ERROR,"医生简介" . $doctor_iden_fail['fail_reason']);
}
}
// 擅长领域
if ($doctor_iden_fail['field_name'] == "be_good_at") {
if ($doctor['be_good_at'] == $request_params['be_good_at']){
return fail(HttpEnumCode::HTTP_ERROR,"擅长领域" . $doctor_iden_fail['fail_reason']);
}
}
}
}
}
Db::beginTransaction();
try {
// 专长有改动
if ($expertise_is_change) {
// 删除原专长
$params = array();
$params['doctor_id'] = $user_info['client_user_id'];
DoctorExpertise::deleteDoctorExpertise($params);
// 新增专长
foreach ($request_params['doctor_expertise'] as $item) {
$data = array();
$data['doctor_id'] = $user_info['client_user_id'];
$data['expertise_id'] = $item;
$doctor_expertise = DoctorExpertise::addDoctorExpertise($data);
if (empty($doctor_expertise)) {
Db::rollBack();
return fail(HttpEnumCode::SERVER_ERROR);
}
}
}
// 医生数据
if (!empty($doctor_data)) {
$params = array();
$params['doctor_id'] = $user_info['client_user_id'];
$doctor_data['updated_at'] = date('Y-m-d H:i:s', time());
$res = UserDoctor::editUserDoctor($params, $doctor_data);
if (!$res) {
Db::rollBack();
return fail(HttpEnumCode::SERVER_ERROR);
}
// 修改医生头像
if (!empty($doctor_data['avatar'])){
// 修改user表头像
$params = array();
$params['user_id'] = $user_info['user_id'];
$data = array();
$data['avatar'] = $doctor_data['avatar'];
User::editUser($params,$data);
// 修改im头像
$profile = new Profile();
$arg = array();
$arg['Tag_Profile_IM_Image'] = addAliyunOssWebsite($doctor_data['avatar']);
$profile->setProfile($user_info['user_id'], $arg);
}
}
// 医生详情数据
if (!empty($doctor_info_data)) {
// 修改医生详情数据
$params = array();
$params['doctor_id'] = $user_info['client_user_id'];
$doctor_info_data['updated_at'] = date('Y-m-d H:i:s', time());
$res = UserDoctorInfo::editUserDoctorInfo($params, $doctor_info_data);
if (!$res) {
Db::rollBack();
return fail(HttpEnumCode::SERVER_ERROR);
}
}
// 修改审核状态
if (!empty($doctor_data) || !empty($doctor_info_data) || $expertise_is_change) {
$params = array();
$params['doctor_id'] = $user_info['client_user_id'];
$data = array();
$data['iden_auth_status'] = 2;// 身份认证状态-审核中
$data['iden_auth_fail_reason'] = "";// 身份认证失败原因
$data['updated_at'] = date('Y-m-d H:i:s', time());
$res = UserDoctor::editUserDoctor($params, $data);
if (!$res) {
Db::rollBack();
return fail(HttpEnumCode::SERVER_ERROR);
}
}
// 修改用户邮箱
if (!empty($user_data)){
$params = array();
$params['user_id'] = $user['user_id'];
$data = array();
$data['email'] = $request_params['email'];
$res = User::editUser($params, $data);
if (!$res) {
Db::rollBack();
return fail(HttpEnumCode::SERVER_ERROR);
}
}
// 删除认证失败字段
if ($doctor['iden_auth_status'] == 3){
// 删除认证失败字段
$params = array();
$params['doctor_id'] = $user_info['client_user_id'];
DoctorIdenFail::del($params);
}
Db::commit();
} catch (\Exception $e) {
Db::rollBack();
return fail(HttpEnumCode::SERVER_ERROR, $e->getMessage());
}
return success();
}
/**
* 获取多点执业认证信息
* @return array
*/
public function getAuthMulti(): array
{
$user_info = $this->request->getAttribute("userInfo") ?? [];
// 获取医生数据
$params = array();
$params['doctor_id'] = $user_info['client_user_id'];
$doctor = UserDoctor::getOne($params);
if (empty($doctor)) {
return fail(HttpEnumCode::HTTP_ERROR, "未知医生");
}
// 获取医生详情数据
$params = array();
$params['doctor_id'] = $user_info['client_user_id'];
$user_doctor_info = UserDoctorInfo::getOne($params);
if (empty($user_doctor_info)) {
return success();
}
$result = array();
$result['id_card_front'] = addAliyunOssWebsite($user_doctor_info['id_card_front']);
$result['id_card_back'] = addAliyunOssWebsite($user_doctor_info['id_card_back']);
$result['sign_image'] = addAliyunOssWebsite($user_doctor_info['sign_image']);
$result['multi_point_status'] = $doctor['multi_point_status']; // 医生多点执业认证状态0:未认证 1:认证通过 2:审核中 3:认证失败)
$result['multi_point_fail_reason'] = $doctor['multi_point_fail_reason']; // 多点执业认证失败原因
return success($result);
}
/**
* 新增多点执业认证信息
* @return array
*/
public function addAuthMulti(): array
{
$user_info = $this->request->getAttribute("userInfo") ?? [];
$id_card_front = $this->request->input('id_card_front');
$id_card_back = $this->request->input('id_card_back');
$sign_image = $this->request->input('sign_image');
// 获取医生数据
$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['iden_auth_status'] != 1) {
return fail(HttpEnumCode::HTTP_ERROR, "请先进行身份认证");
}
// 审核中
if ($doctor['multi_point_status'] == 2) {
return fail(HttpEnumCode::HTTP_ERROR, "审核中,暂不允许修改");
}
// 获取医生详情数据
$params = array();
$params['doctor_id'] = $user_info['client_user_id'];
$user_doctor_info = UserDoctorInfo::getOne($params);
if (empty($user_doctor_info)) {
return fail(HttpEnumCode::SERVER_ERROR);
}
$doctor_info_data = array();
// 身份证正面
$id_card_front = PcreMatch::pregRemoveOssWebsite($id_card_front);
if ($id_card_front != $user_doctor_info['id_card_front']) {
$doctor_info_data['id_card_front'] = $id_card_front;
}
// 身份证反面
$id_card_back = PcreMatch::pregRemoveOssWebsite($id_card_back);
if ($id_card_back != $user_doctor_info['id_card_back']) {
$doctor_info_data['id_card_back'] = $id_card_back;
}
// 签名
$sign_image = PcreMatch::pregRemoveOssWebsite($sign_image);
if ($sign_image != $user_doctor_info['sign_image']) {
$doctor_info_data['sign_image'] = $sign_image;
}
if (empty($doctor_info_data)) {
return fail(HttpEnumCode::HTTP_ERROR,"请您修改后再提交");
}
Db::beginTransaction();
try {
$params = array();
$params['doctor_id'] = $user_info['client_user_id'];
$res = UserDoctorInfo::editUserDoctorInfo($params, $doctor_info_data);
if (!$res) {
Db::rollBack();
return fail(HttpEnumCode::SERVER_ERROR);
}
// 修改审核状态
$params = array();
$params['doctor_id'] = $user_info['client_user_id'];
$data = array();
$data['multi_point_status'] = 2;// 医生多点执业认证状态0:未认证 1:认证通过 2:审核中 3:认证失败)
$data['multi_point_fail_reason'] = "";// 多点执业认证失败原因
$data['updated_at'] = date('Y-m-d H:i:s', time());
$res = UserDoctor::editUserDoctor($params, $data);
if (!$res) {
Db::rollBack();
return fail(HttpEnumCode::SERVER_ERROR);
}
Db::commit();
} catch (\Exception $e) {
Db::rollBack();
return fail(HttpEnumCode::SERVER_ERROR, $e->getMessage());
}
return success();
}
/**
* 获取医生身份认证失败原因
* @return array
*/
public function getIdenAuthFailReason(): array
{
$user_info = $this->request->getAttribute("userInfo") ?? [];
$params = array();
$params['doctor_id'] = $user_info['client_user_id'];
$doctor = UserDoctor::getOne($params);
if (empty($doctor)) {
return fail(HttpEnumCode::HTTP_ERROR, "未知医生");
}
// 实名认证状态0:未认证 1:认证通过 2:认证失败)
if ($doctor['idcard_status'] != 1) {
return fail(HttpEnumCode::HTTP_ERROR, "请先实名认证");
}
// 身份认证状态0:未认证 1:认证通过 2:审核中 3:认证失败)
if ($doctor['iden_auth_status'] != 3){
return success(null);
}
// 获取认证失败字段
$params = array();
$params['doctor_id'] = $doctor['doctor_id'];
$doctor_iden_fails = DoctorIdenFail::getList($params);
if (empty($doctor_iden_fails)){
return success(null);
}
$result = null;
foreach ($doctor_iden_fails as $doctor_iden_fail) {
$result[$doctor_iden_fail['field_name']] = $doctor_iden_fail['fail_reason'];
}
return success($result);
}
/**
* 获取医生个人简介审核失败原因
* @return array
*/
public function getDoctorIntroductionFailReason(): array
{
$user_info = $this->request->getAttribute("userInfo") ?? [];
$params = array();
$params['doctor_id'] = $user_info['client_user_id'];
$doctor = UserDoctor::getOne($params);
if (empty($doctor)) {
return fail(HttpEnumCode::HTTP_ERROR, "未知医生");
}
// 实名认证状态0:未认证 1:认证通过 2:认证失败)
if ($doctor['idcard_status'] != 1) {
return fail(HttpEnumCode::HTTP_ERROR, "请先实名认证");
}
// 身份认证状态0:未认证 1:认证通过 2:审核中 3:认证失败)
if ($doctor['iden_auth_status'] != 3 && $doctor['iden_auth_status'] != 1){
return success(null);
}
// 个人简介审核状态0:未审核 1:审核通过 2:审核中 3:审核失败)
if ($doctor['introduction_status'] != 3){
return success(null);
}
// 获取认证失败字段
$params = array();
$params['doctor_id'] = $doctor['doctor_id'];
$doctor_iden_fails = DoctorIdenFail::getList($params);
if (empty($doctor_iden_fails)){
return success(null);
}
$result = null;
foreach ($doctor_iden_fails as $doctor_iden_fail) {
// 头像
if ($doctor_iden_fail['field_name'] == "avatar") {
$result[$doctor_iden_fail['field_name']] = $doctor_iden_fail['fail_reason'];
}
// 医生简介
if ($doctor_iden_fail['field_name'] == "brief_introduction") {
$result[$doctor_iden_fail['field_name']] = $doctor_iden_fail['fail_reason'];
}
// 擅长
if ($doctor_iden_fail['field_name'] == "be_good_at") {
$result[$doctor_iden_fail['field_name']] = $doctor_iden_fail['fail_reason'];
}
// 专长
if ($doctor_iden_fail['field_name'] == "doctor_expertise") {
$result[$doctor_iden_fail['field_name']] = $doctor_iden_fail['fail_reason'];
}
}
return success($result);
}
/**
* 获取个人简介
* @return array
*/
public function getDoctorIntroduction(): array
{
$user_info = $this->request->getAttribute("userInfo") ?? [];
// 获取医生数据
$fields = [
'doctor_id',
'user_id',
'idcard_status',
'iden_auth_status',
'introduction_status',
'avatar',
'hospital_id',
'department_custom_id',
'department_custom_name',
'department_custom_mobile',
'doctor_title',
'brief_introduction',
'be_good_at',
];
$params = array();
$params['doctor_id'] = $user_info['client_user_id'];
$doctor = UserDoctor::getOne($params, $fields);
if (empty($doctor)) {
return fail(HttpEnumCode::HTTP_ERROR, "未知医生");
}
// 实名认证状态0:未认证 1:认证通过 2:认证失败)
if ($doctor['idcard_status'] != 1) {
return fail(HttpEnumCode::HTTP_ERROR, "请先实名认证");
}
$result = $doctor->toArray();
// 头像
if (!empty($doctor['avatar'])) {
$result['avatar'] = addAliyunOssWebsite($doctor['avatar']);
}
// 职称转换
$result['doctor_title_name'] = empty($doctor['doctor_title']) ? "" : DoctorTitleCode::getMessage($doctor['doctor_title']);
// 获取医生医院
$result['hospital'] = [];
$fields = [
'hospital_id',
'hospital_name',
'hospital_level_name',
'province_id',
'province',
'city_id',
'city',
'county_id',
'county',
];
$params = array();
$params['hospital_id'] = $doctor['hospital_id'];
$hospital = Hospital::getOne($params, $fields);
if (!empty($hospital)) {
$result['hospital'] = $hospital;
}
// 获取医生已选择专长
$UserDoctorService = new UserDoctorService();
$result['doctor_expertise'] = $UserDoctorService->getDoctorSelectedExpertise($doctor['doctor_id']);
// 获取修改数据
$params = array();
$params['doctor_id'] = $doctor['doctor_id'];
$doctor_introduction_record = DoctorIntroductionRecord::getOne($params);
if (!empty($doctor_introduction_record)){
if (!empty($doctor_introduction_record['avatar'])){
$result['avatar'] = addAliyunOssWebsite($doctor_introduction_record['avatar']);
}
if (!empty($doctor_introduction_record['be_good_at'])){
$result['be_good_at'] = $doctor_introduction_record['be_good_at'];
}
if (!empty($doctor_introduction_record['brief_introduction'])){
$result['brief_introduction'] = $doctor_introduction_record['brief_introduction'];
}
// 处理专长
if (!empty($doctor_introduction_record['expertise_ids'])){
$result['doctor_expertise'] = array();
$expertise_ids = explode(',',$doctor_introduction_record['expertise_ids']);
foreach ($expertise_ids as $expertise_id){
$params = array();
$params['expertise_id'] = $expertise_id;
$disease_class_expertise = DiseaseClassExpertise::getOne($params);
if (empty($disease_class_expertise)){
return fail();
}
$data = array();
$data['expertise_id'] = $expertise_id;
$data['expertise_name'] = $disease_class_expertise['expertise_name'];
$result['doctor_expertise'][] = $data;
}
}
}
return success($result);
}
/**
* 修改个人简介
* @return array
*/
public function putDoctorIntroduction(): array
{
$user_info = $this->request->getAttribute("userInfo") ?? [];
$request_params = $this->request->all();
// 获取医生数据
$params = array();
$params['doctor_id'] = $user_info['client_user_id'];
$doctor = UserDoctor::getOne($params);
if (empty($doctor)) {
return fail(HttpEnumCode::HTTP_ERROR, "未知医生");
}
// 实名认证状态0:未认证 1:认证通过 2:认证失败)
if ($doctor['idcard_status'] != 1) {
return fail(HttpEnumCode::HTTP_ERROR, "请先实名认证");
}
// 身份认证状态0:未认证 1:认证通过 2:审核中 3:认证失败)
if ($doctor['iden_auth_status'] != 1) {
return fail(HttpEnumCode::HTTP_ERROR, "请先完成身份认证");
}
// 个人简介审核状态0:未审核 1:审核通过 2:审核中 3:审核失败)
if ($doctor['introduction_status'] == 0){
return fail(HttpEnumCode::HTTP_ERROR, "未审核,暂不允许修改");
}
if ($doctor['introduction_status'] == 2){
return fail(HttpEnumCode::HTTP_ERROR, "审核中,暂不允许修改");
}
// 组合存储数据
$doctor_introduction_record_data = array();
// 头像
$request_params['avatar'] = PcreMatch::pregRemoveOssWebsite($request_params['avatar']);
if ($doctor['avatar'] != $request_params['avatar']) {
$doctor_introduction_record_data['avatar'] = $request_params['avatar'];
}
// 医生简介
if ($doctor['brief_introduction'] != $request_params['brief_introduction']) {
$doctor_introduction_record_data['brief_introduction'] = $request_params['brief_introduction'];
}
// 擅长领域
if ($doctor['be_good_at'] != $request_params['be_good_at']) {
$doctor_introduction_record_data['be_good_at'] = $request_params['be_good_at'];
}
//已选择专长列表
$expertise_ids = [];
// 获取医生专长
$params = array();
$params['doctor_id'] = $user_info['client_user_id'];
$doctor_expertise = DoctorExpertise::getList($params);
if (!empty($doctor_expertise)) {
$expertise_ids = array_column($doctor_expertise->toArray(), 'expertise_id');
}
// 对比已选择专长
// 对比专长是否删除
$is_delete_expertise = array_diff($request_params['doctor_expertise'], $expertise_ids);
// 对比专长是否新增
if (empty($is_delete_expertise)) {
$is_add_expertise = array_diff($expertise_ids, $request_params['doctor_expertise']);
}
// 专长是否改动false未改动 true已改动
$expertise_is_change = false;
if (!empty($is_delete_expertise) || !empty($is_add_expertise)) {
$doctor_introduction_record_data['expertise_ids'] = implode(',',$request_params['doctor_expertise']);
$expertise_is_change = true;
}
if (empty($doctor_introduction_record_data)){
// 未修改
return success();
}
// 审核失败,重新提交,判断被审核错误字段数据是否更改
if ($doctor['introduction_status'] == 3){
// 获取认证失败字段
$params = array();
$params['doctor_id'] = $user_info['client_user_id'];
$doctor_iden_fails = DoctorIdenFail::getList($params);
if (!empty($doctor_iden_fails)){
foreach ($doctor_iden_fails as $doctor_iden_fail){
// 头像
if ($doctor_iden_fail['field_name'] == "avatar") {
if ($doctor['avatar'] == $request_params['avatar']){
return fail(HttpEnumCode::HTTP_ERROR,"医生头像" . $doctor_iden_fail['fail_reason']);
}
}
// 医生简介
if ($doctor_iden_fail['field_name'] == "brief_introduction") {
if ($doctor['brief_introduction'] == $request_params['brief_introduction']){
return fail(HttpEnumCode::HTTP_ERROR,"医生简介" . $doctor_iden_fail['fail_reason']);
}
}
// 擅长领域
if ($doctor_iden_fail['field_name'] == "be_good_at") {
if ($doctor['be_good_at'] == $request_params['be_good_at']){
return fail(HttpEnumCode::HTTP_ERROR,"擅长领域" . $doctor_iden_fail['fail_reason']);
}
}
// 专长
if ($doctor_iden_fail['field_name'] == "expertise_ids") {
if (!$expertise_is_change){
return fail(HttpEnumCode::HTTP_ERROR,"专长" . $doctor_iden_fail['fail_reason']);
}
}
}
}
}
Db::beginTransaction();
try {
// 审核不通过
if ($doctor['introduction_status'] == 3){
// 删除认证失败字段
$params = array();
$params['doctor_id'] = $user_info['client_user_id'];
DoctorIdenFail::del($params);
// 删除简介修改记录表
$params = array();
$params['doctor_id'] = $user_info['client_user_id'];
DoctorIntroductionRecord::del($params);
}
// 新增医生简介修改记录表
$doctor_introduction_record_data['doctor_id'] = $doctor['doctor_id'];
$doctor_introduction_record = DoctorIntroductionRecord::addDoctorIntroductionRecord($doctor_introduction_record_data);
if (empty($doctor_introduction_record)){
Db::rollBack();
return fail(HttpEnumCode::SERVER_ERROR);
}
// 修改医生表个人简介审核状态
$params = array();
$params['doctor_id'] = $user_info['client_user_id'];
$data = array();
$data['introduction_status'] = 2;
$data['updated_at'] = date('Y-m-d H:i:s', time());
$res = UserDoctor::editUserDoctor($params, $data);
if (!$res) {
Db::rollBack();
return fail(HttpEnumCode::SERVER_ERROR);
}
Db::commit();
} catch (\Exception $e) {
Db::rollBack();
return fail(HttpEnumCode::SERVER_ERROR, $e->getMessage());
}
return success();
}
}