442 lines
16 KiB
PHP
442 lines
16 KiB
PHP
<?php
|
||
/*
|
||
* description:
|
||
* author:wh
|
||
* email:
|
||
* createTime:{2024/7/12} {11:29}
|
||
*/
|
||
|
||
namespace app\api\controller;
|
||
|
||
|
||
use app\common\model\TabConf;
|
||
use GatewayWorker\Lib\Gateway;
|
||
use think\Db;
|
||
use wanghua\general_utility_tools_php\gpt\chat\ChatGPT;
|
||
use wanghua\general_utility_tools_php\Mmodel;
|
||
use wanghua\general_utility_tools_php\tool\Tools;
|
||
|
||
/**
|
||
* 听译-报告
|
||
* Class Reportty
|
||
* @package app\api\controller
|
||
*/
|
||
class Reportty extends BaseHttpApi
|
||
{
|
||
|
||
/**
|
||
* desc:听译-生成听诊报告
|
||
*
|
||
* api/Reportty/createReport
|
||
* 参数:ticket
|
||
* from 来源
|
||
* client_id
|
||
*
|
||
* author:wh
|
||
*/
|
||
function createReport(){
|
||
Tools::log_to_write_txt(['input'=>input()]);
|
||
//header('Content-Type: text/event-stream');
|
||
//header('Cache-Control: no-cache');
|
||
//header('Connection: keep-alive');
|
||
//header('X-Accel-Buffering: no');
|
||
$config = config('ai_listen_report_config');
|
||
|
||
//$question = '';//input('question','');
|
||
|
||
$chatobj = new ChatGPT();
|
||
$chatobj->url = $config['base_url'];
|
||
$chatobj->model = '';
|
||
$chatobj->apiKey = $config['APIKey'];
|
||
|
||
$answer_json_arr = [];
|
||
|
||
//医生登录的ticket
|
||
$qa_chat_ticket = input('ticket');
|
||
if(empty($qa_chat_ticket)){
|
||
return json(Tools::set_fail('qa_chat_ticket必须'));
|
||
}
|
||
$phone = input('phone');//患者手机号
|
||
if (empty($phone)){
|
||
return json(Tools::set_fail('患者手机号必须'));
|
||
}
|
||
//医生开始对话的token
|
||
$say_token = input('say_token');
|
||
if(empty($say_token)){
|
||
return json(Tools::set_fail('say_token必须'));
|
||
}
|
||
$user = Db::table('fa_hdrdoctorusers')->where('qa_chat_ticket',$qa_chat_ticket)->find();
|
||
if(empty($user)){
|
||
return json(Tools::set_fail('医生不存在,请确认qa_chat_ticket'));
|
||
}
|
||
//$before_report_dataid = input('before_report_dataid');//上一次生成的疼痛科报告id
|
||
//$before_report_content = '';
|
||
//$base_info = [];
|
||
//if($before_report_dataid){
|
||
// $before_report = Db::table('fa_tt_medical_report')
|
||
// ->where('id',$before_report_dataid)
|
||
// ->find();
|
||
// if($before_report){
|
||
// $before_report_content = $before_report['report_content'];
|
||
// //查询基本信息
|
||
// $base_info = Db::table(TabConf::$fa_tt_userbaseinfo)
|
||
// ->where('id',$before_report['hdruserbaseinfo_id'])
|
||
// ->find();
|
||
// }
|
||
//}
|
||
$gender = input('sex');
|
||
if(empty($gender)){
|
||
return json(Tools::set_fail('性别必须'));
|
||
}
|
||
$name = input('name');
|
||
if(empty($name)){
|
||
return json(Tools::set_fail('姓名必须'));
|
||
}
|
||
$hdruserbaseinfo_id = input('hdruserbaseinfo_id');
|
||
if(empty($hdruserbaseinfo_id)){
|
||
return json(Tools::set_fail('hdruserbaseinfo_id必须'));
|
||
}
|
||
//查询历史聊天记录
|
||
$his_record = Db::table('fa_ty_chathistory')
|
||
->where('say_token',$say_token)
|
||
->order('id asc')
|
||
->where('hdruserbaseinfo_id',$hdruserbaseinfo_id)
|
||
//->where('createtime','>',$day3)//3天之内
|
||
->select();
|
||
$config = [
|
||
'stream'=>false,
|
||
'chatId'=>Tools::getMillisecond(),
|
||
];
|
||
//必须
|
||
$reportid = input('reportid');
|
||
if(empty($reportid)){
|
||
return json(Tools::set_fail('数字人的报告id必修'));
|
||
}
|
||
//查询数字人报告
|
||
$report = Db::table(TabConf::$fa_tt_medical_report)
|
||
->where('id',$reportid)
|
||
->find();
|
||
if(empty($report)){
|
||
return json(Tools::set_fail('数字人报告不存在'));
|
||
}
|
||
$body_check = input('body_check');
|
||
if(empty($body_check)){
|
||
return json(Tools::set_fail('体格检查必须'));
|
||
}
|
||
//设置之前的报告内容
|
||
//$content = [
|
||
// ["role" => "user", "content" => $before_report_content]
|
||
//];
|
||
//添加性别
|
||
//if($gender){
|
||
// $content[] = ["role" => "user", "content" => '【性别】:'.$gender];
|
||
//}
|
||
|
||
//$age = $report['age'];
|
||
//$edu = $report['edu'];
|
||
//$career_year = $report['career_year'];
|
||
//$power = $report['power'];
|
||
//$satisfaction = $report['satisfaction'];
|
||
//$old_career_year = $report['old_career_year'];
|
||
//$old_career_power = $report['old_career_power'];
|
||
//$support = $report['support'];
|
||
//$marriage = $report['marriage'];
|
||
//$live = $report['live'];
|
||
|
||
|
||
//构建基本信息
|
||
//$content[] = ["role" => "user", "content" => "\n\n".'【病人姓名】:'.$name];
|
||
//$content[] = ["role" => "user", "content" => '【病人性别】:'.$gender];
|
||
//$content[] = ["role" => "user", "content" => '【病人年龄】:'.$age];
|
||
//$content[] = ["role" => "user", "content" => '【教育程度】:'.$edu];
|
||
//$content[] = ["role" => "user", "content" => '【职业及年限】:'.$career_year];
|
||
//$content[] = ["role" => "user", "content" => '【体力要求】:'.$power];
|
||
//$content[] = ["role" => "user", "content" => '【经济满意度】:'.$satisfaction];
|
||
//$content[] = ["role" => "user", "content" => '【过往职业及年限】:'.$old_career_year];
|
||
//$content[] = ["role" => "user", "content" => '【过往职业体力要求】:'.$old_career_power];
|
||
//$content[] = ["role" => "user", "content" => '【社会支持度】:'.$support];
|
||
//$content[] = ["role" => "user", "content" => '【婚姻状况】:'.$marriage];
|
||
//$content[] = ["role" => "user", "content" => '【居住情况】:'.$live];
|
||
|
||
//对话记录
|
||
$chat_his = "\n\n";
|
||
foreach ($his_record as $item){
|
||
//$content[] = ["role" => "user", "content" => "\n\n".$item['chat_msg']];
|
||
$chat_his .= $item['chat_msg']."\n";
|
||
}
|
||
//$sub_content_msg = [
|
||
// ["role" => "user", "content" => implode('',array_column($content,'content'))]
|
||
//];
|
||
//$chatobj->setBefore($sub_content_msg);
|
||
|
||
|
||
$num_per_report = $report['report_content'];
|
||
//数字人报告+对话记录
|
||
$question = <<<EOF
|
||
【对话记录】
|
||
$chat_his
|
||
|
||
【病例报告】
|
||
$num_per_report
|
||
|
||
【体格检查】
|
||
{$body_check}
|
||
EOF;
|
||
|
||
//$question = $num_per_report;
|
||
|
||
$chatobj->returnAnswer($question,$config,$answer_json_arr);
|
||
|
||
Tools::log_to_write_txt(['听译生成报告,请求gpt:'=>$chatobj->post_msg_body]);
|
||
Tools::log_to_write_txt(['听译生成报告,gpt回复:'=>$answer_json_arr]);
|
||
|
||
$res_content = [];
|
||
//把返回的报告保存起来
|
||
foreach ($answer_json_arr as $josn){
|
||
$item = json_decode($josn,true);
|
||
$choices = $item['choices'];
|
||
foreach ($choices as $choice){
|
||
$data = [
|
||
'doctor'=>$user['username'],
|
||
//病人
|
||
'report_content'=>$choice['message']['content'],
|
||
'ticket'=>$qa_chat_ticket,
|
||
'from'=>input('from','ty'),//来源
|
||
'name'=>$name,
|
||
'gender'=>$gender,
|
||
'hdruserbaseinfo_id'=>$hdruserbaseinfo_id,
|
||
'username'=>$phone,
|
||
'userbaseid'=>$report['userbaseid'],
|
||
//'diagnostic_result'=>$report['diagnostic_result'],
|
||
//'create_time'=>$report['create_time'],
|
||
'age'=>$report['age'],
|
||
'main_complaint'=>$report['main_complaint'],
|
||
'medical_history'=>$report['medical_history'],
|
||
'past_history'=>$report['past_history'],
|
||
'allergy_history'=>$report['allergy_history'],
|
||
'family_history'=>$report['family_history'],
|
||
'personal_history'=>$report['personal_history'],
|
||
'menstrual_marital_history'=>$report['menstrual_marital_history'],
|
||
'diagnosis'=>$report['diagnosis'],
|
||
'treatment'=>$report['treatment'],
|
||
'phone'=>$report['phone'],
|
||
'status'=>$report['status'],
|
||
//'user_phone'=>$report['user_phone'],
|
||
'date'=>$report['date'],//
|
||
'hdrdepartment_id'=>$report['hdrdepartment_id'],
|
||
'hdrdepartment'=>$report['hdrdepartment'],
|
||
'edu'=>$report['edu'],
|
||
'career_year'=>$report['career_year'],
|
||
'power'=>$report['power'],
|
||
'satisfaction'=>$report['satisfaction'],
|
||
'old_career_year'=>$report['old_career_year'],
|
||
'old_career_power'=>$report['old_career_power'],
|
||
'support'=>$report['support'],
|
||
'marriage'=>$report['marriage'],
|
||
'live'=>$report['live'],
|
||
'home'=>$report['home'],
|
||
'address'=>$report['address'],
|
||
'wechat_no'=>$report['wechat_no'],
|
||
//'is_flow'=>$report['is_flow'],
|
||
];
|
||
$report_id = Db::table('fa_ty_medical_report')->insertGetId($data);
|
||
//日期
|
||
//$data['date'] = date('Y-m-d');
|
||
|
||
//【对话记录跟着报告走】
|
||
Db::table(TabConf::$fa_ty_chathistory)
|
||
->where('say_token',$qa_chat_ticket)
|
||
->data(['reportid'=>$report_id])
|
||
->update();
|
||
|
||
$res_content[] = ['report_id'=>$report_id,'report_content'=>$choice['message']['content']];
|
||
}
|
||
}
|
||
|
||
$client_id = input('client_id');
|
||
if(empty($client_id)){
|
||
return json(Tools::set_fail('client_id必须'));
|
||
}
|
||
|
||
//查询广播客户端id
|
||
$arr = Db::table('fa_device')
|
||
->where('ticket',$qa_chat_ticket)
|
||
->select();
|
||
$clientid_arr = array_column($arr,'clientid');
|
||
$json = Tools::wss_json_ok('Reportty/createReport','ok',['flow_code'=>'create_report_end']);
|
||
Gateway::sendToAll($json,$clientid_arr,[$client_id]);
|
||
return json(Tools::set_ok($res_content));
|
||
}
|
||
|
||
|
||
/**
|
||
* desc:查询报告详情
|
||
*
|
||
* api/Reportty/getReportById
|
||
* 参数:dataid 报告id
|
||
* ticket:用户ticket
|
||
* author:wh
|
||
*/
|
||
function getReportById(){
|
||
return Mmodel::catchJson(function (){
|
||
$info = Db::table('fa_ty_medical_report')
|
||
->where('id',input('dataid'))
|
||
->find();
|
||
return Tools::set_ok($info);
|
||
});
|
||
}
|
||
/**
|
||
* desc:查询报告列表
|
||
*
|
||
* api/Reportty/getReportList
|
||
* 参数:phone
|
||
*
|
||
*
|
||
* author:wh
|
||
*/
|
||
function getReportList(){
|
||
return Mmodel::catchJson(function (){
|
||
$phone = input('phone');
|
||
$obj = Db::table('fa_ty_medical_report');
|
||
if($phone){
|
||
$obj->where('username',$phone);
|
||
}
|
||
$info = $obj->select();
|
||
return Tools::set_ok($info);
|
||
});
|
||
}
|
||
|
||
/**
|
||
* 修改报告
|
||
* api/Reportty/editReport
|
||
* 参数:dataid 报告数据id
|
||
* username 医生登录账号(必须)
|
||
name 病人姓名
|
||
gender 病人性别: M=男性, F=女性
|
||
age 病人年龄
|
||
main_complaint 主诉
|
||
medical_history 病史
|
||
past_history 既往史
|
||
allergy_history 过敏史
|
||
family_history 家族史
|
||
personal_history 个人史
|
||
menstrual_marital_history 月经婚育史
|
||
diagnosis 诊断
|
||
treatment 医嘱
|
||
ticket 对话票据
|
||
hdrdepartment_id 科室
|
||
*/
|
||
function editReport(){
|
||
return Mmodel::catchJson(function (){
|
||
$qa_chat_ticket = input('ticket');
|
||
if(empty($qa_chat_ticket)){
|
||
return Tools::set_fail('qa_chat_ticket必须');
|
||
}
|
||
|
||
if(empty(input('username'))){
|
||
return Tools::set_fail('医生登录账号必须');
|
||
}
|
||
if(empty(input('name',''))){
|
||
return Tools::set_fail('病人姓名必须');
|
||
}
|
||
if(empty(input('phone',''))){
|
||
return Tools::set_fail('病人手机号必须');
|
||
}
|
||
if(empty(input('diagnosis'))){
|
||
return Tools::set_fail('diagnosis诊断内容必须');
|
||
}
|
||
if(empty(input('gender'))){
|
||
return Tools::set_fail('gender必须');
|
||
}
|
||
//听译问诊-患者病历信息
|
||
$data = [
|
||
'username'=>input('username'),//医生
|
||
'name'=>input('name',''),//病人姓名
|
||
'gender'=>input('gender',''),//病人性别: M=男性, F=女性
|
||
'age'=>input('age',''),//病人年龄
|
||
'main_complaint'=>input('main_complaint','无'),//主诉
|
||
'medical_history'=>input('medical_history','无'),//病史
|
||
'past_history'=>input('past_history','无'),//既往史
|
||
'allergy_history'=>input('allergy_history','无'),//过敏史
|
||
'family_history'=>input('family_history','无'),//家族史
|
||
'personal_history'=>input('personal_history','无'),//个人史
|
||
'menstrual_marital_history'=>input('menstrual_marital_history','无'),//月经婚育史
|
||
'diagnosis'=>input('diagnosis','无'),//诊断
|
||
'treatment'=>input('treatment','无'),//医嘱
|
||
'ticket'=>$qa_chat_ticket,
|
||
'hdrdepartment_id'=>input('hdrdepartment_id'),//科室
|
||
];
|
||
|
||
$hdruserbaseinfo_id = input('hdruserbaseinfo_id');
|
||
if(empty(input('hdruserbaseinfo_id'))){
|
||
return Tools::set_fail('hdruserbaseinfo_id必须');
|
||
}
|
||
//医生开始对话的token
|
||
$say_token = input('say_token');
|
||
if(empty($say_token)){
|
||
return Tools::set_fail('say_token必须');
|
||
}
|
||
//查询统一基本信息
|
||
$base_info = Db::table('fa_tt_userbaseinfo')
|
||
->where('id',$hdruserbaseinfo_id)
|
||
->find();
|
||
//校验
|
||
if(empty($base_info)){
|
||
return Tools::set_fail('统一基本信息不存在');
|
||
}
|
||
|
||
//修改历史记录的hdruserbaseinfo_id
|
||
Db::table('fa_ty_chathistory')
|
||
->where('say_token',$say_token)
|
||
->update(['hdruserbaseinfo_id'=>$hdruserbaseinfo_id]);
|
||
//听译问诊-患者病历信息
|
||
$medicalrecord = Db::table('fa_ty_userbaseinfo')
|
||
->where('name',input('name',''))
|
||
->find();
|
||
if(empty($medicalrecord)){
|
||
$data['ticket'] = $qa_chat_ticket;
|
||
//新增听译病历信息
|
||
$userbaseid = Db::table('fa_ty_userbaseinfo')->insertGetId($data);
|
||
|
||
}else{
|
||
$userbaseid = $medicalrecord['id'];
|
||
Db::table('fa_ty_userbaseinfo')
|
||
->where('ticket',$qa_chat_ticket)
|
||
->update($data);
|
||
}
|
||
|
||
$rehabilitation_advice = input('rehabilitation_advice','无');//康复建议
|
||
$test_advice = input('test_advice','无');//检测建议
|
||
|
||
//修改报告
|
||
$str = <<<EOF
|
||
【主诉】:{$data['main_complaint']}
|
||
【病史】:{$data['medical_history']}
|
||
【个人史】:{$data['personal_history']}
|
||
【婚姻史】:{$data['menstrual_marital_history']}
|
||
【家族史】:{$data['family_history']}
|
||
【诊断】:{$data['diagnosis']}
|
||
【康复建议】:{$rehabilitation_advice}
|
||
【检查建议】:{$test_advice}
|
||
EOF;
|
||
|
||
$dataid = input('dataid');
|
||
if(empty($dataid)){
|
||
return Tools::set_fail('dataid必须');
|
||
}
|
||
|
||
Db::table('fa_ty_medical_report')
|
||
->where('id',$dataid)
|
||
->data([
|
||
//病历信息id
|
||
'userbaseid'=>$userbaseid,//创建报告的时候这个字段是空,修改报告再补填这个字段
|
||
'report_content'=>$str,
|
||
'name'=>$data['name'],
|
||
'gender'=>$data['gender'],
|
||
'hdruserbaseinfo_id'=>$hdruserbaseinfo_id,//统一病历基本信息ID
|
||
])
|
||
->update();
|
||
return Tools::set_ok();
|
||
});
|
||
}
|
||
} |