patientModel = $patientModel; $this->commonServies = $commonServies; } /** * @throws DataNotFoundException * @throws ModelNotFoundException * @throws DbException * @throws Exception */ public function makeMappingData($params, $mpKey='0', $action='save', $type=1): array { $return = []; $mapping = $this->patientModel->getMapping(['MPKEY'=>$mpKey,'ACTION'=>$action,'PARAM_TYPE'=>$type]); $all = $this->patientModel->getAllMapping(['ACTION'=>$action,'PARAM_TYPE'=>$type]); $allMapping = []; foreach ($all as $k=>$v) { $allMapping[$v['MPKEY']][] = $v; } $mappingArr = []; foreach ($mapping as $v) { $childMapping = []; if($v['TYPE'] == 'object' || $v['TYPE'] == 'array') { $childMapping = $allMapping[$v['MKEY']] ?? []; } $child = []; if(!empty($childMapping)) { foreach ($childMapping as $value) { $child[$value['MKEY']] = ['KEY'=>$value['KEY'],'MPKEY'=>$value['MPKEY'],'MKEY'=>$v['MKEY'],'TYPE'=>$value['TYPE'],'action'=>$v['ACTION']]; } } $mappingArr[$v['MKEY']] = ['KEY'=>$v['KEY'],'MPKEY'=>$v['MPKEY'],'MKEY'=>$v['MKEY'],'TYPE'=>$v['TYPE'],'CHILD'=>$child,'ACTION'=>$v['ACTION']]; } foreach ($params as $k=>$v) { if(is_array($v)) { foreach ($v as $key=>$value) { if(is_array($value)) { $returnArr = $this->makeMappingData($value,$mappingArr[$k]['MKEY'],$mappingArr[$k]['ACTION'],$type); $return[$mappingArr[$k]['KEY']][] = $returnArr; }else{ if(!empty($mappingArr[$k]['CHILD'])) { if(isset($mappingArr[$k]['CHILD'][$key]['KEY'])) { $return[$mappingArr[$k]['KEY']][$mappingArr[$k]['CHILD'][$key]['KEY']] = $value; } } } } }else{ if(isset($mappingArr[$k]['KEY'])) { $return[$mappingArr[$k]['KEY']] = $v; } } } ksort($return); return $return; } public function saveMpi($mpi, $idCard,$mpiKey) { $this->patientModel->saveMpi($mpi,$idCard,$mpiKey); } public function savePatient($data,$mpi,$mpiKey,$patientCode):void { $arr = $this->makePatient($data,$mpi,$mpiKey,$patientCode); $this->patientModel->save($arr); } /** * @throws DataNotFoundException * @throws \think\exception\DbException * @throws ModelNotFoundException * @throws DbException */ public function getMpi($idCard) { $idCard = Gm::encrypt(Config::get('gm.key'),$idCard); return $this->patientModel->getMpi($idCard); } public function makePatient($data, $mpi,$mpiKey, $patientCode): array { $arr = []; $arr['MPI'] = $mpi; $arr['MPI_KEY'] = $mpiKey; $arr['PATIENT_CODE'] = $patientCode; $arr['NAME'] = $data['NAME'] ?? ''; $arr['INSUR_CARD_NO'] = $data['INSUR_CARD_NO'] ?? ''; $arr['ID_CARD_CODE'] = $data['ID_CARD_CODE'] ?? ''; $arr['ID_CARD'] = $data['ID_CARD'] ?? ''; $arr['ID_CARDNUM'] = $data['ID_CARDNUM'] ?? ''; $arr['GENDER'] = $data['GENDER'] ?? ''; $arr['GENDER_CODE'] = $data['GENDER_CODE'] ?? ''; $arr['BIRTH_DATE'] = $data['BIRTH_DATE'] ?? ''; $arr['MARITAL_STATUS_CODE'] = $data['MARITAL_STATUS_CODE'] ?? ''; $arr['MARITAL_STATUS'] = $data['MARITAL_STATUS'] ?? ''; $arr['ADDRESS'] = $data['ADDRESS'] ?? ''; $arr['ECARD_NO'] = $data['ECARD_NO'] ?? ''; return $arr; } public function saveMedical($medical,$mpi,$patientCode):void { $arr = $this->makeMedical($medical,$mpi,$patientCode); $this->patientModel->saveMedical($arr); } public function makeMedical($medical,$mpi,$patientCode):array { $arr = []; $arr['MPI'] = $mpi; $arr['PATIENT_CODE'] = $patientCode; $arr['SERIESNUM'] = $medical['SERIESNUM']; $arr['CLASS_CODE'] = $medical['CLASS_CODE']; $arr['CLASS'] = $medical['CLASS']; $arr['ENCOUNTER_CARD_NO'] = $medical['ENCOUNTER_CARD_NO']; $arr['RECORD_CODE'] = $medical['RECORD_CODE']; $arr['HOS_EMPI'] = $medical['HOS_EMPI']; $arr['NAME'] = $medical['NAME']; $arr['ENCOUNTER_DATE'] = $medical['ENCOUNTER_DATE']; $arr['DEPTNAME'] = $medical['DEPTNAME']; $arr['CHIEFCOMPLAINT'] = $medical['CHIEFCOMPLAINT']; $arr['ORGCODE'] = $medical['ORGCODE']; $arr['ORGNAME'] = $medical['ORGNAME']; $arr['AGE'] = $medical['AGE']; $arr['GENDER'] = $medical['GENDER']; $arr['GENDER_CODE'] = $medical['GENDER_CODE']; return $arr; } public function saveDiagnose($diagnose, $patientCode) { $arr = []; foreach ($diagnose as $v) { $data = $this->makeDiagnose($v,$patientCode); $arr[] = $data; } $this->patientModel->saveDiagnose($arr); } public function makeDiagnose($diagnose, $patientCode):array { $data = []; $data['PATIENT_CODE'] = $patientCode; $data['DIAGNOSECODE'] = $diagnose['DIAGNOSECODE']; $data['DIAGNOSENAME'] = $diagnose['DIAGNOSENAME']; return $data; } public function saveApplication($application, $mpi, $patientCode):void { $arr = []; foreach ($application as $v) { $data = $this->makeApplication($v,$mpi,$patientCode); $arr[] = $data; } $this->patientModel->saveApplication($arr); } public function makeApplication($application, $mpi, $patientCode):array { $data = []; $applicationCode = Handle::makeApplicationCode($patientCode,$application['REQUESTID']); $data['MPI'] = $mpi; $data['PATIENT_CODE'] = $patientCode; $data['EXAM_APPLICATION_CODE'] = $applicationCode; $data['REQUESTID'] = $application['REQUESTID']; $data['NAME'] = $application['NAME']; $data['SERIESNUM'] = $application['SERIESNUM']; $data['DEVICETYPE'] = $application['DEVICETYPE']; $data['DEVICETYPE_CODE'] = $application['DEVICETYPE_CODE']; $data['EXAM_ITEMNAME'] = $application['EXAM_ITEMNAME']; $data['EXAM_ITEMNAME_CODE'] = $application['EXAM_ITEMNAME_CODE']; $data['BODYSITE_CATEG'] = $application['BODYSITE_CATEG']; $data['BODYSITE_CATEG_CODE'] = $application['BODYSITE_CATEG_CODE']; $data['BODYSITE'] = $application['BODYSITE']; $data['EXAM_METHOD'] = $application['EXAM_METHOD']; $data['ORGCODE'] = $application['ORGCODE']; $data['ORGNAME'] = $application['ORGNAME']; $data['DEPTNAME'] = $application['DEPTNAME']; $data['PRACTITIONERNAME'] = $application['PRACTITIONERNAME']; $data['REQUESTTIME'] = $application['REQUESTTIME']; $data['AGE'] = $application['AGE']; $data['GENDER'] = $application['GENDER']; $data['GENDER_CODE'] = $application['GENDER_CODE']; return $data; } public function saveOrders($orders,$mpi,$patientCode): void { $arr = []; $medicalOrderCode = ''; foreach ($orders as $k=>$v) { $data = $this->makeOrders($v,$mpi,$patientCode); $arr[] = $data; } $this->patientModel->saveOrders($arr); } public function makeOrders($orders,$mpi,$patientCode):array { $medicalOrderCode = Handle::makeMedicalOrderCode($patientCode,$orders['ORDERID'],$orders['LAB_ITEMNAME_CODE']); $data = []; $data['MPI'] = $mpi; $data['PATIENT_CODE'] = $patientCode; $data['MEDICAL_ORDER_CODE'] = $medicalOrderCode; $data['ORDERID'] = $orders['ORDERID']; $data['NAME'] = $orders['NAME']; $data['SERIESNUM'] = $orders['SERIESNUM']; $data['LAB_ITEMNAME'] = $orders['LAB_ITEMNAME']; $data['LAB_ITEMNAME_CODE'] = $orders['LAB_ITEMNAME_CODE']; $data['SPECIMEN_TYPE'] = $orders['SPECIMEN_TYPE']; $data['SPECIMEN_NUM'] = $orders['SPECIMEN_NUM']; $data['SPECIMEN_STATUS'] = $orders['SPECIMEN_STATUS']; $data['SPECIMEN_COLLETIME'] = $orders['SPECIMEN_COLLETIME']; $data['SPECIMEN_RECEITIME'] = $orders['SPECIMEN_RECEITIME']; $data['ORGCODE'] = $orders['ORGCODE']; $data['ORGNAME'] = $orders['ORGNAME']; $data['DEPTNAME'] = $orders['DEPTNAME']; $data['PRACTITIONERNAME'] = $orders['PRACTITIONERNAME']; $data['REQUESTTIME'] = $orders['REQUESTTIME']; $data['REPORTSTATUS'] = $orders['REPORTSTATUS']; $data['REPORTSTATUS_CODE'] = $orders['REPORTSTATUS_CODE']; $data['AGE'] = $orders['AGE']; $data['GENDER'] = $orders['GENDER']; $data['GENDER_CODE'] = $orders['GENDER_CODE']; $data['TYPE'] = $orders['TYPE']; return $data; } public function saveExamReport($exam,$mpi,$patientCode,$exam_code = false): void { $arr = []; foreach ($exam as $v) { $data = $this->makeExamReport($v,$mpi,$patientCode,$exam_code); $data['IMAGES'] = $this->makeUrl($data['IMAGES']); $arr[] = $data; } $this->patientModel->saveExamReport($arr); } public function makeExamReport($exam,$mpi,$patientCode,$exam_code):array { $examReportCode = Handle::makeExamReportCode($patientCode,$exam['REPORTID']); $applicationCode = Handle::makeApplicationCode($patientCode,$exam['EXAM_REQUESTID']); $data = []; $data['MPI'] = $mpi; $data['PATIENT_CODE'] = $patientCode; $data['EXAM_APPLICATION_CODE'] = $applicationCode; $data['EXAM_REPORT_CODE'] = $examReportCode; $data['NAME'] = $exam['NAME']; $data['SERIESNUM'] = $exam['SERIESNUM']; $data['EXAM_REQUESTID'] = $exam['EXAM_REQUESTID']; $data['REPORTID'] = $exam['REPORTID']; $data['EXAM_ITEMNAME'] = $exam['EXAM_ITEMNAME']; $data['BODYSITE_CATEG'] = $exam['BODYSITE_CATEG']; $data['BODYSITE_CATEG_CODE'] = $exam['BODYSITE_CATEG_CODE']; $data['BODYSITE'] = $exam['BODYSITE']; $data['OBSERVATIONS_COMMENT'] = $exam['OBSERVATIONS_COMMENT']; $data['OBSERVATIONS_RESULT'] = $exam['OBSERVATIONS_RESULT']; $data['IMAGES'] = $exam['IMAGES']; $data['DICOM_INDEXID'] = $exam['DICOM_INDEXID']; $data['ORGCODE'] = $exam['ORGCODE']; $data['ORGNAME'] = $exam['ORGNAME']; $data['DEPTNAME'] = $exam['DEPTNAME']; $data['PRACTITIONERNAME'] = $exam['PRACTITIONERNAME']; $data['AUDITNAME'] = $exam['AUDITNAME']; $data['REPORTTIME'] = $exam['REPORTTIME']; $data['REPORTSTATUS'] = $exam['REPORTSTATUS']; $data['GENDER'] = $exam['GENDER']; $data['GENDER_CODE'] = $exam['GENDER_CODE']; $data['AGE'] = $exam['AGE']; $data['STUDYTIME'] = $exam['STUDYTIME']; // $data['EXAM_ITEMNAME_CODE'] = $exam_code; return $data; } public function saveInspectReport($inspect, $mpi, $patientCode): void { $arr = []; $labArr = []; $labArrOrganism = []; foreach ($inspect as $v) { $inspectReportCode = Handle::makeInspectReportCode($patientCode, $v['REPORTID']); $data = $this->makeInspect($v,$mpi,$patientCode,$inspectReportCode); $arr[] = $data; foreach ($v['INSPECT_REPORT_ITEMS'] as $value) { // $lab = $this->makeLab($value,$inspectReportCode); $lab = $this->makeLabOrganism($value,$inspectReportCode); $labArr[] = $lab; } // if($v['type'] == 1) // { // // 正常检验 // }else{ // // 微生物检验 // foreach ($v['INSPECT_REPORT_ITEMS'] as $value) // { // $lab2 = $this->makeLabOrganism($value,$inspectReportCode); // $labArrOrganism[] = $lab2; // } // } } $this->patientModel->saveInspectReport($arr); if(!empty($labArr)) { $this->patientModel->saveLabData($labArr); } // if(!empty($labArrOrganism)) // { // $this->patientModel->saveLabDataOrganism($labArrOrganism); // } } public function makeInspect($inspect,$mpi,$patientCode,$inspectReportCode) { $data = []; $medicalOrderCode = Handle::makeMedicalOrderCode($patientCode,$inspect['EXAM_REQUESTID'],$inspect['LAB_ITEMNAME_CODE']); $data['MPI'] = $mpi; $data['PATIENT_CODE'] = $patientCode; $data['MEDICAL_ORDER_CODE'] = $medicalOrderCode; $data['INSPECT_REPORT_CODE'] = $inspectReportCode; $data['NAME'] = $inspect['NAME']; $data['SERIESNUM'] = $inspect['SERIESNUM']; $data['EXAM_REQUESTID'] = $inspect['EXAM_REQUESTID']; $data['REPORTID'] = $inspect['REPORTID']; $data['LAB_ITEMNAME'] = $inspect['LAB_ITEMNAME']; $data['LAB_ITEMNAME_CODE'] = $inspect['LAB_ITEMNAME_CODE']; $data['LAB_ITEMNAME_NUMBER'] = $inspect['LAB_ITEMNAME_NUMBER']; $data['LAB_HR_STATUS'] = $inspect['LAB_HR_STATUS']; $data['LAB_HR_ITEMNAME'] = $inspect['LAB_HR_ITEMNAME']; $data['LAB_HR_ITEMNAME_CODE'] = $inspect['LAB_HR_ITEMNAME_CODE']; $data['SPECIMEN_TYPE'] = $inspect['SPECIMEN_TYPE']; $data['ORGNAME'] = $inspect['ORGNAME']; $data['ORGCODE'] = $inspect['ORGCODE']; $data['PRACTITIONERNAME'] = $inspect['PRACTITIONERNAME']; $data['DEPTNAME'] = $inspect['DEPTNAME']; $data['REPORTTIME'] = $inspect['REPORTTIME']; $data['AUDITNAME'] = $inspect['AUDITNAME']; $data['REPORTSTATUS'] = $inspect['REPORTSTATUS']; $data['GENDER'] = $inspect['GENDER']; $data['GENDER_CODE'] = $inspect['GENDER_CODE']; $data['AGE'] = $inspect['AGE']; $data['TYPE'] = $inspect['TYPE']; return $data; } public function saveHospitalPatient($mpiKey, $mpi, $patientCode, $patientData, $medical, $diagnoses, $orders, $application) { $data = $this->makeHospitalPatientData($mpiKey, $mpi, $patientCode, $patientData, $medical, $diagnoses, $orders, $application); $model = new HospitalPatient(); $model->save($data); } private function makeHospitalPatientData($mpiKey, $mpi, $patientCode, $patientData, $medical, $diagnoses, $orders, $applications) { $data = []; $patient = $this->makePatient($patientData,$mpi, $mpiKey,$patientCode); $medical = $this->makeMedical($medical,$mpiKey,$patientCode); $diagnose = $this->makeDiagnoseNameAndCodes($diagnoses); $order = $this->makeOrderNameAndCodes($orders); $application = $this->makeApplicationsNameAndCodes($applications); $data['MPI_KEY'] = $mpiKey; $data['PATIENT_CODE'] = $patient['PATIENT_CODE']; $data['ORGNAME'] = $medical['ORGNAME']; $data['NAME'] = $patient['NAME']; $data['GENDER'] = $patient['GENDER']; $data['AGE'] = $medical['AGE']; $data['ID_CARDNUM'] = $patient['ID_CARDNUM']; $data['MPI'] = $mpi; $data['ENCOUNTER_DATE'] = $medical['ENCOUNTER_DATE']; $data['CHIEFCOMPLAINT'] = $medical['CHIEFCOMPLAINT']; $data['DIAGNOSENAME'] = $diagnose['DIAGNOSENAME']; $data['LAB_ITEMNAME'] = $order['LAB_ITEMNAME']; $data['EXAM_ITEMNAME'] = $application['EXAM_ITEMNAME']; $data['INSUR_CARD_NO'] = $patient['INSUR_CARD_NO']; $data['ID_CARD_CODE'] = $patient['ID_CARD_CODE']; $data['ID_CARD'] = $patient['ID_CARD']; $data['GENDER_CODE'] = $patient['GENDER_CODE']; $data['BIRTH_DATE'] = $patient['BIRTH_DATE']; $data['MARITAL_STATUS_CODE'] = $patient['MARITAL_STATUS_CODE']; $data['MARITAL_STATUS'] = $patient['MARITAL_STATUS']; $data['ADDRESS'] = $patient['ADDRESS']; $data['ECARD_NO'] = $patient['ECARD_NO']; $data['SERIESNUM'] = $medical['SERIESNUM']; $data['CLASS_CODE'] = $medical['CLASS_CODE']; $data['CLASS'] = $medical['CLASS']; $data['ENCOUNTER_CARD_NO'] = $medical['ENCOUNTER_CARD_NO']; $data['RECORD_CODE'] = $medical['RECORD_CODE']; $data['HOS_EMPI'] = $medical['HOS_EMPI']; $data['DEPTNAME'] = $medical['DEPTNAME']; $data['DIAGNOSECODE'] = $diagnose['DIAGNOSECODE']; $data['LAB_ITEMNAME_CODE'] = $order['LAB_ITEMNAME_CODE']; $data['EXAM_ITEMNAME_CODE'] = $application['EXAM_ITEMNAME_CODE']; $data['ORGCODE'] = $medical['ORGCODE']; return $data; } public function makeUploadHospitalPatient($patientCode): array { $where = ['PATIENT_CODE'=>$patientCode]; $patient = $this->patientModel->getPatient($where); if(empty($patient)) { $where['MPI_KEY'] = ''; return $where; } $medical = $this->patientModel->getMedical($patientCode); $exam = $this->patientModel->getExam($patientCode); $inspect = $this->patientModel->getInspect($patientCode); $data['PATIENT_CODE'] = $patient['PATIENT_CODE']; $data['MPI_KEY'] = $patient['MPI_KEY']; $data['NAME'] = $patient['NAME']; $data['GENDER'] = $patient['GENDER']; $data['ORGNAME'] = $medical['ORGNAME']; $data['AGE'] = $medical['AGE']; $age_last = substr( $data['AGE'], -1); $age_num = substr( $data['AGE'], 0,-1); $last = match ($age_last) { 'Y' => '365', 'M' => '30', 'W' => '7', 'D' => '1', default => $age_last, }; $data['AGE_DAY'] = $last*$age_num; $data['ID_CARDNUM'] = $patient['ID_CARDNUM']; $data['MPI'] = $patient['MPI']; $data['ENCOUNTER_DATE'] = $medical['ENCOUNTER_DATE']; $data['CHIEFCOMPLAINT'] = $medical['CHIEFCOMPLAINT']; $data['DIAGNOSENAME'] = $medical['DIAGNOSENAME']; if(!empty($inspect)) { $code = []; $code_name = []; foreach ($inspect as $v) { if(!empty($v['LAB_HR_ITEMNAME_CODE'])) { $code[] = $v['LAB_HR_ITEMNAME_CODE']; $code_name[] = $v['LAB_HR_ITEMNAME']; }else{ // $inspectItem = $this->patientModel->getLab($v['INSPECT_REPORT_CODE']); // foreach ($inspectItem as $value) // { // if(!empty($value['LAB_HR_ITEMDETAILNAME_CODE'])) // { // $code[] = $value['LAB_HR_ITEMDETAILNAME_CODE']; // $code_name[] = $value['LAB_HR_ITEMDETAILNAME']; // } // } } } $data['LAB_ITEMNAME'] = implode(',',$code_name); //检验项目 $data['LAB_ITEMNAME_CODE'] = implode(',',$code); } if(!empty($exam)) { $item_exam = []; $item_exam_code = []; foreach ($exam as $k=>$v) { $item_exam[] = $v['HR_ITEMNAME']; $item_exam_code[] = $v['HR_ITEMNAME_CODE']; } $data['EXAM_ITEMNAME'] = implode(',',$item_exam); //检查项目 $data['EXAM_ITEMNAME_CODE'] = implode(',',$item_exam_code); //检查项目 } $data['ID_CARD_CODE'] = $patient['ID_CARD_CODE']; $data['ID_CARD'] = $patient['ID_CARD']; $data['GENDER_CODE'] = $patient['GENDER_CODE']; $data['BIRTH_DATE'] = $patient['BIRTH_DATE']; $data['SERIESNUM'] = $medical['SERIESNUM']; $data['CLASS_CODE'] = $medical['CLASS_CODE']; $data['CLASS'] = $medical['CLASS']; $data['ENCOUNTER_CARD_NO'] = $medical['ENCOUNTER_CARD_NO']; $data['HOS_EMPI'] = $medical['HOS_EMPI']; $data['DEPTNAME'] = $medical['DEPTNAME']; $data['DIAGNOSECODE'] = $medical['DIAGNOSECODE']; $data['ORGCODE'] = $medical['ORGCODE']; // todo $data['create_time'] = $medical['ENCOUNTER_DATE']; return $data; } public function saveUploadHospitalPatient($patientCode) { $data = $this->makeUploadHospitalPatient($patientCode); $this->patientModel->HospitalPatient($data); } private function makeDiagnoseNameAndCodes($diagnoses) { $DIAGNOSECODES = array_map(function($diagnose) { return $diagnose['DIAGNOSECODE']; }, $diagnoses); $DIAGNOSENAMES = array_map(function($diagnose) { return $diagnose['DIAGNOSENAME']; }, $diagnoses); return [ 'DIAGNOSECODE' => implode(',', $DIAGNOSECODES), 'DIAGNOSENAME' => implode(',', $DIAGNOSENAMES) ]; } private function makeOrderNameAndCodes($orders) { $LAB_ITEMNAME_CODES = array_map(function($order) { return $order['LAB_ITEMNAME_CODE']; }, $orders); $LAB_ITEMNAMES = array_map(function($order) { return $order['LAB_ITEMNAME']; }, $orders); return [ 'LAB_ITEMNAME_CODE' => implode(',', $LAB_ITEMNAME_CODES), 'LAB_ITEMNAME' => implode(',', $LAB_ITEMNAMES) ]; } private function makeApplicationsNameAndCodes($applications) { $EXAM_ITEMNAME_CODES = array_map(function($application) { return $application['EXAM_ITEMNAME_CODE']; }, $applications); $EXAM_ITEMNAMES = array_map(function($application) { return $application['EXAM_ITEMNAME']; }, $applications); return [ 'EXAM_ITEMNAME_CODE' => implode(',', $EXAM_ITEMNAME_CODES), 'EXAM_ITEMNAME' => implode(',', $EXAM_ITEMNAMES) ]; } public function makeLab($lab,$inspectReportCode) { $labArr = []; $labArr['INSPECT_REPORT_CODE'] = $inspectReportCode; $labArr['INSPECT_REPORT_ITEM_CODE'] = Handle::makeInspectReportItemCode($inspectReportCode,$lab['LAB_ITEMDETAILNAME_CODE']); $labArr['EXAM_REQUESTID'] = $lab['EXAM_REQUESTID']; $labArr['REPORTID'] = $lab['REPORTID']; $labArr['ORGCODE'] = $lab['ORGCODE']; $labArr['LAB_ITEMDETAILNAME'] = $lab['LAB_ITEMDETAILNAME']; $labArr['LAB_ITEMDETAILNAME_NUMBER'] = $lab['LAB_ITEMDETAILNAME_NUMBER']; $labArr['LAB_ITEMDETAILNAME_CODE'] = $lab['LAB_ITEMDETAILNAME_CODE']; $labArr['LAB_ITEMDETAILVALUE'] = $lab['LAB_ITEMDETAILVALUE']; $labArr['LAB_ITEMDETAILSPEC'] = $lab['LAB_ITEMDETAILSPEC']; $labArr['LAB_ITEMDETAILINTERPRETATION'] = $lab['LAB_ITEMDETAILINTERPRETATION']; $labArr['LAB_ITEMDETAILRANGE'] = $lab['LAB_ITEMDETAILRANGE']; $labArr['CRITICAL_RANGE'] = $lab['CRITICAL_RANGE']; $labArr['LAB_HR_ITEMDETAIL_STATUS'] = $lab['LAB_HR_ITEMDETAIL_STATUS']; $labArr['LAB_HR_ITEMDETAILNAME'] = $lab['LAB_HR_ITEMDETAILNAME']; $labArr['LAB_HR_ITEMDETAILNAME_CODE'] = $lab['LAB_HR_ITEMDETAILNAME_CODE']; return $labArr; } public function makeLabOrganism($lab,$inspectReportCode) { $data['INSPECT_REPORT_CODE'] = $inspectReportCode; $data['INSPECT_REPORT_ITEM_CODE'] = Handle::makeInspectReportItemCode($inspectReportCode,$lab['LAB_ITEMDETAILNAME_CODE']); $data['EXAM_REQUESTID'] = $lab['EXAM_REQUESTID'] ?? ''; $data['REPORTID'] = $lab['REPORTID'] ?? ''; $data['ORGCODE'] = $lab['ORGCODE'] ?? ''; $data['LAB_ITEMDETAILNAME'] = $lab['LAB_ITEMDETAILNAME'] ?? ''; $data['LAB_ITEMDETAILNAME_EN'] = $lab['LAB_ITEMDETAILNAME_EN'] ?? ''; $data['LAB_ITEMDETAILNAME_CODE'] = $lab['LAB_ITEMDETAILNAME_CODE'] ?? ''; $data['LAB_ITEMDETAILNAME_NUMBER'] = $lab['LAB_ITEMDETAILNAME_NUMBER'] ?? ''; $data['LAB_ITEMDETAILVALUE'] = $lab['LAB_ITEMDETAILVALUE'] ?? ''; $data['LAB_ITEMDETAILSPEC'] = $lab['LAB_ITEMDETAILSPEC'] ?? ''; $data['LAB_ITEMDETAILINTERPRETATION'] = $lab['LAB_ITEMDETAILINTERPRETATION'] ?? ''; $data['LAB_ITEMDETAILINTERPRETATION_BIA'] = $lab['LAB_ITEMDETAILINTERPRETATION_BIA'] ?? ''; $data['LAB_ITEMDETAILRANGE'] = $lab['LAB_ITEMDETAILRANGE'] ?? ''; $data['CRITICAL_RANGE'] = $lab['CRITICAL_RANGE'] ?? ''; $data['LAB_HR_ITEMDETAIL_STATUS'] = $lab['LAB_HR_ITEMDETAIL_STATUS'] ?? ''; $data['LAB_HR_ITEMDETAILNAME'] = $lab['LAB_HR_ITEMDETAILNAME'] ?? ''; $data['LAB_HR_ITEMDETAILNAME_CODE'] = $lab['LAB_HR_ITEMDETAILNAME_CODE'] ?? ''; $data['LAB_METHOD'] = $lab['LAB_METHOD'] ?? ''; $data['KB'] = $lab['KB'] ?? ''; $data['MIC'] = $lab['MIC'] ?? ''; $data['LAB_ITEMDETAILINTERPRE'] = $lab['LAB_ITEMDETAILINTERPRE'] ?? ''; return $data; } // /** // * @throws ModelNotFoundException // * @throws DbException // * @throws DataNotFoundException // */ // public function getPatient($where): array|string // { // $patient = $this->patientModel->getPatient($where); // if(empty($patient)) // { // return '无法找到患者信息'; // } // $medical = $this->patientModel->getMedical($patient['PATIENT_CODE']); // $mpi = $this->patientModel->getMpiByKey($patient['MPI']); // $diagnoses = $this->patientModel->getDiagnoses($patient['PATIENT_CODE']); // $application = $this->patientModel->getApplication($patient['PATIENT_CODE']); // $orders = $this->patientModel->getOrders($patient['PATIENT_CODE']); // $exam = $this->patientModel->getExam($patient['PATIENT_CODE']); // $app_data = []; // foreach ($application as $key=>$value) // { // $app_data[$value['EXAM_APPLICATION_CODE']] = $value['DEVICETYPE_CODE']; // } // foreach ($exam as $kkk=>$vvv) // { // $exam[$kkk]['DEVICETYPE_CODE'] = $app_data[$vvv['EXAM_APPLICATION_CODE']] ?? ''; // } // $inspect = $this->patientModel->getInspect($patient['PATIENT_CODE']); // foreach ($inspect as $kk=>$vv) // { // $lab = $this->patientModel->getLab($vv['INSPECT_REPORT_CODE']); // $inspect[$kk]['INSPECT_REPORT_ITEMS'] = $lab; // } // unset($patient['ID']); // unset($patient['PATIENT_CODE']); // unset($patient['MPI']); // $patient['MPI'] = $mpi; // unset($patient['create_time']); // unset($patient['update_time']); // return [ // 'PATIENT'=>$patient, // 'MEDICAL_INFORMATION'=>$medical, // 'DIAGNOSES'=>$diagnoses, // 'EXAM_APPLICATIONS'=>$application, // 'MEDICAL_ORDERS'=>$orders, // 'EXAM_REPORTS'=>$exam, // 'INSPECT_REPORTS'=>$inspect // ]; // } /** * @throws ModelNotFoundException * @throws DbException * @throws DataNotFoundException */ public function getPatientSign($where,$medicalWhere,$RESULT ): bool|array { $patient = $this->patientModel->getPatient($where); if(empty($patient)) { return false; } $patient = $patient->toArray(); $medical = $this->patientModel->getMedical($patient['PATIENT_CODE'],$medicalWhere); $medical = empty($medical) ? $medical : $medical->toArray(); if(empty($medical)) { return false; } $exam = $this->patientModel->getExam($patient['PATIENT_CODE'],['RECOG_STATUS'=>'*']); if(!empty($exam) && $RESULT == 1) { return $exam; } $inspect = $this->patientModel->getInspect($patient['PATIENT_CODE']); unset($patient['PATIENT_CODE']); $inspectData = []; $return = false; foreach ($inspect as $k=>$v) { $RECOG = 0; if($v['RECOG_STATUS'] == '*' && $RESULT == 1) { $RECOG = 1; $return = true; } $lab = $this->patientModel->getLab($v['INSPECT_REPORT_CODE']); if(!empty($lab)) { foreach ($lab as $key=>$value) { if($value['RECOG_STATUS'] == '*') { $RECOG = 1; } } } if($RECOG == 1) { $return = true; $v['LAB_DATA'] = $lab; $inspectData[] = $v; } } $data = [ 'PATIENT'=>$patient, 'MEDICAL_INFORMATION'=>$medical, 'EXAM_REPORTS'=>$exam, 'INSPECT_REPORTS'=>$inspectData ]; if($RESULT == 1) { return $return; }else{ return $data; } } /** * @throws ModelNotFoundException * @throws DbException * @throws DataNotFoundException */ public function getPatient($where,$medicalWhere = []): array|string { $patient = $this->patientModel->getPatient($where); if(empty($patient)) { return '无法找到患者信息'; } $patient = $patient->toArray(); $medical = $this->patientModel->getMedical($patient['PATIENT_CODE'],$medicalWhere); $medical = empty($medical) ? $medical : $medical->toArray(); $exam = $this->patientModel->getExam($patient['PATIENT_CODE']); $inspect = $this->patientModel->getInspect($patient['PATIENT_CODE']); unset($patient['PATIENT_CODE']); foreach ($inspect as $k=>$v) { $lab = $this->patientModel->getLab($v['INSPECT_REPORT_CODE']); $inspect[$k]['INSPECT_REPORT_ITEMS'] = $lab; unset($inspect[$k]['INSPECT_REPORT_CODE']); } $data = [ 'PATIENT'=>$patient, 'MEDICAL_INFORMATION'=>$medical, 'EXAM_REPORTS'=>$exam, 'INSPECT_REPORTS'=>$inspect ]; return $data; } public function updateMiddleStatus($id, $update): void { $this->patientModel->updateMiddleStatus($id, $update); } public function checkPostExamReport($params): array { var_dump(0); $PATIENT = $this->commonServies->handlePATIENT($params['PATIENT'], $params['MEDICAL_INFORMATION']); var_dump(1); $MEDICAL_INFORMATION = $this->commonServies->handleMEDICAL_INFORMATION($params['MEDICAL_INFORMATION'], $PATIENT); var_dump(2); $EXAM = $this->commonServies->handleEXAM($params['EXAM_REPORTS'], $MEDICAL_INFORMATION); var_dump(3); // $EXAM_APPLICATIONS = $EXAM['EXAM_APPLICATIONS']; $EXAM_REPORTS = $EXAM['EXAM_REPORTS']; foreach ($EXAM_REPORTS as &$v) { if(!empty($v['REPORT'])) { $v['REPORT'] = $this->makeUrl($v['REPORT']); } } return [ "PATIENT" => $PATIENT, "MEDICAL_INFORMATION" => $MEDICAL_INFORMATION, // "EXAM_APPLICATIONS" => $EXAM_APPLICATIONS, "EXAM_REPORTS" => $EXAM_REPORTS, ]; } public function checkPostLisReport($params): array { $PATIENT = $this->commonServies->handlePATIENT($params['PATIENT'], $params['MEDICAL_INFORMATION']); $MEDICAL_INFORMATION = $this->commonServies->handleMEDICAL_INFORMATION($params['MEDICAL_INFORMATION'], $PATIENT); $reportModel = $this->commonServies->handleINSPECT_REPORTS($params, $MEDICAL_INFORMATION); $INSPECT_REPORTS = $reportModel['INSPECT_REPORTS']; $INSPECT_REPORT_ITEMS = $reportModel['INSPECT_REPORT_ITEMS']; foreach ($INSPECT_REPORTS as &$v) { if(!empty($v['REPORT'])) { $v['REPORT'] = $this->makeUrl($v['REPORT']); } } return [ "PATIENT" => $PATIENT, "MEDICAL_INFORMATION" => $MEDICAL_INFORMATION, "INSPECT_REPORTS" => $INSPECT_REPORTS, "INSPECT_REPORT_ITEMS" => $INSPECT_REPORT_ITEMS, ]; } /* * 上传检查数据 */ public function postExamInfo($params): string { // try { $check = $this->checkPostExamReport($params); $this->handlePatient($check['PATIENT']); $MEDICAL_INFORMATION = $check['MEDICAL_INFORMATION']; $information = $this->patientModel->getMedical($MEDICAL_INFORMATION['PATIENT_CODE'],[],'*'); if(!empty($information)) { $this->patientModel->saveRepeatInformation($information); $this->patientModel->delOldInformation(['PATIENT_CODE'=>$information['PATIENT_CODE']]); } $MEDICAL_INFORMATION_INSERT = $MEDICAL_INFORMATION; $MEDICAL_INFORMATION_INSERT['create_time'] = $check['EXAM_REPORTS'][0]['create_time']; $this->patientModel->saveMedical($MEDICAL_INFORMATION_INSERT); $EXAM_REPORTS = $check['EXAM_REPORTS']; $this->saveExamData($EXAM_REPORTS); $this->saveUploadHospitalPatient($MEDICAL_INFORMATION['PATIENT_CODE']); return 'success'; // }catch (\Exception $e) // { // return $e->getMessage(); // } } public function postExamReport($params): string { $EXAM_REPORTS = $this->makeExamData($params['EXAM_REPORTS']); $report = $this->patientModel->getExamReport(['EXAM_REPORT_CODE'=>$EXAM_REPORTS['EXAM_REPORT_CODE']],'*'); $report->save($EXAM_REPORTS); return 'success'; } public function makeExamData($report) { $RESULT_STATUS = $this->commonServies->getRESULT_STATUSByCode($report['RESULT_STATUS_CODE']); $report['RESULT_STATUS'] = $RESULT_STATUS; return $report; } public function saveExamData($EXAM_REPORTS) { $EXAM_REPORTS_INSERT = []; foreach ($EXAM_REPORTS as $k=>$v) { $report = $this->patientModel->getExamReport(['EXAM_REPORT_CODE'=>$v['EXAM_REPORT_CODE']],'*'); if(!empty($report)) { $this->patientModel->saveRepeatReport($report); $this->patientModel->delOldReport(['EXAM_REPORT_CODE'=>$v['EXAM_REPORT_CODE']]); } $EXAM_REPORTS_INSERT[] = $v; } $this->patientModel->saveExamReport($EXAM_REPORTS_INSERT); } public function makeUrl($base64_string) { if(empty($base64_string)) { return ''; } // 将Base64字符串分割成数据和文件类型 list($type, $data) = explode(';', $base64_string); list(,$hz) = explode('/',$type); list(, $data) = explode(',', $data); // 将Base64解码成二进制数据 $decodedData = base64_decode($data); $filePath = $_SERVER['DOCUMENT_ROOT'].'/report/'.time().rand(0,9999).'.'.$hz; // 本地文件路径 $savePath = $_SERVER['HTTP_HOST'].'/report/'.time().rand(0,9999).'.'.$hz; // 本地文件路径 // 将数据写入到文件 file_put_contents($filePath, $decodedData); return $savePath; } /* * 删除检验数据 */ public function delLabReport($params,$orgCode) { $INSPECT_REPORT = $this->checkDelLibReport($params,$orgCode); $this->doneDelLibReport($INSPECT_REPORT); } /* * 删除检查数据 */ public function delExamReport($params,$orgCode) { $EXAM_REPORT = $this->checkDelExamReport($params,$orgCode); $this->doneDelExamReport($EXAM_REPORT); } public function checkDelLibReport($params,$orgCode) { $REPORTID = $params['REPORTID']; $ID_CARDNUM = $params['ID_CARDNUM']; return $this->getINSPECT_REPORT($REPORTID, $ID_CARDNUM,$orgCode); } public function checkDelExamReport($params,$orgCode) { $REQUESTID = $params['REQUESTID']; $ID_CARDNUM = $params['ID_CARDNUM']; return $this->getEXAM_REPORT($REQUESTID, $ID_CARDNUM,$orgCode); } public function getEXAM_REPORT($REQUESTID, $ID_CARDNUM,$orgCode) { $mpiModel = new Mpi(); $mpiData = $mpiModel ->where('ID_CARDNUM', Gm::encrypt(Config::get('gm.key'), $ID_CARDNUM)) ->find(); $model = new ExamReport(); $report = $model ->where('REQUESTID', $REQUESTID) ->where('ORGCODE', $orgCode) ->where('MPI', $mpiData['MPI']) ->find(); if(!$report) { // todo 未找到检查报告异常抛出 } return $report; } public function getINSPECT_REPORT($REPORTID, $ID_CARDNUM,$orgCode) { $mpiModel = new Mpi(); $mpiData = $mpiModel ->where('ID_CARDNUM', Gm::encrypt(Config::get('gm.key'), $ID_CARDNUM)) ->find(); // todo 根据报告单号和身份证号获取检验报告标识 $model = new InspectReport(); $report = $model ->where('REPORTID', $REPORTID) ->where('ORGCODE', $orgCode) ->where('MPI', $mpiData['MPI']) ->find(); if(!$report) { // todo 未找到检验报告异常抛出 } return $report; } public function doneDelLibReport($INSPECT_REPORT) { Db::startTrans(); try { $newModel = new DelInspectReport(); $this->_delModelAndCreateNewModel($INSPECT_REPORT, $newModel); $this->doneDelLabData($INSPECT_REPORT['INSPECT_REPORT_CODE']); $this->doneDelBiInspectReport($INSPECT_REPORT['INSPECT_REPORT_CODE']); $this->doneDelMedicalInformation($INSPECT_REPORT['PATIENT_CODE']); $this->doneUpdateHrData($INSPECT_REPORT['PATIENT_CODE']); $this->doneUpdateCache($INSPECT_REPORT['PATIENT_CODE']); Db::commit(); } catch(Exception $e) { Db::rollback(); } } public function doneDelLabData($INSPECT_REPORT_CODE) { $model = new LabData(); $labs = $model->where('INSPECT_REPORT_CODE', $INSPECT_REPORT_CODE)->select(); foreach($labs as $lab) { $this->_delModelAndCreateNewModel($lab, new DelLabData()); } } public function doneUpdateHrData($PATIENT_CODE) { // TODO 更新互认相关数据 hospital_patient $this->saveUploadHospitalPatient($PATIENT_CODE); } public function doneUpdateCache($PATIENT_CODE) { // TODO 更新相关缓存数据 // 记录PATIENT_CODE删除时间和内容 } public function doneDelBiInspectReport($INSPECT_REPORT_CODE) { $model = new BiInspectReport(); $labs = $model->where('INSPECT_REPORT_CODE', $INSPECT_REPORT_CODE)->select(); foreach($labs as $lab) { $this->_delModelAndCreateNewModel($lab, new DelBiInspectReport()); } } public function doneDelExamReport($EXAM_REPORT) { Db::startTrans(); try { $newModel = new DelExamReport(); $this->_delModelAndCreateNewModel($EXAM_REPORT, $newModel); $this->doneDelMedicalInformation($EXAM_REPORT['PATIENT_CODE']); $this->doneUpdateHrData($EXAM_REPORT['PATIENT_CODE']); $this->doneUpdateCache($EXAM_REPORT['PATIENT_CODE']); Db::commit(); } catch(Exception $e) { Db::rollback(); } } public function _delModelAndCreateNewModel($dataModel, $newModel) { $id = $dataModel['ID']; $arr = $dataModel; $arr['del_time'] = time(); unset($arr['ID']); $newModel->save($dataModel); $dataModel->where('ID',$id)->delete(); } public function doneDelMedicalInformation($PATIENT_CODE) { $examModel = new ExamReport(); $res = $examModel->field('PATIENT_CODE')->where('PATIENT_CODE', $PATIENT_CODE)->find(); if($res) { return; } $inspectModel = new InspectReport(); $res = $inspectModel->field('PATIENT_CODE')->where('PATIENT_CODE', $PATIENT_CODE)->find(); if($res) { return; } $model = new MedicalInformation(); $newModel = new DelMedicalInformation(); $info = $model->where('PATIENT_CODE', $PATIENT_CODE)->find(); $this->_delModelAndCreateNewModel($info, $newModel); $this->doneDelPatient($PATIENT_CODE); } public function doneDelPatient($PATIENT_CODE) { $model = new Patient(); $newModel = new DelPatient(); $patient = $model->where('PATIENT_CODE', $PATIENT_CODE)->find(); $this->_delModelAndCreateNewModel($patient, $newModel); } /* * 上传检验数据 */ public function postLabReport($params): string { // try{ $check = $this->checkPostLisReport($params); $this->handlePatient($check['PATIENT']); $MEDICAL_INFORMATION = $check['MEDICAL_INFORMATION']; $information = $this->patientModel->getMedical($MEDICAL_INFORMATION['PATIENT_CODE'],[],'*'); if(!empty($information)) { $this->patientModel->saveRepeatInformation($information); $this->patientModel->delOldInformation(['PATIENT_CODE'=>$information['PATIENT_CODE']]); } $MEDICAL_INFORMATION_INSERT = $MEDICAL_INFORMATION; $MEDICAL_INFORMATION_INSERT['create_time'] = $check['INSPECT_REPORTS'][0]['create_time']; $this->patientModel->saveMedical($MEDICAL_INFORMATION_INSERT); $INSPECT_REPORTS = $check['INSPECT_REPORTS']; $INSPECT_REPORTS_INSERT = []; $newArr = []; $hrNullData = []; $INSPECT_REPORT_CODE = []; $bi = []; foreach ($INSPECT_REPORTS as $k=>$v) { $INSPECT_REPORT_CODE[] = $v['INSPECT_REPORT_CODE']; $inspect = $this->patientModel->getInspectData(['INSPECT_REPORT_CODE'=>$v['INSPECT_REPORT_CODE']],'*'); if(!empty($inspect)) { //存在 删除并存储历史 $this->patientModel->saveRepeatInspect($inspect); $this->patientModel->delOldInspect(['INSPECT_REPORT_CODE'=>$v['INSPECT_REPORT_CODE']]); } if(!empty($v['LAB_HR_ITEMNAME_CODE'])) { $newArr[] = $v; $bi[] = $v['INSPECT_REPORT_CODE']; }else{ $hrNullData[$v['INSPECT_REPORT_CODE']] = $v; } $INSPECT_REPORTS_INSERT[] = $v; } if(!empty($INSPECT_REPORTS_INSERT)) { $this->patientModel->saveInspectReport($INSPECT_REPORTS_INSERT); } if(!empty($INSPECT_REPORT_CODE)) { $oldItems = $this->patientModel->getOldLab($INSPECT_REPORT_CODE); if(!empty($oldItems)) { $this->patientModel->delOldLab($INSPECT_REPORT_CODE); $delItems = []; foreach ($oldItems as $k=>$v) { unset($v['ID']); $delItems[] = $v; } if(!empty($delItems)) { $this->patientModel->saveRepeatLab($delItems); } } } $INSPECT_REPORT_ITEMS = $check['INSPECT_REPORT_ITEMS']; $INSPECT_REPORT_ITEMS_INSERT = []; foreach ($INSPECT_REPORT_ITEMS as $k=>$v) { if(isset($hrNullData[$v['INSPECT_REPORT_CODE']])) { // 存在互认项目编码为空的检验报告子项 $labChild = $hrNullData[$v['INSPECT_REPORT_CODE']]; $labChild['LAB_HR_ITEMNAME_CODE'] = $v['LAB_HR_ITEMDETAILNAME_CODE']; $labChild['LAB_HR_ITEMNAME'] = $v['LAB_HR_ITEMDETAILNAME']; $newArr[] = $labChild; $bi[] = $v['INSPECT_REPORT_CODE']; } $INSPECT_REPORT_ITEMS_INSERT[] = $v; } if(!empty($INSPECT_REPORT_ITEMS_INSERT)) { $this->patientModel->saveLabData($INSPECT_REPORT_ITEMS_INSERT); } if(!empty($newArr)) { $biInspect = $this->patientModel->getBiInspect($bi); foreach ($biInspect as $k=>$v) { unset($biInspect[$k]['ID']); } $this->patientModel->saveRepeatBiInspect($biInspect); $this->patientModel->delBiInspect($bi); $this->patientModel->saveBiInspect($newArr); } $this->saveUploadHospitalPatient($check['PATIENT']['PATIENT_CODE']); return 'success'; // }catch (\Exception $e) // { // return $e->getMessage(); // } } public function checkExam($data) { $info = $this->patientModel->getPatient(['PATIENT_CODE'=>$data['PATIENT_CODE']],'*'); return $info; } public function saveNormalPatient($params, $mpiKey, $patientCode, $mpi): void { $mpiData = $this->patientModel->getMpi($params['ID_CARDNUM']); if(!empty($mpiData)) { $this->saveMpi($mpi,$params['ID_CARDNUM'],$mpiKey); } $PData = $this->patientModel->getPatient(['PATIENT_CODE'=>$patientCode]); if(empty($PData)) { // 直接存储 患者信息 $this->savePatient($params['PATIENT'],$mpi,$mpiKey,$patientCode); }else{ // todo 存储到备用表里 // $patient = $this->makePatient($params,$mpiKey,$patientCode); } $MData = $this->patientModel->getMedical($patientCode); if(empty($MData)) { // 直接存储 就诊信息 $this->saveMedical($params['MEDICAL_INFORMATION'],$mpiKey,$patientCode); }else{ // todo 存储到备用表里 } } /** * @param $PATIENT1 * @return void */ public function handlePatient($PATIENT1) { $PATIENT = $PATIENT1; $data = $this->checkExam($PATIENT); if ($data) { //存在 删除 并存储历史记录 $this->patientModel->saveRepeatPatient($data); $this->patientModel->delOldPatient(['PATIENT_CODE'=>$data['PATIENT_CODE']]); } $this->patientModel->save($PATIENT); } public function getIdCard($mpi) { $mpiData = $this->patientModel->getMpiData(['MPI'=>$mpi]); return $mpiData['ID_CARDNUM']; } }