Files
xk-api-yii/member/modules/v1/controllers/DoctorController.php

456 lines
17 KiB
PHP
Raw Normal View History

2024-09-19 11:32:39 +08:00
<?php
namespace member\modules\v1\controllers;
use common\core\BaseAppController;
use common\enums\OrderAcceptEnum;
use common\enums\UserRoleEnum;
use common\enums\UserStatusEnum;
use common\helpers\ArrayHelper;
use common\helpers\StringHelper;
2024-12-19 19:20:27 +08:00
use common\models\oldDb\Department;
use common\models\oldDb\DoctorInfo;
use common\models\oldDb\DoctorService;
use common\models\oldDb\FollowDoctor;
use common\models\oldDb\ImMessage;
use common\models\oldDb\Order;
use common\models\oldDb\Register;
use common\models\oldDb\ServiceUser;
use common\models\oldDb\Store;
use common\models\oldDb\StoreDoctor;
use common\models\oldDb\UserComment;
use common\modelsgii\oldDb\DoctorArticle;
2024-09-19 11:32:39 +08:00
use yii\base\Exception;
/**
* @doc-module 医生
*/
class DoctorController extends BaseAppController
{
public $optional = ['all-list'];
/**
* @doc-name 科室列表
* @doc-return mixed @Department{*,child-array-下级列表} 科室列表
*/
public function actionOfficeList()
{
$list = Department::find()->where([
'pid' => 0,
])->with('child')->asArray()->all();
return $list;
}
/**
* @doc-name 医生列表
* @doc-param string keyword 关键词 / optional
* @doc-param json depart_id 科室id,多选["科室id1","科室id2"] [] optional
* @doc-param json title_id 职称,多选["id1","id2"] [] optional
* @doc-param int sort 1综合排序2问诊量3接诊率4综合评分 1 optional
* @doc-param int page 页码 1 optional
* @doc-param int page_size 每页条数 20 optional
* @doc-return mixed @List{ServiceUser{id,avatar-string-医生头像,name-string-医生姓名,depart-string-医生科室,store-string-门店,title-string-职称,good_at-string-擅长,accept_percent-string-接诊率,inquiry_num-int-问诊量,overall_score-int-综合评分,@Service{DoctorService{register_status,register_price}}}} 医生列表
* @doc-return mixed @Pagination{total_count-int-总数量,page_count-int-总页数,current_page-int-当前页,per_page-int-每页条数} 分页数据
*/
public function actionAllList()
{
$post = \Yii::$app->request->post();
2024-12-02 09:29:24 +08:00
$keyword = $post['keyword']?? '';
2024-09-19 11:32:39 +08:00
$store_id = \Yii::$app->store;
$su_id = StoreDoctor::find()->select('su_id')->where([
'store_id' => $store_id,
'is_delete' => 0
])->column() ;
$query = ServiceUser::find()->alias('su')->where([
'su.role' => UserRoleEnum::DOCTOR,
'su.status' => UserStatusEnum::OK,
'su.is_delete' => 0
])->andWhere([
'in', 'su.id', $su_id
]);
$depart_arr = json_decode(ArrayHelper::getValue($post, 'depart_id', "[]"), true);
$title_arr = json_decode(ArrayHelper::getValue($post, 'title_id', "[]"), true);
// $sort = ArrayHelper::getValue($post, 'sort', 0);
$departs = Department::find()->select('id,name')->where(['<>', 'id', 0])->asArray()->all();
$id = 0;
foreach ($departs as $v) {
if (in_array($keyword, $v) == true) {
$id = $v['id'];
}
}
$query->joinWith(['docInfo' => function ($q) use ($id, $keyword, $depart_arr, $title_arr) {
$q->alias('i');
// 患者端列表不展示测试医生
$q->andWhere(['i.is_test' => 0]);
2024-09-19 11:32:39 +08:00
//搜索框搜索姓名和科室
if (!empty($keyword)) {
$q->andWhere([
'or',
['like', 'i.name', $keyword],
['i.depart_id' => $id]
]);
}
//科室搜索
if (!empty($depart_arr)) {
$q->andWhere([
'i.depart_id' => $depart_arr
]);
}
//职称搜索
if (!empty($title_arr)) {
$q->andWhere([
'i.title_id' => $title_arr
]);
}
}]);
$query->joinWith(['docIdentity' => function ($q) {
$q->alias('it');
}]);
if (!empty($post['sort'])){
switch ($post['sort']) {
case 1://综合排序
$query->orderBy('i.id desc');
break;
case 2://问诊量
$query->orderBy('i.inquiries desc');
break;
case 3://接诊率
$query->orderBy('i.reception_rate desc');
break;
case 4://综合评分
$query->orderBy('i.grade desc');
break;
default:
return ['参数错误'];
}
}
$this->field = [
ServiceUser::class => [
'id',
'avatar' => 'docIdentity.work_avator',
'name' => 'docInfo.name',
'depart' => 'docInfo.depart.name',
'store' => function () use($store_id){
$store = Store::findOne(['id' => $store_id]);
return $store->name;
},
'title' => 'docInfo.title.name',
'good_at' => 'docInfo.good_at',
'accept_percent' => function ($model) {
$accept_num = Order::find()->where([
'su_id' => $model->id,
'is_pay' => 1,
'accept_status' => [OrderAcceptEnum::ACCEPTING, OrderAcceptEnum::OVER],
])->count();
$all_num = Order::find()->where([
'su_id' => $model->id,
'is_pay' => 1,
'accept_status' => [OrderAcceptEnum::TIMEOUT_ACCEPT, OrderAcceptEnum::REFUSED, OrderAcceptEnum::ACCEPTING, OrderAcceptEnum::OVER],
])->count();
$accept_percent= $all_num == 0 ? 100 : round(($accept_num / $all_num) * 100, 2) ;
$DoctorInfo= DoctorInfo::find()->where([
'su_id'=>$model->id
])->one();
if ($DoctorInfo){
$DoctorInfo->su_id=$model->id;
$DoctorInfo->reception_rate=$accept_percent;
$DoctorInfo->saveOrFail();
}
return $accept_percent;
},
'inquiry_num' => function($model){
$count=Register::find()->where([
'service_user_id' => $model->id,
'is_pay' => 1,
'is_cancel'=>0
])->count();
$DoctorInfo= DoctorInfo::find()->where([
'su_id'=>$model->id
])->one();
if ($DoctorInfo){
$DoctorInfo->inquiries=$count;
$DoctorInfo->saveOrFail();
}
return $count;
},
'overall_score' => function($m){
$score= UserComment::find()->select('score')->where([
'su_id'=>$m->id
])->column();
$allnum=UserComment::find()->where([
'su_id'=>$m->id
])->count();
$sum_score=array_sum($score);
$overall_score= $allnum == 0 ? '5' : round(($sum_score / $allnum) , 2) ;
$DoctorInfo= DoctorInfo::find()->where([
'su_id'=>$m->id
])->one();
if ($DoctorInfo){
$DoctorInfo->su_id=$m->id;
$DoctorInfo->grade=$overall_score;
$DoctorInfo->saveOrFail();
}
return $overall_score;
},
'service' => 'docService'
],
DoctorService::class => [
'register_status', 'register_price'
]
];
return $this->create($query, $post);
}
/**
* @doc-name 医生详情
* @doc-param int doctor_id 医生id
* @doc-return mixed ServiceUser{id,avatar-string-医生头像,name-string-医生姓名,depart-string-医生科室,store-string-门店,title-string-职称,good_at-string-擅长,intro-string-简介,accept_percent-string-接诊率,inquiry_num-int-问诊量,overall_score-float-综合评分,status-int-状态1为关注其他返回均为未关注,@Service{DoctorService{*}}} 医生详情
*/
public function actionDetail()
{
$post = \Yii::$app->request->post();
$this->requestValidate($post, [
['doctor_id', 'required']
]);
$store_id = \Yii::$app->store;
$su_id = StoreDoctor::find()->select('su_id')->where([
'store_id' => $store_id,
'su_id'=>$post['doctor_id'],
'is_delete' => 0
])->column() ;
$doctor = ServiceUser::find()->alias('su')->where([
'su.id' => $su_id,
'su.role' => UserRoleEnum::DOCTOR,
'su.status' => UserStatusEnum::OK,
'id' => $post['doctor_id'],
'is_delete' => 0
])->with('docService')->one();
if (!$doctor) throw new Exception('医生不存在');
return ArrayHelper::toArray($doctor, [
ServiceUser::class => [
'id',
'avator' => 'docIdentity.work_avator',
'name' => 'docInfo.name',
'depart' => 'docInfo.depart.name',
'store' => function () use($store_id){
$store = Store::findOne(['id' => $store_id]);
return $store->name;
},
'title' => 'docInfo.title.name',
'good_at' => 'docInfo.good_at',
'intro' => 'docInfo.intro',
'accept_percent' => function ($model) {
$accept_num = Order::find()->where([
'su_id' => $model->id,
'is_pay' => 1,
'accept_status' => [OrderAcceptEnum::ACCEPTING, OrderAcceptEnum::OVER],
])->count();
$all_num = Order::find()->where([
'su_id' => $model->id,
'is_pay' => 1,
'accept_status' => [OrderAcceptEnum::TIMEOUT_ACCEPT, OrderAcceptEnum::REFUSED, OrderAcceptEnum::ACCEPTING, OrderAcceptEnum::OVER],
])->count();
return $all_num == 0 ? '100%' : round(($accept_num / $all_num) * 100, 2) . '%';
},
'inquiry_num' => function ($model) {
$count=Register::find()->where([
'service_user_id' => $model->id,
'is_pay' => 1,
'is_cancel'=>0
])->count();
$DoctorInfo= DoctorInfo::find()->where([
'su_id'=>$model->id
])->one();
if ($DoctorInfo){
$DoctorInfo->inquiries=$count;
$DoctorInfo->saveOrFail();
}
return $count;
},
'overall_score' => function($m){
$score= UserComment::find()->select('score')->where([
'su_id'=>$m->id
])->column();
$allnum=UserComment::find()->where([
'su_id'=>$m->id
])->count();
$sum_score=array_sum($score);
return $allnum == 0 ? '5' : round(($sum_score / $allnum) , 2) ;
},
'service' => 'docService',
'status' => function ($model) {
$status = FollowDoctor::find()->select('status')
->where([
'su_id' => $model->id,
'user_id' => \Yii::$app->user->identity->id
])->column();
if (empty($status)) {
return 0;//未关注
}
return $status;
},
],
]);
}
/**
* @doc-name 患者评论的顶部
* @doc-param int su_id 医生id
* @doc-return int all_num 全部
* @doc-return int high_score 高分
* @doc-return int low_score 低分
* @doc-return string patient_score 患者评分
*/
public function actionTop()
{
$post = \Yii::$app->request->post();
$this->requestValidate($post, [
['su_id', 'required']
]);
$doctor = ServiceUser::find()->alias('su')->where([
'su.role' => UserRoleEnum::DOCTOR,
'su.status' => UserStatusEnum::OK,
'id' => $post['su_id'],
'is_delete' => 0
])->all();
if (!$doctor) throw new \yii\db\Exception('医生不存在');
$all_num = UserComment::find()->where([
'su_id' => $post['su_id']
])->count();
$high_score = UserComment::find()->where([
'>=', 'score', 4,
])->andWhere(['su_id' => $post['su_id']])->count();
$low_score = UserComment::find()->where([
'<=', 'score', 3,
])->andWhere(['su_id' => $post['su_id']])->count();
return [
'all_num' => $all_num,
'high_score' => $high_score,
'low_score' => $low_score,
'patient_score' => '5.0',
];
}
/**
* @doc-name 评价列表
* @doc-param int keyword 筛选1全部2高分3低分
* @doc-param int su_id 医生id
* @doc-return mixed @List{id-int-评论id,comment-string-评论,score-int-评分,created_at-int-发布时间,nickname-string-昵称,avatarurl-string-头像} 评价信息
* @doc-return mixed @Pagination{total-int-总数据,totalPage-int-页数,pageSize-int-每页数据} 分页信息
*/
public function actionCommentList()
{
$post = \Yii::$app->request->post();
$this->requestValidate($post, [
['su_id', 'required']
]);
$doctor = ServiceUser::find()->alias('su')->where([
'su.role' => UserRoleEnum::DOCTOR,
'su.status' => UserStatusEnum::OK,
'id' => $post['su_id'],
'is_delete' => 0
])->all();
if (!$doctor) throw new \yii\db\Exception('医生不存在');
$query = UserComment::find()->where([
'su_id' => $post['su_id']
]);
switch ($post['keyword']) {
case 1://全部
$query->all();
break;
case 2:
$query->andWhere(['>=', 'score', 4,]);
break;
case 3://低分
$query->andWhere(['<=', 'score', 3,]);
break;
}
$this->field = [
UserComment::class => [
'id', 'score', 'comment', 'created_at',
'avator'=>function($u){
return $u->userPatient->avatar??'https://tenfei03.cfp.cn/creative/vcg/veer/1600water/veer-105516317.jpg';
},
'nickname'=>function($m){
return StringHelper::string_hide_cut($m->userPatient->name);
},
],
];
return $this->create($query, $post);
}
/**
* @doc-name 医生文章列表
* @doc-param int id 医生id
* @doc-return mixed @List{id-int-文章id,cover-string-封面,title-string-标题,created_at-int-发布时间} 文章信息
* @doc-return mixed @Pagination{total-int-总数据,totalPage-int-总页数,pageSize-int-每页数据} 分页信息
*/
public function actionArticleList()
{
$post = \Yii::$app->request->post();
$this->requestValidate($post, [
['id', 'required']
]);
$query = DoctorArticle::find()->where([
'su_id' => $post['id'],
'is_draft' => 0,
'is_delete' => 0,
]);
$this->field = [
DoctorArticle::class => [
'id', 'title', 'created_at',
'cover' => function ($model) {
if (empty($model->cover)) {
return 'https://yanydy.oss-cn-hangzhou.aliyuncs.com/uploads/20221130/e52920ceb880e422de5f8b040daa03ab.jpg';
}
return $model->cover;
}
]
];
return $this->create($query, $post);
}
/**
* @doc-name 问诊记录列表
* @doc-param string keyword 搜索疾病或症状 / optional
* @doc-param int id 医生id
* @doc-return mixed @List{type-int-0用户问1医生回复}
*/
public function actionAskList()
{
$post = \Yii::$app->request->post();
$this->requestValidate($post, [
['id', 'required']
]);
$query= ImMessage::find()->where([
'service_id'=>$post['id'],
'is_delete'=>0
])->addSelect('content,type')->groupBy('ims_id')->orderBy('id desc');
$this->field=[
'id','content','type'
];
return $this->create($query,$post);
}
}