Files
fast_response/digital_doctor/application/api/controller/Reportty.php
2025-03-17 10:56:09 +08:00

442 lines
16 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?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();
});
}
}