EDCBakServiceImpl.java 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375
  1. package com.uas.eis.serviceImpl;
  2. import com.uas.eis.dao.BaseDao;
  3. import com.uas.eis.dao.SqlRowList;
  4. import com.uas.eis.entity.EquipConfig;
  5. import com.uas.eis.service.EDCBakService;
  6. import com.uas.eis.utils.Constant;
  7. import com.uas.eis.utils.DateUtil;
  8. import com.uas.eis.utils.SmbUtil;
  9. import jcifs.smb.SmbFile;
  10. import jcifs.smb.SmbFileInputStream;
  11. import org.apache.commons.lang.StringUtils;
  12. import org.apache.poi.hssf.usermodel.HSSFCell;
  13. import org.apache.poi.hssf.usermodel.HSSFWorkbook;
  14. import org.apache.poi.ss.usermodel.Sheet;
  15. import org.apache.poi.ss.usermodel.Workbook;
  16. import org.slf4j.Logger;
  17. import org.slf4j.LoggerFactory;
  18. import org.springframework.beans.factory.annotation.Autowired;
  19. import org.springframework.scheduling.annotation.Async;
  20. import org.springframework.stereotype.Service;
  21. import java.io.BufferedInputStream;
  22. import java.io.IOException;
  23. import java.io.InputStream;
  24. import java.text.SimpleDateFormat;
  25. import java.util.*;
  26. import java.util.concurrent.CountDownLatch;
  27. /**
  28. * @Author: zhouy
  29. * @Date: 2020/5/27 14:19
  30. */
  31. @Service
  32. public class EDCBakServiceImpl implements EDCBakService {
  33. private final Logger logger = LoggerFactory.getLogger(this.getClass());
  34. @Autowired
  35. private BaseDao baseDao;
  36. @Override
  37. @Async("taskExecutor")
  38. public void EDCBak(List<EquipConfig> configs, CountDownLatch countDownLatch){
  39. //查询所有的设备
  40. EquipConfig baseConfig = configs.get(0);
  41. /**
  42. * 主机相关配置
  43. * */
  44. String IP = baseConfig.getEc_ip().trim();
  45. String counterRootPath = baseConfig.getEc_counterpath().endsWith("/") ? baseConfig.getEc_counterpath() : baseConfig.getEc_counterpath()+"/";
  46. String dataRootPath = baseConfig.getEc_datapath().endsWith("/") ? baseConfig.getEc_datapath() : baseConfig.getEc_datapath()+"/";
  47. String counterbakRootPath = baseConfig.getEc_counterbak().endsWith("/") ? baseConfig.getEc_counterbak() : baseConfig.getEc_counterbak()+"/";
  48. String uploadRootPath = baseConfig.getEc_databak();
  49. logger.info(" matchIP:"+IP+" start;");
  50. //检测是否连接成功
  51. SmbFile smbFile = SmbUtil.getRootFile(IP,counterRootPath);
  52. try {
  53. smbFile.connect();
  54. } catch (Exception e) {
  55. baseDao.execute("insert into EDCsyscfaillog(el_id,el_ip,el_devcode,el_teststep,el_synctime,el_reason) values(EDCsyscfaillog_seq.nextval,'"+IP+"','','',sysdate,'"+e.getMessage()+",连接超时')");
  56. logger.info(IP+" 连接失败;"+e.getMessage());
  57. return;
  58. }finally {
  59. countDownLatch.countDown();
  60. }
  61. String counterpath = "";
  62. try {
  63. for(EquipConfig config : configs){
  64. String testStep = config.getEd_teststep();
  65. String devcode = config.getEd_devcode();
  66. List<Map<String, Object>> lists=baseDao.getJdbcTemplate().queryForList("SELECT * FROM (SELECT * FROM DATACENTER$MESTEMP WHERE EQPCODE_='"+devcode+"' AND TAB_ ='"+testStep+"' and turn_=0 AND nvl(fail,0)=0 ORDER BY CHIPCODE_,OBJECT_RRN ASC ) WHERE ROWNUM <= 50");
  67. logger.info(" matchIP:"+IP+","+testStep+" start;");
  68. logger.info(" matchIP:"+IP+","+testStep+" 待归档数:"+lists.size());
  69. if(lists.size()>0){
  70. try {
  71. /**相关路径匹配*/
  72. if(smbFile !=null) {
  73. SmbFile dataFile = SmbUtil.getCurrentFile(IP,dataRootPath);
  74. List <SmbFile> files = SmbUtil.getChildFiles(dataFile, testStep, "xls");
  75. List <SmbFile> files1 = SmbUtil.getChildFiles(dataFile, testStep, "jdf");
  76. List <SmbFile> files2 = SmbUtil.getChildFiles(dataFile, testStep, "njdf");
  77. for(Map<String, Object> map : lists) {
  78. //Counter文件匹配
  79. counterpath = String.valueOf(map.get("COUNTERPATH_"));
  80. final String filename = counterpath.substring(counterpath.lastIndexOf("\\")+1);
  81. smbFile = SmbUtil.getCurrentFile(IP,counterbakRootPath+filename);
  82. map.put("COUNTERPATH_", smbFile.getPath());
  83. Optional<SmbFile> optional = files.stream().filter(file -> mappingSuccess(filename,file.getDate())).findFirst();
  84. //遍历到了对应的Data文件存在
  85. if (optional.isPresent()){
  86. map.put("DATAPATH_", optional.get().getPath());
  87. }
  88. optional = files1.stream().filter(file -> mappingSuccess(filename,file.getDate())).findFirst();
  89. //遍历到了对应的Data文件存在
  90. if (optional.isPresent()){
  91. map.put("JDFPATH_", optional.get().getPath());
  92. }
  93. optional = files2.stream().filter(file -> mappingSuccess(filename,file.getDate())).findFirst();
  94. if (optional.isPresent()){
  95. map.put("JDFPATH_", optional.get().getPath());
  96. }
  97. }
  98. }
  99. } catch (Exception e) {
  100. baseDao.execute("insert into EDCsyscfaillog(el_id,el_ip,el_devcode,el_teststep,el_synctime,el_reason) values(EDCsyscfaillog_seq.nextval,'"+IP+"','"+devcode+"','"+testStep+"',sysdate,'"+e.getMessage()+"')");
  101. e.printStackTrace();
  102. if(e.getMessage().equals("Plain text passwords are disabled")){
  103. continue;
  104. }
  105. }
  106. }
  107. else{
  108. logger.info(" matchIP:"+IP+","+testStep+"未匹配有效文件");
  109. continue;
  110. }
  111. List<String> Sqls = new ArrayList<String>();
  112. //匹配到JDF文件或者Data
  113. List<Map<String, Object>> datalist=new ArrayList<>();
  114. for(Map<String,Object> map : lists){
  115. if(map.get("DATAPATH_")!=null||map.get("JDFPATH_")!=null){
  116. datalist.add(map);
  117. }else {
  118. String chipcode=map.get("CHIPCODE_").toString();
  119. String ID=map.get("OBJECT_RRN").toString();
  120. baseDao.execute("insert into EDCsyscfaillog(el_id,el_ip,el_devcode,el_teststep,el_synctime,el_chipcode,el_reason) values(EDCsyscfaillog_seq.nextval,'"+IP+"','"+devcode+"','"+testStep+"',sysdate,'"+chipcode+"','未匹配到对应JDF文件,无法归档')");
  121. baseDao.execute("update datacenter$mestemp set fail=-1 where OBJECT_RRN="+ID);
  122. }
  123. }
  124. logger.info(" matchIP:"+IP+","+testStep+" 匹配数:"+datalist.size());
  125. baseDao.execute("insert into SYS_SCHEDULETASKLOG(date_,remark_,scheduleid_) values"
  126. + "(sysdate,'执行开始:IP"+IP+"设备"+devcode+"匹配到数量"+datalist.size()+"',7042)");
  127. //未设置备份文件夹时记录日志
  128. if(uploadRootPath==null)
  129. {
  130. baseDao.execute("insert into EDCsyscfaillog(el_id,el_ip,el_devcode,el_teststep,el_synctime,el_reason) values(EDCsyscfaillog_seq.nextval,'"+IP+"','"+devcode+"','"+testStep+"',sysdate,'BackUp文件夹未设置,请检查终端设置')");
  131. continue;
  132. }
  133. /**
  134. * 文件归档开始
  135. * */
  136. String dataPath_ = "";
  137. String counterPath_ = "";
  138. String jdfPath_="";
  139. String currentUploadPath = getUploadPath(uploadRootPath+"/");
  140. String centerUploadPath = getUploadPath(SmbUtil.centerPath+devcode+"/");
  141. SmbFile counterFile = null;
  142. SmbFile dataFile = null;
  143. SmbFile jdfFile = null;
  144. String currentKind = null;
  145. SmbFile counterBaKFile = null;
  146. SmbFile dataBakFile = null;
  147. SmbFile jdfBakFile = null;
  148. SmbFile counterCenterFile = null;
  149. SmbFile dataCenterFile = null;
  150. SmbFile jdfCenterFile = null;
  151. List<Object> IDS = new ArrayList<>();
  152. for(Map<String,Object> map : datalist){
  153. logger.info(map.get("CHIPCODE_")+"开始");
  154. counterPath_ = String.valueOf(map.get("COUNTERPATH_"));
  155. dataPath_ = String.valueOf(map.get("DATAPATH_"));
  156. jdfPath_ = String.valueOf(map.get("JDFPATH_"));
  157. try {
  158. currentKind = map.get("PART_NAME")+"-"+map.get("MAKE_LOT");
  159. String path1=""; //数据中心Counter文件
  160. String path2=""; //数据中心Data文件
  161. String path3=""; //本地Counter备份文件
  162. String path4=""; //本地Data备份文件
  163. String path5=""; //数据中心JDF文件
  164. String path6=""; //本地JDF文件
  165. //判断本机文件夹是否存在,不存在创建
  166. if(!SmbUtil.getCurrentFile(IP,currentUploadPath+currentKind+"/").exists()){
  167. SmbUtil.getCurrentFile(IP,currentUploadPath+(currentKind+"/SJ/")).mkdirs();
  168. SmbUtil.getCurrentFile(IP,currentUploadPath+(currentKind+"/FP/")).mkdirs();
  169. }
  170. //判断文件服务器文件夹是否存在,不存在创建
  171. if(!SmbUtil.getCurrentFile(SmbUtil.centerIP,centerUploadPath+currentKind+"/").exists()){
  172. SmbUtil.getCurrentFile(SmbUtil.centerIP,centerUploadPath+(currentKind+"/SJ/")).mkdirs();
  173. SmbUtil.getCurrentFile(SmbUtil.centerIP,centerUploadPath+(currentKind+"/FP/")).mkdirs();
  174. }
  175. //处理Counter文件
  176. counterFile = SmbUtil.getCurrentFile(counterPath_);
  177. counterCenterFile = SmbUtil.getCurrentFile(SmbUtil.centerIP,centerUploadPath+currentKind+"/FP/"+map.get("CHIPCODE_")+".xls");
  178. /**
  179. * counter文件 文件服务器归档
  180. * */
  181. counterFile.copyTo(counterCenterFile);
  182. counterBaKFile = SmbUtil.getCurrentFile(IP,currentUploadPath+currentKind+"/FP/"+map.get("CHIPCODE_")+".xls");
  183. int Count=1;
  184. while (counterBaKFile.exists()){
  185. String filename= counterBaKFile.getName();
  186. String name = filename.substring(0,filename.indexOf("."));
  187. String newFilename = name+"("+Count+")";
  188. counterBaKFile=SmbUtil.getCurrentFile(IP,currentUploadPath+currentKind+"/FP/"+newFilename+".xls");
  189. }
  190. path1=counterCenterFile.getPath();
  191. path3=counterBaKFile.getPath();
  192. /**
  193. * 本机counter文件移到本机归档目录当前目录删除
  194. * */
  195. counterFile.copyTo(counterBaKFile);
  196. counterFile.delete();
  197. //存在Data文件
  198. if(map.get("DATAPATH_")!=null){
  199. dataFile = SmbUtil.getCurrentFile(dataPath_);
  200. dataCenterFile = SmbUtil.getCurrentFile(SmbUtil.centerIP,centerUploadPath+currentKind+"/SJ/"+map.get("CHIPCODE_")+".xls");
  201. /**
  202. * data文件 文件服务器归档
  203. * */
  204. dataFile.copyTo(dataCenterFile);
  205. dataBakFile = SmbUtil.getCurrentFile(IP,currentUploadPath+currentKind+"/SJ/"+map.get("CHIPCODE_")+".xls");
  206. while (dataBakFile.exists()){
  207. String filename= dataBakFile.getName();
  208. String name = filename.substring(0,filename.indexOf("."));
  209. String newFilename = name+"("+Count+")";
  210. dataBakFile=SmbUtil.getCurrentFile(IP,currentUploadPath+currentKind+"/SJ/"+newFilename+".xls");
  211. }
  212. path2=dataCenterFile.getPath();
  213. path4=dataBakFile.getPath();
  214. /**
  215. * 本机data文件移到本机归档目录当前目录删除
  216. * */
  217. dataFile.copyTo(dataBakFile);
  218. dataFile.delete();
  219. }else{
  220. dataCenterFile = SmbUtil.getCurrentFile(SmbUtil.centerIP,centerUploadPath+currentKind+"/SJ/"+map.get("CHIPCODE_")+".xls");
  221. dataBakFile = SmbUtil.getCurrentFile(IP,currentUploadPath+currentKind+"/SJ/"+map.get("CHIPCODE_")+".xls");
  222. path2=dataCenterFile.getPath();
  223. path4=dataBakFile.getPath();
  224. }
  225. //如果存在JDF文件
  226. if(map.get("JDFPATH_")!=null){
  227. String filesuffix=".jdf";
  228. if(map.get("JDFPATH_").toString().contains("njdf")){
  229. filesuffix=".njdf";
  230. }
  231. jdfFile = SmbUtil.getCurrentFile(jdfPath_);
  232. jdfCenterFile = SmbUtil.getCurrentFile(SmbUtil.centerIP,centerUploadPath+currentKind+"/SJ/"+map.get("CHIPCODE_")+filesuffix);
  233. jdfFile.copyTo(jdfCenterFile);
  234. jdfBakFile = SmbUtil.getCurrentFile(IP,currentUploadPath+currentKind+"/SJ/"+map.get("CHIPCODE_")+filesuffix);
  235. while (jdfBakFile.exists()){
  236. String filename= jdfBakFile.getName();
  237. String name = filename.substring(0,filename.indexOf("."));
  238. String suffix = filename.substring(filename.lastIndexOf("."));
  239. String newFilename = name+"("+Count+")";
  240. jdfBakFile=SmbUtil.getCurrentFile(IP,currentUploadPath+currentKind+"/SJ/"+newFilename+filesuffix);
  241. }
  242. path5=jdfCenterFile.getPath();
  243. path6=jdfBakFile.getPath();
  244. jdfFile.copyTo(jdfBakFile);
  245. jdfFile.delete();
  246. }
  247. //数据中心归档
  248. Sqls.add("MERGE INTO DATACENTER$CHIP A USING (SELECT CHIPCODE_, OBJECT_RRN, PART_NAME, TEST_LOT, MAKE_LOT,CREATEDATE_ FROM DATACENTER$MESTEMP WHERE OBJECT_RRN = "+map.get("OBJECT_RRN")+") B ON (A.CHIPCODE_= B.CHIPCODE_) " +
  249. " WHEN MATCHED THEN UPDATE SET A.OBJECT_RRN = B.OBJECT_RRN ,A.PART_NAME = B.PART_NAME, A.TEST_LOT = B.TEST_LOT , A.MAKE_LOT = B.MAKE_LOT " +
  250. " WHEN NOT MATCHED THEN INSERT (COUNTERPATH_, DATAPATH_ ,LOCALCOUNTERPATH_ , LOCALDATAPATH_,JDFPATH_,LOCALJDFPATH_,ID_, CHIPCODE_, OBJECT_RRN , PART_NAME ,TEST_LOT, MAKE_LOT,TESTDATE_,DATE_) VALUES ("+
  251. " '"+path1+"','"+path2+"','"+path3+"','"+path4+"','"+path5+"','"+path6+"',DATACENTERCHIP_SEQ.NEXTVAL, B.CHIPCODE_,B.OBJECT_RRN,B.PART_NAME,B.TEST_LOT,B.MAKE_LOT,B.CREATEDATE_,SYSDATE)"
  252. );
  253. IDS.add(map.get("OBJECT_RRN"));
  254. logger.info(map.get("CHIPCODE_")+"结束");
  255. } catch (Exception e) {
  256. baseDao.execute("insert into EDCsyscfaillog(el_id,el_ip,el_devcode,el_teststep,el_synctime,el_reason) values(EDCsyscfaillog_seq.nextval,'"+IP+"','"+devcode+"','"+testStep+"',sysdate,'"+e.getMessage()+"')");
  257. e.printStackTrace();
  258. }
  259. }
  260. if(IDS.size() > 0){
  261. Sqls.add("UPDATE DATACENTER$MESTEMP SET TURN_=-1 WHERE OBJECT_RRN IN ("+ StringUtils.join(IDS,",") +")");
  262. baseDao.execute(Sqls);
  263. }
  264. //同步做COUNTER文件解析
  265. SqlRowList rs1=baseDao.queryForRowSet("select chipcode_ from DATACENTER$CHIP left join CHIP_EDC_RECORD on DATACENTER$CHIP.CHIPCODE_=CHIP_EDC_RECORD.CER_CHIPCODE where CER_CHIPCODE is null");
  266. while(rs1.next()){
  267. AnalysisCounterData(rs1.getString("chipcode_"));
  268. }
  269. }
  270. } catch (Exception e){
  271. e.printStackTrace();
  272. logger.info(IP+" 操作失败;");
  273. }finally {
  274. countDownLatch.countDown();
  275. }
  276. logger.info(" matchIP:"+IP+" end;");
  277. }
  278. private boolean mappingSuccess(String fileName , Long time) {
  279. boolean match=false;
  280. //时间在同一分钟改的可以匹配
  281. if(fileName.substring(2).startsWith(DateUtil.format(new Date(time), Constant.YMDHM))){
  282. match=true;
  283. }else
  284. {
  285. long time1=10*1000;
  286. //如果时间不在同一分钟则直接加10秒再匹配
  287. if(fileName.substring(2).startsWith(DateUtil.format(new Date(time+time1), Constant.YMDHM))) {
  288. match=true;
  289. }else if(fileName.substring(2).startsWith(DateUtil.format(new Date(time-time1), Constant.YMDHM)))
  290. {
  291. match=true;
  292. }
  293. }
  294. return match;
  295. }
  296. private String getUploadPath(String uploadRootPath) {
  297. String[] dateStr = new SimpleDateFormat("yyyy-MM-dd").format(new Date()).toString().split("-");
  298. return String.format("%s/%s/%s/%s/", uploadRootPath, dateStr[0], dateStr[0]+dateStr[1],
  299. dateStr[0]+dateStr[1]+dateStr[2] );
  300. }
  301. //解析Counter文件
  302. public Object AnalysisCounterData(String chip_code){
  303. SqlRowList rs=baseDao.queryForRowSet("select counterpath_ from datacenter$chip where chipcode_='"+chip_code+"' order by id_ desc");
  304. Object cer_id=null;
  305. if(rs.next()){
  306. try{
  307. String FilePath=rs.getString("counterpath_");
  308. //打开文件流
  309. SmbFile smbFile = SmbUtil.getCurrentFile(FilePath);
  310. InputStream is = new BufferedInputStream(new SmbFileInputStream(smbFile));
  311. Workbook book = new HSSFWorkbook(is);
  312. cer_id=baseDao.getSeqId("CHIP_EDC_RECORD_SEQ");
  313. Sheet st=book.getSheet("Measure");
  314. //测试日期
  315. Object test_Date= st.getRow(2).getCell(1).getStringCellValue();
  316. //测试站位
  317. String test_Station= st.getRow(3).getCell(1).getStringCellValue();
  318. //测试文件名
  319. String test_FileName=st.getRow(4).getCell(1).getStringCellValue();
  320. //设备名称
  321. String test_DeviceName = st.getRow(5).getCell(1).getStringCellValue();
  322. StringBuffer sql=new StringBuffer();
  323. //插入主表记录
  324. sql.append("insert into CHIP_EDC_RECORD(cer_id,cer_testdate,cer_chipcode,cer_indate,cer_station,cer_spec,cer_device,cer_testfilename,cer_lot,");
  325. sql.append("cer_operator,cer_comment) values('"+cer_id+"',to_date('"+test_Date+"','yyyy mm dd hh24 mi ss'),'"+chip_code+"',sysdate,'"+test_Station+"','"+test_FileName.split("-")[0]+"',");
  326. sql.append("'"+test_DeviceName+"','"+test_FileName+"','"+chip_code.split("#")[0]+"','','');");
  327. //循环详细的测试内容,从11行最后一行
  328. for (int i=11;i<=st.getLastRowNum();i++){
  329. double cerd_itemdetno= st.getRow(i).getCell(0).getNumericCellValue();
  330. String cerd_itemname = st.getRow(i).getCell(1).getStringCellValue();
  331. double cred_testnum = st.getRow(i).getCell(2).getNumericCellValue();
  332. double cerd_failnum= st.getRow(i).getCell(3).getNumericCellValue();
  333. Object cerd_precent = "''";
  334. if(st.getRow(i).getCell(4)!=null) {
  335. switch (st.getRow(i).getCell(4).getCellType()) {
  336. case HSSFCell.CELL_TYPE_NUMERIC:
  337. cerd_precent = st.getRow(i).getCell(4).getNumericCellValue();
  338. break;
  339. case HSSFCell.CELL_TYPE_STRING:
  340. cerd_precent = st.getRow(i).getCell(4).getStringCellValue();
  341. break;
  342. }
  343. }
  344. sql.append("insert into CHIP_EDC_RECORDDet(cerd_id,cerd_cerid,cerd_itemdetno,cerd_itemname,cerd_precent,cred_testnum,cerd_failnum)");
  345. sql.append("values(CHIP_EDC_RECORDDet_SEQ.nextval,'"+cer_id+"','"+cerd_itemdetno+"','"+cerd_itemname+"',"+cerd_precent+","+cred_testnum+","+cerd_failnum+");");
  346. }
  347. baseDao.execute("begin "+sql.toString()+" end;");
  348. }catch (Exception e){
  349. e.printStackTrace();
  350. }
  351. }
  352. return cer_id;
  353. }
  354. }