param(); if(!empty($params["studyid"]) && !empty($params["pid"])){ // $whereArr=array(); $whereArr["id"]=$params["studyid"]; $whereArr["patient_id"]=$params["pid"]; $study=Db::table("studies")->where($whereArr)->field("id,studyuid")->find(); if(empty($study)){ // 没有找到片子 echo "empty!"; return; }else{ // 找到了片子,再去查询图像 // 先找series $data=array(); $studyListData=array(); $studyData=array(); $studyData["transactionId"]=$study["studyuid"]; $studyData["patientName"]="userName"; $series=Db::table("series")->where("study_id",$study["id"])->field("id,seriesuid,description")->select(); if(count($series)>0){ $seriesListData=array(); foreach($series as $key=>$val){ $seriesData=array(); $seriesData["seriesInstanceUid"]=$val["seriesuid"]; $seriesData["seriesDescription"]=$val["description"]; $imgs=Db::table("images")->where("series_id",$val["id"])->field("id,columns,image_number,rows,sop_uid,url,metadata")->select(); $imgsListData=array(); foreach($imgs as $ikey=>$ival){ $imgsData=array(); $imgsData["columns"]=$ival["columns"]; $imgsData["instanceNumber"]=$ival["image_number"]; $imgsData["rows"]=$ival["rows"]; $imgsData["sopInstanceUid"]=$ival["sop_uid"]; $imgsData["url"]="dicomweb://dcm.pacsonline.cn/" . $ival["metadata"]; array_push($imgsListData, $imgsData); } $seriesData["instances"]=$imgsListData; array_push($seriesListData, $seriesData); } $studyData["seriesList"]=$seriesListData; } array_push($studyListData, $studyData); } $data["transactionId"]=$study["studyuid"]; $data["studies"]=$studyListData; echo json_encode($data); }else{ echo "error param!"; } } public function get_studyinfo(){ $study_id = $_REQUEST['study_id']; $info = array(); $study_info = DB::table('studies')->where('id',$study_id)->field('studyuid,patient_id')->find(); $info['transactionId'] = $study_info['studyuid']; $patient_info = DB::table('patient_infos')->where('id',$study_info['patient_id'])->field('name')->find(); $info['patientName'] = $patient_info['name']; $series_list = DB::table('series')->where('study_id',$study_id)->field('id,seriesuid,description')->select(); $series = array(); foreach($series_list as $k=>$v){ $image = DB::table('images')->where('series_id',$v['id'])->field('columns,image_number as instanceNumber,rows,image_id as sopInstanceUid,url,frame')->select(); foreach($image as $key=>$value){ $image[$key]['url'] = 'http://dcm.pacsonline.cn/'.$value['url']; } $series[$k]['instances'] = $image; $series[$k]['seriesInstanceUid'] = $v['seriesuid']; $series[$k]['seriesDescription'] = $v['description']; } $info['seriesList'] = $series; return json_encode($info); } /** * 影像信息 * * @ApiTitle (影像信息) * @ApiSummary (影像信息) * @ApiSector (远程诊断) * @ApiMethod (POST) * @ApiRoute (/inter/dcquery/get_studiesinfo) * @ApiHeaders (name="sign", type="string", required=true, description="请求头-校验key") * @ApiHeaders (name="nonce", type="string", required=true, description="请求头-随机数") * @ApiHeaders (name="timestamp", type=string, required=true, description="请求头-时间戳s") * @ApiParams (name="sessionid", type="string", required=true, description="参数json字符串") * @ApiParams (name="study_id", type="string", sample="", description="studies表id值<必填>") * @ApiParams (name="address", type="string", sample="", description="影像地址<必填>") * @ApiReturnParams (name="info", type="object", sample="{}", description="返回的数据信息") * @ApiReturn (data=" { 'info': '' } *") **/ public function get_studiesinfo(){ try{ $study_id = $_REQUEST['study_id']; if($study_id == '71e721a36ceb4bf4' || $study_id== '2c7b65989e965c2a'){ if(Cache::get($study_id)){ return Cache::get($study_id); } } if($study_id == '17a34f052869eefd' || $study_id == '35684ea1e75ae4d0' || $study_id == 'ef80a21d3a2db803'){ if(Cache::get($study_id)){ return Cache::get($study_id); } } if(isset($_REQUEST['address']) && !empty($_REQUEST['address'])){ $url = $_REQUEST['address']; }else{ $url = ''; } $info = array(); if(strlen($study_id) == '16'){ $study_info = DB::table('studies')->where('id',$study_id)->field('id,studyuid,studyid,patient_id')->find(); }else{ $study_info = DB::table('studies')->where('studyuid',$study_id)->field('id,studyuid,studyid,patient_id')->find(); } $info['studyInstanceUid'] = $study_info['studyuid']; $patient_info = DB::table('patient_infos')->where('id',$study_info['patient_id'])->field('birthday,institution_id,temp_patient_id,name,age,sex')->find(); $date = DB::table('exams')->where('patient_id',$study_info['patient_id'])->field('exam_datetime')->find(); $institution = DB::table('institution')->where('id',$patient_info['institution_id'])->field('name')->find(); $info['patientName'] = $patient_info['name']; // 根据series_num排序 $series_list = DB::table('series')->where('study_id',$study_info['id'])->where('modality','not in','PR,SR')->field('id,series_num,seriesuid,description,modality')->order('series_num asc')->select(); $series = array(); $error = 1; $ids = array(); foreach($series_list as $k=>$v){ $ids[] = $v['id']; } $images_list = DB::table('images')->where('series_id','in',$ids)->field('frame,series_id,cineRate,remote_url,local_url,status,columns,image_number as instanceNumber,rows,image_id as sopInstanceUid,metadata,url')->order('image_number asc')->select(); if(empty($images_list)){ throw new \think\Exception('series列表中影像为空'); } $series = $this->testHandleSeires($series_list , $images_list , $url); // foreach($series_list as $k=>$v){ // // image_number排序 // $image = DB::table('images')->where('series_id',$v['id'])->field('cineRate,remote_url,local_url,status,columns,image_number as instanceNumber,rows,image_id as sopInstanceUid,metadata,url')->order('image_number asc')->select(); // if(empty($image)){ // continue; // } // $error = 2; // /*foreach($image as $key=>$value){ // /*if(empty($url)){ // if(substr($value['metadata'], 0, strlen('group')) === 'group'){ // $image[$key]['url'] = "dicomweb://dcm.pacsonline.cn/".$value['metadata']; // }else{ // $image[$key]['url'] = "dicomweb://static.dcm.pacsonline.cn/".$value['metadata']; // } // }else{ // $image[$key]['url'] = $url.$value['metadata']; // }*/ // $imageUrl = $this->generateUrl($value['url'],$url,$value['remote_url'],$value['local_url'],$value['status'],$value['metadata']); // if(!$imageUrl){ // $file = ROOT_PATH . 'public' . DS . 'get_studiesinfo/'.date('Ymd').'-fail.log'; // $log = 'url错误,传值为--'.$url; // file_put_contents($file, $log,FILE_APPEND); // continue; // } // $image[$key]['url'] = $imageUrl; // $image[$key]['imageNumber'] = $value['instanceNumber']; // // }*/ // $series[$k]['instances'] = $image; // $series[$k]['seriesInstanceUid'] = $v['seriesuid']; // $series[$k]['seriesDescription'] = $v['description']; // $series[$k]['seriesNumber'] = $v['series_num']; // } // if($error == 1){ // throw new \think\Exception('series列表为空'); // } $info['seriesList'] = $series; $return = array(); $return['transactionId'] = $study_info['studyuid']; if(!empty($patient_info['age'])){ $info['patientAge'] = $patient_info['age']; }elseif(!empty($patient_info['birthday'])){ $time = date('Ymd',time()); $age = floor(($time - $patient_info['birthday'])/10000); $info['patientAge'] = $age; }else{ $info['patientAge'] = ''; } $info['patientSex'] = $patient_info['sex']; $info['studyDate'] = $date['exam_datetime']; $info['studyid'] = $study_info['studyid']; $info['patientId'] = $patient_info['temp_patient_id']; $info['institution'] = $institution['name']; $return['studies'][] = $info; if($study_id == '71e721a36ceb4bf4' || $study_id== '2c7b65989e965c2a'){ Cache::set($study_id,json_encode($return),604800); } if($study_id == '17a34f052869eefd' || $study_id == '35684ea1e75ae4d0' || $study_id == 'ef80a21d3a2db803'){ Cache::set($study_id,json_encode($return)); } return json_encode($return); }catch(Exception $e){ echo $e->getMessage(); } } /*public function generateSeries($study_id, $url) { $series = array(); $series_list = DB::table('series')->where('study_id',$study_id)->where('modality','not in','PR,SR')->field('id,series_num,seriesuid,description')->order('series_num asc')->select(); $seriesIndex = 0; $series = array(); while($seriesIndex < count($series_list)) { $series = array_merge($series, $this->generateSeriesSingle($series_list[$seriesIndex], $url)); $seriesIndex++; } return $series; }*/ /*public function generateSeriesSingle($serie, $url) { $images_list = DB::table('images')->where('series_id',$serie['id'])->field('remote_url,local_url,status,columns,image_number as instanceNumber,rows,image_id as sopInstanceUid,metadata,url,frame')->order('image_number asc')->select(); $series = array(); $images = array(); $seriesCount = 0; $imagesIndex = 0; while($imagesIndex < count($images_list)) { $image = $images_list[$imagesIndex]; $imageUrl = $this->generateUrl($image['url'], $url, $image['remote_url'], $image['local_url'], $image['status'], $image['metadata']); $frame = $image['frame']; if($frame === 0) { array_push($images, $this->generateImage($image, $imageUrl)); } else { if(count($images) != 0) { array_push($series, [ 'instances' => $images, 'seriesInstanceUid' => $serie['seriesuid'], 'seriesDescription' => $serie['description'], 'seriesNumber' => $serie['series_num'].'-'.$seriesCount ]); $seriesCount++; $images = array(); } $frameIndex = 0; while($frameIndex < $frame) { array_push($images, $this->generateImage($image, $imageUrl, $frameIndex)); $frameIndex++; } array_push($series, [ 'instances' => $images, 'seriesInstanceUid' => $serie['seriesuid'], 'seriesDescription' => $serie['description'], 'seriesNumber' => $serie['series_num'].'-'.$seriesCount ]); $seriesCount++; $images = array(); } $imagesIndex++; } if(count($images) != 0) { array_push($series, [ 'instances' => $images, 'seriesInstanceUid' => $serie['seriesuid'], 'seriesDescription' => $serie['description'], 'seriesNumber' => $serie['series_num'].'-'.$seriesCount ]); } return $series; }*/ /*public function generateImage($image,$url,$frameIndex = -1) { $image_url = $url; $imageNumber = $image['instanceNumber']; if($frameIndex !== -1) { $image_url = $url.'?frame='.$frameIndex; $imageNumber = $frameIndex + 1; } return [ 'remote_url' => $image['remote_url'], 'local_url' => $image['local_url'], 'status' => $image['status'], 'columns' => $image['columns'], 'rows' => $image['rows'], 'instanceNumber' => $imageNumber, 'imageNumber' => $imageNumber, 'sopInstanceUid' => $image['sopInstanceUid'], 'metadata' => $image['metadata'], 'url' => $image_url, 'frame' => $image['frame'], 'frameIndex' => $frameIndex, ]; }*/ public function generateUrl($url, $address, $remote_url, $local_url, $status, $metadata) { if(empty($address)) { return self::generateNormalUrl($url); } if(preg_match("/^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}/",$address)) { return self::generateIpUrl($url,$address,$remote_url, $local_url, $status,$metadata); } return self::generateNormalUrl($url,$address); } public function generateIpUrl($url, $address, $remote_url, $local_url, $status,$metadata) { if (strpos($url, "zskk-dcm.oss-cn-beijing.aliyuncs.com")){ return str_replace('zskk-dcm.oss-cn-beijing.aliyuncs.com', $address.'/oss', $url); } if(empty($remote_url) && empty($local_url)){ return 'dicomweb://'.$address.'/'.$metadata; }else{ //获取ip $ip = $this->getIpbyAddress($address); if(in_array($ip,json_decode(LC_WAN_IPS,TRUE))) { //浪潮政务云访问 return "dicomweb://$address/$remote_url"; } if(in_array($ip,json_decode(LC_LAN_IPS,TRUE))) { if($status & STATUS_LOCAL) { //内网url有效 return "dicomweb://$address/$local_url"; } if($status & STATUS_REMOTE) { //外网url有效 return "dicomweb://$address/".REMOTE_FLAG."/$remote_url"; } } if($status & (STATUS_LOCAL | STATUS_REMOTE)) { return "dicomweb://$address/$url"; } //浪潮政务云访问 return null; } } public function getIpbyAddress($url){ $ip = explode(':',$url); return $ip[0]; } public function generateNormalUrl($url , $domain = 'dcm.pacsonline.cn') { if(substr($url, 0, strlen('dicomweb://')) === 'dicomweb://'){ return $url; }elseif(substr($url, 0, strlen('http://')) === 'http://'){ $httpurl = str_replace("'http://","dicomweb://",$url); return $httpurl; }elseif(substr($url, 0, strlen('https://')) === 'https://'){ $httpsurl = str_replace("'https://","dicomweb://",$url); return $httpsurl; }elseif(strstr($domain,'://')){ $lujing = explode('://',$domain); $dicurl = 'dicomweb://'.$lujing[1].'/'.$url; return $dicurl; }else{ if(empty($domain)){ $dicurl = 'dicomweb://dcm.pacsonline.cn/'.$url; }else{ $dicurl = 'dicomweb://'.$domain.'/'.$url; } return $dicurl; } } public function testHandleSeires($series_list , $images_list , $url) { $series = array(); $seriesIndexMap = array(); foreach($series_list as $k => $v) { $series[$k] = $this->generateSerie($v); $seriesIndexMap[$v['id']] = $k; } // foreach($images_list as $k=>$v){ // if (strpos($v['url'], "zskk-dcm.oss-cn-beijing.aliyuncs.com")){ // $images_list[$k]['url'] = str_replace('zskk-dcm.oss-cn-beijing.aliyuncs.com', $url.'/oss', $images_list[$k]['url']); // } // } foreach($images_list as $image) { $series[$seriesIndexMap[$image['series_id']]]['instances'][] = $this->generateImage1($image, $this->generateUrl($image['url'], $url, $image['remote_url'], $image['local_url'], $image['status'], $image['metadata'])); } return $series; } public function generateSerie($serie) { return [ 'instances' => array(), 'seriesInstanceUid' => $serie['seriesuid'], 'seriesDescription' => $serie['description'], 'seriesNumber' => $serie['series_num'], 'modality' => $serie['modality'] ]; } public function generateImage1($image,$url,$frameIndex = -1) { $image_url = $url; $imageNumber = $image['instanceNumber']; if($frameIndex !== -1) { $image_url = $url.'?frame='.$frameIndex; $imageNumber = $frameIndex + 1; } return [ 'remote_url' => $image['remote_url'], 'local_url' => $image['local_url'], 'status' => $image['status'], 'columns' => $image['columns'], 'rows' => $image['rows'], 'instanceNumber' => $imageNumber, 'imageNumber' => $imageNumber, 'sopInstanceUid' => $image['sopInstanceUid'], 'metadata' => $image['metadata'], 'url' => $image_url, 'frame' => $image['frame'], 'frameIndex' => $frameIndex, ]; } public function get_infos() { $date = $_REQUEST['date']; $time = strtotime($date); $d1 = date('Y-m-d 00:00:00',$time); $d2 = date('Y-m-d 23:59:59',$time); $timedate = [$d1,$d2]; $institution = DB::table('institution')->field('id,name')->select(); $info = []; foreach($institution as $k=>$v){ // 某天患者数量 $patient_num = DB::table('patient_infos')->where('institution_id',$v['id'])->where('createdAt','between',$timedate)->count(); // 某天检查数量 $studies_num = DB::table('studies')->where('institution_id',$v['id'])->where('studydate',$date)->count(); // $study_id = DB::table('studies')->where('institution_id',$v['id'])->where('studydate',$date)->column('id'); /*// exams检查的数量 // $exam_num = DB::table('exams')->where('study_id','in',$study_id)->count(); // 序列数量 // $series_num = DB::table('series')->where('study_id','in',$study_id)->count(); // $series_id = DB::table('series')->where('study_id','in',$study_id)->column('id'); // 影像数量 // $image_num = DB::table('images')->where('series_id','in',$series_id)->count();*/ $doctor_id = DB::table('doctors')->where('institution_id',$v['id'])->column('id'); // 某天报告数量 $report_num = DB::table('report')->where('report_doctor_id','in',$doctor_id)->where('report_datetime','between',$timedate)->count(); // 某天发起的远程申请单数量 $application_num = DB::table('remote_application')->where('local_institution_id',$v['id'])->where('req_date_time','between',$timedate)->count(); // 各个状态的数量 /*$exams3 = DB::table('exams')->where('study_id','in',$study_id)->where('exam_status',3)->count(); //检查完毕 $exams7 = DB::table('exams')->where('study_id','in',$study_id)->where('exam_status',7)->count(); //已写报告 $exams8 = DB::table('exams')->where('study_id','in',$study_id)->where('exam_status',8)->count(); //已审报告 $exams9 = DB::table('exams')->where('study_id','in',$study_id)->where('exam_status',9)->count(); //已确认报告 $appliaction3 = DB::table('remote_application')->where('local_institution_id',$v['id'])->where('req_date_time','between',$timedate)->where('report_status','')->count(); $appliaction4 = DB::table('remote_application')->where('local_institution_id',$v['id'])->where('req_date_time','between',$timedate)->where('report_status',4)->count();*/ $appliaction5 = DB::table('remote_application')->where('local_institution_id',$v['id'])->where('req_date_time','between',$timedate)->where('report_status',5)->count(); /*$appliaction6 = DB::table('remote_application')->where('local_institution_id',$v['id'])->where('req_date_time','between',$timedate)->where('report_status',6)->count(); $appliaction7 = DB::table('remote_application')->where('local_institution_id',$v['id'])->where('req_date_time','between',$timedate)->where('report_status',7)->count(); $appliaction8 = DB::table('remote_application')->where('local_institution_id',$v['id'])->where('req_date_time','between',$timedate)->where('report_status',8)->count(); $appliaction9 = DB::table('remote_application')->where('local_institution_id',$v['id'])->where('req_date_time','between',$timedate)->where('report_status',9)->count(); $appliaction12 = DB::table('remote_application')->where('local_institution_id',$v['id'])->where('req_date_time','between',$timedate)->where('report_status','12')->count();*/ $appliaction10 = DB::table('remote_application')->where('local_institution_id',$v['id'])->where('req_date_time','between',$timedate)->where('report_status','in','7,8,9')->count(); $info[] = [ 'institution_id'=>$v['id'],//医院id 'institution_name'=>$v['name'],//医院名称 'patient'=>$patient_num, //患者数量 'studies'=>$studies_num, //检查数量 'report'=>$report_num, //报告数量 'application'=>$application_num, //申请数量 'application5'=>$appliaction5, //驳回申请数量 'application10'=>$appliaction10, //申请完成数量 // 'exams' =>$exam_num, //检查数量 // 'exams3'=>$exams3, //检查完毕 // 'exams7'=>$exams7, //已写报告 // 'exams8'=>$exams8, //已审报告 // 'exams9'=>$exams9, //已确认报告 // 'series'=>$series_num, //序列数量 // 'images'=>$image_num, //影像数量 // 'application3'=>$appliaction3, //保存申请数量 // 'application4'=>$appliaction4, //发起申请数量 // 'application6'=>$appliaction6, //接收申请数量 // 'application7'=>$appliaction7, //写报告数量 // 'application8'=>$appliaction8, //审核报告数量 // 'application9'=>$appliaction9, //确认报告数量 // 'application12'=>$appliaction12, //撤回数量 ]; } return json_encode($info); } }