632 lines
18 KiB
PHP
632 lines
18 KiB
PHP
<?php
|
||
// +----------------------------------------------------------------------
|
||
// | likeadmin快速开发前后端分离管理后台(PHP版)
|
||
// +----------------------------------------------------------------------
|
||
// | 欢迎阅读学习系统程序代码,建议反馈是我们前进的动力
|
||
// | 开源版本可自由商用,可去除界面版权logo
|
||
// | gitee下载:https://gitee.com/likeshop_gitee/likeadmin
|
||
// | github下载:https://github.com/likeshop-github/likeadmin
|
||
// | 访问官网:https://www.likeadmin.cn
|
||
// | likeadmin团队 版权所有 拥有最终解释权
|
||
// +----------------------------------------------------------------------
|
||
// | author: likeadminTeam
|
||
// +----------------------------------------------------------------------
|
||
|
||
namespace app\adminapi\controller\tcm;
|
||
|
||
use app\adminapi\controller\BaseAdminController;
|
||
use app\adminapi\lists\tcm\DiagnosisLists;
|
||
use app\adminapi\logic\tcm\DiagnosisLogic;
|
||
use app\adminapi\validate\tcm\DiagnosisValidate;
|
||
use app\common\model\WechatChatRecord;
|
||
|
||
/**
|
||
* 中医辨房病因诊单控制器
|
||
* Class DiagnosisController
|
||
* @package app\adminapi\controller\tcm
|
||
*/
|
||
class DiagnosisController extends BaseAdminController
|
||
{
|
||
/**
|
||
* @notes 测试接口
|
||
* @return \think\response\Json
|
||
*/
|
||
public function test()
|
||
{
|
||
return $this->success('中医诊单控制器可以访问', [
|
||
'controller' => 'TcmDiagnosisController',
|
||
'namespace' => __NAMESPACE__,
|
||
'class' => __CLASS__,
|
||
'method' => __METHOD__
|
||
]);
|
||
}
|
||
|
||
/**
|
||
* @notes 诊单列表
|
||
* @return \think\response\Json
|
||
*/
|
||
public function lists()
|
||
{
|
||
return $this->dataLists(new DiagnosisLists());
|
||
}
|
||
|
||
/**
|
||
* @notes 医助理诊单统计(按部门、按人)
|
||
* @return \think\response\Json
|
||
*/
|
||
public function assistantDiagnosisStats()
|
||
{
|
||
$params = $this->request->get();
|
||
$result = DiagnosisLogic::assistantDiagnosisStats($params);
|
||
return $this->data($result);
|
||
}
|
||
|
||
/**
|
||
* @notes 添加诊单
|
||
* @return \think\response\Json
|
||
*/
|
||
public function add()
|
||
{
|
||
$params = (new DiagnosisValidate())->post()->goCheck('add');
|
||
$result = DiagnosisLogic::add($params);
|
||
if ($result) {
|
||
return $this->success('添加成功', ['id' => $result], 1, 1);
|
||
}
|
||
return $this->fail(DiagnosisLogic::getError());
|
||
}
|
||
|
||
/**
|
||
* @notes 编辑诊单
|
||
* @return \think\response\Json
|
||
*/
|
||
public function edit()
|
||
{
|
||
$params = (new DiagnosisValidate())->post()->goCheck('edit');
|
||
$result = DiagnosisLogic::edit($params);
|
||
if ($result) {
|
||
return $this->success('编辑成功', [], 1, 1);
|
||
}
|
||
return $this->fail(DiagnosisLogic::getError());
|
||
}
|
||
|
||
/**
|
||
* @notes 删除诊单
|
||
* @return \think\response\Json
|
||
*/
|
||
public function delete()
|
||
{
|
||
$params = (new DiagnosisValidate())->post()->goCheck('id');
|
||
$result = DiagnosisLogic::delete($params);
|
||
if ($result) {
|
||
return $this->success('删除成功', [], 1, 1);
|
||
}
|
||
return $this->fail(DiagnosisLogic::getError());
|
||
}
|
||
|
||
/**
|
||
* @notes 诊单详情
|
||
* @return \think\response\Json
|
||
*/
|
||
public function detail()
|
||
{
|
||
|
||
$params = (new DiagnosisValidate())->goCheck('id');
|
||
$result = DiagnosisLogic::detail($params);
|
||
return $this->data($result);
|
||
}
|
||
|
||
/**
|
||
* @notes 诊单详情(患者端)
|
||
* @return \think\response\Json
|
||
*/
|
||
public function diagnosisDetail()
|
||
{
|
||
$params = $this->request->get();
|
||
|
||
if (empty($params['id'])) {
|
||
return $this->fail('诊单ID不能为空');
|
||
}
|
||
|
||
if (empty($params['user_id'])) {
|
||
return $this->fail('用户ID不能为空');
|
||
}
|
||
|
||
$result = DiagnosisLogic::diagnosisDetail($params);
|
||
if ($result) {
|
||
return $this->data($result);
|
||
}
|
||
return $this->fail(DiagnosisLogic::getError());
|
||
}
|
||
|
||
/**
|
||
* @notes 检查手机号是否重复
|
||
* @return \think\response\Json
|
||
*/
|
||
public function checkPhone()
|
||
{
|
||
$params = $this->request->post();
|
||
$result = DiagnosisLogic::checkPhone($params);
|
||
return $this->data($result);
|
||
}
|
||
|
||
/**
|
||
* @notes 检查身份证号是否重复
|
||
* @return \think\response\Json
|
||
*/
|
||
public function checkIdCard()
|
||
{
|
||
$params = $this->request->post();
|
||
$result = DiagnosisLogic::checkIdCard($params);
|
||
return $this->data($result);
|
||
}
|
||
|
||
/**
|
||
* @notes 补全身份证号(自动计算年龄并更新)
|
||
* @return \think\response\Json
|
||
*/
|
||
public function fillIdCard()
|
||
{
|
||
$params = (new DiagnosisValidate())->post()->goCheck('fillIdCard');
|
||
$result = DiagnosisLogic::fillIdCard($params);
|
||
if ($result) {
|
||
return $this->success('补全成功,年龄已自动更新', [], 1, 1);
|
||
}
|
||
return $this->fail(DiagnosisLogic::getError());
|
||
}
|
||
|
||
/**
|
||
* @notes 指派医助
|
||
* @return \think\response\Json
|
||
*/
|
||
public function assign()
|
||
{
|
||
$params = $this->request->post();
|
||
|
||
// 验证参数
|
||
if (empty($params['id'])) {
|
||
return $this->fail('诊单ID不能为空');
|
||
}
|
||
|
||
if (!isset($params['assistant_id'])) {
|
||
return $this->fail('请选择医助');
|
||
}
|
||
|
||
$result = DiagnosisLogic::assign($params);
|
||
if ($result) {
|
||
return $this->success('指派成功', [], 1, 1);
|
||
}
|
||
return $this->fail(DiagnosisLogic::getError());
|
||
}
|
||
|
||
/**
|
||
* @notes 指派医助操作记录
|
||
* @return \think\response\Json
|
||
*/
|
||
public function assignLogList()
|
||
{
|
||
$params = (new DiagnosisValidate())->goCheck('id');
|
||
$result = DiagnosisLogic::assignLogList((int) $params['id']);
|
||
|
||
return $this->data($result);
|
||
}
|
||
|
||
/**
|
||
* @notes 获取通话签名
|
||
* @return \think\response\Json
|
||
*/
|
||
public function getCallSignature()
|
||
{
|
||
$params = $this->request->post();
|
||
|
||
if (empty($params['diagnosis_id'])) {
|
||
return $this->fail('诊单ID不能为空');
|
||
}
|
||
|
||
if (empty($params['patient_id'])) {
|
||
return $this->fail('患者ID不能为空');
|
||
}
|
||
|
||
// 传递当前管理员ID
|
||
$params['admin_id'] = $this->adminId;
|
||
|
||
$result = DiagnosisLogic::getCallSignature($params);
|
||
if ($result) {
|
||
return $this->data($result);
|
||
}
|
||
return $this->fail(DiagnosisLogic::getError());
|
||
}
|
||
|
||
/**
|
||
* @notes 发起通话
|
||
* @return \think\response\Json
|
||
*/
|
||
public function startCall()
|
||
{
|
||
$params = $this->request->post();
|
||
|
||
if (empty($params['diagnosis_id'])) {
|
||
return $this->fail('诊单ID不能为空');
|
||
}
|
||
|
||
// 传递当前管理员ID
|
||
$params['admin_id'] = $this->adminId;
|
||
|
||
$result = DiagnosisLogic::startCall($params);
|
||
if ($result) {
|
||
return $this->success('发起通话成功', [], 1, 1);
|
||
}
|
||
return $this->fail(DiagnosisLogic::getError());
|
||
}
|
||
|
||
/**
|
||
* @notes 结束通话
|
||
* @return \think\response\Json
|
||
*/
|
||
public function endCall()
|
||
{
|
||
$params = $this->request->post();
|
||
|
||
if (empty($params['diagnosis_id'])) {
|
||
return $this->fail('诊单ID不能为空');
|
||
}
|
||
|
||
// 传递当前管理员ID
|
||
$params['admin_id'] = $this->adminId;
|
||
|
||
$result = DiagnosisLogic::endCall($params);
|
||
if ($result) {
|
||
return $this->success('', [], 1, 1);
|
||
}
|
||
return $this->fail(DiagnosisLogic::getError());
|
||
}
|
||
|
||
/**
|
||
* @notes 获取通话记录
|
||
* @return \think\response\Json
|
||
*/
|
||
public function getCallRecords()
|
||
{
|
||
$params = $this->request->get();
|
||
|
||
if (empty($params['diagnosis_id'])) {
|
||
return $this->fail('诊单ID不能为空');
|
||
}
|
||
|
||
$result = DiagnosisLogic::getCallRecords($params);
|
||
return $this->data($result);
|
||
}
|
||
|
||
/**
|
||
* @notes 获取诊单关联的腾讯云 IM 单聊记录(admin_getroammsg)
|
||
*/
|
||
public function getImChatMessages()
|
||
{
|
||
$diagnosisId = (int)$this->request->get('diagnosis_id', 0);
|
||
if ($diagnosisId <= 0) {
|
||
return $this->fail('诊单ID不能为空');
|
||
}
|
||
$result = DiagnosisLogic::getImChatMessagesForDiagnosis($diagnosisId);
|
||
if ($result === false) {
|
||
return $this->fail(DiagnosisLogic::getError());
|
||
}
|
||
return $this->data($result);
|
||
}
|
||
|
||
/**
|
||
* @notes 绑定 TRTC 房间号到当前诊单通话记录(便于云端录制回调关联)
|
||
* @return \think\response\Json
|
||
*/
|
||
public function bindCallRoom()
|
||
{
|
||
$params = $this->request->post();
|
||
if (empty($params['diagnosis_id'])) {
|
||
return $this->fail('诊单ID不能为空');
|
||
}
|
||
if (empty($params['room_id'])) {
|
||
return $this->fail('房间号不能为空');
|
||
}
|
||
|
||
$params['admin_id'] = (int)$this->adminId;
|
||
$result = DiagnosisLogic::bindCallRoom($params);
|
||
if ($result === false) {
|
||
return $this->fail(DiagnosisLogic::getError());
|
||
}
|
||
|
||
return $this->success('', is_array($result) ? $result : [], 1, 0);
|
||
}
|
||
|
||
/**
|
||
* @notes 接通后发起腾讯云云端混流录制(需配置 CAM 与云点播)
|
||
* @return \think\response\Json
|
||
*/
|
||
public function startCloudRecording()
|
||
{
|
||
$params = $this->request->post();
|
||
if (empty($params['diagnosis_id'])) {
|
||
return $this->fail('诊单ID不能为空');
|
||
}
|
||
$params['admin_id'] = (int)$this->adminId;
|
||
$result = DiagnosisLogic::startCloudRecording($params);
|
||
if ($result === false) {
|
||
return $this->fail(DiagnosisLogic::getError());
|
||
}
|
||
|
||
return $this->data($result);
|
||
}
|
||
|
||
/**
|
||
* @notes 浏览器本地上传通话录制后,关联到通话记录(合并 recording_urls)
|
||
* @return \think\response\Json
|
||
*/
|
||
public function attachLocalCallRecording()
|
||
{
|
||
$params = $this->request->post();
|
||
if (empty($params['diagnosis_id'])) {
|
||
return $this->fail('诊单ID不能为空');
|
||
}
|
||
if (empty($params['file_url'])) {
|
||
return $this->fail('文件地址不能为空');
|
||
}
|
||
$params['admin_id'] = (int)$this->adminId;
|
||
$result = DiagnosisLogic::attachLocalCallRecording($params);
|
||
if ($result) {
|
||
return $this->success('已关联录制', [], 1, 1);
|
||
}
|
||
|
||
return $this->fail(DiagnosisLogic::getError());
|
||
}
|
||
|
||
/**
|
||
* @notes 医助旁观诊单当前视频通话(TRTC 进房参数,仅拉流)
|
||
* @return \think\response\Json
|
||
*/
|
||
public function watchCall()
|
||
{
|
||
$diagnosisId = (int)$this->request->get('diagnosis_id', 0);
|
||
if ($diagnosisId <= 0) {
|
||
return $this->fail('诊单ID不能为空');
|
||
}
|
||
|
||
$result = DiagnosisLogic::getAssistantWatchRoomParams([
|
||
'diagnosis_id' => $diagnosisId,
|
||
'admin_id' => (int)$this->adminId,
|
||
]);
|
||
if ($result === false) {
|
||
return $this->fail(DiagnosisLogic::getError());
|
||
}
|
||
|
||
return $this->data($result);
|
||
}
|
||
|
||
/**
|
||
* @notes 获取患者通话签名(用于测试)
|
||
* @return \think\response\Json
|
||
*/
|
||
public function getDoctorSignature()
|
||
{
|
||
$params = $this->request->get();
|
||
|
||
if (empty($params['patient_id'])) {
|
||
return $this->fail('医助理ID不能为空');
|
||
}
|
||
|
||
$result = DiagnosisLogic::getDoctorSignature((int)$params['patient_id']);
|
||
if ($result) {
|
||
return $this->data($result);
|
||
}
|
||
return $this->fail(DiagnosisLogic::getError());
|
||
}
|
||
/**
|
||
* @notes 获取患者通话签名(用于测试)
|
||
* @return \think\response\Json
|
||
*/
|
||
public function getPatientSignature()
|
||
{
|
||
$params = $this->request->get();
|
||
|
||
if (empty($params['patient_id'])) {
|
||
return $this->fail('患者ID不能为空');
|
||
}
|
||
|
||
$result = DiagnosisLogic::getPatientSignature((int)$params['patient_id']);
|
||
if ($result) {
|
||
return $this->data($result);
|
||
}
|
||
return $this->fail(DiagnosisLogic::getError());
|
||
}
|
||
|
||
/**
|
||
* @notes 获取医助列表
|
||
* @return \think\response\Json
|
||
*/
|
||
public function getAssistants()
|
||
{
|
||
$result = DiagnosisLogic::getAssistants();
|
||
return $this->data($result);
|
||
}
|
||
|
||
/**
|
||
* @notes 获取医生列表
|
||
* @return \think\response\Json
|
||
*/
|
||
public function getDoctors()
|
||
{
|
||
$result = DiagnosisLogic::getDoctors();
|
||
return $this->data($result);
|
||
}
|
||
|
||
/**
|
||
* @notes 生成小程序码
|
||
* @return \think\response\Json
|
||
*/
|
||
public function generateMiniProgramQrcode()
|
||
{
|
||
$params = (new DiagnosisValidate())->post()->goCheck('generateQrcode');
|
||
$result = DiagnosisLogic::generateMiniProgramQrcode($params);
|
||
return $this->data($result);
|
||
}
|
||
|
||
/**
|
||
* @notes 生成订单小程序码
|
||
* @return \think\response\Json
|
||
*/
|
||
public function generateOrderQrcode()
|
||
{
|
||
$params = $this->request->post();
|
||
$params['share_user_id'] = $this->adminId;
|
||
$result = DiagnosisLogic::generateOrderQrcode($params);
|
||
if ($result === false) {
|
||
return $this->fail(DiagnosisLogic::getError());
|
||
}
|
||
return $this->data($result);
|
||
}
|
||
|
||
/**
|
||
* @notes 获取企业微信聊天记录
|
||
*/
|
||
public function getWechatChatRecords()
|
||
{
|
||
$diagnosisId = $this->request->get('diagnosis_id', 0);
|
||
$patientId = $this->request->get('patient_id', 0);
|
||
$pageNo = $this->request->get('page_no', 1);
|
||
$pageSize = $this->request->get('page_size', 20);
|
||
|
||
if (empty($diagnosisId) && empty($patientId)) {
|
||
return $this->fail('诊单ID或患者ID不能都为空');
|
||
}
|
||
|
||
$query = WechatChatRecord::order('chat_time', 'desc');
|
||
if ($diagnosisId) {
|
||
$query->where('diagnosis_id', $diagnosisId);
|
||
}
|
||
if ($patientId) {
|
||
$query->where('patient_id', $patientId);
|
||
}
|
||
|
||
$count = (clone $query)->count();
|
||
$lists = $query->page($pageNo, $pageSize)->select()->toArray();
|
||
|
||
return $this->data([
|
||
'lists' => $lists,
|
||
'count' => $count,
|
||
'page_no' => $pageNo,
|
||
'page_size' => $pageSize
|
||
]);
|
||
}
|
||
|
||
/**
|
||
* @notes 添加企业微信聊天记录(手动录入/同步写入)
|
||
*/
|
||
public function addWechatChatRecord()
|
||
{
|
||
$params = $this->request->post();
|
||
|
||
if (empty($params['diagnosis_id']) && empty($params['patient_id'])) {
|
||
return $this->fail('诊单ID或患者ID不能都为空');
|
||
}
|
||
if (empty($params['content'])) {
|
||
return $this->fail('内容不能为空');
|
||
}
|
||
|
||
$adminInfo = $this->adminInfo;
|
||
|
||
$data = [
|
||
'diagnosis_id' => $params['diagnosis_id'] ?? 0,
|
||
'patient_id' => $params['patient_id'] ?? 0,
|
||
'staff_userid' => $adminInfo['work_wechat_userid'] ?? ($params['staff_userid'] ?? ''),
|
||
'staff_name' => $params['staff_name'] ?? ($adminInfo['name'] ?? ''),
|
||
'external_userid' => $params['external_userid'] ?? '',
|
||
'external_name' => $params['external_name'] ?? '',
|
||
'msg_type' => $params['msg_type'] ?? 'note',
|
||
'content' => $params['content'],
|
||
'media_url' => $params['media_url'] ?? '',
|
||
'chat_time' => $params['chat_time'] ?? time(),
|
||
'direction' => $params['direction'] ?? 0,
|
||
'create_time' => time(),
|
||
];
|
||
|
||
$record = WechatChatRecord::create($data);
|
||
|
||
return $this->success('添加成功', ['id' => $record->id]);
|
||
}
|
||
|
||
/**
|
||
* @notes 删除企业微信聊天记录
|
||
*/
|
||
public function deleteWechatChatRecord()
|
||
{
|
||
$id = $this->request->post('id', 0);
|
||
if (empty($id)) {
|
||
return $this->fail('记录ID不能为空');
|
||
}
|
||
|
||
WechatChatRecord::destroy($id);
|
||
return $this->success('删除成功');
|
||
}
|
||
|
||
/**
|
||
* @notes 同步企业微信外部联系人信息(查找该患者在企业微信中的跟进人)
|
||
*/
|
||
public function getWechatExternalContact()
|
||
{
|
||
$patientId = $this->request->get('patient_id', 0);
|
||
if (empty($patientId)) {
|
||
return $this->fail('患者ID不能为空');
|
||
}
|
||
|
||
$result = DiagnosisLogic::getWechatExternalContact($patientId);
|
||
if ($result === false) {
|
||
return $this->fail(DiagnosisLogic::getError());
|
||
}
|
||
|
||
return $this->data($result);
|
||
}
|
||
|
||
/**
|
||
* @notes 获取会话内容存档开启的成员列表
|
||
*/
|
||
public function getMsgAuditPermitUsers()
|
||
{
|
||
$result = DiagnosisLogic::getMsgAuditPermitUsers();
|
||
if ($result === false) {
|
||
return $this->fail(DiagnosisLogic::getError());
|
||
}
|
||
|
||
return $this->data($result);
|
||
}
|
||
|
||
/**
|
||
* @notes 搜索患者(用于创建订单等场景)
|
||
* @return \think\response\Json
|
||
*/
|
||
public function searchPatient()
|
||
{
|
||
$keyword = $this->request->get('keyword', '');
|
||
$page_no = $this->request->get('page_no', 1);
|
||
$page_size = $this->request->get('page_size', 10);
|
||
|
||
if (empty($keyword)) {
|
||
return $this->success('', ['lists' => [], 'count' => 0]);
|
||
}
|
||
|
||
$offset = ($page_no - 1) * $page_size;
|
||
|
||
$lists = \app\common\model\tcm\Diagnosis::where('patient_name|phone|id_card', 'like', '%' . $keyword . '%')
|
||
->field(['id', 'patient_name', 'phone', 'id_card', 'gender', 'age'])
|
||
->limit($offset, $page_size)
|
||
->order('id desc')
|
||
->select()
|
||
->toArray();
|
||
|
||
$count = \app\common\model\tcm\Diagnosis::where('patient_name|phone|id_card', 'like', '%' . $keyword . '%')
|
||
->count();
|
||
|
||
return $this->success('', [
|
||
'lists' => $lists,
|
||
'count' => $count,
|
||
'page_no' => $page_no,
|
||
'page_size' => $page_size
|
||
]);
|
||
}
|
||
}
|