package com.szpg.plc.message.response.read; import java.util.ArrayList; import java.util.Calendar; import java.util.List; import com.szpg.db.data.PgCh4; import org.apache.commons.lang3.StringUtils; import org.apache.log4j.Logger; import com.szpg.db.dao.PgAlarmDao; import com.szpg.db.dao.PgAlarmRuleDao; import com.szpg.db.dao.PgCh4Dao; import com.szpg.db.dao.PgDeviceDao; import com.szpg.db.dao.impl.PgAlarmDaoImpl; import com.szpg.db.dao.impl.PgAlarmRuleDaoImpl; import com.szpg.db.dao.impl.PgCh4DaoImpl; import com.szpg.db.dao.impl.PgDeviceDaoImpl; import com.szpg.db.data.PgAlarm; import com.szpg.db.data.PgAlarmRule; import com.szpg.db.data.PgDevice; import com.szpg.plc.message.response.ReadMemoryCommandResponse; import com.szpg.util.Configure; import com.szpg.util.DataPushInterface; import com.szpg.util.HttpRequest; import com.szpg.util.NumberFormat; import com.szpg.util.TimeFormat; /** * @author TAN YUE */ public class ReadCH4ValueCommandResponse extends ReadMemoryCommandResponse { /** * */ private static final long serialVersionUID = 8081222348890587881L; private final Logger logger = Logger.getLogger(this.getClass().getName()); /** * 甲烷浓度值 */ private List<Float> jwnd; /** * 甲烷联动报警值 */ private List<Float> jwldbjz; /** * 甲烷监测的资产列表,从配置文件中获取 */ private String[] zcList; private boolean CH4_ON_FJ; private long CLASS_YELLOW_ALARM_INTERVAL; public ReadCH4ValueCommandResponse() { jwnd = new ArrayList<Float>(); jwldbjz = new ArrayList<Float>(); CH4_ON_FJ = Boolean.valueOf(Configure.getProperty("sys", "O2_ON_FJ", "false")); CLASS_YELLOW_ALARM_INTERVAL = Integer.parseInt(Configure.getProperty("sys", "CLASS_YELLOW_ALARM_INTERVAL", "60")) * 60 * 1000L; } public List<Float> getJwnd() { return jwnd; } public void setJwnd(List<Float> jwnd) { this.jwnd = jwnd; } public List<Float> getJwldbjz() { return jwldbjz; } public void setJwldbjz(List<Float> jwldbjz) { this.jwldbjz = jwldbjz; } public String[] getZcList() { return zcList; } public void setZcList(String[] zcList) { this.zcList = zcList; } @Override public void afterAction() { // 1将甲烷浓度数据存入数据库 PgCh4Dao ch4Dao = new PgCh4DaoImpl(); PgDeviceDao deviceDao = new PgDeviceDaoImpl(); PgAlarmRuleDao ruleDao = new PgAlarmRuleDaoImpl(); PgAlarmDao alarmDao = new PgAlarmDaoImpl(); if (null != zcList && zcList.length > 0) { // 遍历甲烷设备列表,将甲烷浓度监测值存入数据库 for (int i = 0; i < zcList.length; i++) { // 资产编号(设备编号) String zcbh = zcList[i]; // 监测值 float value = jwnd.get(i); int deviceId = deviceDao.findDeviceIdByCode(zcbh); if (deviceId > 0) { // 1 取出报警规则 PgAlarmRule rule = ruleDao.findRuleByDevice(deviceId); // 默认的报警阈值 double high = 0.0; if (null != rule) { try { high = NumberFormat.parseDouble(rule.getHighvalue(), "0.00"); } catch (Exception ex) { logger.error(ex); ex.printStackTrace(); } } // 1 判断是否报警 if (high > 0.0001 && value > high) { // 2 需要报警,处理报警记录和监测值 // 2.1 取出上一个报警记录 PgAlarm lastAlarm = alarmDao.findLatestAlarmByDevice(deviceId); if (null != lastAlarm) { // 2.2 计算与上一个报警记录的操作时间间隔 long alarmTimeInterval = this.getTime().getTimeInMillis() - lastAlarm.getLog_time().getTime(); // 2.3 上一个报警值 double lastAlarmValue = 0.0; try { lastAlarmValue = NumberFormat.parseDouble(lastAlarm.getAlarm_value(), "0.00"); } catch (Exception ex) { logger.error(ex); ex.printStackTrace(); } // 2.4 如果与前值相同 并且 时间在设定的阈值范围内 则不处理报警 if (Math.abs(value - lastAlarmValue) < 0.01 && alarmTimeInterval < CLASS_YELLOW_ALARM_INTERVAL) { continue; } } // 2.5 插入监测数值 ch4Dao.addPblzRecord(value, TimeFormat.formatTimestamp(this.getTime().getTime()), deviceId); // 2.6 推送给市管廊公司平台 String jwResp = DataPushInterface.addCH4Data(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); logger.info("同步甲烷浓度值结果:" + jwResp); // 2.7 生成报警记录 PgAlarm alarm = new PgAlarm().getCH4AlarmInstance(); alarm.setAlarm_date(this.getTime().getTime()); alarm.setAlarm_value(NumberFormat.format(value, "0.00")); alarm.setAlarmdevid(deviceId); alarm.setLog_time(this.getTime().getTime()); // 2.8 将上一条报警记录消警 alarmDao.insertAlarmRecord(alarm); deviceDao.updateDeviceStatus(deviceId, "甲烷浓度过高"); // 2.9 向市级平台推送报警日志 String date = TimeFormat.formatDate(getTime().getTime()); int count = alarmDao.findAlarmCountByDate(date); String bjbh = "THXC." + date + "." + NumberFormat.format(count+1, "0000"); String bjms = alarm.getDescription() + ",甲烷浓度值为" + value; String bjsj = date.replace("-", ""); String jwbjResp = DataPushInterface.addCH4AlarmData(bjbh, zcbh, bjms, bjsj); logger.info("同步甲烷报警记录日志结果:" + jwbjResp); // 2.10 联动打开风机 // 自动打开当前舱段的排风机,手动关闭风机 // 首先找到当前舱段的排风机资产编号 if (CH4_ON_FJ == true) { String baseURL = Configure.getProperty("sys", "PGDSC_API_URL"); HttpRequest.sendGet(baseURL + "remote/turnOnFjReactAlarm.action", "zcbh=" + zcbh); } } else { // 3 不需要报警,只处理监测值 // 3.1 取出上一个监测值 PgCh4 lastRec = ch4Dao.findLastRecordByDevice(deviceId); // 3.2 计算数值的时间间隔 long valueTimeInterval = this.getTime().getTimeInMillis() - lastRec.getUptime().getTime(); // 3.3 判断条件:是否与原值相同且相距在六小时以内 if (Math.abs(value - lastRec.getCh4()) > 0.01 || valueTimeInterval > CLASS_YELLOW_ALARM_INTERVAL) { // 3.4 将数据存入数据库 ch4Dao.addPblzRecord(value, TimeFormat.formatTimestamp(this.getTime().getTime()), deviceId); // 3.5 推送给市管廊公司平台 String jwResp = DataPushInterface.addCH4Data(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); logger.info("同步甲烷浓度值结果:" + jwResp); } } } else { logger.warn("未找到资产[" + zcbh + "]"); } } } } @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 + ".CH.WORDCOUNT")) * 2) { logger.error("返回的数据长度与读取的不一致!"); this.setValid(false); return; } // 获取目标ACU甲烷监测值内存区域的起始字地址 int start = Integer.parseInt(Configure.getProperty("acubl", acucode + ".CH.START")); // 获取目标ACU甲烷相关的资产列表,即甲烷设备列表 String zcListStr = Configure.getProperty("acubl", acucode + ".CH.ZC.LIST"); if (StringUtils.isEmpty(zcListStr) == true) { this.setValid(false); return; } zcList = zcListStr.split(";"); // 解析甲烷浓度监测值以及甲烷浓度报警阈值 for (int i = 0; i < zcList.length; i++) { String zcbh = zcList[i]; // 1解析甲烷浓度监测值 float value = getValueFromData(zcbh, start, messageData, zcbh + ".Value"); // 2解析甲烷浓度报警阈值 float threshold = getValueFromData(zcbh, start, messageData, zcbh + ".Set"); getJwnd().add(value); getJwldbjz().add(threshold); logger.info("[" + zcbh + "][甲烷浓度值" + value + "][甲烷浓度报警阈值" + threshold + "]"); } logger.info("解析[读取甲烷浓度值]响应指令结束"); } }