249 lines
9.6 KiB
PHP
249 lines
9.6 KiB
PHP
<?php
|
||
/*
|
||
* description:
|
||
* author:wh
|
||
* email:
|
||
* createTime:{2024/11/27} {15:10}
|
||
*/
|
||
|
||
namespace app\api\controller;
|
||
|
||
|
||
use app\common\model\TabConf;
|
||
use think\Db;
|
||
use wanghua\general_utility_tools_php\file\upload\FileUpload;
|
||
use wanghua\general_utility_tools_php\http\Curl;
|
||
use wanghua\general_utility_tools_php\Mmodel;
|
||
use wanghua\general_utility_tools_php\SundryConfig;
|
||
use wanghua\general_utility_tools_php\tool\Tools;
|
||
|
||
class Drugsimagesmedicalupload extends BaseHttpApi
|
||
{
|
||
|
||
|
||
/**
|
||
* 药品、影像、病历上传(多文件)
|
||
*
|
||
* 流程:前端上传图片,发给ai,不等待分析结果,异步查询结果
|
||
*
|
||
* 参数:
|
||
* phone 患者手机号码
|
||
*
|
||
* 文件上传控件name值设置为:file_upload,否则无法上传
|
||
*
|
||
* 返回task_id,前端手机号查询处理任务列表
|
||
*
|
||
* /api/Drugsimagesmedicalupload/uploadDrugsImagesMedical
|
||
*/
|
||
public function uploadDrugsImagesMedical(){
|
||
return Mmodel::catchJson(function (){
|
||
$sessionid = input('sessionid');
|
||
if(empty($sessionid)){
|
||
return Tools::set_fail('参数错误.0',['error_msg'=>'错误信息:sessionid错误']);
|
||
}
|
||
$phone = input('phone');
|
||
if(empty($phone)){
|
||
return Tools::set_fail('参数错误.0',['error_msg'=>'错误信息:phone错误']);
|
||
}
|
||
//存在没有生成报告的上传的基本信息就删除
|
||
Db::table(TabConf::$fa_drugs_images_medical_result)
|
||
->where('phone',$phone)
|
||
->where('reportid','eq','')
|
||
->delete();
|
||
|
||
$ai_config = config('medicine_image_report_config');
|
||
|
||
$oss_config = config('aliyun_oss_config');
|
||
$file_obj = new FileUpload();
|
||
$file_res = $file_obj->filesUploadToAliCloudOss($oss_config);
|
||
Tools::log_to_write_txt(['文件上传结果'=>$file_res]);
|
||
if($file_res['code']!=200){
|
||
return Tools::set_fail($file_res['msg']);
|
||
}
|
||
|
||
//发现之前存在没生成报告的附件则清理掉
|
||
Db::table(TabConf::$fa_drugs_images_medical_result)
|
||
->where('phone',$phone)
|
||
->where('reportid','eq','')
|
||
->delete();
|
||
|
||
$sub_content_imgarr = ['images'=>[],'webhooks'=>[$ai_config['notify_url']]];
|
||
foreach ($file_res['data'] as $key=>$item){
|
||
$md5id = md5($item['outer_req_url'].Tools::rand_str());
|
||
$sub_content_imgarr['images'][$md5id] = $item['outer_req_url'];
|
||
|
||
$item['phone'] = $phone;
|
||
$item['imageid'] = $md5id;
|
||
$item['sessionid'] = $sessionid;
|
||
//新增
|
||
Db::table(TabConf::$fa_drugs_images_medical_result)
|
||
->data($item)
|
||
->insert();
|
||
}
|
||
$header = [
|
||
'Accept: application/json',
|
||
"Content-Type: application/json"
|
||
];
|
||
$url = "https://image_fastapi.excn.vip/imgs-task";
|
||
Tools::log_to_write_txt(['药品、影像、病历上传图片处理,请求地址'=>$url,'请求参数'=>$sub_content_imgarr]);
|
||
$process_images_res = Curl::curl_request($url,'POST',json_encode($sub_content_imgarr),$header);
|
||
Tools::log_to_write_txt(['药品、影像、病历上传图片处理,返回结果'=>$process_images_res]);
|
||
|
||
//保存处理任务
|
||
$task_res = json_decode($process_images_res,true);
|
||
$task_data = [
|
||
'phone'=>$phone,
|
||
'task_id'=>$task_res['task_id'],
|
||
'msg'=>$task_res['msg'],
|
||
];
|
||
//每次都是新任务
|
||
Db::table(TabConf::$fa_drugs_images_medical_task)
|
||
->data($task_data)
|
||
->insert();
|
||
//返回分析结果
|
||
return Tools::set_ok('任务处理中,等待处理结果',['result'=>$process_images_res,'file_info'=>$file_res['data']]);
|
||
});
|
||
}
|
||
|
||
//public function testUploadFiles(){
|
||
// return Mmodel::catchJson(function (){
|
||
// $phone = input('phone');
|
||
// if(empty($phone)){
|
||
// return Tools::set_fail('参数错误.0',['error_msg'=>'错误信息:phone错误']);
|
||
// }
|
||
//
|
||
// $res = (new FileUpload())->files();
|
||
// Tools::log_to_write_txt(['文件上传结果'=>$res]);
|
||
// return Tools::set_ok('测试结果',$res);
|
||
// });
|
||
//}
|
||
|
||
/**
|
||
* 消费者队列【wh专用】
|
||
*
|
||
* /api/Drugsimagesmedicalupload/queryDrugsImagesMedicalTask
|
||
*/
|
||
public function queryDrugsImagesMedicalTask(){
|
||
//查询
|
||
$obj = Db::table(TabConf::$fa_drugs_images_medical_task);
|
||
$res_lists = $obj
|
||
->whereNull('result')
|
||
//时间在10分钟之内
|
||
->where('create_time','>=',date('Y-m-d H:i:s',time()-600))
|
||
->select();
|
||
//Tools::log_to_write_txt(['查询结果'=>$res_lists,'sql:'=>$obj->getLastSql()]);
|
||
//消费者队列终止开关
|
||
$consumer_switch = SundryConfig::val('drugs_images_medical_task_consumer_switch');
|
||
if(empty($res_lists)){
|
||
return json(Tools::set_fail('无数据可处理',$consumer_switch));
|
||
}
|
||
foreach ($res_lists as $item){
|
||
$this->querySaveTaskProcessByTaskId($item['task_id']);
|
||
}
|
||
|
||
return json(Tools::set_ok('处理成功,数量:'.count($res_lists),$consumer_switch));
|
||
}
|
||
|
||
|
||
/**
|
||
* 根据报告id查询附件
|
||
*
|
||
* 参数:
|
||
* reportid 数字人报告id
|
||
* type 类型,如:影像报告 病历报告
|
||
*
|
||
*/
|
||
public function queryDrugsImagesMedicalReportId(){
|
||
return Mmodel::catchJson(function (){
|
||
//$phone = input('phone');
|
||
//if(empty($phone)){
|
||
// return Tools::set_fail('参数错误.0',['error_msg'=>'错误信息:phone错误']);
|
||
//}
|
||
$type = input('type');
|
||
if(empty($type)){
|
||
return Tools::set_fail('参数错误.0',['error_msg'=>'错误信息:type错误']);
|
||
}
|
||
$reportid = input('reportid');
|
||
if( empty($reportid)){
|
||
return Tools::set_fail('参数错误.0',['error_msg'=>'错误信息:reportid错误']);
|
||
}
|
||
//根据报告id查询附件列表
|
||
$lists = Db::table(TabConf::$fa_drugs_images_medical_result)
|
||
//->field('id,phone,imageid,ai_result')
|
||
//->where('phone',$phone)
|
||
->where('reportid',$reportid)
|
||
->where('type',$type)
|
||
->select();
|
||
|
||
return Tools::set_ok('ok',$lists);
|
||
});
|
||
}
|
||
|
||
/**
|
||
* desc:查询并更新ai分析结果
|
||
* author:wh
|
||
*
|
||
* api/Drugsimagesmedicalupload/querySaveTaskProcessByTaskId
|
||
*/
|
||
function querySaveTaskProcessByTaskId($taskid=''){
|
||
return Mmodel::catchJson(function () use ($taskid){
|
||
$task_id = '';
|
||
if($taskid){
|
||
$task_id = $taskid;
|
||
}
|
||
if(input('task_id')){
|
||
$task_id = input('task_id');
|
||
}
|
||
if(empty($task_id)){
|
||
return Tools::set_fail('参数错误.0',['error_msg'=>'错误信息:task_id错误']);
|
||
}
|
||
//$log_file_name = 'drugs_images_medical';
|
||
//$header = [
|
||
// //'Accept: application/json',
|
||
// "Content-Type: application/json"
|
||
//];
|
||
//$url = "https://image_fastapi.excn.vip/imgs-task/{$task_id}";
|
||
//Tools::log_to_write_txt(['异步查询图片处理结果,请求地址'=>$url,'task_id'=>$task_id],$log_file_name);
|
||
//$process_images_res = Curl::curl_request($url,'GET',[],$header);
|
||
//Tools::log_to_write_txt(['异步查询图片处理结果,返回结果'=>$process_images_res],$log_file_name);
|
||
|
||
//if(isset($process_images_res['status']) && $process_images_res['status'] == 'error'){
|
||
// return Tools::set_fail($process_images_res['message']);
|
||
//}
|
||
//$jsondec = json_decode($process_images_res,true);
|
||
//if(isset($jsondec['detail']) && $jsondec['detail'] == '未知的任务 ID'){
|
||
// return Tools::set_fail($jsondec['detail']);
|
||
//}
|
||
//if(isset($jsondec['status']) && $jsondec['status'] == 'pending'){
|
||
// return Tools::set_fail('处理中请等待');
|
||
//}
|
||
//if(!isset($jsondec['result']) || $jsondec['result'] == ''){
|
||
// return Tools::set_fail('未查询到结果');
|
||
//}
|
||
|
||
//保存处理结果
|
||
//Db::table(TabConf::$fa_drugs_images_medical_task)
|
||
// ->data([
|
||
// 'result'=>$process_images_res
|
||
// ])
|
||
// ->where('task_id',$task_id)
|
||
// ->update();
|
||
|
||
//遍历二维数组,将每张图片的分析同步到
|
||
//foreach ($jsondec as $item){
|
||
// Db::table(TabConf::$fa_drugs_images_medical_result)
|
||
// ->where('imageid',$item['id'])
|
||
// ->data([
|
||
// 'ai_result'=>$item['result'],
|
||
// 'type'=>$item['type'],
|
||
// ])
|
||
// ->update();
|
||
//}
|
||
|
||
$process_images_res = Db::table(TabConf::$fa_drugs_images_medical_result)
|
||
->where('task_id',$task_id)
|
||
->find();
|
||
return Tools::set_ok('ok',json_decode($process_images_res,true));
|
||
});
|
||
}
|
||
} |