223 lines
7.1 KiB
PHP
223 lines
7.1 KiB
PHP
<?php
|
||
/*
|
||
* description:
|
||
* author:wh
|
||
* 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接口获得,每次对话之前生成,用于区分不同会话
|
||
*
|
||
* 注意:回答完成之后再保存回答记录
|
||
*
|
||
* author:wh
|
||
*/
|
||
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:患者手机号
|
||
*
|
||
* author:wh
|
||
*/
|
||
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');
|
||
});
|
||
}
|
||
} |