zouyu
9 天以前 bf95078dab81dcd0639fdb1a41e998b31c940fb1
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
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;
    }
 
}