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<TestBatch> 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<Attribute> 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<String> 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<Element> elements = measurement.elements();
|
List<TestBatch> batches = new ArrayList<>(elements.size());
|
TestBatch batch;
|
Date time;
|
List<Element> 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<List<TestBatch>> testBatches = new ArrayList<>(batchNos.size());
|
// if (batchNos.size() > 1) {
|
// List<TestBatch> 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<Chemical> explainElements(List<Element> elements, Date time) {
|
List<Chemical> chemicals = new ArrayList<>(elements.size());
|
Chemical chemical;
|
String value;
|
List<Element> 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<TestBatch> cloneBatches(List<TestBatch> batches, String batchNo) {
|
List<TestBatch> testBatches = new ArrayList<>(batches.size());
|
TestBatch testBatch;
|
for (TestBatch batch : batches) {
|
testBatch = SerializationUtils.clone(batch);
|
testBatch.setBatchNo(batchNo);
|
testBatches.add(testBatch);
|
}
|
return testBatches;
|
}
|
|
}
|