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(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')->order('series_num asc')->select(); $series = array(); $error = 1; foreach($series_list as $k=>$v){ // image_number排序 $image = DB::table('images')->where('series_id',$v['id'])->field('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 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; 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(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; } } }