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

223 lines
7.1 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/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');
});
}
}