FileParseServiceImpl.java 9.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174
  1. package com.uas.eis.serviceImpl;
  2. import com.uas.eis.dao.BaseDao;
  3. import com.uas.eis.entity.DataChipTestLog;
  4. import com.uas.eis.service.FileParseService;
  5. import com.uas.eis.utils.FTPUtil;
  6. import org.apache.commons.net.ftp.FTPClient;
  7. import org.apache.poi.ss.usermodel.Row;
  8. import org.apache.poi.ss.usermodel.Sheet;
  9. import org.apache.poi.ss.usermodel.Workbook;
  10. import org.apache.poi.ss.usermodel.WorkbookFactory;
  11. import org.slf4j.Logger;
  12. import org.slf4j.LoggerFactory;
  13. import org.springframework.beans.factory.annotation.Autowired;
  14. import org.springframework.scheduling.annotation.Async;
  15. import org.springframework.stereotype.Service;
  16. import java.io.BufferedInputStream;
  17. import java.io.InputStream;
  18. import java.util.ArrayList;
  19. import java.util.List;
  20. import java.util.concurrent.CountDownLatch;
  21. @Service
  22. public class FileParseServiceImpl implements FileParseService {
  23. private final Logger logger = LoggerFactory.getLogger(getClass());
  24. @Autowired
  25. private BaseDao baseDao;
  26. @Override
  27. @Async("taskExecutor")
  28. public void EDCDataDeal(DataChipTestLog dataChipTestLog, CountDownLatch countDownLatch) {
  29. String TableName = "DATA$" + dataChipTestLog.getLot_id().replace("-","_");
  30. FTPClient ftpClient = null;
  31. InputStream ftpInputStream = null;
  32. Workbook workBook = null;
  33. Sheet workSheet =null;
  34. try {
  35. this.logger.info(new StringBuilder().append(dataChipTestLog.getWafer_id()).append("Data文件解析开始").toString());
  36. String FilePath = extractFilePath(dataChipTestLog.getData_path());
  37. ftpClient = FTPUtil.getFTPClient();
  38. System.out.println("开始下载文件:" + FilePath+";文件是否存在:"+FTPUtil.exists(ftpClient, FilePath));
  39. if (ftpClient != null && FTPUtil.exists(ftpClient, FilePath)) {
  40. ftpInputStream = new BufferedInputStream(FTPUtil.readFileAsStream(ftpClient, FilePath));
  41. workBook = WorkbookFactory.create(ftpInputStream);
  42. workSheet = workBook.getSheetAt(0);
  43. int labelIndex = 13;
  44. int dataStart = 23;
  45. Row labelRow = workSheet.getRow(labelIndex);
  46. List items = new ArrayList();
  47. for (int i = 0; i < labelRow.getPhysicalNumberOfCells(); i++) {
  48. items.add(labelRow.getCell(i)!=null?labelRow.getCell(i).getStringCellValue(): "");
  49. }
  50. List itemCols = new ArrayList();
  51. for (int j = 0; j < items.size(); j++) {
  52. itemCols.add(new StringBuilder().append("ITEM").append(j + 1).toString());
  53. }
  54. List sqls = new ArrayList();
  55. sqls.add(new StringBuilder().append("DELETE FROM ").append(TableName).append("@SHENAI_EDCDATA WHERE WAFER_ID='").append(dataChipTestLog.getWafer_id()).append("'").toString());
  56. int allRow = workSheet.getLastRowNum() - (dataStart - 1);
  57. int a = allRow / 3000;
  58. int b = allRow % 3000;
  59. StringBuffer detailBuffer = new StringBuffer();
  60. String dynamicCols = String.join(",", itemCols);
  61. String ValueSql = "";
  62. String cellValue = "";
  63. Row dataRow = null;
  64. if (a > 0) {
  65. for (int i = 0; i < a; i++) {
  66. detailBuffer.setLength(0);
  67. for (int k = i * 3000; k < (i + 1) * 3000; k++) {
  68. 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("('")
  69. .append(dataChipTestLog.getWafer_id()).append("',").append(k).append(",").append((k==0?0:1)).append(",").toString());
  70. ValueSql = "";
  71. dataRow = workSheet.getRow(k + dataStart);
  72. if(dataRow.getCell(0).toString().startsWith("F")){
  73. detailBuffer.append("1").toString();
  74. }else {
  75. detailBuffer.append("0").toString();
  76. }
  77. for (int m = 0; m < items.size(); m++) {
  78. cellValue = dataRow.getCell(m).getStringCellValue();
  79. ValueSql = new StringBuilder().append(ValueSql).append(cellValue != null ? new StringBuilder().append("'").append(cellValue.trim()).append("'").toString() : "''").toString();
  80. if (m < items.size() - 1) {
  81. ValueSql = new StringBuilder().append(ValueSql).append(",").toString();
  82. }
  83. }
  84. detailBuffer.append(new StringBuilder().append(",").append(ValueSql).append(");").toString());
  85. }
  86. sqls.add(new StringBuilder().append(" BEGIN ").append(detailBuffer.toString()).append(" END;").toString());
  87. }
  88. }
  89. if (b > 0) {
  90. detailBuffer.setLength(0);
  91. for (int k = 0; k < b; k++) {
  92. 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("('")
  93. .append(dataChipTestLog.getWafer_id()).append("',").append(a * 3000 + k).append(",").append((k==0?0:1)).append(","));
  94. ValueSql = "";
  95. dataRow = workSheet.getRow(a * 3000 + k + dataStart);
  96. if(dataRow.getCell(0).toString().startsWith("F")){
  97. detailBuffer.append("1").toString();
  98. }else {
  99. detailBuffer.append("0").toString();
  100. }
  101. for (int m = 0; m < items.size(); m++) {
  102. cellValue = dataRow.getCell(m).getStringCellValue();
  103. ValueSql = new StringBuilder().append(ValueSql).append(cellValue != null ? new StringBuilder().append("'").append(cellValue.trim()).append("'").toString() : "''").toString();
  104. if (m < items.size() - 1) {
  105. ValueSql = new StringBuilder().append(ValueSql).append(",").toString();
  106. }
  107. }
  108. detailBuffer.append(new StringBuilder().append(",").append(ValueSql).append(");").toString());
  109. }
  110. sqls.add(new StringBuilder().append("BEGIN ").append(detailBuffer.toString()).append(" END;").toString());
  111. }
  112. this.baseDao.getJdbcTemplate().batchUpdate((String[]) sqls.toArray(new String[sqls.size()]));
  113. StringBuilder endBuilder = new StringBuilder().append("BEGIN ").append("UPDATE DATACENTER$MESFILE SET DEALSTATE_=1,DEALTIME_=SYSDATE WHERE DBID_=").
  114. append(dataChipTestLog.getDbid_()).append("; ");
  115. endBuilder.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_) 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_ " +
  116. "FROM DATACENTER$MESFILE WHERE DBID_="+dataChipTestLog.getDbid_()+" AND DATACENTER$MESFILE.WAFER_ID NOT IN (SELECT WAFER_ID FROM chip$file WHERE WAFER_ID='"+dataChipTestLog.getWafer_id()+"' ); ");
  117. endBuilder.append("INSERT INTO chip$data$log (WAFER_ID,ID_) SELECT '"+dataChipTestLog.getWafer_id()+"',CHIP$DATA$LOG_SEQ.NEXTVAL FROM DUAL; END;");
  118. this.baseDao.execute(endBuilder.toString());
  119. }
  120. } catch (Exception e) {
  121. this.logger.error(new StringBuilder().append("Exception:芯片号:").append(dataChipTestLog.getWafer_id()).toString(), e);
  122. e.printStackTrace();
  123. this.baseDao.execute(new StringBuilder().append("UPDATE DATACENTER$MESFILE SET DEALSTATE_=-99 , DEALTIME_=SYSDATE WHERE DBID_=").append(dataChipTestLog.getDbid_()).toString());
  124. } finally {
  125. try {
  126. if (workBook != null) workBook.close();
  127. } catch (Exception ex) {
  128. logger.error("关闭workBook失败", ex);
  129. }
  130. try {
  131. if (ftpInputStream != null) ftpInputStream.close();
  132. } catch (Exception ex) {
  133. logger.error("关闭FTP流失败", ex);
  134. }
  135. try {
  136. if (ftpClient != null) {
  137. ftpClient.logout();
  138. ftpClient.disconnect();
  139. }
  140. } catch (Exception ex) {
  141. logger.error("释放FTP连接失败", ex);
  142. }
  143. countDownLatch.countDown();
  144. }
  145. }
  146. @Override
  147. public void EDCCounterDeal(List<String> codes) {
  148. }
  149. private String extractFilePath(String ftpUrl) {
  150. if (ftpUrl == null || ftpUrl.isEmpty()) {
  151. return null;
  152. }
  153. // 查找 ftp:// 的位置
  154. int protocolIndex = ftpUrl.indexOf("ftp://");
  155. if (protocolIndex == -1) {
  156. // 不是FTP URL,直接返回原路径
  157. return ftpUrl;
  158. }
  159. int pathStartIndex = ftpUrl.indexOf("/", protocolIndex + 6);
  160. if (pathStartIndex == -1) {
  161. // 没有路径部分,返回根目录
  162. return "/";
  163. }
  164. return "/home/mes"+ftpUrl.substring(pathStartIndex).trim();
  165. }
  166. }