Files
xk-api-yii/service/modules/v1/controllers/StoreAcceptController.php

305 lines
11 KiB
PHP

<?php
namespace service\modules\v1\controllers;
use common\core\BaseAppController;
use common\enums\RegisterEnum;
use common\forms\RegisterRefundForm;
use common\jobs\RegisterAcceptJob;
use common\jobs\templateMessage\RegisterAccept;
use common\models\DoctorPatient;
use common\models\Prescription;
use common\models\Register;
use common\models\RegisterRefund;
use common\models\SystemNotice;
use common\models\UserPatient;
use yii\db\Exception;
/**
* @doc-module 到店接诊
*/
class StoreAcceptController extends BaseAppController
{
/**
* @doc-name 患者信息(线下患者挂号信息)
* @doc-param int register_id 挂号id
* @doc-param int patient_id 患者id
* @doc-return mixed @Register{*} 挂号信息
* @doc-return mixed @UserPatient{*} 患者信息
* @doc-return mixed @UserPatientHealthInquiry{*} 健康信息
* @doc-return mixed @Store{name-string-门店} 门店信息
* @doc-return mixed @Doctor{name-string-医生} 医生信息
* @doc-return mixed @Depart{name-string-科室} 科室信息
*/
public function actionPatientDetail()
{
$post=\Yii::$app->request->post();
$this->requestValidate($post,[
[['patient_id','register_id'],'required']
]);
$register=Register::find()->where([
'id'=>$post['register_id'],
'service_user_id'=>\Yii::$app->user->id,
'user_patient_id'=>$post['patient_id'],
'is_pay'=>1,
'is_cancel'=>0,
'is_delete'=>0
])->with(['patient','healthInquery'])
->with(['depart'=>function($d){
$d->select('name');
}])
->with(['doctor'=>function($d){
$d->select('name');
}])
->with(['store'=>function($s){
$s->select('name');
}])
->asArray()->one();
if (!$register) throw new Exception('挂号不存在');
$prescription = Prescription::find()->select('id,prescription_no')->where(['register_id' => $register['id']])->all();
$register['prescription'] = $prescription;
return $register;
}
/**
* @doc-name 患者信息(线下患者挂号信息)
* @doc-param int register_id 挂号id
* @doc-param int patient_id 患者id
* @doc-return mixed @Register{*} 挂号信息
* @doc-return mixed @UserPatient{*} 患者信息
* @doc-return mixed @UserPatientHealthInquiry{*} 健康信息
* @doc-return mixed @Store{name-string-门店} 门店信息
* @doc-return mixed @Doctor{name-string-医生} 医生信息
* @doc-return mixed @Depart{name-string-科室} 科室信息
*/
public function actionPatientDetailAll()
{
$post=\Yii::$app->request->post();
$this->requestValidate($post,[
[['patient_id','register_id'],'required']
]);
$register=Register::find()->where([
'id'=>$post['register_id'],
'service_user_id'=>\Yii::$app->user->id,
'user_patient_id'=>$post['patient_id'],
'is_cancel'=>0,
'is_delete'=>0
])->with(['patient','healthInquery'])
->with(['depart'=>function($d){
$d->select('name');
}])
->with(['doctor'=>function($d){
$d->select('name');
}])
->with(['store'=>function($s){
$s->select('name');
}])
->asArray()->one();
if (!$register) throw new Exception('挂号不存在');
$prescription = Prescription::find()->select('id,prescription_no')->where(['register_id' => $register['id']])->all();
$register['prescription'] = $prescription;
return $register;
}
/**
* @doc-name 患者详情
* @doc-param int patient_id 患者id
* @doc-return mixed @Info{@UserPatient{*,@UserPatientCase{*},@UserPatientHealthInquiry{*}}} 基本信息
* @doc-return mixed @Register{*,@UserPatientCase{*}} 挂号列表
* @doc-return mixed @Prescription{*} 处方列表
*/
public function actionPatientInfo()
{
$post=\Yii::$app->request->post();
$this->requestValidate($post,[
['patient_id','required']
]);
$info=UserPatient::find()->where([
'id'=>$post['patient_id'],
'is_delete'=>0
])->with(['case','health'])->asArray()->one();
if (!$info){
throw new Exception('患者不存在');
}
$register=Register::find()->where([
'service_user_id'=>\Yii::$app->user->id,
'user_patient_id'=>$post['patient_id'],
'is_delete'=>0,
'is_pay'=>1,
'is_cancel'=>0
])->andWhere([
'like','order_no',$post['order_no']??'',
])->with(['case'])->asArray()->all();
Prescription::find()->where([
'su_id'=>\Yii::$app->user->id,
'up_id'=>$post['patient_id'],
'is_pay'=>1,
'cancel_status'=>0
])->andWhere([
'like','prescription_no',$post['prescription_no']??'',
])->all();
return [
'info'=>$info,
// 'Register'=>$register,
// 'Prescription'=>$Prescription,
];
}
/**
* @doc-name 接诊/拒诊
* @doc-param int register_id 挂号id
* @doc-param int status 1接诊2拒绝
* @doc-param json refuse_reason 拒诊原因["咨询不对症","患者病情复杂"] / optional
*/
public function actionAcceptOrRefuse()
{
$post=\Yii::$app->request->post();
$this->requestValidate($post,[
[['register_id','status'],'required']
]);
$register=Register::find()->where([
'id'=>$post['register_id'],
'service_user_id'=>\Yii::$app->user->id,
'is_pay'=>1,
'is_cancel'=>0,
'is_delete'=>0,
])->andWhere(['status'=>[RegisterEnum::WAIT]])->one();
if (!$register) throw new Exception('挂号不存在');
$UserPatient = UserPatient::find()->where([
'user_id' => $register->user_id,
'id' =>$register->user_patient_id
])->one();
if (!$UserPatient) throw new Exception('就诊人不存在');
if ($post['status']==1){
$transaction=\Yii::$app->db->beginTransaction();
try {
//医生患者表(接诊后添加,已存在不新增)
$isDoctorPatient = DoctorPatient::find()->where([
'user_id' => $register->user_id,
'su_id' => \Yii::$app->user->id,
'up_id' => $register->user_patient_id
])->one();
if(!$isDoctorPatient){
$DoctorPatient=new DoctorPatient();
$DoctorPatient->user_id=$register->user_id;
$DoctorPatient->su_id=\Yii::$app->user->id;
$DoctorPatient->up_id=$register->user_patient_id;
$DoctorPatient->avatar=$UserPatient->avatar;
$DoctorPatient->name=$UserPatient->name;
$DoctorPatient->id_card=$UserPatient->id_card;
$DoctorPatient->sex=$UserPatient->sex;
$DoctorPatient->mobile=$UserPatient->mobile;
$DoctorPatient->saveOrFail();
}
//接诊
$register->status=RegisterEnum::ACCEPTING;
$register->created_at=strtotime( $register->created_at);
$register->updated_at=time();
$register->saveOrFail();
$transaction->commit();
//挂号接诊订阅消息通知
\Yii::$app->queue->push(new RegisterAccept([
'orderId' => $register->id,
]));
//挂号已接诊分账结算
\Yii::$app->queue->push(new RegisterAcceptJob([
'orderId' => $register->id,
]));
return ['已接诊'];
}catch (Exception $e){
$transaction->rollBack();
throw new $e;
}
}else{
if(!$post['refuse_reason']) throw new Exception('拒诊原因不能为空');
$t=\Yii::$app->db->beginTransaction();
try {
$register->status=RegisterEnum::REFUSE;
$register->refuse_reason=$post['refuse_reason'];
$register->created_at=strtotime( $register->created_at);
$register->updated_at=time();
$register->saveOrFail();
//发送拒诊通知
$systemNotice = new SystemNotice();
$systemNotice->content = '由于'.$post['refuse_reason'].',医生已拒绝接诊!';
$systemNotice->base_type = 3;//处方通知
$systemNotice->scene_type = 1;
$systemNotice->user_id = $register->user_id;
$systemNotice->notice_at = date('Y-m-d H:i:s',time());
$systemNotice->saveOrFail();
//退款
$form=new RegisterRefundForm();
$form->refund($post['register_id']);
$t->commit();
return ['已拒诊'];
}catch (\Exception $e){
$t->rollBack();
throw new Exception($e->getMessage());
}
}
}
/**
* @doc-name 问诊结束
* @doc-param int register_id 挂号id
*/
public function actionRegisterOver()
{
$post=\Yii::$app->request->post();
$this->requestValidate($post,[
[['register_id'],'required']
]);
$register = Register::find()->select('status')->where([
'id' => $post['register_id'],
'service_user_id' => \Yii::$app->user->id,
'is_pay' => 1,
'is_cancel' => 0,
'is_delete' => 0,
])->andWhere(['status'=>[RegisterEnum::ACCEPTING]])->one();
if (!$register) throw new Exception('挂号不存在');
Register::updateAll(['status' => RegisterEnum::OVER],['id' => $post['register_id']]);
//发送问诊结束通知
$systemNotice = new SystemNotice();
$systemNotice->content = '问诊已结束,祝您早日康复!';
$systemNotice->base_type = 3;//问诊结束通知
$systemNotice->scene_type = 1;
$systemNotice->user_id = $register->user_id;
$systemNotice->notice_at = date('Y-m-d H:i:s',time());
$systemNotice->saveOrFail();
return ['已结束'];
}
/**
* @doc-name 拒诊原因列表
*/
public function actionRefuseList()
{
$data=[
['key'=>0,'value'=>'咨询不对症'],
['key'=>1,'value'=>'患者缺少诊疗资料'],
['key'=>2,'value'=>'患者病情复杂'],
];
return $data;
}
}