first commit
This commit is contained in:
442
digital_doctor/application/api/controller/Reportty.php
Normal file
442
digital_doctor/application/api/controller/Reportty.php
Normal file
@@ -0,0 +1,442 @@
|
||||
<?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();
|
||||
});
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user