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,223 @@
<?php
/*
* description
* authorwh
* email
* createTime{2024/11/21} {14:14}
*/
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;
/**
* 听译优医助手
* Tingyi Youyi Assistant
*
* Class Tingyiueassistant
* @package app\api\controller
*/
class Tingyiueassistant extends BaseHttpApi
{
/**
* desc听译助手对话优医助手
*
* 参数:
* type助手类型选择助手类型如疼痛科指导医师【必须】
* question :问题【必须】
* phone 患者手机号【必须】
* doctor 医生手机号【必须】
* sessionid 会话id【必须】 从getSayToken接口获得每次对话之前生成用于区分不同会话
*
* 注意:回答完成之后再保存回答记录
*
* authorwh
*/
function chatTy(){
header('Content-Type: text/event-stream');
header('Cache-Control: no-cache');
header('Connection: keep-alive');
header('X-Accel-Buffering: no');
Tools::log_to_write_txt(['input'=>input()]);
$type = input('type');//选择助手类型
if(empty($type)){
//return json(Tools::set_fail('type必须,选择助手类型:如疼痛科指导医师'));
return Tools::set_event_stream_fail('type必须,选择助手类型:如疼痛科指导医师');
}
$phone = input('phone');
if(empty($phone)){
//return json(Tools::set_fail('phone必须'));
return Tools::set_event_stream_fail('phone患者手机号必须');
}
$doctor = input('doctor');
if(empty($doctor)){
//return json(Tools::set_fail('doctor必须'));
return Tools::set_event_stream_fail('doctor医生手机号必须');
}
$hdruserbaseinfo_id = input('hdruserbaseinfo_id');
if(empty($hdruserbaseinfo_id)){
//return json(Tools::set_fail('hdruserbaseinfo_id必须'));
return Tools::set_event_stream_fail('hdruserbaseinfo_id患者id必须');
}
//会话id
$sessionid = input('sessionid');
if(empty($sessionid)){
//return json(Tools::set_fail('sessionid必须'));
return Tools::set_event_stream_fail('sessionid会话id必须','从getSayToken接口获得每次对话之前生成用于区分不同会话');
}
$reportid = input('reportid');//报告id
if(empty($reportid)){
//return json(Tools::set_fail('reportid必须'));
return Tools::set_event_stream_fail('reportid报告id必须');
}
//查询历史对话记录
//$records = Db::table(TabConf::$fa_tingyiueassistantchathis)
// ->where('sessionid',$sessionid)
// ->where('reportid',$reportid)
// ->order('id desc')
// ->select();
//ai那边不需要对话记录
$qa_history = '';
//foreach ($records as $record) {
// $qa_history .= "{" . $record['question'] . ":
// " . $record['answer'] . "},\n";
//}
$ai_config = config('ai_medical_assistant_config');
$question = input('question','hi');
$chatobj = new ChatGPT();
$chatobj->url = $ai_config['base_url'];
$chatobj->model = '';
$chatobj->apiKey = $ai_config['APIKey'];
$answer_json_arr = [];
$medical_record = Db::table(TabConf::$fa_tt_medical_report)
->where('phone',$phone)
->where('hdruserbaseinfo_id',$hdruserbaseinfo_id)
->find();
$medical_record_report_txt = <<<EOF
患者姓名:{$medical_record['name']}
性别:{$medical_record['gender']}
年龄:{$medical_record['age']}
教育程度:{$medical_record['edu']}
职业及年限:{$medical_record['career_year']}
体力要求:{$medical_record['power']}
经济满意度:{$medical_record['satisfaction']}
过往职业及年限:{$medical_record['old_career_year']}
过往职业体力要求:{$medical_record['old_career_power']}
社会支持度:{$medical_record['support']}
居住情况:{$medical_record['live']}
家庭关系:{$medical_record['home']}
诊断:{$medical_record['diagnosis']}
主诉:{$medical_record['main_complaint']}
病史:{$medical_record['medical_history']}
家族史:{$medical_record['family_history']}
月经婚育史:{$medical_record['menstrual_marital_history']}
医嘱:{$medical_record['treatment']}
EOF;
$config = [
'stream'=>true,
'chatId'=>$sessionid,
'variables'=>[
'agent_selection'=>$type,
'medical_record'=>$medical_record_report_txt,
]
];
//$sub_content_msg = [
// ["role" => "user", "content" => $question]
//];
//$chatobj->setBefore($sub_content_msg);
$chat_content = <<<EOF
$question
$qa_history
EOF;
$chatobj->chat($chat_content,$config,$answer_json_arr);
//保存对话记录
$data = [
'phone'=>$phone,
'question'=>$question,
'doctor'=>$doctor,
'sessionid'=>$sessionid,
'reportid'=>$reportid
];
$record_id = Db::table(TabConf::$fa_tingyiueassistantchathis)
->insertGetId($data);
Tools::log_to_write_txt(['听译助手对话优医助手请求gpt:'=>$chatobj->post_msg_body,'患者资料'=>$medical_record_report_txt]);
Tools::log_to_write_txt(['听译助手对话优医助手gpt回复:'=>$answer_json_arr]);
//return json(Tools::set_ok('ok',['record_id'=>$record_id]));
return Tools::set_event_stream_ok('ok',['record_id'=>$record_id]);
}
/**
* 保存回答记录
*
* 参数:
* record_id记录id
* answer回答
* phone患者手机号
*
* authorwh
*/
function saveAnswer(){
return Mmodel::catchJson(function (){
$record_id = input('record_id');
$answer = input('answer');
$phone = input('phone');//患者手机号
if(empty($record_id)){
return Tools::set_fail('record_id必须');
}
if(empty($answer)){
return Tools::set_fail('answer必须');
}
if(empty($phone)){
return Tools::set_fail('患者手机号必须');
}
$record = Db::table(TabConf::$fa_tingyiueassistantchathis)
->where('id',$record_id)
->where('phone',$phone)
->find();
if(empty($record)){
return Tools::set_fail('记录不存在');
}
Db::table(TabConf::$fa_tingyiueassistantchathis)
->data([
'answer'=>$answer,
])
->where('id',$record_id)
->where('phone',$phone)
->update();
return Tools::set_ok('ok');
});
}
}