package com.shlanbao.tzsc.data.runtime.handler; import java.util.ArrayList; import java.util.Hashtable; import java.util.Iterator; import java.util.LinkedList; import java.util.List; import java.util.Map; import java.util.Queue; import org.apache.log4j.Logger; import com.lanbao.dac.data.CommonData; import com.shlanbao.tzsc.utils.tools.MathUtil; import com.shlanbao.tzsc.utils.tools.StringUtil; /** * 设备故障停机时间和次数统计 * @author luo * */ public class FaultDataCalc extends Thread{ private static FaultDataCalc fauleData; //private static Hashtable gd_Compile; //保存当前设备运行的班次,来源于DAC采集数据 private Hashtable currentEqpShift=new Hashtable();; private Queue> queue = new LinkedList>(); private Logger log = Logger.getLogger(this.getClass()); //实例化 public static FaultDataCalc getInstance() { if (fauleData == null) { fauleData = new FaultDataCalc(); /*try{ //如果初始化错误,则new一个对象 gd_Compile=ConfigUtil.readTxtFile(); }catch(Exception e){ gd_Compile=new Hashtable(); }*/ } return fauleData; } public Hashtable getCurrentEqpShift() { return currentEqpShift; } public void setCurrentEqpShift(Hashtable currentEqpShift) { this.currentEqpShift = currentEqpShift; } public Queue> getQueue() { return queue; } public void setQueue(Queue> queue) { this.queue = queue; } @Override public void run(){ while(queue.peek()!=null){ Map dataMap=queue.poll(); if(dataMap!=null && dataMap.size()>0){ setFauleData(dataMap); } } } //汇总故障数据 public void setFauleData(Map dataMap){ int equipmentID=0; try{ equipmentID = Integer.valueOf(dataMap.get("EquipmentID").getVal());//设备 String type = dataMap.get("TYPE").getVal().toString(); String shiftId = dataMap.get("SHIFTINFO").getVal().toString(); if(equipmentID<1||type.equals("null")||shiftId.equals("null")){ log.info("设备Code:"+equipmentID+",设备类型:"+type+",班次:"+shiftId); }else if(type.toUpperCase().equals("ZJ17")){ //设备类型判断必须要与DAC一致 //String[] fauleDetail=new String[3]; StringBuffer[] fauleDetail = new StringBuffer[3]; //卷烟机 //卷烟机85-114点位为故障点位,其中3个为一组。例如85:故障名称,86:停机时长(停机时长格式为01:50,需转换成Integer),87:停机次数 for(int i=85;i<115;i=i+3){ for(int j=0;j<3;j++){ if(fauleDetail[j]!=null){ fauleDetail[j].setLength(0); }else{ fauleDetail[j] = new StringBuffer(); } CommonData data=dataMap.get(String.valueOf(i+j)); if(data!=null){ String val=data.getVal(); if(val!=null&&StringUtil.notNull(val)&&!val.equals("null")){ fauleDetail[j].append(val.trim()); }else{ break; } } } if(fauleDetail[0]==null||fauleDetail[1]==null||fauleDetail[2]==null||fauleDetail[0].equals("0")){ continue; } try{ String[] time=fauleDetail[1].toString().split(":"); if(time.length==2){ fauleDetail[1].setLength(0); fauleDetail[1].append(String.valueOf((Integer.parseInt(time[1])+Integer.parseInt(time[0])*60))); setFaultByEqpId(String.valueOf(equipmentID), fauleDetail[0].toString(), fauleDetail[2].toString(), fauleDetail[1].toString(),shiftId.trim()); } }catch(Exception ex){ log.info("设备Code:"+equipmentID+",故障名称:"+fauleDetail[0]+",故障时间:"+fauleDetail[1]+",故障次数:"+fauleDetail[2]); } } }else if(type.toUpperCase().equals("ZB25")){ //ZB25包装机 故障内容保存在8号点位表中 CommonData data=dataMap.get("8"); if(data!=null&&data.getVal()!=null&&StringUtil.notNull(data.getVal().trim())&&!data.getVal().trim().equals("null")){ String faultString=data.getVal().trim(); String[] fault=null; if(faultString.indexOf("&")>0){ fault=data.getVal().split("&"); }else{ fault=new String[]{faultString}; } for(String temp:fault){ String[] fauleDetail=temp.split(":"); if(fauleDetail.length!=3){ continue; } String name=StringUtil.notNull(fauleDetail[0])?fauleDetail[0].trim():""; //由于包装机上传的停机时长单位是秒,所以包装机需要除以60 double faultTime=MathUtil.roundHalfUp(Double.parseDouble(fauleDetail[1].trim())/60.00,2); setFaultByEqpId(String.valueOf(equipmentID), name, fauleDetail[2].trim(), String.valueOf(faultTime),shiftId.trim()); } } }else if(type.toUpperCase().equals("ZJ19")){ //待开发... log.info("ZJ19故障信息(没有点表)未开发"); }else if(type.toUpperCase().equals("ZB45")){ //待开发... log.info("ZB45故障信息(没有点表)未开发"); }else if(type.toUpperCase().equals("PROTOS 70")){ //待开发... log.info("PROTOS 70故障信息(没有点表)未开发"); } currentEqpShift.put(equipmentID, shiftId); }catch(Exception ex){ log.error("设备ID:"+equipmentID+"故障统计出错",ex); } } /** * 跟新设备故障 * @param eid 设备ID * @param faultName 故障名称 * @param fauleNumber 故障发生次数 * @param fauleTime 故障发生时长 * @param shiftId 班次ID */ public void setFaultByEqpId(String eid,String faultName,String fauleNumber,String fauleTime,String shiftId){ if(StringUtil.notNull(eid)&&StringUtil.notNull(faultName)&&StringUtil.notNull(fauleNumber)&&StringUtil.notNull(fauleTime)&&StringUtil.notNull(shiftId)){ //后去当前设备的班次 String oldShift=currentEqpShift.get(eid); //如果当前设备在一个班次上运行,并且当前运行的班次和DAC传过来的班次不一致,则清空当前设备的故障信息 if(StringUtil.notNull(oldShift)&&!oldShift.equals(shiftId)){ //保存换班前的数据,然后remove this.removeFaultListByEid(eid); } Hashtable> ht=NeedData.getInstance().getFaultHt(); Hashtable eqpHt=ht.get(eid); if(eqpHt==null){ eqpHt=new Hashtable(); } Double[] faultNum=eqpHt.get(faultName); if(faultNum==null){ faultNum=new Double[2]; } if(StringUtil.isDouble(fauleNumber)&&StringUtil.isDouble(fauleTime)){ faultNum[0]=Double.valueOf(fauleNumber); faultNum[1]=Double.valueOf(fauleTime); eqpHt.put(faultName, faultNum); ht.put(eid, eqpHt); NeedData.getInstance().setFaultHt(ht); }else{ log.error("设备ID:"+eid+"设备停机时间("+fauleTime+"),或停机次数("+fauleNumber+"),数据错误"); } } } //根据设备ID获取设备故障集合,String[] //0:机台ID,1:班次,2:故障描述,3:次数,4:故障发生总时长 public List getFaultList(String eid){ if(NeedData.getInstance().getFaultHt()==null) return null; Hashtable ht=NeedData.getInstance().getFaultHt().get(eid); if(ht!=null){ List list=new ArrayList(); for(Iterator it=ht.keySet().iterator();it.hasNext();){ //key 故障描述 String key=(String)it.next(); //value 0:故障次数,1:故障发生时长 Double[] value=ht.get(key); //根据设备ID获取班次信息 String shiftId=currentEqpShift.get(Integer.parseInt(eid)); if(StringUtil.notNull(shiftId)){ //0:机台ID,1:班次,2:故障描述,3:次数,4:故障发生总时长 String[] temp={eid,shiftId,key,String.valueOf(value[0]),String.valueOf(value[1])}; list.add(temp); }else{ log.equals("获取设备故障信息出错,原因:根据设备ID:"+eid+",无法获取班次信息。"); } } return list; }else{ return null; } } //获取所有设备故障集合 0:机台ID,1:故障描述,2:次数,3:故障发生总时长 public List getAllFaultList(){ Hashtable> ht=NeedData.getInstance().getFaultHt(); if(ht==null){ return null; }else{ List list=new ArrayList(); for(Iterator its=ht.keySet().iterator();its.hasNext();){ //key 设备ID String key=(String)its.next(); Hashtable value=ht.get(key); for(Iterator i=value.keySet().iterator();i.hasNext();){ //key 故障描述 String keys=(String)i.next(); //value 0:故障次数,1:故障发生时长 Double[] v=value.get(keys); //根据设备ID获取班次信息 String shiftId=currentEqpShift.get(Integer.parseInt(key)); if(StringUtil.notNull(shiftId)){ //0:机台ID,1:班次,2:故障描述,3:次数,4:故障发生总时长 String[] temp={key,shiftId,keys,String.valueOf(v[0]),String.valueOf(v[1])}; list.add(temp); }else{ log.equals("获取设备故障信息出错,原因:根据设备ID:"+key+",无法获取班次信息。"); } } } return list; } } //初始化故障集合 public void removeFaultList(){ NeedData.getInstance().setFaultHt(null); } //清空某一个设备的故障集合 public void removeFaultListByEid(String eid){ NeedData.getInstance().getFaultHt().remove(eid); /*Hashtable> ht=NeedData.getInstance().getFaultHt(); ht.remove(eid); NeedData.getInstance().setFaultHt(ht);*/ } }