package com.chinaztt.mes.docx.util; import com.chinaztt.mes.docx.pojo.Chemical; import com.chinaztt.mes.docx.pojo.TestBatch; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.SerializationUtils; import org.dom4j.Attribute; import org.dom4j.Document; import org.dom4j.Element; import org.dom4j.io.SAXReader; import java.io.File; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; import java.util.List; /** * @Description 文件变化处理 * @Author fz **/ @Slf4j public class XMLFileListener { private final SimpleDateFormat SDF = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); /** * 解析xml文件 * * @param file */ public List explainXml(File file) { // 通过后缀名判断是否是xml文件 if (file.exists() && file.isFile()) { String fileName = file.getName(); if (".xml".equals(fileName.substring(fileName.lastIndexOf(".")))) { // 创建reader对象 SAXReader reader = new SAXReader(); // 加载xml文件 Document document; try { document = reader.read(file); } catch (Exception e) { log.error("文档内容非xml格式,无法解析!"); return null; } // 根节点 SampleResults Element root = document.getRootElement(); // 检验批次信息节点 SampleResult Element sampleResult = root.element("SampleResult"); List attributes = sampleResult.attributes(); String name; String value; String batchNo = null; String mark = null; String reportTime = null; for (Attribute attribute : attributes) { name = attribute.getName(); value = attribute.getValue(); if ("Type".equals(name) && "TypeStandardization".equals(value)) { log.info("校准数据,不进行采集..."); return null; } else if ("Name".equals(name)) { batchNo = value; } else if ("TypeCorrSample".equals(name)) { mark = value; } else if ("RecalculationDateTime".equals(name)) { reportTime = value; } } if (batchNo == null || batchNo.trim().length() == 0) { log.warn("无法解析批次号信息,此为必要信息所以终止解析!"); return null; } // 先判断是否是江东金具的委托订单 // List batchNos = saveTestBatchService.explainBatchNo(batchNo.trim()); // if (batchNos == null || batchNos.size() == 0) { // return null; // } // if (batchNos.get(0).equals(batchNo.trim())) { // log.warn(batchNo.trim() + " 非检测单号,不进行解析..."); // return null; // } // 再去除螺栓螺母的委托订单(现不做采集) /*batchNos = saveTestBatchService.excludeBatchNo(batchNos); if (batchNos == null || batchNos.size() == 0) { log.warn("该批次为螺栓/螺母的检测单,现不做采集..."); return null; }*/ // 包含具体检验信息节点 MeasurementReplicates Element measurement = sampleResult.element("MeasurementReplicates"); List elements = measurement.elements(); List batches = new ArrayList<>(elements.size()); TestBatch batch; Date time; List children; for (Element element : elements) { batch = new TestBatch(); try { value = element.attributeValue("MeasureDateTime").replaceFirst("T", " "); time = SDF.parse(value); } catch (ParseException e) { e.printStackTrace(); log.error("报告时间格式非 yyyy-MM-ddTHH:mm:ss 或 yyyy-MM-dd HH:mm:ss,无法解析!"); return null; } batch.setEquipmentTime(time); // 取未被删除的检验信息 value = element.attributeValue("IsDeleted"); if ("No".equals(value)) { element = element.element("Measurement"); // 真正包含检验结果的节点 Elements element = element.element("Elements"); children = element.elements("Element"); batch.setChemicals(explainElements(children, time)); batches.add(batch); } } if (!batches.isEmpty()) { // 包含检验数据平均值节点 MeasurementStatistics elements = null; try { measurement = sampleResult.element("MeasurementStatistics").element("Measurement").element("Elements"); elements = measurement.elements("Element"); } catch (Exception e) { log.error("检验数据平均值无法解析!"); } if (elements != null && !elements.isEmpty()) { batch = new TestBatch(); time = batches.get(batches.size() - 1).getEquipmentTime(); batch.setEquipmentTime(time); batch.setChemicals(explainElements(elements, time)); batches.add(batch); } // List> testBatches = new ArrayList<>(batchNos.size()); // if (batchNos.size() > 1) { // List batchList; // for (String no : batchNos) { // log.info("报告检验批次:" + no + "\t材料牌号:" + mark + "\t生成时间:" + reportTime); // batchList = cloneBatches(batches, no); // testBatches.add(batchList); // } // } else if (batchNos.size() == 1) { // log.info("报告检验批次:" + batchNos.get(0) + "\t材料牌号:" + mark + "\t生成时间:" + reportTime); // for (TestBatch testBatch : batches) { // testBatch.setBatchNo(batchNos.get(0)); // } // testBatches.add(batches); // } // log.info(fileName + " 解析完成..."); // return testBatches; return batches; } else { log.warn(fileName + " 未解析出有效数据!"); return null; } } log.warn(fileName + " 非xml文件,无法解析!"); } return null; } private List explainElements(List elements, Date time) { List chemicals = new ArrayList<>(elements.size()); Chemical chemical; String value; List results; for (Element child : elements) { chemical = new Chemical(); value = child.attributeValue("ElementName"); chemical.setName(value); results = child.elements(); if (results.size() == 3) { for (Element result : results) { value = result.attributeValue("StatType"); if ("Reported".equals(value)) { /*value = result.attributeValue("CalibrationStatus"); if (!"InRange".equals(value)) { chemical.setRemark(value); }*/ result = result.element("ResultValue"); value = result.getTextTrim(); chemical.setValue(value); chemical.setEquipmentTime(time); } } } else { for (Element result : results) { value = result.attributeValue("Type"); if ("ConcTypeCorr".equals(value)) { value = result.attributeValue("StatType"); if ("Reported".equals(value)) { /*value = result.attributeValue("CalibrationStatus"); if (!"InRange".equals(value)) { chemical.setRemark(value); }*/ result = result.element("ResultValue"); value = result.getTextTrim(); chemical.setValue(value); chemical.setEquipmentTime(time); } } } } if (!"-".equals(chemical.getValue())) { chemicals.add(chemical); } } return chemicals; } /** * 对象数组深拷贝 * * @param batches * @param batchNo * @return */ private List cloneBatches(List batches, String batchNo) { List testBatches = new ArrayList<>(batches.size()); TestBatch testBatch; for (TestBatch batch : batches) { testBatch = SerializationUtils.clone(batch); testBatch.setBatchNo(batchNo); testBatches.add(testBatch); } return testBatches; } }