first commit

This commit is contained in:
2025-03-17 10:56:09 +08:00
parent b65a5fd005
commit afec54dafe
6918 changed files with 1199199 additions and 0 deletions

View File

@@ -0,0 +1,442 @@
<?php
/*
* description
* authorwh
* 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
*
* authorwh
*/
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
* authorwh
*/
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
*
*
* authorwh
*/
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();
});
}
}