package com.docus.bgts.service; import com.alibaba.fastjson.JSON; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.docus.bgts.entity.*; import com.docus.bgts.enums.Codes; import com.docus.bgts.facade.IAfCollectTaskService; import com.docus.bgts.facade.IBgtsService; import com.docus.bgts.mapper.dbmysql.AfCollectAddMapper; import com.docus.bgts.mapper.dbmysql.MrReportErrorMapper; import com.docus.bgts.mapper.dboracle.VDocumentPdfMapper; import com.docus.bgts.utils.FileUtils; import com.docus.bgts.utils.HttpUtils; import com.docus.bgts.utils.JAXDynamicClientFactory; import com.docus.bgts.utils.XmlUtils; import org.apache.cxf.endpoint.Client; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.dom4j.Document; import org.dom4j.DocumentHelper; import org.dom4j.Element; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import java.io.ByteArrayInputStream; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.*; @Service public class BgtsServiceImpl implements IBgtsService { @Value("${ws.url}") private String wsUrl; @Value("${ws.localMethod}") private String wsLocalMethod; private Logger logger = LogManager.getLogger(BgtsServiceImpl.class); @Autowired IAfCollectTaskService afCollectTaskService; @Autowired VDocumentPdfMapper vDocumentPdfMapper; @Autowired MrReportErrorMapper mrReportErrorMapper; @Autowired AfCollectAddMapper afCollectAddMapper; @Override public void collect(String empId) throws Exception { //通过empId获取报告单号集合 List exams = getExamNo(empId); //获取插入表数据 ReportDownDto reportDownDto = getUrlCreateReportDto(exams, empId); //插入文件af_collect_task表数据 afCollectTaskService.insert(reportDownDto); //通过报告单号集合采集 collectExams(exams, empId,reportDownDto); } @Override public void collectByExamNo(String emamNo, String empId) throws Exception { String[] strings = new String[2]; //通过报告单号和系统id查询任务表 String collectorid = String.valueOf(FileUtils.getJsonByName("collectorid")); AfCollectTask afCollectTask = afCollectTaskService.getOne(new QueryWrapper().eq("C1", emamNo).eq("sysflag", collectorid)); strings[0] = emamNo; strings[1] = afCollectTask.getC2(); List exams = new ArrayList<>(); exams.add(strings); //获取插入表数据 ReportDownDto reportDownDto = getUrlCreateReportDto(exams, empId); collectExams(exams, empId,reportDownDto); } @Override public void collectAll() { logger.info("----------全量采集开始-----------"); //1.获取最早采集日期 SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); String startCollectTime = null; startCollectTime = String.valueOf(FileUtils.getJsonByName("startCollectTime")); logger.info("----------采集初始时间:" + startCollectTime + " -------------------"); //当前日期 Date date = new Date(); String dateStr = simpleDateFormat.format(date); collectByDates(startCollectTime, dateStr); //更新采集时间 addAfCollectAdd(date); logger.info("--------------全量采集结束------------------"); } /** * 根据时间到采集任务 * * @param startDate * @param endDate */ private void collectByDates(String startDate, String endDate) { //页码 int current; //每页10条数据 int size; List vDocumentPdfs; String collectorid = String.valueOf(FileUtils.getJsonByName("collectorid")); String assortid = String.valueOf(FileUtils.getJsonByName("assortid")); int filesource = Integer.parseInt(String.valueOf(FileUtils.getJsonByName("filesource"))); int filestoragetype = Integer.parseInt(String.valueOf(FileUtils.getJsonByName("filestoragetype"))); Map headMap = new HashMap<>(); headMap.put("Content-Type", "application/json"); //2.获取第一页10条数据开始采集 for (current = 1; ; current++) { size = 10 * current; vDocumentPdfs = vDocumentPdfMapper.listCollectPage(current, size, startDate, endDate); if (null == vDocumentPdfs || vDocumentPdfs.size() <= 0) { break; } vDocumentPdfs.stream().forEach(vDocumentPdf -> { ReportDownDto reportDownDto = new ReportDownDto(); reportDownDto.setCollectorid(collectorid); reportDownDto.setAssortid(assortid); ReportDownPatientDto reportDownPatientDto = new ReportDownPatientDto(); reportDownPatientDto.setJzh(vDocumentPdf.getPATIENT_ID()); reportDownDto.setPatient(reportDownPatientDto); List reportDownScanFileDtos = new ArrayList<>(); ReportDownScanFileDto reportDownScanFileDto = new ReportDownScanFileDto(); reportDownScanFileDto.setDownurl(vDocumentPdf.getWEB_ADDRESS()); reportDownScanFileDto.setFilestoragetype(filestoragetype); reportDownScanFileDto.setFilesource(filesource); reportDownScanFileDto.setFiletitle(vDocumentPdf.get文书名()); reportDownScanFileDto.setSerialnum(vDocumentPdf.get手术申请单号()); reportDownScanFileDtos.add(reportDownScanFileDto); reportDownDto.setScanfiles(reportDownScanFileDtos); afCollectTaskService.insert(reportDownDto); String post = null; try { post = HttpUtils.post(String.valueOf(FileUtils.getJsonByName(Codes.UPLOAD.getMessage())), headMap, JSON.parseObject(JSON.toJSONString(reportDownDto), Map.class)); Map resMap = JSON.parseObject(post, Map.class); if (String.valueOf(resMap.get("code")).equals("500")) { throw new RuntimeException(String.valueOf(resMap.get("msg"))); } } catch (Exception e) { addMrReportErrorLog(reportDownDto); e.printStackTrace(); } }); } } @Override public void timerCollect() { logger.info("------手麻采集器开始采集---------"); //1.获取上次采集时间 Date time = afCollectAddMapper.getTimeByAdd(); SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); String startDate = simpleDateFormat.format(time); //当前日期 Date date = new Date(); String endDate = simpleDateFormat.format(date); collectByDates(startDate, endDate); //更新采集时间 addAfCollectAdd(date); logger.info("--------手麻采集器结束采集------"); } /** * 更新采集时间 */ private void addAfCollectAdd(Date date) { String collectorid = String.valueOf(FileUtils.getJsonByName("collectorid")); AfCollectAdd afCollectAdd = new AfCollectAdd(); afCollectAdd.setBeginStageDate(date); afCollectAddMapper.update(afCollectAdd,new QueryWrapper().eq("classify",collectorid)); } /** * 全量采集错误记录日志 * * @param reportDownDto */ private void addMrReportErrorLog(ReportDownDto reportDownDto) { MrReportError mrReportError = new MrReportError(); mrReportError.setCreateTime(new Date()); String collectorid = String.valueOf(FileUtils.getJsonByName("collectorid")); mrReportError.setReportType(Integer.parseInt(collectorid)); mrReportError.setXml(JSON.toJSONString(reportDownDto)); mrReportErrorMapper.insert(mrReportError); } /** * 通过报告单号集合采集数据 * * @param exams * @param empId */ private void collectExams(List exams, String empId,ReportDownDto reportDownDto) throws Exception { // reportDownDto.setTaskid(id); //调用上传接口 Map headMap = new HashMap<>(); headMap.put("Content-Type", "application/json"); String post = HttpUtils.post(String.valueOf(FileUtils.getJsonByName(Codes.UPLOAD.getMessage())), headMap, JSON.parseObject(JSON.toJSONString(reportDownDto), Map.class)); Map resMap = JSON.parseObject(post, Map.class); System.out.println(resMap); if (String.valueOf(resMap.get("code")).equals("500")) { throw new RuntimeException(String.valueOf(resMap.get("msg"))); } } /** * 获取图片url,病返回插入表对象 * * @param exams * @param empId * @return */ private ReportDownDto getUrlCreateReportDto(List exams, String empId) throws Exception { ReportDownDto reportDownDto = new ReportDownDto(); ReportDownPatientDto reportDownPatientDto = new ReportDownPatientDto(); reportDownPatientDto.setJzh(empId); reportDownDto.setPatient(reportDownPatientDto); String collectorid = String.valueOf(FileUtils.getJsonByName("collectorid")); String assortid = String.valueOf(FileUtils.getJsonByName("assortid")); reportDownDto.setAssortid(assortid); reportDownDto.setCollectorid(collectorid); List reportDownScanFileDtos = new ArrayList<>(); ReportDownScanFileDto reportDownScanFileDto; int filesource = Integer.parseInt(String.valueOf(FileUtils.getJsonByName("filesource"))); int filestoragetype = Integer.parseInt(String.valueOf(FileUtils.getJsonByName("filestoragetype"))); for (String[] exam : exams) { reportDownScanFileDto = getScanByExam(exam); reportDownScanFileDto.setFilesource(filesource); reportDownScanFileDto.setFilestoragetype(filestoragetype); reportDownScanFileDtos.add(reportDownScanFileDto); } reportDownDto.setScanfiles(reportDownScanFileDtos); return reportDownDto; } /** * 创建ReportDownScanFileDto对象 通过报告单号 * * @param exam * @return */ private ReportDownScanFileDto getScanByExam(String[] exam) throws Exception { ReportDownScanFileDto reportDownScanFileDto = new ReportDownScanFileDto(); reportDownScanFileDto.setSerialnum(exam[0]); reportDownScanFileDto.setFiletitle(exam[1]); // 1、创建document对象 Document document = DocumentHelper.createDocument(); // Element request = document.addElement("Request"); // Element msg = request.addElement("Msg"); // msg.addElement("EXAM_NO").setText(exam[0]); // List bgtsDetailParam = (List) FileUtils.getJsonByName("bgtsDetailParam"); // Element request = null; // for (int i = 0; i < bgtsDetailParam.size(); i++) { // if (i == 0) { // request = document.addElement(bgtsDetailParam.get(i)); // } else { // request = request.addElement(bgtsDetailParam.get(i)); // } // } Element esbEntry = document.addElement("ESBEntry"); Element request = HttpUtils.reqElement(esbEntry, 0); request.addElement("EXAM_NO").setText(exam[0]); String resXml = invokeWs(esbEntry.asXML()); //解析XML XmlUtils xmlUtils = new XmlUtils(new ByteArrayInputStream(resXml.getBytes("UTF-8"))); // List dis = new ArrayList<>(); // dis.add("MsgInfo"); // dis.add("Msg"); // dis.add("ReportInfo"); List dis = (List) FileUtils.getJsonByName("bgtsDetailRespon"); //数据所在节点 Element element = xmlUtils.getElement(dis); reportDownScanFileDto.setDownurl(element.element(String.valueOf(FileUtils.getJsonByName("pdfUrl"))) == null ? "" : element.element(String.valueOf(FileUtils.getJsonByName("pdfUrl"))).getText()); return reportDownScanFileDto; } /** * 通过empId获取报告单号集合 * * @param empId * @return */ private List getExamNo(String empId) throws Exception { List exams = new ArrayList<>(); // 1、创建document对象 Document document = DocumentHelper.createDocument(); // Element request = document.addElement("Request"); // Element msg = request.addElement("Msg"); // msg.addElement("EMPI_ID").setText(empId); // List bgtsParam = (List) FileUtils.getJsonByName("bgtsParam"); // Element request = null; // for (int i = 0; i < bgtsParam.size(); i++) { // if (i == 0) { // request = document.addElement(bgtsParam.get(i)); // } else { // request = request.addElement(bgtsParam.get(i)); // } // } Element esbEntry = document.addElement("ESBEntry"); Element reqElement = HttpUtils.reqElement(esbEntry, 1); reqElement.addElement("EMPI_ID").setText(empId); logger.info("-------根据患者主索引号查询多个报告单号,地址:" + wsUrl + ",方法:" + wsLocalMethod + "---------"); String xml = esbEntry.asXML(); logger.info("---------------------------"); logger.info(xml); logger.info("----------------------------"); String resXml = invokeWs(xml); logger.info("---------返回值-------------"); logger.info(resXml); logger.info("-----------------------------"); //解析XML XmlUtils xmlUtils = new XmlUtils(new ByteArrayInputStream(resXml.getBytes("UTF-8"))); // List dis = new ArrayList<>(); // dis.add("MsgInfo"); // dis.add("Msg"); List dis = (List) FileUtils.getJsonByName("bgtsRespon"); //数据所在节点 Element element = xmlUtils.getElement(dis); List examInfos = element.elements("ExamInfo"); Element examNo; String[] key; for (Element examInfo : examInfos) { key = new String[2]; examNo = examInfo.element(String.valueOf(FileUtils.getJsonByName("examNo"))); if (examNo != null) { key[0] = examNo.getText(); } Element examItemInfo = examInfo.element("ExamItemInfo"); if (examItemInfo != null) { key[1] = examItemInfo.element(String.valueOf(FileUtils.getJsonByName("examItemName"))).getText(); } exams.add(key); } return exams; } /** * 调用web service * * @param xml * @return * @throws Exception */ public String invokeWs(String xml) throws Exception { // Object[] object = new Object[]{xml};//请求参数 // org.apache.axis.client.Service service = new org.apache.axis.client.Service(); // Call call = (Call) service.createCall(); // call.setTargetEndpointAddress(wsUrl);// 远程调用路径 // // 调用的命名空间和方法名 //// call.setOperationName(new QName(wsNamespaceUrl, wsLocalMethod)); // call.setOperationName(wsLocalMethod); // call.setUseSOAPAction(true); //// call.setSOAPActionURI(wsNamespaceUrl + "pushSurveyReport"); // call.addParameter("arg0", XMLType.XSD_STRING, ParameterMode.IN); // call.setReturnType(XMLType.XSD_STRING);// 返回值类型:String // call.setTimeout(100000);//超时 // String result = (String) call.invoke(object);// 远程调用 // System.out.println(result); logger.info("-----\n客户端调用服务端:" + wsUrl + "方法:" + wsLocalMethod + "\n------------"); JAXDynamicClientFactory dcf = JAXDynamicClientFactory.newInstance(); Client client = dcf.createClient(wsUrl); Object[] objects = client.invoke(wsLocalMethod, xml); String str = objects[0].toString(); logger.info("----------结果---------"); logger.info(str); return str; } }