Explorar el Código

【data文件解析】优化解析逻辑

zhouy hace 1 mes
padre
commit
7c61f060f8

+ 12 - 2
pom.xml

@@ -135,15 +135,25 @@
 			<artifactId>jcifs</artifactId>
 			<version>2.1.34</version>
 		</dependency>
-		<dependency>
+	<!--	<dependency>
 			<groupId>org.apache.poi</groupId>
 			<artifactId>poi</artifactId>
 			<version>3.14</version>
+		</dependency>-->
+		<!--<dependency>
+			<groupId>org.apache.poi</groupId>
+			<artifactId>poi-ooxml</artifactId>
+			<version>3.14</version>
+		</dependency>-->
+		<dependency>
+			<groupId>org.apache.poi</groupId>
+			<artifactId>poi</artifactId>
+			<version>4.1.2</version>
 		</dependency>
 		<dependency>
 			<groupId>org.apache.poi</groupId>
 			<artifactId>poi-ooxml</artifactId>
-			<version>3.14</version>
+			<version>4.1.2</version>
 		</dependency>
 		<dependency>
 			<groupId>commons-net</groupId>

+ 3 - 3
src/main/java/com/uas/eis/core/config/AsyncConfig.java

@@ -19,11 +19,11 @@ public class AsyncConfig{
     public Executor asyncExecutor() {
         ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
         //核心线程数10:线程池创建时候初始化的线程数
-        executor.setCorePoolSize(2);
+        executor.setCorePoolSize(20);
         //最大线程数20:线程池最大的线程数,只有在缓冲队列满了之后才会申请超过核心线程数的线程
-        executor.setMaxPoolSize(20);
+        executor.setMaxPoolSize(40);
         //缓冲队列500:用来缓冲执行任务的队列
-        executor.setQueueCapacity(1000);
+        executor.setQueueCapacity(500);
         //允许线程的空闲时间60秒:当超过了核心线程出之外的线程在空闲时间到达之后会被销毁
         executor.setKeepAliveSeconds(60);
         //线程池名的前缀:设置好了之后可以方便我们定位处理任务所在的线程池

+ 71 - 0
src/main/java/com/uas/eis/core/support/HeaderRowHandler.java

@@ -0,0 +1,71 @@
+package com.uas.eis.core.support;
+
+import com.uas.eis.utils.PoiSaxUtil;
+import org.apache.poi.xssf.model.SharedStrings;
+import org.xml.sax.Attributes;
+import org.xml.sax.SAXException;
+import org.xml.sax.helpers.DefaultHandler;
+import java.util.List;
+
+public class HeaderRowHandler extends DefaultHandler {
+    private final int targetRowNum;
+    private final SharedStrings sharedStrings;
+    private final List<String> headerResultList;
+
+    private String cellBuffer;
+    private boolean captureCellFlag;
+    private int currentRowIndex;
+    // 标记:是否已经读完表头,停止解析
+    private boolean headerReadFinished = false;
+
+    public HeaderRowHandler(int targetRowNum, SharedStrings sharedStrings, List<String> headerResultList) {
+        this.targetRowNum = targetRowNum;
+        this.sharedStrings = sharedStrings;
+        this.headerResultList = headerResultList;
+    }
+
+    @Override
+    public void startElement(String uri, String localName, String qName, Attributes attributes) {
+        // 表头已读完,直接跳过所有节点处理
+        if (headerReadFinished) {
+            return;
+        }
+        if ("row".equals(qName)) {
+            currentRowIndex = Integer.parseInt(attributes.getValue("r")) - 1;
+            if (currentRowIndex == targetRowNum) {
+                headerResultList.clear();
+            }
+            // 当前行超过目标行,标记完成,后续全部跳过
+            if (currentRowIndex > targetRowNum) {
+                headerReadFinished = true;
+                return;
+            }
+            cellBuffer = "";
+            captureCellFlag = false;
+        }
+        if ("c".equals(qName) && currentRowIndex == targetRowNum) {
+            captureCellFlag = true;
+            cellBuffer = "";
+        }
+    }
+
+    @Override
+    public void characters(char[] ch, int start, int length) {
+        if (headerReadFinished || !captureCellFlag) {
+            return;
+        }
+        cellBuffer += new String(ch, start, length);
+    }
+
+    @Override
+    public void endElement(String uri, String localName, String qName) {
+        if (headerReadFinished) {
+            return;
+        }
+        if ("c".equals(qName) && currentRowIndex == targetRowNum) {
+            String cellVal = PoiSaxUtil.parseCellValue(cellBuffer, sharedStrings);
+            headerResultList.add(cellVal);
+            captureCellFlag = false;
+        }
+    }
+}

+ 141 - 0
src/main/java/com/uas/eis/core/support/SaxDataBatchHandler.java

@@ -0,0 +1,141 @@
+package com.uas.eis.core.support;
+
+import com.uas.eis.utils.PoiSaxUtil;
+import org.apache.poi.xssf.eventusermodel.XSSFReader;
+import org.apache.poi.xssf.model.SharedStrings;
+import org.apache.poi.xssf.model.StylesTable;
+import org.springframework.jdbc.core.JdbcTemplate;
+import org.xml.sax.Attributes;
+import org.xml.sax.InputSource;
+import org.xml.sax.XMLReader;
+import org.xml.sax.helpers.DefaultHandler;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class SaxDataBatchHandler extends DefaultHandler {
+    // 数据库模板(上层Service传入,Spring单例线程安全)
+    private final JdbcTemplate jdbcTemplate;
+    private final String waferId;
+    private final String tableName;
+    private final String dbLinkSuffix;
+    private final String dynamicItemColumns;
+    private final int maxCellSize;
+    private final int dataStartRow;
+    private final int batchRowLimit;
+    private final SharedStrings sharedStrings;
+
+    // 复用缓冲区,减少GC创建临时对象
+    private final StringBuilder batchSqlBuffer = new StringBuilder(8192);
+    private final StringBuilder valueBuffer = new StringBuilder(512);
+
+    private int currentRowNum;
+    private int batchCounter = 0;
+    private final List<String> currentRowCells = new ArrayList<>();
+    private String tempCellText;
+    private boolean readCellContent;
+
+    public SaxDataBatchHandler(JdbcTemplate jdbcTemplate, String waferId, String tableName, String dbLinkSuffix, String dynamicItemColumns,
+                               int maxCellSize,
+                               int dataStartRow,
+                               int batchRowLimit,
+                               SharedStrings sharedStrings) {
+        this.jdbcTemplate = jdbcTemplate;
+        this.waferId = waferId;
+        this.tableName = tableName;
+        this.dbLinkSuffix = dbLinkSuffix;
+        this.dynamicItemColumns = dynamicItemColumns;
+        this.maxCellSize = maxCellSize;
+        this.dataStartRow = dataStartRow;
+        this.batchRowLimit = batchRowLimit;
+        this.sharedStrings = sharedStrings;
+    }
+
+    /**
+     * 开始解析sheet xml
+     */
+    public void parseSheet(XSSFReader xssfReader, XMLReader xmlReader, StylesTable stylesTable) throws Exception {
+        InputSource sheetSource = new InputSource(xssfReader.getSheetsData().next());
+        xmlReader.setContentHandler(this);
+        xmlReader.parse(sheetSource);
+        // 处理剩余不足一批的数据
+        flushBatchSql();
+    }
+
+    @Override
+    public void startElement(String uri, String localName, String qName, Attributes attributes) {
+        if ("row".equals(qName)) {
+            currentRowNum = Integer.parseInt(attributes.getValue("r")) - 1;
+            currentRowCells.clear();
+        }
+        if ("c".equals(qName) && currentRowNum >= dataStartRow) {
+            tempCellText = "";
+            readCellContent = true;
+        }
+    }
+
+    @Override
+    public void characters(char[] ch, int start, int length) {
+        if (readCellContent) {
+            tempCellText += new String(ch, start, length);
+        }
+    }
+
+    @Override
+    public void endElement(String uri, String localName, String qName) {
+        // 单元格结束,收集值
+        if ("c".equals(qName) && currentRowNum >= dataStartRow) {
+            String cellVal = PoiSaxUtil.parseCellValue(tempCellText, sharedStrings);
+            currentRowCells.add(cellVal);
+            readCellContent = false;
+        }
+
+        // 单行解析完成,拼接INSERT语句
+        if ("row".equals(qName) && currentRowNum >= dataStartRow) {
+            int detNo = currentRowNum - dataStartRow;
+            int dataType = detNo == 0 ? 0 : 1;
+            String firstCellVal = currentRowCells.size() > 0 ? currentRowCells.get(0) : "";
+            String flag = firstCellVal.startsWith("F") ? "1" : "0";
+
+            valueBuffer.setLength(0);
+            for (int m = 0; m < maxCellSize; m++) {
+                String cellVal = m < currentRowCells.size() ? currentRowCells.get(m).trim() : "";
+                // 转义单引号,防止SQL语法报错
+                cellVal = cellVal.replace("'", "''");
+                valueBuffer.append("'").append(cellVal).append("'");
+                if (m != maxCellSize - 1) {
+                    valueBuffer.append(",");
+                }
+            }
+
+            batchSqlBuffer.append("INSERT INTO ")
+                    .append(tableName).append(dbLinkSuffix)
+                    .append(" (WAFER_ID,DETNO_,DATATYPE_,FLAG_,").append(dynamicItemColumns).append(") VALUES ('")
+                    .append(waferId).append("',")
+                    .append(detNo).append(",")
+                    .append(dataType).append(",")
+                    .append(flag).append(",")
+                    .append(valueBuffer).append(");");
+
+            batchCounter++;
+            // 达到批次阈值,执行入库并清空缓冲区
+            if (batchCounter >= batchRowLimit) {
+                flushBatchSql();
+                batchSqlBuffer.setLength(0);
+                batchCounter = 0;
+            }
+        }
+    }
+
+    /**
+     * 执行当前批次PLSQL块
+     */
+    private void flushBatchSql() {
+        if (batchSqlBuffer.length() == 0) {
+            return;
+        }
+        String plsqlBlock = "BEGIN " + batchSqlBuffer + " END;";
+        jdbcTemplate.execute(plsqlBlock);
+        batchSqlBuffer.setLength(0);
+    }
+}

+ 1 - 1
src/main/java/com/uas/eis/serviceImpl/DataDealServiceImpl.java

@@ -75,7 +75,7 @@ public class DataDealServiceImpl implements DataDealService
                         mainBuffer.append(new StringBuilder().append("'").append(st.getRow(mainBeginRow + 3).getCell(j + 2).getStringCellValue().trim()).append("',").toString());
                         mainBuffer.append(new StringBuilder().append("'").append(st.getRow(mainBeginRow + 4).getCell(j + 2).getStringCellValue().trim()).append("',").toString());
                         mainBuffer.append(new StringBuilder().append("'").append(st.getRow(mainBeginRow + 5).getCell(j + 2).getStringCellValue().trim()).append("',").toString());
-                        switch (st.getRow(mainBeginRow + 6).getCell(j + 2).getCellType()) {
+                        switch (st.getRow(mainBeginRow + 6).getCell(j + 2).getCellType().ordinal()) {
                             case 0:
                                 mainBuffer.append(new StringBuilder().append("'").append(st.getRow(mainBeginRow + 6).getCell(j + 2).getNumericCellValue()).append("',").toString());
                                 break;

+ 3 - 3
src/main/java/com/uas/eis/serviceImpl/EDCBakServiceImpl.java

@@ -375,11 +375,11 @@ public class EDCBakServiceImpl implements EDCBakService {
                     double cerd_failnum= st.getRow(i).getCell(3).getNumericCellValue();
                     Object cerd_precent = "''";
                     if(st.getRow(i).getCell(4)!=null) {
-                        switch (st.getRow(i).getCell(4).getCellType()) {
-                            case HSSFCell.CELL_TYPE_NUMERIC:
+                        switch (st.getRow(i).getCell(4).getCellType().ordinal()) {
+                            case 0:
                                 cerd_precent = st.getRow(i).getCell(4).getNumericCellValue();
                                 break;
-                            case HSSFCell.CELL_TYPE_STRING:
+                            case 1:
                                 cerd_precent = st.getRow(i).getCell(4).getStringCellValue();
                                 break;
                         }

+ 181 - 0
src/main/java/com/uas/eis/serviceImpl/FileParse2ServiceImpl.java

@@ -0,0 +1,181 @@
+package com.uas.eis.serviceImpl;
+
+import com.uas.eis.core.support.HeaderRowHandler;
+import com.uas.eis.core.support.SaxDataBatchHandler;
+import com.uas.eis.dao.BaseDao;
+import com.uas.eis.entity.DataChipTestLog;
+import com.uas.eis.utils.FTPUtil;
+import org.apache.commons.net.ftp.FTPClient;
+import org.apache.poi.openxml4j.opc.OPCPackage;
+import org.apache.poi.xssf.eventusermodel.XSSFReader;
+import org.apache.poi.xssf.model.SharedStrings;
+import org.apache.poi.xssf.model.StylesTable;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.scheduling.annotation.Async;
+import org.springframework.stereotype.Service;
+import org.xml.sax.InputSource;
+import org.xml.sax.XMLReader;
+import org.xml.sax.helpers.XMLReaderFactory;
+import java.io.BufferedInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.concurrent.CountDownLatch;
+
+@Service
+@Async("taskExecutor")
+public class FileParse2ServiceImpl {
+    private static final Logger logger = LoggerFactory.getLogger(FileParse2ServiceImpl.class);
+    // 常量配置
+    private static final int BATCH_ROW_SIZE = 1000;
+    private static final String DB_LINK = "@SHENAI_EDCDATA";
+    private static final int LABEL_ROW_INDEX = 13;
+    private static final int DATA_START_INDEX = 23;
+    // 外部注入
+     @Autowired
+     private BaseDao baseDao;
+    public void EDCDataDeal(DataChipTestLog dataChipTestLog, CountDownLatch countDownLatch) {
+        String waferId = dataChipTestLog.getWafer_id();
+        String lotId = dataChipTestLog.getLot_id();
+        Integer dbId = dataChipTestLog.getDbid_();
+        String tableName = "DATA$" + lotId.replace("-", "_");
+
+        FTPClient ftpClient = null;
+        InputStream ftpInputStream = null;
+        OPCPackage opcPackage = null;
+
+        try {
+            logger.info("WaferId:{} Data文件解析开始", waferId);
+            String filePath = extractFilePath(dataChipTestLog.getData_path());
+            ftpClient = FTPUtil.getFTPClient();
+            boolean fileExists = FTPUtil.exists(ftpClient, filePath);
+            logger.info("文件路径:{}, FTP文件存在:{}", filePath, fileExists);
+
+            if (ftpClient == null) {
+                logger.warn("FTP客户端为空,跳过 waferId={}", waferId);
+                countDownLatch.countDown();
+                return;
+            }
+            if(!fileExists) {
+                logger.warn("文件不存在,跳过 waferId={}", waferId);
+                String errSql = String.format("UPDATE DATACENTER$MESFILE SET DEALSTATE_=-100 , DEALTIME_=SYSDATE WHERE DBID_=%s", dbId);
+                baseDao.execute(errSql);
+                countDownLatch.countDown();
+                return;
+            }
+
+            // 打开FTP文件流 & OPC压缩包
+            ftpInputStream = new BufferedInputStream(FTPUtil.readFileAsStream(ftpClient, filePath));
+            opcPackage = OPCPackage.open(ftpInputStream);
+            XSSFReader xssfReader = new XSSFReader(opcPackage);
+            // 开启只读共享字符串表,降低内存占用
+            SharedStrings sharedStrings = xssfReader.getSharedStringsTable();
+            StylesTable stylesTable = xssfReader.getStylesTable();
+            XMLReader xmlReader = XMLReaderFactory.createXMLReader();
+
+            // 1. 读取表头行,生成ITEM1,ITEM2...动态列
+            List<String> headerList = new ArrayList<>();
+            readHeaderRow(xssfReader, xmlReader, sharedStrings, stylesTable, LABEL_ROW_INDEX, headerList);
+            List<String> itemColumnList = new ArrayList<>();
+            for (int i = 0; i < headerList.size(); i++) {
+                itemColumnList.add("ITEM" + (i + 1));
+            }
+            String dynamicCols = String.join(",", itemColumnList);
+
+            // 2. 先删除当前wafer历史数据
+            String deleteSql = String.format("DELETE FROM %s%s WHERE WAFER_ID='%s'", tableName, DB_LINK, waferId);
+            baseDao.execute(deleteSql);
+
+            // 3. SAX流式读取数据分批入库,传入JdbcTemplate
+            SaxDataBatchHandler dataHandler = new SaxDataBatchHandler(
+                    baseDao.getJdbcTemplate(),
+                    waferId,
+                    tableName,
+                    DB_LINK,
+                    dynamicCols,
+                    headerList.size(),
+                    DATA_START_INDEX,
+                    BATCH_ROW_SIZE,
+                    sharedStrings
+            );
+            dataHandler.parseSheet(xssfReader, xmlReader, stylesTable);
+
+            // 4. 后置业务SQL:更新文件状态、归档、日志
+            StringBuilder postSqlBlock = new StringBuilder(1024);
+            postSqlBlock.append("BEGIN ");
+            postSqlBlock.append("UPDATE DATACENTER$MESFILE SET DEALSTATE_=1,DEALTIME_=SYSDATE WHERE DBID_=").append(dbId).append("; ");
+            postSqlBlock.append("INSERT INTO chip$file (WAFER_ID,LOT_ID,PASS_QTY,FAIL_QTY,PASS_YFIELD,EQUIP_ID,STATUS,COUNTER_PATH,DATA_PATH,TEST_LOT,CREATETIME_,DEALSTATE_,DEALTIME_,DBID_) ");
+            postSqlBlock.append("SELECT WAFER_ID,LOT_ID,PASS_QTY,FAIL_QTY,PASS_YFIELD,EQUIP_ID,STATUS,TRIM(COUNTER_PATH),TRIM(DATA_PATH),TEST_LOT,CREATETIME_,DEALSTATE_,DEALTIME_,DBID_ ");
+            postSqlBlock.append("FROM DATACENTER$MESFILE WHERE DBID_=").append(dbId);
+            postSqlBlock.append(" AND WAFER_ID NOT IN (SELECT WAFER_ID FROM chip$file WHERE WAFER_ID='").append(waferId).append("'); ");
+            postSqlBlock.append("INSERT INTO chip$data$log (WAFER_ID,ID_) SELECT '").append(waferId).append("',CHIP$DATA$LOG_SEQ.NEXTVAL FROM DUAL; END;");
+            baseDao.execute(postSqlBlock.toString());
+
+            logger.info("WaferId:{} 文件处理完成", waferId);
+        } catch (Exception e) {
+            logger.error("芯片号:{} 解析异常", waferId, e);
+            // 异常标记失败状态
+            String errSql = String.format("UPDATE DATACENTER$MESFILE SET DEALSTATE_=-99 , DEALTIME_=SYSDATE WHERE DBID_=%s", dbId);
+            baseDao.execute(errSql);
+        } finally {
+            // 严格顺序释放全部资源,杜绝内存/句柄泄漏
+            try {
+                if (opcPackage != null) {
+                    opcPackage.close();
+                }
+            } catch (Exception ex) {
+                logger.error("关闭OPCPackage失败", ex);
+            }
+            try {
+                if (ftpInputStream != null) {
+                    ftpInputStream.close();
+                }
+            } catch (IOException ex) {
+                logger.error("关闭FTP文件输入流失败", ex);
+            }
+            try {
+                if (ftpClient != null) {
+                    ftpClient.completePendingCommand();
+                    ftpClient.logout();
+                    ftpClient.disconnect();
+                }
+            } catch (IOException ex) {
+                logger.error("释放FTP连接失败", ex);
+            }
+            // 线程计数器放行
+            countDownLatch.countDown();
+        }
+    }
+
+    /**
+     * 读取指定行作为表头
+     */
+    private void readHeaderRow(XSSFReader reader, XMLReader xmlReader, SharedStrings sst,
+                               StylesTable styles, int targetRow, List<String> outHeader) throws Exception {
+        InputSource sheetSource = new InputSource(reader.getSheetsData().next());
+        HeaderRowHandler headerHandler = new HeaderRowHandler(targetRow, sst, outHeader);
+        xmlReader.setContentHandler(headerHandler);
+        xmlReader.parse(sheetSource);
+    }
+
+    private String extractFilePath(String ftpUrl) {
+        if (ftpUrl == null || ftpUrl.isEmpty()) {
+            return null;
+        }
+        // 查找 ftp:// 的位置
+        int protocolIndex = ftpUrl.indexOf("ftp://");
+        if (protocolIndex == -1) {
+            // 不是FTP URL,直接返回原路径
+            return ftpUrl;
+        }
+        int pathStartIndex = ftpUrl.indexOf("/", protocolIndex + 6);
+        if (pathStartIndex == -1) {
+            // 没有路径部分,返回根目录
+            return "/";
+        }
+        return "/home/mes"+ftpUrl.substring(pathStartIndex).trim();
+    }
+}

+ 30 - 8
src/main/java/com/uas/eis/serviceImpl/FileParseServiceImpl.java

@@ -30,18 +30,22 @@ public class FileParseServiceImpl implements FileParseService {
     @Async("taskExecutor")
     public void EDCDataDeal(DataChipTestLog dataChipTestLog, CountDownLatch countDownLatch) {
         String TableName = "DATA$" + dataChipTestLog.getLot_id().replace("-","_");
+        FTPClient ftpClient = null;
+        InputStream ftpInputStream = null;
+        Workbook workBook = null;
+        Sheet workSheet =null;
         try {
             this.logger.info(new StringBuilder().append(dataChipTestLog.getWafer_id()).append("Data文件解析开始").toString());
             String FilePath = extractFilePath(dataChipTestLog.getData_path());
-            FTPClient ftpClient = FTPUtil.getFTPClient();
+            ftpClient = FTPUtil.getFTPClient();
             System.out.println("开始下载文件:" + FilePath+";文件是否存在:"+FTPUtil.exists(ftpClient, FilePath));
             if (ftpClient != null && FTPUtil.exists(ftpClient, FilePath)) {
-                InputStream is = new BufferedInputStream(FTPUtil.readFileAsStream(ftpClient, FilePath));
-                Workbook book = WorkbookFactory.create(is);
-                Sheet st = book.getSheetAt(0);
+                ftpInputStream = new BufferedInputStream(FTPUtil.readFileAsStream(ftpClient, FilePath));
+                workBook = WorkbookFactory.create(ftpInputStream);
+                workSheet = workBook.getSheetAt(0);
                 int labelIndex = 13;
                 int dataStart = 23;
-                Row labelRow = st.getRow(labelIndex);
+                Row labelRow = workSheet.getRow(labelIndex);
                 List items = new ArrayList();
                 for (int i = 0; i < labelRow.getPhysicalNumberOfCells(); i++) {
                     items.add(labelRow.getCell(i)!=null?labelRow.getCell(i).getStringCellValue(): "");
@@ -52,7 +56,7 @@ public class FileParseServiceImpl implements FileParseService {
                 }
                 List sqls = new ArrayList();
                 sqls.add(new StringBuilder().append("DELETE FROM ").append(TableName).append("@SHENAI_EDCDATA  WHERE WAFER_ID='").append(dataChipTestLog.getWafer_id()).append("'").toString());
-                int allRow = st.getLastRowNum() - (dataStart - 1);
+                int allRow = workSheet.getLastRowNum() - (dataStart - 1);
                 int a = allRow / 3000;
                 int b = allRow % 3000;
                 StringBuffer detailBuffer = new StringBuffer();
@@ -67,7 +71,7 @@ public class FileParseServiceImpl implements FileParseService {
                             detailBuffer.append(new StringBuilder().append("INSERT INTO ").append(TableName).append("@SHENAI_EDCDATA (WAFER_ID,DETNO_,DATATYPE_,FLAG_,").append(String.join(",", new CharSequence[]{dynamicCols})).append(") VALUES ").append("('")
                                     .append(dataChipTestLog.getWafer_id()).append("',").append(k).append(",").append((k==0?0:1)).append(",").toString());
                             ValueSql = "";
-                            dataRow = st.getRow(k + dataStart);
+                            dataRow = workSheet.getRow(k + dataStart);
                             if(dataRow.getCell(0).toString().startsWith("F")){
                                 detailBuffer.append("1").toString();
                             }else {
@@ -91,7 +95,7 @@ public class FileParseServiceImpl implements FileParseService {
                         detailBuffer.append(new StringBuilder().append("INSERT INTO ").append(TableName).append("@SHENAI_EDCDATA (WAFER_ID,DETNO_,DATATYPE_,FLAG_,").append(String.join(",", new CharSequence[]{dynamicCols})).append(") VALUES ").append("('")
                                .append(dataChipTestLog.getWafer_id()).append("',").append(a * 3000 + k).append(",").append((k==0?0:1)).append(","));
                         ValueSql = "";
-                        dataRow = st.getRow(a * 3000 + k + dataStart);
+                        dataRow = workSheet.getRow(a * 3000 + k + dataStart);
                         if(dataRow.getCell(0).toString().startsWith("F")){
                             detailBuffer.append("1").toString();
                         }else {
@@ -121,6 +125,24 @@ public class FileParseServiceImpl implements FileParseService {
             e.printStackTrace();
             this.baseDao.execute(new StringBuilder().append("UPDATE DATACENTER$MESFILE SET DEALSTATE_=-99 , DEALTIME_=SYSDATE WHERE DBID_=").append(dataChipTestLog.getDbid_()).toString());
         } finally {
+            try {
+                if (workBook != null)  workBook.close();
+            } catch (Exception ex) {
+                logger.error("关闭workBook失败", ex);
+            }
+            try {
+                if (ftpInputStream != null) ftpInputStream.close();
+            } catch (Exception ex) {
+                logger.error("关闭FTP流失败", ex);
+            }
+            try {
+                if (ftpClient != null) {
+                    ftpClient.logout();
+                    ftpClient.disconnect();
+                }
+            } catch (Exception ex) {
+                logger.error("释放FTP连接失败", ex);
+            }
             countDownLatch.countDown();
         }
     }

+ 5 - 4
src/main/java/com/uas/eis/task/FileParseTask.java

@@ -7,6 +7,7 @@ import com.uas.eis.dao.SqlRowList;
 import com.uas.eis.entity.DataChip;
 import com.uas.eis.entity.DataChipTestLog;
 import com.uas.eis.service.FileParseService;
+import com.uas.eis.serviceImpl.FileParse2ServiceImpl;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -28,14 +29,14 @@ public class FileParseTask {
     @Autowired
     private BaseDao baseDao;
     @Autowired
-    private FileParseService fileParseService;
+    private FileParse2ServiceImpl fileParseService;
     @Autowired
     private TableCreator tableCreator;
-    @Scheduled(fixedRate = 600000)
+    @Scheduled(fixedRate = 300000)
     public void dataDeal(){
         logger.info("开始解析文件");
         List<DataChipTestLog> dataChipTestLogs = baseDao.getJdbcTemplate().query("select wafer_id,lot_id,status,data_path,counter_path,dbid_ from (select wafer_id,lot_id,status,data_path,counter_path,dbid_ from " +
-                        " DATACENTER$MESFILE WHERE DEALSTATE_=0   ORDER BY DBID_ ASC ) where " +
+                        " DATACENTER$MESFILE WHERE DEALSTATE_=0  ORDER BY DBID_ ASC ) where " +
                 " rownum<=100", new BeanPropertyRowMapper<>(DataChipTestLog.class));
         List<String> distinctLotIds = dataChipTestLogs.stream().map(DataChipTestLog::getLot_id).distinct()
                 .collect(Collectors.toList());
@@ -63,6 +64,6 @@ public class FileParseTask {
             }
         }
       //  baseDao.execute("INSERT INTO DATACENTER$TASKLOG(NAME_,DURATION_) VALUES ('Data文件解析',"+(new Date().getTime()-date.getTime())/1000+")");
-        logger.info("Data文件解析执行结束:用时"+((new Date().getTime()-date.getTime())/1000));
+        logger.info("Data文件解析,解析文件数"+dataChipTestLogs.size()+"执行结束:用时"+((new Date().getTime()-date.getTime())/1000));
     }
 }

+ 1 - 1
src/main/java/com/uas/eis/utils/FTPUtil.java

@@ -49,7 +49,7 @@ public class FTPUtil {
             logger.info("FTP连接成功: {}", IP);
         } catch (IOException e) {
             logger.error("FTP连接异常", e);
-            closeFTPClient(ftpClient);
+            //closeFTPClient(ftpClient);
             return null;
         }
 

+ 28 - 0
src/main/java/com/uas/eis/utils/PoiSaxUtil.java

@@ -0,0 +1,28 @@
+package com.uas.eis.utils;
+
+import org.apache.poi.ss.usermodel.RichTextString;
+import org.apache.poi.xssf.model.SharedStrings;
+
+public class PoiSaxUtil {
+
+    /**
+     * 解析单元格值,处理共享字符串索引
+     */
+    public static String parseCellValue(String raw, SharedStrings sst) {
+        if (raw == null ||raw.isEmpty()) {
+            return "";
+        }
+        // 非数字直接返回文本
+        if (!raw.matches("\\d+")) {
+            return raw.trim();
+        }
+        int idx;
+        try {
+            idx = Integer.parseInt(raw);
+        } catch (NumberFormatException e) {
+            return raw.trim();
+        }
+        RichTextString richText = sst.getItemAt(idx);
+        return richText.getString();
+    }
+}

+ 43 - 0
src/test/java/com/uas/eis/UasEisApplicationTests.java

@@ -1,10 +1,14 @@
 package com.uas.eis;
 
 
+import com.uas.eis.core.TableCreator;
+import com.uas.eis.core.config.SpObserver;
 import com.uas.eis.dao.BaseDao;
+import com.uas.eis.entity.DataChipTestLog;
 import com.uas.eis.entity.EquipConfig;
 import com.uas.eis.service.DataDealService;
 import com.uas.eis.service.EDCBakService;
+import com.uas.eis.serviceImpl.FileParse2ServiceImpl;
 import com.uas.eis.task.FileParseTask;
 import com.uas.eis.utils.CollectionUtil;
 import com.uas.eis.utils.SmbUtil;
@@ -31,6 +35,7 @@ import java.util.List;
 import java.util.Map;
 import java.util.Properties;
 import java.util.concurrent.CountDownLatch;
+import java.util.stream.Collectors;
 
 @RunWith(SpringRunner.class)
 @SpringBootTest(classes = {UasEisApplication.class})
@@ -47,10 +52,48 @@ public class UasEisApplicationTests {
 	private BaseDao baseDao;
 	@Autowired
 	private FileParseTask fileParseTask;
+	@Autowired
+	private TableCreator tableCreator;
+	@Autowired
+	private FileParse2ServiceImpl fileParse2Service;
 	@Test
 	public void contextLoads() {
 		fileParseTask.dataDeal();
 	}
+	@Test
+	public void contextSaxLoads() {
+		List<DataChipTestLog> dataChipTestLogs = baseDao.getJdbcTemplate().query("select wafer_id,lot_id,status,data_path,counter_path,dbid_ from (select wafer_id,lot_id,status,data_path,counter_path,dbid_ from " +
+				" DATACENTER$MESFILE WHERE wafer_id='BZ250913699#15'  ORDER BY DBID_ ASC ) where " +
+				" rownum<=100", new BeanPropertyRowMapper<>(DataChipTestLog.class));
+		List<String> distinctLotIds = dataChipTestLogs.stream().map(DataChipTestLog::getLot_id).distinct()
+				.collect(Collectors.toList());
+		SpObserver.putSp("datacenter");
+		try {
+			for (String lotId : distinctLotIds){
+				tableCreator.createTable("DATA$"+lotId.replace("-","_"));
+			}
+		} catch (Exception e) {
+			logger.info("创建表失败:"+e.getMessage());
+		}finally {
+			SpObserver.clear();
+		}
+		logger.info("Data文件解析执行开始:文件数"+dataChipTestLogs.size());
+		Date date = new Date();
+		if(!dataChipTestLogs.isEmpty()){
+			final CountDownLatch countDownLatch = new CountDownLatch(dataChipTestLogs.size());
+			try {
+				dataChipTestLogs.stream().forEach(dataChipTestLog -> {
+					fileParse2Service.EDCDataDeal(dataChipTestLog,countDownLatch);
+				});
+				countDownLatch.await();
+			} catch (InterruptedException e) {
+				e.printStackTrace();
+			}
+		}
+		//  baseDao.execute("INSERT INTO DATACENTER$TASKLOG(NAME_,DURATION_) VALUES ('Data文件解析',"+(new Date().getTime()-date.getTime())/1000+")");
+		logger.info("Data文件解析,解析文件数"+dataChipTestLogs.size()+"执行结束:用时"+((new Date().getTime()-date.getTime())/1000));
+
+	}
 	//@Test
 /*	public void contextLoads() {
 		Date date = new Date();

+ 0 - 126
uas-eis.eml

@@ -1,126 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<component LANGUAGE_LEVEL="JDK_1_7" inheritJdk="true">
-	<output-test url="file://$MODULE_DIR$/target/test-classes"/>
-	<contentEntry url="file://$MODULE_DIR$">
-		<testFolder url="file://$MODULE_DIR$/src/test/java"/>
-		<excludeFolder url="file://$MODULE_DIR$/target"/>
-	</contentEntry>
-	<lib name="ojdbc7.jar" scope="COMPILE">
-		<relative-module-cls project-related="jar://$PROJECT_DIR$/lib/ojdbc7.jar!/"/>
-	</lib>
-	<lib name="lib/ojdbc7.jar" scope="COMPILE">
-		<relative-module-cls project-related="jar://$PROJECT_DIR$/lib/ojdbc7.jar!/"/>
-	</lib>
-	<lib name="lib/ojdbc7.jar" scope="COMPILE">
-		<relative-module-cls project-related="jar://$PROJECT_DIR$/lib/ojdbc7.jar!/"/>
-	</lib>
-	<lib name="Maven: org.yaml:snakeyaml:1.17" scope="RUNTIME"/>
-	<lib name="Maven: org.springframework.boot:spring-boot-starter-test:1.5.10.RELEASE" scope="TEST"/>
-	<lib name="Maven: org.springframework.boot:spring-boot-test:1.5.10.RELEASE" scope="TEST"/>
-	<lib name="Maven: org.springframework.boot:spring-boot-test-autoconfigure:1.5.10.RELEASE" scope="TEST"/>
-	<lib name="Maven: com.jayway.jsonpath:json-path:2.2.0" scope="TEST"/>
-	<lib name="Maven: net.minidev:json-smart:2.2.1" scope="TEST"/>
-	<lib name="Maven: net.minidev:accessors-smart:1.1" scope="TEST"/>
-	<lib name="Maven: org.ow2.asm:asm:5.0.3" scope="TEST"/>
-	<lib name="Maven: junit:junit:4.12" scope="TEST"/>
-	<lib name="Maven: org.assertj:assertj-core:2.6.0" scope="TEST"/>
-	<lib name="Maven: org.mockito:mockito-core:1.10.19" scope="TEST"/>
-	<lib name="Maven: org.objenesis:objenesis:2.1" scope="TEST"/>
-	<lib name="Maven: org.hamcrest:hamcrest-core:1.3" scope="TEST"/>
-	<lib name="Maven: org.hamcrest:hamcrest-library:1.3" scope="TEST"/>
-	<lib name="Maven: org.skyscreamer:jsonassert:1.4.0" scope="TEST"/>
-	<lib name="Maven: com.vaadin.external.google:android-json:0.0.20131108.vaadin1" scope="TEST"/>
-	<lib name="Maven: org.springframework:spring-test:4.3.14.RELEASE" scope="TEST"/>
-	<lib name="Maven: org.oracle:oracle:1.0.0" scope="COMPILE">
-		<relative-module-cls project-related="jar://$PROJECT_DIR$/lib/ojdbc7.jar!/"/>
-	</lib>
-	<levels>
-		<level name="Maven: org.springframework.boot:spring-boot-starter-web:1.5.10.RELEASE" value="project"/>
-		<level name="Maven: org.springframework.boot:spring-boot-starter:1.5.10.RELEASE" value="project"/>
-		<level name="Maven: org.springframework.boot:spring-boot:1.5.10.RELEASE" value="project"/>
-		<level name="Maven: org.springframework.boot:spring-boot-autoconfigure:1.5.10.RELEASE" value="project"/>
-		<level name="Maven: org.springframework.boot:spring-boot-starter-logging:1.5.10.RELEASE" value="project"/>
-		<level name="Maven: ch.qos.logback:logback-classic:1.1.11" value="project"/>
-		<level name="Maven: ch.qos.logback:logback-core:1.1.11" value="project"/>
-		<level name="Maven: org.slf4j:jul-to-slf4j:1.7.25" value="project"/>
-		<level name="Maven: org.slf4j:log4j-over-slf4j:1.7.25" value="project"/>
-		<level name="Maven: org.yaml:snakeyaml:1.17" value="project"/>
-		<level name="Maven: org.springframework.boot:spring-boot-starter-tomcat:1.5.10.RELEASE" value="project"/>
-		<level name="Maven: org.apache.tomcat.embed:tomcat-embed-core:8.5.27" value="project"/>
-		<level name="Maven: org.apache.tomcat:tomcat-annotations-api:8.5.27" value="project"/>
-		<level name="Maven: org.apache.tomcat.embed:tomcat-embed-el:8.5.27" value="project"/>
-		<level name="Maven: org.apache.tomcat.embed:tomcat-embed-websocket:8.5.27" value="project"/>
-		<level name="Maven: org.hibernate:hibernate-validator:5.3.6.Final" value="project"/>
-		<level name="Maven: javax.validation:validation-api:1.1.0.Final" value="project"/>
-		<level name="Maven: org.jboss.logging:jboss-logging:3.3.1.Final" value="project"/>
-		<level name="Maven: com.fasterxml:classmate:1.3.4" value="project"/>
-		<level name="Maven: com.fasterxml.jackson.core:jackson-databind:2.8.10" value="project"/>
-		<level name="Maven: com.fasterxml.jackson.core:jackson-annotations:2.8.0" value="project"/>
-		<level name="Maven: com.fasterxml.jackson.core:jackson-core:2.8.10" value="project"/>
-		<level name="Maven: org.springframework:spring-web:4.3.14.RELEASE" value="project"/>
-		<level name="Maven: org.springframework:spring-aop:4.3.14.RELEASE" value="project"/>
-		<level name="Maven: org.springframework:spring-beans:4.3.14.RELEASE" value="project"/>
-		<level name="Maven: org.springframework:spring-webmvc:4.3.14.RELEASE" value="project"/>
-		<level name="Maven: org.springframework:spring-expression:4.3.14.RELEASE" value="project"/>
-		<level name="Maven: org.springframework.boot:spring-boot-starter-test:1.5.10.RELEASE" value="project"/>
-		<level name="Maven: org.springframework.boot:spring-boot-test:1.5.10.RELEASE" value="project"/>
-		<level name="Maven: org.springframework.boot:spring-boot-test-autoconfigure:1.5.10.RELEASE" value="project"/>
-		<level name="Maven: com.jayway.jsonpath:json-path:2.2.0" value="project"/>
-		<level name="Maven: net.minidev:json-smart:2.2.1" value="project"/>
-		<level name="Maven: net.minidev:accessors-smart:1.1" value="project"/>
-		<level name="Maven: org.ow2.asm:asm:5.0.3" value="project"/>
-		<level name="Maven: org.slf4j:slf4j-api:1.7.25" value="project"/>
-		<level name="Maven: junit:junit:4.12" value="project"/>
-		<level name="Maven: org.assertj:assertj-core:2.6.0" value="project"/>
-		<level name="Maven: org.mockito:mockito-core:1.10.19" value="project"/>
-		<level name="Maven: org.objenesis:objenesis:2.1" value="project"/>
-		<level name="Maven: org.hamcrest:hamcrest-core:1.3" value="project"/>
-		<level name="Maven: org.hamcrest:hamcrest-library:1.3" value="project"/>
-		<level name="Maven: org.skyscreamer:jsonassert:1.4.0" value="project"/>
-		<level name="Maven: com.vaadin.external.google:android-json:0.0.20131108.vaadin1" value="project"/>
-		<level name="Maven: org.springframework:spring-core:4.3.14.RELEASE" value="project"/>
-		<level name="Maven: org.springframework:spring-test:4.3.14.RELEASE" value="project"/>
-		<level name="Maven: org.springframework.boot:spring-boot-starter-jdbc:1.5.10.RELEASE" value="project"/>
-		<level name="Maven: org.apache.tomcat:tomcat-jdbc:8.5.27" value="project"/>
-		<level name="Maven: org.apache.tomcat:tomcat-juli:8.5.27" value="project"/>
-		<level name="Maven: org.springframework:spring-jdbc:4.3.14.RELEASE" value="project"/>
-		<level name="Maven: org.springframework:spring-tx:4.3.14.RELEASE" value="project"/>
-		<level name="Maven: org.springframework.boot:spring-boot-starter-data-jpa:1.5.10.RELEASE" value="project"/>
-		<level name="Maven: org.springframework.boot:spring-boot-starter-aop:1.5.10.RELEASE" value="project"/>
-		<level name="Maven: org.aspectj:aspectjweaver:1.8.13" value="project"/>
-		<level name="Maven: org.hibernate:hibernate-core:5.0.12.Final" value="project"/>
-		<level name="Maven: org.hibernate.javax.persistence:hibernate-jpa-2.1-api:1.0.0.Final" value="project"/>
-		<level name="Maven: org.javassist:javassist:3.21.0-GA" value="project"/>
-		<level name="Maven: antlr:antlr:2.7.7" value="project"/>
-		<level name="Maven: org.jboss:jandex:2.0.0.Final" value="project"/>
-		<level name="Maven: dom4j:dom4j:1.6.1" value="project"/>
-		<level name="Maven: org.hibernate.common:hibernate-commons-annotations:5.0.1.Final" value="project"/>
-		<level name="Maven: org.hibernate:hibernate-entitymanager:5.0.12.Final" value="project"/>
-		<level name="Maven: javax.transaction:javax.transaction-api:1.2" value="project"/>
-		<level name="Maven: org.springframework.data:spring-data-jpa:1.11.10.RELEASE" value="project"/>
-		<level name="Maven: org.springframework.data:spring-data-commons:1.13.10.RELEASE" value="project"/>
-		<level name="Maven: org.springframework:spring-orm:4.3.14.RELEASE" value="project"/>
-		<level name="Maven: org.slf4j:jcl-over-slf4j:1.7.25" value="project"/>
-		<level name="Maven: org.springframework:spring-aspects:4.3.14.RELEASE" value="project"/>
-		<level name="Maven: log4j:log4j:1.2.17" value="project"/>
-		<level name="Maven: net.sf.json-lib:json-lib:jdk15:2.4" value="project"/>
-		<level name="Maven: commons-beanutils:commons-beanutils:1.9.3" value="project"/>
-		<level name="Maven: commons-collections:commons-collections:3.2.2" value="project"/>
-		<level name="Maven: commons-lang:commons-lang:2.5" value="project"/>
-		<level name="Maven: commons-logging:commons-logging:1.1.1" value="project"/>
-		<level name="Maven: net.sf.ezmorph:ezmorph:1.0.6" value="project"/>
-		<level name="Maven: com.alibaba:fastjson:1.2.15" value="project"/>
-		<level name="Maven: io.jsonwebtoken:jjwt:0.6.0" value="project"/>
-		<level name="Maven: org.codehaus.jackson:jackson-core-asl:1.9.13" value="project"/>
-		<level name="Maven: org.codehaus.jackson:jackson-mapper-asl:1.9.13" value="project"/>
-		<level name="Maven: net.sf.flexjson:flexjson:2.1" value="project"/>
-		<level name="Maven: org.springframework.boot:spring-boot-starter-cache:1.5.10.RELEASE" value="project"/>
-		<level name="Maven: org.springframework:spring-context:4.3.14.RELEASE" value="project"/>
-		<level name="Maven: org.springframework:spring-context-support:4.3.14.RELEASE" value="project"/>
-		<level name="Maven: org.apache.httpcomponents:httpcore:4.4.9" value="project"/>
-		<level name="Maven: org.apache.httpcomponents:httpclient:4.5.5" value="project"/>
-		<level name="Maven: commons-codec:commons-codec:1.10" value="project"/>
-		<level name="Maven: org.apache.httpcomponents:httpmime:4.5.5" value="project"/>
-		<level name="Maven: com.alibaba:druid:1.0.26" value="project"/>
-	</levels>
-</component>

+ 0 - 265
uas-eis.userlibraries

@@ -1,265 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<eclipse-userlibraries>
-  <library name="Maven: org.springframework.boot:spring-boot-starter-web:1.5.10.RELEASE">
-    <archive path="C:/Users/UAS30/.m2/repository/org/springframework/boot/spring-boot-starter-web/1.5.10.RELEASE/spring-boot-starter-web-1.5.10.RELEASE.jar" />
-  </library>
-  <library name="Maven: org.springframework.boot:spring-boot-starter:1.5.10.RELEASE">
-    <archive path="C:/Users/UAS30/.m2/repository/org/springframework/boot/spring-boot-starter/1.5.10.RELEASE/spring-boot-starter-1.5.10.RELEASE.jar" />
-  </library>
-  <library name="Maven: org.springframework.boot:spring-boot:1.5.10.RELEASE">
-    <archive path="C:/Users/UAS30/.m2/repository/org/springframework/boot/spring-boot/1.5.10.RELEASE/spring-boot-1.5.10.RELEASE.jar" />
-  </library>
-  <library name="Maven: org.springframework.boot:spring-boot-autoconfigure:1.5.10.RELEASE">
-    <archive path="C:/Users/UAS30/.m2/repository/org/springframework/boot/spring-boot-autoconfigure/1.5.10.RELEASE/spring-boot-autoconfigure-1.5.10.RELEASE.jar" />
-  </library>
-  <library name="Maven: org.springframework.boot:spring-boot-starter-logging:1.5.10.RELEASE">
-    <archive path="C:/Users/UAS30/.m2/repository/org/springframework/boot/spring-boot-starter-logging/1.5.10.RELEASE/spring-boot-starter-logging-1.5.10.RELEASE.jar" />
-  </library>
-  <library name="Maven: ch.qos.logback:logback-classic:1.1.11">
-    <archive path="C:/Users/UAS30/.m2/repository/ch/qos/logback/logback-classic/1.1.11/logback-classic-1.1.11.jar" />
-  </library>
-  <library name="Maven: ch.qos.logback:logback-core:1.1.11">
-    <archive path="C:/Users/UAS30/.m2/repository/ch/qos/logback/logback-core/1.1.11/logback-core-1.1.11.jar" />
-  </library>
-  <library name="Maven: org.slf4j:jul-to-slf4j:1.7.25">
-    <archive path="C:/Users/UAS30/.m2/repository/org/slf4j/jul-to-slf4j/1.7.25/jul-to-slf4j-1.7.25.jar" />
-  </library>
-  <library name="Maven: org.slf4j:log4j-over-slf4j:1.7.25">
-    <archive path="C:/Users/UAS30/.m2/repository/org/slf4j/log4j-over-slf4j/1.7.25/log4j-over-slf4j-1.7.25.jar" />
-  </library>
-  <library name="Maven: org.yaml:snakeyaml:1.17">
-    <archive path="C:/Users/UAS30/.m2/repository/org/yaml/snakeyaml/1.17/snakeyaml-1.17.jar" />
-  </library>
-  <library name="Maven: org.springframework.boot:spring-boot-starter-tomcat:1.5.10.RELEASE">
-    <archive path="C:/Users/UAS30/.m2/repository/org/springframework/boot/spring-boot-starter-tomcat/1.5.10.RELEASE/spring-boot-starter-tomcat-1.5.10.RELEASE.jar" />
-  </library>
-  <library name="Maven: org.apache.tomcat.embed:tomcat-embed-core:8.5.27">
-    <archive path="C:/Users/UAS30/.m2/repository/org/apache/tomcat/embed/tomcat-embed-core/8.5.27/tomcat-embed-core-8.5.27.jar" />
-  </library>
-  <library name="Maven: org.apache.tomcat:tomcat-annotations-api:8.5.27">
-    <archive path="C:/Users/UAS30/.m2/repository/org/apache/tomcat/tomcat-annotations-api/8.5.27/tomcat-annotations-api-8.5.27.jar" />
-  </library>
-  <library name="Maven: org.apache.tomcat.embed:tomcat-embed-el:8.5.27">
-    <archive path="C:/Users/UAS30/.m2/repository/org/apache/tomcat/embed/tomcat-embed-el/8.5.27/tomcat-embed-el-8.5.27.jar" />
-  </library>
-  <library name="Maven: org.apache.tomcat.embed:tomcat-embed-websocket:8.5.27">
-    <archive path="C:/Users/UAS30/.m2/repository/org/apache/tomcat/embed/tomcat-embed-websocket/8.5.27/tomcat-embed-websocket-8.5.27.jar" />
-  </library>
-  <library name="Maven: org.hibernate:hibernate-validator:5.3.6.Final">
-    <archive path="C:/Users/UAS30/.m2/repository/org/hibernate/hibernate-validator/5.3.6.Final/hibernate-validator-5.3.6.Final.jar" />
-  </library>
-  <library name="Maven: javax.validation:validation-api:1.1.0.Final">
-    <archive path="C:/Users/UAS30/.m2/repository/javax/validation/validation-api/1.1.0.Final/validation-api-1.1.0.Final.jar" />
-  </library>
-  <library name="Maven: org.jboss.logging:jboss-logging:3.3.1.Final">
-    <archive path="C:/Users/UAS30/.m2/repository/org/jboss/logging/jboss-logging/3.3.1.Final/jboss-logging-3.3.1.Final.jar" />
-  </library>
-  <library name="Maven: com.fasterxml:classmate:1.3.4">
-    <archive path="C:/Users/UAS30/.m2/repository/com/fasterxml/classmate/1.3.4/classmate-1.3.4.jar" />
-  </library>
-  <library name="Maven: com.fasterxml.jackson.core:jackson-databind:2.8.10">
-    <archive path="C:/Users/UAS30/.m2/repository/com/fasterxml/jackson/core/jackson-databind/2.8.10/jackson-databind-2.8.10.jar" />
-  </library>
-  <library name="Maven: com.fasterxml.jackson.core:jackson-annotations:2.8.0">
-    <archive path="C:/Users/UAS30/.m2/repository/com/fasterxml/jackson/core/jackson-annotations/2.8.0/jackson-annotations-2.8.0.jar" />
-  </library>
-  <library name="Maven: com.fasterxml.jackson.core:jackson-core:2.8.10">
-    <archive path="C:/Users/UAS30/.m2/repository/com/fasterxml/jackson/core/jackson-core/2.8.10/jackson-core-2.8.10.jar" />
-  </library>
-  <library name="Maven: org.springframework:spring-web:4.3.14.RELEASE">
-    <archive path="C:/Users/UAS30/.m2/repository/org/springframework/spring-web/4.3.14.RELEASE/spring-web-4.3.14.RELEASE.jar" />
-  </library>
-  <library name="Maven: org.springframework:spring-aop:4.3.14.RELEASE">
-    <archive path="C:/Users/UAS30/.m2/repository/org/springframework/spring-aop/4.3.14.RELEASE/spring-aop-4.3.14.RELEASE.jar" />
-  </library>
-  <library name="Maven: org.springframework:spring-beans:4.3.14.RELEASE">
-    <archive path="C:/Users/UAS30/.m2/repository/org/springframework/spring-beans/4.3.14.RELEASE/spring-beans-4.3.14.RELEASE.jar" />
-  </library>
-  <library name="Maven: org.springframework:spring-webmvc:4.3.14.RELEASE">
-    <archive path="C:/Users/UAS30/.m2/repository/org/springframework/spring-webmvc/4.3.14.RELEASE/spring-webmvc-4.3.14.RELEASE.jar" />
-  </library>
-  <library name="Maven: org.springframework:spring-expression:4.3.14.RELEASE">
-    <archive path="C:/Users/UAS30/.m2/repository/org/springframework/spring-expression/4.3.14.RELEASE/spring-expression-4.3.14.RELEASE.jar" />
-  </library>
-  <library name="Maven: org.springframework.boot:spring-boot-starter-test:1.5.10.RELEASE">
-    <archive path="C:/Users/UAS30/.m2/repository/org/springframework/boot/spring-boot-starter-test/1.5.10.RELEASE/spring-boot-starter-test-1.5.10.RELEASE.jar" />
-  </library>
-  <library name="Maven: org.springframework.boot:spring-boot-test:1.5.10.RELEASE">
-    <archive path="C:/Users/UAS30/.m2/repository/org/springframework/boot/spring-boot-test/1.5.10.RELEASE/spring-boot-test-1.5.10.RELEASE.jar" />
-  </library>
-  <library name="Maven: org.springframework.boot:spring-boot-test-autoconfigure:1.5.10.RELEASE">
-    <archive path="C:/Users/UAS30/.m2/repository/org/springframework/boot/spring-boot-test-autoconfigure/1.5.10.RELEASE/spring-boot-test-autoconfigure-1.5.10.RELEASE.jar" />
-  </library>
-  <library name="Maven: com.jayway.jsonpath:json-path:2.2.0">
-    <archive path="C:/Users/UAS30/.m2/repository/com/jayway/jsonpath/json-path/2.2.0/json-path-2.2.0.jar" />
-  </library>
-  <library name="Maven: net.minidev:json-smart:2.2.1">
-    <archive path="C:/Users/UAS30/.m2/repository/net/minidev/json-smart/2.2.1/json-smart-2.2.1.jar" />
-  </library>
-  <library name="Maven: net.minidev:accessors-smart:1.1">
-    <archive path="C:/Users/UAS30/.m2/repository/net/minidev/accessors-smart/1.1/accessors-smart-1.1.jar" />
-  </library>
-  <library name="Maven: org.ow2.asm:asm:5.0.3">
-    <archive path="C:/Users/UAS30/.m2/repository/org/ow2/asm/asm/5.0.3/asm-5.0.3.jar" />
-  </library>
-  <library name="Maven: org.slf4j:slf4j-api:1.7.25">
-    <archive path="C:/Users/UAS30/.m2/repository/org/slf4j/slf4j-api/1.7.25/slf4j-api-1.7.25.jar" />
-  </library>
-  <library name="Maven: junit:junit:4.12">
-    <archive path="C:/Users/UAS30/.m2/repository/junit/junit/4.12/junit-4.12.jar" />
-  </library>
-  <library name="Maven: org.assertj:assertj-core:2.6.0">
-    <archive path="C:/Users/UAS30/.m2/repository/org/assertj/assertj-core/2.6.0/assertj-core-2.6.0.jar" />
-  </library>
-  <library name="Maven: org.mockito:mockito-core:1.10.19">
-    <archive path="C:/Users/UAS30/.m2/repository/org/mockito/mockito-core/1.10.19/mockito-core-1.10.19.jar" />
-  </library>
-  <library name="Maven: org.objenesis:objenesis:2.1">
-    <archive path="C:/Users/UAS30/.m2/repository/org/objenesis/objenesis/2.1/objenesis-2.1.jar" />
-  </library>
-  <library name="Maven: org.hamcrest:hamcrest-core:1.3">
-    <archive path="C:/Users/UAS30/.m2/repository/org/hamcrest/hamcrest-core/1.3/hamcrest-core-1.3.jar" />
-  </library>
-  <library name="Maven: org.hamcrest:hamcrest-library:1.3">
-    <archive path="C:/Users/UAS30/.m2/repository/org/hamcrest/hamcrest-library/1.3/hamcrest-library-1.3.jar" />
-  </library>
-  <library name="Maven: org.skyscreamer:jsonassert:1.4.0">
-    <archive path="C:/Users/UAS30/.m2/repository/org/skyscreamer/jsonassert/1.4.0/jsonassert-1.4.0.jar" />
-  </library>
-  <library name="Maven: com.vaadin.external.google:android-json:0.0.20131108.vaadin1">
-    <archive path="C:/Users/UAS30/.m2/repository/com/vaadin/external/google/android-json/0.0.20131108.vaadin1/android-json-0.0.20131108.vaadin1.jar" />
-  </library>
-  <library name="Maven: org.springframework:spring-core:4.3.14.RELEASE">
-    <archive path="C:/Users/UAS30/.m2/repository/org/springframework/spring-core/4.3.14.RELEASE/spring-core-4.3.14.RELEASE.jar" />
-  </library>
-  <library name="Maven: org.springframework:spring-test:4.3.14.RELEASE">
-    <archive path="C:/Users/UAS30/.m2/repository/org/springframework/spring-test/4.3.14.RELEASE/spring-test-4.3.14.RELEASE.jar" />
-  </library>
-  <library name="Maven: org.springframework.boot:spring-boot-starter-jdbc:1.5.10.RELEASE">
-    <archive path="C:/Users/UAS30/.m2/repository/org/springframework/boot/spring-boot-starter-jdbc/1.5.10.RELEASE/spring-boot-starter-jdbc-1.5.10.RELEASE.jar" />
-  </library>
-  <library name="Maven: org.apache.tomcat:tomcat-jdbc:8.5.27">
-    <archive path="C:/Users/UAS30/.m2/repository/org/apache/tomcat/tomcat-jdbc/8.5.27/tomcat-jdbc-8.5.27.jar" />
-  </library>
-  <library name="Maven: org.apache.tomcat:tomcat-juli:8.5.27">
-    <archive path="C:/Users/UAS30/.m2/repository/org/apache/tomcat/tomcat-juli/8.5.27/tomcat-juli-8.5.27.jar" />
-  </library>
-  <library name="Maven: org.springframework:spring-jdbc:4.3.14.RELEASE">
-    <archive path="C:/Users/UAS30/.m2/repository/org/springframework/spring-jdbc/4.3.14.RELEASE/spring-jdbc-4.3.14.RELEASE.jar" />
-  </library>
-  <library name="Maven: org.springframework:spring-tx:4.3.14.RELEASE">
-    <archive path="C:/Users/UAS30/.m2/repository/org/springframework/spring-tx/4.3.14.RELEASE/spring-tx-4.3.14.RELEASE.jar" />
-  </library>
-  <library name="Maven: org.springframework.boot:spring-boot-starter-data-jpa:1.5.10.RELEASE">
-    <archive path="C:/Users/UAS30/.m2/repository/org/springframework/boot/spring-boot-starter-data-jpa/1.5.10.RELEASE/spring-boot-starter-data-jpa-1.5.10.RELEASE.jar" />
-  </library>
-  <library name="Maven: org.springframework.boot:spring-boot-starter-aop:1.5.10.RELEASE">
-    <archive path="C:/Users/UAS30/.m2/repository/org/springframework/boot/spring-boot-starter-aop/1.5.10.RELEASE/spring-boot-starter-aop-1.5.10.RELEASE.jar" />
-  </library>
-  <library name="Maven: org.aspectj:aspectjweaver:1.8.13">
-    <archive path="C:/Users/UAS30/.m2/repository/org/aspectj/aspectjweaver/1.8.13/aspectjweaver-1.8.13.jar" />
-  </library>
-  <library name="Maven: org.hibernate:hibernate-core:5.0.12.Final">
-    <archive path="C:/Users/UAS30/.m2/repository/org/hibernate/hibernate-core/5.0.12.Final/hibernate-core-5.0.12.Final.jar" />
-  </library>
-  <library name="Maven: org.hibernate.javax.persistence:hibernate-jpa-2.1-api:1.0.0.Final">
-    <archive path="C:/Users/UAS30/.m2/repository/org/hibernate/javax/persistence/hibernate-jpa-2.1-api/1.0.0.Final/hibernate-jpa-2.1-api-1.0.0.Final.jar" />
-  </library>
-  <library name="Maven: org.javassist:javassist:3.21.0-GA">
-    <archive path="C:/Users/UAS30/.m2/repository/org/javassist/javassist/3.21.0-GA/javassist-3.21.0-GA.jar" />
-  </library>
-  <library name="Maven: antlr:antlr:2.7.7">
-    <archive path="C:/Users/UAS30/.m2/repository/antlr/antlr/2.7.7/antlr-2.7.7.jar" />
-  </library>
-  <library name="Maven: org.jboss:jandex:2.0.0.Final">
-    <archive path="C:/Users/UAS30/.m2/repository/org/jboss/jandex/2.0.0.Final/jandex-2.0.0.Final.jar" />
-  </library>
-  <library name="Maven: dom4j:dom4j:1.6.1">
-    <archive path="C:/Users/UAS30/.m2/repository/dom4j/dom4j/1.6.1/dom4j-1.6.1.jar" />
-  </library>
-  <library name="Maven: org.hibernate.common:hibernate-commons-annotations:5.0.1.Final">
-    <archive path="C:/Users/UAS30/.m2/repository/org/hibernate/common/hibernate-commons-annotations/5.0.1.Final/hibernate-commons-annotations-5.0.1.Final.jar" />
-  </library>
-  <library name="Maven: org.hibernate:hibernate-entitymanager:5.0.12.Final">
-    <archive path="C:/Users/UAS30/.m2/repository/org/hibernate/hibernate-entitymanager/5.0.12.Final/hibernate-entitymanager-5.0.12.Final.jar" />
-  </library>
-  <library name="Maven: javax.transaction:javax.transaction-api:1.2">
-    <archive path="C:/Users/UAS30/.m2/repository/javax/transaction/javax.transaction-api/1.2/javax.transaction-api-1.2.jar" />
-  </library>
-  <library name="Maven: org.springframework.data:spring-data-jpa:1.11.10.RELEASE">
-    <archive path="C:/Users/UAS30/.m2/repository/org/springframework/data/spring-data-jpa/1.11.10.RELEASE/spring-data-jpa-1.11.10.RELEASE.jar" />
-  </library>
-  <library name="Maven: org.springframework.data:spring-data-commons:1.13.10.RELEASE">
-    <archive path="C:/Users/UAS30/.m2/repository/org/springframework/data/spring-data-commons/1.13.10.RELEASE/spring-data-commons-1.13.10.RELEASE.jar" />
-  </library>
-  <library name="Maven: org.springframework:spring-orm:4.3.14.RELEASE">
-    <archive path="C:/Users/UAS30/.m2/repository/org/springframework/spring-orm/4.3.14.RELEASE/spring-orm-4.3.14.RELEASE.jar" />
-  </library>
-  <library name="Maven: org.slf4j:jcl-over-slf4j:1.7.25">
-    <archive path="C:/Users/UAS30/.m2/repository/org/slf4j/jcl-over-slf4j/1.7.25/jcl-over-slf4j-1.7.25.jar" />
-  </library>
-  <library name="Maven: org.springframework:spring-aspects:4.3.14.RELEASE">
-    <archive path="C:/Users/UAS30/.m2/repository/org/springframework/spring-aspects/4.3.14.RELEASE/spring-aspects-4.3.14.RELEASE.jar" />
-  </library>
-  <library name="Maven: log4j:log4j:1.2.17">
-    <archive path="C:/Users/UAS30/.m2/repository/log4j/log4j/1.2.17/log4j-1.2.17.jar" />
-  </library>
-  <library name="Maven: net.sf.json-lib:json-lib:jdk15:2.4">
-    <archive path="C:/Users/UAS30/.m2/repository/net/sf/json-lib/json-lib/2.4/json-lib-2.4-jdk15.jar" />
-  </library>
-  <library name="Maven: commons-beanutils:commons-beanutils:1.9.3">
-    <archive path="C:/Users/UAS30/.m2/repository/commons-beanutils/commons-beanutils/1.9.3/commons-beanutils-1.9.3.jar" />
-  </library>
-  <library name="Maven: commons-collections:commons-collections:3.2.2">
-    <archive path="C:/Users/UAS30/.m2/repository/commons-collections/commons-collections/3.2.2/commons-collections-3.2.2.jar" />
-  </library>
-  <library name="Maven: commons-lang:commons-lang:2.5">
-    <archive path="C:/Users/UAS30/.m2/repository/commons-lang/commons-lang/2.5/commons-lang-2.5.jar" />
-  </library>
-  <library name="Maven: commons-logging:commons-logging:1.1.1">
-    <archive path="C:/Users/UAS30/.m2/repository/commons-logging/commons-logging/1.1.1/commons-logging-1.1.1.jar" />
-  </library>
-  <library name="Maven: net.sf.ezmorph:ezmorph:1.0.6">
-    <archive path="C:/Users/UAS30/.m2/repository/net/sf/ezmorph/ezmorph/1.0.6/ezmorph-1.0.6.jar" />
-  </library>
-  <library name="Maven: com.alibaba:fastjson:1.2.15">
-    <archive path="C:/Users/UAS30/.m2/repository/com/alibaba/fastjson/1.2.15/fastjson-1.2.15.jar" />
-  </library>
-  <library name="Maven: io.jsonwebtoken:jjwt:0.6.0">
-    <archive path="C:/Users/UAS30/.m2/repository/io/jsonwebtoken/jjwt/0.6.0/jjwt-0.6.0.jar" />
-  </library>
-  <library name="Maven: org.codehaus.jackson:jackson-core-asl:1.9.13">
-    <archive path="C:/Users/UAS30/.m2/repository/org/codehaus/jackson/jackson-core-asl/1.9.13/jackson-core-asl-1.9.13.jar" />
-  </library>
-  <library name="Maven: org.codehaus.jackson:jackson-mapper-asl:1.9.13">
-    <archive path="C:/Users/UAS30/.m2/repository/org/codehaus/jackson/jackson-mapper-asl/1.9.13/jackson-mapper-asl-1.9.13.jar" />
-  </library>
-  <library name="Maven: net.sf.flexjson:flexjson:2.1">
-    <archive path="C:/Users/UAS30/.m2/repository/net/sf/flexjson/flexjson/2.1/flexjson-2.1.jar" />
-  </library>
-  <library name="Maven: org.springframework.boot:spring-boot-starter-cache:1.5.10.RELEASE">
-    <archive path="C:/Users/UAS30/.m2/repository/org/springframework/boot/spring-boot-starter-cache/1.5.10.RELEASE/spring-boot-starter-cache-1.5.10.RELEASE.jar" />
-  </library>
-  <library name="Maven: org.springframework:spring-context:4.3.14.RELEASE">
-    <archive path="C:/Users/UAS30/.m2/repository/org/springframework/spring-context/4.3.14.RELEASE/spring-context-4.3.14.RELEASE.jar" />
-  </library>
-  <library name="Maven: org.springframework:spring-context-support:4.3.14.RELEASE">
-    <archive path="C:/Users/UAS30/.m2/repository/org/springframework/spring-context-support/4.3.14.RELEASE/spring-context-support-4.3.14.RELEASE.jar" />
-  </library>
-  <library name="Maven: org.apache.httpcomponents:httpcore:4.4.9">
-    <archive path="C:/Users/UAS30/.m2/repository/org/apache/httpcomponents/httpcore/4.4.9/httpcore-4.4.9.jar" />
-  </library>
-  <library name="Maven: org.apache.httpcomponents:httpclient:4.5.5">
-    <archive path="C:/Users/UAS30/.m2/repository/org/apache/httpcomponents/httpclient/4.5.5/httpclient-4.5.5.jar" />
-  </library>
-  <library name="Maven: commons-codec:commons-codec:1.10">
-    <archive path="C:/Users/UAS30/.m2/repository/commons-codec/commons-codec/1.10/commons-codec-1.10.jar" />
-  </library>
-  <library name="Maven: org.apache.httpcomponents:httpmime:4.5.5">
-    <archive path="C:/Users/UAS30/.m2/repository/org/apache/httpcomponents/httpmime/4.5.5/httpmime-4.5.5.jar" />
-  </library>
-  <library name="Maven: com.alibaba:druid:1.0.26">
-    <archive path="C:/Users/UAS30/.m2/repository/com/alibaba/druid/1.0.26/druid-1.0.26.jar" />
-  </library>
-</eclipse-userlibraries>
-