package com.szpg.plc.message.response.read; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import com.szpg.db.data.PgDevice; import com.szpg.util.*; import org.apache.commons.lang3.StringUtils; import org.apache.log4j.Logger; import com.szpg.db.dao.PgAlarmDao; import com.szpg.db.dao.PgDeviceDao; import com.szpg.db.dao.PgHjsbblDao; import com.szpg.db.dao.impl.PgAlarmDaoImpl; import com.szpg.db.dao.impl.PgDeviceDaoImpl; import com.szpg.db.dao.impl.PgHjsbblDaoImpl; import com.szpg.db.data.PgAlarm; import com.szpg.db.data.PgHjsbbl; import com.szpg.plc.message.response.ReadMemoryCommandResponse; import com.szpg.plc.util.ByteUtil; public class ReadDSStatusCommandResponse extends ReadMemoryCommandResponse { /** * */ private static final long serialVersionUID = -2692039091478584257L; private final Logger logger = Logger.getLogger(this.getClass().getName()); private List<Boolean> dsbj; // 对射报警状态 private String[] zcList; //红外对射监测的资产列表,从配置文件中获取 public ReadDSStatusCommandResponse() { dsbj = new ArrayList<Boolean>(); } public List<Boolean> getDsbj() { return dsbj; } public void setDsbj(List<Boolean> dsbj) { this.dsbj = dsbj; } public String[] getZcList() { return zcList; } public void setZcList(String[] zcList) { this.zcList = zcList; } @Override public void afterAction() { // 1将对射报警数据存入数据库 PgDeviceDao deviceDao = new PgDeviceDaoImpl(); PgAlarmDao alarmDao = new PgAlarmDaoImpl(); // 遍历资产列表,将红外对射报警状态存入数据库 for (int i = 0; i < zcList.length; i++) { String zcbh = zcList[i]; int deviceId = deviceDao.findDeviceIdByCode(zcbh); if (deviceId > 0) { if (dsbj.get(i) == true) { PgAlarm alarm = new PgAlarm(); alarm.setActive(1); alarm.setAlarm_date(this.getTime().getTime()); alarm.setAlarmdevid(deviceId); alarm.setAlarmtypeid(PgAlarm.ALARM_TYPE_PGSAF); alarm.setDescription("舱段入侵报警"); alarm.setUserid(null); // 对射报警定义为二级报警 alarm.setAlarm_grade("二级报警"); alarmDao.insertAlarmRecord(alarm); deviceDao.updateDeviceStatus(deviceId, "舱段入侵报警"); // 自动打开当前舱段的照明,手动关闭照明 // 首先找到当前舱段的排风机资产编号 if (Boolean.valueOf(Configure.getProperty("sys", "DS_ON_ZM", "false")) == true) { String acucode = zcbh.substring(0, zcbh.indexOf(".", 6)); String cabin = zcbh.substring(zcbh.lastIndexOf(".") + 1, zcbh.lastIndexOf(".") + 2); List<PgDevice> zms = deviceDao.findDeviceByPositionAndType(acucode, "Z", cabin); if (null != zms && zms.isEmpty() == false) { String baseURL = Configure.getProperty("sys", "PGDSC_API_URL"); for (PgDevice fj : zms) { String zmzcbh = fj.getAssetcode(); // 调用远程接口启动照明 HttpRequest.sendGet(baseURL + "remote/turnOnZm.action", "zcbh=" + zmzcbh); } } } // 将报警日志推送至市级平台 String date = TimeFormat.formatDate(getTime().getTime()); int count = alarmDao.findAlarmCountByDate(date); String bjbh = "THXC." + date + "." + NumberFormat.format(count+1, "0000"); String bjms = alarm.getDescription(); String bjsj = date.replace("-", ""); String dsbjResp = DataPushInterface.addDSAlarmData(bjbh, zcbh, bjms, bjsj); logger.info("同步舱段入侵报警记录日志结果:" + dsbjResp); } else { alarmDao.autoClearAlarm(deviceId); deviceDao.updateDeviceStatus(deviceId, "正常"); } } } } @Override public void parseData() { // 获取目标ACU的代码 String acucode = this.getAcucode(); byte[] messageData = this.getResponseData(); logger.info("开始解析[读取舱段对射报警状态][" + acucode + "]指令响应"); // 判断数据的长度是否满足要求 if (messageData.length != Integer.parseInt(Configure.getProperty("acubl", acucode + ".DSALM.WORDCOUNT")) * 2) { logger.error("返回的数据长度与读取的不一致!"); this.setValid(false); return; } // 将数据转换为字符串 // 按照高字在前,低字在后;高字节在前,低字节在后的顺序 String dataStr = ""; for (int c = 0; c < messageData.length; c = c + 2) { dataStr = ByteUtil.binToBinString(new byte[] {messageData[c], messageData[c + 1]}) + dataStr; } PgHjsbblDao blDao = new PgHjsbblDaoImpl(); // 获取目标ACU红外对射报警状态内存区域的起始字地址 int start = Integer.parseInt(Configure.getProperty("acubl", acucode + ".DSALM.START")); // 获取目标ACU红外对射相关的资产列表,即红外对射设备列表 String zcListStr = Configure.getProperty("acubl", acucode + ".DS.ZC.LIST"); if (StringUtils.isEmpty(zcListStr) == true) { this.setValid(false); return; } zcList = zcListStr.split(";"); // 初始化结果集合 dsbj = Arrays.asList(new Boolean[zcList.length]); // 解析红外对射报警状态 for (int i = 0; i < zcList.length; i++) { String zcbh = zcList[i]; // 解析红外对射报警状态 PgHjsbbl almBlObj = blDao.findBlByBh(zcbh + ".Alm"); if (null == almBlObj) { continue; } int akszdz = almBlObj.getKszdz(); //开始字地址 int aoffset = akszdz - start; //与开始字的偏移量 int abit = almBlObj.getSzw(); //所在位 int index = dataStr.length() - 1 - aoffset * 16 - abit; if (index >= 0) { char bjBt = dataStr.charAt(index); // 红外对射报警状态标志位 getDsbj().set(i, bjBt == '1' ? true : false); logger.info("[" + zcbh + "][舱段对射报警" + bjBt + "]"); } } logger.info("解析[读取舱段对射报警状态]响应指令结束"); } }