diff --git a/data-config/assort-config.json b/data-config/assort-config.json new file mode 100644 index 0000000..46ad171 --- /dev/null +++ b/data-config/assort-config.json @@ -0,0 +1,144 @@ +[ + { + "emrTypeCode": "defaut", + "assortId": "" + }, + {"emrTypeCode": "Anaes_Agree_Record","assortId": "C2C40DB213E76592B696244F423152C4"}, + {"emrTypeCode": "Blood_Transfusion_Record","assortId": "B2835AB12202CDF825860A305E4D7AE1"}, + {"emrTypeCode": "Ops_Agree_Record","assortId": "3DC3F75E2666D0730BCA08A617C20704"}, + {"emrTypeCode": "Special_Check_Record","assortId": "8B90E00DBF4B25BF2D0083F2E786BA76"}, + {"emrTypeCode": "病理","assortId": "04B1A1E0DDE32223FF8C65487177C7C2"}, + {"emrTypeCode": "FirstPage","assortId": "AC90CCD4ACC54AD3AEC2BC09B1407C29"}, + {"emrTypeCode": "First_Page","assortId": "AC90CCD4ACC54AD3AEC2BC09B1407C29"}, + {"emrTypeCode": "First_Page_Case","assortId": "AC90CCD4ACC54AD3AEC2BC09B1407C29"}, + {"emrTypeCode": "PMR.BASY","assortId": "AC90CCD4ACC54AD3AEC2BC09B1407C29"}, + {"emrTypeCode": "Scan.BASY","assortId": "AC90CCD4ACC54AD3AEC2BC09B1407C29"}, + {"emrTypeCode": "OperationRecord","assortId": "1D0FCD8E4162D51E2655067915B68E96"}, + {"emrTypeCode": "Operation_Record","assortId": "1D0FCD8E4162D51E2655067915B68E96"}, + {"emrTypeCode": "Operation_Record","assortId": "1D0FCD8E4162D51E2655067915B68E96"}, + {"emrTypeCode": "OpsSafeCheck","assortId": "1429AFC1870B60E563903022D733D443"}, + {"emrTypeCode": "Scan.SSXGJL","assortId": "1D0FCD8E4162D51E2655067915B68E96"}, + {"emrTypeCode": "ConsultationRecord","assortId": "075086B52919A0DBC0734EE3FF8A8A59"}, + {"emrTypeCode": "Consultation_Order_Record","assortId": "075086B52919A0DBC0734EE3FF8A8A59"}, + {"emrTypeCode": "Consultation_Record","assortId": "075086B52919A0DBC0734EE3FF8A8A59"}, + {"emrTypeCode": "Consultation_Record","assortId": "075086B52919A0DBC0734EE3FF8A8A59"}, + {"emrTypeCode": "24In_Dead_Record","assortId": "DB65417382ED778C2EA14470FBE5466B"}, + {"emrTypeCode": "24In_Record","assortId": "91AEF4D8FAD38646A223016B99349D3F"}, + {"emrTypeCode": "InRecord","assortId": "5A74EEAC6970FB03397E6B80E4DC7219"}, + {"emrTypeCode": "In_Record","assortId": "5A74EEAC6970FB03397E6B80E4DC7219"}, + {"emrTypeCode": "In_Record","assortId": "5A74EEAC6970FB03397E6B80E4DC7219"}, + {"emrTypeCode": "PMR.Evaluation","assortId": "EE3C4A9B7BBAA56DAC0ED65FB09C32FE"}, + {"emrTypeCode": "GM","assortId": "EE3C4A9B7BBAA56DAC0ED65FB09C32FE"}, + {"emrTypeCode": "PMR.BLOOD_TRANS","assortId": "EE3C4A9B7BBAA56DAC0ED65FB09C32FE"}, + {"emrTypeCode": "PMR.LIS","assortId": "EE3C4A9B7BBAA56DAC0ED65FB09C32FE"}, + {"emrTypeCode": "RT","assortId": "EE3C4A9B7BBAA56DAC0ED65FB09C32FE"}, + {"emrTypeCode": "Scan.JYBG","assortId": "EE3C4A9B7BBAA56DAC0ED65FB09C32FE"}, + {"emrTypeCode": "Scan.YWJYBG","assortId": "EE3C4A9B7BBAA56DAC0ED65FB09C32FE"}, + {"emrTypeCode": "Scan.MZBL","assortId": "C026897BA4069ACEDFF061E4CF7CFEC6"}, + {"emrTypeCode": "2022022515","assortId": "C026897BA4069ACEDFF061E4CF7CFEC6"}, + {"emrTypeCode": "2022062508","assortId": "07BACE747E6C440B9FCC36A6F529C0B3"}, + {"emrTypeCode": "2022062510","assortId": "07BACE747E6C440B9FCC36A6F529C0B3"}, + {"emrTypeCode": "AnaesthesiaRecord","assortId": "FF246633CB15136448471EDD30FEB6E1"}, + {"emrTypeCode": "OpsAfterVisitationRecord","assortId": "520832CB908E21E570D7C7A3F01EF384"}, + {"emrTypeCode": "OpsAnaesthesiaRecord","assortId": "1D0FCD8E4162D51E2655067915B68E96"}, + {"emrTypeCode": "OpsVisitationRecord","assortId": "8B0D105A3BB9DC994CEAC80D80EEA540"}, + {"emrTypeCode": "PMR.AIS","assortId": "FF246633CB15136448471EDD30FEB6E1"}, + {"emrTypeCode": "Scan.MZXGJL","assortId": "FF246633CB15136448471EDD30FEB6E1"}, + {"emrTypeCode": "anes_informed_consent","assortId": "C2C40DB213E76592B696244F423152C4"}, + {"emrTypeCode": "anes_record","assortId": "FF246633CB15136448471EDD30FEB6E1"}, + {"emrTypeCode": "anes_summary","assortId": "FF246633CB15136448471EDD30FEB6E1"}, + {"emrTypeCode": "equipment_inventory1","assortId": "07BACE747E6C440B9FCC36A6F529C0B3"}, + {"emrTypeCode": "postoperative_anes_visit","assortId": "8B0D105A3BB9DC994CEAC80D80EEA540"}, + {"emrTypeCode": "pre_anes_visit","assortId": "8B0D105A3BB9DC994CEAC80D80EEA540"}, + {"emrTypeCode": "pre_nurse_visit","assortId": "FF246633CB15136448471EDD30FEB6E1"}, + {"emrTypeCode": "shoushufusu","assortId": "FF246633CB15136448471EDD30FEB6E1"}, + {"emrTypeCode": "shoushujiaojiedan","assortId": "FF246633CB15136448471EDD30FEB6E1"}, + {"emrTypeCode": "PMR.HIS","assortId": "E348EE6045DA800A9DA3E106986A16BC"}, + {"emrTypeCode": "Scan.YZD","assortId": "E348EE6045DA800A9DA3E106986A16BC"}, + {"emrTypeCode": "Dead_Record","assortId": "DB65417382ED778C2EA14470FBE5466B"}, + {"emrTypeCode": "OutRecord","assortId": "91AEF4D8FAD38646A223016B99349D3F"}, + {"emrTypeCode": "Out_Record","assortId": "91AEF4D8FAD38646A223016B99349D3F"}, + {"emrTypeCode": "Out_Record","assortId": "91AEF4D8FAD38646A223016B99349D3F"}, + {"emrTypeCode": "CT","assortId": "97D6420FF328A5CB488DE9E4FBCB1CFF"}, + {"emrTypeCode": "DR","assortId": "97D6420FF328A5CB488DE9E4FBCB1CFF"}, + {"emrTypeCode": "ECG","assortId": "97D6420FF328A5CB488DE9E4FBCB1CFF"}, + {"emrTypeCode": "ECG_1","assortId": "97D6420FF328A5CB488DE9E4FBCB1CFF"}, + {"emrTypeCode": "ECG_401","assortId": "97D6420FF328A5CB488DE9E4FBCB1CFF"}, + {"emrTypeCode": "ECG_402","assortId": "97D6420FF328A5CB488DE9E4FBCB1CFF"}, + {"emrTypeCode": "ECG_403","assortId": "97D6420FF328A5CB488DE9E4FBCB1CFF"}, + {"emrTypeCode": "ECG_404","assortId": "97D6420FF328A5CB488DE9E4FBCB1CFF"}, + {"emrTypeCode": "ECG_405","assortId": "97D6420FF328A5CB488DE9E4FBCB1CFF"}, + {"emrTypeCode": "ECG_406","assortId": "97D6420FF328A5CB488DE9E4FBCB1CFF"}, + {"emrTypeCode": "ECG_407","assortId": "97D6420FF328A5CB488DE9E4FBCB1CFF"}, + {"emrTypeCode": "ECG_408","assortId": "97D6420FF328A5CB488DE9E4FBCB1CFF"}, + {"emrTypeCode": "ECG_409","assortId": "97D6420FF328A5CB488DE9E4FBCB1CFF"}, + {"emrTypeCode": "ECG_410","assortId": "97D6420FF328A5CB488DE9E4FBCB1CFF"}, + {"emrTypeCode": "ECG_411","assortId": "97D6420FF328A5CB488DE9E4FBCB1CFF"}, + {"emrTypeCode": "ECG_412","assortId": "97D6420FF328A5CB488DE9E4FBCB1CFF"}, + {"emrTypeCode": "ECG_413","assortId": "97D6420FF328A5CB488DE9E4FBCB1CFF"}, + {"emrTypeCode": "ECG_414","assortId": "97D6420FF328A5CB488DE9E4FBCB1CFF"}, + {"emrTypeCode": "ECG_415","assortId": "97D6420FF328A5CB488DE9E4FBCB1CFF"}, + {"emrTypeCode": "ECG_416","assortId": "97D6420FF328A5CB488DE9E4FBCB1CFF"}, + {"emrTypeCode": "ECG_417","assortId": "97D6420FF328A5CB488DE9E4FBCB1CFF"}, + {"emrTypeCode": "ECG_418","assortId": "97D6420FF328A5CB488DE9E4FBCB1CFF"}, + {"emrTypeCode": "ECG_419","assortId": "97D6420FF328A5CB488DE9E4FBCB1CFF"}, + {"emrTypeCode": "ECG_420","assortId": "97D6420FF328A5CB488DE9E4FBCB1CFF"}, + {"emrTypeCode": "ECG_421","assortId": "97D6420FF328A5CB488DE9E4FBCB1CFF"}, + {"emrTypeCode": "EI","assortId": "97D6420FF328A5CB488DE9E4FBCB1CFF"}, + {"emrTypeCode": "EL","assortId": "97D6420FF328A5CB488DE9E4FBCB1CFF"}, + {"emrTypeCode": "ES","assortId": "97D6420FF328A5CB488DE9E4FBCB1CFF"}, + {"emrTypeCode": "MR","assortId": "97D6420FF328A5CB488DE9E4FBCB1CFF"}, + {"emrTypeCode": "Scan.JCBG","assortId": "97D6420FF328A5CB488DE9E4FBCB1CFF"}, + {"emrTypeCode": "Scan.YWJCBG","assortId": "97D6420FF328A5CB488DE9E4FBCB1CFF"}, + {"emrTypeCode": "US","assortId": "97D6420FF328A5CB488DE9E4FBCB1CFF"}, + {"emrTypeCode": "Path","assortId": "C026897BA4069ACEDFF061E4CF7CFEC6"}, + {"emrTypeCode": "Medical_Book","assortId": "C026897BA4069ACEDFF061E4CF7CFEC6"}, + {"emrTypeCode": "Medical_Document_Record","assortId": "C026897BA4069ACEDFF061E4CF7CFEC6"}, + {"emrTypeCode": "Medical_Document_Record","assortId": "C026897BA4069ACEDFF061E4CF7CFEC6"}, + {"emrTypeCode": "Medical_Insur_Document_Record","assortId": "C026897BA4069ACEDFF061E4CF7CFEC6"}, + {"emrTypeCode": "Medical_Rating_Scale","assortId": "C026897BA4069ACEDFF061E4CF7CFEC6"}, + {"emrTypeCode": "Nurse_Document_Record","assortId": "C026897BA4069ACEDFF061E4CF7CFEC6"}, + {"emrTypeCode": "Public_Record","assortId": "C026897BA4069ACEDFF061E4CF7CFEC6"}, + {"emrTypeCode": "Public_book","assortId": "C026897BA4069ACEDFF061E4CF7CFEC6"}, + {"emrTypeCode": "Scan.GGLWS","assortId": "C026897BA4069ACEDFF061E4CF7CFEC6"}, + {"emrTypeCode": "PMR.IN_NOTICE","assortId": "C026897BA4069ACEDFF061E4CF7CFEC6"}, + {"emrTypeCode": "Scan.RYTZD","assortId": "C026897BA4069ACEDFF061E4CF7CFEC6"}, + {"emrTypeCode": "TemperatureRecord","assortId": "2BCC34D0449C2FD2972EEB5F4CAD7E1D"}, + {"emrTypeCode": "Temperature_Record","assortId": "2BCC34D0449C2FD2972EEB5F4CAD7E1D"}, + {"emrTypeCode": "Temperature_Record","assortId": "2BCC34D0449C2FD2972EEB5F4CAD7E1D"}, + {"emrTypeCode": "HDS","assortId": "C026897BA4069ACEDFF061E4CF7CFEC6"}, + {"emrTypeCode": "Scan.Other","assortId": "C026897BA4069ACEDFF061E4CF7CFEC6"}, + {"emrTypeCode": "Scan.RYJBXX","assortId": "C026897BA4069ACEDFF061E4CF7CFEC6"}, + {"emrTypeCode": "InOtherRecord","assortId": "C026897BA4069ACEDFF061E4CF7CFEC6"}, + {"emrTypeCode": "In_Other_Record","assortId": "C026897BA4069ACEDFF061E4CF7CFEC6"}, + {"emrTypeCode": "In_Other_Record","assortId": "C026897BA4069ACEDFF061E4CF7CFEC6"}, + {"emrTypeCode": "Scan.HLJLD","assortId": "C026897BA4069ACEDFF061E4CF7CFEC6"}, + {"emrTypeCode": "Scan.ZRWDJ","assortId": "C026897BA4069ACEDFF061E4CF7CFEC6"}, + {"emrTypeCode": "In_Record_FC","assortId": "C026897BA4069ACEDFF061E4CF7CFEC6"}, + {"emrTypeCode": "NurseConsultationRecord","assortId": "C026897BA4069ACEDFF061E4CF7CFEC6"}, + {"emrTypeCode": "Nurse_Consultation_Record","assortId": "C026897BA4069ACEDFF061E4CF7CFEC6"}, + {"emrTypeCode": "Operation_Other_Report","assortId": "C026897BA4069ACEDFF061E4CF7CFEC6"}, + {"emrTypeCode": "OutAgreeRecord","assortId": "C026897BA4069ACEDFF061E4CF7CFEC6"}, + {"emrTypeCode": "OutDiseaseRecord","assortId": "C026897BA4069ACEDFF061E4CF7CFEC6"}, + {"emrTypeCode": "OutEmergencyRecord","assortId": "C026897BA4069ACEDFF061E4CF7CFEC6"}, + {"emrTypeCode": "OutFirstPage","assortId": "C026897BA4069ACEDFF061E4CF7CFEC6"}, + {"emrTypeCode": "OutMedicalRecords","assortId": "C026897BA4069ACEDFF061E4CF7CFEC6"}, + {"emrTypeCode": "OutNurseBook","assortId": "C026897BA4069ACEDFF061E4CF7CFEC6"}, + {"emrTypeCode": "OutNurseRecord","assortId": "C026897BA4069ACEDFF061E4CF7CFEC6"}, + {"emrTypeCode": "OutRecordPortal","assortId": "C026897BA4069ACEDFF061E4CF7CFEC6"}, + {"emrTypeCode": "OutTemperatureRecord","assortId": "C026897BA4069ACEDFF061E4CF7CFEC6"}, + {"emrTypeCode": "Out_Agree_Record","assortId": "C026897BA4069ACEDFF061E4CF7CFEC6"}, + {"emrTypeCode": "Out_Emergency_Record","assortId": "C026897BA4069ACEDFF061E4CF7CFEC6"}, + {"emrTypeCode": "Out_First_Page","assortId": "C026897BA4069ACEDFF061E4CF7CFEC6"}, + {"emrTypeCode": "Out_Medical_Records","assortId": "C026897BA4069ACEDFF061E4CF7CFEC6"}, + {"emrTypeCode": "Out_Nurse_Measure","assortId": "C026897BA4069ACEDFF061E4CF7CFEC6"}, + {"emrTypeCode": "Out_SecondNew","assortId": "C026897BA4069ACEDFF061E4CF7CFEC6"}, + {"emrTypeCode": "Out_Second_Record","assortId": "C026897BA4069ACEDFF061E4CF7CFEC6"}, + {"emrTypeCode": "PMR.Paper","assortId": "C026897BA4069ACEDFF061E4CF7CFEC6"}, + {"emrTypeCode": "SecondNew","assortId": "C026897BA4069ACEDFF061E4CF7CFEC6"}, + {"emrTypeCode": "SecondRecord","assortId": "C026897BA4069ACEDFF061E4CF7CFEC6"} +] + + + + diff --git a/data-config/query-config.json b/data-config/query-config.json new file mode 100644 index 0000000..3ed7cbf --- /dev/null +++ b/data-config/query-config.json @@ -0,0 +1,18 @@ +{ + "disDates": "2023-01-01 00:00:00", + "disDatee": "2023-12-31 11:59:59", + "downPath": "", + "url": "http://192.168.12.121:3000/ws/service?wsdl", + "targetNamespace": "http://ws.sie.com", + "method": "service", + "params": [ + { + "name": "param", + "value": "flow=02-PAPERLESS-PMRS,app=JS_MR_DOC" + }, + { + "name": "data", + "value": "\n\t\n\t\t\n\t\t\t\n\t\t\t\t%s\n\t\t\t\n\t\t\n\t\n" + } + ] +} diff --git a/pom.xml b/pom.xml index 464fd84..7993133 100644 --- a/pom.xml +++ b/pom.xml @@ -182,6 +182,11 @@ 4.0 + + commons-net + commons-net + 3.10.0 + @@ -350,4 +355,4 @@ - \ No newline at end of file + diff --git a/src/main/java/com/docus/server/message/busservice/ZxjhBusinessService.java b/src/main/java/com/docus/server/message/busservice/ZxjhBusinessService.java new file mode 100644 index 0000000..5351ba1 --- /dev/null +++ b/src/main/java/com/docus/server/message/busservice/ZxjhBusinessService.java @@ -0,0 +1,13 @@ +package com.docus.server.message.busservice; + +import com.docus.server.message.dto.Message; +import com.docus.server.message.dto.MessageResponse; + + +public interface ZxjhBusinessService { + + void wsRecordDown(); + + void tScanAssortSave(String patientId); + +} diff --git a/src/main/java/com/docus/server/message/busservice/impl/ZxjhBusinessServiceImpl.java b/src/main/java/com/docus/server/message/busservice/impl/ZxjhBusinessServiceImpl.java new file mode 100644 index 0000000..f1fcffa --- /dev/null +++ b/src/main/java/com/docus/server/message/busservice/impl/ZxjhBusinessServiceImpl.java @@ -0,0 +1,382 @@ +package com.docus.server.message.busservice.impl; + +import com.alibaba.fastjson.JSONObject; +import com.docus.core.util.DateUtil; +import com.docus.core.util.Func; +import com.docus.infrastructure.core.exception.BaseException; +import com.docus.infrastructure.redis.service.IdService; +import com.docus.server.message.busservice.ZxjhBusinessService; +import com.docus.server.message.config.AssortConfig; +import com.docus.server.message.config.QueryConfig; +import com.docus.server.message.dto.*; +import com.docus.server.message.entity.TBasicExcel; +import com.docus.server.message.entity.TScanAssort; +import com.docus.server.message.mapper.ZxjhMapper; +import com.docus.server.message.util.XmlUtil; +import com.itextpdf.text.pdf.PdfReader; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.net.ftp.FTPClient; +import org.apache.cxf.endpoint.Client; +import org.apache.cxf.jaxws.endpoint.dynamic.JaxWsDynamicClientFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.w3c.dom.Node; +import org.w3c.dom.NodeList; + +import javax.xml.namespace.QName; +import java.io.File; +import java.io.FileOutputStream; +import java.io.OutputStream; +import java.net.*; +import java.util.*; + +/** + * @BelongsProject: docus-unified-message + * @BelongsPackage: com.docus.server.message.busservice.impl + * @Author: chierhao + * @CreateTime: 2024-03-20 08:57 + * @Description: TODO + * @Version: 1.0 + */ +@Slf4j +@Service +public class ZxjhBusinessServiceImpl implements ZxjhBusinessService { + + @Autowired + private ZxjhMapper zxjhMapper; + + @Autowired + private IdService idService; + + @Override + public void wsRecordDown() { + QueryConfig.Config config = QueryConfig.getConfig(); + if (config == null) { + throw new BaseException("未配置查询配置"); + } + List assortConfig = AssortConfig.getConfig(); + if (assortConfig == null) { + throw new BaseException("未配置分段配置"); + } + Date disDates = DateUtil.parse(config.getDisDates(), "yyyy-MM-dd HH:mm:ss"); + Date disDatee = DateUtil.parse(config.getDisDatee(), "yyyy-MM-dd HH:mm:ss"); + + List basicDatas = zxjhMapper.getBasicData("5", disDates, disDatee); + log.info("查询基础数据条数:{}",basicDatas.size()); + if(basicDatas.size()==0){ + return; + } + List paramsConfig = config.getParams(); + + for (TBasicExcel basicData : basicDatas) { + String patientId = basicData.getPatientId(); + String jzh = basicData.getJzh(); + log.info("同步病案主键:{},jzh:{}开始",patientId,jzh); + + try { + List params = new ArrayList<>(); + for (JSONObject jsonObject : paramsConfig) { + if(jsonObject.getString("name").equals("data")){ + JSONObject param=new JSONObject(); + param.put("name",jsonObject.getString("name")); + String value = jsonObject.getString("value"); + String format = String.format(value, jzh); + param.put("value",format); + params.add(param); + continue; + } + params.add(jsonObject); + } + String result = requestFunctionWebServiceCXF(config.getUrl(),config.getTargetNamespace(),config.getMethod(),params); + if(Func.isEmpty(result)){ + throw new BaseException("result为空"); + } + List fileDtos = getFileDtos(result); + log.info("同步病案主键:{},jzh:{},文件数量:{}",patientId,jzh,fileDtos.size()); + if(Func.isEmpty(fileDtos)){ + return; + } + String downPath=config.getDownPath()+File.separator+patientId; + List tScanAssorts=new ArrayList(); + for (FileDto fileDto : fileDtos) { + TScanAssort tScanAssort=new TScanAssort(); + tScanAssort.setId(idService.getDateSeq()); + tScanAssort.setImagePath(downPath); + tScanAssort.setFileStorageType(1); + tScanAssort.setSource("-5"); + tScanAssort.setPatientId(patientId); + tScanAssort.setFileTitle(fileDto.getPMR_NAME()); + tScanAssort.setAssortId(getAssortId(fileDto.getEMR_TYPE_CODE(),assortConfig)); + tScanAssort.setCreateTime(new Date()); + downFile(tScanAssort,fileDto.getPMR_URL(),downPath); + tScanAssorts.add(tScanAssort); + } + zxjhMapper.delete(patientId); + zxjhMapper.saveAssort(tScanAssorts); + log.info("同步病案主键:{},jzh:{}结束",patientId,jzh); + }catch (Exception e) { + log.error(e.getMessage(), e); + zxjhMapper.saveLog(patientId,e.getMessage()); + } + } + } + + @Override + public void tScanAssortSave(String patientId) { + String jzh = zxjhMapper.getJzh(patientId); + if(Func.isEmpty(jzh)){ + throw new BaseException("jzh为空,或者病案不存在"); + } + QueryConfig.Config config = QueryConfig.getConfig(); + if (config == null) { + throw new BaseException("未配置查询配置"); + } + List assortConfig = AssortConfig.getConfig(); + if (assortConfig == null) { + throw new BaseException("未配置分段配置"); + } + List paramsConfig = config.getParams(); + log.info("同步病案主键:{},jzh:{}开始",patientId,jzh); + try { + List params = new ArrayList<>(); + for (JSONObject jsonObject : paramsConfig) { + if(jsonObject.getString("name").equals("data")){ + JSONObject param=new JSONObject(); + param.put("name",jsonObject.getString("name")); + String value = jsonObject.getString("value"); + String format = String.format(value, jzh); + param.put("value",format); + params.add(param); + continue; + } + params.add(jsonObject); + } + String result = requestFunctionWebServiceCXF(config.getUrl(),config.getTargetNamespace(),config.getMethod(),params); + if(Func.isEmpty(result)){ + throw new BaseException("result为空"); + } + List fileDtos = getFileDtos(result); + log.info("同步病案主键:{},jzh:{},文件数量:{}",patientId,jzh,fileDtos.size()); + if(Func.isEmpty(fileDtos)){ + return; + } + String downPath=config.getDownPath()+File.separator+patientId; + List tScanAssorts=new ArrayList(); + for (FileDto fileDto : fileDtos) { + TScanAssort tScanAssort=new TScanAssort(); + tScanAssort.setId(idService.getDateSeq()); + tScanAssort.setImagePath(downPath); + tScanAssort.setFileStorageType(1); + tScanAssort.setSource("-5"); + tScanAssort.setPatientId(patientId); + tScanAssort.setFileTitle(fileDto.getPMR_NAME()); + tScanAssort.setAssortId(getAssortId(fileDto.getEMR_TYPE_CODE(),assortConfig)); + tScanAssort.setCreateTime(new Date()); + downFile(tScanAssort,fileDto.getPMR_URL(),downPath); + tScanAssorts.add(tScanAssort); + } + zxjhMapper.delete(patientId); + zxjhMapper.saveAssort(tScanAssorts); + log.info("同步病案主键:{},jzh:{}结束",patientId,jzh); + }catch (Exception e) { + log.error(e.getMessage(), e); + zxjhMapper.saveLog(patientId,e.getMessage()); + } + } + + + + public String getAssortId(String EMR_TYPE_CODE,List assortConfig){ + String assortId=""; + String defaut=""; + for (AssortConfig.Config config : assortConfig) { + if(EMR_TYPE_CODE.equals(config.getEmrTypeCode())){ + assortId=config.getAssortId(); + } + if("defaut".equals(config.getEmrTypeCode())){ + defaut=config.getAssortId(); + } + } + if(assortId.equals("")){ + assortId=defaut; + } + return assortId; + } + + public String requestFunctionWebServiceCXF(String url, String namespace, String method, List params) throws Exception { + String result; + //创建动态客户端工厂 创建客户端 + JaxWsDynamicClientFactory dcf = JaxWsDynamicClientFactory.newInstance(); + Client client = dcf.createClient(url); + //命名空间和方法 + QName name = new QName(namespace, method); + // 定义参数 + List paramList=new ArrayList(); + for (JSONObject param:params){ + QName paramName = new QName(namespace, param.getString("name")); + paramList.add(paramName); + paramList.add(param.getString("value")); + } + // 设置参数值 + Object[] paramArray = paramList.toArray(); + Object[] objects = client.invoke(name, paramArray); + result = objects[0].toString(); + return result; + } + + public List getFileDtos(String str) { + XmlUtil xml= XmlUtil.of(str); + //请求结果状态 + String status="0"; + Node statusNode = xml.getNode("/MESSAGE/HEADER/STATUS"); + if(Func.isNotEmpty(statusNode)){ + status=statusNode.getTextContent(); + } + if(status.equals("0")){ + throw new BaseException(str); + } + List list=new ArrayList(); + NodeList rows= xml.getNodeList("/MESSAGE/BODY/ROWS/ROW"); + for (int i = 1; i <= rows.getLength(); i++) { + Node PMR_ID_NODE=xml.getNode("/MESSAGE/BODY/ROWS/ROW["+i+"]/PMR_ID"); + String PMR_ID=null; + if(Func.isNotEmpty(PMR_ID_NODE)){ + PMR_ID=PMR_ID_NODE.getTextContent(); + } + Node PMR_NAME_NODE=xml.getNode("/MESSAGE/BODY/ROWS/ROW["+i+"]/PMR_NAME"); + String PMR_NAME=null; + if(Func.isNotEmpty(PMR_NAME_NODE)){ + PMR_NAME=PMR_NAME_NODE.getTextContent(); + } + Node PMR_NAME_NO_NODE=xml.getNode("/MESSAGE/BODY/ROWS/ROW["+i+"]/PMR_NAME_NO"); + String PMR_NAME_NO=null; + if(Func.isNotEmpty(PMR_NAME_NO_NODE)){ + PMR_NAME_NO =PMR_NAME_NO_NODE.getTextContent(); + } + Node PMR_URL_NODE=xml.getNode("/MESSAGE/BODY/ROWS/ROW["+i+"]/PMR_URL"); + String PMR_URL=null; + if(Func.isNotEmpty(PMR_URL_NODE)){ + PMR_URL=PMR_URL_NODE.getTextContent(); + } + Node RCD_TYPE_CODE_NODE=xml.getNode("/MESSAGE/BODY/ROWS/ROW["+i+"]/RCD_TYPE_CODE"); + String RCD_TYPE_CODE=null; + if(Func.isNotEmpty(RCD_TYPE_CODE_NODE)){ + RCD_TYPE_CODE =RCD_TYPE_CODE_NODE.getTextContent(); + } + Node RCD_TYPE_NAME_NODE=xml.getNode("/MESSAGE/BODY/ROWS/ROW["+i+"]/RCD_TYPE_NAME"); + String RCD_TYPE_NAME=null; + if(Func.isNotEmpty(RCD_TYPE_NAME_NODE)){ + RCD_TYPE_NAME =RCD_TYPE_NAME_NODE.getTextContent(); + } + Node EMR_TYPE_CODE_NODE=xml.getNode("/MESSAGE/BODY/ROWS/ROW["+i+"]/EMR_TYPE_CODE"); + String EMR_TYPE_CODE=null; + if(Func.isNotEmpty(EMR_TYPE_CODE_NODE)){ + EMR_TYPE_CODE =EMR_TYPE_CODE_NODE.getTextContent(); + } + Node EMR_TYPE_NAME_NODE=xml.getNode("/MESSAGE/BODY/ROWS/ROW["+i+"]/EMR_TYPE_NAME"); + String EMR_TYPE_NAME=null; + if(Func.isNotEmpty(EMR_TYPE_NAME_NODE)){ + EMR_TYPE_NAME =EMR_TYPE_NAME_NODE.getTextContent(); + } + if(Func.isEmpty(PMR_URL)){ + throw new BaseException("第"+i+"条文件数据文件地址为空"); + } + FileDto dto= new FileDto(); + dto.setPMR_ID(PMR_ID); + dto.setPMR_NAME(PMR_NAME); + dto.setPMR_NAME_NO(PMR_NAME_NO); + dto.setPMR_URL(PMR_URL); + dto.setRCD_TYPE_CODE(RCD_TYPE_CODE); + dto.setRCD_TYPE_NAME(RCD_TYPE_NAME); + dto.setEMR_TYPE_CODE(EMR_TYPE_CODE); + dto.setEMR_TYPE_NAME(EMR_TYPE_NAME); + list.add(dto); + } + return list; + } + + public void downFile(TScanAssort tScanAssort,String sourcePath,String downPath) throws Exception{ + //文件地址形似ftp://AdminPLAT:Plat.2023@192.168.12.90:21/PaperlessData/2024/03/05/Emr/b1162dd9-c47a-4353-8572-37667f6114bc.pdf + //获取文件后最 + String end = sourcePath.substring(sourcePath.lastIndexOf(".")); + //本地文件名 + String fileName = UUID.randomUUID()+end; // 假设要下载的文件名为example.pdf + //文件本地存储路径 + String localFilePath = downPath + fileName; + + URI uri = new URI(sourcePath); + String host = uri.getHost(); + int port = uri.getPort() == -1 ? 21 : uri.getPort(); // 默认端口号为21 + String userInfo = uri.getRawUserInfo(); + String username = ""; + String password = ""; + if(userInfo != null) { + String[] userInfoArray = userInfo.split(":"); + if(userInfoArray.length >= 1) { + username = URLDecoder.decode(userInfoArray[0], "UTF-8"); + } + if(userInfoArray.length >= 2) { + password = URLDecoder.decode(userInfoArray[1], "UTF-8"); + } + } + String path = uri.getPath(); + FTPClient ftpClient = new FTPClient(); + try { + ftpClient.connect(host, port); + ftpClient.login(username, password); + ftpClient.enterLocalPassiveMode(); + + File localFile = new File(localFilePath); + OutputStream outputStream = new FileOutputStream(localFile); + + ftpClient.retrieveFile(path, outputStream); + + outputStream.close(); + + int numberOfPages=0; + // 判断文件类型并获取页数 + if (isPdf(localFilePath)) { + numberOfPages = getPdfPageCount(localFilePath); + tScanAssort.setFileSource(1); + tScanAssort.setFilePages(numberOfPages); + } else if (isImage(localFilePath)) { + numberOfPages=1; + tScanAssort.setFileSource(2); + tScanAssort.setFilePages(numberOfPages); + } + tScanAssort.setScanPage(fileName); + } catch (Exception ex) { + log.error(ex.getMessage(),ex); + throw new BaseException("下载文件出错"); + } finally { + if (ftpClient.isConnected()) { + try { + ftpClient.logout(); + ftpClient.disconnect(); + } catch (Exception ex) { + log.error(ex.getMessage(),ex); + } + } + } + } + + private static boolean isPdf(String filePath) { + // 检查文件扩展名是否为.pdf + return filePath.toLowerCase().endsWith(".pdf"); + } + + private static boolean isImage(String filePath) { + // 检查文件扩展名是否为常见的图片格式 + return filePath.toLowerCase().endsWith(".png") || filePath.toLowerCase().endsWith(".jpg") || filePath.toLowerCase().endsWith(".jpeg") || filePath.toLowerCase().endsWith(".bmp"); + } + + private static int getPdfPageCount(String filePath) { + try{ + PdfReader reader = new PdfReader(filePath); + return reader.getNumberOfPages(); + } catch (Exception e) { + e.printStackTrace(); + return 0; + } + } +} diff --git a/src/main/java/com/docus/server/message/config/AssortConfig.java b/src/main/java/com/docus/server/message/config/AssortConfig.java new file mode 100644 index 0000000..9e5e13a --- /dev/null +++ b/src/main/java/com/docus/server/message/config/AssortConfig.java @@ -0,0 +1,42 @@ +package com.docus.server.message.config; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import com.docus.core.util.Func; +import com.docus.server.message.util.TableJsonRead; +import lombok.Data; + +import java.util.List; + +/** + * @author wyb + */ +public class AssortConfig { + private final static String CONFIG_FILE_PATH = "data-config"; + private final static String CONFIG_FILE_NAME = "assort-config.json"; + + public static List getConfig() { + TableJsonRead jsonReader = new TableJsonRead(); + String configJson = jsonReader.ReadContent(CONFIG_FILE_PATH, CONFIG_FILE_NAME); + if (configJson == null) { + return null; + } + List configs = JSON.parseArray(configJson, Config.class); + if (Func.isEmpty(configs)) { + return null; + } + return configs; + } + + @Data + public static class Config { + private String emrTypeCode; + private String assortId; + } + + public static void main(String[] args) + { + List taskConfig = getConfig(); + System.out.println(taskConfig); + } +} diff --git a/src/main/java/com/docus/server/message/config/QueryConfig.java b/src/main/java/com/docus/server/message/config/QueryConfig.java new file mode 100644 index 0000000..9691c59 --- /dev/null +++ b/src/main/java/com/docus/server/message/config/QueryConfig.java @@ -0,0 +1,49 @@ +package com.docus.server.message.config; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import com.docus.core.util.Func; +import com.docus.server.message.util.TableJsonRead; +import lombok.Data; + +import java.util.List; +import java.util.Objects; + +/** + * @author wyb + */ +public class QueryConfig { + private final static String CONFIG_FILE_PATH = "data-config"; + private final static String CONFIG_FILE_NAME = "query-config.json"; + + public static Config getConfig() { + TableJsonRead jsonReader = new TableJsonRead(); + String configJson = jsonReader.ReadContent(CONFIG_FILE_PATH, CONFIG_FILE_NAME); + System.out.println(configJson); + if (configJson == null) { + return null; + } + Config config = JSON.parseObject(configJson, Config.class); + if (Func.isEmpty(config)) { + return null; + } + return config; + } + + @Data + public static class Config { + private String disDates; + private String disDatee; + private String downPath; + private String url; + private String targetNamespace; + private String method; + private List params; + } + + public static void main(String[] args) + { + Config taskConfig = getConfig(); + System.out.println(taskConfig); + } +} diff --git a/src/main/java/com/docus/server/message/controller/ZxjhHospitalController.java b/src/main/java/com/docus/server/message/controller/ZxjhHospitalController.java new file mode 100644 index 0000000..68f066a --- /dev/null +++ b/src/main/java/com/docus/server/message/controller/ZxjhHospitalController.java @@ -0,0 +1,38 @@ +package com.docus.server.message.controller; +import com.docus.server.message.busservice.ZxjhBusinessService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +/** + * @author WYBDEV + */ +@Api("中西结合医院") +@RestController +@Slf4j +@RequestMapping("/hospital/zxjh") +public class ZxjhHospitalController { + + @Autowired + private ZxjhBusinessService zxjhBusinessService; + + @GetMapping("/wsRecordDown/do") + @ApiOperation("中西结合同步下载文件数据") + public String wsRecordDown() { + log.info("中西结合同步下载文件数据开始"); + zxjhBusinessService.wsRecordDown(); + log.info("中西结合同步下载文件数据结束"); + return "操作成功"; + } + @GetMapping("/tScanAssortSave/do") + @ApiOperation("中西结合同步下载文件数据单个") + public String tScanAssortSave(@RequestParam(value = "pid",required = true) String pid) { + log.info("中西结合同步下载文件数据开始"); + zxjhBusinessService.tScanAssortSave(pid); + log.info("中西结合同步下载文件数据结束"); + return "操作成功"; + } + +} diff --git a/src/main/java/com/docus/server/message/dto/FileDto.java b/src/main/java/com/docus/server/message/dto/FileDto.java new file mode 100644 index 0000000..757595e --- /dev/null +++ b/src/main/java/com/docus/server/message/dto/FileDto.java @@ -0,0 +1,36 @@ +package com.docus.server.message.dto; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serializable; + +/** + *

+ * 病案基本信息 + *

+ * + * @author jiashi + * @since 2021-04-14 + */ +@Data +public class FileDto { + + private String PMR_ID; + + private String PMR_NAME; + + private String RCD_TYPE_CODE; + + private String RCD_TYPE_NAME; + + private String PMR_NAME_NO; + + private String PMR_URL; + + private String EMR_TYPE_CODE; + + private String EMR_TYPE_NAME; +} diff --git a/src/main/java/com/docus/server/message/entity/TBasicExcel.java b/src/main/java/com/docus/server/message/entity/TBasicExcel.java new file mode 100644 index 0000000..0d5afe9 --- /dev/null +++ b/src/main/java/com/docus/server/message/entity/TBasicExcel.java @@ -0,0 +1,43 @@ +package com.docus.server.message.entity; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serializable; +import java.util.Date; + +/** + *

+ * 病案基本信息 + *

+ * + * @author jiashi + * @since 2021-04-14 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@ApiModel(value = "TBasicExcel对象", description = "病案基本信息") +public class TBasicExcel implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "病案主键") + private String patientId; + + @ApiModelProperty(value = "住院次数") + private Integer admissTimes; + + @ApiModelProperty(value = "病案号") + private String inpatientNo; + + @ApiModelProperty(value = "jzh") + private String jzh; + + @ApiModelProperty(value = "身份证") + private String idCard; + +} diff --git a/src/main/java/com/docus/server/message/entity/TScanAssort.java b/src/main/java/com/docus/server/message/entity/TScanAssort.java new file mode 100644 index 0000000..70bf279 --- /dev/null +++ b/src/main/java/com/docus/server/message/entity/TScanAssort.java @@ -0,0 +1,62 @@ +package com.docus.server.message.entity; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serializable; +import java.util.Date; + +/** + *

+ * 病案文件信息表 + *

+ * + * @author 曾文和 + * @since 2021-04-23 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@ApiModel(value = "TScanAssort对象", description = "病案文件信息表 ") +public class TScanAssort implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "id") + @TableId(value = "id", type = IdType.ID_WORKER_STR) + private Long id; + + @ApiModelProperty(value = "病案id") + private String patientId; + + @ApiModelProperty(value = "病案分类") + private String assortId; + + @ApiModelProperty(value = "文件标题") + private String fileTitle; + + @ApiModelProperty(value = "文件目录 单纯文件夹路径,不带文件名") + private String imagePath; + + @ApiModelProperty(value = "文件名称") + private String scanPage; + + @ApiModelProperty(value = "文件来源 1:pdf;2:图片") + private Integer fileSource; + + @ApiModelProperty(value = "1:服务器本地;2:ftp服务器;3:共享文件夹") + private Integer fileStorageType; + + @ApiModelProperty(value = "上传时间") + private Date createTime; + + @ApiModelProperty(value = "页数") + private Integer filePages; + + @ApiModelProperty(value = "来源系统 1护理文书,2 电子病历,3 Pacs检查,4心电图,5手麻信息,6 Lis检验,7病案首页,8长临医嘱,100客户从平台上传") + private String source; + +} diff --git a/src/main/java/com/docus/server/message/mapper/ZxjhMapper.java b/src/main/java/com/docus/server/message/mapper/ZxjhMapper.java new file mode 100644 index 0000000..b557eae --- /dev/null +++ b/src/main/java/com/docus/server/message/mapper/ZxjhMapper.java @@ -0,0 +1,32 @@ +package com.docus.server.message.mapper; + +import com.baomidou.dynamic.datasource.annotation.DS; +import com.docus.server.message.entity.TBasicExcel; +import com.docus.server.message.entity.TScanAssort; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; + +import java.util.Date; +import java.util.List; +import java.util.Map; + +@Mapper +public interface ZxjhMapper { + + List getBasicData(@Param("fileSource") String fileSource, + @Param("disDates") Date disDates, + @Param("disDatee") Date disDatee); + + int saveLog(@Param("pid") String pid,@Param("msg") String msg); + + int delete(@Param("pid") String pid); + + int saveAssort(@Param("tScanAssorts")List tScanAssorts); + + String getJzh(@Param("pid") String pid); + +} + + + + diff --git a/src/main/resources/mapper/ZxjhMapper.xml b/src/main/resources/mapper/ZxjhMapper.xml new file mode 100644 index 0000000..6bf47ab --- /dev/null +++ b/src/main/resources/mapper/ZxjhMapper.xml @@ -0,0 +1,70 @@ + + + + + + + + INSERT INTO `docus_medicalrecord`.`t_basic_excel_log` (`patient_id`, `erro`) + VALUES (#{pid}, #{msg}); + + + + delete from `docus_archivefile`.t_scan_assort + where patient_id=#{pid} + + + + + INSERT INTO `docus_archivefile`.`t_scan_assort` ( + `id`, + `patient_id`, + `assort_id`, + `file_title`, + `image_path`, + `scan_page`, + `file_source`, + `file_storage_type`, + `create_time`, + `file_pages`, + `source` + ) VALUES ( + #{tScanAssort.id}, + #{tScanAssort.patientId}, + #{tScanAssort.assortId}, + #{tScanAssort.fileTitle}, + #{tScanAssort.imagePath}, + #{tScanAssort.scanPage}, + #{tScanAssort.fileSource}, + #{tScanAssort.fileStorageType}, + #{tScanAssort.createTime}, + #{tScanAssort.filePages}, + #{tScanAssort.source} + ); + + + + +