diff --git a/src/com/szpg/db/dao/PgAlarmDao.java b/src/com/szpg/db/dao/PgAlarmDao.java index 11d8a1d..4ab98d4 100644 --- a/src/com/szpg/db/dao/PgAlarmDao.java +++ b/src/com/szpg/db/dao/PgAlarmDao.java @@ -6,6 +6,7 @@ public int findAlarmCountByDate(String date); public PgAlarm findLatestAlarmByDevice(int deviceId); + public PgAlarm findLatestAlarmByDeviceAndType(int deviceId, String type); public long insertAlarmRecord(PgAlarm alarmRecord); } diff --git a/src/com/szpg/db/dao/PgAlarmDao.java b/src/com/szpg/db/dao/PgAlarmDao.java index 11d8a1d..4ab98d4 100644 --- a/src/com/szpg/db/dao/PgAlarmDao.java +++ b/src/com/szpg/db/dao/PgAlarmDao.java @@ -6,6 +6,7 @@ public int findAlarmCountByDate(String date); public PgAlarm findLatestAlarmByDevice(int deviceId); + public PgAlarm findLatestAlarmByDeviceAndType(int deviceId, String type); public long insertAlarmRecord(PgAlarm alarmRecord); } diff --git a/src/com/szpg/db/dao/PgCODao.java b/src/com/szpg/db/dao/PgCODao.java index 1664f51..5098321 100644 --- a/src/com/szpg/db/dao/PgCODao.java +++ b/src/com/szpg/db/dao/PgCODao.java @@ -20,6 +20,7 @@ public List findPblzByDeviceAndTm(Integer deviceid, String start, String end); public double findLastValueByDevice(Integer deviceid); + public PgCO findLastRecordByDevice(Integer id); public int addPblzRecord(PgCO ch4); public int addPblzRecord(float value, String tm, int deviceid); diff --git a/src/com/szpg/db/dao/PgAlarmDao.java b/src/com/szpg/db/dao/PgAlarmDao.java index 11d8a1d..4ab98d4 100644 --- a/src/com/szpg/db/dao/PgAlarmDao.java +++ b/src/com/szpg/db/dao/PgAlarmDao.java @@ -6,6 +6,7 @@ public int findAlarmCountByDate(String date); public PgAlarm findLatestAlarmByDevice(int deviceId); + public PgAlarm findLatestAlarmByDeviceAndType(int deviceId, String type); public long insertAlarmRecord(PgAlarm alarmRecord); } diff --git a/src/com/szpg/db/dao/PgCODao.java b/src/com/szpg/db/dao/PgCODao.java index 1664f51..5098321 100644 --- a/src/com/szpg/db/dao/PgCODao.java +++ b/src/com/szpg/db/dao/PgCODao.java @@ -20,6 +20,7 @@ public List findPblzByDeviceAndTm(Integer deviceid, String start, String end); public double findLastValueByDevice(Integer deviceid); + public PgCO findLastRecordByDevice(Integer id); public int addPblzRecord(PgCO ch4); public int addPblzRecord(float value, String tm, int deviceid); diff --git a/src/com/szpg/db/dao/PgCh4Dao.java b/src/com/szpg/db/dao/PgCh4Dao.java index e23b964..61fdfcd 100644 --- a/src/com/szpg/db/dao/PgCh4Dao.java +++ b/src/com/szpg/db/dao/PgCh4Dao.java @@ -20,6 +20,7 @@ public List findPblzByDeviceAndTm(Integer deviceid, String start, String end); public double findLastValueByDevice(Integer deviceid); + public PgCh4 findLastRecordByDevice(Integer deviceid); public int addPblzRecord(PgCh4 ch4); public int addPblzRecord(float value, String tm, int deviceid); diff --git a/src/com/szpg/db/dao/PgAlarmDao.java b/src/com/szpg/db/dao/PgAlarmDao.java index 11d8a1d..4ab98d4 100644 --- a/src/com/szpg/db/dao/PgAlarmDao.java +++ b/src/com/szpg/db/dao/PgAlarmDao.java @@ -6,6 +6,7 @@ public int findAlarmCountByDate(String date); public PgAlarm findLatestAlarmByDevice(int deviceId); + public PgAlarm findLatestAlarmByDeviceAndType(int deviceId, String type); public long insertAlarmRecord(PgAlarm alarmRecord); } diff --git a/src/com/szpg/db/dao/PgCODao.java b/src/com/szpg/db/dao/PgCODao.java index 1664f51..5098321 100644 --- a/src/com/szpg/db/dao/PgCODao.java +++ b/src/com/szpg/db/dao/PgCODao.java @@ -20,6 +20,7 @@ public List findPblzByDeviceAndTm(Integer deviceid, String start, String end); public double findLastValueByDevice(Integer deviceid); + public PgCO findLastRecordByDevice(Integer id); public int addPblzRecord(PgCO ch4); public int addPblzRecord(float value, String tm, int deviceid); diff --git a/src/com/szpg/db/dao/PgCh4Dao.java b/src/com/szpg/db/dao/PgCh4Dao.java index e23b964..61fdfcd 100644 --- a/src/com/szpg/db/dao/PgCh4Dao.java +++ b/src/com/szpg/db/dao/PgCh4Dao.java @@ -20,6 +20,7 @@ public List findPblzByDeviceAndTm(Integer deviceid, String start, String end); public double findLastValueByDevice(Integer deviceid); + public PgCh4 findLastRecordByDevice(Integer deviceid); public int addPblzRecord(PgCh4 ch4); public int addPblzRecord(float value, String tm, int deviceid); diff --git a/src/com/szpg/db/dao/PgHSDao.java b/src/com/szpg/db/dao/PgHSDao.java index f89b044..0f0ee53 100644 --- a/src/com/szpg/db/dao/PgHSDao.java +++ b/src/com/szpg/db/dao/PgHSDao.java @@ -20,6 +20,7 @@ public List findPblzByDeviceAndTm(Integer deviceid, String start, String end); public double findLastValueByDevice(Integer deviceid); + public PgSH findLastRecordByDevice(Integer deviceid); public int addPblzRecord(PgSH hs); public int addPblzRecord(float value, String tm, int deviceid); diff --git a/src/com/szpg/db/dao/PgAlarmDao.java b/src/com/szpg/db/dao/PgAlarmDao.java index 11d8a1d..4ab98d4 100644 --- a/src/com/szpg/db/dao/PgAlarmDao.java +++ b/src/com/szpg/db/dao/PgAlarmDao.java @@ -6,6 +6,7 @@ public int findAlarmCountByDate(String date); public PgAlarm findLatestAlarmByDevice(int deviceId); + public PgAlarm findLatestAlarmByDeviceAndType(int deviceId, String type); public long insertAlarmRecord(PgAlarm alarmRecord); } diff --git a/src/com/szpg/db/dao/PgCODao.java b/src/com/szpg/db/dao/PgCODao.java index 1664f51..5098321 100644 --- a/src/com/szpg/db/dao/PgCODao.java +++ b/src/com/szpg/db/dao/PgCODao.java @@ -20,6 +20,7 @@ public List findPblzByDeviceAndTm(Integer deviceid, String start, String end); public double findLastValueByDevice(Integer deviceid); + public PgCO findLastRecordByDevice(Integer id); public int addPblzRecord(PgCO ch4); public int addPblzRecord(float value, String tm, int deviceid); diff --git a/src/com/szpg/db/dao/PgCh4Dao.java b/src/com/szpg/db/dao/PgCh4Dao.java index e23b964..61fdfcd 100644 --- a/src/com/szpg/db/dao/PgCh4Dao.java +++ b/src/com/szpg/db/dao/PgCh4Dao.java @@ -20,6 +20,7 @@ public List findPblzByDeviceAndTm(Integer deviceid, String start, String end); public double findLastValueByDevice(Integer deviceid); + public PgCh4 findLastRecordByDevice(Integer deviceid); public int addPblzRecord(PgCh4 ch4); public int addPblzRecord(float value, String tm, int deviceid); diff --git a/src/com/szpg/db/dao/PgHSDao.java b/src/com/szpg/db/dao/PgHSDao.java index f89b044..0f0ee53 100644 --- a/src/com/szpg/db/dao/PgHSDao.java +++ b/src/com/szpg/db/dao/PgHSDao.java @@ -20,6 +20,7 @@ public List findPblzByDeviceAndTm(Integer deviceid, String start, String end); public double findLastValueByDevice(Integer deviceid); + public PgSH findLastRecordByDevice(Integer deviceid); public int addPblzRecord(PgSH hs); public int addPblzRecord(float value, String tm, int deviceid); diff --git a/src/com/szpg/db/dao/PgO2Dao.java b/src/com/szpg/db/dao/PgO2Dao.java index 0b3d0bf..678adab 100644 --- a/src/com/szpg/db/dao/PgO2Dao.java +++ b/src/com/szpg/db/dao/PgO2Dao.java @@ -20,6 +20,7 @@ public List findPblzByDeviceAndTm(Integer deviceid, String start, String end); public double findLastValueByDevice(Integer deviceid); + public PgO2 findLastRecordByDevice(Integer deviceid); public int addPblzRecord(PgO2 ch4); public int addPblzRecord(float value, String tm, int deviceid); diff --git a/src/com/szpg/db/dao/PgAlarmDao.java b/src/com/szpg/db/dao/PgAlarmDao.java index 11d8a1d..4ab98d4 100644 --- a/src/com/szpg/db/dao/PgAlarmDao.java +++ b/src/com/szpg/db/dao/PgAlarmDao.java @@ -6,6 +6,7 @@ public int findAlarmCountByDate(String date); public PgAlarm findLatestAlarmByDevice(int deviceId); + public PgAlarm findLatestAlarmByDeviceAndType(int deviceId, String type); public long insertAlarmRecord(PgAlarm alarmRecord); } diff --git a/src/com/szpg/db/dao/PgCODao.java b/src/com/szpg/db/dao/PgCODao.java index 1664f51..5098321 100644 --- a/src/com/szpg/db/dao/PgCODao.java +++ b/src/com/szpg/db/dao/PgCODao.java @@ -20,6 +20,7 @@ public List findPblzByDeviceAndTm(Integer deviceid, String start, String end); public double findLastValueByDevice(Integer deviceid); + public PgCO findLastRecordByDevice(Integer id); public int addPblzRecord(PgCO ch4); public int addPblzRecord(float value, String tm, int deviceid); diff --git a/src/com/szpg/db/dao/PgCh4Dao.java b/src/com/szpg/db/dao/PgCh4Dao.java index e23b964..61fdfcd 100644 --- a/src/com/szpg/db/dao/PgCh4Dao.java +++ b/src/com/szpg/db/dao/PgCh4Dao.java @@ -20,6 +20,7 @@ public List findPblzByDeviceAndTm(Integer deviceid, String start, String end); public double findLastValueByDevice(Integer deviceid); + public PgCh4 findLastRecordByDevice(Integer deviceid); public int addPblzRecord(PgCh4 ch4); public int addPblzRecord(float value, String tm, int deviceid); diff --git a/src/com/szpg/db/dao/PgHSDao.java b/src/com/szpg/db/dao/PgHSDao.java index f89b044..0f0ee53 100644 --- a/src/com/szpg/db/dao/PgHSDao.java +++ b/src/com/szpg/db/dao/PgHSDao.java @@ -20,6 +20,7 @@ public List findPblzByDeviceAndTm(Integer deviceid, String start, String end); public double findLastValueByDevice(Integer deviceid); + public PgSH findLastRecordByDevice(Integer deviceid); public int addPblzRecord(PgSH hs); public int addPblzRecord(float value, String tm, int deviceid); diff --git a/src/com/szpg/db/dao/PgO2Dao.java b/src/com/szpg/db/dao/PgO2Dao.java index 0b3d0bf..678adab 100644 --- a/src/com/szpg/db/dao/PgO2Dao.java +++ b/src/com/szpg/db/dao/PgO2Dao.java @@ -20,6 +20,7 @@ public List findPblzByDeviceAndTm(Integer deviceid, String start, String end); public double findLastValueByDevice(Integer deviceid); + public PgO2 findLastRecordByDevice(Integer deviceid); public int addPblzRecord(PgO2 ch4); public int addPblzRecord(float value, String tm, int deviceid); diff --git a/src/com/szpg/db/dao/PgWsDao.java b/src/com/szpg/db/dao/PgWsDao.java index 370a83f..bfd0eed 100644 --- a/src/com/szpg/db/dao/PgWsDao.java +++ b/src/com/szpg/db/dao/PgWsDao.java @@ -21,6 +21,7 @@ public double findLastTempByDevice(Integer deviceid); public double findLastHumByDevice(Integer deviceid); + public PgTemphum findLastRecordByDevice(Integer deviceid); public int addWsdzRecord(PgTemphum wsdz); public int addWsdzRecord(float temp, float hum, String tm, int deviceid); diff --git a/src/com/szpg/db/dao/PgAlarmDao.java b/src/com/szpg/db/dao/PgAlarmDao.java index 11d8a1d..4ab98d4 100644 --- a/src/com/szpg/db/dao/PgAlarmDao.java +++ b/src/com/szpg/db/dao/PgAlarmDao.java @@ -6,6 +6,7 @@ public int findAlarmCountByDate(String date); public PgAlarm findLatestAlarmByDevice(int deviceId); + public PgAlarm findLatestAlarmByDeviceAndType(int deviceId, String type); public long insertAlarmRecord(PgAlarm alarmRecord); } diff --git a/src/com/szpg/db/dao/PgCODao.java b/src/com/szpg/db/dao/PgCODao.java index 1664f51..5098321 100644 --- a/src/com/szpg/db/dao/PgCODao.java +++ b/src/com/szpg/db/dao/PgCODao.java @@ -20,6 +20,7 @@ public List findPblzByDeviceAndTm(Integer deviceid, String start, String end); public double findLastValueByDevice(Integer deviceid); + public PgCO findLastRecordByDevice(Integer id); public int addPblzRecord(PgCO ch4); public int addPblzRecord(float value, String tm, int deviceid); diff --git a/src/com/szpg/db/dao/PgCh4Dao.java b/src/com/szpg/db/dao/PgCh4Dao.java index e23b964..61fdfcd 100644 --- a/src/com/szpg/db/dao/PgCh4Dao.java +++ b/src/com/szpg/db/dao/PgCh4Dao.java @@ -20,6 +20,7 @@ public List findPblzByDeviceAndTm(Integer deviceid, String start, String end); public double findLastValueByDevice(Integer deviceid); + public PgCh4 findLastRecordByDevice(Integer deviceid); public int addPblzRecord(PgCh4 ch4); public int addPblzRecord(float value, String tm, int deviceid); diff --git a/src/com/szpg/db/dao/PgHSDao.java b/src/com/szpg/db/dao/PgHSDao.java index f89b044..0f0ee53 100644 --- a/src/com/szpg/db/dao/PgHSDao.java +++ b/src/com/szpg/db/dao/PgHSDao.java @@ -20,6 +20,7 @@ public List findPblzByDeviceAndTm(Integer deviceid, String start, String end); public double findLastValueByDevice(Integer deviceid); + public PgSH findLastRecordByDevice(Integer deviceid); public int addPblzRecord(PgSH hs); public int addPblzRecord(float value, String tm, int deviceid); diff --git a/src/com/szpg/db/dao/PgO2Dao.java b/src/com/szpg/db/dao/PgO2Dao.java index 0b3d0bf..678adab 100644 --- a/src/com/szpg/db/dao/PgO2Dao.java +++ b/src/com/szpg/db/dao/PgO2Dao.java @@ -20,6 +20,7 @@ public List findPblzByDeviceAndTm(Integer deviceid, String start, String end); public double findLastValueByDevice(Integer deviceid); + public PgO2 findLastRecordByDevice(Integer deviceid); public int addPblzRecord(PgO2 ch4); public int addPblzRecord(float value, String tm, int deviceid); diff --git a/src/com/szpg/db/dao/PgWsDao.java b/src/com/szpg/db/dao/PgWsDao.java index 370a83f..bfd0eed 100644 --- a/src/com/szpg/db/dao/PgWsDao.java +++ b/src/com/szpg/db/dao/PgWsDao.java @@ -21,6 +21,7 @@ public double findLastTempByDevice(Integer deviceid); public double findLastHumByDevice(Integer deviceid); + public PgTemphum findLastRecordByDevice(Integer deviceid); public int addWsdzRecord(PgTemphum wsdz); public int addWsdzRecord(float temp, float hum, String tm, int deviceid); diff --git a/src/com/szpg/db/dao/impl/PgAlarmDaoImpl.java b/src/com/szpg/db/dao/impl/PgAlarmDaoImpl.java index cedf5fc..ce9ee0f 100644 --- a/src/com/szpg/db/dao/impl/PgAlarmDaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgAlarmDaoImpl.java @@ -8,7 +8,6 @@ import org.apache.commons.dbutils.DbUtils; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.handlers.ArrayListHandler; -import org.apache.commons.dbutils.handlers.BeanListHandler; import org.apache.commons.dbutils.handlers.ScalarHandler; import org.apache.log4j.Logger; @@ -17,6 +16,9 @@ import com.szpg.db.util.ConnectionManager; import com.szpg.util.TimeFormat; +/** + * @author TAN YUE + */ public class PgAlarmDaoImpl implements PgAlarmDao { private final Logger logger = Logger.getLogger(this.getClass().getName()); @@ -33,7 +35,7 @@ QueryRunner runner = new QueryRunner(); param[0] = date; - int count = ((Number) runner.query(conn, sql, new ScalarHandler(1), param)).intValue(); + int count = (runner.query(conn, sql, new ScalarHandler(1), param)).intValue(); return count; } catch (Exception ex) { logger.error("根据日期查询报警记录数异常", ex); @@ -51,7 +53,7 @@ public PgAlarm findLatestAlarmByDevice(int deviceId) { Connection conn = null; String queryStr = "SELECT A.* FROM " + - "(SELECT ID, ACTIVE, ALARM_DATE, ALARM_VALUE, DESCRIPTION, ALARMDEVID, ALARMTYPEID, ALARM_GRADE FROM PG_ALARM WHERE ALARMDEVID = ? ORDER BY ALARM_DATE DESC) A " + + "(SELECT ID, ACTIVE, ALARM_DATE, ALARM_VALUE, DESCRIPTION, ALARMDEVID, ALARMTYPEID, ALARM_GRADE, LOG_TIME, LOG_DESC FROM PG_ALARM WHERE ALARMDEVID = ? ORDER BY ALARM_DATE DESC) A " + "WHERE ROWNUM <= 1"; Object[] param = new Object[1]; try { @@ -60,7 +62,7 @@ QueryRunner runner = new QueryRunner(); param[0] = deviceId; - List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler(), param); + List tempList = runner.query(conn, queryStr, new ArrayListHandler(), param); if (null != tempList && tempList.isEmpty() == false) { PgAlarm alarm = new PgAlarm(); Object[] item = tempList.get(0); @@ -79,6 +81,74 @@ alarm.setAlarmtypeid(((Number) item[6]).intValue()); alarm.setAlarm_grade((String) item[7]); + if (null != item[8]) { + long logTmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[8]).toJdbc()).getTime(); + Calendar logCal = Calendar.getInstance(); + logCal.setTimeInMillis(logTmValue); + alarm.setLog_time(logCal.getTime()); + } else { + alarm.setLog_time(null); + } + + alarm.setLog_desc((String) item[9]); + + logger.debug("根据设备查询最新报警记录成功"); + + return alarm; + } else { + return null; + } + } catch (Exception ex) { + logger.error("根据设备查询最新报警记录成功", ex); + return null; + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + } + + @Override + public PgAlarm findLatestAlarmByDeviceAndType(int deviceId, String type) { + Connection conn = null; + String queryStr = "SELECT A.* FROM " + + "(SELECT ID, ACTIVE, ALARM_DATE, ALARM_VALUE, DESCRIPTION, ALARMDEVID, ALARMTYPEID, ALARM_GRADE, LOG_TIME, LOG_DESC FROM PG_ALARM WHERE ALARMDEVID = ? AND DESCRIPTION LIKE ? ORDER BY ALARM_DATE DESC) A " + + "WHERE ROWNUM <= 1"; + Object[] param = new Object[2]; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + QueryRunner runner = new QueryRunner(); + param[0] = deviceId; + param[1] = "%" + type + "%"; + + List tempList = runner.query(conn, queryStr, new ArrayListHandler(), param); + if (null != tempList && tempList.isEmpty() == false) { + PgAlarm alarm = new PgAlarm(); + Object[] item = tempList.get(0); + + alarm.setId(((Number) item[0]).intValue()); + alarm.setActive(((Number) item[1]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + alarm.setAlarm_date(cal.getTime()); + + alarm.setAlarm_value((String) item[3]); + alarm.setDescription((String) item[4]); + alarm.setAlarmdevid(((Number) item[5]).intValue()); + alarm.setAlarmtypeid(((Number) item[6]).intValue()); + alarm.setAlarm_grade((String) item[7]); + + long logTmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[8]).toJdbc()).getTime(); + Calendar logCal = Calendar.getInstance(); + logCal.setTimeInMillis(logTmValue); + alarm.setLog_time(logCal.getTime()); + alarm.setLog_desc((String) item[9]); + logger.debug("根据设备查询最新报警记录成功"); return alarm; @@ -111,28 +181,31 @@ QueryRunner runner = new QueryRunner(); // 查询同一设备是否有正在报警的消息 - Number id = (Number) runner.query(conn, querySql, new ScalarHandler(1), queryParam); + Number id = runner.query(conn, querySql, new ScalarHandler(1), queryParam); if (null != id) { // 找到设备已存在的记录 // 1先将正在报警的设备自动消警 - String updateSql = "UPDATE PG_ALARM SET ACTIVE=0 WHERE ID=?"; + String updateSql = "UPDATE PG_ALARM SET ACTIVE=0, LOG_TIME=SYSDATE, LOG_DESC=? WHERE ID=?"; - Object[] updateParam = new Object[1]; - updateParam[0] = id.longValue(); - - runner.update(conn, updateSql, updateParam); // 更新报警记录 - } + Object[] updateParam = new Object[2]; + updateParam[0] = "重复报警自动消警"; + updateParam[1] = id.longValue(); + + // 更新报警记录 + runner.update(conn, updateSql, updateParam); + } // 插入新的报警记录 String insertSql = "INSERT INTO PG_ALARM " + - "(ID, ACTIVE, ALARM_DATE, ALARM_VALUE, DESCRIPTION, ALARMDEVID, ALARMTYPEID, USERID, ALARM_GRADE) " + - "VALUES (?, ?, TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), ?, ?, ?, ?, ?, ?)"; + "(ID, ACTIVE, ALARM_DATE, ALARM_VALUE, DESCRIPTION, ALARMDEVID, ALARMTYPEID, USERID, ALARM_GRADE, LOG_TIME, LOG_DESC) " + + "VALUES (?, ?, TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), ?, ?, ?, ?, ?, ?, TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), ?)"; String sqlId = "SELECT SEQ_PG_ALARM_ID.NEXTVAL FROM DUAL"; - long newId = ((Number) runner.query(conn, sqlId, new ScalarHandler(1))).longValue(); // 获取新的id - - Object[] params = new Object[9]; + // 获取新的id + long newId = (runner.query(conn, sqlId, new ScalarHandler(1))).longValue(); + + Object[] params = new Object[11]; params[0] = newId; params[1] = alarmRecord.getActive(); @@ -143,8 +216,11 @@ params[6] = alarmRecord.getAlarmtypeid(); params[7] = alarmRecord.getUserid(); params[8] = alarmRecord.getAlarm_grade(); - - int count = runner.update(conn, insertSql, params); // 新增主表 + params[9] = TimeFormat.formatTimestamp(alarmRecord.getLog_time()); + params[10] = alarmRecord.getLog_desc(); + + // 新增报警记录 + int count = runner.update(conn, insertSql, params); if (count > 0) { logger.debug("插入报警数据成功"); diff --git a/src/com/szpg/db/dao/PgAlarmDao.java b/src/com/szpg/db/dao/PgAlarmDao.java index 11d8a1d..4ab98d4 100644 --- a/src/com/szpg/db/dao/PgAlarmDao.java +++ b/src/com/szpg/db/dao/PgAlarmDao.java @@ -6,6 +6,7 @@ public int findAlarmCountByDate(String date); public PgAlarm findLatestAlarmByDevice(int deviceId); + public PgAlarm findLatestAlarmByDeviceAndType(int deviceId, String type); public long insertAlarmRecord(PgAlarm alarmRecord); } diff --git a/src/com/szpg/db/dao/PgCODao.java b/src/com/szpg/db/dao/PgCODao.java index 1664f51..5098321 100644 --- a/src/com/szpg/db/dao/PgCODao.java +++ b/src/com/szpg/db/dao/PgCODao.java @@ -20,6 +20,7 @@ public List findPblzByDeviceAndTm(Integer deviceid, String start, String end); public double findLastValueByDevice(Integer deviceid); + public PgCO findLastRecordByDevice(Integer id); public int addPblzRecord(PgCO ch4); public int addPblzRecord(float value, String tm, int deviceid); diff --git a/src/com/szpg/db/dao/PgCh4Dao.java b/src/com/szpg/db/dao/PgCh4Dao.java index e23b964..61fdfcd 100644 --- a/src/com/szpg/db/dao/PgCh4Dao.java +++ b/src/com/szpg/db/dao/PgCh4Dao.java @@ -20,6 +20,7 @@ public List findPblzByDeviceAndTm(Integer deviceid, String start, String end); public double findLastValueByDevice(Integer deviceid); + public PgCh4 findLastRecordByDevice(Integer deviceid); public int addPblzRecord(PgCh4 ch4); public int addPblzRecord(float value, String tm, int deviceid); diff --git a/src/com/szpg/db/dao/PgHSDao.java b/src/com/szpg/db/dao/PgHSDao.java index f89b044..0f0ee53 100644 --- a/src/com/szpg/db/dao/PgHSDao.java +++ b/src/com/szpg/db/dao/PgHSDao.java @@ -20,6 +20,7 @@ public List findPblzByDeviceAndTm(Integer deviceid, String start, String end); public double findLastValueByDevice(Integer deviceid); + public PgSH findLastRecordByDevice(Integer deviceid); public int addPblzRecord(PgSH hs); public int addPblzRecord(float value, String tm, int deviceid); diff --git a/src/com/szpg/db/dao/PgO2Dao.java b/src/com/szpg/db/dao/PgO2Dao.java index 0b3d0bf..678adab 100644 --- a/src/com/szpg/db/dao/PgO2Dao.java +++ b/src/com/szpg/db/dao/PgO2Dao.java @@ -20,6 +20,7 @@ public List findPblzByDeviceAndTm(Integer deviceid, String start, String end); public double findLastValueByDevice(Integer deviceid); + public PgO2 findLastRecordByDevice(Integer deviceid); public int addPblzRecord(PgO2 ch4); public int addPblzRecord(float value, String tm, int deviceid); diff --git a/src/com/szpg/db/dao/PgWsDao.java b/src/com/szpg/db/dao/PgWsDao.java index 370a83f..bfd0eed 100644 --- a/src/com/szpg/db/dao/PgWsDao.java +++ b/src/com/szpg/db/dao/PgWsDao.java @@ -21,6 +21,7 @@ public double findLastTempByDevice(Integer deviceid); public double findLastHumByDevice(Integer deviceid); + public PgTemphum findLastRecordByDevice(Integer deviceid); public int addWsdzRecord(PgTemphum wsdz); public int addWsdzRecord(float temp, float hum, String tm, int deviceid); diff --git a/src/com/szpg/db/dao/impl/PgAlarmDaoImpl.java b/src/com/szpg/db/dao/impl/PgAlarmDaoImpl.java index cedf5fc..ce9ee0f 100644 --- a/src/com/szpg/db/dao/impl/PgAlarmDaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgAlarmDaoImpl.java @@ -8,7 +8,6 @@ import org.apache.commons.dbutils.DbUtils; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.handlers.ArrayListHandler; -import org.apache.commons.dbutils.handlers.BeanListHandler; import org.apache.commons.dbutils.handlers.ScalarHandler; import org.apache.log4j.Logger; @@ -17,6 +16,9 @@ import com.szpg.db.util.ConnectionManager; import com.szpg.util.TimeFormat; +/** + * @author TAN YUE + */ public class PgAlarmDaoImpl implements PgAlarmDao { private final Logger logger = Logger.getLogger(this.getClass().getName()); @@ -33,7 +35,7 @@ QueryRunner runner = new QueryRunner(); param[0] = date; - int count = ((Number) runner.query(conn, sql, new ScalarHandler(1), param)).intValue(); + int count = (runner.query(conn, sql, new ScalarHandler(1), param)).intValue(); return count; } catch (Exception ex) { logger.error("根据日期查询报警记录数异常", ex); @@ -51,7 +53,7 @@ public PgAlarm findLatestAlarmByDevice(int deviceId) { Connection conn = null; String queryStr = "SELECT A.* FROM " + - "(SELECT ID, ACTIVE, ALARM_DATE, ALARM_VALUE, DESCRIPTION, ALARMDEVID, ALARMTYPEID, ALARM_GRADE FROM PG_ALARM WHERE ALARMDEVID = ? ORDER BY ALARM_DATE DESC) A " + + "(SELECT ID, ACTIVE, ALARM_DATE, ALARM_VALUE, DESCRIPTION, ALARMDEVID, ALARMTYPEID, ALARM_GRADE, LOG_TIME, LOG_DESC FROM PG_ALARM WHERE ALARMDEVID = ? ORDER BY ALARM_DATE DESC) A " + "WHERE ROWNUM <= 1"; Object[] param = new Object[1]; try { @@ -60,7 +62,7 @@ QueryRunner runner = new QueryRunner(); param[0] = deviceId; - List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler(), param); + List tempList = runner.query(conn, queryStr, new ArrayListHandler(), param); if (null != tempList && tempList.isEmpty() == false) { PgAlarm alarm = new PgAlarm(); Object[] item = tempList.get(0); @@ -79,6 +81,74 @@ alarm.setAlarmtypeid(((Number) item[6]).intValue()); alarm.setAlarm_grade((String) item[7]); + if (null != item[8]) { + long logTmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[8]).toJdbc()).getTime(); + Calendar logCal = Calendar.getInstance(); + logCal.setTimeInMillis(logTmValue); + alarm.setLog_time(logCal.getTime()); + } else { + alarm.setLog_time(null); + } + + alarm.setLog_desc((String) item[9]); + + logger.debug("根据设备查询最新报警记录成功"); + + return alarm; + } else { + return null; + } + } catch (Exception ex) { + logger.error("根据设备查询最新报警记录成功", ex); + return null; + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + } + + @Override + public PgAlarm findLatestAlarmByDeviceAndType(int deviceId, String type) { + Connection conn = null; + String queryStr = "SELECT A.* FROM " + + "(SELECT ID, ACTIVE, ALARM_DATE, ALARM_VALUE, DESCRIPTION, ALARMDEVID, ALARMTYPEID, ALARM_GRADE, LOG_TIME, LOG_DESC FROM PG_ALARM WHERE ALARMDEVID = ? AND DESCRIPTION LIKE ? ORDER BY ALARM_DATE DESC) A " + + "WHERE ROWNUM <= 1"; + Object[] param = new Object[2]; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + QueryRunner runner = new QueryRunner(); + param[0] = deviceId; + param[1] = "%" + type + "%"; + + List tempList = runner.query(conn, queryStr, new ArrayListHandler(), param); + if (null != tempList && tempList.isEmpty() == false) { + PgAlarm alarm = new PgAlarm(); + Object[] item = tempList.get(0); + + alarm.setId(((Number) item[0]).intValue()); + alarm.setActive(((Number) item[1]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + alarm.setAlarm_date(cal.getTime()); + + alarm.setAlarm_value((String) item[3]); + alarm.setDescription((String) item[4]); + alarm.setAlarmdevid(((Number) item[5]).intValue()); + alarm.setAlarmtypeid(((Number) item[6]).intValue()); + alarm.setAlarm_grade((String) item[7]); + + long logTmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[8]).toJdbc()).getTime(); + Calendar logCal = Calendar.getInstance(); + logCal.setTimeInMillis(logTmValue); + alarm.setLog_time(logCal.getTime()); + alarm.setLog_desc((String) item[9]); + logger.debug("根据设备查询最新报警记录成功"); return alarm; @@ -111,28 +181,31 @@ QueryRunner runner = new QueryRunner(); // 查询同一设备是否有正在报警的消息 - Number id = (Number) runner.query(conn, querySql, new ScalarHandler(1), queryParam); + Number id = runner.query(conn, querySql, new ScalarHandler(1), queryParam); if (null != id) { // 找到设备已存在的记录 // 1先将正在报警的设备自动消警 - String updateSql = "UPDATE PG_ALARM SET ACTIVE=0 WHERE ID=?"; + String updateSql = "UPDATE PG_ALARM SET ACTIVE=0, LOG_TIME=SYSDATE, LOG_DESC=? WHERE ID=?"; - Object[] updateParam = new Object[1]; - updateParam[0] = id.longValue(); - - runner.update(conn, updateSql, updateParam); // 更新报警记录 - } + Object[] updateParam = new Object[2]; + updateParam[0] = "重复报警自动消警"; + updateParam[1] = id.longValue(); + + // 更新报警记录 + runner.update(conn, updateSql, updateParam); + } // 插入新的报警记录 String insertSql = "INSERT INTO PG_ALARM " + - "(ID, ACTIVE, ALARM_DATE, ALARM_VALUE, DESCRIPTION, ALARMDEVID, ALARMTYPEID, USERID, ALARM_GRADE) " + - "VALUES (?, ?, TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), ?, ?, ?, ?, ?, ?)"; + "(ID, ACTIVE, ALARM_DATE, ALARM_VALUE, DESCRIPTION, ALARMDEVID, ALARMTYPEID, USERID, ALARM_GRADE, LOG_TIME, LOG_DESC) " + + "VALUES (?, ?, TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), ?, ?, ?, ?, ?, ?, TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), ?)"; String sqlId = "SELECT SEQ_PG_ALARM_ID.NEXTVAL FROM DUAL"; - long newId = ((Number) runner.query(conn, sqlId, new ScalarHandler(1))).longValue(); // 获取新的id - - Object[] params = new Object[9]; + // 获取新的id + long newId = (runner.query(conn, sqlId, new ScalarHandler(1))).longValue(); + + Object[] params = new Object[11]; params[0] = newId; params[1] = alarmRecord.getActive(); @@ -143,8 +216,11 @@ params[6] = alarmRecord.getAlarmtypeid(); params[7] = alarmRecord.getUserid(); params[8] = alarmRecord.getAlarm_grade(); - - int count = runner.update(conn, insertSql, params); // 新增主表 + params[9] = TimeFormat.formatTimestamp(alarmRecord.getLog_time()); + params[10] = alarmRecord.getLog_desc(); + + // 新增报警记录 + int count = runner.update(conn, insertSql, params); if (count > 0) { logger.debug("插入报警数据成功"); diff --git a/src/com/szpg/db/dao/impl/PgCODaoImpl.java b/src/com/szpg/db/dao/impl/PgCODaoImpl.java index 186ac16..70d672c 100644 --- a/src/com/szpg/db/dao/impl/PgCODaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgCODaoImpl.java @@ -292,6 +292,51 @@ } @Override + public PgCO findLastRecordByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT ID, CO, LOGTIME, PGDEVICEID FROM (SELECT * FROM PG_CO WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, sql, new ArrayListHandler(), param); + if (null != tempList && tempList.size() == 1) { + PgCO co = new PgCO(); + Object[] item = tempList.get(0); + + co.setId(((Number) item[0]).intValue()); + co.setCo(Float.parseFloat((String) item[1])); + co.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + co.setLogtime(cal.getTime()); + co.setUptime(cal.getTime()); + + logger.debug("根据设备ID查询最新一氧化碳监测记录成功" + co + "]"); + + return co; + } else { + return null; + } + } catch (Exception ex) { + logger.error("根据设备ID查询最新一氧化碳监测记录异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override public int addPblzRecord(PgCO co) { return addPblzRecord(co.getCo(), co.getTmStr(), co.getPgdeviceid()); } diff --git a/src/com/szpg/db/dao/PgAlarmDao.java b/src/com/szpg/db/dao/PgAlarmDao.java index 11d8a1d..4ab98d4 100644 --- a/src/com/szpg/db/dao/PgAlarmDao.java +++ b/src/com/szpg/db/dao/PgAlarmDao.java @@ -6,6 +6,7 @@ public int findAlarmCountByDate(String date); public PgAlarm findLatestAlarmByDevice(int deviceId); + public PgAlarm findLatestAlarmByDeviceAndType(int deviceId, String type); public long insertAlarmRecord(PgAlarm alarmRecord); } diff --git a/src/com/szpg/db/dao/PgCODao.java b/src/com/szpg/db/dao/PgCODao.java index 1664f51..5098321 100644 --- a/src/com/szpg/db/dao/PgCODao.java +++ b/src/com/szpg/db/dao/PgCODao.java @@ -20,6 +20,7 @@ public List findPblzByDeviceAndTm(Integer deviceid, String start, String end); public double findLastValueByDevice(Integer deviceid); + public PgCO findLastRecordByDevice(Integer id); public int addPblzRecord(PgCO ch4); public int addPblzRecord(float value, String tm, int deviceid); diff --git a/src/com/szpg/db/dao/PgCh4Dao.java b/src/com/szpg/db/dao/PgCh4Dao.java index e23b964..61fdfcd 100644 --- a/src/com/szpg/db/dao/PgCh4Dao.java +++ b/src/com/szpg/db/dao/PgCh4Dao.java @@ -20,6 +20,7 @@ public List findPblzByDeviceAndTm(Integer deviceid, String start, String end); public double findLastValueByDevice(Integer deviceid); + public PgCh4 findLastRecordByDevice(Integer deviceid); public int addPblzRecord(PgCh4 ch4); public int addPblzRecord(float value, String tm, int deviceid); diff --git a/src/com/szpg/db/dao/PgHSDao.java b/src/com/szpg/db/dao/PgHSDao.java index f89b044..0f0ee53 100644 --- a/src/com/szpg/db/dao/PgHSDao.java +++ b/src/com/szpg/db/dao/PgHSDao.java @@ -20,6 +20,7 @@ public List findPblzByDeviceAndTm(Integer deviceid, String start, String end); public double findLastValueByDevice(Integer deviceid); + public PgSH findLastRecordByDevice(Integer deviceid); public int addPblzRecord(PgSH hs); public int addPblzRecord(float value, String tm, int deviceid); diff --git a/src/com/szpg/db/dao/PgO2Dao.java b/src/com/szpg/db/dao/PgO2Dao.java index 0b3d0bf..678adab 100644 --- a/src/com/szpg/db/dao/PgO2Dao.java +++ b/src/com/szpg/db/dao/PgO2Dao.java @@ -20,6 +20,7 @@ public List findPblzByDeviceAndTm(Integer deviceid, String start, String end); public double findLastValueByDevice(Integer deviceid); + public PgO2 findLastRecordByDevice(Integer deviceid); public int addPblzRecord(PgO2 ch4); public int addPblzRecord(float value, String tm, int deviceid); diff --git a/src/com/szpg/db/dao/PgWsDao.java b/src/com/szpg/db/dao/PgWsDao.java index 370a83f..bfd0eed 100644 --- a/src/com/szpg/db/dao/PgWsDao.java +++ b/src/com/szpg/db/dao/PgWsDao.java @@ -21,6 +21,7 @@ public double findLastTempByDevice(Integer deviceid); public double findLastHumByDevice(Integer deviceid); + public PgTemphum findLastRecordByDevice(Integer deviceid); public int addWsdzRecord(PgTemphum wsdz); public int addWsdzRecord(float temp, float hum, String tm, int deviceid); diff --git a/src/com/szpg/db/dao/impl/PgAlarmDaoImpl.java b/src/com/szpg/db/dao/impl/PgAlarmDaoImpl.java index cedf5fc..ce9ee0f 100644 --- a/src/com/szpg/db/dao/impl/PgAlarmDaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgAlarmDaoImpl.java @@ -8,7 +8,6 @@ import org.apache.commons.dbutils.DbUtils; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.handlers.ArrayListHandler; -import org.apache.commons.dbutils.handlers.BeanListHandler; import org.apache.commons.dbutils.handlers.ScalarHandler; import org.apache.log4j.Logger; @@ -17,6 +16,9 @@ import com.szpg.db.util.ConnectionManager; import com.szpg.util.TimeFormat; +/** + * @author TAN YUE + */ public class PgAlarmDaoImpl implements PgAlarmDao { private final Logger logger = Logger.getLogger(this.getClass().getName()); @@ -33,7 +35,7 @@ QueryRunner runner = new QueryRunner(); param[0] = date; - int count = ((Number) runner.query(conn, sql, new ScalarHandler(1), param)).intValue(); + int count = (runner.query(conn, sql, new ScalarHandler(1), param)).intValue(); return count; } catch (Exception ex) { logger.error("根据日期查询报警记录数异常", ex); @@ -51,7 +53,7 @@ public PgAlarm findLatestAlarmByDevice(int deviceId) { Connection conn = null; String queryStr = "SELECT A.* FROM " + - "(SELECT ID, ACTIVE, ALARM_DATE, ALARM_VALUE, DESCRIPTION, ALARMDEVID, ALARMTYPEID, ALARM_GRADE FROM PG_ALARM WHERE ALARMDEVID = ? ORDER BY ALARM_DATE DESC) A " + + "(SELECT ID, ACTIVE, ALARM_DATE, ALARM_VALUE, DESCRIPTION, ALARMDEVID, ALARMTYPEID, ALARM_GRADE, LOG_TIME, LOG_DESC FROM PG_ALARM WHERE ALARMDEVID = ? ORDER BY ALARM_DATE DESC) A " + "WHERE ROWNUM <= 1"; Object[] param = new Object[1]; try { @@ -60,7 +62,7 @@ QueryRunner runner = new QueryRunner(); param[0] = deviceId; - List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler(), param); + List tempList = runner.query(conn, queryStr, new ArrayListHandler(), param); if (null != tempList && tempList.isEmpty() == false) { PgAlarm alarm = new PgAlarm(); Object[] item = tempList.get(0); @@ -79,6 +81,74 @@ alarm.setAlarmtypeid(((Number) item[6]).intValue()); alarm.setAlarm_grade((String) item[7]); + if (null != item[8]) { + long logTmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[8]).toJdbc()).getTime(); + Calendar logCal = Calendar.getInstance(); + logCal.setTimeInMillis(logTmValue); + alarm.setLog_time(logCal.getTime()); + } else { + alarm.setLog_time(null); + } + + alarm.setLog_desc((String) item[9]); + + logger.debug("根据设备查询最新报警记录成功"); + + return alarm; + } else { + return null; + } + } catch (Exception ex) { + logger.error("根据设备查询最新报警记录成功", ex); + return null; + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + } + + @Override + public PgAlarm findLatestAlarmByDeviceAndType(int deviceId, String type) { + Connection conn = null; + String queryStr = "SELECT A.* FROM " + + "(SELECT ID, ACTIVE, ALARM_DATE, ALARM_VALUE, DESCRIPTION, ALARMDEVID, ALARMTYPEID, ALARM_GRADE, LOG_TIME, LOG_DESC FROM PG_ALARM WHERE ALARMDEVID = ? AND DESCRIPTION LIKE ? ORDER BY ALARM_DATE DESC) A " + + "WHERE ROWNUM <= 1"; + Object[] param = new Object[2]; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + QueryRunner runner = new QueryRunner(); + param[0] = deviceId; + param[1] = "%" + type + "%"; + + List tempList = runner.query(conn, queryStr, new ArrayListHandler(), param); + if (null != tempList && tempList.isEmpty() == false) { + PgAlarm alarm = new PgAlarm(); + Object[] item = tempList.get(0); + + alarm.setId(((Number) item[0]).intValue()); + alarm.setActive(((Number) item[1]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + alarm.setAlarm_date(cal.getTime()); + + alarm.setAlarm_value((String) item[3]); + alarm.setDescription((String) item[4]); + alarm.setAlarmdevid(((Number) item[5]).intValue()); + alarm.setAlarmtypeid(((Number) item[6]).intValue()); + alarm.setAlarm_grade((String) item[7]); + + long logTmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[8]).toJdbc()).getTime(); + Calendar logCal = Calendar.getInstance(); + logCal.setTimeInMillis(logTmValue); + alarm.setLog_time(logCal.getTime()); + alarm.setLog_desc((String) item[9]); + logger.debug("根据设备查询最新报警记录成功"); return alarm; @@ -111,28 +181,31 @@ QueryRunner runner = new QueryRunner(); // 查询同一设备是否有正在报警的消息 - Number id = (Number) runner.query(conn, querySql, new ScalarHandler(1), queryParam); + Number id = runner.query(conn, querySql, new ScalarHandler(1), queryParam); if (null != id) { // 找到设备已存在的记录 // 1先将正在报警的设备自动消警 - String updateSql = "UPDATE PG_ALARM SET ACTIVE=0 WHERE ID=?"; + String updateSql = "UPDATE PG_ALARM SET ACTIVE=0, LOG_TIME=SYSDATE, LOG_DESC=? WHERE ID=?"; - Object[] updateParam = new Object[1]; - updateParam[0] = id.longValue(); - - runner.update(conn, updateSql, updateParam); // 更新报警记录 - } + Object[] updateParam = new Object[2]; + updateParam[0] = "重复报警自动消警"; + updateParam[1] = id.longValue(); + + // 更新报警记录 + runner.update(conn, updateSql, updateParam); + } // 插入新的报警记录 String insertSql = "INSERT INTO PG_ALARM " + - "(ID, ACTIVE, ALARM_DATE, ALARM_VALUE, DESCRIPTION, ALARMDEVID, ALARMTYPEID, USERID, ALARM_GRADE) " + - "VALUES (?, ?, TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), ?, ?, ?, ?, ?, ?)"; + "(ID, ACTIVE, ALARM_DATE, ALARM_VALUE, DESCRIPTION, ALARMDEVID, ALARMTYPEID, USERID, ALARM_GRADE, LOG_TIME, LOG_DESC) " + + "VALUES (?, ?, TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), ?, ?, ?, ?, ?, ?, TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), ?)"; String sqlId = "SELECT SEQ_PG_ALARM_ID.NEXTVAL FROM DUAL"; - long newId = ((Number) runner.query(conn, sqlId, new ScalarHandler(1))).longValue(); // 获取新的id - - Object[] params = new Object[9]; + // 获取新的id + long newId = (runner.query(conn, sqlId, new ScalarHandler(1))).longValue(); + + Object[] params = new Object[11]; params[0] = newId; params[1] = alarmRecord.getActive(); @@ -143,8 +216,11 @@ params[6] = alarmRecord.getAlarmtypeid(); params[7] = alarmRecord.getUserid(); params[8] = alarmRecord.getAlarm_grade(); - - int count = runner.update(conn, insertSql, params); // 新增主表 + params[9] = TimeFormat.formatTimestamp(alarmRecord.getLog_time()); + params[10] = alarmRecord.getLog_desc(); + + // 新增报警记录 + int count = runner.update(conn, insertSql, params); if (count > 0) { logger.debug("插入报警数据成功"); diff --git a/src/com/szpg/db/dao/impl/PgCODaoImpl.java b/src/com/szpg/db/dao/impl/PgCODaoImpl.java index 186ac16..70d672c 100644 --- a/src/com/szpg/db/dao/impl/PgCODaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgCODaoImpl.java @@ -292,6 +292,51 @@ } @Override + public PgCO findLastRecordByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT ID, CO, LOGTIME, PGDEVICEID FROM (SELECT * FROM PG_CO WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, sql, new ArrayListHandler(), param); + if (null != tempList && tempList.size() == 1) { + PgCO co = new PgCO(); + Object[] item = tempList.get(0); + + co.setId(((Number) item[0]).intValue()); + co.setCo(Float.parseFloat((String) item[1])); + co.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + co.setLogtime(cal.getTime()); + co.setUptime(cal.getTime()); + + logger.debug("根据设备ID查询最新一氧化碳监测记录成功" + co + "]"); + + return co; + } else { + return null; + } + } catch (Exception ex) { + logger.error("根据设备ID查询最新一氧化碳监测记录异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override public int addPblzRecord(PgCO co) { return addPblzRecord(co.getCo(), co.getTmStr(), co.getPgdeviceid()); } diff --git a/src/com/szpg/db/dao/impl/PgCh4DaoImpl.java b/src/com/szpg/db/dao/impl/PgCh4DaoImpl.java index 0ed139e..768b6a5 100644 --- a/src/com/szpg/db/dao/impl/PgCh4DaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgCh4DaoImpl.java @@ -54,9 +54,9 @@ list.add(ch4); } return list; - } - else + } else { return null; + } } catch (Exception ex) { logger.error("查询所有甲烷监测值异常", ex); } finally { @@ -100,9 +100,9 @@ logger.debug("根据ID查询甲烷监测值成功" + ch4 + "]"); return ch4; - } - else + } else { return null; + } } catch (Exception ex) { logger.error("根据ID查询甲烷监测值异常", ex); } finally { @@ -149,9 +149,9 @@ logger.debug("根据设备ID查询最新的甲烷监测值成功" + ch4 + "]"); return ch4; - } - else + } else { return null; + } } catch (Exception ex) { logger.error("根据设备ID查询最新的甲烷监测值异常", ex); } finally { @@ -199,9 +199,9 @@ list.add(ch4); } return list; - } - else + } else { return null; + } } catch (Exception ex) { logger.error("根据设备ID查询甲烷监测值异常", ex); } finally { @@ -251,9 +251,9 @@ list.add(ch4); } return list; - } - else + } else { return null; + } } catch (Exception ex) { logger.error("根据设备ID和时间查询甲烷监测值异常", ex); } finally { @@ -293,6 +293,51 @@ } @Override + public PgCh4 findLastRecordByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT ID, CH4, LOGTIME, PGDEVICEID FROM (SELECT * FROM PG_CH4 WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, sql, new ArrayListHandler(), param); + if (null != tempList && tempList.size() == 1) { + PgCh4 ch4 = new PgCh4(); + Object[] item = tempList.get(0); + + ch4.setId(((Number) item[0]).intValue()); + ch4.setCh4(Float.parseFloat((String) item[1])); + ch4.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + ch4.setLogtime(cal.getTime()); + ch4.setUptime(cal.getTime()); + + logger.debug("根据设备ID查询最新甲烷监测记录成功" + ch4 + "]"); + + return ch4; + } else { + return null; + } + } catch (Exception ex) { + logger.error("根据设备ID查询最新甲烷监测记录异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override public int addPblzRecord(PgCh4 ch4) { return addPblzRecord(ch4.getCh4(), ch4.getTmStr(), ch4.getPgdeviceid()); } diff --git a/src/com/szpg/db/dao/PgAlarmDao.java b/src/com/szpg/db/dao/PgAlarmDao.java index 11d8a1d..4ab98d4 100644 --- a/src/com/szpg/db/dao/PgAlarmDao.java +++ b/src/com/szpg/db/dao/PgAlarmDao.java @@ -6,6 +6,7 @@ public int findAlarmCountByDate(String date); public PgAlarm findLatestAlarmByDevice(int deviceId); + public PgAlarm findLatestAlarmByDeviceAndType(int deviceId, String type); public long insertAlarmRecord(PgAlarm alarmRecord); } diff --git a/src/com/szpg/db/dao/PgCODao.java b/src/com/szpg/db/dao/PgCODao.java index 1664f51..5098321 100644 --- a/src/com/szpg/db/dao/PgCODao.java +++ b/src/com/szpg/db/dao/PgCODao.java @@ -20,6 +20,7 @@ public List findPblzByDeviceAndTm(Integer deviceid, String start, String end); public double findLastValueByDevice(Integer deviceid); + public PgCO findLastRecordByDevice(Integer id); public int addPblzRecord(PgCO ch4); public int addPblzRecord(float value, String tm, int deviceid); diff --git a/src/com/szpg/db/dao/PgCh4Dao.java b/src/com/szpg/db/dao/PgCh4Dao.java index e23b964..61fdfcd 100644 --- a/src/com/szpg/db/dao/PgCh4Dao.java +++ b/src/com/szpg/db/dao/PgCh4Dao.java @@ -20,6 +20,7 @@ public List findPblzByDeviceAndTm(Integer deviceid, String start, String end); public double findLastValueByDevice(Integer deviceid); + public PgCh4 findLastRecordByDevice(Integer deviceid); public int addPblzRecord(PgCh4 ch4); public int addPblzRecord(float value, String tm, int deviceid); diff --git a/src/com/szpg/db/dao/PgHSDao.java b/src/com/szpg/db/dao/PgHSDao.java index f89b044..0f0ee53 100644 --- a/src/com/szpg/db/dao/PgHSDao.java +++ b/src/com/szpg/db/dao/PgHSDao.java @@ -20,6 +20,7 @@ public List findPblzByDeviceAndTm(Integer deviceid, String start, String end); public double findLastValueByDevice(Integer deviceid); + public PgSH findLastRecordByDevice(Integer deviceid); public int addPblzRecord(PgSH hs); public int addPblzRecord(float value, String tm, int deviceid); diff --git a/src/com/szpg/db/dao/PgO2Dao.java b/src/com/szpg/db/dao/PgO2Dao.java index 0b3d0bf..678adab 100644 --- a/src/com/szpg/db/dao/PgO2Dao.java +++ b/src/com/szpg/db/dao/PgO2Dao.java @@ -20,6 +20,7 @@ public List findPblzByDeviceAndTm(Integer deviceid, String start, String end); public double findLastValueByDevice(Integer deviceid); + public PgO2 findLastRecordByDevice(Integer deviceid); public int addPblzRecord(PgO2 ch4); public int addPblzRecord(float value, String tm, int deviceid); diff --git a/src/com/szpg/db/dao/PgWsDao.java b/src/com/szpg/db/dao/PgWsDao.java index 370a83f..bfd0eed 100644 --- a/src/com/szpg/db/dao/PgWsDao.java +++ b/src/com/szpg/db/dao/PgWsDao.java @@ -21,6 +21,7 @@ public double findLastTempByDevice(Integer deviceid); public double findLastHumByDevice(Integer deviceid); + public PgTemphum findLastRecordByDevice(Integer deviceid); public int addWsdzRecord(PgTemphum wsdz); public int addWsdzRecord(float temp, float hum, String tm, int deviceid); diff --git a/src/com/szpg/db/dao/impl/PgAlarmDaoImpl.java b/src/com/szpg/db/dao/impl/PgAlarmDaoImpl.java index cedf5fc..ce9ee0f 100644 --- a/src/com/szpg/db/dao/impl/PgAlarmDaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgAlarmDaoImpl.java @@ -8,7 +8,6 @@ import org.apache.commons.dbutils.DbUtils; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.handlers.ArrayListHandler; -import org.apache.commons.dbutils.handlers.BeanListHandler; import org.apache.commons.dbutils.handlers.ScalarHandler; import org.apache.log4j.Logger; @@ -17,6 +16,9 @@ import com.szpg.db.util.ConnectionManager; import com.szpg.util.TimeFormat; +/** + * @author TAN YUE + */ public class PgAlarmDaoImpl implements PgAlarmDao { private final Logger logger = Logger.getLogger(this.getClass().getName()); @@ -33,7 +35,7 @@ QueryRunner runner = new QueryRunner(); param[0] = date; - int count = ((Number) runner.query(conn, sql, new ScalarHandler(1), param)).intValue(); + int count = (runner.query(conn, sql, new ScalarHandler(1), param)).intValue(); return count; } catch (Exception ex) { logger.error("根据日期查询报警记录数异常", ex); @@ -51,7 +53,7 @@ public PgAlarm findLatestAlarmByDevice(int deviceId) { Connection conn = null; String queryStr = "SELECT A.* FROM " + - "(SELECT ID, ACTIVE, ALARM_DATE, ALARM_VALUE, DESCRIPTION, ALARMDEVID, ALARMTYPEID, ALARM_GRADE FROM PG_ALARM WHERE ALARMDEVID = ? ORDER BY ALARM_DATE DESC) A " + + "(SELECT ID, ACTIVE, ALARM_DATE, ALARM_VALUE, DESCRIPTION, ALARMDEVID, ALARMTYPEID, ALARM_GRADE, LOG_TIME, LOG_DESC FROM PG_ALARM WHERE ALARMDEVID = ? ORDER BY ALARM_DATE DESC) A " + "WHERE ROWNUM <= 1"; Object[] param = new Object[1]; try { @@ -60,7 +62,7 @@ QueryRunner runner = new QueryRunner(); param[0] = deviceId; - List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler(), param); + List tempList = runner.query(conn, queryStr, new ArrayListHandler(), param); if (null != tempList && tempList.isEmpty() == false) { PgAlarm alarm = new PgAlarm(); Object[] item = tempList.get(0); @@ -79,6 +81,74 @@ alarm.setAlarmtypeid(((Number) item[6]).intValue()); alarm.setAlarm_grade((String) item[7]); + if (null != item[8]) { + long logTmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[8]).toJdbc()).getTime(); + Calendar logCal = Calendar.getInstance(); + logCal.setTimeInMillis(logTmValue); + alarm.setLog_time(logCal.getTime()); + } else { + alarm.setLog_time(null); + } + + alarm.setLog_desc((String) item[9]); + + logger.debug("根据设备查询最新报警记录成功"); + + return alarm; + } else { + return null; + } + } catch (Exception ex) { + logger.error("根据设备查询最新报警记录成功", ex); + return null; + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + } + + @Override + public PgAlarm findLatestAlarmByDeviceAndType(int deviceId, String type) { + Connection conn = null; + String queryStr = "SELECT A.* FROM " + + "(SELECT ID, ACTIVE, ALARM_DATE, ALARM_VALUE, DESCRIPTION, ALARMDEVID, ALARMTYPEID, ALARM_GRADE, LOG_TIME, LOG_DESC FROM PG_ALARM WHERE ALARMDEVID = ? AND DESCRIPTION LIKE ? ORDER BY ALARM_DATE DESC) A " + + "WHERE ROWNUM <= 1"; + Object[] param = new Object[2]; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + QueryRunner runner = new QueryRunner(); + param[0] = deviceId; + param[1] = "%" + type + "%"; + + List tempList = runner.query(conn, queryStr, new ArrayListHandler(), param); + if (null != tempList && tempList.isEmpty() == false) { + PgAlarm alarm = new PgAlarm(); + Object[] item = tempList.get(0); + + alarm.setId(((Number) item[0]).intValue()); + alarm.setActive(((Number) item[1]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + alarm.setAlarm_date(cal.getTime()); + + alarm.setAlarm_value((String) item[3]); + alarm.setDescription((String) item[4]); + alarm.setAlarmdevid(((Number) item[5]).intValue()); + alarm.setAlarmtypeid(((Number) item[6]).intValue()); + alarm.setAlarm_grade((String) item[7]); + + long logTmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[8]).toJdbc()).getTime(); + Calendar logCal = Calendar.getInstance(); + logCal.setTimeInMillis(logTmValue); + alarm.setLog_time(logCal.getTime()); + alarm.setLog_desc((String) item[9]); + logger.debug("根据设备查询最新报警记录成功"); return alarm; @@ -111,28 +181,31 @@ QueryRunner runner = new QueryRunner(); // 查询同一设备是否有正在报警的消息 - Number id = (Number) runner.query(conn, querySql, new ScalarHandler(1), queryParam); + Number id = runner.query(conn, querySql, new ScalarHandler(1), queryParam); if (null != id) { // 找到设备已存在的记录 // 1先将正在报警的设备自动消警 - String updateSql = "UPDATE PG_ALARM SET ACTIVE=0 WHERE ID=?"; + String updateSql = "UPDATE PG_ALARM SET ACTIVE=0, LOG_TIME=SYSDATE, LOG_DESC=? WHERE ID=?"; - Object[] updateParam = new Object[1]; - updateParam[0] = id.longValue(); - - runner.update(conn, updateSql, updateParam); // 更新报警记录 - } + Object[] updateParam = new Object[2]; + updateParam[0] = "重复报警自动消警"; + updateParam[1] = id.longValue(); + + // 更新报警记录 + runner.update(conn, updateSql, updateParam); + } // 插入新的报警记录 String insertSql = "INSERT INTO PG_ALARM " + - "(ID, ACTIVE, ALARM_DATE, ALARM_VALUE, DESCRIPTION, ALARMDEVID, ALARMTYPEID, USERID, ALARM_GRADE) " + - "VALUES (?, ?, TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), ?, ?, ?, ?, ?, ?)"; + "(ID, ACTIVE, ALARM_DATE, ALARM_VALUE, DESCRIPTION, ALARMDEVID, ALARMTYPEID, USERID, ALARM_GRADE, LOG_TIME, LOG_DESC) " + + "VALUES (?, ?, TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), ?, ?, ?, ?, ?, ?, TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), ?)"; String sqlId = "SELECT SEQ_PG_ALARM_ID.NEXTVAL FROM DUAL"; - long newId = ((Number) runner.query(conn, sqlId, new ScalarHandler(1))).longValue(); // 获取新的id - - Object[] params = new Object[9]; + // 获取新的id + long newId = (runner.query(conn, sqlId, new ScalarHandler(1))).longValue(); + + Object[] params = new Object[11]; params[0] = newId; params[1] = alarmRecord.getActive(); @@ -143,8 +216,11 @@ params[6] = alarmRecord.getAlarmtypeid(); params[7] = alarmRecord.getUserid(); params[8] = alarmRecord.getAlarm_grade(); - - int count = runner.update(conn, insertSql, params); // 新增主表 + params[9] = TimeFormat.formatTimestamp(alarmRecord.getLog_time()); + params[10] = alarmRecord.getLog_desc(); + + // 新增报警记录 + int count = runner.update(conn, insertSql, params); if (count > 0) { logger.debug("插入报警数据成功"); diff --git a/src/com/szpg/db/dao/impl/PgCODaoImpl.java b/src/com/szpg/db/dao/impl/PgCODaoImpl.java index 186ac16..70d672c 100644 --- a/src/com/szpg/db/dao/impl/PgCODaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgCODaoImpl.java @@ -292,6 +292,51 @@ } @Override + public PgCO findLastRecordByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT ID, CO, LOGTIME, PGDEVICEID FROM (SELECT * FROM PG_CO WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, sql, new ArrayListHandler(), param); + if (null != tempList && tempList.size() == 1) { + PgCO co = new PgCO(); + Object[] item = tempList.get(0); + + co.setId(((Number) item[0]).intValue()); + co.setCo(Float.parseFloat((String) item[1])); + co.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + co.setLogtime(cal.getTime()); + co.setUptime(cal.getTime()); + + logger.debug("根据设备ID查询最新一氧化碳监测记录成功" + co + "]"); + + return co; + } else { + return null; + } + } catch (Exception ex) { + logger.error("根据设备ID查询最新一氧化碳监测记录异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override public int addPblzRecord(PgCO co) { return addPblzRecord(co.getCo(), co.getTmStr(), co.getPgdeviceid()); } diff --git a/src/com/szpg/db/dao/impl/PgCh4DaoImpl.java b/src/com/szpg/db/dao/impl/PgCh4DaoImpl.java index 0ed139e..768b6a5 100644 --- a/src/com/szpg/db/dao/impl/PgCh4DaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgCh4DaoImpl.java @@ -54,9 +54,9 @@ list.add(ch4); } return list; - } - else + } else { return null; + } } catch (Exception ex) { logger.error("查询所有甲烷监测值异常", ex); } finally { @@ -100,9 +100,9 @@ logger.debug("根据ID查询甲烷监测值成功" + ch4 + "]"); return ch4; - } - else + } else { return null; + } } catch (Exception ex) { logger.error("根据ID查询甲烷监测值异常", ex); } finally { @@ -149,9 +149,9 @@ logger.debug("根据设备ID查询最新的甲烷监测值成功" + ch4 + "]"); return ch4; - } - else + } else { return null; + } } catch (Exception ex) { logger.error("根据设备ID查询最新的甲烷监测值异常", ex); } finally { @@ -199,9 +199,9 @@ list.add(ch4); } return list; - } - else + } else { return null; + } } catch (Exception ex) { logger.error("根据设备ID查询甲烷监测值异常", ex); } finally { @@ -251,9 +251,9 @@ list.add(ch4); } return list; - } - else + } else { return null; + } } catch (Exception ex) { logger.error("根据设备ID和时间查询甲烷监测值异常", ex); } finally { @@ -293,6 +293,51 @@ } @Override + public PgCh4 findLastRecordByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT ID, CH4, LOGTIME, PGDEVICEID FROM (SELECT * FROM PG_CH4 WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, sql, new ArrayListHandler(), param); + if (null != tempList && tempList.size() == 1) { + PgCh4 ch4 = new PgCh4(); + Object[] item = tempList.get(0); + + ch4.setId(((Number) item[0]).intValue()); + ch4.setCh4(Float.parseFloat((String) item[1])); + ch4.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + ch4.setLogtime(cal.getTime()); + ch4.setUptime(cal.getTime()); + + logger.debug("根据设备ID查询最新甲烷监测记录成功" + ch4 + "]"); + + return ch4; + } else { + return null; + } + } catch (Exception ex) { + logger.error("根据设备ID查询最新甲烷监测记录异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override public int addPblzRecord(PgCh4 ch4) { return addPblzRecord(ch4.getCh4(), ch4.getTmStr(), ch4.getPgdeviceid()); } diff --git a/src/com/szpg/db/dao/impl/PgHSDaoImpl.java b/src/com/szpg/db/dao/impl/PgHSDaoImpl.java index 892e175..fa4ea02 100644 --- a/src/com/szpg/db/dao/impl/PgHSDaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgHSDaoImpl.java @@ -292,6 +292,51 @@ } @Override + public PgSH findLastRecordByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT ID, SH, LOGTIME, PGDEVICEID FROM (SELECT * FROM PG_SH WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, sql, new ArrayListHandler(), param); + if (null != tempList && tempList.size() == 1) { + PgSH sh = new PgSH(); + Object[] item = tempList.get(0); + + sh.setId(((Number) item[0]).intValue()); + sh.setSh(Float.parseFloat((String) item[1])); + sh.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + sh.setLogtime(cal.getTime()); + sh.setUptime(cal.getTime()); + + logger.debug("根据设备ID查询最新硫化氢监测记录成功" + sh + "]"); + + return sh; + } else { + return null; + } + } catch (Exception ex) { + logger.error("根据设备ID查询最新硫化氢监测记录异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override public int addPblzRecord(PgSH sh) { return addPblzRecord(sh.getSh(), sh.getTmStr(), sh.getPgdeviceid()); } diff --git a/src/com/szpg/db/dao/PgAlarmDao.java b/src/com/szpg/db/dao/PgAlarmDao.java index 11d8a1d..4ab98d4 100644 --- a/src/com/szpg/db/dao/PgAlarmDao.java +++ b/src/com/szpg/db/dao/PgAlarmDao.java @@ -6,6 +6,7 @@ public int findAlarmCountByDate(String date); public PgAlarm findLatestAlarmByDevice(int deviceId); + public PgAlarm findLatestAlarmByDeviceAndType(int deviceId, String type); public long insertAlarmRecord(PgAlarm alarmRecord); } diff --git a/src/com/szpg/db/dao/PgCODao.java b/src/com/szpg/db/dao/PgCODao.java index 1664f51..5098321 100644 --- a/src/com/szpg/db/dao/PgCODao.java +++ b/src/com/szpg/db/dao/PgCODao.java @@ -20,6 +20,7 @@ public List findPblzByDeviceAndTm(Integer deviceid, String start, String end); public double findLastValueByDevice(Integer deviceid); + public PgCO findLastRecordByDevice(Integer id); public int addPblzRecord(PgCO ch4); public int addPblzRecord(float value, String tm, int deviceid); diff --git a/src/com/szpg/db/dao/PgCh4Dao.java b/src/com/szpg/db/dao/PgCh4Dao.java index e23b964..61fdfcd 100644 --- a/src/com/szpg/db/dao/PgCh4Dao.java +++ b/src/com/szpg/db/dao/PgCh4Dao.java @@ -20,6 +20,7 @@ public List findPblzByDeviceAndTm(Integer deviceid, String start, String end); public double findLastValueByDevice(Integer deviceid); + public PgCh4 findLastRecordByDevice(Integer deviceid); public int addPblzRecord(PgCh4 ch4); public int addPblzRecord(float value, String tm, int deviceid); diff --git a/src/com/szpg/db/dao/PgHSDao.java b/src/com/szpg/db/dao/PgHSDao.java index f89b044..0f0ee53 100644 --- a/src/com/szpg/db/dao/PgHSDao.java +++ b/src/com/szpg/db/dao/PgHSDao.java @@ -20,6 +20,7 @@ public List findPblzByDeviceAndTm(Integer deviceid, String start, String end); public double findLastValueByDevice(Integer deviceid); + public PgSH findLastRecordByDevice(Integer deviceid); public int addPblzRecord(PgSH hs); public int addPblzRecord(float value, String tm, int deviceid); diff --git a/src/com/szpg/db/dao/PgO2Dao.java b/src/com/szpg/db/dao/PgO2Dao.java index 0b3d0bf..678adab 100644 --- a/src/com/szpg/db/dao/PgO2Dao.java +++ b/src/com/szpg/db/dao/PgO2Dao.java @@ -20,6 +20,7 @@ public List findPblzByDeviceAndTm(Integer deviceid, String start, String end); public double findLastValueByDevice(Integer deviceid); + public PgO2 findLastRecordByDevice(Integer deviceid); public int addPblzRecord(PgO2 ch4); public int addPblzRecord(float value, String tm, int deviceid); diff --git a/src/com/szpg/db/dao/PgWsDao.java b/src/com/szpg/db/dao/PgWsDao.java index 370a83f..bfd0eed 100644 --- a/src/com/szpg/db/dao/PgWsDao.java +++ b/src/com/szpg/db/dao/PgWsDao.java @@ -21,6 +21,7 @@ public double findLastTempByDevice(Integer deviceid); public double findLastHumByDevice(Integer deviceid); + public PgTemphum findLastRecordByDevice(Integer deviceid); public int addWsdzRecord(PgTemphum wsdz); public int addWsdzRecord(float temp, float hum, String tm, int deviceid); diff --git a/src/com/szpg/db/dao/impl/PgAlarmDaoImpl.java b/src/com/szpg/db/dao/impl/PgAlarmDaoImpl.java index cedf5fc..ce9ee0f 100644 --- a/src/com/szpg/db/dao/impl/PgAlarmDaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgAlarmDaoImpl.java @@ -8,7 +8,6 @@ import org.apache.commons.dbutils.DbUtils; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.handlers.ArrayListHandler; -import org.apache.commons.dbutils.handlers.BeanListHandler; import org.apache.commons.dbutils.handlers.ScalarHandler; import org.apache.log4j.Logger; @@ -17,6 +16,9 @@ import com.szpg.db.util.ConnectionManager; import com.szpg.util.TimeFormat; +/** + * @author TAN YUE + */ public class PgAlarmDaoImpl implements PgAlarmDao { private final Logger logger = Logger.getLogger(this.getClass().getName()); @@ -33,7 +35,7 @@ QueryRunner runner = new QueryRunner(); param[0] = date; - int count = ((Number) runner.query(conn, sql, new ScalarHandler(1), param)).intValue(); + int count = (runner.query(conn, sql, new ScalarHandler(1), param)).intValue(); return count; } catch (Exception ex) { logger.error("根据日期查询报警记录数异常", ex); @@ -51,7 +53,7 @@ public PgAlarm findLatestAlarmByDevice(int deviceId) { Connection conn = null; String queryStr = "SELECT A.* FROM " + - "(SELECT ID, ACTIVE, ALARM_DATE, ALARM_VALUE, DESCRIPTION, ALARMDEVID, ALARMTYPEID, ALARM_GRADE FROM PG_ALARM WHERE ALARMDEVID = ? ORDER BY ALARM_DATE DESC) A " + + "(SELECT ID, ACTIVE, ALARM_DATE, ALARM_VALUE, DESCRIPTION, ALARMDEVID, ALARMTYPEID, ALARM_GRADE, LOG_TIME, LOG_DESC FROM PG_ALARM WHERE ALARMDEVID = ? ORDER BY ALARM_DATE DESC) A " + "WHERE ROWNUM <= 1"; Object[] param = new Object[1]; try { @@ -60,7 +62,7 @@ QueryRunner runner = new QueryRunner(); param[0] = deviceId; - List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler(), param); + List tempList = runner.query(conn, queryStr, new ArrayListHandler(), param); if (null != tempList && tempList.isEmpty() == false) { PgAlarm alarm = new PgAlarm(); Object[] item = tempList.get(0); @@ -79,6 +81,74 @@ alarm.setAlarmtypeid(((Number) item[6]).intValue()); alarm.setAlarm_grade((String) item[7]); + if (null != item[8]) { + long logTmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[8]).toJdbc()).getTime(); + Calendar logCal = Calendar.getInstance(); + logCal.setTimeInMillis(logTmValue); + alarm.setLog_time(logCal.getTime()); + } else { + alarm.setLog_time(null); + } + + alarm.setLog_desc((String) item[9]); + + logger.debug("根据设备查询最新报警记录成功"); + + return alarm; + } else { + return null; + } + } catch (Exception ex) { + logger.error("根据设备查询最新报警记录成功", ex); + return null; + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + } + + @Override + public PgAlarm findLatestAlarmByDeviceAndType(int deviceId, String type) { + Connection conn = null; + String queryStr = "SELECT A.* FROM " + + "(SELECT ID, ACTIVE, ALARM_DATE, ALARM_VALUE, DESCRIPTION, ALARMDEVID, ALARMTYPEID, ALARM_GRADE, LOG_TIME, LOG_DESC FROM PG_ALARM WHERE ALARMDEVID = ? AND DESCRIPTION LIKE ? ORDER BY ALARM_DATE DESC) A " + + "WHERE ROWNUM <= 1"; + Object[] param = new Object[2]; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + QueryRunner runner = new QueryRunner(); + param[0] = deviceId; + param[1] = "%" + type + "%"; + + List tempList = runner.query(conn, queryStr, new ArrayListHandler(), param); + if (null != tempList && tempList.isEmpty() == false) { + PgAlarm alarm = new PgAlarm(); + Object[] item = tempList.get(0); + + alarm.setId(((Number) item[0]).intValue()); + alarm.setActive(((Number) item[1]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + alarm.setAlarm_date(cal.getTime()); + + alarm.setAlarm_value((String) item[3]); + alarm.setDescription((String) item[4]); + alarm.setAlarmdevid(((Number) item[5]).intValue()); + alarm.setAlarmtypeid(((Number) item[6]).intValue()); + alarm.setAlarm_grade((String) item[7]); + + long logTmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[8]).toJdbc()).getTime(); + Calendar logCal = Calendar.getInstance(); + logCal.setTimeInMillis(logTmValue); + alarm.setLog_time(logCal.getTime()); + alarm.setLog_desc((String) item[9]); + logger.debug("根据设备查询最新报警记录成功"); return alarm; @@ -111,28 +181,31 @@ QueryRunner runner = new QueryRunner(); // 查询同一设备是否有正在报警的消息 - Number id = (Number) runner.query(conn, querySql, new ScalarHandler(1), queryParam); + Number id = runner.query(conn, querySql, new ScalarHandler(1), queryParam); if (null != id) { // 找到设备已存在的记录 // 1先将正在报警的设备自动消警 - String updateSql = "UPDATE PG_ALARM SET ACTIVE=0 WHERE ID=?"; + String updateSql = "UPDATE PG_ALARM SET ACTIVE=0, LOG_TIME=SYSDATE, LOG_DESC=? WHERE ID=?"; - Object[] updateParam = new Object[1]; - updateParam[0] = id.longValue(); - - runner.update(conn, updateSql, updateParam); // 更新报警记录 - } + Object[] updateParam = new Object[2]; + updateParam[0] = "重复报警自动消警"; + updateParam[1] = id.longValue(); + + // 更新报警记录 + runner.update(conn, updateSql, updateParam); + } // 插入新的报警记录 String insertSql = "INSERT INTO PG_ALARM " + - "(ID, ACTIVE, ALARM_DATE, ALARM_VALUE, DESCRIPTION, ALARMDEVID, ALARMTYPEID, USERID, ALARM_GRADE) " + - "VALUES (?, ?, TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), ?, ?, ?, ?, ?, ?)"; + "(ID, ACTIVE, ALARM_DATE, ALARM_VALUE, DESCRIPTION, ALARMDEVID, ALARMTYPEID, USERID, ALARM_GRADE, LOG_TIME, LOG_DESC) " + + "VALUES (?, ?, TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), ?, ?, ?, ?, ?, ?, TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), ?)"; String sqlId = "SELECT SEQ_PG_ALARM_ID.NEXTVAL FROM DUAL"; - long newId = ((Number) runner.query(conn, sqlId, new ScalarHandler(1))).longValue(); // 获取新的id - - Object[] params = new Object[9]; + // 获取新的id + long newId = (runner.query(conn, sqlId, new ScalarHandler(1))).longValue(); + + Object[] params = new Object[11]; params[0] = newId; params[1] = alarmRecord.getActive(); @@ -143,8 +216,11 @@ params[6] = alarmRecord.getAlarmtypeid(); params[7] = alarmRecord.getUserid(); params[8] = alarmRecord.getAlarm_grade(); - - int count = runner.update(conn, insertSql, params); // 新增主表 + params[9] = TimeFormat.formatTimestamp(alarmRecord.getLog_time()); + params[10] = alarmRecord.getLog_desc(); + + // 新增报警记录 + int count = runner.update(conn, insertSql, params); if (count > 0) { logger.debug("插入报警数据成功"); diff --git a/src/com/szpg/db/dao/impl/PgCODaoImpl.java b/src/com/szpg/db/dao/impl/PgCODaoImpl.java index 186ac16..70d672c 100644 --- a/src/com/szpg/db/dao/impl/PgCODaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgCODaoImpl.java @@ -292,6 +292,51 @@ } @Override + public PgCO findLastRecordByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT ID, CO, LOGTIME, PGDEVICEID FROM (SELECT * FROM PG_CO WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, sql, new ArrayListHandler(), param); + if (null != tempList && tempList.size() == 1) { + PgCO co = new PgCO(); + Object[] item = tempList.get(0); + + co.setId(((Number) item[0]).intValue()); + co.setCo(Float.parseFloat((String) item[1])); + co.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + co.setLogtime(cal.getTime()); + co.setUptime(cal.getTime()); + + logger.debug("根据设备ID查询最新一氧化碳监测记录成功" + co + "]"); + + return co; + } else { + return null; + } + } catch (Exception ex) { + logger.error("根据设备ID查询最新一氧化碳监测记录异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override public int addPblzRecord(PgCO co) { return addPblzRecord(co.getCo(), co.getTmStr(), co.getPgdeviceid()); } diff --git a/src/com/szpg/db/dao/impl/PgCh4DaoImpl.java b/src/com/szpg/db/dao/impl/PgCh4DaoImpl.java index 0ed139e..768b6a5 100644 --- a/src/com/szpg/db/dao/impl/PgCh4DaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgCh4DaoImpl.java @@ -54,9 +54,9 @@ list.add(ch4); } return list; - } - else + } else { return null; + } } catch (Exception ex) { logger.error("查询所有甲烷监测值异常", ex); } finally { @@ -100,9 +100,9 @@ logger.debug("根据ID查询甲烷监测值成功" + ch4 + "]"); return ch4; - } - else + } else { return null; + } } catch (Exception ex) { logger.error("根据ID查询甲烷监测值异常", ex); } finally { @@ -149,9 +149,9 @@ logger.debug("根据设备ID查询最新的甲烷监测值成功" + ch4 + "]"); return ch4; - } - else + } else { return null; + } } catch (Exception ex) { logger.error("根据设备ID查询最新的甲烷监测值异常", ex); } finally { @@ -199,9 +199,9 @@ list.add(ch4); } return list; - } - else + } else { return null; + } } catch (Exception ex) { logger.error("根据设备ID查询甲烷监测值异常", ex); } finally { @@ -251,9 +251,9 @@ list.add(ch4); } return list; - } - else + } else { return null; + } } catch (Exception ex) { logger.error("根据设备ID和时间查询甲烷监测值异常", ex); } finally { @@ -293,6 +293,51 @@ } @Override + public PgCh4 findLastRecordByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT ID, CH4, LOGTIME, PGDEVICEID FROM (SELECT * FROM PG_CH4 WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, sql, new ArrayListHandler(), param); + if (null != tempList && tempList.size() == 1) { + PgCh4 ch4 = new PgCh4(); + Object[] item = tempList.get(0); + + ch4.setId(((Number) item[0]).intValue()); + ch4.setCh4(Float.parseFloat((String) item[1])); + ch4.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + ch4.setLogtime(cal.getTime()); + ch4.setUptime(cal.getTime()); + + logger.debug("根据设备ID查询最新甲烷监测记录成功" + ch4 + "]"); + + return ch4; + } else { + return null; + } + } catch (Exception ex) { + logger.error("根据设备ID查询最新甲烷监测记录异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override public int addPblzRecord(PgCh4 ch4) { return addPblzRecord(ch4.getCh4(), ch4.getTmStr(), ch4.getPgdeviceid()); } diff --git a/src/com/szpg/db/dao/impl/PgHSDaoImpl.java b/src/com/szpg/db/dao/impl/PgHSDaoImpl.java index 892e175..fa4ea02 100644 --- a/src/com/szpg/db/dao/impl/PgHSDaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgHSDaoImpl.java @@ -292,6 +292,51 @@ } @Override + public PgSH findLastRecordByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT ID, SH, LOGTIME, PGDEVICEID FROM (SELECT * FROM PG_SH WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, sql, new ArrayListHandler(), param); + if (null != tempList && tempList.size() == 1) { + PgSH sh = new PgSH(); + Object[] item = tempList.get(0); + + sh.setId(((Number) item[0]).intValue()); + sh.setSh(Float.parseFloat((String) item[1])); + sh.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + sh.setLogtime(cal.getTime()); + sh.setUptime(cal.getTime()); + + logger.debug("根据设备ID查询最新硫化氢监测记录成功" + sh + "]"); + + return sh; + } else { + return null; + } + } catch (Exception ex) { + logger.error("根据设备ID查询最新硫化氢监测记录异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override public int addPblzRecord(PgSH sh) { return addPblzRecord(sh.getSh(), sh.getTmStr(), sh.getPgdeviceid()); } diff --git a/src/com/szpg/db/dao/impl/PgO2DaoImpl.java b/src/com/szpg/db/dao/impl/PgO2DaoImpl.java index f58f8cd..842291b 100644 --- a/src/com/szpg/db/dao/impl/PgO2DaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgO2DaoImpl.java @@ -54,9 +54,9 @@ list.add(o2); } return list; - } - else + } else { return null; + } } catch (Exception ex) { logger.error("查询所有氧气监测值异常", ex); } finally { @@ -100,9 +100,9 @@ logger.debug("根据ID查询氧气监测值成功" + o2 + "]"); return o2; - } - else + } else { return null; + } } catch (Exception ex) { logger.error("根据ID查询氧气监测值异常", ex); } finally { @@ -148,9 +148,9 @@ logger.debug("根据设备ID查询最新的氧气监测值成功" + o2 + "]"); return o2; - } - else + } else { return null; + } } catch (Exception ex) { logger.error("根据设备ID查询最新的硫化氢监测值异常", ex); } finally { @@ -198,9 +198,9 @@ list.add(o2); } return list; - } - else + } else { return null; + } } catch (Exception ex) { logger.error("根据设备ID查询氧气监测值异常", ex); } finally { @@ -250,9 +250,9 @@ list.add(o2); } return list; - } - else + } else { return null; + } } catch (Exception ex) { logger.error("根据设备ID和时间查询氧气监测值异常", ex); } finally { @@ -292,6 +292,51 @@ } @Override + public PgO2 findLastRecordByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT ID, O2, LOGTIME, PGDEVICEID FROM (SELECT * FROM PG_O2 WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, sql, new ArrayListHandler(), param); + if (null != tempList && tempList.size() == 1) { + PgO2 o2 = new PgO2(); + Object[] item = tempList.get(0); + + o2.setId(((Number) item[0]).intValue()); + o2.setO2(Float.parseFloat((String) item[1])); + o2.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + o2.setLogtime(cal.getTime()); + o2.setUptime(cal.getTime()); + + logger.debug("根据设备ID查询最新氧气监测记录成功" + o2 + "]"); + + return o2; + } else { + return null; + } + } catch (Exception ex) { + logger.error("根据设备ID查询最新氧气监测记录异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override public int addPblzRecord(PgO2 o2) { return addPblzRecord(o2.getO2(), o2.getTmStr(), o2.getPgdeviceid()); } @@ -316,10 +361,11 @@ QueryRunner runner = new QueryRunner(); int count = runner.update(conn, insertStr, params); - if (count > 0) + if (count > 0) { logger.debug("插入氧气监测值成功[tm=" + tm + ", value=" + value + ", deviceid=" + deviceid + "]"); - else + } else { logger.error("插入氧气监测值失败!"); + } return count; } catch (Exception ex) { diff --git a/src/com/szpg/db/dao/PgAlarmDao.java b/src/com/szpg/db/dao/PgAlarmDao.java index 11d8a1d..4ab98d4 100644 --- a/src/com/szpg/db/dao/PgAlarmDao.java +++ b/src/com/szpg/db/dao/PgAlarmDao.java @@ -6,6 +6,7 @@ public int findAlarmCountByDate(String date); public PgAlarm findLatestAlarmByDevice(int deviceId); + public PgAlarm findLatestAlarmByDeviceAndType(int deviceId, String type); public long insertAlarmRecord(PgAlarm alarmRecord); } diff --git a/src/com/szpg/db/dao/PgCODao.java b/src/com/szpg/db/dao/PgCODao.java index 1664f51..5098321 100644 --- a/src/com/szpg/db/dao/PgCODao.java +++ b/src/com/szpg/db/dao/PgCODao.java @@ -20,6 +20,7 @@ public List findPblzByDeviceAndTm(Integer deviceid, String start, String end); public double findLastValueByDevice(Integer deviceid); + public PgCO findLastRecordByDevice(Integer id); public int addPblzRecord(PgCO ch4); public int addPblzRecord(float value, String tm, int deviceid); diff --git a/src/com/szpg/db/dao/PgCh4Dao.java b/src/com/szpg/db/dao/PgCh4Dao.java index e23b964..61fdfcd 100644 --- a/src/com/szpg/db/dao/PgCh4Dao.java +++ b/src/com/szpg/db/dao/PgCh4Dao.java @@ -20,6 +20,7 @@ public List findPblzByDeviceAndTm(Integer deviceid, String start, String end); public double findLastValueByDevice(Integer deviceid); + public PgCh4 findLastRecordByDevice(Integer deviceid); public int addPblzRecord(PgCh4 ch4); public int addPblzRecord(float value, String tm, int deviceid); diff --git a/src/com/szpg/db/dao/PgHSDao.java b/src/com/szpg/db/dao/PgHSDao.java index f89b044..0f0ee53 100644 --- a/src/com/szpg/db/dao/PgHSDao.java +++ b/src/com/szpg/db/dao/PgHSDao.java @@ -20,6 +20,7 @@ public List findPblzByDeviceAndTm(Integer deviceid, String start, String end); public double findLastValueByDevice(Integer deviceid); + public PgSH findLastRecordByDevice(Integer deviceid); public int addPblzRecord(PgSH hs); public int addPblzRecord(float value, String tm, int deviceid); diff --git a/src/com/szpg/db/dao/PgO2Dao.java b/src/com/szpg/db/dao/PgO2Dao.java index 0b3d0bf..678adab 100644 --- a/src/com/szpg/db/dao/PgO2Dao.java +++ b/src/com/szpg/db/dao/PgO2Dao.java @@ -20,6 +20,7 @@ public List findPblzByDeviceAndTm(Integer deviceid, String start, String end); public double findLastValueByDevice(Integer deviceid); + public PgO2 findLastRecordByDevice(Integer deviceid); public int addPblzRecord(PgO2 ch4); public int addPblzRecord(float value, String tm, int deviceid); diff --git a/src/com/szpg/db/dao/PgWsDao.java b/src/com/szpg/db/dao/PgWsDao.java index 370a83f..bfd0eed 100644 --- a/src/com/szpg/db/dao/PgWsDao.java +++ b/src/com/szpg/db/dao/PgWsDao.java @@ -21,6 +21,7 @@ public double findLastTempByDevice(Integer deviceid); public double findLastHumByDevice(Integer deviceid); + public PgTemphum findLastRecordByDevice(Integer deviceid); public int addWsdzRecord(PgTemphum wsdz); public int addWsdzRecord(float temp, float hum, String tm, int deviceid); diff --git a/src/com/szpg/db/dao/impl/PgAlarmDaoImpl.java b/src/com/szpg/db/dao/impl/PgAlarmDaoImpl.java index cedf5fc..ce9ee0f 100644 --- a/src/com/szpg/db/dao/impl/PgAlarmDaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgAlarmDaoImpl.java @@ -8,7 +8,6 @@ import org.apache.commons.dbutils.DbUtils; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.handlers.ArrayListHandler; -import org.apache.commons.dbutils.handlers.BeanListHandler; import org.apache.commons.dbutils.handlers.ScalarHandler; import org.apache.log4j.Logger; @@ -17,6 +16,9 @@ import com.szpg.db.util.ConnectionManager; import com.szpg.util.TimeFormat; +/** + * @author TAN YUE + */ public class PgAlarmDaoImpl implements PgAlarmDao { private final Logger logger = Logger.getLogger(this.getClass().getName()); @@ -33,7 +35,7 @@ QueryRunner runner = new QueryRunner(); param[0] = date; - int count = ((Number) runner.query(conn, sql, new ScalarHandler(1), param)).intValue(); + int count = (runner.query(conn, sql, new ScalarHandler(1), param)).intValue(); return count; } catch (Exception ex) { logger.error("根据日期查询报警记录数异常", ex); @@ -51,7 +53,7 @@ public PgAlarm findLatestAlarmByDevice(int deviceId) { Connection conn = null; String queryStr = "SELECT A.* FROM " + - "(SELECT ID, ACTIVE, ALARM_DATE, ALARM_VALUE, DESCRIPTION, ALARMDEVID, ALARMTYPEID, ALARM_GRADE FROM PG_ALARM WHERE ALARMDEVID = ? ORDER BY ALARM_DATE DESC) A " + + "(SELECT ID, ACTIVE, ALARM_DATE, ALARM_VALUE, DESCRIPTION, ALARMDEVID, ALARMTYPEID, ALARM_GRADE, LOG_TIME, LOG_DESC FROM PG_ALARM WHERE ALARMDEVID = ? ORDER BY ALARM_DATE DESC) A " + "WHERE ROWNUM <= 1"; Object[] param = new Object[1]; try { @@ -60,7 +62,7 @@ QueryRunner runner = new QueryRunner(); param[0] = deviceId; - List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler(), param); + List tempList = runner.query(conn, queryStr, new ArrayListHandler(), param); if (null != tempList && tempList.isEmpty() == false) { PgAlarm alarm = new PgAlarm(); Object[] item = tempList.get(0); @@ -79,6 +81,74 @@ alarm.setAlarmtypeid(((Number) item[6]).intValue()); alarm.setAlarm_grade((String) item[7]); + if (null != item[8]) { + long logTmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[8]).toJdbc()).getTime(); + Calendar logCal = Calendar.getInstance(); + logCal.setTimeInMillis(logTmValue); + alarm.setLog_time(logCal.getTime()); + } else { + alarm.setLog_time(null); + } + + alarm.setLog_desc((String) item[9]); + + logger.debug("根据设备查询最新报警记录成功"); + + return alarm; + } else { + return null; + } + } catch (Exception ex) { + logger.error("根据设备查询最新报警记录成功", ex); + return null; + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + } + + @Override + public PgAlarm findLatestAlarmByDeviceAndType(int deviceId, String type) { + Connection conn = null; + String queryStr = "SELECT A.* FROM " + + "(SELECT ID, ACTIVE, ALARM_DATE, ALARM_VALUE, DESCRIPTION, ALARMDEVID, ALARMTYPEID, ALARM_GRADE, LOG_TIME, LOG_DESC FROM PG_ALARM WHERE ALARMDEVID = ? AND DESCRIPTION LIKE ? ORDER BY ALARM_DATE DESC) A " + + "WHERE ROWNUM <= 1"; + Object[] param = new Object[2]; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + QueryRunner runner = new QueryRunner(); + param[0] = deviceId; + param[1] = "%" + type + "%"; + + List tempList = runner.query(conn, queryStr, new ArrayListHandler(), param); + if (null != tempList && tempList.isEmpty() == false) { + PgAlarm alarm = new PgAlarm(); + Object[] item = tempList.get(0); + + alarm.setId(((Number) item[0]).intValue()); + alarm.setActive(((Number) item[1]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + alarm.setAlarm_date(cal.getTime()); + + alarm.setAlarm_value((String) item[3]); + alarm.setDescription((String) item[4]); + alarm.setAlarmdevid(((Number) item[5]).intValue()); + alarm.setAlarmtypeid(((Number) item[6]).intValue()); + alarm.setAlarm_grade((String) item[7]); + + long logTmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[8]).toJdbc()).getTime(); + Calendar logCal = Calendar.getInstance(); + logCal.setTimeInMillis(logTmValue); + alarm.setLog_time(logCal.getTime()); + alarm.setLog_desc((String) item[9]); + logger.debug("根据设备查询最新报警记录成功"); return alarm; @@ -111,28 +181,31 @@ QueryRunner runner = new QueryRunner(); // 查询同一设备是否有正在报警的消息 - Number id = (Number) runner.query(conn, querySql, new ScalarHandler(1), queryParam); + Number id = runner.query(conn, querySql, new ScalarHandler(1), queryParam); if (null != id) { // 找到设备已存在的记录 // 1先将正在报警的设备自动消警 - String updateSql = "UPDATE PG_ALARM SET ACTIVE=0 WHERE ID=?"; + String updateSql = "UPDATE PG_ALARM SET ACTIVE=0, LOG_TIME=SYSDATE, LOG_DESC=? WHERE ID=?"; - Object[] updateParam = new Object[1]; - updateParam[0] = id.longValue(); - - runner.update(conn, updateSql, updateParam); // 更新报警记录 - } + Object[] updateParam = new Object[2]; + updateParam[0] = "重复报警自动消警"; + updateParam[1] = id.longValue(); + + // 更新报警记录 + runner.update(conn, updateSql, updateParam); + } // 插入新的报警记录 String insertSql = "INSERT INTO PG_ALARM " + - "(ID, ACTIVE, ALARM_DATE, ALARM_VALUE, DESCRIPTION, ALARMDEVID, ALARMTYPEID, USERID, ALARM_GRADE) " + - "VALUES (?, ?, TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), ?, ?, ?, ?, ?, ?)"; + "(ID, ACTIVE, ALARM_DATE, ALARM_VALUE, DESCRIPTION, ALARMDEVID, ALARMTYPEID, USERID, ALARM_GRADE, LOG_TIME, LOG_DESC) " + + "VALUES (?, ?, TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), ?, ?, ?, ?, ?, ?, TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), ?)"; String sqlId = "SELECT SEQ_PG_ALARM_ID.NEXTVAL FROM DUAL"; - long newId = ((Number) runner.query(conn, sqlId, new ScalarHandler(1))).longValue(); // 获取新的id - - Object[] params = new Object[9]; + // 获取新的id + long newId = (runner.query(conn, sqlId, new ScalarHandler(1))).longValue(); + + Object[] params = new Object[11]; params[0] = newId; params[1] = alarmRecord.getActive(); @@ -143,8 +216,11 @@ params[6] = alarmRecord.getAlarmtypeid(); params[7] = alarmRecord.getUserid(); params[8] = alarmRecord.getAlarm_grade(); - - int count = runner.update(conn, insertSql, params); // 新增主表 + params[9] = TimeFormat.formatTimestamp(alarmRecord.getLog_time()); + params[10] = alarmRecord.getLog_desc(); + + // 新增报警记录 + int count = runner.update(conn, insertSql, params); if (count > 0) { logger.debug("插入报警数据成功"); diff --git a/src/com/szpg/db/dao/impl/PgCODaoImpl.java b/src/com/szpg/db/dao/impl/PgCODaoImpl.java index 186ac16..70d672c 100644 --- a/src/com/szpg/db/dao/impl/PgCODaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgCODaoImpl.java @@ -292,6 +292,51 @@ } @Override + public PgCO findLastRecordByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT ID, CO, LOGTIME, PGDEVICEID FROM (SELECT * FROM PG_CO WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, sql, new ArrayListHandler(), param); + if (null != tempList && tempList.size() == 1) { + PgCO co = new PgCO(); + Object[] item = tempList.get(0); + + co.setId(((Number) item[0]).intValue()); + co.setCo(Float.parseFloat((String) item[1])); + co.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + co.setLogtime(cal.getTime()); + co.setUptime(cal.getTime()); + + logger.debug("根据设备ID查询最新一氧化碳监测记录成功" + co + "]"); + + return co; + } else { + return null; + } + } catch (Exception ex) { + logger.error("根据设备ID查询最新一氧化碳监测记录异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override public int addPblzRecord(PgCO co) { return addPblzRecord(co.getCo(), co.getTmStr(), co.getPgdeviceid()); } diff --git a/src/com/szpg/db/dao/impl/PgCh4DaoImpl.java b/src/com/szpg/db/dao/impl/PgCh4DaoImpl.java index 0ed139e..768b6a5 100644 --- a/src/com/szpg/db/dao/impl/PgCh4DaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgCh4DaoImpl.java @@ -54,9 +54,9 @@ list.add(ch4); } return list; - } - else + } else { return null; + } } catch (Exception ex) { logger.error("查询所有甲烷监测值异常", ex); } finally { @@ -100,9 +100,9 @@ logger.debug("根据ID查询甲烷监测值成功" + ch4 + "]"); return ch4; - } - else + } else { return null; + } } catch (Exception ex) { logger.error("根据ID查询甲烷监测值异常", ex); } finally { @@ -149,9 +149,9 @@ logger.debug("根据设备ID查询最新的甲烷监测值成功" + ch4 + "]"); return ch4; - } - else + } else { return null; + } } catch (Exception ex) { logger.error("根据设备ID查询最新的甲烷监测值异常", ex); } finally { @@ -199,9 +199,9 @@ list.add(ch4); } return list; - } - else + } else { return null; + } } catch (Exception ex) { logger.error("根据设备ID查询甲烷监测值异常", ex); } finally { @@ -251,9 +251,9 @@ list.add(ch4); } return list; - } - else + } else { return null; + } } catch (Exception ex) { logger.error("根据设备ID和时间查询甲烷监测值异常", ex); } finally { @@ -293,6 +293,51 @@ } @Override + public PgCh4 findLastRecordByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT ID, CH4, LOGTIME, PGDEVICEID FROM (SELECT * FROM PG_CH4 WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, sql, new ArrayListHandler(), param); + if (null != tempList && tempList.size() == 1) { + PgCh4 ch4 = new PgCh4(); + Object[] item = tempList.get(0); + + ch4.setId(((Number) item[0]).intValue()); + ch4.setCh4(Float.parseFloat((String) item[1])); + ch4.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + ch4.setLogtime(cal.getTime()); + ch4.setUptime(cal.getTime()); + + logger.debug("根据设备ID查询最新甲烷监测记录成功" + ch4 + "]"); + + return ch4; + } else { + return null; + } + } catch (Exception ex) { + logger.error("根据设备ID查询最新甲烷监测记录异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override public int addPblzRecord(PgCh4 ch4) { return addPblzRecord(ch4.getCh4(), ch4.getTmStr(), ch4.getPgdeviceid()); } diff --git a/src/com/szpg/db/dao/impl/PgHSDaoImpl.java b/src/com/szpg/db/dao/impl/PgHSDaoImpl.java index 892e175..fa4ea02 100644 --- a/src/com/szpg/db/dao/impl/PgHSDaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgHSDaoImpl.java @@ -292,6 +292,51 @@ } @Override + public PgSH findLastRecordByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT ID, SH, LOGTIME, PGDEVICEID FROM (SELECT * FROM PG_SH WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, sql, new ArrayListHandler(), param); + if (null != tempList && tempList.size() == 1) { + PgSH sh = new PgSH(); + Object[] item = tempList.get(0); + + sh.setId(((Number) item[0]).intValue()); + sh.setSh(Float.parseFloat((String) item[1])); + sh.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + sh.setLogtime(cal.getTime()); + sh.setUptime(cal.getTime()); + + logger.debug("根据设备ID查询最新硫化氢监测记录成功" + sh + "]"); + + return sh; + } else { + return null; + } + } catch (Exception ex) { + logger.error("根据设备ID查询最新硫化氢监测记录异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override public int addPblzRecord(PgSH sh) { return addPblzRecord(sh.getSh(), sh.getTmStr(), sh.getPgdeviceid()); } diff --git a/src/com/szpg/db/dao/impl/PgO2DaoImpl.java b/src/com/szpg/db/dao/impl/PgO2DaoImpl.java index f58f8cd..842291b 100644 --- a/src/com/szpg/db/dao/impl/PgO2DaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgO2DaoImpl.java @@ -54,9 +54,9 @@ list.add(o2); } return list; - } - else + } else { return null; + } } catch (Exception ex) { logger.error("查询所有氧气监测值异常", ex); } finally { @@ -100,9 +100,9 @@ logger.debug("根据ID查询氧气监测值成功" + o2 + "]"); return o2; - } - else + } else { return null; + } } catch (Exception ex) { logger.error("根据ID查询氧气监测值异常", ex); } finally { @@ -148,9 +148,9 @@ logger.debug("根据设备ID查询最新的氧气监测值成功" + o2 + "]"); return o2; - } - else + } else { return null; + } } catch (Exception ex) { logger.error("根据设备ID查询最新的硫化氢监测值异常", ex); } finally { @@ -198,9 +198,9 @@ list.add(o2); } return list; - } - else + } else { return null; + } } catch (Exception ex) { logger.error("根据设备ID查询氧气监测值异常", ex); } finally { @@ -250,9 +250,9 @@ list.add(o2); } return list; - } - else + } else { return null; + } } catch (Exception ex) { logger.error("根据设备ID和时间查询氧气监测值异常", ex); } finally { @@ -292,6 +292,51 @@ } @Override + public PgO2 findLastRecordByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT ID, O2, LOGTIME, PGDEVICEID FROM (SELECT * FROM PG_O2 WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, sql, new ArrayListHandler(), param); + if (null != tempList && tempList.size() == 1) { + PgO2 o2 = new PgO2(); + Object[] item = tempList.get(0); + + o2.setId(((Number) item[0]).intValue()); + o2.setO2(Float.parseFloat((String) item[1])); + o2.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + o2.setLogtime(cal.getTime()); + o2.setUptime(cal.getTime()); + + logger.debug("根据设备ID查询最新氧气监测记录成功" + o2 + "]"); + + return o2; + } else { + return null; + } + } catch (Exception ex) { + logger.error("根据设备ID查询最新氧气监测记录异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override public int addPblzRecord(PgO2 o2) { return addPblzRecord(o2.getO2(), o2.getTmStr(), o2.getPgdeviceid()); } @@ -316,10 +361,11 @@ QueryRunner runner = new QueryRunner(); int count = runner.update(conn, insertStr, params); - if (count > 0) + if (count > 0) { logger.debug("插入氧气监测值成功[tm=" + tm + ", value=" + value + ", deviceid=" + deviceid + "]"); - else + } else { logger.error("插入氧气监测值失败!"); + } return count; } catch (Exception ex) { diff --git a/src/com/szpg/db/dao/impl/PgWsDaoImpl.java b/src/com/szpg/db/dao/impl/PgWsDaoImpl.java index 679b58f..77925f7 100644 --- a/src/com/szpg/db/dao/impl/PgWsDaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgWsDaoImpl.java @@ -323,6 +323,52 @@ } @Override + public PgTemphum findLastRecordByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT ID, TEMP, HUM, LOGTIME, PGDEVICEID FROM (SELECT * FROM PG_TEMPHUM WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, sql, new ArrayListHandler(), param); + if (null != tempList && tempList.size() == 1) { + PgTemphum temphum = new PgTemphum(); + Object[] item = tempList.get(0); + + temphum.setId(((Number) item[0]).intValue()); + temphum.setTemp(Float.parseFloat((String) item[1])); + temphum.setHum(Float.parseFloat((String) item[2])); + temphum.setPgdeviceid(((Number) item[4]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + temphum.setLogtime(cal.getTime()); + temphum.setUptime(cal.getTime()); + + logger.debug("根据设备ID查询最新温湿度监测记录成功" + temphum + "]"); + + return temphum; + } else { + return null; + } + } catch (Exception ex) { + logger.error("根据设备ID查询最新温湿度监测记录异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override public int addWsdzRecord(PgTemphum ws) { return addWsdzRecord(ws.getTemp(), ws.getHum(), ws.getTmStr(), ws.getPgdeviceid()); } diff --git a/src/com/szpg/db/dao/PgAlarmDao.java b/src/com/szpg/db/dao/PgAlarmDao.java index 11d8a1d..4ab98d4 100644 --- a/src/com/szpg/db/dao/PgAlarmDao.java +++ b/src/com/szpg/db/dao/PgAlarmDao.java @@ -6,6 +6,7 @@ public int findAlarmCountByDate(String date); public PgAlarm findLatestAlarmByDevice(int deviceId); + public PgAlarm findLatestAlarmByDeviceAndType(int deviceId, String type); public long insertAlarmRecord(PgAlarm alarmRecord); } diff --git a/src/com/szpg/db/dao/PgCODao.java b/src/com/szpg/db/dao/PgCODao.java index 1664f51..5098321 100644 --- a/src/com/szpg/db/dao/PgCODao.java +++ b/src/com/szpg/db/dao/PgCODao.java @@ -20,6 +20,7 @@ public List findPblzByDeviceAndTm(Integer deviceid, String start, String end); public double findLastValueByDevice(Integer deviceid); + public PgCO findLastRecordByDevice(Integer id); public int addPblzRecord(PgCO ch4); public int addPblzRecord(float value, String tm, int deviceid); diff --git a/src/com/szpg/db/dao/PgCh4Dao.java b/src/com/szpg/db/dao/PgCh4Dao.java index e23b964..61fdfcd 100644 --- a/src/com/szpg/db/dao/PgCh4Dao.java +++ b/src/com/szpg/db/dao/PgCh4Dao.java @@ -20,6 +20,7 @@ public List findPblzByDeviceAndTm(Integer deviceid, String start, String end); public double findLastValueByDevice(Integer deviceid); + public PgCh4 findLastRecordByDevice(Integer deviceid); public int addPblzRecord(PgCh4 ch4); public int addPblzRecord(float value, String tm, int deviceid); diff --git a/src/com/szpg/db/dao/PgHSDao.java b/src/com/szpg/db/dao/PgHSDao.java index f89b044..0f0ee53 100644 --- a/src/com/szpg/db/dao/PgHSDao.java +++ b/src/com/szpg/db/dao/PgHSDao.java @@ -20,6 +20,7 @@ public List findPblzByDeviceAndTm(Integer deviceid, String start, String end); public double findLastValueByDevice(Integer deviceid); + public PgSH findLastRecordByDevice(Integer deviceid); public int addPblzRecord(PgSH hs); public int addPblzRecord(float value, String tm, int deviceid); diff --git a/src/com/szpg/db/dao/PgO2Dao.java b/src/com/szpg/db/dao/PgO2Dao.java index 0b3d0bf..678adab 100644 --- a/src/com/szpg/db/dao/PgO2Dao.java +++ b/src/com/szpg/db/dao/PgO2Dao.java @@ -20,6 +20,7 @@ public List findPblzByDeviceAndTm(Integer deviceid, String start, String end); public double findLastValueByDevice(Integer deviceid); + public PgO2 findLastRecordByDevice(Integer deviceid); public int addPblzRecord(PgO2 ch4); public int addPblzRecord(float value, String tm, int deviceid); diff --git a/src/com/szpg/db/dao/PgWsDao.java b/src/com/szpg/db/dao/PgWsDao.java index 370a83f..bfd0eed 100644 --- a/src/com/szpg/db/dao/PgWsDao.java +++ b/src/com/szpg/db/dao/PgWsDao.java @@ -21,6 +21,7 @@ public double findLastTempByDevice(Integer deviceid); public double findLastHumByDevice(Integer deviceid); + public PgTemphum findLastRecordByDevice(Integer deviceid); public int addWsdzRecord(PgTemphum wsdz); public int addWsdzRecord(float temp, float hum, String tm, int deviceid); diff --git a/src/com/szpg/db/dao/impl/PgAlarmDaoImpl.java b/src/com/szpg/db/dao/impl/PgAlarmDaoImpl.java index cedf5fc..ce9ee0f 100644 --- a/src/com/szpg/db/dao/impl/PgAlarmDaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgAlarmDaoImpl.java @@ -8,7 +8,6 @@ import org.apache.commons.dbutils.DbUtils; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.handlers.ArrayListHandler; -import org.apache.commons.dbutils.handlers.BeanListHandler; import org.apache.commons.dbutils.handlers.ScalarHandler; import org.apache.log4j.Logger; @@ -17,6 +16,9 @@ import com.szpg.db.util.ConnectionManager; import com.szpg.util.TimeFormat; +/** + * @author TAN YUE + */ public class PgAlarmDaoImpl implements PgAlarmDao { private final Logger logger = Logger.getLogger(this.getClass().getName()); @@ -33,7 +35,7 @@ QueryRunner runner = new QueryRunner(); param[0] = date; - int count = ((Number) runner.query(conn, sql, new ScalarHandler(1), param)).intValue(); + int count = (runner.query(conn, sql, new ScalarHandler(1), param)).intValue(); return count; } catch (Exception ex) { logger.error("根据日期查询报警记录数异常", ex); @@ -51,7 +53,7 @@ public PgAlarm findLatestAlarmByDevice(int deviceId) { Connection conn = null; String queryStr = "SELECT A.* FROM " + - "(SELECT ID, ACTIVE, ALARM_DATE, ALARM_VALUE, DESCRIPTION, ALARMDEVID, ALARMTYPEID, ALARM_GRADE FROM PG_ALARM WHERE ALARMDEVID = ? ORDER BY ALARM_DATE DESC) A " + + "(SELECT ID, ACTIVE, ALARM_DATE, ALARM_VALUE, DESCRIPTION, ALARMDEVID, ALARMTYPEID, ALARM_GRADE, LOG_TIME, LOG_DESC FROM PG_ALARM WHERE ALARMDEVID = ? ORDER BY ALARM_DATE DESC) A " + "WHERE ROWNUM <= 1"; Object[] param = new Object[1]; try { @@ -60,7 +62,7 @@ QueryRunner runner = new QueryRunner(); param[0] = deviceId; - List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler(), param); + List tempList = runner.query(conn, queryStr, new ArrayListHandler(), param); if (null != tempList && tempList.isEmpty() == false) { PgAlarm alarm = new PgAlarm(); Object[] item = tempList.get(0); @@ -79,6 +81,74 @@ alarm.setAlarmtypeid(((Number) item[6]).intValue()); alarm.setAlarm_grade((String) item[7]); + if (null != item[8]) { + long logTmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[8]).toJdbc()).getTime(); + Calendar logCal = Calendar.getInstance(); + logCal.setTimeInMillis(logTmValue); + alarm.setLog_time(logCal.getTime()); + } else { + alarm.setLog_time(null); + } + + alarm.setLog_desc((String) item[9]); + + logger.debug("根据设备查询最新报警记录成功"); + + return alarm; + } else { + return null; + } + } catch (Exception ex) { + logger.error("根据设备查询最新报警记录成功", ex); + return null; + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + } + + @Override + public PgAlarm findLatestAlarmByDeviceAndType(int deviceId, String type) { + Connection conn = null; + String queryStr = "SELECT A.* FROM " + + "(SELECT ID, ACTIVE, ALARM_DATE, ALARM_VALUE, DESCRIPTION, ALARMDEVID, ALARMTYPEID, ALARM_GRADE, LOG_TIME, LOG_DESC FROM PG_ALARM WHERE ALARMDEVID = ? AND DESCRIPTION LIKE ? ORDER BY ALARM_DATE DESC) A " + + "WHERE ROWNUM <= 1"; + Object[] param = new Object[2]; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + QueryRunner runner = new QueryRunner(); + param[0] = deviceId; + param[1] = "%" + type + "%"; + + List tempList = runner.query(conn, queryStr, new ArrayListHandler(), param); + if (null != tempList && tempList.isEmpty() == false) { + PgAlarm alarm = new PgAlarm(); + Object[] item = tempList.get(0); + + alarm.setId(((Number) item[0]).intValue()); + alarm.setActive(((Number) item[1]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + alarm.setAlarm_date(cal.getTime()); + + alarm.setAlarm_value((String) item[3]); + alarm.setDescription((String) item[4]); + alarm.setAlarmdevid(((Number) item[5]).intValue()); + alarm.setAlarmtypeid(((Number) item[6]).intValue()); + alarm.setAlarm_grade((String) item[7]); + + long logTmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[8]).toJdbc()).getTime(); + Calendar logCal = Calendar.getInstance(); + logCal.setTimeInMillis(logTmValue); + alarm.setLog_time(logCal.getTime()); + alarm.setLog_desc((String) item[9]); + logger.debug("根据设备查询最新报警记录成功"); return alarm; @@ -111,28 +181,31 @@ QueryRunner runner = new QueryRunner(); // 查询同一设备是否有正在报警的消息 - Number id = (Number) runner.query(conn, querySql, new ScalarHandler(1), queryParam); + Number id = runner.query(conn, querySql, new ScalarHandler(1), queryParam); if (null != id) { // 找到设备已存在的记录 // 1先将正在报警的设备自动消警 - String updateSql = "UPDATE PG_ALARM SET ACTIVE=0 WHERE ID=?"; + String updateSql = "UPDATE PG_ALARM SET ACTIVE=0, LOG_TIME=SYSDATE, LOG_DESC=? WHERE ID=?"; - Object[] updateParam = new Object[1]; - updateParam[0] = id.longValue(); - - runner.update(conn, updateSql, updateParam); // 更新报警记录 - } + Object[] updateParam = new Object[2]; + updateParam[0] = "重复报警自动消警"; + updateParam[1] = id.longValue(); + + // 更新报警记录 + runner.update(conn, updateSql, updateParam); + } // 插入新的报警记录 String insertSql = "INSERT INTO PG_ALARM " + - "(ID, ACTIVE, ALARM_DATE, ALARM_VALUE, DESCRIPTION, ALARMDEVID, ALARMTYPEID, USERID, ALARM_GRADE) " + - "VALUES (?, ?, TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), ?, ?, ?, ?, ?, ?)"; + "(ID, ACTIVE, ALARM_DATE, ALARM_VALUE, DESCRIPTION, ALARMDEVID, ALARMTYPEID, USERID, ALARM_GRADE, LOG_TIME, LOG_DESC) " + + "VALUES (?, ?, TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), ?, ?, ?, ?, ?, ?, TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), ?)"; String sqlId = "SELECT SEQ_PG_ALARM_ID.NEXTVAL FROM DUAL"; - long newId = ((Number) runner.query(conn, sqlId, new ScalarHandler(1))).longValue(); // 获取新的id - - Object[] params = new Object[9]; + // 获取新的id + long newId = (runner.query(conn, sqlId, new ScalarHandler(1))).longValue(); + + Object[] params = new Object[11]; params[0] = newId; params[1] = alarmRecord.getActive(); @@ -143,8 +216,11 @@ params[6] = alarmRecord.getAlarmtypeid(); params[7] = alarmRecord.getUserid(); params[8] = alarmRecord.getAlarm_grade(); - - int count = runner.update(conn, insertSql, params); // 新增主表 + params[9] = TimeFormat.formatTimestamp(alarmRecord.getLog_time()); + params[10] = alarmRecord.getLog_desc(); + + // 新增报警记录 + int count = runner.update(conn, insertSql, params); if (count > 0) { logger.debug("插入报警数据成功"); diff --git a/src/com/szpg/db/dao/impl/PgCODaoImpl.java b/src/com/szpg/db/dao/impl/PgCODaoImpl.java index 186ac16..70d672c 100644 --- a/src/com/szpg/db/dao/impl/PgCODaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgCODaoImpl.java @@ -292,6 +292,51 @@ } @Override + public PgCO findLastRecordByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT ID, CO, LOGTIME, PGDEVICEID FROM (SELECT * FROM PG_CO WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, sql, new ArrayListHandler(), param); + if (null != tempList && tempList.size() == 1) { + PgCO co = new PgCO(); + Object[] item = tempList.get(0); + + co.setId(((Number) item[0]).intValue()); + co.setCo(Float.parseFloat((String) item[1])); + co.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + co.setLogtime(cal.getTime()); + co.setUptime(cal.getTime()); + + logger.debug("根据设备ID查询最新一氧化碳监测记录成功" + co + "]"); + + return co; + } else { + return null; + } + } catch (Exception ex) { + logger.error("根据设备ID查询最新一氧化碳监测记录异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override public int addPblzRecord(PgCO co) { return addPblzRecord(co.getCo(), co.getTmStr(), co.getPgdeviceid()); } diff --git a/src/com/szpg/db/dao/impl/PgCh4DaoImpl.java b/src/com/szpg/db/dao/impl/PgCh4DaoImpl.java index 0ed139e..768b6a5 100644 --- a/src/com/szpg/db/dao/impl/PgCh4DaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgCh4DaoImpl.java @@ -54,9 +54,9 @@ list.add(ch4); } return list; - } - else + } else { return null; + } } catch (Exception ex) { logger.error("查询所有甲烷监测值异常", ex); } finally { @@ -100,9 +100,9 @@ logger.debug("根据ID查询甲烷监测值成功" + ch4 + "]"); return ch4; - } - else + } else { return null; + } } catch (Exception ex) { logger.error("根据ID查询甲烷监测值异常", ex); } finally { @@ -149,9 +149,9 @@ logger.debug("根据设备ID查询最新的甲烷监测值成功" + ch4 + "]"); return ch4; - } - else + } else { return null; + } } catch (Exception ex) { logger.error("根据设备ID查询最新的甲烷监测值异常", ex); } finally { @@ -199,9 +199,9 @@ list.add(ch4); } return list; - } - else + } else { return null; + } } catch (Exception ex) { logger.error("根据设备ID查询甲烷监测值异常", ex); } finally { @@ -251,9 +251,9 @@ list.add(ch4); } return list; - } - else + } else { return null; + } } catch (Exception ex) { logger.error("根据设备ID和时间查询甲烷监测值异常", ex); } finally { @@ -293,6 +293,51 @@ } @Override + public PgCh4 findLastRecordByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT ID, CH4, LOGTIME, PGDEVICEID FROM (SELECT * FROM PG_CH4 WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, sql, new ArrayListHandler(), param); + if (null != tempList && tempList.size() == 1) { + PgCh4 ch4 = new PgCh4(); + Object[] item = tempList.get(0); + + ch4.setId(((Number) item[0]).intValue()); + ch4.setCh4(Float.parseFloat((String) item[1])); + ch4.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + ch4.setLogtime(cal.getTime()); + ch4.setUptime(cal.getTime()); + + logger.debug("根据设备ID查询最新甲烷监测记录成功" + ch4 + "]"); + + return ch4; + } else { + return null; + } + } catch (Exception ex) { + logger.error("根据设备ID查询最新甲烷监测记录异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override public int addPblzRecord(PgCh4 ch4) { return addPblzRecord(ch4.getCh4(), ch4.getTmStr(), ch4.getPgdeviceid()); } diff --git a/src/com/szpg/db/dao/impl/PgHSDaoImpl.java b/src/com/szpg/db/dao/impl/PgHSDaoImpl.java index 892e175..fa4ea02 100644 --- a/src/com/szpg/db/dao/impl/PgHSDaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgHSDaoImpl.java @@ -292,6 +292,51 @@ } @Override + public PgSH findLastRecordByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT ID, SH, LOGTIME, PGDEVICEID FROM (SELECT * FROM PG_SH WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, sql, new ArrayListHandler(), param); + if (null != tempList && tempList.size() == 1) { + PgSH sh = new PgSH(); + Object[] item = tempList.get(0); + + sh.setId(((Number) item[0]).intValue()); + sh.setSh(Float.parseFloat((String) item[1])); + sh.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + sh.setLogtime(cal.getTime()); + sh.setUptime(cal.getTime()); + + logger.debug("根据设备ID查询最新硫化氢监测记录成功" + sh + "]"); + + return sh; + } else { + return null; + } + } catch (Exception ex) { + logger.error("根据设备ID查询最新硫化氢监测记录异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override public int addPblzRecord(PgSH sh) { return addPblzRecord(sh.getSh(), sh.getTmStr(), sh.getPgdeviceid()); } diff --git a/src/com/szpg/db/dao/impl/PgO2DaoImpl.java b/src/com/szpg/db/dao/impl/PgO2DaoImpl.java index f58f8cd..842291b 100644 --- a/src/com/szpg/db/dao/impl/PgO2DaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgO2DaoImpl.java @@ -54,9 +54,9 @@ list.add(o2); } return list; - } - else + } else { return null; + } } catch (Exception ex) { logger.error("查询所有氧气监测值异常", ex); } finally { @@ -100,9 +100,9 @@ logger.debug("根据ID查询氧气监测值成功" + o2 + "]"); return o2; - } - else + } else { return null; + } } catch (Exception ex) { logger.error("根据ID查询氧气监测值异常", ex); } finally { @@ -148,9 +148,9 @@ logger.debug("根据设备ID查询最新的氧气监测值成功" + o2 + "]"); return o2; - } - else + } else { return null; + } } catch (Exception ex) { logger.error("根据设备ID查询最新的硫化氢监测值异常", ex); } finally { @@ -198,9 +198,9 @@ list.add(o2); } return list; - } - else + } else { return null; + } } catch (Exception ex) { logger.error("根据设备ID查询氧气监测值异常", ex); } finally { @@ -250,9 +250,9 @@ list.add(o2); } return list; - } - else + } else { return null; + } } catch (Exception ex) { logger.error("根据设备ID和时间查询氧气监测值异常", ex); } finally { @@ -292,6 +292,51 @@ } @Override + public PgO2 findLastRecordByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT ID, O2, LOGTIME, PGDEVICEID FROM (SELECT * FROM PG_O2 WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, sql, new ArrayListHandler(), param); + if (null != tempList && tempList.size() == 1) { + PgO2 o2 = new PgO2(); + Object[] item = tempList.get(0); + + o2.setId(((Number) item[0]).intValue()); + o2.setO2(Float.parseFloat((String) item[1])); + o2.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + o2.setLogtime(cal.getTime()); + o2.setUptime(cal.getTime()); + + logger.debug("根据设备ID查询最新氧气监测记录成功" + o2 + "]"); + + return o2; + } else { + return null; + } + } catch (Exception ex) { + logger.error("根据设备ID查询最新氧气监测记录异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override public int addPblzRecord(PgO2 o2) { return addPblzRecord(o2.getO2(), o2.getTmStr(), o2.getPgdeviceid()); } @@ -316,10 +361,11 @@ QueryRunner runner = new QueryRunner(); int count = runner.update(conn, insertStr, params); - if (count > 0) + if (count > 0) { logger.debug("插入氧气监测值成功[tm=" + tm + ", value=" + value + ", deviceid=" + deviceid + "]"); - else + } else { logger.error("插入氧气监测值失败!"); + } return count; } catch (Exception ex) { diff --git a/src/com/szpg/db/dao/impl/PgWsDaoImpl.java b/src/com/szpg/db/dao/impl/PgWsDaoImpl.java index 679b58f..77925f7 100644 --- a/src/com/szpg/db/dao/impl/PgWsDaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgWsDaoImpl.java @@ -323,6 +323,52 @@ } @Override + public PgTemphum findLastRecordByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT ID, TEMP, HUM, LOGTIME, PGDEVICEID FROM (SELECT * FROM PG_TEMPHUM WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, sql, new ArrayListHandler(), param); + if (null != tempList && tempList.size() == 1) { + PgTemphum temphum = new PgTemphum(); + Object[] item = tempList.get(0); + + temphum.setId(((Number) item[0]).intValue()); + temphum.setTemp(Float.parseFloat((String) item[1])); + temphum.setHum(Float.parseFloat((String) item[2])); + temphum.setPgdeviceid(((Number) item[4]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + temphum.setLogtime(cal.getTime()); + temphum.setUptime(cal.getTime()); + + logger.debug("根据设备ID查询最新温湿度监测记录成功" + temphum + "]"); + + return temphum; + } else { + return null; + } + } catch (Exception ex) { + logger.error("根据设备ID查询最新温湿度监测记录异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override public int addWsdzRecord(PgTemphum ws) { return addWsdzRecord(ws.getTemp(), ws.getHum(), ws.getTmStr(), ws.getPgdeviceid()); } diff --git a/src/com/szpg/db/data/PgAlarm.java b/src/com/szpg/db/data/PgAlarm.java index 5a73ba9..4b97e6a 100644 --- a/src/com/szpg/db/data/PgAlarm.java +++ b/src/com/szpg/db/data/PgAlarm.java @@ -1,9 +1,12 @@ package com.szpg.db.data; -import java.util.Date; - import com.szpg.util.TimeFormat; +import java.util.Date; + +/** + * @author TAN YUE + */ public class PgAlarm implements java.io.Serializable { /** @@ -20,11 +23,28 @@ private Integer alarmtypeid; private Integer userid; private String alarm_grade; - - public static Integer ALARM_TYPE_DEVRUN = 1; //管廊设备运行故障 - public static Integer ALARM_TYPE_PGRUN = 2; //管廊运行环境报警 - public static Integer ALARM_TYPE_PGSAF = 3; //管廊安全防范报警 - public static Integer ALARM_TYPE_INPG = 4; //人员入廊超时报警 + private Date log_time; + private String log_desc; + + /** + * 管廊设备运行故障 + */ + public static Integer ALARM_TYPE_DEVRUN = 1; + + /** + * 管廊运行环境报警 + */ + public static Integer ALARM_TYPE_PGRUN = 2; + + /** + * 管廊安全防范报警 + */ + public static Integer ALARM_TYPE_PGSAF = 3; + + /** + * 人员入廊超时报警 + */ + public static Integer ALARM_TYPE_INPG = 4; public Integer getId() { return id; @@ -97,10 +117,130 @@ public void setAlarm_grade(String alarm_grade) { this.alarm_grade = alarm_grade; } + + public Date getLog_time() { + if (null == log_time) { + return alarm_date; + } + return log_time; + } + + public void setLog_time(Date log_time) { + this.log_time = log_time; + } + + public String getLog_desc() { + return log_desc; + } + + public void setLog_desc(String log_desc) { + this.log_desc = log_desc; + } @Override public String toString() { return "PgAlarm[alarmValue=" + alarm_value + ", alarmDate=" + TimeFormat.formatTimestamp(alarm_date) + ", alarmDevId= " + alarmdevid + "]"; } + /** + * 生成氧气报警记录 + * @return + */ + public PgAlarm getO2AlarmInstance() { + PgAlarm alarm = new PgAlarm(); + alarm.setActive(1); + alarm.setAlarmtypeid(PgAlarm.ALARM_TYPE_PGRUN); + alarm.setDescription("氧气浓度低于低限阈值"); + alarm.setUserid(null); + + // 氧气报警定义为一级报警 + alarm.setAlarm_grade("一级报警"); + + return alarm; + } + + /** + * 生成一氧化碳报警记录 + * @return + */ + public PgAlarm getCOAlarmInstance() { + PgAlarm alarm = new PgAlarm(); + alarm.setActive(1); + alarm.setAlarmtypeid(PgAlarm.ALARM_TYPE_PGRUN); + alarm.setDescription("一氧化碳浓度超过高限阈值"); + alarm.setUserid(null); + + // 一氧化碳报警定义为一级报警 + alarm.setAlarm_grade("一级报警"); + + return alarm; + } + + /** + * 生成硫化氢报警记录 + * @return + */ + public PgAlarm getHSAlarmInstance() { + PgAlarm alarm = new PgAlarm(); + alarm.setActive(1); + alarm.setAlarmtypeid(PgAlarm.ALARM_TYPE_PGRUN); + alarm.setDescription("硫化氢浓度超过高限阈值"); + alarm.setUserid(null); + + // 硫化氢报警定义为一级报警 + alarm.setAlarm_grade("一级报警"); + + return alarm; + } + + /** + * 生成甲烷报警记录 + * @return + */ + public PgAlarm getCH4AlarmInstance() { + PgAlarm alarm = new PgAlarm(); + alarm.setActive(1); + alarm.setAlarmtypeid(PgAlarm.ALARM_TYPE_PGRUN); + alarm.setDescription("甲烷浓度超过高限阈值"); + alarm.setUserid(null); + + // 甲烷报警定义为二级报警 + alarm.setAlarm_grade("二级报警"); + + return alarm; + } + + /** + * 生成温度报警记录 + * @return + */ + public PgAlarm getTempAlarmInstance() { + PgAlarm alarm = new PgAlarm(); + alarm.setActive(1); + alarm.setAlarmtypeid(PgAlarm.ALARM_TYPE_PGRUN); + alarm.setDescription("温度超过高限阈值"); + alarm.setUserid(null); + + // 温度定义为二级报警 + alarm.setAlarm_grade("二级报警"); + + return alarm; + } + + /** + * 生成湿度报警记录 + * @return + */ + public PgAlarm getHumAlarmInstance() { + PgAlarm alarm = new PgAlarm(); + alarm.setActive(1); + alarm.setAlarmtypeid(PgAlarm.ALARM_TYPE_PGRUN); + alarm.setDescription("湿度超过高限阈值"); + alarm.setUserid(null); + + // 湿度报警定义为二级报警 + alarm.setAlarm_grade("二级报警"); + + return alarm; + } } diff --git a/src/com/szpg/db/dao/PgAlarmDao.java b/src/com/szpg/db/dao/PgAlarmDao.java index 11d8a1d..4ab98d4 100644 --- a/src/com/szpg/db/dao/PgAlarmDao.java +++ b/src/com/szpg/db/dao/PgAlarmDao.java @@ -6,6 +6,7 @@ public int findAlarmCountByDate(String date); public PgAlarm findLatestAlarmByDevice(int deviceId); + public PgAlarm findLatestAlarmByDeviceAndType(int deviceId, String type); public long insertAlarmRecord(PgAlarm alarmRecord); } diff --git a/src/com/szpg/db/dao/PgCODao.java b/src/com/szpg/db/dao/PgCODao.java index 1664f51..5098321 100644 --- a/src/com/szpg/db/dao/PgCODao.java +++ b/src/com/szpg/db/dao/PgCODao.java @@ -20,6 +20,7 @@ public List findPblzByDeviceAndTm(Integer deviceid, String start, String end); public double findLastValueByDevice(Integer deviceid); + public PgCO findLastRecordByDevice(Integer id); public int addPblzRecord(PgCO ch4); public int addPblzRecord(float value, String tm, int deviceid); diff --git a/src/com/szpg/db/dao/PgCh4Dao.java b/src/com/szpg/db/dao/PgCh4Dao.java index e23b964..61fdfcd 100644 --- a/src/com/szpg/db/dao/PgCh4Dao.java +++ b/src/com/szpg/db/dao/PgCh4Dao.java @@ -20,6 +20,7 @@ public List findPblzByDeviceAndTm(Integer deviceid, String start, String end); public double findLastValueByDevice(Integer deviceid); + public PgCh4 findLastRecordByDevice(Integer deviceid); public int addPblzRecord(PgCh4 ch4); public int addPblzRecord(float value, String tm, int deviceid); diff --git a/src/com/szpg/db/dao/PgHSDao.java b/src/com/szpg/db/dao/PgHSDao.java index f89b044..0f0ee53 100644 --- a/src/com/szpg/db/dao/PgHSDao.java +++ b/src/com/szpg/db/dao/PgHSDao.java @@ -20,6 +20,7 @@ public List findPblzByDeviceAndTm(Integer deviceid, String start, String end); public double findLastValueByDevice(Integer deviceid); + public PgSH findLastRecordByDevice(Integer deviceid); public int addPblzRecord(PgSH hs); public int addPblzRecord(float value, String tm, int deviceid); diff --git a/src/com/szpg/db/dao/PgO2Dao.java b/src/com/szpg/db/dao/PgO2Dao.java index 0b3d0bf..678adab 100644 --- a/src/com/szpg/db/dao/PgO2Dao.java +++ b/src/com/szpg/db/dao/PgO2Dao.java @@ -20,6 +20,7 @@ public List findPblzByDeviceAndTm(Integer deviceid, String start, String end); public double findLastValueByDevice(Integer deviceid); + public PgO2 findLastRecordByDevice(Integer deviceid); public int addPblzRecord(PgO2 ch4); public int addPblzRecord(float value, String tm, int deviceid); diff --git a/src/com/szpg/db/dao/PgWsDao.java b/src/com/szpg/db/dao/PgWsDao.java index 370a83f..bfd0eed 100644 --- a/src/com/szpg/db/dao/PgWsDao.java +++ b/src/com/szpg/db/dao/PgWsDao.java @@ -21,6 +21,7 @@ public double findLastTempByDevice(Integer deviceid); public double findLastHumByDevice(Integer deviceid); + public PgTemphum findLastRecordByDevice(Integer deviceid); public int addWsdzRecord(PgTemphum wsdz); public int addWsdzRecord(float temp, float hum, String tm, int deviceid); diff --git a/src/com/szpg/db/dao/impl/PgAlarmDaoImpl.java b/src/com/szpg/db/dao/impl/PgAlarmDaoImpl.java index cedf5fc..ce9ee0f 100644 --- a/src/com/szpg/db/dao/impl/PgAlarmDaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgAlarmDaoImpl.java @@ -8,7 +8,6 @@ import org.apache.commons.dbutils.DbUtils; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.handlers.ArrayListHandler; -import org.apache.commons.dbutils.handlers.BeanListHandler; import org.apache.commons.dbutils.handlers.ScalarHandler; import org.apache.log4j.Logger; @@ -17,6 +16,9 @@ import com.szpg.db.util.ConnectionManager; import com.szpg.util.TimeFormat; +/** + * @author TAN YUE + */ public class PgAlarmDaoImpl implements PgAlarmDao { private final Logger logger = Logger.getLogger(this.getClass().getName()); @@ -33,7 +35,7 @@ QueryRunner runner = new QueryRunner(); param[0] = date; - int count = ((Number) runner.query(conn, sql, new ScalarHandler(1), param)).intValue(); + int count = (runner.query(conn, sql, new ScalarHandler(1), param)).intValue(); return count; } catch (Exception ex) { logger.error("根据日期查询报警记录数异常", ex); @@ -51,7 +53,7 @@ public PgAlarm findLatestAlarmByDevice(int deviceId) { Connection conn = null; String queryStr = "SELECT A.* FROM " + - "(SELECT ID, ACTIVE, ALARM_DATE, ALARM_VALUE, DESCRIPTION, ALARMDEVID, ALARMTYPEID, ALARM_GRADE FROM PG_ALARM WHERE ALARMDEVID = ? ORDER BY ALARM_DATE DESC) A " + + "(SELECT ID, ACTIVE, ALARM_DATE, ALARM_VALUE, DESCRIPTION, ALARMDEVID, ALARMTYPEID, ALARM_GRADE, LOG_TIME, LOG_DESC FROM PG_ALARM WHERE ALARMDEVID = ? ORDER BY ALARM_DATE DESC) A " + "WHERE ROWNUM <= 1"; Object[] param = new Object[1]; try { @@ -60,7 +62,7 @@ QueryRunner runner = new QueryRunner(); param[0] = deviceId; - List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler(), param); + List tempList = runner.query(conn, queryStr, new ArrayListHandler(), param); if (null != tempList && tempList.isEmpty() == false) { PgAlarm alarm = new PgAlarm(); Object[] item = tempList.get(0); @@ -79,6 +81,74 @@ alarm.setAlarmtypeid(((Number) item[6]).intValue()); alarm.setAlarm_grade((String) item[7]); + if (null != item[8]) { + long logTmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[8]).toJdbc()).getTime(); + Calendar logCal = Calendar.getInstance(); + logCal.setTimeInMillis(logTmValue); + alarm.setLog_time(logCal.getTime()); + } else { + alarm.setLog_time(null); + } + + alarm.setLog_desc((String) item[9]); + + logger.debug("根据设备查询最新报警记录成功"); + + return alarm; + } else { + return null; + } + } catch (Exception ex) { + logger.error("根据设备查询最新报警记录成功", ex); + return null; + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + } + + @Override + public PgAlarm findLatestAlarmByDeviceAndType(int deviceId, String type) { + Connection conn = null; + String queryStr = "SELECT A.* FROM " + + "(SELECT ID, ACTIVE, ALARM_DATE, ALARM_VALUE, DESCRIPTION, ALARMDEVID, ALARMTYPEID, ALARM_GRADE, LOG_TIME, LOG_DESC FROM PG_ALARM WHERE ALARMDEVID = ? AND DESCRIPTION LIKE ? ORDER BY ALARM_DATE DESC) A " + + "WHERE ROWNUM <= 1"; + Object[] param = new Object[2]; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + QueryRunner runner = new QueryRunner(); + param[0] = deviceId; + param[1] = "%" + type + "%"; + + List tempList = runner.query(conn, queryStr, new ArrayListHandler(), param); + if (null != tempList && tempList.isEmpty() == false) { + PgAlarm alarm = new PgAlarm(); + Object[] item = tempList.get(0); + + alarm.setId(((Number) item[0]).intValue()); + alarm.setActive(((Number) item[1]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + alarm.setAlarm_date(cal.getTime()); + + alarm.setAlarm_value((String) item[3]); + alarm.setDescription((String) item[4]); + alarm.setAlarmdevid(((Number) item[5]).intValue()); + alarm.setAlarmtypeid(((Number) item[6]).intValue()); + alarm.setAlarm_grade((String) item[7]); + + long logTmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[8]).toJdbc()).getTime(); + Calendar logCal = Calendar.getInstance(); + logCal.setTimeInMillis(logTmValue); + alarm.setLog_time(logCal.getTime()); + alarm.setLog_desc((String) item[9]); + logger.debug("根据设备查询最新报警记录成功"); return alarm; @@ -111,28 +181,31 @@ QueryRunner runner = new QueryRunner(); // 查询同一设备是否有正在报警的消息 - Number id = (Number) runner.query(conn, querySql, new ScalarHandler(1), queryParam); + Number id = runner.query(conn, querySql, new ScalarHandler(1), queryParam); if (null != id) { // 找到设备已存在的记录 // 1先将正在报警的设备自动消警 - String updateSql = "UPDATE PG_ALARM SET ACTIVE=0 WHERE ID=?"; + String updateSql = "UPDATE PG_ALARM SET ACTIVE=0, LOG_TIME=SYSDATE, LOG_DESC=? WHERE ID=?"; - Object[] updateParam = new Object[1]; - updateParam[0] = id.longValue(); - - runner.update(conn, updateSql, updateParam); // 更新报警记录 - } + Object[] updateParam = new Object[2]; + updateParam[0] = "重复报警自动消警"; + updateParam[1] = id.longValue(); + + // 更新报警记录 + runner.update(conn, updateSql, updateParam); + } // 插入新的报警记录 String insertSql = "INSERT INTO PG_ALARM " + - "(ID, ACTIVE, ALARM_DATE, ALARM_VALUE, DESCRIPTION, ALARMDEVID, ALARMTYPEID, USERID, ALARM_GRADE) " + - "VALUES (?, ?, TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), ?, ?, ?, ?, ?, ?)"; + "(ID, ACTIVE, ALARM_DATE, ALARM_VALUE, DESCRIPTION, ALARMDEVID, ALARMTYPEID, USERID, ALARM_GRADE, LOG_TIME, LOG_DESC) " + + "VALUES (?, ?, TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), ?, ?, ?, ?, ?, ?, TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), ?)"; String sqlId = "SELECT SEQ_PG_ALARM_ID.NEXTVAL FROM DUAL"; - long newId = ((Number) runner.query(conn, sqlId, new ScalarHandler(1))).longValue(); // 获取新的id - - Object[] params = new Object[9]; + // 获取新的id + long newId = (runner.query(conn, sqlId, new ScalarHandler(1))).longValue(); + + Object[] params = new Object[11]; params[0] = newId; params[1] = alarmRecord.getActive(); @@ -143,8 +216,11 @@ params[6] = alarmRecord.getAlarmtypeid(); params[7] = alarmRecord.getUserid(); params[8] = alarmRecord.getAlarm_grade(); - - int count = runner.update(conn, insertSql, params); // 新增主表 + params[9] = TimeFormat.formatTimestamp(alarmRecord.getLog_time()); + params[10] = alarmRecord.getLog_desc(); + + // 新增报警记录 + int count = runner.update(conn, insertSql, params); if (count > 0) { logger.debug("插入报警数据成功"); diff --git a/src/com/szpg/db/dao/impl/PgCODaoImpl.java b/src/com/szpg/db/dao/impl/PgCODaoImpl.java index 186ac16..70d672c 100644 --- a/src/com/szpg/db/dao/impl/PgCODaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgCODaoImpl.java @@ -292,6 +292,51 @@ } @Override + public PgCO findLastRecordByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT ID, CO, LOGTIME, PGDEVICEID FROM (SELECT * FROM PG_CO WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, sql, new ArrayListHandler(), param); + if (null != tempList && tempList.size() == 1) { + PgCO co = new PgCO(); + Object[] item = tempList.get(0); + + co.setId(((Number) item[0]).intValue()); + co.setCo(Float.parseFloat((String) item[1])); + co.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + co.setLogtime(cal.getTime()); + co.setUptime(cal.getTime()); + + logger.debug("根据设备ID查询最新一氧化碳监测记录成功" + co + "]"); + + return co; + } else { + return null; + } + } catch (Exception ex) { + logger.error("根据设备ID查询最新一氧化碳监测记录异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override public int addPblzRecord(PgCO co) { return addPblzRecord(co.getCo(), co.getTmStr(), co.getPgdeviceid()); } diff --git a/src/com/szpg/db/dao/impl/PgCh4DaoImpl.java b/src/com/szpg/db/dao/impl/PgCh4DaoImpl.java index 0ed139e..768b6a5 100644 --- a/src/com/szpg/db/dao/impl/PgCh4DaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgCh4DaoImpl.java @@ -54,9 +54,9 @@ list.add(ch4); } return list; - } - else + } else { return null; + } } catch (Exception ex) { logger.error("查询所有甲烷监测值异常", ex); } finally { @@ -100,9 +100,9 @@ logger.debug("根据ID查询甲烷监测值成功" + ch4 + "]"); return ch4; - } - else + } else { return null; + } } catch (Exception ex) { logger.error("根据ID查询甲烷监测值异常", ex); } finally { @@ -149,9 +149,9 @@ logger.debug("根据设备ID查询最新的甲烷监测值成功" + ch4 + "]"); return ch4; - } - else + } else { return null; + } } catch (Exception ex) { logger.error("根据设备ID查询最新的甲烷监测值异常", ex); } finally { @@ -199,9 +199,9 @@ list.add(ch4); } return list; - } - else + } else { return null; + } } catch (Exception ex) { logger.error("根据设备ID查询甲烷监测值异常", ex); } finally { @@ -251,9 +251,9 @@ list.add(ch4); } return list; - } - else + } else { return null; + } } catch (Exception ex) { logger.error("根据设备ID和时间查询甲烷监测值异常", ex); } finally { @@ -293,6 +293,51 @@ } @Override + public PgCh4 findLastRecordByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT ID, CH4, LOGTIME, PGDEVICEID FROM (SELECT * FROM PG_CH4 WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, sql, new ArrayListHandler(), param); + if (null != tempList && tempList.size() == 1) { + PgCh4 ch4 = new PgCh4(); + Object[] item = tempList.get(0); + + ch4.setId(((Number) item[0]).intValue()); + ch4.setCh4(Float.parseFloat((String) item[1])); + ch4.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + ch4.setLogtime(cal.getTime()); + ch4.setUptime(cal.getTime()); + + logger.debug("根据设备ID查询最新甲烷监测记录成功" + ch4 + "]"); + + return ch4; + } else { + return null; + } + } catch (Exception ex) { + logger.error("根据设备ID查询最新甲烷监测记录异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override public int addPblzRecord(PgCh4 ch4) { return addPblzRecord(ch4.getCh4(), ch4.getTmStr(), ch4.getPgdeviceid()); } diff --git a/src/com/szpg/db/dao/impl/PgHSDaoImpl.java b/src/com/szpg/db/dao/impl/PgHSDaoImpl.java index 892e175..fa4ea02 100644 --- a/src/com/szpg/db/dao/impl/PgHSDaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgHSDaoImpl.java @@ -292,6 +292,51 @@ } @Override + public PgSH findLastRecordByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT ID, SH, LOGTIME, PGDEVICEID FROM (SELECT * FROM PG_SH WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, sql, new ArrayListHandler(), param); + if (null != tempList && tempList.size() == 1) { + PgSH sh = new PgSH(); + Object[] item = tempList.get(0); + + sh.setId(((Number) item[0]).intValue()); + sh.setSh(Float.parseFloat((String) item[1])); + sh.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + sh.setLogtime(cal.getTime()); + sh.setUptime(cal.getTime()); + + logger.debug("根据设备ID查询最新硫化氢监测记录成功" + sh + "]"); + + return sh; + } else { + return null; + } + } catch (Exception ex) { + logger.error("根据设备ID查询最新硫化氢监测记录异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override public int addPblzRecord(PgSH sh) { return addPblzRecord(sh.getSh(), sh.getTmStr(), sh.getPgdeviceid()); } diff --git a/src/com/szpg/db/dao/impl/PgO2DaoImpl.java b/src/com/szpg/db/dao/impl/PgO2DaoImpl.java index f58f8cd..842291b 100644 --- a/src/com/szpg/db/dao/impl/PgO2DaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgO2DaoImpl.java @@ -54,9 +54,9 @@ list.add(o2); } return list; - } - else + } else { return null; + } } catch (Exception ex) { logger.error("查询所有氧气监测值异常", ex); } finally { @@ -100,9 +100,9 @@ logger.debug("根据ID查询氧气监测值成功" + o2 + "]"); return o2; - } - else + } else { return null; + } } catch (Exception ex) { logger.error("根据ID查询氧气监测值异常", ex); } finally { @@ -148,9 +148,9 @@ logger.debug("根据设备ID查询最新的氧气监测值成功" + o2 + "]"); return o2; - } - else + } else { return null; + } } catch (Exception ex) { logger.error("根据设备ID查询最新的硫化氢监测值异常", ex); } finally { @@ -198,9 +198,9 @@ list.add(o2); } return list; - } - else + } else { return null; + } } catch (Exception ex) { logger.error("根据设备ID查询氧气监测值异常", ex); } finally { @@ -250,9 +250,9 @@ list.add(o2); } return list; - } - else + } else { return null; + } } catch (Exception ex) { logger.error("根据设备ID和时间查询氧气监测值异常", ex); } finally { @@ -292,6 +292,51 @@ } @Override + public PgO2 findLastRecordByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT ID, O2, LOGTIME, PGDEVICEID FROM (SELECT * FROM PG_O2 WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, sql, new ArrayListHandler(), param); + if (null != tempList && tempList.size() == 1) { + PgO2 o2 = new PgO2(); + Object[] item = tempList.get(0); + + o2.setId(((Number) item[0]).intValue()); + o2.setO2(Float.parseFloat((String) item[1])); + o2.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + o2.setLogtime(cal.getTime()); + o2.setUptime(cal.getTime()); + + logger.debug("根据设备ID查询最新氧气监测记录成功" + o2 + "]"); + + return o2; + } else { + return null; + } + } catch (Exception ex) { + logger.error("根据设备ID查询最新氧气监测记录异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override public int addPblzRecord(PgO2 o2) { return addPblzRecord(o2.getO2(), o2.getTmStr(), o2.getPgdeviceid()); } @@ -316,10 +361,11 @@ QueryRunner runner = new QueryRunner(); int count = runner.update(conn, insertStr, params); - if (count > 0) + if (count > 0) { logger.debug("插入氧气监测值成功[tm=" + tm + ", value=" + value + ", deviceid=" + deviceid + "]"); - else + } else { logger.error("插入氧气监测值失败!"); + } return count; } catch (Exception ex) { diff --git a/src/com/szpg/db/dao/impl/PgWsDaoImpl.java b/src/com/szpg/db/dao/impl/PgWsDaoImpl.java index 679b58f..77925f7 100644 --- a/src/com/szpg/db/dao/impl/PgWsDaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgWsDaoImpl.java @@ -323,6 +323,52 @@ } @Override + public PgTemphum findLastRecordByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT ID, TEMP, HUM, LOGTIME, PGDEVICEID FROM (SELECT * FROM PG_TEMPHUM WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, sql, new ArrayListHandler(), param); + if (null != tempList && tempList.size() == 1) { + PgTemphum temphum = new PgTemphum(); + Object[] item = tempList.get(0); + + temphum.setId(((Number) item[0]).intValue()); + temphum.setTemp(Float.parseFloat((String) item[1])); + temphum.setHum(Float.parseFloat((String) item[2])); + temphum.setPgdeviceid(((Number) item[4]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + temphum.setLogtime(cal.getTime()); + temphum.setUptime(cal.getTime()); + + logger.debug("根据设备ID查询最新温湿度监测记录成功" + temphum + "]"); + + return temphum; + } else { + return null; + } + } catch (Exception ex) { + logger.error("根据设备ID查询最新温湿度监测记录异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override public int addWsdzRecord(PgTemphum ws) { return addWsdzRecord(ws.getTemp(), ws.getHum(), ws.getTmStr(), ws.getPgdeviceid()); } diff --git a/src/com/szpg/db/data/PgAlarm.java b/src/com/szpg/db/data/PgAlarm.java index 5a73ba9..4b97e6a 100644 --- a/src/com/szpg/db/data/PgAlarm.java +++ b/src/com/szpg/db/data/PgAlarm.java @@ -1,9 +1,12 @@ package com.szpg.db.data; -import java.util.Date; - import com.szpg.util.TimeFormat; +import java.util.Date; + +/** + * @author TAN YUE + */ public class PgAlarm implements java.io.Serializable { /** @@ -20,11 +23,28 @@ private Integer alarmtypeid; private Integer userid; private String alarm_grade; - - public static Integer ALARM_TYPE_DEVRUN = 1; //管廊设备运行故障 - public static Integer ALARM_TYPE_PGRUN = 2; //管廊运行环境报警 - public static Integer ALARM_TYPE_PGSAF = 3; //管廊安全防范报警 - public static Integer ALARM_TYPE_INPG = 4; //人员入廊超时报警 + private Date log_time; + private String log_desc; + + /** + * 管廊设备运行故障 + */ + public static Integer ALARM_TYPE_DEVRUN = 1; + + /** + * 管廊运行环境报警 + */ + public static Integer ALARM_TYPE_PGRUN = 2; + + /** + * 管廊安全防范报警 + */ + public static Integer ALARM_TYPE_PGSAF = 3; + + /** + * 人员入廊超时报警 + */ + public static Integer ALARM_TYPE_INPG = 4; public Integer getId() { return id; @@ -97,10 +117,130 @@ public void setAlarm_grade(String alarm_grade) { this.alarm_grade = alarm_grade; } + + public Date getLog_time() { + if (null == log_time) { + return alarm_date; + } + return log_time; + } + + public void setLog_time(Date log_time) { + this.log_time = log_time; + } + + public String getLog_desc() { + return log_desc; + } + + public void setLog_desc(String log_desc) { + this.log_desc = log_desc; + } @Override public String toString() { return "PgAlarm[alarmValue=" + alarm_value + ", alarmDate=" + TimeFormat.formatTimestamp(alarm_date) + ", alarmDevId= " + alarmdevid + "]"; } + /** + * 生成氧气报警记录 + * @return + */ + public PgAlarm getO2AlarmInstance() { + PgAlarm alarm = new PgAlarm(); + alarm.setActive(1); + alarm.setAlarmtypeid(PgAlarm.ALARM_TYPE_PGRUN); + alarm.setDescription("氧气浓度低于低限阈值"); + alarm.setUserid(null); + + // 氧气报警定义为一级报警 + alarm.setAlarm_grade("一级报警"); + + return alarm; + } + + /** + * 生成一氧化碳报警记录 + * @return + */ + public PgAlarm getCOAlarmInstance() { + PgAlarm alarm = new PgAlarm(); + alarm.setActive(1); + alarm.setAlarmtypeid(PgAlarm.ALARM_TYPE_PGRUN); + alarm.setDescription("一氧化碳浓度超过高限阈值"); + alarm.setUserid(null); + + // 一氧化碳报警定义为一级报警 + alarm.setAlarm_grade("一级报警"); + + return alarm; + } + + /** + * 生成硫化氢报警记录 + * @return + */ + public PgAlarm getHSAlarmInstance() { + PgAlarm alarm = new PgAlarm(); + alarm.setActive(1); + alarm.setAlarmtypeid(PgAlarm.ALARM_TYPE_PGRUN); + alarm.setDescription("硫化氢浓度超过高限阈值"); + alarm.setUserid(null); + + // 硫化氢报警定义为一级报警 + alarm.setAlarm_grade("一级报警"); + + return alarm; + } + + /** + * 生成甲烷报警记录 + * @return + */ + public PgAlarm getCH4AlarmInstance() { + PgAlarm alarm = new PgAlarm(); + alarm.setActive(1); + alarm.setAlarmtypeid(PgAlarm.ALARM_TYPE_PGRUN); + alarm.setDescription("甲烷浓度超过高限阈值"); + alarm.setUserid(null); + + // 甲烷报警定义为二级报警 + alarm.setAlarm_grade("二级报警"); + + return alarm; + } + + /** + * 生成温度报警记录 + * @return + */ + public PgAlarm getTempAlarmInstance() { + PgAlarm alarm = new PgAlarm(); + alarm.setActive(1); + alarm.setAlarmtypeid(PgAlarm.ALARM_TYPE_PGRUN); + alarm.setDescription("温度超过高限阈值"); + alarm.setUserid(null); + + // 温度定义为二级报警 + alarm.setAlarm_grade("二级报警"); + + return alarm; + } + + /** + * 生成湿度报警记录 + * @return + */ + public PgAlarm getHumAlarmInstance() { + PgAlarm alarm = new PgAlarm(); + alarm.setActive(1); + alarm.setAlarmtypeid(PgAlarm.ALARM_TYPE_PGRUN); + alarm.setDescription("湿度超过高限阈值"); + alarm.setUserid(null); + + // 湿度报警定义为二级报警 + alarm.setAlarm_grade("二级报警"); + + return alarm; + } } diff --git a/src/com/szpg/plc/message/response/read/ReadCH4ValueCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadCH4ValueCommandResponse.java index c26ffa5..13c5968 100644 --- a/src/com/szpg/plc/message/response/read/ReadCH4ValueCommandResponse.java +++ b/src/com/szpg/plc/message/response/read/ReadCH4ValueCommandResponse.java @@ -4,6 +4,7 @@ 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; @@ -25,6 +26,9 @@ import com.szpg.util.NumberFormat; import com.szpg.util.TimeFormat; +/** + * @author TAN YUE + */ public class ReadCH4ValueCommandResponse extends ReadMemoryCommandResponse { /** @@ -33,10 +37,24 @@ private static final long serialVersionUID = 8081222348890587881L; private final Logger logger = Logger.getLogger(this.getClass().getName()); - - private List jwnd; //甲烷浓度值 - private List jwldbjz; //甲烷联动报警值 - private String[] zcList; //甲烷监测的资产列表,从配置文件中获取 + + /** + * 甲烷浓度值 + */ + private List jwnd; + + /** + * 甲烷联动报警值 + */ + private List jwldbjz; + + /** + * 甲烷监测的资产列表,从配置文件中获取 + */ + private String[] zcList; + + private boolean CH4_ON_FJ = false; + private long CLASS_YELLOW_ALARM_INTERVAL = 360 * 60 * 1000L; public ReadCH4ValueCommandResponse() { jwnd = new ArrayList(); @@ -74,94 +92,108 @@ 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) { - ch4Dao.addPblzRecord(jwnd.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), deviceId); - - // (一)如果有报警则立即推送 - // 判断是否超过报警阈值 + // 1 取出报警规则 PgAlarmRule rule = ruleDao.findRuleByDevice(deviceId); + + // 默认的报警阈值 + double high = 0.0; if (null != rule) { - double high = 0.0; try { high = NumberFormat.parseDouble(rule.getHighvalue(), "0.00"); } catch (Exception ex) { logger.error(ex); ex.printStackTrace(); } - - // 甲烷浓度超过高限阈值 - if (high > 0.0001 && value > high) { - PgAlarm alarm = new PgAlarm(); - alarm.setActive(1); - alarm.setAlarm_date(this.getTime().getTime()); - alarm.setAlarm_value(NumberFormat.format(value, "0.00")); - alarm.setAlarmdevid(deviceId); - alarm.setAlarmtypeid(PgAlarm.ALARM_TYPE_PGRUN); - alarm.setDescription("甲烷浓度超过高限阈值"); - alarm.setUserid(null); - // 甲烷报警定义为二级报警 - alarm.setAlarm_grade("二级报警"); - - alarmDao.insertAlarmRecord(alarm); - deviceDao.updateDeviceStatus(deviceId, "甲烷浓度过高"); - - // 将报警日志推送至市级平台 - 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); - - // 将报警值推送至市级平台 - String jwResp = DataPushInterface.addCH4Data(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); - logger.info("同步甲烷浓度值结果:" + jwResp); + } - // 自动打开当前舱段的排风机,手动关闭风机 - // 首先找到当前舱段的排风机资产编号 - if (Boolean.valueOf(Configure.getProperty("sys", "CH4_ON_FJ", "false")) == true) { - String acucode = zcbh.substring(0, zcbh.indexOf(".", 6)); - String cabin = zcbh.substring(zcbh.lastIndexOf(".") + 1, zcbh.lastIndexOf(".") + 2); - List fjs = deviceDao.findDeviceByPositionAndType(acucode, "F", cabin); - if (null != fjs && fjs.isEmpty() == false) { - String baseURL = Configure.getProperty("sys", "PGDSC_API_URL"); - for (PgDevice fj : fjs) { - String fjzcbh = fj.getAssetcode(); + // 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(); - // 调用远程接口启动风机 - HttpRequest.sendGet(baseURL + "remote/turnOnFj.action", "zcbh=" + fjzcbh); - } - } + // 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; } } - } - - // (二)如果监测值有变化则推送 - // 判断甲烷浓度值是否有变化 - double lastValue = ch4Dao.findLastValueByDevice(deviceId); - if (Math.abs(value - lastValue) > 0.01) { - // 将监测值推送至市级平台 + + // 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); - } - - // (三)如果监测值有变化则推送 - // 每天小时各推送一个数据 - int minute = Calendar.getInstance().get(Calendar.MINUTE); - if (minute < 10) { - // 将监测值推送至市级平台 - 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 + "]"); diff --git a/src/com/szpg/db/dao/PgAlarmDao.java b/src/com/szpg/db/dao/PgAlarmDao.java index 11d8a1d..4ab98d4 100644 --- a/src/com/szpg/db/dao/PgAlarmDao.java +++ b/src/com/szpg/db/dao/PgAlarmDao.java @@ -6,6 +6,7 @@ public int findAlarmCountByDate(String date); public PgAlarm findLatestAlarmByDevice(int deviceId); + public PgAlarm findLatestAlarmByDeviceAndType(int deviceId, String type); public long insertAlarmRecord(PgAlarm alarmRecord); } diff --git a/src/com/szpg/db/dao/PgCODao.java b/src/com/szpg/db/dao/PgCODao.java index 1664f51..5098321 100644 --- a/src/com/szpg/db/dao/PgCODao.java +++ b/src/com/szpg/db/dao/PgCODao.java @@ -20,6 +20,7 @@ public List findPblzByDeviceAndTm(Integer deviceid, String start, String end); public double findLastValueByDevice(Integer deviceid); + public PgCO findLastRecordByDevice(Integer id); public int addPblzRecord(PgCO ch4); public int addPblzRecord(float value, String tm, int deviceid); diff --git a/src/com/szpg/db/dao/PgCh4Dao.java b/src/com/szpg/db/dao/PgCh4Dao.java index e23b964..61fdfcd 100644 --- a/src/com/szpg/db/dao/PgCh4Dao.java +++ b/src/com/szpg/db/dao/PgCh4Dao.java @@ -20,6 +20,7 @@ public List findPblzByDeviceAndTm(Integer deviceid, String start, String end); public double findLastValueByDevice(Integer deviceid); + public PgCh4 findLastRecordByDevice(Integer deviceid); public int addPblzRecord(PgCh4 ch4); public int addPblzRecord(float value, String tm, int deviceid); diff --git a/src/com/szpg/db/dao/PgHSDao.java b/src/com/szpg/db/dao/PgHSDao.java index f89b044..0f0ee53 100644 --- a/src/com/szpg/db/dao/PgHSDao.java +++ b/src/com/szpg/db/dao/PgHSDao.java @@ -20,6 +20,7 @@ public List findPblzByDeviceAndTm(Integer deviceid, String start, String end); public double findLastValueByDevice(Integer deviceid); + public PgSH findLastRecordByDevice(Integer deviceid); public int addPblzRecord(PgSH hs); public int addPblzRecord(float value, String tm, int deviceid); diff --git a/src/com/szpg/db/dao/PgO2Dao.java b/src/com/szpg/db/dao/PgO2Dao.java index 0b3d0bf..678adab 100644 --- a/src/com/szpg/db/dao/PgO2Dao.java +++ b/src/com/szpg/db/dao/PgO2Dao.java @@ -20,6 +20,7 @@ public List findPblzByDeviceAndTm(Integer deviceid, String start, String end); public double findLastValueByDevice(Integer deviceid); + public PgO2 findLastRecordByDevice(Integer deviceid); public int addPblzRecord(PgO2 ch4); public int addPblzRecord(float value, String tm, int deviceid); diff --git a/src/com/szpg/db/dao/PgWsDao.java b/src/com/szpg/db/dao/PgWsDao.java index 370a83f..bfd0eed 100644 --- a/src/com/szpg/db/dao/PgWsDao.java +++ b/src/com/szpg/db/dao/PgWsDao.java @@ -21,6 +21,7 @@ public double findLastTempByDevice(Integer deviceid); public double findLastHumByDevice(Integer deviceid); + public PgTemphum findLastRecordByDevice(Integer deviceid); public int addWsdzRecord(PgTemphum wsdz); public int addWsdzRecord(float temp, float hum, String tm, int deviceid); diff --git a/src/com/szpg/db/dao/impl/PgAlarmDaoImpl.java b/src/com/szpg/db/dao/impl/PgAlarmDaoImpl.java index cedf5fc..ce9ee0f 100644 --- a/src/com/szpg/db/dao/impl/PgAlarmDaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgAlarmDaoImpl.java @@ -8,7 +8,6 @@ import org.apache.commons.dbutils.DbUtils; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.handlers.ArrayListHandler; -import org.apache.commons.dbutils.handlers.BeanListHandler; import org.apache.commons.dbutils.handlers.ScalarHandler; import org.apache.log4j.Logger; @@ -17,6 +16,9 @@ import com.szpg.db.util.ConnectionManager; import com.szpg.util.TimeFormat; +/** + * @author TAN YUE + */ public class PgAlarmDaoImpl implements PgAlarmDao { private final Logger logger = Logger.getLogger(this.getClass().getName()); @@ -33,7 +35,7 @@ QueryRunner runner = new QueryRunner(); param[0] = date; - int count = ((Number) runner.query(conn, sql, new ScalarHandler(1), param)).intValue(); + int count = (runner.query(conn, sql, new ScalarHandler(1), param)).intValue(); return count; } catch (Exception ex) { logger.error("根据日期查询报警记录数异常", ex); @@ -51,7 +53,7 @@ public PgAlarm findLatestAlarmByDevice(int deviceId) { Connection conn = null; String queryStr = "SELECT A.* FROM " + - "(SELECT ID, ACTIVE, ALARM_DATE, ALARM_VALUE, DESCRIPTION, ALARMDEVID, ALARMTYPEID, ALARM_GRADE FROM PG_ALARM WHERE ALARMDEVID = ? ORDER BY ALARM_DATE DESC) A " + + "(SELECT ID, ACTIVE, ALARM_DATE, ALARM_VALUE, DESCRIPTION, ALARMDEVID, ALARMTYPEID, ALARM_GRADE, LOG_TIME, LOG_DESC FROM PG_ALARM WHERE ALARMDEVID = ? ORDER BY ALARM_DATE DESC) A " + "WHERE ROWNUM <= 1"; Object[] param = new Object[1]; try { @@ -60,7 +62,7 @@ QueryRunner runner = new QueryRunner(); param[0] = deviceId; - List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler(), param); + List tempList = runner.query(conn, queryStr, new ArrayListHandler(), param); if (null != tempList && tempList.isEmpty() == false) { PgAlarm alarm = new PgAlarm(); Object[] item = tempList.get(0); @@ -79,6 +81,74 @@ alarm.setAlarmtypeid(((Number) item[6]).intValue()); alarm.setAlarm_grade((String) item[7]); + if (null != item[8]) { + long logTmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[8]).toJdbc()).getTime(); + Calendar logCal = Calendar.getInstance(); + logCal.setTimeInMillis(logTmValue); + alarm.setLog_time(logCal.getTime()); + } else { + alarm.setLog_time(null); + } + + alarm.setLog_desc((String) item[9]); + + logger.debug("根据设备查询最新报警记录成功"); + + return alarm; + } else { + return null; + } + } catch (Exception ex) { + logger.error("根据设备查询最新报警记录成功", ex); + return null; + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + } + + @Override + public PgAlarm findLatestAlarmByDeviceAndType(int deviceId, String type) { + Connection conn = null; + String queryStr = "SELECT A.* FROM " + + "(SELECT ID, ACTIVE, ALARM_DATE, ALARM_VALUE, DESCRIPTION, ALARMDEVID, ALARMTYPEID, ALARM_GRADE, LOG_TIME, LOG_DESC FROM PG_ALARM WHERE ALARMDEVID = ? AND DESCRIPTION LIKE ? ORDER BY ALARM_DATE DESC) A " + + "WHERE ROWNUM <= 1"; + Object[] param = new Object[2]; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + QueryRunner runner = new QueryRunner(); + param[0] = deviceId; + param[1] = "%" + type + "%"; + + List tempList = runner.query(conn, queryStr, new ArrayListHandler(), param); + if (null != tempList && tempList.isEmpty() == false) { + PgAlarm alarm = new PgAlarm(); + Object[] item = tempList.get(0); + + alarm.setId(((Number) item[0]).intValue()); + alarm.setActive(((Number) item[1]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + alarm.setAlarm_date(cal.getTime()); + + alarm.setAlarm_value((String) item[3]); + alarm.setDescription((String) item[4]); + alarm.setAlarmdevid(((Number) item[5]).intValue()); + alarm.setAlarmtypeid(((Number) item[6]).intValue()); + alarm.setAlarm_grade((String) item[7]); + + long logTmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[8]).toJdbc()).getTime(); + Calendar logCal = Calendar.getInstance(); + logCal.setTimeInMillis(logTmValue); + alarm.setLog_time(logCal.getTime()); + alarm.setLog_desc((String) item[9]); + logger.debug("根据设备查询最新报警记录成功"); return alarm; @@ -111,28 +181,31 @@ QueryRunner runner = new QueryRunner(); // 查询同一设备是否有正在报警的消息 - Number id = (Number) runner.query(conn, querySql, new ScalarHandler(1), queryParam); + Number id = runner.query(conn, querySql, new ScalarHandler(1), queryParam); if (null != id) { // 找到设备已存在的记录 // 1先将正在报警的设备自动消警 - String updateSql = "UPDATE PG_ALARM SET ACTIVE=0 WHERE ID=?"; + String updateSql = "UPDATE PG_ALARM SET ACTIVE=0, LOG_TIME=SYSDATE, LOG_DESC=? WHERE ID=?"; - Object[] updateParam = new Object[1]; - updateParam[0] = id.longValue(); - - runner.update(conn, updateSql, updateParam); // 更新报警记录 - } + Object[] updateParam = new Object[2]; + updateParam[0] = "重复报警自动消警"; + updateParam[1] = id.longValue(); + + // 更新报警记录 + runner.update(conn, updateSql, updateParam); + } // 插入新的报警记录 String insertSql = "INSERT INTO PG_ALARM " + - "(ID, ACTIVE, ALARM_DATE, ALARM_VALUE, DESCRIPTION, ALARMDEVID, ALARMTYPEID, USERID, ALARM_GRADE) " + - "VALUES (?, ?, TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), ?, ?, ?, ?, ?, ?)"; + "(ID, ACTIVE, ALARM_DATE, ALARM_VALUE, DESCRIPTION, ALARMDEVID, ALARMTYPEID, USERID, ALARM_GRADE, LOG_TIME, LOG_DESC) " + + "VALUES (?, ?, TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), ?, ?, ?, ?, ?, ?, TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), ?)"; String sqlId = "SELECT SEQ_PG_ALARM_ID.NEXTVAL FROM DUAL"; - long newId = ((Number) runner.query(conn, sqlId, new ScalarHandler(1))).longValue(); // 获取新的id - - Object[] params = new Object[9]; + // 获取新的id + long newId = (runner.query(conn, sqlId, new ScalarHandler(1))).longValue(); + + Object[] params = new Object[11]; params[0] = newId; params[1] = alarmRecord.getActive(); @@ -143,8 +216,11 @@ params[6] = alarmRecord.getAlarmtypeid(); params[7] = alarmRecord.getUserid(); params[8] = alarmRecord.getAlarm_grade(); - - int count = runner.update(conn, insertSql, params); // 新增主表 + params[9] = TimeFormat.formatTimestamp(alarmRecord.getLog_time()); + params[10] = alarmRecord.getLog_desc(); + + // 新增报警记录 + int count = runner.update(conn, insertSql, params); if (count > 0) { logger.debug("插入报警数据成功"); diff --git a/src/com/szpg/db/dao/impl/PgCODaoImpl.java b/src/com/szpg/db/dao/impl/PgCODaoImpl.java index 186ac16..70d672c 100644 --- a/src/com/szpg/db/dao/impl/PgCODaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgCODaoImpl.java @@ -292,6 +292,51 @@ } @Override + public PgCO findLastRecordByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT ID, CO, LOGTIME, PGDEVICEID FROM (SELECT * FROM PG_CO WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, sql, new ArrayListHandler(), param); + if (null != tempList && tempList.size() == 1) { + PgCO co = new PgCO(); + Object[] item = tempList.get(0); + + co.setId(((Number) item[0]).intValue()); + co.setCo(Float.parseFloat((String) item[1])); + co.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + co.setLogtime(cal.getTime()); + co.setUptime(cal.getTime()); + + logger.debug("根据设备ID查询最新一氧化碳监测记录成功" + co + "]"); + + return co; + } else { + return null; + } + } catch (Exception ex) { + logger.error("根据设备ID查询最新一氧化碳监测记录异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override public int addPblzRecord(PgCO co) { return addPblzRecord(co.getCo(), co.getTmStr(), co.getPgdeviceid()); } diff --git a/src/com/szpg/db/dao/impl/PgCh4DaoImpl.java b/src/com/szpg/db/dao/impl/PgCh4DaoImpl.java index 0ed139e..768b6a5 100644 --- a/src/com/szpg/db/dao/impl/PgCh4DaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgCh4DaoImpl.java @@ -54,9 +54,9 @@ list.add(ch4); } return list; - } - else + } else { return null; + } } catch (Exception ex) { logger.error("查询所有甲烷监测值异常", ex); } finally { @@ -100,9 +100,9 @@ logger.debug("根据ID查询甲烷监测值成功" + ch4 + "]"); return ch4; - } - else + } else { return null; + } } catch (Exception ex) { logger.error("根据ID查询甲烷监测值异常", ex); } finally { @@ -149,9 +149,9 @@ logger.debug("根据设备ID查询最新的甲烷监测值成功" + ch4 + "]"); return ch4; - } - else + } else { return null; + } } catch (Exception ex) { logger.error("根据设备ID查询最新的甲烷监测值异常", ex); } finally { @@ -199,9 +199,9 @@ list.add(ch4); } return list; - } - else + } else { return null; + } } catch (Exception ex) { logger.error("根据设备ID查询甲烷监测值异常", ex); } finally { @@ -251,9 +251,9 @@ list.add(ch4); } return list; - } - else + } else { return null; + } } catch (Exception ex) { logger.error("根据设备ID和时间查询甲烷监测值异常", ex); } finally { @@ -293,6 +293,51 @@ } @Override + public PgCh4 findLastRecordByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT ID, CH4, LOGTIME, PGDEVICEID FROM (SELECT * FROM PG_CH4 WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, sql, new ArrayListHandler(), param); + if (null != tempList && tempList.size() == 1) { + PgCh4 ch4 = new PgCh4(); + Object[] item = tempList.get(0); + + ch4.setId(((Number) item[0]).intValue()); + ch4.setCh4(Float.parseFloat((String) item[1])); + ch4.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + ch4.setLogtime(cal.getTime()); + ch4.setUptime(cal.getTime()); + + logger.debug("根据设备ID查询最新甲烷监测记录成功" + ch4 + "]"); + + return ch4; + } else { + return null; + } + } catch (Exception ex) { + logger.error("根据设备ID查询最新甲烷监测记录异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override public int addPblzRecord(PgCh4 ch4) { return addPblzRecord(ch4.getCh4(), ch4.getTmStr(), ch4.getPgdeviceid()); } diff --git a/src/com/szpg/db/dao/impl/PgHSDaoImpl.java b/src/com/szpg/db/dao/impl/PgHSDaoImpl.java index 892e175..fa4ea02 100644 --- a/src/com/szpg/db/dao/impl/PgHSDaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgHSDaoImpl.java @@ -292,6 +292,51 @@ } @Override + public PgSH findLastRecordByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT ID, SH, LOGTIME, PGDEVICEID FROM (SELECT * FROM PG_SH WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, sql, new ArrayListHandler(), param); + if (null != tempList && tempList.size() == 1) { + PgSH sh = new PgSH(); + Object[] item = tempList.get(0); + + sh.setId(((Number) item[0]).intValue()); + sh.setSh(Float.parseFloat((String) item[1])); + sh.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + sh.setLogtime(cal.getTime()); + sh.setUptime(cal.getTime()); + + logger.debug("根据设备ID查询最新硫化氢监测记录成功" + sh + "]"); + + return sh; + } else { + return null; + } + } catch (Exception ex) { + logger.error("根据设备ID查询最新硫化氢监测记录异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override public int addPblzRecord(PgSH sh) { return addPblzRecord(sh.getSh(), sh.getTmStr(), sh.getPgdeviceid()); } diff --git a/src/com/szpg/db/dao/impl/PgO2DaoImpl.java b/src/com/szpg/db/dao/impl/PgO2DaoImpl.java index f58f8cd..842291b 100644 --- a/src/com/szpg/db/dao/impl/PgO2DaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgO2DaoImpl.java @@ -54,9 +54,9 @@ list.add(o2); } return list; - } - else + } else { return null; + } } catch (Exception ex) { logger.error("查询所有氧气监测值异常", ex); } finally { @@ -100,9 +100,9 @@ logger.debug("根据ID查询氧气监测值成功" + o2 + "]"); return o2; - } - else + } else { return null; + } } catch (Exception ex) { logger.error("根据ID查询氧气监测值异常", ex); } finally { @@ -148,9 +148,9 @@ logger.debug("根据设备ID查询最新的氧气监测值成功" + o2 + "]"); return o2; - } - else + } else { return null; + } } catch (Exception ex) { logger.error("根据设备ID查询最新的硫化氢监测值异常", ex); } finally { @@ -198,9 +198,9 @@ list.add(o2); } return list; - } - else + } else { return null; + } } catch (Exception ex) { logger.error("根据设备ID查询氧气监测值异常", ex); } finally { @@ -250,9 +250,9 @@ list.add(o2); } return list; - } - else + } else { return null; + } } catch (Exception ex) { logger.error("根据设备ID和时间查询氧气监测值异常", ex); } finally { @@ -292,6 +292,51 @@ } @Override + public PgO2 findLastRecordByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT ID, O2, LOGTIME, PGDEVICEID FROM (SELECT * FROM PG_O2 WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, sql, new ArrayListHandler(), param); + if (null != tempList && tempList.size() == 1) { + PgO2 o2 = new PgO2(); + Object[] item = tempList.get(0); + + o2.setId(((Number) item[0]).intValue()); + o2.setO2(Float.parseFloat((String) item[1])); + o2.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + o2.setLogtime(cal.getTime()); + o2.setUptime(cal.getTime()); + + logger.debug("根据设备ID查询最新氧气监测记录成功" + o2 + "]"); + + return o2; + } else { + return null; + } + } catch (Exception ex) { + logger.error("根据设备ID查询最新氧气监测记录异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override public int addPblzRecord(PgO2 o2) { return addPblzRecord(o2.getO2(), o2.getTmStr(), o2.getPgdeviceid()); } @@ -316,10 +361,11 @@ QueryRunner runner = new QueryRunner(); int count = runner.update(conn, insertStr, params); - if (count > 0) + if (count > 0) { logger.debug("插入氧气监测值成功[tm=" + tm + ", value=" + value + ", deviceid=" + deviceid + "]"); - else + } else { logger.error("插入氧气监测值失败!"); + } return count; } catch (Exception ex) { diff --git a/src/com/szpg/db/dao/impl/PgWsDaoImpl.java b/src/com/szpg/db/dao/impl/PgWsDaoImpl.java index 679b58f..77925f7 100644 --- a/src/com/szpg/db/dao/impl/PgWsDaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgWsDaoImpl.java @@ -323,6 +323,52 @@ } @Override + public PgTemphum findLastRecordByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT ID, TEMP, HUM, LOGTIME, PGDEVICEID FROM (SELECT * FROM PG_TEMPHUM WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, sql, new ArrayListHandler(), param); + if (null != tempList && tempList.size() == 1) { + PgTemphum temphum = new PgTemphum(); + Object[] item = tempList.get(0); + + temphum.setId(((Number) item[0]).intValue()); + temphum.setTemp(Float.parseFloat((String) item[1])); + temphum.setHum(Float.parseFloat((String) item[2])); + temphum.setPgdeviceid(((Number) item[4]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + temphum.setLogtime(cal.getTime()); + temphum.setUptime(cal.getTime()); + + logger.debug("根据设备ID查询最新温湿度监测记录成功" + temphum + "]"); + + return temphum; + } else { + return null; + } + } catch (Exception ex) { + logger.error("根据设备ID查询最新温湿度监测记录异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override public int addWsdzRecord(PgTemphum ws) { return addWsdzRecord(ws.getTemp(), ws.getHum(), ws.getTmStr(), ws.getPgdeviceid()); } diff --git a/src/com/szpg/db/data/PgAlarm.java b/src/com/szpg/db/data/PgAlarm.java index 5a73ba9..4b97e6a 100644 --- a/src/com/szpg/db/data/PgAlarm.java +++ b/src/com/szpg/db/data/PgAlarm.java @@ -1,9 +1,12 @@ package com.szpg.db.data; -import java.util.Date; - import com.szpg.util.TimeFormat; +import java.util.Date; + +/** + * @author TAN YUE + */ public class PgAlarm implements java.io.Serializable { /** @@ -20,11 +23,28 @@ private Integer alarmtypeid; private Integer userid; private String alarm_grade; - - public static Integer ALARM_TYPE_DEVRUN = 1; //管廊设备运行故障 - public static Integer ALARM_TYPE_PGRUN = 2; //管廊运行环境报警 - public static Integer ALARM_TYPE_PGSAF = 3; //管廊安全防范报警 - public static Integer ALARM_TYPE_INPG = 4; //人员入廊超时报警 + private Date log_time; + private String log_desc; + + /** + * 管廊设备运行故障 + */ + public static Integer ALARM_TYPE_DEVRUN = 1; + + /** + * 管廊运行环境报警 + */ + public static Integer ALARM_TYPE_PGRUN = 2; + + /** + * 管廊安全防范报警 + */ + public static Integer ALARM_TYPE_PGSAF = 3; + + /** + * 人员入廊超时报警 + */ + public static Integer ALARM_TYPE_INPG = 4; public Integer getId() { return id; @@ -97,10 +117,130 @@ public void setAlarm_grade(String alarm_grade) { this.alarm_grade = alarm_grade; } + + public Date getLog_time() { + if (null == log_time) { + return alarm_date; + } + return log_time; + } + + public void setLog_time(Date log_time) { + this.log_time = log_time; + } + + public String getLog_desc() { + return log_desc; + } + + public void setLog_desc(String log_desc) { + this.log_desc = log_desc; + } @Override public String toString() { return "PgAlarm[alarmValue=" + alarm_value + ", alarmDate=" + TimeFormat.formatTimestamp(alarm_date) + ", alarmDevId= " + alarmdevid + "]"; } + /** + * 生成氧气报警记录 + * @return + */ + public PgAlarm getO2AlarmInstance() { + PgAlarm alarm = new PgAlarm(); + alarm.setActive(1); + alarm.setAlarmtypeid(PgAlarm.ALARM_TYPE_PGRUN); + alarm.setDescription("氧气浓度低于低限阈值"); + alarm.setUserid(null); + + // 氧气报警定义为一级报警 + alarm.setAlarm_grade("一级报警"); + + return alarm; + } + + /** + * 生成一氧化碳报警记录 + * @return + */ + public PgAlarm getCOAlarmInstance() { + PgAlarm alarm = new PgAlarm(); + alarm.setActive(1); + alarm.setAlarmtypeid(PgAlarm.ALARM_TYPE_PGRUN); + alarm.setDescription("一氧化碳浓度超过高限阈值"); + alarm.setUserid(null); + + // 一氧化碳报警定义为一级报警 + alarm.setAlarm_grade("一级报警"); + + return alarm; + } + + /** + * 生成硫化氢报警记录 + * @return + */ + public PgAlarm getHSAlarmInstance() { + PgAlarm alarm = new PgAlarm(); + alarm.setActive(1); + alarm.setAlarmtypeid(PgAlarm.ALARM_TYPE_PGRUN); + alarm.setDescription("硫化氢浓度超过高限阈值"); + alarm.setUserid(null); + + // 硫化氢报警定义为一级报警 + alarm.setAlarm_grade("一级报警"); + + return alarm; + } + + /** + * 生成甲烷报警记录 + * @return + */ + public PgAlarm getCH4AlarmInstance() { + PgAlarm alarm = new PgAlarm(); + alarm.setActive(1); + alarm.setAlarmtypeid(PgAlarm.ALARM_TYPE_PGRUN); + alarm.setDescription("甲烷浓度超过高限阈值"); + alarm.setUserid(null); + + // 甲烷报警定义为二级报警 + alarm.setAlarm_grade("二级报警"); + + return alarm; + } + + /** + * 生成温度报警记录 + * @return + */ + public PgAlarm getTempAlarmInstance() { + PgAlarm alarm = new PgAlarm(); + alarm.setActive(1); + alarm.setAlarmtypeid(PgAlarm.ALARM_TYPE_PGRUN); + alarm.setDescription("温度超过高限阈值"); + alarm.setUserid(null); + + // 温度定义为二级报警 + alarm.setAlarm_grade("二级报警"); + + return alarm; + } + + /** + * 生成湿度报警记录 + * @return + */ + public PgAlarm getHumAlarmInstance() { + PgAlarm alarm = new PgAlarm(); + alarm.setActive(1); + alarm.setAlarmtypeid(PgAlarm.ALARM_TYPE_PGRUN); + alarm.setDescription("湿度超过高限阈值"); + alarm.setUserid(null); + + // 湿度报警定义为二级报警 + alarm.setAlarm_grade("二级报警"); + + return alarm; + } } diff --git a/src/com/szpg/plc/message/response/read/ReadCH4ValueCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadCH4ValueCommandResponse.java index c26ffa5..13c5968 100644 --- a/src/com/szpg/plc/message/response/read/ReadCH4ValueCommandResponse.java +++ b/src/com/szpg/plc/message/response/read/ReadCH4ValueCommandResponse.java @@ -4,6 +4,7 @@ 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; @@ -25,6 +26,9 @@ import com.szpg.util.NumberFormat; import com.szpg.util.TimeFormat; +/** + * @author TAN YUE + */ public class ReadCH4ValueCommandResponse extends ReadMemoryCommandResponse { /** @@ -33,10 +37,24 @@ private static final long serialVersionUID = 8081222348890587881L; private final Logger logger = Logger.getLogger(this.getClass().getName()); - - private List jwnd; //甲烷浓度值 - private List jwldbjz; //甲烷联动报警值 - private String[] zcList; //甲烷监测的资产列表,从配置文件中获取 + + /** + * 甲烷浓度值 + */ + private List jwnd; + + /** + * 甲烷联动报警值 + */ + private List jwldbjz; + + /** + * 甲烷监测的资产列表,从配置文件中获取 + */ + private String[] zcList; + + private boolean CH4_ON_FJ = false; + private long CLASS_YELLOW_ALARM_INTERVAL = 360 * 60 * 1000L; public ReadCH4ValueCommandResponse() { jwnd = new ArrayList(); @@ -74,94 +92,108 @@ 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) { - ch4Dao.addPblzRecord(jwnd.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), deviceId); - - // (一)如果有报警则立即推送 - // 判断是否超过报警阈值 + // 1 取出报警规则 PgAlarmRule rule = ruleDao.findRuleByDevice(deviceId); + + // 默认的报警阈值 + double high = 0.0; if (null != rule) { - double high = 0.0; try { high = NumberFormat.parseDouble(rule.getHighvalue(), "0.00"); } catch (Exception ex) { logger.error(ex); ex.printStackTrace(); } - - // 甲烷浓度超过高限阈值 - if (high > 0.0001 && value > high) { - PgAlarm alarm = new PgAlarm(); - alarm.setActive(1); - alarm.setAlarm_date(this.getTime().getTime()); - alarm.setAlarm_value(NumberFormat.format(value, "0.00")); - alarm.setAlarmdevid(deviceId); - alarm.setAlarmtypeid(PgAlarm.ALARM_TYPE_PGRUN); - alarm.setDescription("甲烷浓度超过高限阈值"); - alarm.setUserid(null); - // 甲烷报警定义为二级报警 - alarm.setAlarm_grade("二级报警"); - - alarmDao.insertAlarmRecord(alarm); - deviceDao.updateDeviceStatus(deviceId, "甲烷浓度过高"); - - // 将报警日志推送至市级平台 - 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); - - // 将报警值推送至市级平台 - String jwResp = DataPushInterface.addCH4Data(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); - logger.info("同步甲烷浓度值结果:" + jwResp); + } - // 自动打开当前舱段的排风机,手动关闭风机 - // 首先找到当前舱段的排风机资产编号 - if (Boolean.valueOf(Configure.getProperty("sys", "CH4_ON_FJ", "false")) == true) { - String acucode = zcbh.substring(0, zcbh.indexOf(".", 6)); - String cabin = zcbh.substring(zcbh.lastIndexOf(".") + 1, zcbh.lastIndexOf(".") + 2); - List fjs = deviceDao.findDeviceByPositionAndType(acucode, "F", cabin); - if (null != fjs && fjs.isEmpty() == false) { - String baseURL = Configure.getProperty("sys", "PGDSC_API_URL"); - for (PgDevice fj : fjs) { - String fjzcbh = fj.getAssetcode(); + // 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(); - // 调用远程接口启动风机 - HttpRequest.sendGet(baseURL + "remote/turnOnFj.action", "zcbh=" + fjzcbh); - } - } + // 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; } } - } - - // (二)如果监测值有变化则推送 - // 判断甲烷浓度值是否有变化 - double lastValue = ch4Dao.findLastValueByDevice(deviceId); - if (Math.abs(value - lastValue) > 0.01) { - // 将监测值推送至市级平台 + + // 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); - } - - // (三)如果监测值有变化则推送 - // 每天小时各推送一个数据 - int minute = Calendar.getInstance().get(Calendar.MINUTE); - if (minute < 10) { - // 将监测值推送至市级平台 - 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 + "]"); diff --git a/src/com/szpg/plc/message/response/read/ReadCOValueCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadCOValueCommandResponse.java index 1920b62..0b27d03 100644 --- a/src/com/szpg/plc/message/response/read/ReadCOValueCommandResponse.java +++ b/src/com/szpg/plc/message/response/read/ReadCOValueCommandResponse.java @@ -4,6 +4,8 @@ import java.util.Calendar; import java.util.List; +import com.szpg.db.data.PgCO; +import com.szpg.util.*; import org.apache.commons.lang3.StringUtils; import org.apache.log4j.Logger; @@ -18,11 +20,10 @@ import com.szpg.db.data.PgAlarm; import com.szpg.db.data.PgAlarmRule; import com.szpg.plc.message.response.ReadMemoryCommandResponse; -import com.szpg.util.Configure; -import com.szpg.util.DataPushInterface; -import com.szpg.util.NumberFormat; -import com.szpg.util.TimeFormat; +/** + * @author TAN YUE + */ public class ReadCOValueCommandResponse extends ReadMemoryCommandResponse { /** @@ -31,10 +32,24 @@ private static final long serialVersionUID = -6176747812714170040L; private final Logger logger = Logger.getLogger(this.getClass().getName()); - - private List cond; //一氧化碳浓度值 - private List coldbjz; //一氧化碳联动报警值 - private String[] zcList; //一氧化碳监测的资产列表,从配置文件中获取 + + /** + * 一氧化碳浓度值 + */ + private List cond; + + /** + * 一氧化碳联动报警值 + */ + private List coldbjz; + + /** + * 一氧化碳监测的资产列表,从配置文件中获取 + */ + private String[] zcList; + + private boolean CO_ON_FJ = false; + private long CLASS_RED_ALARM_INTERVAL = 60 * 60 * 1000L; public ReadCOValueCommandResponse() { cond = new ArrayList(); @@ -72,80 +87,108 @@ 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 = cond.get(i); - + int deviceId = deviceDao.findDeviceIdByCode(zcbh); if (deviceId > 0) { - coDao.addPblzRecord(cond.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), deviceId); - - // (一)如果有报警则立即推送 - // 判断是否超过报警阈值 + // 1 取出报警规则 PgAlarmRule rule = ruleDao.findRuleByDevice(deviceId); + + // 默认的报警阈值 + double high = 0.0; if (null != rule) { - double high = 0.0; try { high = NumberFormat.parseDouble(rule.getHighvalue(), "0.00"); } catch (Exception ex) { logger.error(ex); ex.printStackTrace(); } - - // 一氧化碳浓度超过高限阈值 - if (high > 0.0001 && value > high) { - PgAlarm alarm = new PgAlarm(); - alarm.setActive(1); - alarm.setAlarm_date(this.getTime().getTime()); - alarm.setAlarm_value(NumberFormat.format(value, "0.00")); - alarm.setAlarmdevid(deviceId); - alarm.setAlarmtypeid(PgAlarm.ALARM_TYPE_PGRUN); - alarm.setDescription("一氧化碳浓度超过高限阈值"); - alarm.setUserid(null); - // 一氧化碳报警定义为一级报警 - alarm.setAlarm_grade("一级报警"); - - alarmDao.insertAlarmRecord(alarm); - deviceDao.updateDeviceStatus(deviceId, "一氧化碳浓度过高"); - - // 将报警日志推送至市级平台 - 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.addCOAlarmData(bjbh, zcbh, bjms, bjsj); - logger.info("同步一氧化碳报警记录日志结果:" + jwbjResp); - - // 将报警值推送至市级平台 - String jwResp = DataPushInterface.addCOData(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); - logger.info("同步一氧化碳浓度值结果:" + jwResp); + } - // 一氧化碳不需要联动控制风机 + // 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_RED_ALARM_INTERVAL) { + continue; + } } - } - - - // (二)如果监测值有变化则推送 - // 判断一氧化碳浓度值是否有变化 - double lastValue = coDao.findLastValueByDevice(deviceId); - if (Math.abs(value - lastValue) > 0.01) { - // 将监测值推送至市级平台 + + // 2.5 插入监测数值 + coDao.addPblzRecord(value, TimeFormat.formatTimestamp(this.getTime().getTime()), deviceId); + + // 2.6 推送给市管廊公司平台 String coResp = DataPushInterface.addCOData(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); logger.info("同步一氧化碳浓度值结果:" + coResp); - } - - // (三)如果监测值有变化则推送 - // 每天小时各推送一个数据 - int minute = Calendar.getInstance().get(Calendar.MINUTE); - if (minute < 10) { - // 将监测值推送至市级平台 - String coResp = DataPushInterface.addCOData(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); - logger.info("同步一氧化碳浓度值结果:" + coResp); + + // 2.7 生成报警记录 + PgAlarm alarm = new PgAlarm().getCOAlarmInstance(); + + 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.addCOAlarmData(bjbh, zcbh, bjms, bjsj); + logger.info("同步一氧化碳报警记录日志结果:" + jwbjResp); + + // 2.10 联动打开风机 + // 自动打开当前舱段的排风机,手动关闭风机 + // 首先找到当前舱段的排风机资产编号 + if (CO_ON_FJ == true) { + String baseURL = Configure.getProperty("sys", "PGDSC_API_URL"); + HttpRequest.sendGet(baseURL + "remote/turnOnFjReactAlarm.action", "zcbh=" + zcbh); + } + } else { + // 3 不需要报警,只处理监测值 + // 3.1 取出上一个监测值 + PgCO lastRec = coDao.findLastRecordByDevice(deviceId); + + // 3.2 计算数值的时间间隔 + long valueTimeInterval = this.getTime().getTimeInMillis() - lastRec.getUptime().getTime(); + + // 3.3 判断条件:是否与原值相同且相距在一小时以内 + if (Math.abs(value - lastRec.getCo()) > 0.01 || valueTimeInterval > CLASS_RED_ALARM_INTERVAL) { + // 3.4 将数据存入数据库 + coDao.addPblzRecord(value, TimeFormat.formatTimestamp(this.getTime().getTime()), deviceId); + + // 3.5 推送给市管廊公司平台 + String coResp = DataPushInterface.addCOData(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步一氧化碳浓度值结果:" + coResp); + } } } else { logger.warn("未找到资产[" + zcbh + "]"); diff --git a/src/com/szpg/db/dao/PgAlarmDao.java b/src/com/szpg/db/dao/PgAlarmDao.java index 11d8a1d..4ab98d4 100644 --- a/src/com/szpg/db/dao/PgAlarmDao.java +++ b/src/com/szpg/db/dao/PgAlarmDao.java @@ -6,6 +6,7 @@ public int findAlarmCountByDate(String date); public PgAlarm findLatestAlarmByDevice(int deviceId); + public PgAlarm findLatestAlarmByDeviceAndType(int deviceId, String type); public long insertAlarmRecord(PgAlarm alarmRecord); } diff --git a/src/com/szpg/db/dao/PgCODao.java b/src/com/szpg/db/dao/PgCODao.java index 1664f51..5098321 100644 --- a/src/com/szpg/db/dao/PgCODao.java +++ b/src/com/szpg/db/dao/PgCODao.java @@ -20,6 +20,7 @@ public List findPblzByDeviceAndTm(Integer deviceid, String start, String end); public double findLastValueByDevice(Integer deviceid); + public PgCO findLastRecordByDevice(Integer id); public int addPblzRecord(PgCO ch4); public int addPblzRecord(float value, String tm, int deviceid); diff --git a/src/com/szpg/db/dao/PgCh4Dao.java b/src/com/szpg/db/dao/PgCh4Dao.java index e23b964..61fdfcd 100644 --- a/src/com/szpg/db/dao/PgCh4Dao.java +++ b/src/com/szpg/db/dao/PgCh4Dao.java @@ -20,6 +20,7 @@ public List findPblzByDeviceAndTm(Integer deviceid, String start, String end); public double findLastValueByDevice(Integer deviceid); + public PgCh4 findLastRecordByDevice(Integer deviceid); public int addPblzRecord(PgCh4 ch4); public int addPblzRecord(float value, String tm, int deviceid); diff --git a/src/com/szpg/db/dao/PgHSDao.java b/src/com/szpg/db/dao/PgHSDao.java index f89b044..0f0ee53 100644 --- a/src/com/szpg/db/dao/PgHSDao.java +++ b/src/com/szpg/db/dao/PgHSDao.java @@ -20,6 +20,7 @@ public List findPblzByDeviceAndTm(Integer deviceid, String start, String end); public double findLastValueByDevice(Integer deviceid); + public PgSH findLastRecordByDevice(Integer deviceid); public int addPblzRecord(PgSH hs); public int addPblzRecord(float value, String tm, int deviceid); diff --git a/src/com/szpg/db/dao/PgO2Dao.java b/src/com/szpg/db/dao/PgO2Dao.java index 0b3d0bf..678adab 100644 --- a/src/com/szpg/db/dao/PgO2Dao.java +++ b/src/com/szpg/db/dao/PgO2Dao.java @@ -20,6 +20,7 @@ public List findPblzByDeviceAndTm(Integer deviceid, String start, String end); public double findLastValueByDevice(Integer deviceid); + public PgO2 findLastRecordByDevice(Integer deviceid); public int addPblzRecord(PgO2 ch4); public int addPblzRecord(float value, String tm, int deviceid); diff --git a/src/com/szpg/db/dao/PgWsDao.java b/src/com/szpg/db/dao/PgWsDao.java index 370a83f..bfd0eed 100644 --- a/src/com/szpg/db/dao/PgWsDao.java +++ b/src/com/szpg/db/dao/PgWsDao.java @@ -21,6 +21,7 @@ public double findLastTempByDevice(Integer deviceid); public double findLastHumByDevice(Integer deviceid); + public PgTemphum findLastRecordByDevice(Integer deviceid); public int addWsdzRecord(PgTemphum wsdz); public int addWsdzRecord(float temp, float hum, String tm, int deviceid); diff --git a/src/com/szpg/db/dao/impl/PgAlarmDaoImpl.java b/src/com/szpg/db/dao/impl/PgAlarmDaoImpl.java index cedf5fc..ce9ee0f 100644 --- a/src/com/szpg/db/dao/impl/PgAlarmDaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgAlarmDaoImpl.java @@ -8,7 +8,6 @@ import org.apache.commons.dbutils.DbUtils; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.handlers.ArrayListHandler; -import org.apache.commons.dbutils.handlers.BeanListHandler; import org.apache.commons.dbutils.handlers.ScalarHandler; import org.apache.log4j.Logger; @@ -17,6 +16,9 @@ import com.szpg.db.util.ConnectionManager; import com.szpg.util.TimeFormat; +/** + * @author TAN YUE + */ public class PgAlarmDaoImpl implements PgAlarmDao { private final Logger logger = Logger.getLogger(this.getClass().getName()); @@ -33,7 +35,7 @@ QueryRunner runner = new QueryRunner(); param[0] = date; - int count = ((Number) runner.query(conn, sql, new ScalarHandler(1), param)).intValue(); + int count = (runner.query(conn, sql, new ScalarHandler(1), param)).intValue(); return count; } catch (Exception ex) { logger.error("根据日期查询报警记录数异常", ex); @@ -51,7 +53,7 @@ public PgAlarm findLatestAlarmByDevice(int deviceId) { Connection conn = null; String queryStr = "SELECT A.* FROM " + - "(SELECT ID, ACTIVE, ALARM_DATE, ALARM_VALUE, DESCRIPTION, ALARMDEVID, ALARMTYPEID, ALARM_GRADE FROM PG_ALARM WHERE ALARMDEVID = ? ORDER BY ALARM_DATE DESC) A " + + "(SELECT ID, ACTIVE, ALARM_DATE, ALARM_VALUE, DESCRIPTION, ALARMDEVID, ALARMTYPEID, ALARM_GRADE, LOG_TIME, LOG_DESC FROM PG_ALARM WHERE ALARMDEVID = ? ORDER BY ALARM_DATE DESC) A " + "WHERE ROWNUM <= 1"; Object[] param = new Object[1]; try { @@ -60,7 +62,7 @@ QueryRunner runner = new QueryRunner(); param[0] = deviceId; - List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler(), param); + List tempList = runner.query(conn, queryStr, new ArrayListHandler(), param); if (null != tempList && tempList.isEmpty() == false) { PgAlarm alarm = new PgAlarm(); Object[] item = tempList.get(0); @@ -79,6 +81,74 @@ alarm.setAlarmtypeid(((Number) item[6]).intValue()); alarm.setAlarm_grade((String) item[7]); + if (null != item[8]) { + long logTmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[8]).toJdbc()).getTime(); + Calendar logCal = Calendar.getInstance(); + logCal.setTimeInMillis(logTmValue); + alarm.setLog_time(logCal.getTime()); + } else { + alarm.setLog_time(null); + } + + alarm.setLog_desc((String) item[9]); + + logger.debug("根据设备查询最新报警记录成功"); + + return alarm; + } else { + return null; + } + } catch (Exception ex) { + logger.error("根据设备查询最新报警记录成功", ex); + return null; + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + } + + @Override + public PgAlarm findLatestAlarmByDeviceAndType(int deviceId, String type) { + Connection conn = null; + String queryStr = "SELECT A.* FROM " + + "(SELECT ID, ACTIVE, ALARM_DATE, ALARM_VALUE, DESCRIPTION, ALARMDEVID, ALARMTYPEID, ALARM_GRADE, LOG_TIME, LOG_DESC FROM PG_ALARM WHERE ALARMDEVID = ? AND DESCRIPTION LIKE ? ORDER BY ALARM_DATE DESC) A " + + "WHERE ROWNUM <= 1"; + Object[] param = new Object[2]; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + QueryRunner runner = new QueryRunner(); + param[0] = deviceId; + param[1] = "%" + type + "%"; + + List tempList = runner.query(conn, queryStr, new ArrayListHandler(), param); + if (null != tempList && tempList.isEmpty() == false) { + PgAlarm alarm = new PgAlarm(); + Object[] item = tempList.get(0); + + alarm.setId(((Number) item[0]).intValue()); + alarm.setActive(((Number) item[1]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + alarm.setAlarm_date(cal.getTime()); + + alarm.setAlarm_value((String) item[3]); + alarm.setDescription((String) item[4]); + alarm.setAlarmdevid(((Number) item[5]).intValue()); + alarm.setAlarmtypeid(((Number) item[6]).intValue()); + alarm.setAlarm_grade((String) item[7]); + + long logTmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[8]).toJdbc()).getTime(); + Calendar logCal = Calendar.getInstance(); + logCal.setTimeInMillis(logTmValue); + alarm.setLog_time(logCal.getTime()); + alarm.setLog_desc((String) item[9]); + logger.debug("根据设备查询最新报警记录成功"); return alarm; @@ -111,28 +181,31 @@ QueryRunner runner = new QueryRunner(); // 查询同一设备是否有正在报警的消息 - Number id = (Number) runner.query(conn, querySql, new ScalarHandler(1), queryParam); + Number id = runner.query(conn, querySql, new ScalarHandler(1), queryParam); if (null != id) { // 找到设备已存在的记录 // 1先将正在报警的设备自动消警 - String updateSql = "UPDATE PG_ALARM SET ACTIVE=0 WHERE ID=?"; + String updateSql = "UPDATE PG_ALARM SET ACTIVE=0, LOG_TIME=SYSDATE, LOG_DESC=? WHERE ID=?"; - Object[] updateParam = new Object[1]; - updateParam[0] = id.longValue(); - - runner.update(conn, updateSql, updateParam); // 更新报警记录 - } + Object[] updateParam = new Object[2]; + updateParam[0] = "重复报警自动消警"; + updateParam[1] = id.longValue(); + + // 更新报警记录 + runner.update(conn, updateSql, updateParam); + } // 插入新的报警记录 String insertSql = "INSERT INTO PG_ALARM " + - "(ID, ACTIVE, ALARM_DATE, ALARM_VALUE, DESCRIPTION, ALARMDEVID, ALARMTYPEID, USERID, ALARM_GRADE) " + - "VALUES (?, ?, TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), ?, ?, ?, ?, ?, ?)"; + "(ID, ACTIVE, ALARM_DATE, ALARM_VALUE, DESCRIPTION, ALARMDEVID, ALARMTYPEID, USERID, ALARM_GRADE, LOG_TIME, LOG_DESC) " + + "VALUES (?, ?, TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), ?, ?, ?, ?, ?, ?, TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), ?)"; String sqlId = "SELECT SEQ_PG_ALARM_ID.NEXTVAL FROM DUAL"; - long newId = ((Number) runner.query(conn, sqlId, new ScalarHandler(1))).longValue(); // 获取新的id - - Object[] params = new Object[9]; + // 获取新的id + long newId = (runner.query(conn, sqlId, new ScalarHandler(1))).longValue(); + + Object[] params = new Object[11]; params[0] = newId; params[1] = alarmRecord.getActive(); @@ -143,8 +216,11 @@ params[6] = alarmRecord.getAlarmtypeid(); params[7] = alarmRecord.getUserid(); params[8] = alarmRecord.getAlarm_grade(); - - int count = runner.update(conn, insertSql, params); // 新增主表 + params[9] = TimeFormat.formatTimestamp(alarmRecord.getLog_time()); + params[10] = alarmRecord.getLog_desc(); + + // 新增报警记录 + int count = runner.update(conn, insertSql, params); if (count > 0) { logger.debug("插入报警数据成功"); diff --git a/src/com/szpg/db/dao/impl/PgCODaoImpl.java b/src/com/szpg/db/dao/impl/PgCODaoImpl.java index 186ac16..70d672c 100644 --- a/src/com/szpg/db/dao/impl/PgCODaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgCODaoImpl.java @@ -292,6 +292,51 @@ } @Override + public PgCO findLastRecordByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT ID, CO, LOGTIME, PGDEVICEID FROM (SELECT * FROM PG_CO WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, sql, new ArrayListHandler(), param); + if (null != tempList && tempList.size() == 1) { + PgCO co = new PgCO(); + Object[] item = tempList.get(0); + + co.setId(((Number) item[0]).intValue()); + co.setCo(Float.parseFloat((String) item[1])); + co.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + co.setLogtime(cal.getTime()); + co.setUptime(cal.getTime()); + + logger.debug("根据设备ID查询最新一氧化碳监测记录成功" + co + "]"); + + return co; + } else { + return null; + } + } catch (Exception ex) { + logger.error("根据设备ID查询最新一氧化碳监测记录异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override public int addPblzRecord(PgCO co) { return addPblzRecord(co.getCo(), co.getTmStr(), co.getPgdeviceid()); } diff --git a/src/com/szpg/db/dao/impl/PgCh4DaoImpl.java b/src/com/szpg/db/dao/impl/PgCh4DaoImpl.java index 0ed139e..768b6a5 100644 --- a/src/com/szpg/db/dao/impl/PgCh4DaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgCh4DaoImpl.java @@ -54,9 +54,9 @@ list.add(ch4); } return list; - } - else + } else { return null; + } } catch (Exception ex) { logger.error("查询所有甲烷监测值异常", ex); } finally { @@ -100,9 +100,9 @@ logger.debug("根据ID查询甲烷监测值成功" + ch4 + "]"); return ch4; - } - else + } else { return null; + } } catch (Exception ex) { logger.error("根据ID查询甲烷监测值异常", ex); } finally { @@ -149,9 +149,9 @@ logger.debug("根据设备ID查询最新的甲烷监测值成功" + ch4 + "]"); return ch4; - } - else + } else { return null; + } } catch (Exception ex) { logger.error("根据设备ID查询最新的甲烷监测值异常", ex); } finally { @@ -199,9 +199,9 @@ list.add(ch4); } return list; - } - else + } else { return null; + } } catch (Exception ex) { logger.error("根据设备ID查询甲烷监测值异常", ex); } finally { @@ -251,9 +251,9 @@ list.add(ch4); } return list; - } - else + } else { return null; + } } catch (Exception ex) { logger.error("根据设备ID和时间查询甲烷监测值异常", ex); } finally { @@ -293,6 +293,51 @@ } @Override + public PgCh4 findLastRecordByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT ID, CH4, LOGTIME, PGDEVICEID FROM (SELECT * FROM PG_CH4 WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, sql, new ArrayListHandler(), param); + if (null != tempList && tempList.size() == 1) { + PgCh4 ch4 = new PgCh4(); + Object[] item = tempList.get(0); + + ch4.setId(((Number) item[0]).intValue()); + ch4.setCh4(Float.parseFloat((String) item[1])); + ch4.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + ch4.setLogtime(cal.getTime()); + ch4.setUptime(cal.getTime()); + + logger.debug("根据设备ID查询最新甲烷监测记录成功" + ch4 + "]"); + + return ch4; + } else { + return null; + } + } catch (Exception ex) { + logger.error("根据设备ID查询最新甲烷监测记录异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override public int addPblzRecord(PgCh4 ch4) { return addPblzRecord(ch4.getCh4(), ch4.getTmStr(), ch4.getPgdeviceid()); } diff --git a/src/com/szpg/db/dao/impl/PgHSDaoImpl.java b/src/com/szpg/db/dao/impl/PgHSDaoImpl.java index 892e175..fa4ea02 100644 --- a/src/com/szpg/db/dao/impl/PgHSDaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgHSDaoImpl.java @@ -292,6 +292,51 @@ } @Override + public PgSH findLastRecordByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT ID, SH, LOGTIME, PGDEVICEID FROM (SELECT * FROM PG_SH WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, sql, new ArrayListHandler(), param); + if (null != tempList && tempList.size() == 1) { + PgSH sh = new PgSH(); + Object[] item = tempList.get(0); + + sh.setId(((Number) item[0]).intValue()); + sh.setSh(Float.parseFloat((String) item[1])); + sh.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + sh.setLogtime(cal.getTime()); + sh.setUptime(cal.getTime()); + + logger.debug("根据设备ID查询最新硫化氢监测记录成功" + sh + "]"); + + return sh; + } else { + return null; + } + } catch (Exception ex) { + logger.error("根据设备ID查询最新硫化氢监测记录异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override public int addPblzRecord(PgSH sh) { return addPblzRecord(sh.getSh(), sh.getTmStr(), sh.getPgdeviceid()); } diff --git a/src/com/szpg/db/dao/impl/PgO2DaoImpl.java b/src/com/szpg/db/dao/impl/PgO2DaoImpl.java index f58f8cd..842291b 100644 --- a/src/com/szpg/db/dao/impl/PgO2DaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgO2DaoImpl.java @@ -54,9 +54,9 @@ list.add(o2); } return list; - } - else + } else { return null; + } } catch (Exception ex) { logger.error("查询所有氧气监测值异常", ex); } finally { @@ -100,9 +100,9 @@ logger.debug("根据ID查询氧气监测值成功" + o2 + "]"); return o2; - } - else + } else { return null; + } } catch (Exception ex) { logger.error("根据ID查询氧气监测值异常", ex); } finally { @@ -148,9 +148,9 @@ logger.debug("根据设备ID查询最新的氧气监测值成功" + o2 + "]"); return o2; - } - else + } else { return null; + } } catch (Exception ex) { logger.error("根据设备ID查询最新的硫化氢监测值异常", ex); } finally { @@ -198,9 +198,9 @@ list.add(o2); } return list; - } - else + } else { return null; + } } catch (Exception ex) { logger.error("根据设备ID查询氧气监测值异常", ex); } finally { @@ -250,9 +250,9 @@ list.add(o2); } return list; - } - else + } else { return null; + } } catch (Exception ex) { logger.error("根据设备ID和时间查询氧气监测值异常", ex); } finally { @@ -292,6 +292,51 @@ } @Override + public PgO2 findLastRecordByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT ID, O2, LOGTIME, PGDEVICEID FROM (SELECT * FROM PG_O2 WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, sql, new ArrayListHandler(), param); + if (null != tempList && tempList.size() == 1) { + PgO2 o2 = new PgO2(); + Object[] item = tempList.get(0); + + o2.setId(((Number) item[0]).intValue()); + o2.setO2(Float.parseFloat((String) item[1])); + o2.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + o2.setLogtime(cal.getTime()); + o2.setUptime(cal.getTime()); + + logger.debug("根据设备ID查询最新氧气监测记录成功" + o2 + "]"); + + return o2; + } else { + return null; + } + } catch (Exception ex) { + logger.error("根据设备ID查询最新氧气监测记录异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override public int addPblzRecord(PgO2 o2) { return addPblzRecord(o2.getO2(), o2.getTmStr(), o2.getPgdeviceid()); } @@ -316,10 +361,11 @@ QueryRunner runner = new QueryRunner(); int count = runner.update(conn, insertStr, params); - if (count > 0) + if (count > 0) { logger.debug("插入氧气监测值成功[tm=" + tm + ", value=" + value + ", deviceid=" + deviceid + "]"); - else + } else { logger.error("插入氧气监测值失败!"); + } return count; } catch (Exception ex) { diff --git a/src/com/szpg/db/dao/impl/PgWsDaoImpl.java b/src/com/szpg/db/dao/impl/PgWsDaoImpl.java index 679b58f..77925f7 100644 --- a/src/com/szpg/db/dao/impl/PgWsDaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgWsDaoImpl.java @@ -323,6 +323,52 @@ } @Override + public PgTemphum findLastRecordByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT ID, TEMP, HUM, LOGTIME, PGDEVICEID FROM (SELECT * FROM PG_TEMPHUM WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, sql, new ArrayListHandler(), param); + if (null != tempList && tempList.size() == 1) { + PgTemphum temphum = new PgTemphum(); + Object[] item = tempList.get(0); + + temphum.setId(((Number) item[0]).intValue()); + temphum.setTemp(Float.parseFloat((String) item[1])); + temphum.setHum(Float.parseFloat((String) item[2])); + temphum.setPgdeviceid(((Number) item[4]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + temphum.setLogtime(cal.getTime()); + temphum.setUptime(cal.getTime()); + + logger.debug("根据设备ID查询最新温湿度监测记录成功" + temphum + "]"); + + return temphum; + } else { + return null; + } + } catch (Exception ex) { + logger.error("根据设备ID查询最新温湿度监测记录异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override public int addWsdzRecord(PgTemphum ws) { return addWsdzRecord(ws.getTemp(), ws.getHum(), ws.getTmStr(), ws.getPgdeviceid()); } diff --git a/src/com/szpg/db/data/PgAlarm.java b/src/com/szpg/db/data/PgAlarm.java index 5a73ba9..4b97e6a 100644 --- a/src/com/szpg/db/data/PgAlarm.java +++ b/src/com/szpg/db/data/PgAlarm.java @@ -1,9 +1,12 @@ package com.szpg.db.data; -import java.util.Date; - import com.szpg.util.TimeFormat; +import java.util.Date; + +/** + * @author TAN YUE + */ public class PgAlarm implements java.io.Serializable { /** @@ -20,11 +23,28 @@ private Integer alarmtypeid; private Integer userid; private String alarm_grade; - - public static Integer ALARM_TYPE_DEVRUN = 1; //管廊设备运行故障 - public static Integer ALARM_TYPE_PGRUN = 2; //管廊运行环境报警 - public static Integer ALARM_TYPE_PGSAF = 3; //管廊安全防范报警 - public static Integer ALARM_TYPE_INPG = 4; //人员入廊超时报警 + private Date log_time; + private String log_desc; + + /** + * 管廊设备运行故障 + */ + public static Integer ALARM_TYPE_DEVRUN = 1; + + /** + * 管廊运行环境报警 + */ + public static Integer ALARM_TYPE_PGRUN = 2; + + /** + * 管廊安全防范报警 + */ + public static Integer ALARM_TYPE_PGSAF = 3; + + /** + * 人员入廊超时报警 + */ + public static Integer ALARM_TYPE_INPG = 4; public Integer getId() { return id; @@ -97,10 +117,130 @@ public void setAlarm_grade(String alarm_grade) { this.alarm_grade = alarm_grade; } + + public Date getLog_time() { + if (null == log_time) { + return alarm_date; + } + return log_time; + } + + public void setLog_time(Date log_time) { + this.log_time = log_time; + } + + public String getLog_desc() { + return log_desc; + } + + public void setLog_desc(String log_desc) { + this.log_desc = log_desc; + } @Override public String toString() { return "PgAlarm[alarmValue=" + alarm_value + ", alarmDate=" + TimeFormat.formatTimestamp(alarm_date) + ", alarmDevId= " + alarmdevid + "]"; } + /** + * 生成氧气报警记录 + * @return + */ + public PgAlarm getO2AlarmInstance() { + PgAlarm alarm = new PgAlarm(); + alarm.setActive(1); + alarm.setAlarmtypeid(PgAlarm.ALARM_TYPE_PGRUN); + alarm.setDescription("氧气浓度低于低限阈值"); + alarm.setUserid(null); + + // 氧气报警定义为一级报警 + alarm.setAlarm_grade("一级报警"); + + return alarm; + } + + /** + * 生成一氧化碳报警记录 + * @return + */ + public PgAlarm getCOAlarmInstance() { + PgAlarm alarm = new PgAlarm(); + alarm.setActive(1); + alarm.setAlarmtypeid(PgAlarm.ALARM_TYPE_PGRUN); + alarm.setDescription("一氧化碳浓度超过高限阈值"); + alarm.setUserid(null); + + // 一氧化碳报警定义为一级报警 + alarm.setAlarm_grade("一级报警"); + + return alarm; + } + + /** + * 生成硫化氢报警记录 + * @return + */ + public PgAlarm getHSAlarmInstance() { + PgAlarm alarm = new PgAlarm(); + alarm.setActive(1); + alarm.setAlarmtypeid(PgAlarm.ALARM_TYPE_PGRUN); + alarm.setDescription("硫化氢浓度超过高限阈值"); + alarm.setUserid(null); + + // 硫化氢报警定义为一级报警 + alarm.setAlarm_grade("一级报警"); + + return alarm; + } + + /** + * 生成甲烷报警记录 + * @return + */ + public PgAlarm getCH4AlarmInstance() { + PgAlarm alarm = new PgAlarm(); + alarm.setActive(1); + alarm.setAlarmtypeid(PgAlarm.ALARM_TYPE_PGRUN); + alarm.setDescription("甲烷浓度超过高限阈值"); + alarm.setUserid(null); + + // 甲烷报警定义为二级报警 + alarm.setAlarm_grade("二级报警"); + + return alarm; + } + + /** + * 生成温度报警记录 + * @return + */ + public PgAlarm getTempAlarmInstance() { + PgAlarm alarm = new PgAlarm(); + alarm.setActive(1); + alarm.setAlarmtypeid(PgAlarm.ALARM_TYPE_PGRUN); + alarm.setDescription("温度超过高限阈值"); + alarm.setUserid(null); + + // 温度定义为二级报警 + alarm.setAlarm_grade("二级报警"); + + return alarm; + } + + /** + * 生成湿度报警记录 + * @return + */ + public PgAlarm getHumAlarmInstance() { + PgAlarm alarm = new PgAlarm(); + alarm.setActive(1); + alarm.setAlarmtypeid(PgAlarm.ALARM_TYPE_PGRUN); + alarm.setDescription("湿度超过高限阈值"); + alarm.setUserid(null); + + // 湿度报警定义为二级报警 + alarm.setAlarm_grade("二级报警"); + + return alarm; + } } diff --git a/src/com/szpg/plc/message/response/read/ReadCH4ValueCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadCH4ValueCommandResponse.java index c26ffa5..13c5968 100644 --- a/src/com/szpg/plc/message/response/read/ReadCH4ValueCommandResponse.java +++ b/src/com/szpg/plc/message/response/read/ReadCH4ValueCommandResponse.java @@ -4,6 +4,7 @@ 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; @@ -25,6 +26,9 @@ import com.szpg.util.NumberFormat; import com.szpg.util.TimeFormat; +/** + * @author TAN YUE + */ public class ReadCH4ValueCommandResponse extends ReadMemoryCommandResponse { /** @@ -33,10 +37,24 @@ private static final long serialVersionUID = 8081222348890587881L; private final Logger logger = Logger.getLogger(this.getClass().getName()); - - private List jwnd; //甲烷浓度值 - private List jwldbjz; //甲烷联动报警值 - private String[] zcList; //甲烷监测的资产列表,从配置文件中获取 + + /** + * 甲烷浓度值 + */ + private List jwnd; + + /** + * 甲烷联动报警值 + */ + private List jwldbjz; + + /** + * 甲烷监测的资产列表,从配置文件中获取 + */ + private String[] zcList; + + private boolean CH4_ON_FJ = false; + private long CLASS_YELLOW_ALARM_INTERVAL = 360 * 60 * 1000L; public ReadCH4ValueCommandResponse() { jwnd = new ArrayList(); @@ -74,94 +92,108 @@ 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) { - ch4Dao.addPblzRecord(jwnd.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), deviceId); - - // (一)如果有报警则立即推送 - // 判断是否超过报警阈值 + // 1 取出报警规则 PgAlarmRule rule = ruleDao.findRuleByDevice(deviceId); + + // 默认的报警阈值 + double high = 0.0; if (null != rule) { - double high = 0.0; try { high = NumberFormat.parseDouble(rule.getHighvalue(), "0.00"); } catch (Exception ex) { logger.error(ex); ex.printStackTrace(); } - - // 甲烷浓度超过高限阈值 - if (high > 0.0001 && value > high) { - PgAlarm alarm = new PgAlarm(); - alarm.setActive(1); - alarm.setAlarm_date(this.getTime().getTime()); - alarm.setAlarm_value(NumberFormat.format(value, "0.00")); - alarm.setAlarmdevid(deviceId); - alarm.setAlarmtypeid(PgAlarm.ALARM_TYPE_PGRUN); - alarm.setDescription("甲烷浓度超过高限阈值"); - alarm.setUserid(null); - // 甲烷报警定义为二级报警 - alarm.setAlarm_grade("二级报警"); - - alarmDao.insertAlarmRecord(alarm); - deviceDao.updateDeviceStatus(deviceId, "甲烷浓度过高"); - - // 将报警日志推送至市级平台 - 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); - - // 将报警值推送至市级平台 - String jwResp = DataPushInterface.addCH4Data(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); - logger.info("同步甲烷浓度值结果:" + jwResp); + } - // 自动打开当前舱段的排风机,手动关闭风机 - // 首先找到当前舱段的排风机资产编号 - if (Boolean.valueOf(Configure.getProperty("sys", "CH4_ON_FJ", "false")) == true) { - String acucode = zcbh.substring(0, zcbh.indexOf(".", 6)); - String cabin = zcbh.substring(zcbh.lastIndexOf(".") + 1, zcbh.lastIndexOf(".") + 2); - List fjs = deviceDao.findDeviceByPositionAndType(acucode, "F", cabin); - if (null != fjs && fjs.isEmpty() == false) { - String baseURL = Configure.getProperty("sys", "PGDSC_API_URL"); - for (PgDevice fj : fjs) { - String fjzcbh = fj.getAssetcode(); + // 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(); - // 调用远程接口启动风机 - HttpRequest.sendGet(baseURL + "remote/turnOnFj.action", "zcbh=" + fjzcbh); - } - } + // 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; } } - } - - // (二)如果监测值有变化则推送 - // 判断甲烷浓度值是否有变化 - double lastValue = ch4Dao.findLastValueByDevice(deviceId); - if (Math.abs(value - lastValue) > 0.01) { - // 将监测值推送至市级平台 + + // 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); - } - - // (三)如果监测值有变化则推送 - // 每天小时各推送一个数据 - int minute = Calendar.getInstance().get(Calendar.MINUTE); - if (minute < 10) { - // 将监测值推送至市级平台 - 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 + "]"); diff --git a/src/com/szpg/plc/message/response/read/ReadCOValueCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadCOValueCommandResponse.java index 1920b62..0b27d03 100644 --- a/src/com/szpg/plc/message/response/read/ReadCOValueCommandResponse.java +++ b/src/com/szpg/plc/message/response/read/ReadCOValueCommandResponse.java @@ -4,6 +4,8 @@ import java.util.Calendar; import java.util.List; +import com.szpg.db.data.PgCO; +import com.szpg.util.*; import org.apache.commons.lang3.StringUtils; import org.apache.log4j.Logger; @@ -18,11 +20,10 @@ import com.szpg.db.data.PgAlarm; import com.szpg.db.data.PgAlarmRule; import com.szpg.plc.message.response.ReadMemoryCommandResponse; -import com.szpg.util.Configure; -import com.szpg.util.DataPushInterface; -import com.szpg.util.NumberFormat; -import com.szpg.util.TimeFormat; +/** + * @author TAN YUE + */ public class ReadCOValueCommandResponse extends ReadMemoryCommandResponse { /** @@ -31,10 +32,24 @@ private static final long serialVersionUID = -6176747812714170040L; private final Logger logger = Logger.getLogger(this.getClass().getName()); - - private List cond; //一氧化碳浓度值 - private List coldbjz; //一氧化碳联动报警值 - private String[] zcList; //一氧化碳监测的资产列表,从配置文件中获取 + + /** + * 一氧化碳浓度值 + */ + private List cond; + + /** + * 一氧化碳联动报警值 + */ + private List coldbjz; + + /** + * 一氧化碳监测的资产列表,从配置文件中获取 + */ + private String[] zcList; + + private boolean CO_ON_FJ = false; + private long CLASS_RED_ALARM_INTERVAL = 60 * 60 * 1000L; public ReadCOValueCommandResponse() { cond = new ArrayList(); @@ -72,80 +87,108 @@ 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 = cond.get(i); - + int deviceId = deviceDao.findDeviceIdByCode(zcbh); if (deviceId > 0) { - coDao.addPblzRecord(cond.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), deviceId); - - // (一)如果有报警则立即推送 - // 判断是否超过报警阈值 + // 1 取出报警规则 PgAlarmRule rule = ruleDao.findRuleByDevice(deviceId); + + // 默认的报警阈值 + double high = 0.0; if (null != rule) { - double high = 0.0; try { high = NumberFormat.parseDouble(rule.getHighvalue(), "0.00"); } catch (Exception ex) { logger.error(ex); ex.printStackTrace(); } - - // 一氧化碳浓度超过高限阈值 - if (high > 0.0001 && value > high) { - PgAlarm alarm = new PgAlarm(); - alarm.setActive(1); - alarm.setAlarm_date(this.getTime().getTime()); - alarm.setAlarm_value(NumberFormat.format(value, "0.00")); - alarm.setAlarmdevid(deviceId); - alarm.setAlarmtypeid(PgAlarm.ALARM_TYPE_PGRUN); - alarm.setDescription("一氧化碳浓度超过高限阈值"); - alarm.setUserid(null); - // 一氧化碳报警定义为一级报警 - alarm.setAlarm_grade("一级报警"); - - alarmDao.insertAlarmRecord(alarm); - deviceDao.updateDeviceStatus(deviceId, "一氧化碳浓度过高"); - - // 将报警日志推送至市级平台 - 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.addCOAlarmData(bjbh, zcbh, bjms, bjsj); - logger.info("同步一氧化碳报警记录日志结果:" + jwbjResp); - - // 将报警值推送至市级平台 - String jwResp = DataPushInterface.addCOData(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); - logger.info("同步一氧化碳浓度值结果:" + jwResp); + } - // 一氧化碳不需要联动控制风机 + // 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_RED_ALARM_INTERVAL) { + continue; + } } - } - - - // (二)如果监测值有变化则推送 - // 判断一氧化碳浓度值是否有变化 - double lastValue = coDao.findLastValueByDevice(deviceId); - if (Math.abs(value - lastValue) > 0.01) { - // 将监测值推送至市级平台 + + // 2.5 插入监测数值 + coDao.addPblzRecord(value, TimeFormat.formatTimestamp(this.getTime().getTime()), deviceId); + + // 2.6 推送给市管廊公司平台 String coResp = DataPushInterface.addCOData(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); logger.info("同步一氧化碳浓度值结果:" + coResp); - } - - // (三)如果监测值有变化则推送 - // 每天小时各推送一个数据 - int minute = Calendar.getInstance().get(Calendar.MINUTE); - if (minute < 10) { - // 将监测值推送至市级平台 - String coResp = DataPushInterface.addCOData(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); - logger.info("同步一氧化碳浓度值结果:" + coResp); + + // 2.7 生成报警记录 + PgAlarm alarm = new PgAlarm().getCOAlarmInstance(); + + 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.addCOAlarmData(bjbh, zcbh, bjms, bjsj); + logger.info("同步一氧化碳报警记录日志结果:" + jwbjResp); + + // 2.10 联动打开风机 + // 自动打开当前舱段的排风机,手动关闭风机 + // 首先找到当前舱段的排风机资产编号 + if (CO_ON_FJ == true) { + String baseURL = Configure.getProperty("sys", "PGDSC_API_URL"); + HttpRequest.sendGet(baseURL + "remote/turnOnFjReactAlarm.action", "zcbh=" + zcbh); + } + } else { + // 3 不需要报警,只处理监测值 + // 3.1 取出上一个监测值 + PgCO lastRec = coDao.findLastRecordByDevice(deviceId); + + // 3.2 计算数值的时间间隔 + long valueTimeInterval = this.getTime().getTimeInMillis() - lastRec.getUptime().getTime(); + + // 3.3 判断条件:是否与原值相同且相距在一小时以内 + if (Math.abs(value - lastRec.getCo()) > 0.01 || valueTimeInterval > CLASS_RED_ALARM_INTERVAL) { + // 3.4 将数据存入数据库 + coDao.addPblzRecord(value, TimeFormat.formatTimestamp(this.getTime().getTime()), deviceId); + + // 3.5 推送给市管廊公司平台 + String coResp = DataPushInterface.addCOData(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步一氧化碳浓度值结果:" + coResp); + } } } else { logger.warn("未找到资产[" + zcbh + "]"); diff --git a/src/com/szpg/plc/message/response/read/ReadHSValueCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadHSValueCommandResponse.java index 3b8f2f6..1980827 100644 --- a/src/com/szpg/plc/message/response/read/ReadHSValueCommandResponse.java +++ b/src/com/szpg/plc/message/response/read/ReadHSValueCommandResponse.java @@ -4,6 +4,7 @@ import java.util.Calendar; import java.util.List; +import com.szpg.db.data.PgSH; import org.apache.commons.lang3.StringUtils; import org.apache.log4j.Logger; @@ -25,6 +26,9 @@ import com.szpg.util.NumberFormat; import com.szpg.util.TimeFormat; +/** + * @author TAN YUE + */ public class ReadHSValueCommandResponse extends ReadMemoryCommandResponse { /** @@ -33,10 +37,24 @@ private static final long serialVersionUID = -3864512113984510244L; private final Logger logger = Logger.getLogger(this.getClass().getName()); - - private List hsnd; //硫化氢浓度值 - private List hsldbjz; //硫化氢联动报警值 - private String[] zcList; // 监测设备资产列表,从配置文件中获取 + + /** + * 硫化氢浓度值 + */ + private List hsnd; + + /** + * 硫化氢联动报警值 + */ + private List hsldbjz; + + /** + * 监测设备资产列表,从配置文件中获取 + */ + private String[] zcList; + + private boolean HS_ON_FJ = false; + private long CLASS_RED_ALARM_INTERVAL = 60 * 60 * 1000L; public ReadHSValueCommandResponse() { hsnd = new ArrayList(); @@ -74,94 +92,108 @@ 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 = hsnd.get(i); - + int deviceId = deviceDao.findDeviceIdByCode(zcbh); if (deviceId > 0) { - hsDao.addPblzRecord(hsnd.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), deviceId); - - // (一)如果有报警则立即推送 - // 判断是否超过报警阈值 + // 1 取出报警规则 PgAlarmRule rule = ruleDao.findRuleByDevice(deviceId); + + // 默认的报警阈值 + double high = 0.0; if (null != rule) { - double high = 0.0; try { high = NumberFormat.parseDouble(rule.getHighvalue(), "0.00"); } catch (Exception ex) { logger.error(ex); ex.printStackTrace(); } - - // 一氧化碳浓度超过高限阈值 - if (high > 0.0001 && value > high) { - PgAlarm alarm = new PgAlarm(); - alarm.setActive(1); - alarm.setAlarm_date(this.getTime().getTime()); - alarm.setAlarm_value(NumberFormat.format(value, "0.00")); - alarm.setAlarmdevid(deviceId); - alarm.setAlarmtypeid(PgAlarm.ALARM_TYPE_PGRUN); - alarm.setDescription("硫化氢浓度超过高限阈值"); - alarm.setUserid(null); - // 硫化氢报警定义为一级报警 - alarm.setAlarm_grade("一级报警"); - - alarmDao.insertAlarmRecord(alarm); - deviceDao.updateDeviceStatus(deviceId, "硫化氢浓度过高"); - - // 将报警日志推送至市级平台 - 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.addHSAlarmData(bjbh, zcbh, bjms, bjsj); - logger.info("同步硫化氢报警记录日志结果:" + jwbjResp); - - // 将报警值推送至市级平台 - String jwResp = DataPushInterface.addHSData(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); - logger.info("同步硫化氢浓度值结果:" + jwResp); - - // 自动打开当前舱段的排风机,手动关闭风机 - // 首先找到当前舱段的排风机资产编号 - if (Boolean.valueOf(Configure.getProperty("sys", "HS_ON_FJ", "false")) == true) { - String acucode = zcbh.substring(0, zcbh.indexOf(".", 6)); - String cabin = zcbh.substring(zcbh.lastIndexOf(".") + 1, zcbh.lastIndexOf(".") + 2); - List fjs = deviceDao.findDeviceByPositionAndType(acucode, "F", cabin); - if (null != fjs && fjs.isEmpty() == false) { - String baseURL = Configure.getProperty("sys", "PGDSC_API_URL"); - for (PgDevice fj : fjs) { - String fjzcbh = fj.getAssetcode(); + } - // 调用远程接口启动风机 - HttpRequest.sendGet(baseURL + "remote/turnOnFj.action", "zcbh=" + fjzcbh); - } - } + // 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_RED_ALARM_INTERVAL) { + continue; } } - } - - // (二)如果监测值有变化则推送 - // 判断硫化氢浓度值是否有变化 - double lastValue = hsDao.findLastValueByDevice(deviceId); - if (Math.abs(value - lastValue) > 0.01) { - // 将监测值推送至市级平台 - String coResp = DataPushInterface.addHSData(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); - logger.info("同步硫化氢浓度值结果:" + coResp); - } - - // (三)如果监测值没有变化 - // 每天小时各推送一个数据 - int minute = Calendar.getInstance().get(Calendar.MINUTE); - if (minute < 10) { - // 将监测值推送至市级平台 - String coResp = DataPushInterface.addHSData(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); - logger.info("同步硫化氢浓度值结果:" + coResp); + + // 2.5 插入监测数值 + hsDao.addPblzRecord(value, TimeFormat.formatTimestamp(this.getTime().getTime()), deviceId); + + // 2.6 推送给市管廊公司平台 + String hsResp = DataPushInterface.addHSData(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步硫化氢浓度值结果:" + hsResp); + + // 2.7 生成报警记录 + PgAlarm alarm = new PgAlarm().getHSAlarmInstance(); + + 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 hsbjResp = DataPushInterface.addHSAlarmData(bjbh, zcbh, bjms, bjsj); + logger.info("同步硫化氢报警记录日志结果:" + hsbjResp); + + // 2.10 联动打开风机 + // 自动打开当前舱段的排风机,手动关闭风机 + // 首先找到当前舱段的排风机资产编号 + if (HS_ON_FJ == true) { + String baseURL = Configure.getProperty("sys", "PGDSC_API_URL"); + HttpRequest.sendGet(baseURL + "remote/turnOnFjReactAlarm.action", "zcbh=" + zcbh); + } + } else { + // 3 不需要报警,只处理监测值 + // 3.1 取出上一个监测值 + PgSH lastRec = hsDao.findLastRecordByDevice(deviceId); + + // 3.2 计算数值的时间间隔 + long valueTimeInterval = this.getTime().getTimeInMillis() - lastRec.getUptime().getTime(); + + // 3.3 判断条件:是否与原值相同且相距在一小时以内 + if (Math.abs(value - lastRec.getSh()) > 0.01 || valueTimeInterval > CLASS_RED_ALARM_INTERVAL) { + // 3.4 将数据存入数据库 + hsDao.addPblzRecord(value, TimeFormat.formatTimestamp(this.getTime().getTime()), deviceId); + + // 3.5 推送给市管廊公司平台 + String hsResp = DataPushInterface.addHSData(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步硫化氢浓度值结果:" + hsResp); + } } } else { logger.warn("未找到资产[" + zcbh + "]"); diff --git a/src/com/szpg/db/dao/PgAlarmDao.java b/src/com/szpg/db/dao/PgAlarmDao.java index 11d8a1d..4ab98d4 100644 --- a/src/com/szpg/db/dao/PgAlarmDao.java +++ b/src/com/szpg/db/dao/PgAlarmDao.java @@ -6,6 +6,7 @@ public int findAlarmCountByDate(String date); public PgAlarm findLatestAlarmByDevice(int deviceId); + public PgAlarm findLatestAlarmByDeviceAndType(int deviceId, String type); public long insertAlarmRecord(PgAlarm alarmRecord); } diff --git a/src/com/szpg/db/dao/PgCODao.java b/src/com/szpg/db/dao/PgCODao.java index 1664f51..5098321 100644 --- a/src/com/szpg/db/dao/PgCODao.java +++ b/src/com/szpg/db/dao/PgCODao.java @@ -20,6 +20,7 @@ public List findPblzByDeviceAndTm(Integer deviceid, String start, String end); public double findLastValueByDevice(Integer deviceid); + public PgCO findLastRecordByDevice(Integer id); public int addPblzRecord(PgCO ch4); public int addPblzRecord(float value, String tm, int deviceid); diff --git a/src/com/szpg/db/dao/PgCh4Dao.java b/src/com/szpg/db/dao/PgCh4Dao.java index e23b964..61fdfcd 100644 --- a/src/com/szpg/db/dao/PgCh4Dao.java +++ b/src/com/szpg/db/dao/PgCh4Dao.java @@ -20,6 +20,7 @@ public List findPblzByDeviceAndTm(Integer deviceid, String start, String end); public double findLastValueByDevice(Integer deviceid); + public PgCh4 findLastRecordByDevice(Integer deviceid); public int addPblzRecord(PgCh4 ch4); public int addPblzRecord(float value, String tm, int deviceid); diff --git a/src/com/szpg/db/dao/PgHSDao.java b/src/com/szpg/db/dao/PgHSDao.java index f89b044..0f0ee53 100644 --- a/src/com/szpg/db/dao/PgHSDao.java +++ b/src/com/szpg/db/dao/PgHSDao.java @@ -20,6 +20,7 @@ public List findPblzByDeviceAndTm(Integer deviceid, String start, String end); public double findLastValueByDevice(Integer deviceid); + public PgSH findLastRecordByDevice(Integer deviceid); public int addPblzRecord(PgSH hs); public int addPblzRecord(float value, String tm, int deviceid); diff --git a/src/com/szpg/db/dao/PgO2Dao.java b/src/com/szpg/db/dao/PgO2Dao.java index 0b3d0bf..678adab 100644 --- a/src/com/szpg/db/dao/PgO2Dao.java +++ b/src/com/szpg/db/dao/PgO2Dao.java @@ -20,6 +20,7 @@ public List findPblzByDeviceAndTm(Integer deviceid, String start, String end); public double findLastValueByDevice(Integer deviceid); + public PgO2 findLastRecordByDevice(Integer deviceid); public int addPblzRecord(PgO2 ch4); public int addPblzRecord(float value, String tm, int deviceid); diff --git a/src/com/szpg/db/dao/PgWsDao.java b/src/com/szpg/db/dao/PgWsDao.java index 370a83f..bfd0eed 100644 --- a/src/com/szpg/db/dao/PgWsDao.java +++ b/src/com/szpg/db/dao/PgWsDao.java @@ -21,6 +21,7 @@ public double findLastTempByDevice(Integer deviceid); public double findLastHumByDevice(Integer deviceid); + public PgTemphum findLastRecordByDevice(Integer deviceid); public int addWsdzRecord(PgTemphum wsdz); public int addWsdzRecord(float temp, float hum, String tm, int deviceid); diff --git a/src/com/szpg/db/dao/impl/PgAlarmDaoImpl.java b/src/com/szpg/db/dao/impl/PgAlarmDaoImpl.java index cedf5fc..ce9ee0f 100644 --- a/src/com/szpg/db/dao/impl/PgAlarmDaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgAlarmDaoImpl.java @@ -8,7 +8,6 @@ import org.apache.commons.dbutils.DbUtils; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.handlers.ArrayListHandler; -import org.apache.commons.dbutils.handlers.BeanListHandler; import org.apache.commons.dbutils.handlers.ScalarHandler; import org.apache.log4j.Logger; @@ -17,6 +16,9 @@ import com.szpg.db.util.ConnectionManager; import com.szpg.util.TimeFormat; +/** + * @author TAN YUE + */ public class PgAlarmDaoImpl implements PgAlarmDao { private final Logger logger = Logger.getLogger(this.getClass().getName()); @@ -33,7 +35,7 @@ QueryRunner runner = new QueryRunner(); param[0] = date; - int count = ((Number) runner.query(conn, sql, new ScalarHandler(1), param)).intValue(); + int count = (runner.query(conn, sql, new ScalarHandler(1), param)).intValue(); return count; } catch (Exception ex) { logger.error("根据日期查询报警记录数异常", ex); @@ -51,7 +53,7 @@ public PgAlarm findLatestAlarmByDevice(int deviceId) { Connection conn = null; String queryStr = "SELECT A.* FROM " + - "(SELECT ID, ACTIVE, ALARM_DATE, ALARM_VALUE, DESCRIPTION, ALARMDEVID, ALARMTYPEID, ALARM_GRADE FROM PG_ALARM WHERE ALARMDEVID = ? ORDER BY ALARM_DATE DESC) A " + + "(SELECT ID, ACTIVE, ALARM_DATE, ALARM_VALUE, DESCRIPTION, ALARMDEVID, ALARMTYPEID, ALARM_GRADE, LOG_TIME, LOG_DESC FROM PG_ALARM WHERE ALARMDEVID = ? ORDER BY ALARM_DATE DESC) A " + "WHERE ROWNUM <= 1"; Object[] param = new Object[1]; try { @@ -60,7 +62,7 @@ QueryRunner runner = new QueryRunner(); param[0] = deviceId; - List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler(), param); + List tempList = runner.query(conn, queryStr, new ArrayListHandler(), param); if (null != tempList && tempList.isEmpty() == false) { PgAlarm alarm = new PgAlarm(); Object[] item = tempList.get(0); @@ -79,6 +81,74 @@ alarm.setAlarmtypeid(((Number) item[6]).intValue()); alarm.setAlarm_grade((String) item[7]); + if (null != item[8]) { + long logTmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[8]).toJdbc()).getTime(); + Calendar logCal = Calendar.getInstance(); + logCal.setTimeInMillis(logTmValue); + alarm.setLog_time(logCal.getTime()); + } else { + alarm.setLog_time(null); + } + + alarm.setLog_desc((String) item[9]); + + logger.debug("根据设备查询最新报警记录成功"); + + return alarm; + } else { + return null; + } + } catch (Exception ex) { + logger.error("根据设备查询最新报警记录成功", ex); + return null; + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + } + + @Override + public PgAlarm findLatestAlarmByDeviceAndType(int deviceId, String type) { + Connection conn = null; + String queryStr = "SELECT A.* FROM " + + "(SELECT ID, ACTIVE, ALARM_DATE, ALARM_VALUE, DESCRIPTION, ALARMDEVID, ALARMTYPEID, ALARM_GRADE, LOG_TIME, LOG_DESC FROM PG_ALARM WHERE ALARMDEVID = ? AND DESCRIPTION LIKE ? ORDER BY ALARM_DATE DESC) A " + + "WHERE ROWNUM <= 1"; + Object[] param = new Object[2]; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + QueryRunner runner = new QueryRunner(); + param[0] = deviceId; + param[1] = "%" + type + "%"; + + List tempList = runner.query(conn, queryStr, new ArrayListHandler(), param); + if (null != tempList && tempList.isEmpty() == false) { + PgAlarm alarm = new PgAlarm(); + Object[] item = tempList.get(0); + + alarm.setId(((Number) item[0]).intValue()); + alarm.setActive(((Number) item[1]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + alarm.setAlarm_date(cal.getTime()); + + alarm.setAlarm_value((String) item[3]); + alarm.setDescription((String) item[4]); + alarm.setAlarmdevid(((Number) item[5]).intValue()); + alarm.setAlarmtypeid(((Number) item[6]).intValue()); + alarm.setAlarm_grade((String) item[7]); + + long logTmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[8]).toJdbc()).getTime(); + Calendar logCal = Calendar.getInstance(); + logCal.setTimeInMillis(logTmValue); + alarm.setLog_time(logCal.getTime()); + alarm.setLog_desc((String) item[9]); + logger.debug("根据设备查询最新报警记录成功"); return alarm; @@ -111,28 +181,31 @@ QueryRunner runner = new QueryRunner(); // 查询同一设备是否有正在报警的消息 - Number id = (Number) runner.query(conn, querySql, new ScalarHandler(1), queryParam); + Number id = runner.query(conn, querySql, new ScalarHandler(1), queryParam); if (null != id) { // 找到设备已存在的记录 // 1先将正在报警的设备自动消警 - String updateSql = "UPDATE PG_ALARM SET ACTIVE=0 WHERE ID=?"; + String updateSql = "UPDATE PG_ALARM SET ACTIVE=0, LOG_TIME=SYSDATE, LOG_DESC=? WHERE ID=?"; - Object[] updateParam = new Object[1]; - updateParam[0] = id.longValue(); - - runner.update(conn, updateSql, updateParam); // 更新报警记录 - } + Object[] updateParam = new Object[2]; + updateParam[0] = "重复报警自动消警"; + updateParam[1] = id.longValue(); + + // 更新报警记录 + runner.update(conn, updateSql, updateParam); + } // 插入新的报警记录 String insertSql = "INSERT INTO PG_ALARM " + - "(ID, ACTIVE, ALARM_DATE, ALARM_VALUE, DESCRIPTION, ALARMDEVID, ALARMTYPEID, USERID, ALARM_GRADE) " + - "VALUES (?, ?, TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), ?, ?, ?, ?, ?, ?)"; + "(ID, ACTIVE, ALARM_DATE, ALARM_VALUE, DESCRIPTION, ALARMDEVID, ALARMTYPEID, USERID, ALARM_GRADE, LOG_TIME, LOG_DESC) " + + "VALUES (?, ?, TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), ?, ?, ?, ?, ?, ?, TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), ?)"; String sqlId = "SELECT SEQ_PG_ALARM_ID.NEXTVAL FROM DUAL"; - long newId = ((Number) runner.query(conn, sqlId, new ScalarHandler(1))).longValue(); // 获取新的id - - Object[] params = new Object[9]; + // 获取新的id + long newId = (runner.query(conn, sqlId, new ScalarHandler(1))).longValue(); + + Object[] params = new Object[11]; params[0] = newId; params[1] = alarmRecord.getActive(); @@ -143,8 +216,11 @@ params[6] = alarmRecord.getAlarmtypeid(); params[7] = alarmRecord.getUserid(); params[8] = alarmRecord.getAlarm_grade(); - - int count = runner.update(conn, insertSql, params); // 新增主表 + params[9] = TimeFormat.formatTimestamp(alarmRecord.getLog_time()); + params[10] = alarmRecord.getLog_desc(); + + // 新增报警记录 + int count = runner.update(conn, insertSql, params); if (count > 0) { logger.debug("插入报警数据成功"); diff --git a/src/com/szpg/db/dao/impl/PgCODaoImpl.java b/src/com/szpg/db/dao/impl/PgCODaoImpl.java index 186ac16..70d672c 100644 --- a/src/com/szpg/db/dao/impl/PgCODaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgCODaoImpl.java @@ -292,6 +292,51 @@ } @Override + public PgCO findLastRecordByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT ID, CO, LOGTIME, PGDEVICEID FROM (SELECT * FROM PG_CO WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, sql, new ArrayListHandler(), param); + if (null != tempList && tempList.size() == 1) { + PgCO co = new PgCO(); + Object[] item = tempList.get(0); + + co.setId(((Number) item[0]).intValue()); + co.setCo(Float.parseFloat((String) item[1])); + co.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + co.setLogtime(cal.getTime()); + co.setUptime(cal.getTime()); + + logger.debug("根据设备ID查询最新一氧化碳监测记录成功" + co + "]"); + + return co; + } else { + return null; + } + } catch (Exception ex) { + logger.error("根据设备ID查询最新一氧化碳监测记录异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override public int addPblzRecord(PgCO co) { return addPblzRecord(co.getCo(), co.getTmStr(), co.getPgdeviceid()); } diff --git a/src/com/szpg/db/dao/impl/PgCh4DaoImpl.java b/src/com/szpg/db/dao/impl/PgCh4DaoImpl.java index 0ed139e..768b6a5 100644 --- a/src/com/szpg/db/dao/impl/PgCh4DaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgCh4DaoImpl.java @@ -54,9 +54,9 @@ list.add(ch4); } return list; - } - else + } else { return null; + } } catch (Exception ex) { logger.error("查询所有甲烷监测值异常", ex); } finally { @@ -100,9 +100,9 @@ logger.debug("根据ID查询甲烷监测值成功" + ch4 + "]"); return ch4; - } - else + } else { return null; + } } catch (Exception ex) { logger.error("根据ID查询甲烷监测值异常", ex); } finally { @@ -149,9 +149,9 @@ logger.debug("根据设备ID查询最新的甲烷监测值成功" + ch4 + "]"); return ch4; - } - else + } else { return null; + } } catch (Exception ex) { logger.error("根据设备ID查询最新的甲烷监测值异常", ex); } finally { @@ -199,9 +199,9 @@ list.add(ch4); } return list; - } - else + } else { return null; + } } catch (Exception ex) { logger.error("根据设备ID查询甲烷监测值异常", ex); } finally { @@ -251,9 +251,9 @@ list.add(ch4); } return list; - } - else + } else { return null; + } } catch (Exception ex) { logger.error("根据设备ID和时间查询甲烷监测值异常", ex); } finally { @@ -293,6 +293,51 @@ } @Override + public PgCh4 findLastRecordByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT ID, CH4, LOGTIME, PGDEVICEID FROM (SELECT * FROM PG_CH4 WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, sql, new ArrayListHandler(), param); + if (null != tempList && tempList.size() == 1) { + PgCh4 ch4 = new PgCh4(); + Object[] item = tempList.get(0); + + ch4.setId(((Number) item[0]).intValue()); + ch4.setCh4(Float.parseFloat((String) item[1])); + ch4.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + ch4.setLogtime(cal.getTime()); + ch4.setUptime(cal.getTime()); + + logger.debug("根据设备ID查询最新甲烷监测记录成功" + ch4 + "]"); + + return ch4; + } else { + return null; + } + } catch (Exception ex) { + logger.error("根据设备ID查询最新甲烷监测记录异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override public int addPblzRecord(PgCh4 ch4) { return addPblzRecord(ch4.getCh4(), ch4.getTmStr(), ch4.getPgdeviceid()); } diff --git a/src/com/szpg/db/dao/impl/PgHSDaoImpl.java b/src/com/szpg/db/dao/impl/PgHSDaoImpl.java index 892e175..fa4ea02 100644 --- a/src/com/szpg/db/dao/impl/PgHSDaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgHSDaoImpl.java @@ -292,6 +292,51 @@ } @Override + public PgSH findLastRecordByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT ID, SH, LOGTIME, PGDEVICEID FROM (SELECT * FROM PG_SH WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, sql, new ArrayListHandler(), param); + if (null != tempList && tempList.size() == 1) { + PgSH sh = new PgSH(); + Object[] item = tempList.get(0); + + sh.setId(((Number) item[0]).intValue()); + sh.setSh(Float.parseFloat((String) item[1])); + sh.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + sh.setLogtime(cal.getTime()); + sh.setUptime(cal.getTime()); + + logger.debug("根据设备ID查询最新硫化氢监测记录成功" + sh + "]"); + + return sh; + } else { + return null; + } + } catch (Exception ex) { + logger.error("根据设备ID查询最新硫化氢监测记录异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override public int addPblzRecord(PgSH sh) { return addPblzRecord(sh.getSh(), sh.getTmStr(), sh.getPgdeviceid()); } diff --git a/src/com/szpg/db/dao/impl/PgO2DaoImpl.java b/src/com/szpg/db/dao/impl/PgO2DaoImpl.java index f58f8cd..842291b 100644 --- a/src/com/szpg/db/dao/impl/PgO2DaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgO2DaoImpl.java @@ -54,9 +54,9 @@ list.add(o2); } return list; - } - else + } else { return null; + } } catch (Exception ex) { logger.error("查询所有氧气监测值异常", ex); } finally { @@ -100,9 +100,9 @@ logger.debug("根据ID查询氧气监测值成功" + o2 + "]"); return o2; - } - else + } else { return null; + } } catch (Exception ex) { logger.error("根据ID查询氧气监测值异常", ex); } finally { @@ -148,9 +148,9 @@ logger.debug("根据设备ID查询最新的氧气监测值成功" + o2 + "]"); return o2; - } - else + } else { return null; + } } catch (Exception ex) { logger.error("根据设备ID查询最新的硫化氢监测值异常", ex); } finally { @@ -198,9 +198,9 @@ list.add(o2); } return list; - } - else + } else { return null; + } } catch (Exception ex) { logger.error("根据设备ID查询氧气监测值异常", ex); } finally { @@ -250,9 +250,9 @@ list.add(o2); } return list; - } - else + } else { return null; + } } catch (Exception ex) { logger.error("根据设备ID和时间查询氧气监测值异常", ex); } finally { @@ -292,6 +292,51 @@ } @Override + public PgO2 findLastRecordByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT ID, O2, LOGTIME, PGDEVICEID FROM (SELECT * FROM PG_O2 WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, sql, new ArrayListHandler(), param); + if (null != tempList && tempList.size() == 1) { + PgO2 o2 = new PgO2(); + Object[] item = tempList.get(0); + + o2.setId(((Number) item[0]).intValue()); + o2.setO2(Float.parseFloat((String) item[1])); + o2.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + o2.setLogtime(cal.getTime()); + o2.setUptime(cal.getTime()); + + logger.debug("根据设备ID查询最新氧气监测记录成功" + o2 + "]"); + + return o2; + } else { + return null; + } + } catch (Exception ex) { + logger.error("根据设备ID查询最新氧气监测记录异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override public int addPblzRecord(PgO2 o2) { return addPblzRecord(o2.getO2(), o2.getTmStr(), o2.getPgdeviceid()); } @@ -316,10 +361,11 @@ QueryRunner runner = new QueryRunner(); int count = runner.update(conn, insertStr, params); - if (count > 0) + if (count > 0) { logger.debug("插入氧气监测值成功[tm=" + tm + ", value=" + value + ", deviceid=" + deviceid + "]"); - else + } else { logger.error("插入氧气监测值失败!"); + } return count; } catch (Exception ex) { diff --git a/src/com/szpg/db/dao/impl/PgWsDaoImpl.java b/src/com/szpg/db/dao/impl/PgWsDaoImpl.java index 679b58f..77925f7 100644 --- a/src/com/szpg/db/dao/impl/PgWsDaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgWsDaoImpl.java @@ -323,6 +323,52 @@ } @Override + public PgTemphum findLastRecordByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT ID, TEMP, HUM, LOGTIME, PGDEVICEID FROM (SELECT * FROM PG_TEMPHUM WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, sql, new ArrayListHandler(), param); + if (null != tempList && tempList.size() == 1) { + PgTemphum temphum = new PgTemphum(); + Object[] item = tempList.get(0); + + temphum.setId(((Number) item[0]).intValue()); + temphum.setTemp(Float.parseFloat((String) item[1])); + temphum.setHum(Float.parseFloat((String) item[2])); + temphum.setPgdeviceid(((Number) item[4]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + temphum.setLogtime(cal.getTime()); + temphum.setUptime(cal.getTime()); + + logger.debug("根据设备ID查询最新温湿度监测记录成功" + temphum + "]"); + + return temphum; + } else { + return null; + } + } catch (Exception ex) { + logger.error("根据设备ID查询最新温湿度监测记录异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override public int addWsdzRecord(PgTemphum ws) { return addWsdzRecord(ws.getTemp(), ws.getHum(), ws.getTmStr(), ws.getPgdeviceid()); } diff --git a/src/com/szpg/db/data/PgAlarm.java b/src/com/szpg/db/data/PgAlarm.java index 5a73ba9..4b97e6a 100644 --- a/src/com/szpg/db/data/PgAlarm.java +++ b/src/com/szpg/db/data/PgAlarm.java @@ -1,9 +1,12 @@ package com.szpg.db.data; -import java.util.Date; - import com.szpg.util.TimeFormat; +import java.util.Date; + +/** + * @author TAN YUE + */ public class PgAlarm implements java.io.Serializable { /** @@ -20,11 +23,28 @@ private Integer alarmtypeid; private Integer userid; private String alarm_grade; - - public static Integer ALARM_TYPE_DEVRUN = 1; //管廊设备运行故障 - public static Integer ALARM_TYPE_PGRUN = 2; //管廊运行环境报警 - public static Integer ALARM_TYPE_PGSAF = 3; //管廊安全防范报警 - public static Integer ALARM_TYPE_INPG = 4; //人员入廊超时报警 + private Date log_time; + private String log_desc; + + /** + * 管廊设备运行故障 + */ + public static Integer ALARM_TYPE_DEVRUN = 1; + + /** + * 管廊运行环境报警 + */ + public static Integer ALARM_TYPE_PGRUN = 2; + + /** + * 管廊安全防范报警 + */ + public static Integer ALARM_TYPE_PGSAF = 3; + + /** + * 人员入廊超时报警 + */ + public static Integer ALARM_TYPE_INPG = 4; public Integer getId() { return id; @@ -97,10 +117,130 @@ public void setAlarm_grade(String alarm_grade) { this.alarm_grade = alarm_grade; } + + public Date getLog_time() { + if (null == log_time) { + return alarm_date; + } + return log_time; + } + + public void setLog_time(Date log_time) { + this.log_time = log_time; + } + + public String getLog_desc() { + return log_desc; + } + + public void setLog_desc(String log_desc) { + this.log_desc = log_desc; + } @Override public String toString() { return "PgAlarm[alarmValue=" + alarm_value + ", alarmDate=" + TimeFormat.formatTimestamp(alarm_date) + ", alarmDevId= " + alarmdevid + "]"; } + /** + * 生成氧气报警记录 + * @return + */ + public PgAlarm getO2AlarmInstance() { + PgAlarm alarm = new PgAlarm(); + alarm.setActive(1); + alarm.setAlarmtypeid(PgAlarm.ALARM_TYPE_PGRUN); + alarm.setDescription("氧气浓度低于低限阈值"); + alarm.setUserid(null); + + // 氧气报警定义为一级报警 + alarm.setAlarm_grade("一级报警"); + + return alarm; + } + + /** + * 生成一氧化碳报警记录 + * @return + */ + public PgAlarm getCOAlarmInstance() { + PgAlarm alarm = new PgAlarm(); + alarm.setActive(1); + alarm.setAlarmtypeid(PgAlarm.ALARM_TYPE_PGRUN); + alarm.setDescription("一氧化碳浓度超过高限阈值"); + alarm.setUserid(null); + + // 一氧化碳报警定义为一级报警 + alarm.setAlarm_grade("一级报警"); + + return alarm; + } + + /** + * 生成硫化氢报警记录 + * @return + */ + public PgAlarm getHSAlarmInstance() { + PgAlarm alarm = new PgAlarm(); + alarm.setActive(1); + alarm.setAlarmtypeid(PgAlarm.ALARM_TYPE_PGRUN); + alarm.setDescription("硫化氢浓度超过高限阈值"); + alarm.setUserid(null); + + // 硫化氢报警定义为一级报警 + alarm.setAlarm_grade("一级报警"); + + return alarm; + } + + /** + * 生成甲烷报警记录 + * @return + */ + public PgAlarm getCH4AlarmInstance() { + PgAlarm alarm = new PgAlarm(); + alarm.setActive(1); + alarm.setAlarmtypeid(PgAlarm.ALARM_TYPE_PGRUN); + alarm.setDescription("甲烷浓度超过高限阈值"); + alarm.setUserid(null); + + // 甲烷报警定义为二级报警 + alarm.setAlarm_grade("二级报警"); + + return alarm; + } + + /** + * 生成温度报警记录 + * @return + */ + public PgAlarm getTempAlarmInstance() { + PgAlarm alarm = new PgAlarm(); + alarm.setActive(1); + alarm.setAlarmtypeid(PgAlarm.ALARM_TYPE_PGRUN); + alarm.setDescription("温度超过高限阈值"); + alarm.setUserid(null); + + // 温度定义为二级报警 + alarm.setAlarm_grade("二级报警"); + + return alarm; + } + + /** + * 生成湿度报警记录 + * @return + */ + public PgAlarm getHumAlarmInstance() { + PgAlarm alarm = new PgAlarm(); + alarm.setActive(1); + alarm.setAlarmtypeid(PgAlarm.ALARM_TYPE_PGRUN); + alarm.setDescription("湿度超过高限阈值"); + alarm.setUserid(null); + + // 湿度报警定义为二级报警 + alarm.setAlarm_grade("二级报警"); + + return alarm; + } } diff --git a/src/com/szpg/plc/message/response/read/ReadCH4ValueCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadCH4ValueCommandResponse.java index c26ffa5..13c5968 100644 --- a/src/com/szpg/plc/message/response/read/ReadCH4ValueCommandResponse.java +++ b/src/com/szpg/plc/message/response/read/ReadCH4ValueCommandResponse.java @@ -4,6 +4,7 @@ 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; @@ -25,6 +26,9 @@ import com.szpg.util.NumberFormat; import com.szpg.util.TimeFormat; +/** + * @author TAN YUE + */ public class ReadCH4ValueCommandResponse extends ReadMemoryCommandResponse { /** @@ -33,10 +37,24 @@ private static final long serialVersionUID = 8081222348890587881L; private final Logger logger = Logger.getLogger(this.getClass().getName()); - - private List jwnd; //甲烷浓度值 - private List jwldbjz; //甲烷联动报警值 - private String[] zcList; //甲烷监测的资产列表,从配置文件中获取 + + /** + * 甲烷浓度值 + */ + private List jwnd; + + /** + * 甲烷联动报警值 + */ + private List jwldbjz; + + /** + * 甲烷监测的资产列表,从配置文件中获取 + */ + private String[] zcList; + + private boolean CH4_ON_FJ = false; + private long CLASS_YELLOW_ALARM_INTERVAL = 360 * 60 * 1000L; public ReadCH4ValueCommandResponse() { jwnd = new ArrayList(); @@ -74,94 +92,108 @@ 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) { - ch4Dao.addPblzRecord(jwnd.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), deviceId); - - // (一)如果有报警则立即推送 - // 判断是否超过报警阈值 + // 1 取出报警规则 PgAlarmRule rule = ruleDao.findRuleByDevice(deviceId); + + // 默认的报警阈值 + double high = 0.0; if (null != rule) { - double high = 0.0; try { high = NumberFormat.parseDouble(rule.getHighvalue(), "0.00"); } catch (Exception ex) { logger.error(ex); ex.printStackTrace(); } - - // 甲烷浓度超过高限阈值 - if (high > 0.0001 && value > high) { - PgAlarm alarm = new PgAlarm(); - alarm.setActive(1); - alarm.setAlarm_date(this.getTime().getTime()); - alarm.setAlarm_value(NumberFormat.format(value, "0.00")); - alarm.setAlarmdevid(deviceId); - alarm.setAlarmtypeid(PgAlarm.ALARM_TYPE_PGRUN); - alarm.setDescription("甲烷浓度超过高限阈值"); - alarm.setUserid(null); - // 甲烷报警定义为二级报警 - alarm.setAlarm_grade("二级报警"); - - alarmDao.insertAlarmRecord(alarm); - deviceDao.updateDeviceStatus(deviceId, "甲烷浓度过高"); - - // 将报警日志推送至市级平台 - 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); - - // 将报警值推送至市级平台 - String jwResp = DataPushInterface.addCH4Data(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); - logger.info("同步甲烷浓度值结果:" + jwResp); + } - // 自动打开当前舱段的排风机,手动关闭风机 - // 首先找到当前舱段的排风机资产编号 - if (Boolean.valueOf(Configure.getProperty("sys", "CH4_ON_FJ", "false")) == true) { - String acucode = zcbh.substring(0, zcbh.indexOf(".", 6)); - String cabin = zcbh.substring(zcbh.lastIndexOf(".") + 1, zcbh.lastIndexOf(".") + 2); - List fjs = deviceDao.findDeviceByPositionAndType(acucode, "F", cabin); - if (null != fjs && fjs.isEmpty() == false) { - String baseURL = Configure.getProperty("sys", "PGDSC_API_URL"); - for (PgDevice fj : fjs) { - String fjzcbh = fj.getAssetcode(); + // 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(); - // 调用远程接口启动风机 - HttpRequest.sendGet(baseURL + "remote/turnOnFj.action", "zcbh=" + fjzcbh); - } - } + // 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; } } - } - - // (二)如果监测值有变化则推送 - // 判断甲烷浓度值是否有变化 - double lastValue = ch4Dao.findLastValueByDevice(deviceId); - if (Math.abs(value - lastValue) > 0.01) { - // 将监测值推送至市级平台 + + // 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); - } - - // (三)如果监测值有变化则推送 - // 每天小时各推送一个数据 - int minute = Calendar.getInstance().get(Calendar.MINUTE); - if (minute < 10) { - // 将监测值推送至市级平台 - 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 + "]"); diff --git a/src/com/szpg/plc/message/response/read/ReadCOValueCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadCOValueCommandResponse.java index 1920b62..0b27d03 100644 --- a/src/com/szpg/plc/message/response/read/ReadCOValueCommandResponse.java +++ b/src/com/szpg/plc/message/response/read/ReadCOValueCommandResponse.java @@ -4,6 +4,8 @@ import java.util.Calendar; import java.util.List; +import com.szpg.db.data.PgCO; +import com.szpg.util.*; import org.apache.commons.lang3.StringUtils; import org.apache.log4j.Logger; @@ -18,11 +20,10 @@ import com.szpg.db.data.PgAlarm; import com.szpg.db.data.PgAlarmRule; import com.szpg.plc.message.response.ReadMemoryCommandResponse; -import com.szpg.util.Configure; -import com.szpg.util.DataPushInterface; -import com.szpg.util.NumberFormat; -import com.szpg.util.TimeFormat; +/** + * @author TAN YUE + */ public class ReadCOValueCommandResponse extends ReadMemoryCommandResponse { /** @@ -31,10 +32,24 @@ private static final long serialVersionUID = -6176747812714170040L; private final Logger logger = Logger.getLogger(this.getClass().getName()); - - private List cond; //一氧化碳浓度值 - private List coldbjz; //一氧化碳联动报警值 - private String[] zcList; //一氧化碳监测的资产列表,从配置文件中获取 + + /** + * 一氧化碳浓度值 + */ + private List cond; + + /** + * 一氧化碳联动报警值 + */ + private List coldbjz; + + /** + * 一氧化碳监测的资产列表,从配置文件中获取 + */ + private String[] zcList; + + private boolean CO_ON_FJ = false; + private long CLASS_RED_ALARM_INTERVAL = 60 * 60 * 1000L; public ReadCOValueCommandResponse() { cond = new ArrayList(); @@ -72,80 +87,108 @@ 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 = cond.get(i); - + int deviceId = deviceDao.findDeviceIdByCode(zcbh); if (deviceId > 0) { - coDao.addPblzRecord(cond.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), deviceId); - - // (一)如果有报警则立即推送 - // 判断是否超过报警阈值 + // 1 取出报警规则 PgAlarmRule rule = ruleDao.findRuleByDevice(deviceId); + + // 默认的报警阈值 + double high = 0.0; if (null != rule) { - double high = 0.0; try { high = NumberFormat.parseDouble(rule.getHighvalue(), "0.00"); } catch (Exception ex) { logger.error(ex); ex.printStackTrace(); } - - // 一氧化碳浓度超过高限阈值 - if (high > 0.0001 && value > high) { - PgAlarm alarm = new PgAlarm(); - alarm.setActive(1); - alarm.setAlarm_date(this.getTime().getTime()); - alarm.setAlarm_value(NumberFormat.format(value, "0.00")); - alarm.setAlarmdevid(deviceId); - alarm.setAlarmtypeid(PgAlarm.ALARM_TYPE_PGRUN); - alarm.setDescription("一氧化碳浓度超过高限阈值"); - alarm.setUserid(null); - // 一氧化碳报警定义为一级报警 - alarm.setAlarm_grade("一级报警"); - - alarmDao.insertAlarmRecord(alarm); - deviceDao.updateDeviceStatus(deviceId, "一氧化碳浓度过高"); - - // 将报警日志推送至市级平台 - 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.addCOAlarmData(bjbh, zcbh, bjms, bjsj); - logger.info("同步一氧化碳报警记录日志结果:" + jwbjResp); - - // 将报警值推送至市级平台 - String jwResp = DataPushInterface.addCOData(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); - logger.info("同步一氧化碳浓度值结果:" + jwResp); + } - // 一氧化碳不需要联动控制风机 + // 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_RED_ALARM_INTERVAL) { + continue; + } } - } - - - // (二)如果监测值有变化则推送 - // 判断一氧化碳浓度值是否有变化 - double lastValue = coDao.findLastValueByDevice(deviceId); - if (Math.abs(value - lastValue) > 0.01) { - // 将监测值推送至市级平台 + + // 2.5 插入监测数值 + coDao.addPblzRecord(value, TimeFormat.formatTimestamp(this.getTime().getTime()), deviceId); + + // 2.6 推送给市管廊公司平台 String coResp = DataPushInterface.addCOData(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); logger.info("同步一氧化碳浓度值结果:" + coResp); - } - - // (三)如果监测值有变化则推送 - // 每天小时各推送一个数据 - int minute = Calendar.getInstance().get(Calendar.MINUTE); - if (minute < 10) { - // 将监测值推送至市级平台 - String coResp = DataPushInterface.addCOData(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); - logger.info("同步一氧化碳浓度值结果:" + coResp); + + // 2.7 生成报警记录 + PgAlarm alarm = new PgAlarm().getCOAlarmInstance(); + + 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.addCOAlarmData(bjbh, zcbh, bjms, bjsj); + logger.info("同步一氧化碳报警记录日志结果:" + jwbjResp); + + // 2.10 联动打开风机 + // 自动打开当前舱段的排风机,手动关闭风机 + // 首先找到当前舱段的排风机资产编号 + if (CO_ON_FJ == true) { + String baseURL = Configure.getProperty("sys", "PGDSC_API_URL"); + HttpRequest.sendGet(baseURL + "remote/turnOnFjReactAlarm.action", "zcbh=" + zcbh); + } + } else { + // 3 不需要报警,只处理监测值 + // 3.1 取出上一个监测值 + PgCO lastRec = coDao.findLastRecordByDevice(deviceId); + + // 3.2 计算数值的时间间隔 + long valueTimeInterval = this.getTime().getTimeInMillis() - lastRec.getUptime().getTime(); + + // 3.3 判断条件:是否与原值相同且相距在一小时以内 + if (Math.abs(value - lastRec.getCo()) > 0.01 || valueTimeInterval > CLASS_RED_ALARM_INTERVAL) { + // 3.4 将数据存入数据库 + coDao.addPblzRecord(value, TimeFormat.formatTimestamp(this.getTime().getTime()), deviceId); + + // 3.5 推送给市管廊公司平台 + String coResp = DataPushInterface.addCOData(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步一氧化碳浓度值结果:" + coResp); + } } } else { logger.warn("未找到资产[" + zcbh + "]"); diff --git a/src/com/szpg/plc/message/response/read/ReadHSValueCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadHSValueCommandResponse.java index 3b8f2f6..1980827 100644 --- a/src/com/szpg/plc/message/response/read/ReadHSValueCommandResponse.java +++ b/src/com/szpg/plc/message/response/read/ReadHSValueCommandResponse.java @@ -4,6 +4,7 @@ import java.util.Calendar; import java.util.List; +import com.szpg.db.data.PgSH; import org.apache.commons.lang3.StringUtils; import org.apache.log4j.Logger; @@ -25,6 +26,9 @@ import com.szpg.util.NumberFormat; import com.szpg.util.TimeFormat; +/** + * @author TAN YUE + */ public class ReadHSValueCommandResponse extends ReadMemoryCommandResponse { /** @@ -33,10 +37,24 @@ private static final long serialVersionUID = -3864512113984510244L; private final Logger logger = Logger.getLogger(this.getClass().getName()); - - private List hsnd; //硫化氢浓度值 - private List hsldbjz; //硫化氢联动报警值 - private String[] zcList; // 监测设备资产列表,从配置文件中获取 + + /** + * 硫化氢浓度值 + */ + private List hsnd; + + /** + * 硫化氢联动报警值 + */ + private List hsldbjz; + + /** + * 监测设备资产列表,从配置文件中获取 + */ + private String[] zcList; + + private boolean HS_ON_FJ = false; + private long CLASS_RED_ALARM_INTERVAL = 60 * 60 * 1000L; public ReadHSValueCommandResponse() { hsnd = new ArrayList(); @@ -74,94 +92,108 @@ 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 = hsnd.get(i); - + int deviceId = deviceDao.findDeviceIdByCode(zcbh); if (deviceId > 0) { - hsDao.addPblzRecord(hsnd.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), deviceId); - - // (一)如果有报警则立即推送 - // 判断是否超过报警阈值 + // 1 取出报警规则 PgAlarmRule rule = ruleDao.findRuleByDevice(deviceId); + + // 默认的报警阈值 + double high = 0.0; if (null != rule) { - double high = 0.0; try { high = NumberFormat.parseDouble(rule.getHighvalue(), "0.00"); } catch (Exception ex) { logger.error(ex); ex.printStackTrace(); } - - // 一氧化碳浓度超过高限阈值 - if (high > 0.0001 && value > high) { - PgAlarm alarm = new PgAlarm(); - alarm.setActive(1); - alarm.setAlarm_date(this.getTime().getTime()); - alarm.setAlarm_value(NumberFormat.format(value, "0.00")); - alarm.setAlarmdevid(deviceId); - alarm.setAlarmtypeid(PgAlarm.ALARM_TYPE_PGRUN); - alarm.setDescription("硫化氢浓度超过高限阈值"); - alarm.setUserid(null); - // 硫化氢报警定义为一级报警 - alarm.setAlarm_grade("一级报警"); - - alarmDao.insertAlarmRecord(alarm); - deviceDao.updateDeviceStatus(deviceId, "硫化氢浓度过高"); - - // 将报警日志推送至市级平台 - 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.addHSAlarmData(bjbh, zcbh, bjms, bjsj); - logger.info("同步硫化氢报警记录日志结果:" + jwbjResp); - - // 将报警值推送至市级平台 - String jwResp = DataPushInterface.addHSData(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); - logger.info("同步硫化氢浓度值结果:" + jwResp); - - // 自动打开当前舱段的排风机,手动关闭风机 - // 首先找到当前舱段的排风机资产编号 - if (Boolean.valueOf(Configure.getProperty("sys", "HS_ON_FJ", "false")) == true) { - String acucode = zcbh.substring(0, zcbh.indexOf(".", 6)); - String cabin = zcbh.substring(zcbh.lastIndexOf(".") + 1, zcbh.lastIndexOf(".") + 2); - List fjs = deviceDao.findDeviceByPositionAndType(acucode, "F", cabin); - if (null != fjs && fjs.isEmpty() == false) { - String baseURL = Configure.getProperty("sys", "PGDSC_API_URL"); - for (PgDevice fj : fjs) { - String fjzcbh = fj.getAssetcode(); + } - // 调用远程接口启动风机 - HttpRequest.sendGet(baseURL + "remote/turnOnFj.action", "zcbh=" + fjzcbh); - } - } + // 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_RED_ALARM_INTERVAL) { + continue; } } - } - - // (二)如果监测值有变化则推送 - // 判断硫化氢浓度值是否有变化 - double lastValue = hsDao.findLastValueByDevice(deviceId); - if (Math.abs(value - lastValue) > 0.01) { - // 将监测值推送至市级平台 - String coResp = DataPushInterface.addHSData(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); - logger.info("同步硫化氢浓度值结果:" + coResp); - } - - // (三)如果监测值没有变化 - // 每天小时各推送一个数据 - int minute = Calendar.getInstance().get(Calendar.MINUTE); - if (minute < 10) { - // 将监测值推送至市级平台 - String coResp = DataPushInterface.addHSData(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); - logger.info("同步硫化氢浓度值结果:" + coResp); + + // 2.5 插入监测数值 + hsDao.addPblzRecord(value, TimeFormat.formatTimestamp(this.getTime().getTime()), deviceId); + + // 2.6 推送给市管廊公司平台 + String hsResp = DataPushInterface.addHSData(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步硫化氢浓度值结果:" + hsResp); + + // 2.7 生成报警记录 + PgAlarm alarm = new PgAlarm().getHSAlarmInstance(); + + 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 hsbjResp = DataPushInterface.addHSAlarmData(bjbh, zcbh, bjms, bjsj); + logger.info("同步硫化氢报警记录日志结果:" + hsbjResp); + + // 2.10 联动打开风机 + // 自动打开当前舱段的排风机,手动关闭风机 + // 首先找到当前舱段的排风机资产编号 + if (HS_ON_FJ == true) { + String baseURL = Configure.getProperty("sys", "PGDSC_API_URL"); + HttpRequest.sendGet(baseURL + "remote/turnOnFjReactAlarm.action", "zcbh=" + zcbh); + } + } else { + // 3 不需要报警,只处理监测值 + // 3.1 取出上一个监测值 + PgSH lastRec = hsDao.findLastRecordByDevice(deviceId); + + // 3.2 计算数值的时间间隔 + long valueTimeInterval = this.getTime().getTimeInMillis() - lastRec.getUptime().getTime(); + + // 3.3 判断条件:是否与原值相同且相距在一小时以内 + if (Math.abs(value - lastRec.getSh()) > 0.01 || valueTimeInterval > CLASS_RED_ALARM_INTERVAL) { + // 3.4 将数据存入数据库 + hsDao.addPblzRecord(value, TimeFormat.formatTimestamp(this.getTime().getTime()), deviceId); + + // 3.5 推送给市管廊公司平台 + String hsResp = DataPushInterface.addHSData(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步硫化氢浓度值结果:" + hsResp); + } } } else { logger.warn("未找到资产[" + zcbh + "]"); diff --git a/src/com/szpg/plc/message/response/read/ReadO2ValueCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadO2ValueCommandResponse.java index 822beda..ebeb051 100644 --- a/src/com/szpg/plc/message/response/read/ReadO2ValueCommandResponse.java +++ b/src/com/szpg/plc/message/response/read/ReadO2ValueCommandResponse.java @@ -1,12 +1,5 @@ package com.szpg.plc.message.response.read; -import java.util.ArrayList; -import java.util.Calendar; -import java.util.List; - -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.PgDeviceDao; @@ -17,14 +10,19 @@ import com.szpg.db.dao.impl.PgO2DaoImpl; import com.szpg.db.data.PgAlarm; import com.szpg.db.data.PgAlarmRule; -import com.szpg.db.data.PgDevice; +import com.szpg.db.data.PgO2; 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; +import com.szpg.util.*; +import org.apache.commons.lang3.StringUtils; +import org.apache.log4j.Logger; +import java.util.ArrayList; +import java.util.List; + +/** + * 读取氧气值指令的响应消息 + * @author TAN YUE + */ public class ReadO2ValueCommandResponse extends ReadMemoryCommandResponse { /** @@ -33,14 +31,31 @@ private static final long serialVersionUID = -2816512676498637196L; private final Logger logger = Logger.getLogger(this.getClass().getName()); - - private List o2nd; // 氧气浓度值 - private List o2ldbjz; // 氧气联动报警值 - private String[] zcList; // 氧气监测设备资产列表,从配置文件中获取 + + /** + * 氧气浓度值 + */ + private List o2nd; + + /** + * 氧气联动报警值 + */ + private List o2ldbjz; + + /** + * 氧气监测设备资产列表,从配置文件中获取 + */ + private String[] zcList; + + private boolean O2_ON_FJ = false; + private long CLASS_RED_ALARM_INTERVAL = 60 * 60 * 1000L; public ReadO2ValueCommandResponse() { o2nd = new ArrayList(); o2ldbjz = new ArrayList(); + + O2_ON_FJ = Boolean.valueOf(Configure.getProperty("sys", "O2_ON_FJ", "false")); + CLASS_RED_ALARM_INTERVAL = Integer.parseInt(Configure.getProperty("sys", "CLASS_RED_ALARM_INTERVAL", "60")) * 60 * 1000L; } public List getO2nd() { @@ -78,90 +93,104 @@ if (null != zcList && zcList.length > 0) { // 遍历氧气设备列表,将氧气浓度监测值存入数据库 for (int i = 0; i < zcList.length; i++) { + // 资产编号(设备编号) String zcbh = zcList[i]; - + + // 监测值 float value = o2nd.get(i); int deviceId = deviceDao.findDeviceIdByCode(zcbh); if (deviceId > 0) { - o2Dao.addPblzRecord(o2nd.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), deviceId); - - // (一)如果有报警则立即推送 - // 判断是否超过报警阈值 + // 1 取出报警规则 PgAlarmRule rule = ruleDao.findRuleByDevice(deviceId); + + // 默认的报警阈值 + double low = 18.0; if (null != rule) { - double low = 0.0; try { low = NumberFormat.parseDouble(rule.getLowvalue(), "0.00"); } catch (Exception ex) { logger.error(ex); ex.printStackTrace(); } - - // 氧气浓度低于低限阈值 - if (low > 0.0001 && value < low) { - PgAlarm alarm = new PgAlarm(); - alarm.setActive(1); - alarm.setAlarm_date(this.getTime().getTime()); - alarm.setAlarm_value(NumberFormat.format(value, "0.00")); - alarm.setAlarmdevid(deviceId); - alarm.setAlarmtypeid(PgAlarm.ALARM_TYPE_PGRUN); - alarm.setDescription("氧气浓度低于低限阈值"); - alarm.setUserid(null); - // 氧气报警定义为一级报警 - alarm.setAlarm_grade("一级报警"); - - alarmDao.insertAlarmRecord(alarm); - deviceDao.updateDeviceStatus(deviceId, "氧气浓度过低"); - - // 将报警日志推送至市级平台 - 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.addO2AlarmData(bjbh, zcbh, bjms, bjsj); - logger.info("同步氧气报警记录日志结果:" + jwbjResp); - - // 将报警值推送至市级平台 - String jwResp = DataPushInterface.addO2Data(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); - logger.info("同步氧气浓度值结果:" + jwResp); - - // 自动打开当前舱段的排风机,手动关闭风机 - // 首先找到当前舱段的排风机资产编号 - if (Boolean.valueOf(Configure.getProperty("sys", "O2_ON_FJ", "false")) == true) { - String acucode = zcbh.substring(0, zcbh.indexOf(".", 6)); - String cabin = zcbh.substring(zcbh.lastIndexOf(".") + 1, zcbh.lastIndexOf(".") + 2); - List fjs = deviceDao.findDeviceByPositionAndType(acucode, "F", cabin); - if (null != fjs && fjs.isEmpty() == false) { - String baseURL = Configure.getProperty("sys", "PGDSC_API_URL"); - for (PgDevice fj : fjs) { - String fjzcbh = fj.getAssetcode(); + } - // 调用远程接口启动风机 - HttpRequest.sendGet(baseURL + "remote/turnOnFj.action", "zcbh=" + fjzcbh); - } - } + // 1 判断是否报警 + if (low > 0.0001 && value < low) { + // 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_RED_ALARM_INTERVAL) { + continue; } } - } - - // (二)如果监测值有变化则推送 - // 判断氧气浓度值是否有变化 - double lastValue = o2Dao.findLastValueByDevice(deviceId); - if (Math.abs(value - lastValue) > 0.01) { - // 将监测值推送至市级平台 + + // 2.5 插入监测数值 + o2Dao.addPblzRecord(value, TimeFormat.formatTimestamp(this.getTime().getTime()), deviceId); + + // 2.6 推送给市管廊公司平台 String o2Resp = DataPushInterface.addO2Data(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); logger.info("同步氧气浓度值结果:" + o2Resp); - } - - // (三)如果监测值有变化则推送 - // 每天小时各推送一个数据 - int minute = Calendar.getInstance().get(Calendar.MINUTE); - if (minute < 10) { - // 将监测值推送至市级平台 - String o2Resp = DataPushInterface.addO2Data(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); - logger.info("同步氧气浓度值结果:" + o2Resp); + + // 2.7 生成报警记录 + PgAlarm alarm = new PgAlarm().getO2AlarmInstance(); + + 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.addO2AlarmData(bjbh, zcbh, bjms, bjsj); + logger.info("同步氧气报警记录日志结果:" + jwbjResp); + + // 2.10 联动打开风机 + // 自动打开当前舱段的排风机,手动关闭风机 + // 首先找到当前舱段的排风机资产编号 + if (O2_ON_FJ == true) { + String baseURL = Configure.getProperty("sys", "PGDSC_API_URL"); + HttpRequest.sendGet(baseURL + "remote/turnOnFjReactAlarm.action", "zcbh=" + zcbh); + } + } else { + // 3 不需要报警,只处理监测值 + // 3.1 取出上一个监测值 + PgO2 lastRec = o2Dao.findLastRecordByDevice(deviceId); + + // 3.2 计算数值的时间间隔 + long valueTimeInterval = this.getTime().getTimeInMillis() - lastRec.getUptime().getTime(); + + // 3.3 判断条件:是否与原值相同且相距在一小时以内 + if (Math.abs(value - lastRec.getO2()) > 0.01 || valueTimeInterval > CLASS_RED_ALARM_INTERVAL) { + // 3.4 将数据存入数据库 + o2Dao.addPblzRecord(value, TimeFormat.formatTimestamp(this.getTime().getTime()), deviceId); + + // 3.5 推送给市管廊公司平台 + String o2Resp = DataPushInterface.addO2Data(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步氧气浓度值结果:" + o2Resp); + } } } else { logger.warn("未找到资产[" + zcbh + "]"); diff --git a/src/com/szpg/db/dao/PgAlarmDao.java b/src/com/szpg/db/dao/PgAlarmDao.java index 11d8a1d..4ab98d4 100644 --- a/src/com/szpg/db/dao/PgAlarmDao.java +++ b/src/com/szpg/db/dao/PgAlarmDao.java @@ -6,6 +6,7 @@ public int findAlarmCountByDate(String date); public PgAlarm findLatestAlarmByDevice(int deviceId); + public PgAlarm findLatestAlarmByDeviceAndType(int deviceId, String type); public long insertAlarmRecord(PgAlarm alarmRecord); } diff --git a/src/com/szpg/db/dao/PgCODao.java b/src/com/szpg/db/dao/PgCODao.java index 1664f51..5098321 100644 --- a/src/com/szpg/db/dao/PgCODao.java +++ b/src/com/szpg/db/dao/PgCODao.java @@ -20,6 +20,7 @@ public List findPblzByDeviceAndTm(Integer deviceid, String start, String end); public double findLastValueByDevice(Integer deviceid); + public PgCO findLastRecordByDevice(Integer id); public int addPblzRecord(PgCO ch4); public int addPblzRecord(float value, String tm, int deviceid); diff --git a/src/com/szpg/db/dao/PgCh4Dao.java b/src/com/szpg/db/dao/PgCh4Dao.java index e23b964..61fdfcd 100644 --- a/src/com/szpg/db/dao/PgCh4Dao.java +++ b/src/com/szpg/db/dao/PgCh4Dao.java @@ -20,6 +20,7 @@ public List findPblzByDeviceAndTm(Integer deviceid, String start, String end); public double findLastValueByDevice(Integer deviceid); + public PgCh4 findLastRecordByDevice(Integer deviceid); public int addPblzRecord(PgCh4 ch4); public int addPblzRecord(float value, String tm, int deviceid); diff --git a/src/com/szpg/db/dao/PgHSDao.java b/src/com/szpg/db/dao/PgHSDao.java index f89b044..0f0ee53 100644 --- a/src/com/szpg/db/dao/PgHSDao.java +++ b/src/com/szpg/db/dao/PgHSDao.java @@ -20,6 +20,7 @@ public List findPblzByDeviceAndTm(Integer deviceid, String start, String end); public double findLastValueByDevice(Integer deviceid); + public PgSH findLastRecordByDevice(Integer deviceid); public int addPblzRecord(PgSH hs); public int addPblzRecord(float value, String tm, int deviceid); diff --git a/src/com/szpg/db/dao/PgO2Dao.java b/src/com/szpg/db/dao/PgO2Dao.java index 0b3d0bf..678adab 100644 --- a/src/com/szpg/db/dao/PgO2Dao.java +++ b/src/com/szpg/db/dao/PgO2Dao.java @@ -20,6 +20,7 @@ public List findPblzByDeviceAndTm(Integer deviceid, String start, String end); public double findLastValueByDevice(Integer deviceid); + public PgO2 findLastRecordByDevice(Integer deviceid); public int addPblzRecord(PgO2 ch4); public int addPblzRecord(float value, String tm, int deviceid); diff --git a/src/com/szpg/db/dao/PgWsDao.java b/src/com/szpg/db/dao/PgWsDao.java index 370a83f..bfd0eed 100644 --- a/src/com/szpg/db/dao/PgWsDao.java +++ b/src/com/szpg/db/dao/PgWsDao.java @@ -21,6 +21,7 @@ public double findLastTempByDevice(Integer deviceid); public double findLastHumByDevice(Integer deviceid); + public PgTemphum findLastRecordByDevice(Integer deviceid); public int addWsdzRecord(PgTemphum wsdz); public int addWsdzRecord(float temp, float hum, String tm, int deviceid); diff --git a/src/com/szpg/db/dao/impl/PgAlarmDaoImpl.java b/src/com/szpg/db/dao/impl/PgAlarmDaoImpl.java index cedf5fc..ce9ee0f 100644 --- a/src/com/szpg/db/dao/impl/PgAlarmDaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgAlarmDaoImpl.java @@ -8,7 +8,6 @@ import org.apache.commons.dbutils.DbUtils; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.handlers.ArrayListHandler; -import org.apache.commons.dbutils.handlers.BeanListHandler; import org.apache.commons.dbutils.handlers.ScalarHandler; import org.apache.log4j.Logger; @@ -17,6 +16,9 @@ import com.szpg.db.util.ConnectionManager; import com.szpg.util.TimeFormat; +/** + * @author TAN YUE + */ public class PgAlarmDaoImpl implements PgAlarmDao { private final Logger logger = Logger.getLogger(this.getClass().getName()); @@ -33,7 +35,7 @@ QueryRunner runner = new QueryRunner(); param[0] = date; - int count = ((Number) runner.query(conn, sql, new ScalarHandler(1), param)).intValue(); + int count = (runner.query(conn, sql, new ScalarHandler(1), param)).intValue(); return count; } catch (Exception ex) { logger.error("根据日期查询报警记录数异常", ex); @@ -51,7 +53,7 @@ public PgAlarm findLatestAlarmByDevice(int deviceId) { Connection conn = null; String queryStr = "SELECT A.* FROM " + - "(SELECT ID, ACTIVE, ALARM_DATE, ALARM_VALUE, DESCRIPTION, ALARMDEVID, ALARMTYPEID, ALARM_GRADE FROM PG_ALARM WHERE ALARMDEVID = ? ORDER BY ALARM_DATE DESC) A " + + "(SELECT ID, ACTIVE, ALARM_DATE, ALARM_VALUE, DESCRIPTION, ALARMDEVID, ALARMTYPEID, ALARM_GRADE, LOG_TIME, LOG_DESC FROM PG_ALARM WHERE ALARMDEVID = ? ORDER BY ALARM_DATE DESC) A " + "WHERE ROWNUM <= 1"; Object[] param = new Object[1]; try { @@ -60,7 +62,7 @@ QueryRunner runner = new QueryRunner(); param[0] = deviceId; - List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler(), param); + List tempList = runner.query(conn, queryStr, new ArrayListHandler(), param); if (null != tempList && tempList.isEmpty() == false) { PgAlarm alarm = new PgAlarm(); Object[] item = tempList.get(0); @@ -79,6 +81,74 @@ alarm.setAlarmtypeid(((Number) item[6]).intValue()); alarm.setAlarm_grade((String) item[7]); + if (null != item[8]) { + long logTmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[8]).toJdbc()).getTime(); + Calendar logCal = Calendar.getInstance(); + logCal.setTimeInMillis(logTmValue); + alarm.setLog_time(logCal.getTime()); + } else { + alarm.setLog_time(null); + } + + alarm.setLog_desc((String) item[9]); + + logger.debug("根据设备查询最新报警记录成功"); + + return alarm; + } else { + return null; + } + } catch (Exception ex) { + logger.error("根据设备查询最新报警记录成功", ex); + return null; + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + } + + @Override + public PgAlarm findLatestAlarmByDeviceAndType(int deviceId, String type) { + Connection conn = null; + String queryStr = "SELECT A.* FROM " + + "(SELECT ID, ACTIVE, ALARM_DATE, ALARM_VALUE, DESCRIPTION, ALARMDEVID, ALARMTYPEID, ALARM_GRADE, LOG_TIME, LOG_DESC FROM PG_ALARM WHERE ALARMDEVID = ? AND DESCRIPTION LIKE ? ORDER BY ALARM_DATE DESC) A " + + "WHERE ROWNUM <= 1"; + Object[] param = new Object[2]; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + QueryRunner runner = new QueryRunner(); + param[0] = deviceId; + param[1] = "%" + type + "%"; + + List tempList = runner.query(conn, queryStr, new ArrayListHandler(), param); + if (null != tempList && tempList.isEmpty() == false) { + PgAlarm alarm = new PgAlarm(); + Object[] item = tempList.get(0); + + alarm.setId(((Number) item[0]).intValue()); + alarm.setActive(((Number) item[1]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + alarm.setAlarm_date(cal.getTime()); + + alarm.setAlarm_value((String) item[3]); + alarm.setDescription((String) item[4]); + alarm.setAlarmdevid(((Number) item[5]).intValue()); + alarm.setAlarmtypeid(((Number) item[6]).intValue()); + alarm.setAlarm_grade((String) item[7]); + + long logTmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[8]).toJdbc()).getTime(); + Calendar logCal = Calendar.getInstance(); + logCal.setTimeInMillis(logTmValue); + alarm.setLog_time(logCal.getTime()); + alarm.setLog_desc((String) item[9]); + logger.debug("根据设备查询最新报警记录成功"); return alarm; @@ -111,28 +181,31 @@ QueryRunner runner = new QueryRunner(); // 查询同一设备是否有正在报警的消息 - Number id = (Number) runner.query(conn, querySql, new ScalarHandler(1), queryParam); + Number id = runner.query(conn, querySql, new ScalarHandler(1), queryParam); if (null != id) { // 找到设备已存在的记录 // 1先将正在报警的设备自动消警 - String updateSql = "UPDATE PG_ALARM SET ACTIVE=0 WHERE ID=?"; + String updateSql = "UPDATE PG_ALARM SET ACTIVE=0, LOG_TIME=SYSDATE, LOG_DESC=? WHERE ID=?"; - Object[] updateParam = new Object[1]; - updateParam[0] = id.longValue(); - - runner.update(conn, updateSql, updateParam); // 更新报警记录 - } + Object[] updateParam = new Object[2]; + updateParam[0] = "重复报警自动消警"; + updateParam[1] = id.longValue(); + + // 更新报警记录 + runner.update(conn, updateSql, updateParam); + } // 插入新的报警记录 String insertSql = "INSERT INTO PG_ALARM " + - "(ID, ACTIVE, ALARM_DATE, ALARM_VALUE, DESCRIPTION, ALARMDEVID, ALARMTYPEID, USERID, ALARM_GRADE) " + - "VALUES (?, ?, TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), ?, ?, ?, ?, ?, ?)"; + "(ID, ACTIVE, ALARM_DATE, ALARM_VALUE, DESCRIPTION, ALARMDEVID, ALARMTYPEID, USERID, ALARM_GRADE, LOG_TIME, LOG_DESC) " + + "VALUES (?, ?, TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), ?, ?, ?, ?, ?, ?, TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), ?)"; String sqlId = "SELECT SEQ_PG_ALARM_ID.NEXTVAL FROM DUAL"; - long newId = ((Number) runner.query(conn, sqlId, new ScalarHandler(1))).longValue(); // 获取新的id - - Object[] params = new Object[9]; + // 获取新的id + long newId = (runner.query(conn, sqlId, new ScalarHandler(1))).longValue(); + + Object[] params = new Object[11]; params[0] = newId; params[1] = alarmRecord.getActive(); @@ -143,8 +216,11 @@ params[6] = alarmRecord.getAlarmtypeid(); params[7] = alarmRecord.getUserid(); params[8] = alarmRecord.getAlarm_grade(); - - int count = runner.update(conn, insertSql, params); // 新增主表 + params[9] = TimeFormat.formatTimestamp(alarmRecord.getLog_time()); + params[10] = alarmRecord.getLog_desc(); + + // 新增报警记录 + int count = runner.update(conn, insertSql, params); if (count > 0) { logger.debug("插入报警数据成功"); diff --git a/src/com/szpg/db/dao/impl/PgCODaoImpl.java b/src/com/szpg/db/dao/impl/PgCODaoImpl.java index 186ac16..70d672c 100644 --- a/src/com/szpg/db/dao/impl/PgCODaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgCODaoImpl.java @@ -292,6 +292,51 @@ } @Override + public PgCO findLastRecordByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT ID, CO, LOGTIME, PGDEVICEID FROM (SELECT * FROM PG_CO WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, sql, new ArrayListHandler(), param); + if (null != tempList && tempList.size() == 1) { + PgCO co = new PgCO(); + Object[] item = tempList.get(0); + + co.setId(((Number) item[0]).intValue()); + co.setCo(Float.parseFloat((String) item[1])); + co.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + co.setLogtime(cal.getTime()); + co.setUptime(cal.getTime()); + + logger.debug("根据设备ID查询最新一氧化碳监测记录成功" + co + "]"); + + return co; + } else { + return null; + } + } catch (Exception ex) { + logger.error("根据设备ID查询最新一氧化碳监测记录异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override public int addPblzRecord(PgCO co) { return addPblzRecord(co.getCo(), co.getTmStr(), co.getPgdeviceid()); } diff --git a/src/com/szpg/db/dao/impl/PgCh4DaoImpl.java b/src/com/szpg/db/dao/impl/PgCh4DaoImpl.java index 0ed139e..768b6a5 100644 --- a/src/com/szpg/db/dao/impl/PgCh4DaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgCh4DaoImpl.java @@ -54,9 +54,9 @@ list.add(ch4); } return list; - } - else + } else { return null; + } } catch (Exception ex) { logger.error("查询所有甲烷监测值异常", ex); } finally { @@ -100,9 +100,9 @@ logger.debug("根据ID查询甲烷监测值成功" + ch4 + "]"); return ch4; - } - else + } else { return null; + } } catch (Exception ex) { logger.error("根据ID查询甲烷监测值异常", ex); } finally { @@ -149,9 +149,9 @@ logger.debug("根据设备ID查询最新的甲烷监测值成功" + ch4 + "]"); return ch4; - } - else + } else { return null; + } } catch (Exception ex) { logger.error("根据设备ID查询最新的甲烷监测值异常", ex); } finally { @@ -199,9 +199,9 @@ list.add(ch4); } return list; - } - else + } else { return null; + } } catch (Exception ex) { logger.error("根据设备ID查询甲烷监测值异常", ex); } finally { @@ -251,9 +251,9 @@ list.add(ch4); } return list; - } - else + } else { return null; + } } catch (Exception ex) { logger.error("根据设备ID和时间查询甲烷监测值异常", ex); } finally { @@ -293,6 +293,51 @@ } @Override + public PgCh4 findLastRecordByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT ID, CH4, LOGTIME, PGDEVICEID FROM (SELECT * FROM PG_CH4 WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, sql, new ArrayListHandler(), param); + if (null != tempList && tempList.size() == 1) { + PgCh4 ch4 = new PgCh4(); + Object[] item = tempList.get(0); + + ch4.setId(((Number) item[0]).intValue()); + ch4.setCh4(Float.parseFloat((String) item[1])); + ch4.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + ch4.setLogtime(cal.getTime()); + ch4.setUptime(cal.getTime()); + + logger.debug("根据设备ID查询最新甲烷监测记录成功" + ch4 + "]"); + + return ch4; + } else { + return null; + } + } catch (Exception ex) { + logger.error("根据设备ID查询最新甲烷监测记录异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override public int addPblzRecord(PgCh4 ch4) { return addPblzRecord(ch4.getCh4(), ch4.getTmStr(), ch4.getPgdeviceid()); } diff --git a/src/com/szpg/db/dao/impl/PgHSDaoImpl.java b/src/com/szpg/db/dao/impl/PgHSDaoImpl.java index 892e175..fa4ea02 100644 --- a/src/com/szpg/db/dao/impl/PgHSDaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgHSDaoImpl.java @@ -292,6 +292,51 @@ } @Override + public PgSH findLastRecordByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT ID, SH, LOGTIME, PGDEVICEID FROM (SELECT * FROM PG_SH WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, sql, new ArrayListHandler(), param); + if (null != tempList && tempList.size() == 1) { + PgSH sh = new PgSH(); + Object[] item = tempList.get(0); + + sh.setId(((Number) item[0]).intValue()); + sh.setSh(Float.parseFloat((String) item[1])); + sh.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + sh.setLogtime(cal.getTime()); + sh.setUptime(cal.getTime()); + + logger.debug("根据设备ID查询最新硫化氢监测记录成功" + sh + "]"); + + return sh; + } else { + return null; + } + } catch (Exception ex) { + logger.error("根据设备ID查询最新硫化氢监测记录异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override public int addPblzRecord(PgSH sh) { return addPblzRecord(sh.getSh(), sh.getTmStr(), sh.getPgdeviceid()); } diff --git a/src/com/szpg/db/dao/impl/PgO2DaoImpl.java b/src/com/szpg/db/dao/impl/PgO2DaoImpl.java index f58f8cd..842291b 100644 --- a/src/com/szpg/db/dao/impl/PgO2DaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgO2DaoImpl.java @@ -54,9 +54,9 @@ list.add(o2); } return list; - } - else + } else { return null; + } } catch (Exception ex) { logger.error("查询所有氧气监测值异常", ex); } finally { @@ -100,9 +100,9 @@ logger.debug("根据ID查询氧气监测值成功" + o2 + "]"); return o2; - } - else + } else { return null; + } } catch (Exception ex) { logger.error("根据ID查询氧气监测值异常", ex); } finally { @@ -148,9 +148,9 @@ logger.debug("根据设备ID查询最新的氧气监测值成功" + o2 + "]"); return o2; - } - else + } else { return null; + } } catch (Exception ex) { logger.error("根据设备ID查询最新的硫化氢监测值异常", ex); } finally { @@ -198,9 +198,9 @@ list.add(o2); } return list; - } - else + } else { return null; + } } catch (Exception ex) { logger.error("根据设备ID查询氧气监测值异常", ex); } finally { @@ -250,9 +250,9 @@ list.add(o2); } return list; - } - else + } else { return null; + } } catch (Exception ex) { logger.error("根据设备ID和时间查询氧气监测值异常", ex); } finally { @@ -292,6 +292,51 @@ } @Override + public PgO2 findLastRecordByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT ID, O2, LOGTIME, PGDEVICEID FROM (SELECT * FROM PG_O2 WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, sql, new ArrayListHandler(), param); + if (null != tempList && tempList.size() == 1) { + PgO2 o2 = new PgO2(); + Object[] item = tempList.get(0); + + o2.setId(((Number) item[0]).intValue()); + o2.setO2(Float.parseFloat((String) item[1])); + o2.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + o2.setLogtime(cal.getTime()); + o2.setUptime(cal.getTime()); + + logger.debug("根据设备ID查询最新氧气监测记录成功" + o2 + "]"); + + return o2; + } else { + return null; + } + } catch (Exception ex) { + logger.error("根据设备ID查询最新氧气监测记录异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override public int addPblzRecord(PgO2 o2) { return addPblzRecord(o2.getO2(), o2.getTmStr(), o2.getPgdeviceid()); } @@ -316,10 +361,11 @@ QueryRunner runner = new QueryRunner(); int count = runner.update(conn, insertStr, params); - if (count > 0) + if (count > 0) { logger.debug("插入氧气监测值成功[tm=" + tm + ", value=" + value + ", deviceid=" + deviceid + "]"); - else + } else { logger.error("插入氧气监测值失败!"); + } return count; } catch (Exception ex) { diff --git a/src/com/szpg/db/dao/impl/PgWsDaoImpl.java b/src/com/szpg/db/dao/impl/PgWsDaoImpl.java index 679b58f..77925f7 100644 --- a/src/com/szpg/db/dao/impl/PgWsDaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgWsDaoImpl.java @@ -323,6 +323,52 @@ } @Override + public PgTemphum findLastRecordByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT ID, TEMP, HUM, LOGTIME, PGDEVICEID FROM (SELECT * FROM PG_TEMPHUM WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, sql, new ArrayListHandler(), param); + if (null != tempList && tempList.size() == 1) { + PgTemphum temphum = new PgTemphum(); + Object[] item = tempList.get(0); + + temphum.setId(((Number) item[0]).intValue()); + temphum.setTemp(Float.parseFloat((String) item[1])); + temphum.setHum(Float.parseFloat((String) item[2])); + temphum.setPgdeviceid(((Number) item[4]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + temphum.setLogtime(cal.getTime()); + temphum.setUptime(cal.getTime()); + + logger.debug("根据设备ID查询最新温湿度监测记录成功" + temphum + "]"); + + return temphum; + } else { + return null; + } + } catch (Exception ex) { + logger.error("根据设备ID查询最新温湿度监测记录异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override public int addWsdzRecord(PgTemphum ws) { return addWsdzRecord(ws.getTemp(), ws.getHum(), ws.getTmStr(), ws.getPgdeviceid()); } diff --git a/src/com/szpg/db/data/PgAlarm.java b/src/com/szpg/db/data/PgAlarm.java index 5a73ba9..4b97e6a 100644 --- a/src/com/szpg/db/data/PgAlarm.java +++ b/src/com/szpg/db/data/PgAlarm.java @@ -1,9 +1,12 @@ package com.szpg.db.data; -import java.util.Date; - import com.szpg.util.TimeFormat; +import java.util.Date; + +/** + * @author TAN YUE + */ public class PgAlarm implements java.io.Serializable { /** @@ -20,11 +23,28 @@ private Integer alarmtypeid; private Integer userid; private String alarm_grade; - - public static Integer ALARM_TYPE_DEVRUN = 1; //管廊设备运行故障 - public static Integer ALARM_TYPE_PGRUN = 2; //管廊运行环境报警 - public static Integer ALARM_TYPE_PGSAF = 3; //管廊安全防范报警 - public static Integer ALARM_TYPE_INPG = 4; //人员入廊超时报警 + private Date log_time; + private String log_desc; + + /** + * 管廊设备运行故障 + */ + public static Integer ALARM_TYPE_DEVRUN = 1; + + /** + * 管廊运行环境报警 + */ + public static Integer ALARM_TYPE_PGRUN = 2; + + /** + * 管廊安全防范报警 + */ + public static Integer ALARM_TYPE_PGSAF = 3; + + /** + * 人员入廊超时报警 + */ + public static Integer ALARM_TYPE_INPG = 4; public Integer getId() { return id; @@ -97,10 +117,130 @@ public void setAlarm_grade(String alarm_grade) { this.alarm_grade = alarm_grade; } + + public Date getLog_time() { + if (null == log_time) { + return alarm_date; + } + return log_time; + } + + public void setLog_time(Date log_time) { + this.log_time = log_time; + } + + public String getLog_desc() { + return log_desc; + } + + public void setLog_desc(String log_desc) { + this.log_desc = log_desc; + } @Override public String toString() { return "PgAlarm[alarmValue=" + alarm_value + ", alarmDate=" + TimeFormat.formatTimestamp(alarm_date) + ", alarmDevId= " + alarmdevid + "]"; } + /** + * 生成氧气报警记录 + * @return + */ + public PgAlarm getO2AlarmInstance() { + PgAlarm alarm = new PgAlarm(); + alarm.setActive(1); + alarm.setAlarmtypeid(PgAlarm.ALARM_TYPE_PGRUN); + alarm.setDescription("氧气浓度低于低限阈值"); + alarm.setUserid(null); + + // 氧气报警定义为一级报警 + alarm.setAlarm_grade("一级报警"); + + return alarm; + } + + /** + * 生成一氧化碳报警记录 + * @return + */ + public PgAlarm getCOAlarmInstance() { + PgAlarm alarm = new PgAlarm(); + alarm.setActive(1); + alarm.setAlarmtypeid(PgAlarm.ALARM_TYPE_PGRUN); + alarm.setDescription("一氧化碳浓度超过高限阈值"); + alarm.setUserid(null); + + // 一氧化碳报警定义为一级报警 + alarm.setAlarm_grade("一级报警"); + + return alarm; + } + + /** + * 生成硫化氢报警记录 + * @return + */ + public PgAlarm getHSAlarmInstance() { + PgAlarm alarm = new PgAlarm(); + alarm.setActive(1); + alarm.setAlarmtypeid(PgAlarm.ALARM_TYPE_PGRUN); + alarm.setDescription("硫化氢浓度超过高限阈值"); + alarm.setUserid(null); + + // 硫化氢报警定义为一级报警 + alarm.setAlarm_grade("一级报警"); + + return alarm; + } + + /** + * 生成甲烷报警记录 + * @return + */ + public PgAlarm getCH4AlarmInstance() { + PgAlarm alarm = new PgAlarm(); + alarm.setActive(1); + alarm.setAlarmtypeid(PgAlarm.ALARM_TYPE_PGRUN); + alarm.setDescription("甲烷浓度超过高限阈值"); + alarm.setUserid(null); + + // 甲烷报警定义为二级报警 + alarm.setAlarm_grade("二级报警"); + + return alarm; + } + + /** + * 生成温度报警记录 + * @return + */ + public PgAlarm getTempAlarmInstance() { + PgAlarm alarm = new PgAlarm(); + alarm.setActive(1); + alarm.setAlarmtypeid(PgAlarm.ALARM_TYPE_PGRUN); + alarm.setDescription("温度超过高限阈值"); + alarm.setUserid(null); + + // 温度定义为二级报警 + alarm.setAlarm_grade("二级报警"); + + return alarm; + } + + /** + * 生成湿度报警记录 + * @return + */ + public PgAlarm getHumAlarmInstance() { + PgAlarm alarm = new PgAlarm(); + alarm.setActive(1); + alarm.setAlarmtypeid(PgAlarm.ALARM_TYPE_PGRUN); + alarm.setDescription("湿度超过高限阈值"); + alarm.setUserid(null); + + // 湿度报警定义为二级报警 + alarm.setAlarm_grade("二级报警"); + + return alarm; + } } diff --git a/src/com/szpg/plc/message/response/read/ReadCH4ValueCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadCH4ValueCommandResponse.java index c26ffa5..13c5968 100644 --- a/src/com/szpg/plc/message/response/read/ReadCH4ValueCommandResponse.java +++ b/src/com/szpg/plc/message/response/read/ReadCH4ValueCommandResponse.java @@ -4,6 +4,7 @@ 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; @@ -25,6 +26,9 @@ import com.szpg.util.NumberFormat; import com.szpg.util.TimeFormat; +/** + * @author TAN YUE + */ public class ReadCH4ValueCommandResponse extends ReadMemoryCommandResponse { /** @@ -33,10 +37,24 @@ private static final long serialVersionUID = 8081222348890587881L; private final Logger logger = Logger.getLogger(this.getClass().getName()); - - private List jwnd; //甲烷浓度值 - private List jwldbjz; //甲烷联动报警值 - private String[] zcList; //甲烷监测的资产列表,从配置文件中获取 + + /** + * 甲烷浓度值 + */ + private List jwnd; + + /** + * 甲烷联动报警值 + */ + private List jwldbjz; + + /** + * 甲烷监测的资产列表,从配置文件中获取 + */ + private String[] zcList; + + private boolean CH4_ON_FJ = false; + private long CLASS_YELLOW_ALARM_INTERVAL = 360 * 60 * 1000L; public ReadCH4ValueCommandResponse() { jwnd = new ArrayList(); @@ -74,94 +92,108 @@ 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) { - ch4Dao.addPblzRecord(jwnd.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), deviceId); - - // (一)如果有报警则立即推送 - // 判断是否超过报警阈值 + // 1 取出报警规则 PgAlarmRule rule = ruleDao.findRuleByDevice(deviceId); + + // 默认的报警阈值 + double high = 0.0; if (null != rule) { - double high = 0.0; try { high = NumberFormat.parseDouble(rule.getHighvalue(), "0.00"); } catch (Exception ex) { logger.error(ex); ex.printStackTrace(); } - - // 甲烷浓度超过高限阈值 - if (high > 0.0001 && value > high) { - PgAlarm alarm = new PgAlarm(); - alarm.setActive(1); - alarm.setAlarm_date(this.getTime().getTime()); - alarm.setAlarm_value(NumberFormat.format(value, "0.00")); - alarm.setAlarmdevid(deviceId); - alarm.setAlarmtypeid(PgAlarm.ALARM_TYPE_PGRUN); - alarm.setDescription("甲烷浓度超过高限阈值"); - alarm.setUserid(null); - // 甲烷报警定义为二级报警 - alarm.setAlarm_grade("二级报警"); - - alarmDao.insertAlarmRecord(alarm); - deviceDao.updateDeviceStatus(deviceId, "甲烷浓度过高"); - - // 将报警日志推送至市级平台 - 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); - - // 将报警值推送至市级平台 - String jwResp = DataPushInterface.addCH4Data(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); - logger.info("同步甲烷浓度值结果:" + jwResp); + } - // 自动打开当前舱段的排风机,手动关闭风机 - // 首先找到当前舱段的排风机资产编号 - if (Boolean.valueOf(Configure.getProperty("sys", "CH4_ON_FJ", "false")) == true) { - String acucode = zcbh.substring(0, zcbh.indexOf(".", 6)); - String cabin = zcbh.substring(zcbh.lastIndexOf(".") + 1, zcbh.lastIndexOf(".") + 2); - List fjs = deviceDao.findDeviceByPositionAndType(acucode, "F", cabin); - if (null != fjs && fjs.isEmpty() == false) { - String baseURL = Configure.getProperty("sys", "PGDSC_API_URL"); - for (PgDevice fj : fjs) { - String fjzcbh = fj.getAssetcode(); + // 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(); - // 调用远程接口启动风机 - HttpRequest.sendGet(baseURL + "remote/turnOnFj.action", "zcbh=" + fjzcbh); - } - } + // 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; } } - } - - // (二)如果监测值有变化则推送 - // 判断甲烷浓度值是否有变化 - double lastValue = ch4Dao.findLastValueByDevice(deviceId); - if (Math.abs(value - lastValue) > 0.01) { - // 将监测值推送至市级平台 + + // 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); - } - - // (三)如果监测值有变化则推送 - // 每天小时各推送一个数据 - int minute = Calendar.getInstance().get(Calendar.MINUTE); - if (minute < 10) { - // 将监测值推送至市级平台 - 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 + "]"); diff --git a/src/com/szpg/plc/message/response/read/ReadCOValueCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadCOValueCommandResponse.java index 1920b62..0b27d03 100644 --- a/src/com/szpg/plc/message/response/read/ReadCOValueCommandResponse.java +++ b/src/com/szpg/plc/message/response/read/ReadCOValueCommandResponse.java @@ -4,6 +4,8 @@ import java.util.Calendar; import java.util.List; +import com.szpg.db.data.PgCO; +import com.szpg.util.*; import org.apache.commons.lang3.StringUtils; import org.apache.log4j.Logger; @@ -18,11 +20,10 @@ import com.szpg.db.data.PgAlarm; import com.szpg.db.data.PgAlarmRule; import com.szpg.plc.message.response.ReadMemoryCommandResponse; -import com.szpg.util.Configure; -import com.szpg.util.DataPushInterface; -import com.szpg.util.NumberFormat; -import com.szpg.util.TimeFormat; +/** + * @author TAN YUE + */ public class ReadCOValueCommandResponse extends ReadMemoryCommandResponse { /** @@ -31,10 +32,24 @@ private static final long serialVersionUID = -6176747812714170040L; private final Logger logger = Logger.getLogger(this.getClass().getName()); - - private List cond; //一氧化碳浓度值 - private List coldbjz; //一氧化碳联动报警值 - private String[] zcList; //一氧化碳监测的资产列表,从配置文件中获取 + + /** + * 一氧化碳浓度值 + */ + private List cond; + + /** + * 一氧化碳联动报警值 + */ + private List coldbjz; + + /** + * 一氧化碳监测的资产列表,从配置文件中获取 + */ + private String[] zcList; + + private boolean CO_ON_FJ = false; + private long CLASS_RED_ALARM_INTERVAL = 60 * 60 * 1000L; public ReadCOValueCommandResponse() { cond = new ArrayList(); @@ -72,80 +87,108 @@ 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 = cond.get(i); - + int deviceId = deviceDao.findDeviceIdByCode(zcbh); if (deviceId > 0) { - coDao.addPblzRecord(cond.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), deviceId); - - // (一)如果有报警则立即推送 - // 判断是否超过报警阈值 + // 1 取出报警规则 PgAlarmRule rule = ruleDao.findRuleByDevice(deviceId); + + // 默认的报警阈值 + double high = 0.0; if (null != rule) { - double high = 0.0; try { high = NumberFormat.parseDouble(rule.getHighvalue(), "0.00"); } catch (Exception ex) { logger.error(ex); ex.printStackTrace(); } - - // 一氧化碳浓度超过高限阈值 - if (high > 0.0001 && value > high) { - PgAlarm alarm = new PgAlarm(); - alarm.setActive(1); - alarm.setAlarm_date(this.getTime().getTime()); - alarm.setAlarm_value(NumberFormat.format(value, "0.00")); - alarm.setAlarmdevid(deviceId); - alarm.setAlarmtypeid(PgAlarm.ALARM_TYPE_PGRUN); - alarm.setDescription("一氧化碳浓度超过高限阈值"); - alarm.setUserid(null); - // 一氧化碳报警定义为一级报警 - alarm.setAlarm_grade("一级报警"); - - alarmDao.insertAlarmRecord(alarm); - deviceDao.updateDeviceStatus(deviceId, "一氧化碳浓度过高"); - - // 将报警日志推送至市级平台 - 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.addCOAlarmData(bjbh, zcbh, bjms, bjsj); - logger.info("同步一氧化碳报警记录日志结果:" + jwbjResp); - - // 将报警值推送至市级平台 - String jwResp = DataPushInterface.addCOData(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); - logger.info("同步一氧化碳浓度值结果:" + jwResp); + } - // 一氧化碳不需要联动控制风机 + // 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_RED_ALARM_INTERVAL) { + continue; + } } - } - - - // (二)如果监测值有变化则推送 - // 判断一氧化碳浓度值是否有变化 - double lastValue = coDao.findLastValueByDevice(deviceId); - if (Math.abs(value - lastValue) > 0.01) { - // 将监测值推送至市级平台 + + // 2.5 插入监测数值 + coDao.addPblzRecord(value, TimeFormat.formatTimestamp(this.getTime().getTime()), deviceId); + + // 2.6 推送给市管廊公司平台 String coResp = DataPushInterface.addCOData(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); logger.info("同步一氧化碳浓度值结果:" + coResp); - } - - // (三)如果监测值有变化则推送 - // 每天小时各推送一个数据 - int minute = Calendar.getInstance().get(Calendar.MINUTE); - if (minute < 10) { - // 将监测值推送至市级平台 - String coResp = DataPushInterface.addCOData(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); - logger.info("同步一氧化碳浓度值结果:" + coResp); + + // 2.7 生成报警记录 + PgAlarm alarm = new PgAlarm().getCOAlarmInstance(); + + 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.addCOAlarmData(bjbh, zcbh, bjms, bjsj); + logger.info("同步一氧化碳报警记录日志结果:" + jwbjResp); + + // 2.10 联动打开风机 + // 自动打开当前舱段的排风机,手动关闭风机 + // 首先找到当前舱段的排风机资产编号 + if (CO_ON_FJ == true) { + String baseURL = Configure.getProperty("sys", "PGDSC_API_URL"); + HttpRequest.sendGet(baseURL + "remote/turnOnFjReactAlarm.action", "zcbh=" + zcbh); + } + } else { + // 3 不需要报警,只处理监测值 + // 3.1 取出上一个监测值 + PgCO lastRec = coDao.findLastRecordByDevice(deviceId); + + // 3.2 计算数值的时间间隔 + long valueTimeInterval = this.getTime().getTimeInMillis() - lastRec.getUptime().getTime(); + + // 3.3 判断条件:是否与原值相同且相距在一小时以内 + if (Math.abs(value - lastRec.getCo()) > 0.01 || valueTimeInterval > CLASS_RED_ALARM_INTERVAL) { + // 3.4 将数据存入数据库 + coDao.addPblzRecord(value, TimeFormat.formatTimestamp(this.getTime().getTime()), deviceId); + + // 3.5 推送给市管廊公司平台 + String coResp = DataPushInterface.addCOData(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步一氧化碳浓度值结果:" + coResp); + } } } else { logger.warn("未找到资产[" + zcbh + "]"); diff --git a/src/com/szpg/plc/message/response/read/ReadHSValueCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadHSValueCommandResponse.java index 3b8f2f6..1980827 100644 --- a/src/com/szpg/plc/message/response/read/ReadHSValueCommandResponse.java +++ b/src/com/szpg/plc/message/response/read/ReadHSValueCommandResponse.java @@ -4,6 +4,7 @@ import java.util.Calendar; import java.util.List; +import com.szpg.db.data.PgSH; import org.apache.commons.lang3.StringUtils; import org.apache.log4j.Logger; @@ -25,6 +26,9 @@ import com.szpg.util.NumberFormat; import com.szpg.util.TimeFormat; +/** + * @author TAN YUE + */ public class ReadHSValueCommandResponse extends ReadMemoryCommandResponse { /** @@ -33,10 +37,24 @@ private static final long serialVersionUID = -3864512113984510244L; private final Logger logger = Logger.getLogger(this.getClass().getName()); - - private List hsnd; //硫化氢浓度值 - private List hsldbjz; //硫化氢联动报警值 - private String[] zcList; // 监测设备资产列表,从配置文件中获取 + + /** + * 硫化氢浓度值 + */ + private List hsnd; + + /** + * 硫化氢联动报警值 + */ + private List hsldbjz; + + /** + * 监测设备资产列表,从配置文件中获取 + */ + private String[] zcList; + + private boolean HS_ON_FJ = false; + private long CLASS_RED_ALARM_INTERVAL = 60 * 60 * 1000L; public ReadHSValueCommandResponse() { hsnd = new ArrayList(); @@ -74,94 +92,108 @@ 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 = hsnd.get(i); - + int deviceId = deviceDao.findDeviceIdByCode(zcbh); if (deviceId > 0) { - hsDao.addPblzRecord(hsnd.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), deviceId); - - // (一)如果有报警则立即推送 - // 判断是否超过报警阈值 + // 1 取出报警规则 PgAlarmRule rule = ruleDao.findRuleByDevice(deviceId); + + // 默认的报警阈值 + double high = 0.0; if (null != rule) { - double high = 0.0; try { high = NumberFormat.parseDouble(rule.getHighvalue(), "0.00"); } catch (Exception ex) { logger.error(ex); ex.printStackTrace(); } - - // 一氧化碳浓度超过高限阈值 - if (high > 0.0001 && value > high) { - PgAlarm alarm = new PgAlarm(); - alarm.setActive(1); - alarm.setAlarm_date(this.getTime().getTime()); - alarm.setAlarm_value(NumberFormat.format(value, "0.00")); - alarm.setAlarmdevid(deviceId); - alarm.setAlarmtypeid(PgAlarm.ALARM_TYPE_PGRUN); - alarm.setDescription("硫化氢浓度超过高限阈值"); - alarm.setUserid(null); - // 硫化氢报警定义为一级报警 - alarm.setAlarm_grade("一级报警"); - - alarmDao.insertAlarmRecord(alarm); - deviceDao.updateDeviceStatus(deviceId, "硫化氢浓度过高"); - - // 将报警日志推送至市级平台 - 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.addHSAlarmData(bjbh, zcbh, bjms, bjsj); - logger.info("同步硫化氢报警记录日志结果:" + jwbjResp); - - // 将报警值推送至市级平台 - String jwResp = DataPushInterface.addHSData(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); - logger.info("同步硫化氢浓度值结果:" + jwResp); - - // 自动打开当前舱段的排风机,手动关闭风机 - // 首先找到当前舱段的排风机资产编号 - if (Boolean.valueOf(Configure.getProperty("sys", "HS_ON_FJ", "false")) == true) { - String acucode = zcbh.substring(0, zcbh.indexOf(".", 6)); - String cabin = zcbh.substring(zcbh.lastIndexOf(".") + 1, zcbh.lastIndexOf(".") + 2); - List fjs = deviceDao.findDeviceByPositionAndType(acucode, "F", cabin); - if (null != fjs && fjs.isEmpty() == false) { - String baseURL = Configure.getProperty("sys", "PGDSC_API_URL"); - for (PgDevice fj : fjs) { - String fjzcbh = fj.getAssetcode(); + } - // 调用远程接口启动风机 - HttpRequest.sendGet(baseURL + "remote/turnOnFj.action", "zcbh=" + fjzcbh); - } - } + // 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_RED_ALARM_INTERVAL) { + continue; } } - } - - // (二)如果监测值有变化则推送 - // 判断硫化氢浓度值是否有变化 - double lastValue = hsDao.findLastValueByDevice(deviceId); - if (Math.abs(value - lastValue) > 0.01) { - // 将监测值推送至市级平台 - String coResp = DataPushInterface.addHSData(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); - logger.info("同步硫化氢浓度值结果:" + coResp); - } - - // (三)如果监测值没有变化 - // 每天小时各推送一个数据 - int minute = Calendar.getInstance().get(Calendar.MINUTE); - if (minute < 10) { - // 将监测值推送至市级平台 - String coResp = DataPushInterface.addHSData(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); - logger.info("同步硫化氢浓度值结果:" + coResp); + + // 2.5 插入监测数值 + hsDao.addPblzRecord(value, TimeFormat.formatTimestamp(this.getTime().getTime()), deviceId); + + // 2.6 推送给市管廊公司平台 + String hsResp = DataPushInterface.addHSData(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步硫化氢浓度值结果:" + hsResp); + + // 2.7 生成报警记录 + PgAlarm alarm = new PgAlarm().getHSAlarmInstance(); + + 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 hsbjResp = DataPushInterface.addHSAlarmData(bjbh, zcbh, bjms, bjsj); + logger.info("同步硫化氢报警记录日志结果:" + hsbjResp); + + // 2.10 联动打开风机 + // 自动打开当前舱段的排风机,手动关闭风机 + // 首先找到当前舱段的排风机资产编号 + if (HS_ON_FJ == true) { + String baseURL = Configure.getProperty("sys", "PGDSC_API_URL"); + HttpRequest.sendGet(baseURL + "remote/turnOnFjReactAlarm.action", "zcbh=" + zcbh); + } + } else { + // 3 不需要报警,只处理监测值 + // 3.1 取出上一个监测值 + PgSH lastRec = hsDao.findLastRecordByDevice(deviceId); + + // 3.2 计算数值的时间间隔 + long valueTimeInterval = this.getTime().getTimeInMillis() - lastRec.getUptime().getTime(); + + // 3.3 判断条件:是否与原值相同且相距在一小时以内 + if (Math.abs(value - lastRec.getSh()) > 0.01 || valueTimeInterval > CLASS_RED_ALARM_INTERVAL) { + // 3.4 将数据存入数据库 + hsDao.addPblzRecord(value, TimeFormat.formatTimestamp(this.getTime().getTime()), deviceId); + + // 3.5 推送给市管廊公司平台 + String hsResp = DataPushInterface.addHSData(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步硫化氢浓度值结果:" + hsResp); + } } } else { logger.warn("未找到资产[" + zcbh + "]"); diff --git a/src/com/szpg/plc/message/response/read/ReadO2ValueCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadO2ValueCommandResponse.java index 822beda..ebeb051 100644 --- a/src/com/szpg/plc/message/response/read/ReadO2ValueCommandResponse.java +++ b/src/com/szpg/plc/message/response/read/ReadO2ValueCommandResponse.java @@ -1,12 +1,5 @@ package com.szpg.plc.message.response.read; -import java.util.ArrayList; -import java.util.Calendar; -import java.util.List; - -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.PgDeviceDao; @@ -17,14 +10,19 @@ import com.szpg.db.dao.impl.PgO2DaoImpl; import com.szpg.db.data.PgAlarm; import com.szpg.db.data.PgAlarmRule; -import com.szpg.db.data.PgDevice; +import com.szpg.db.data.PgO2; 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; +import com.szpg.util.*; +import org.apache.commons.lang3.StringUtils; +import org.apache.log4j.Logger; +import java.util.ArrayList; +import java.util.List; + +/** + * 读取氧气值指令的响应消息 + * @author TAN YUE + */ public class ReadO2ValueCommandResponse extends ReadMemoryCommandResponse { /** @@ -33,14 +31,31 @@ private static final long serialVersionUID = -2816512676498637196L; private final Logger logger = Logger.getLogger(this.getClass().getName()); - - private List o2nd; // 氧气浓度值 - private List o2ldbjz; // 氧气联动报警值 - private String[] zcList; // 氧气监测设备资产列表,从配置文件中获取 + + /** + * 氧气浓度值 + */ + private List o2nd; + + /** + * 氧气联动报警值 + */ + private List o2ldbjz; + + /** + * 氧气监测设备资产列表,从配置文件中获取 + */ + private String[] zcList; + + private boolean O2_ON_FJ = false; + private long CLASS_RED_ALARM_INTERVAL = 60 * 60 * 1000L; public ReadO2ValueCommandResponse() { o2nd = new ArrayList(); o2ldbjz = new ArrayList(); + + O2_ON_FJ = Boolean.valueOf(Configure.getProperty("sys", "O2_ON_FJ", "false")); + CLASS_RED_ALARM_INTERVAL = Integer.parseInt(Configure.getProperty("sys", "CLASS_RED_ALARM_INTERVAL", "60")) * 60 * 1000L; } public List getO2nd() { @@ -78,90 +93,104 @@ if (null != zcList && zcList.length > 0) { // 遍历氧气设备列表,将氧气浓度监测值存入数据库 for (int i = 0; i < zcList.length; i++) { + // 资产编号(设备编号) String zcbh = zcList[i]; - + + // 监测值 float value = o2nd.get(i); int deviceId = deviceDao.findDeviceIdByCode(zcbh); if (deviceId > 0) { - o2Dao.addPblzRecord(o2nd.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), deviceId); - - // (一)如果有报警则立即推送 - // 判断是否超过报警阈值 + // 1 取出报警规则 PgAlarmRule rule = ruleDao.findRuleByDevice(deviceId); + + // 默认的报警阈值 + double low = 18.0; if (null != rule) { - double low = 0.0; try { low = NumberFormat.parseDouble(rule.getLowvalue(), "0.00"); } catch (Exception ex) { logger.error(ex); ex.printStackTrace(); } - - // 氧气浓度低于低限阈值 - if (low > 0.0001 && value < low) { - PgAlarm alarm = new PgAlarm(); - alarm.setActive(1); - alarm.setAlarm_date(this.getTime().getTime()); - alarm.setAlarm_value(NumberFormat.format(value, "0.00")); - alarm.setAlarmdevid(deviceId); - alarm.setAlarmtypeid(PgAlarm.ALARM_TYPE_PGRUN); - alarm.setDescription("氧气浓度低于低限阈值"); - alarm.setUserid(null); - // 氧气报警定义为一级报警 - alarm.setAlarm_grade("一级报警"); - - alarmDao.insertAlarmRecord(alarm); - deviceDao.updateDeviceStatus(deviceId, "氧气浓度过低"); - - // 将报警日志推送至市级平台 - 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.addO2AlarmData(bjbh, zcbh, bjms, bjsj); - logger.info("同步氧气报警记录日志结果:" + jwbjResp); - - // 将报警值推送至市级平台 - String jwResp = DataPushInterface.addO2Data(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); - logger.info("同步氧气浓度值结果:" + jwResp); - - // 自动打开当前舱段的排风机,手动关闭风机 - // 首先找到当前舱段的排风机资产编号 - if (Boolean.valueOf(Configure.getProperty("sys", "O2_ON_FJ", "false")) == true) { - String acucode = zcbh.substring(0, zcbh.indexOf(".", 6)); - String cabin = zcbh.substring(zcbh.lastIndexOf(".") + 1, zcbh.lastIndexOf(".") + 2); - List fjs = deviceDao.findDeviceByPositionAndType(acucode, "F", cabin); - if (null != fjs && fjs.isEmpty() == false) { - String baseURL = Configure.getProperty("sys", "PGDSC_API_URL"); - for (PgDevice fj : fjs) { - String fjzcbh = fj.getAssetcode(); + } - // 调用远程接口启动风机 - HttpRequest.sendGet(baseURL + "remote/turnOnFj.action", "zcbh=" + fjzcbh); - } - } + // 1 判断是否报警 + if (low > 0.0001 && value < low) { + // 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_RED_ALARM_INTERVAL) { + continue; } } - } - - // (二)如果监测值有变化则推送 - // 判断氧气浓度值是否有变化 - double lastValue = o2Dao.findLastValueByDevice(deviceId); - if (Math.abs(value - lastValue) > 0.01) { - // 将监测值推送至市级平台 + + // 2.5 插入监测数值 + o2Dao.addPblzRecord(value, TimeFormat.formatTimestamp(this.getTime().getTime()), deviceId); + + // 2.6 推送给市管廊公司平台 String o2Resp = DataPushInterface.addO2Data(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); logger.info("同步氧气浓度值结果:" + o2Resp); - } - - // (三)如果监测值有变化则推送 - // 每天小时各推送一个数据 - int minute = Calendar.getInstance().get(Calendar.MINUTE); - if (minute < 10) { - // 将监测值推送至市级平台 - String o2Resp = DataPushInterface.addO2Data(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); - logger.info("同步氧气浓度值结果:" + o2Resp); + + // 2.7 生成报警记录 + PgAlarm alarm = new PgAlarm().getO2AlarmInstance(); + + 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.addO2AlarmData(bjbh, zcbh, bjms, bjsj); + logger.info("同步氧气报警记录日志结果:" + jwbjResp); + + // 2.10 联动打开风机 + // 自动打开当前舱段的排风机,手动关闭风机 + // 首先找到当前舱段的排风机资产编号 + if (O2_ON_FJ == true) { + String baseURL = Configure.getProperty("sys", "PGDSC_API_URL"); + HttpRequest.sendGet(baseURL + "remote/turnOnFjReactAlarm.action", "zcbh=" + zcbh); + } + } else { + // 3 不需要报警,只处理监测值 + // 3.1 取出上一个监测值 + PgO2 lastRec = o2Dao.findLastRecordByDevice(deviceId); + + // 3.2 计算数值的时间间隔 + long valueTimeInterval = this.getTime().getTimeInMillis() - lastRec.getUptime().getTime(); + + // 3.3 判断条件:是否与原值相同且相距在一小时以内 + if (Math.abs(value - lastRec.getO2()) > 0.01 || valueTimeInterval > CLASS_RED_ALARM_INTERVAL) { + // 3.4 将数据存入数据库 + o2Dao.addPblzRecord(value, TimeFormat.formatTimestamp(this.getTime().getTime()), deviceId); + + // 3.5 推送给市管廊公司平台 + String o2Resp = DataPushInterface.addO2Data(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步氧气浓度值结果:" + o2Resp); + } } } else { logger.warn("未找到资产[" + zcbh + "]"); diff --git a/src/com/szpg/plc/message/response/read/ReadWSValueCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadWSValueCommandResponse.java index 3d3ebd0..db6af74 100644 --- a/src/com/szpg/plc/message/response/read/ReadWSValueCommandResponse.java +++ b/src/com/szpg/plc/message/response/read/ReadWSValueCommandResponse.java @@ -4,6 +4,7 @@ import java.util.Calendar; import java.util.List; +import com.szpg.db.data.PgTemphum; import org.apache.commons.lang3.StringUtils; import org.apache.log4j.Logger; @@ -25,6 +26,9 @@ import com.szpg.util.NumberFormat; import com.szpg.util.TimeFormat; +/** + * @author TAN YUE + */ public class ReadWSValueCommandResponse extends ReadMemoryCommandResponse { /** @@ -33,12 +37,35 @@ private static final long serialVersionUID = 2964733118081941174L; private final Logger logger = Logger.getLogger(this.getClass().getName()); - - private List wd; //温度监测值 - private List sd; //湿度监测值 - private List wdbjz; //温度报警阈值 - private List sdbjz; //湿度报警阈值 - private String[] zcList; //温湿度监测的资产列表,从配置文件中获取 + + /** + * 温度监测值 + */ + private List wd; + + /** + * 湿度监测值 + */ + private List sd; + + /** + * 温度报警阈值 + */ + private List wdbjz; + + /** + * 湿度报警阈值 + */ + private List sdbjz; + + /** + * 温湿度监测的资产列表,从配置文件中获取 + */ + private String[] zcList; + + private boolean WD_ON_FJ = false; + private boolean SD_ON_FJ = false; + private long CLASS_YELLOW_ALARM_INTERVAL = 360 * 60 * 1000L; public ReadWSValueCommandResponse() { wd = new ArrayList(); @@ -94,59 +121,85 @@ 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 wdValue = wd.get(i); float sdValue = sd.get(i); - + int deviceId = deviceDao.findDeviceIdByCode(zcbh); if (deviceId > 0) { - try { - wsDao.addWsdzRecord(wdValue, sdValue, TimeFormat.formatTimestamp(this.getTime().getTime()), deviceId); - } catch (Exception ex) { - logger.error("添加温湿度监测记录异常"); - } - - // (一)如果有报警则立即推送 - // 判断是否超过报警阈值 + // 1 取出报警规则 PgAlarmRule rule = ruleDao.findRuleByDevice(deviceId); + + // 默认的报警阈值 + double wdHigh = 0.0; + double sdHigh = 0.0; if (null != rule) { - double wdHigh = 0.0; - double sdHigh = 0.0; try { - if (null != rule) { - String highStr = rule.getHighvalue(); - if (null != highStr && highStr.isEmpty() == false && highStr.indexOf(";") > 0) { - wdHigh = NumberFormat.parseDouble(highStr.split(";")[0], "0.00"); - sdHigh = NumberFormat.parseDouble(highStr.split(";")[1], "0.00"); - } + String highStr = rule.getHighvalue(); + if (null != highStr && highStr.isEmpty() == false && highStr.indexOf(";") > 0) { + wdHigh = NumberFormat.parseDouble(highStr.split(";")[0], "0.00"); + sdHigh = NumberFormat.parseDouble(highStr.split(";")[1], "0.00"); } } catch (Exception ex) { logger.error(ex); ex.printStackTrace(); } - - // 温度超过高限阈值 - if (wdHigh > 0.0001 && wdValue > wdHigh) { - PgAlarm wdAlarm = new PgAlarm(); - wdAlarm.setActive(1); + } + + // 1 判断温湿度是否报警 + if (wdHigh > 0.0001 && wdValue > wdHigh) { + // 2 温度需要报警,处理报警记录和监测值 + // 2.1 取出上一个温度报警记录 + PgAlarm lastTempAlarm = alarmDao.findLatestAlarmByDeviceAndType(deviceId, "温度"); + + boolean insertAlarmFlag = true; + if (null != lastTempAlarm) { + // 2.2 计算与上一个报警记录的操作时间间隔 + long tempAlarmTimeInterval = this.getTime().getTimeInMillis() - lastTempAlarm.getLog_time().getTime(); + + // 2.3 上一个温度报警值 + double lastTempAlarmValue = 0.0; + try { + lastTempAlarmValue = NumberFormat.parseDouble(lastTempAlarm.getAlarm_value(), "0.00"); + } catch (Exception ex) { + logger.error(ex); + ex.printStackTrace(); + } + + if (Math.abs(wdValue - lastTempAlarmValue) < 0.01 && tempAlarmTimeInterval < CLASS_YELLOW_ALARM_INTERVAL) { + insertAlarmFlag = false; + } + } + + // 2.4 如果与前值不同 或者 时间在设定的阈值范围之外 则处理报警 + if (insertAlarmFlag == true) { + // 2.5 插入监测数值 + wsDao.addWsdzRecord(wdValue, sdValue, TimeFormat.formatTimestamp(this.getTime().getTime()), deviceId); + + // 2.6 推送给市管廊公司平台 + String wdResp = DataPushInterface.addTempData(zcbh, NumberFormat.format(wdValue, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步温度值结果:" + wdResp); + + // 2.7 生成报警记录 + PgAlarm wdAlarm = new PgAlarm().getTempAlarmInstance(); + wdAlarm.setAlarm_date(this.getTime().getTime()); wdAlarm.setAlarm_value(NumberFormat.format(wdValue, "0.00")); wdAlarm.setAlarmdevid(deviceId); - wdAlarm.setAlarmtypeid(PgAlarm.ALARM_TYPE_PGRUN); - wdAlarm.setDescription("温度超过高限阈值"); - wdAlarm.setUserid(null); - // 温湿度报警定义为二级报警 - wdAlarm.setAlarm_grade("二级报警"); - + wdAlarm.setLog_time(this.getTime().getTime()); + + // 2.8 将上一条报警记录消警 alarmDao.insertAlarmRecord(wdAlarm); 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"); @@ -154,47 +207,61 @@ String bjsj = date.replace("-", ""); String wdbjResp = DataPushInterface.addTempAlarmData(bjbh, zcbh, bjms, bjsj); logger.info("同步温度报警记录日志结果:" + wdbjResp); - - // 将报警值推送至市级平台 - String wdResp = DataPushInterface.addTempData(zcbh, NumberFormat.format(wdValue, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); - logger.info("同步温度值结果:" + wdResp); - + + // 2.10 联动打开风机 // 自动打开当前舱段的排风机,手动关闭风机 // 首先找到当前舱段的排风机资产编号 - if (Boolean.valueOf(Configure.getProperty("sys", "WD_ON_FJ", "false")) == true) { - String acucode = zcbh.substring(0, zcbh.indexOf(".", 6)); - String cabin = zcbh.substring(zcbh.lastIndexOf(".") + 1, zcbh.lastIndexOf(".") + 2); - List fjs = deviceDao.findDeviceByPositionAndType(acucode, "F", cabin); - if (null != fjs && fjs.isEmpty() == false) { - String baseURL = Configure.getProperty("sys", "PGDSC_API_URL"); - for (PgDevice fj : fjs) { - String fjzcbh = fj.getAssetcode(); - - // 调用远程接口启动风机 - HttpRequest.sendGet(baseURL + "remote/turnOnFj.action", "zcbh=" + fjzcbh); - } - } + if (WD_ON_FJ == true) { + String baseURL = Configure.getProperty("sys", "PGDSC_API_URL"); + HttpRequest.sendGet(baseURL + "remote/turnOnFjReactAlarm.action", "zcbh=" + zcbh); } } - - - // 湿度超过高限阈值 - if (sdHigh > 0.0001 && sdValue > sdHigh) { - PgAlarm sdAlarm = new PgAlarm(); - sdAlarm.setActive(1); + } else if (sdHigh > 0.0001 && sdValue > sdHigh) { + // 3 湿度需要报警,处理报警记录和监测值 + // 3.1 取出上一个报警记录 + PgAlarm lastHumAlarm = alarmDao.findLatestAlarmByDeviceAndType(deviceId, "湿度"); + + boolean insertAlarmFlag = true; + if (null != lastHumAlarm) { + // 3.2 计算与上一个报警记录的操作时间间隔 + long humAlarmTimeInterval = this.getTime().getTimeInMillis() - lastHumAlarm.getLog_time().getTime(); + + // 3.3 上一个湿度报警值 + double lastHumAlarmValue = 0.0; + try { + lastHumAlarmValue = NumberFormat.parseDouble(lastHumAlarm.getAlarm_value(), "0.00"); + } catch (Exception ex) { + logger.error(ex); + ex.printStackTrace(); + } + + if (Math.abs(wdValue - lastHumAlarmValue) < 0.01 && humAlarmTimeInterval < CLASS_YELLOW_ALARM_INTERVAL) { + insertAlarmFlag = false; + } + } + + // 3.4 如果与前值不同 或者 时间在设定的阈值范围外 则处理报警 + if (insertAlarmFlag == true) { + // 3.5 插入监测数值 + wsDao.addWsdzRecord(wdValue, sdValue, TimeFormat.formatTimestamp(this.getTime().getTime()), deviceId); + + // 3.6 推送给市管廊公司平台 + String sdResp = DataPushInterface.addHumData(zcbh, NumberFormat.format(sdValue, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步湿度值结果:" + sdResp); + + // 3.7 生成报警记录 + PgAlarm sdAlarm = new PgAlarm().getHumAlarmInstance(); + sdAlarm.setAlarm_date(this.getTime().getTime()); sdAlarm.setAlarm_value(NumberFormat.format(sdValue, "0.00")); sdAlarm.setAlarmdevid(deviceId); - sdAlarm.setAlarmtypeid(PgAlarm.ALARM_TYPE_PGRUN); - sdAlarm.setDescription("湿度超过高限阈值"); - sdAlarm.setUserid(null); - // 温湿度报警定义为二级报警 - sdAlarm.setAlarm_grade("二级报警"); - + sdAlarm.setLog_time(this.getTime().getTime()); + + // 3.8 将上一条报警记录消警 alarmDao.insertAlarmRecord(sdAlarm); deviceDao.updateDeviceStatus(deviceId, "湿度超高"); - - // 将报警日志推送至市级平台 + + // 3.9 向市级平台推送报警日志 String date = TimeFormat.formatDate(getTime().getTime()); int count = alarmDao.findAlarmCountByDate(date); String bjbh = "THXC." + date + "." + NumberFormat.format(count+1, "0000"); @@ -202,44 +269,32 @@ String bjsj = date.replace("-", ""); String sdbjResp = DataPushInterface.addHumAlarmData(bjbh, zcbh, bjms, bjsj); logger.info("同步湿度报警记录日志结果:" + sdbjResp); - - // 将报警值推送至市级平台 + + // 3.10 湿度不需要联动打开风机 + } + } else { + // 4 不需要报警,只处理监测值 + // 4.1 取出上一个监测值 + PgTemphum lastRec = wsDao.findLastRecordByDevice(deviceId); + + // 4.2 计算数值的时间间隔 + long valueTimeInterval = this.getTime().getTimeInMillis() - lastRec.getUptime().getTime(); + + // 4.3 判断条件:是否与原值(温度与湿度)相同且相距在六小时以内 + if (Math.abs(wdValue - lastRec.getTemp()) > 0.01 || + Math.abs(sdValue - lastRec.getHum()) > 0.01 || + valueTimeInterval > CLASS_YELLOW_ALARM_INTERVAL) { + // 4.4 将数据存入数据库 + wsDao.addWsdzRecord(wdValue, sdValue, TimeFormat.formatTimestamp(this.getTime().getTime()), deviceId); + + // 4.5 推送给市管廊公司平台 + String wdResp = DataPushInterface.addTempData(zcbh, NumberFormat.format(wdValue, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步温度值结果:" + wdResp); + String sdResp = DataPushInterface.addHumData(zcbh, NumberFormat.format(sdValue, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); logger.info("同步湿度值结果:" + sdResp); - - // 湿度不需要联动打开风机 } } - - - // (二)如果监测值有变化则推送 - // 判断温度值是否有变化 - double lastTemp = wsDao.findLastTempByDevice(deviceId); - if (Math.abs(wdValue - lastTemp) > 0.01) { - // 将监测值推送至市级平台 - String wdResp = DataPushInterface.addTempData(zcbh, NumberFormat.format(wdValue, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); - logger.info("同步温度值结果:" + wdResp); - } - - // 判断湿度值是否有变化 - double lastHum = wsDao.findLastHumByDevice(deviceId); - if (Math.abs(sdValue - lastHum) > 0.01) { - // 将监测值推送至市级平台 - String sdResp = DataPushInterface.addHumData(zcbh, NumberFormat.format(sdValue, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); - logger.info("同步湿度值结果:" + sdResp); - } - - // (三)如果监测值有变化则推送 - // 每天小时各推送一个数据 - int minute = Calendar.getInstance().get(Calendar.MINUTE); - if (minute < 10) { - // 将监测值推送至市级平台 - String wdResp = DataPushInterface.addTempData(zcbh, NumberFormat.format(wdValue, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); - logger.info("同步温度值结果:" + wdResp); - - String sdResp = DataPushInterface.addHumData(zcbh, NumberFormat.format(sdValue, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); - logger.info("同步湿度值结果:" + sdResp); - } } else { logger.warn("未找到资产[" + zcbh + "]"); } diff --git a/src/com/szpg/db/dao/PgAlarmDao.java b/src/com/szpg/db/dao/PgAlarmDao.java index 11d8a1d..4ab98d4 100644 --- a/src/com/szpg/db/dao/PgAlarmDao.java +++ b/src/com/szpg/db/dao/PgAlarmDao.java @@ -6,6 +6,7 @@ public int findAlarmCountByDate(String date); public PgAlarm findLatestAlarmByDevice(int deviceId); + public PgAlarm findLatestAlarmByDeviceAndType(int deviceId, String type); public long insertAlarmRecord(PgAlarm alarmRecord); } diff --git a/src/com/szpg/db/dao/PgCODao.java b/src/com/szpg/db/dao/PgCODao.java index 1664f51..5098321 100644 --- a/src/com/szpg/db/dao/PgCODao.java +++ b/src/com/szpg/db/dao/PgCODao.java @@ -20,6 +20,7 @@ public List findPblzByDeviceAndTm(Integer deviceid, String start, String end); public double findLastValueByDevice(Integer deviceid); + public PgCO findLastRecordByDevice(Integer id); public int addPblzRecord(PgCO ch4); public int addPblzRecord(float value, String tm, int deviceid); diff --git a/src/com/szpg/db/dao/PgCh4Dao.java b/src/com/szpg/db/dao/PgCh4Dao.java index e23b964..61fdfcd 100644 --- a/src/com/szpg/db/dao/PgCh4Dao.java +++ b/src/com/szpg/db/dao/PgCh4Dao.java @@ -20,6 +20,7 @@ public List findPblzByDeviceAndTm(Integer deviceid, String start, String end); public double findLastValueByDevice(Integer deviceid); + public PgCh4 findLastRecordByDevice(Integer deviceid); public int addPblzRecord(PgCh4 ch4); public int addPblzRecord(float value, String tm, int deviceid); diff --git a/src/com/szpg/db/dao/PgHSDao.java b/src/com/szpg/db/dao/PgHSDao.java index f89b044..0f0ee53 100644 --- a/src/com/szpg/db/dao/PgHSDao.java +++ b/src/com/szpg/db/dao/PgHSDao.java @@ -20,6 +20,7 @@ public List findPblzByDeviceAndTm(Integer deviceid, String start, String end); public double findLastValueByDevice(Integer deviceid); + public PgSH findLastRecordByDevice(Integer deviceid); public int addPblzRecord(PgSH hs); public int addPblzRecord(float value, String tm, int deviceid); diff --git a/src/com/szpg/db/dao/PgO2Dao.java b/src/com/szpg/db/dao/PgO2Dao.java index 0b3d0bf..678adab 100644 --- a/src/com/szpg/db/dao/PgO2Dao.java +++ b/src/com/szpg/db/dao/PgO2Dao.java @@ -20,6 +20,7 @@ public List findPblzByDeviceAndTm(Integer deviceid, String start, String end); public double findLastValueByDevice(Integer deviceid); + public PgO2 findLastRecordByDevice(Integer deviceid); public int addPblzRecord(PgO2 ch4); public int addPblzRecord(float value, String tm, int deviceid); diff --git a/src/com/szpg/db/dao/PgWsDao.java b/src/com/szpg/db/dao/PgWsDao.java index 370a83f..bfd0eed 100644 --- a/src/com/szpg/db/dao/PgWsDao.java +++ b/src/com/szpg/db/dao/PgWsDao.java @@ -21,6 +21,7 @@ public double findLastTempByDevice(Integer deviceid); public double findLastHumByDevice(Integer deviceid); + public PgTemphum findLastRecordByDevice(Integer deviceid); public int addWsdzRecord(PgTemphum wsdz); public int addWsdzRecord(float temp, float hum, String tm, int deviceid); diff --git a/src/com/szpg/db/dao/impl/PgAlarmDaoImpl.java b/src/com/szpg/db/dao/impl/PgAlarmDaoImpl.java index cedf5fc..ce9ee0f 100644 --- a/src/com/szpg/db/dao/impl/PgAlarmDaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgAlarmDaoImpl.java @@ -8,7 +8,6 @@ import org.apache.commons.dbutils.DbUtils; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.handlers.ArrayListHandler; -import org.apache.commons.dbutils.handlers.BeanListHandler; import org.apache.commons.dbutils.handlers.ScalarHandler; import org.apache.log4j.Logger; @@ -17,6 +16,9 @@ import com.szpg.db.util.ConnectionManager; import com.szpg.util.TimeFormat; +/** + * @author TAN YUE + */ public class PgAlarmDaoImpl implements PgAlarmDao { private final Logger logger = Logger.getLogger(this.getClass().getName()); @@ -33,7 +35,7 @@ QueryRunner runner = new QueryRunner(); param[0] = date; - int count = ((Number) runner.query(conn, sql, new ScalarHandler(1), param)).intValue(); + int count = (runner.query(conn, sql, new ScalarHandler(1), param)).intValue(); return count; } catch (Exception ex) { logger.error("根据日期查询报警记录数异常", ex); @@ -51,7 +53,7 @@ public PgAlarm findLatestAlarmByDevice(int deviceId) { Connection conn = null; String queryStr = "SELECT A.* FROM " + - "(SELECT ID, ACTIVE, ALARM_DATE, ALARM_VALUE, DESCRIPTION, ALARMDEVID, ALARMTYPEID, ALARM_GRADE FROM PG_ALARM WHERE ALARMDEVID = ? ORDER BY ALARM_DATE DESC) A " + + "(SELECT ID, ACTIVE, ALARM_DATE, ALARM_VALUE, DESCRIPTION, ALARMDEVID, ALARMTYPEID, ALARM_GRADE, LOG_TIME, LOG_DESC FROM PG_ALARM WHERE ALARMDEVID = ? ORDER BY ALARM_DATE DESC) A " + "WHERE ROWNUM <= 1"; Object[] param = new Object[1]; try { @@ -60,7 +62,7 @@ QueryRunner runner = new QueryRunner(); param[0] = deviceId; - List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler(), param); + List tempList = runner.query(conn, queryStr, new ArrayListHandler(), param); if (null != tempList && tempList.isEmpty() == false) { PgAlarm alarm = new PgAlarm(); Object[] item = tempList.get(0); @@ -79,6 +81,74 @@ alarm.setAlarmtypeid(((Number) item[6]).intValue()); alarm.setAlarm_grade((String) item[7]); + if (null != item[8]) { + long logTmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[8]).toJdbc()).getTime(); + Calendar logCal = Calendar.getInstance(); + logCal.setTimeInMillis(logTmValue); + alarm.setLog_time(logCal.getTime()); + } else { + alarm.setLog_time(null); + } + + alarm.setLog_desc((String) item[9]); + + logger.debug("根据设备查询最新报警记录成功"); + + return alarm; + } else { + return null; + } + } catch (Exception ex) { + logger.error("根据设备查询最新报警记录成功", ex); + return null; + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + } + + @Override + public PgAlarm findLatestAlarmByDeviceAndType(int deviceId, String type) { + Connection conn = null; + String queryStr = "SELECT A.* FROM " + + "(SELECT ID, ACTIVE, ALARM_DATE, ALARM_VALUE, DESCRIPTION, ALARMDEVID, ALARMTYPEID, ALARM_GRADE, LOG_TIME, LOG_DESC FROM PG_ALARM WHERE ALARMDEVID = ? AND DESCRIPTION LIKE ? ORDER BY ALARM_DATE DESC) A " + + "WHERE ROWNUM <= 1"; + Object[] param = new Object[2]; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + QueryRunner runner = new QueryRunner(); + param[0] = deviceId; + param[1] = "%" + type + "%"; + + List tempList = runner.query(conn, queryStr, new ArrayListHandler(), param); + if (null != tempList && tempList.isEmpty() == false) { + PgAlarm alarm = new PgAlarm(); + Object[] item = tempList.get(0); + + alarm.setId(((Number) item[0]).intValue()); + alarm.setActive(((Number) item[1]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + alarm.setAlarm_date(cal.getTime()); + + alarm.setAlarm_value((String) item[3]); + alarm.setDescription((String) item[4]); + alarm.setAlarmdevid(((Number) item[5]).intValue()); + alarm.setAlarmtypeid(((Number) item[6]).intValue()); + alarm.setAlarm_grade((String) item[7]); + + long logTmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[8]).toJdbc()).getTime(); + Calendar logCal = Calendar.getInstance(); + logCal.setTimeInMillis(logTmValue); + alarm.setLog_time(logCal.getTime()); + alarm.setLog_desc((String) item[9]); + logger.debug("根据设备查询最新报警记录成功"); return alarm; @@ -111,28 +181,31 @@ QueryRunner runner = new QueryRunner(); // 查询同一设备是否有正在报警的消息 - Number id = (Number) runner.query(conn, querySql, new ScalarHandler(1), queryParam); + Number id = runner.query(conn, querySql, new ScalarHandler(1), queryParam); if (null != id) { // 找到设备已存在的记录 // 1先将正在报警的设备自动消警 - String updateSql = "UPDATE PG_ALARM SET ACTIVE=0 WHERE ID=?"; + String updateSql = "UPDATE PG_ALARM SET ACTIVE=0, LOG_TIME=SYSDATE, LOG_DESC=? WHERE ID=?"; - Object[] updateParam = new Object[1]; - updateParam[0] = id.longValue(); - - runner.update(conn, updateSql, updateParam); // 更新报警记录 - } + Object[] updateParam = new Object[2]; + updateParam[0] = "重复报警自动消警"; + updateParam[1] = id.longValue(); + + // 更新报警记录 + runner.update(conn, updateSql, updateParam); + } // 插入新的报警记录 String insertSql = "INSERT INTO PG_ALARM " + - "(ID, ACTIVE, ALARM_DATE, ALARM_VALUE, DESCRIPTION, ALARMDEVID, ALARMTYPEID, USERID, ALARM_GRADE) " + - "VALUES (?, ?, TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), ?, ?, ?, ?, ?, ?)"; + "(ID, ACTIVE, ALARM_DATE, ALARM_VALUE, DESCRIPTION, ALARMDEVID, ALARMTYPEID, USERID, ALARM_GRADE, LOG_TIME, LOG_DESC) " + + "VALUES (?, ?, TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), ?, ?, ?, ?, ?, ?, TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), ?)"; String sqlId = "SELECT SEQ_PG_ALARM_ID.NEXTVAL FROM DUAL"; - long newId = ((Number) runner.query(conn, sqlId, new ScalarHandler(1))).longValue(); // 获取新的id - - Object[] params = new Object[9]; + // 获取新的id + long newId = (runner.query(conn, sqlId, new ScalarHandler(1))).longValue(); + + Object[] params = new Object[11]; params[0] = newId; params[1] = alarmRecord.getActive(); @@ -143,8 +216,11 @@ params[6] = alarmRecord.getAlarmtypeid(); params[7] = alarmRecord.getUserid(); params[8] = alarmRecord.getAlarm_grade(); - - int count = runner.update(conn, insertSql, params); // 新增主表 + params[9] = TimeFormat.formatTimestamp(alarmRecord.getLog_time()); + params[10] = alarmRecord.getLog_desc(); + + // 新增报警记录 + int count = runner.update(conn, insertSql, params); if (count > 0) { logger.debug("插入报警数据成功"); diff --git a/src/com/szpg/db/dao/impl/PgCODaoImpl.java b/src/com/szpg/db/dao/impl/PgCODaoImpl.java index 186ac16..70d672c 100644 --- a/src/com/szpg/db/dao/impl/PgCODaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgCODaoImpl.java @@ -292,6 +292,51 @@ } @Override + public PgCO findLastRecordByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT ID, CO, LOGTIME, PGDEVICEID FROM (SELECT * FROM PG_CO WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, sql, new ArrayListHandler(), param); + if (null != tempList && tempList.size() == 1) { + PgCO co = new PgCO(); + Object[] item = tempList.get(0); + + co.setId(((Number) item[0]).intValue()); + co.setCo(Float.parseFloat((String) item[1])); + co.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + co.setLogtime(cal.getTime()); + co.setUptime(cal.getTime()); + + logger.debug("根据设备ID查询最新一氧化碳监测记录成功" + co + "]"); + + return co; + } else { + return null; + } + } catch (Exception ex) { + logger.error("根据设备ID查询最新一氧化碳监测记录异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override public int addPblzRecord(PgCO co) { return addPblzRecord(co.getCo(), co.getTmStr(), co.getPgdeviceid()); } diff --git a/src/com/szpg/db/dao/impl/PgCh4DaoImpl.java b/src/com/szpg/db/dao/impl/PgCh4DaoImpl.java index 0ed139e..768b6a5 100644 --- a/src/com/szpg/db/dao/impl/PgCh4DaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgCh4DaoImpl.java @@ -54,9 +54,9 @@ list.add(ch4); } return list; - } - else + } else { return null; + } } catch (Exception ex) { logger.error("查询所有甲烷监测值异常", ex); } finally { @@ -100,9 +100,9 @@ logger.debug("根据ID查询甲烷监测值成功" + ch4 + "]"); return ch4; - } - else + } else { return null; + } } catch (Exception ex) { logger.error("根据ID查询甲烷监测值异常", ex); } finally { @@ -149,9 +149,9 @@ logger.debug("根据设备ID查询最新的甲烷监测值成功" + ch4 + "]"); return ch4; - } - else + } else { return null; + } } catch (Exception ex) { logger.error("根据设备ID查询最新的甲烷监测值异常", ex); } finally { @@ -199,9 +199,9 @@ list.add(ch4); } return list; - } - else + } else { return null; + } } catch (Exception ex) { logger.error("根据设备ID查询甲烷监测值异常", ex); } finally { @@ -251,9 +251,9 @@ list.add(ch4); } return list; - } - else + } else { return null; + } } catch (Exception ex) { logger.error("根据设备ID和时间查询甲烷监测值异常", ex); } finally { @@ -293,6 +293,51 @@ } @Override + public PgCh4 findLastRecordByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT ID, CH4, LOGTIME, PGDEVICEID FROM (SELECT * FROM PG_CH4 WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, sql, new ArrayListHandler(), param); + if (null != tempList && tempList.size() == 1) { + PgCh4 ch4 = new PgCh4(); + Object[] item = tempList.get(0); + + ch4.setId(((Number) item[0]).intValue()); + ch4.setCh4(Float.parseFloat((String) item[1])); + ch4.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + ch4.setLogtime(cal.getTime()); + ch4.setUptime(cal.getTime()); + + logger.debug("根据设备ID查询最新甲烷监测记录成功" + ch4 + "]"); + + return ch4; + } else { + return null; + } + } catch (Exception ex) { + logger.error("根据设备ID查询最新甲烷监测记录异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override public int addPblzRecord(PgCh4 ch4) { return addPblzRecord(ch4.getCh4(), ch4.getTmStr(), ch4.getPgdeviceid()); } diff --git a/src/com/szpg/db/dao/impl/PgHSDaoImpl.java b/src/com/szpg/db/dao/impl/PgHSDaoImpl.java index 892e175..fa4ea02 100644 --- a/src/com/szpg/db/dao/impl/PgHSDaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgHSDaoImpl.java @@ -292,6 +292,51 @@ } @Override + public PgSH findLastRecordByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT ID, SH, LOGTIME, PGDEVICEID FROM (SELECT * FROM PG_SH WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, sql, new ArrayListHandler(), param); + if (null != tempList && tempList.size() == 1) { + PgSH sh = new PgSH(); + Object[] item = tempList.get(0); + + sh.setId(((Number) item[0]).intValue()); + sh.setSh(Float.parseFloat((String) item[1])); + sh.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + sh.setLogtime(cal.getTime()); + sh.setUptime(cal.getTime()); + + logger.debug("根据设备ID查询最新硫化氢监测记录成功" + sh + "]"); + + return sh; + } else { + return null; + } + } catch (Exception ex) { + logger.error("根据设备ID查询最新硫化氢监测记录异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override public int addPblzRecord(PgSH sh) { return addPblzRecord(sh.getSh(), sh.getTmStr(), sh.getPgdeviceid()); } diff --git a/src/com/szpg/db/dao/impl/PgO2DaoImpl.java b/src/com/szpg/db/dao/impl/PgO2DaoImpl.java index f58f8cd..842291b 100644 --- a/src/com/szpg/db/dao/impl/PgO2DaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgO2DaoImpl.java @@ -54,9 +54,9 @@ list.add(o2); } return list; - } - else + } else { return null; + } } catch (Exception ex) { logger.error("查询所有氧气监测值异常", ex); } finally { @@ -100,9 +100,9 @@ logger.debug("根据ID查询氧气监测值成功" + o2 + "]"); return o2; - } - else + } else { return null; + } } catch (Exception ex) { logger.error("根据ID查询氧气监测值异常", ex); } finally { @@ -148,9 +148,9 @@ logger.debug("根据设备ID查询最新的氧气监测值成功" + o2 + "]"); return o2; - } - else + } else { return null; + } } catch (Exception ex) { logger.error("根据设备ID查询最新的硫化氢监测值异常", ex); } finally { @@ -198,9 +198,9 @@ list.add(o2); } return list; - } - else + } else { return null; + } } catch (Exception ex) { logger.error("根据设备ID查询氧气监测值异常", ex); } finally { @@ -250,9 +250,9 @@ list.add(o2); } return list; - } - else + } else { return null; + } } catch (Exception ex) { logger.error("根据设备ID和时间查询氧气监测值异常", ex); } finally { @@ -292,6 +292,51 @@ } @Override + public PgO2 findLastRecordByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT ID, O2, LOGTIME, PGDEVICEID FROM (SELECT * FROM PG_O2 WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, sql, new ArrayListHandler(), param); + if (null != tempList && tempList.size() == 1) { + PgO2 o2 = new PgO2(); + Object[] item = tempList.get(0); + + o2.setId(((Number) item[0]).intValue()); + o2.setO2(Float.parseFloat((String) item[1])); + o2.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + o2.setLogtime(cal.getTime()); + o2.setUptime(cal.getTime()); + + logger.debug("根据设备ID查询最新氧气监测记录成功" + o2 + "]"); + + return o2; + } else { + return null; + } + } catch (Exception ex) { + logger.error("根据设备ID查询最新氧气监测记录异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override public int addPblzRecord(PgO2 o2) { return addPblzRecord(o2.getO2(), o2.getTmStr(), o2.getPgdeviceid()); } @@ -316,10 +361,11 @@ QueryRunner runner = new QueryRunner(); int count = runner.update(conn, insertStr, params); - if (count > 0) + if (count > 0) { logger.debug("插入氧气监测值成功[tm=" + tm + ", value=" + value + ", deviceid=" + deviceid + "]"); - else + } else { logger.error("插入氧气监测值失败!"); + } return count; } catch (Exception ex) { diff --git a/src/com/szpg/db/dao/impl/PgWsDaoImpl.java b/src/com/szpg/db/dao/impl/PgWsDaoImpl.java index 679b58f..77925f7 100644 --- a/src/com/szpg/db/dao/impl/PgWsDaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgWsDaoImpl.java @@ -323,6 +323,52 @@ } @Override + public PgTemphum findLastRecordByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT ID, TEMP, HUM, LOGTIME, PGDEVICEID FROM (SELECT * FROM PG_TEMPHUM WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, sql, new ArrayListHandler(), param); + if (null != tempList && tempList.size() == 1) { + PgTemphum temphum = new PgTemphum(); + Object[] item = tempList.get(0); + + temphum.setId(((Number) item[0]).intValue()); + temphum.setTemp(Float.parseFloat((String) item[1])); + temphum.setHum(Float.parseFloat((String) item[2])); + temphum.setPgdeviceid(((Number) item[4]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + temphum.setLogtime(cal.getTime()); + temphum.setUptime(cal.getTime()); + + logger.debug("根据设备ID查询最新温湿度监测记录成功" + temphum + "]"); + + return temphum; + } else { + return null; + } + } catch (Exception ex) { + logger.error("根据设备ID查询最新温湿度监测记录异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override public int addWsdzRecord(PgTemphum ws) { return addWsdzRecord(ws.getTemp(), ws.getHum(), ws.getTmStr(), ws.getPgdeviceid()); } diff --git a/src/com/szpg/db/data/PgAlarm.java b/src/com/szpg/db/data/PgAlarm.java index 5a73ba9..4b97e6a 100644 --- a/src/com/szpg/db/data/PgAlarm.java +++ b/src/com/szpg/db/data/PgAlarm.java @@ -1,9 +1,12 @@ package com.szpg.db.data; -import java.util.Date; - import com.szpg.util.TimeFormat; +import java.util.Date; + +/** + * @author TAN YUE + */ public class PgAlarm implements java.io.Serializable { /** @@ -20,11 +23,28 @@ private Integer alarmtypeid; private Integer userid; private String alarm_grade; - - public static Integer ALARM_TYPE_DEVRUN = 1; //管廊设备运行故障 - public static Integer ALARM_TYPE_PGRUN = 2; //管廊运行环境报警 - public static Integer ALARM_TYPE_PGSAF = 3; //管廊安全防范报警 - public static Integer ALARM_TYPE_INPG = 4; //人员入廊超时报警 + private Date log_time; + private String log_desc; + + /** + * 管廊设备运行故障 + */ + public static Integer ALARM_TYPE_DEVRUN = 1; + + /** + * 管廊运行环境报警 + */ + public static Integer ALARM_TYPE_PGRUN = 2; + + /** + * 管廊安全防范报警 + */ + public static Integer ALARM_TYPE_PGSAF = 3; + + /** + * 人员入廊超时报警 + */ + public static Integer ALARM_TYPE_INPG = 4; public Integer getId() { return id; @@ -97,10 +117,130 @@ public void setAlarm_grade(String alarm_grade) { this.alarm_grade = alarm_grade; } + + public Date getLog_time() { + if (null == log_time) { + return alarm_date; + } + return log_time; + } + + public void setLog_time(Date log_time) { + this.log_time = log_time; + } + + public String getLog_desc() { + return log_desc; + } + + public void setLog_desc(String log_desc) { + this.log_desc = log_desc; + } @Override public String toString() { return "PgAlarm[alarmValue=" + alarm_value + ", alarmDate=" + TimeFormat.formatTimestamp(alarm_date) + ", alarmDevId= " + alarmdevid + "]"; } + /** + * 生成氧气报警记录 + * @return + */ + public PgAlarm getO2AlarmInstance() { + PgAlarm alarm = new PgAlarm(); + alarm.setActive(1); + alarm.setAlarmtypeid(PgAlarm.ALARM_TYPE_PGRUN); + alarm.setDescription("氧气浓度低于低限阈值"); + alarm.setUserid(null); + + // 氧气报警定义为一级报警 + alarm.setAlarm_grade("一级报警"); + + return alarm; + } + + /** + * 生成一氧化碳报警记录 + * @return + */ + public PgAlarm getCOAlarmInstance() { + PgAlarm alarm = new PgAlarm(); + alarm.setActive(1); + alarm.setAlarmtypeid(PgAlarm.ALARM_TYPE_PGRUN); + alarm.setDescription("一氧化碳浓度超过高限阈值"); + alarm.setUserid(null); + + // 一氧化碳报警定义为一级报警 + alarm.setAlarm_grade("一级报警"); + + return alarm; + } + + /** + * 生成硫化氢报警记录 + * @return + */ + public PgAlarm getHSAlarmInstance() { + PgAlarm alarm = new PgAlarm(); + alarm.setActive(1); + alarm.setAlarmtypeid(PgAlarm.ALARM_TYPE_PGRUN); + alarm.setDescription("硫化氢浓度超过高限阈值"); + alarm.setUserid(null); + + // 硫化氢报警定义为一级报警 + alarm.setAlarm_grade("一级报警"); + + return alarm; + } + + /** + * 生成甲烷报警记录 + * @return + */ + public PgAlarm getCH4AlarmInstance() { + PgAlarm alarm = new PgAlarm(); + alarm.setActive(1); + alarm.setAlarmtypeid(PgAlarm.ALARM_TYPE_PGRUN); + alarm.setDescription("甲烷浓度超过高限阈值"); + alarm.setUserid(null); + + // 甲烷报警定义为二级报警 + alarm.setAlarm_grade("二级报警"); + + return alarm; + } + + /** + * 生成温度报警记录 + * @return + */ + public PgAlarm getTempAlarmInstance() { + PgAlarm alarm = new PgAlarm(); + alarm.setActive(1); + alarm.setAlarmtypeid(PgAlarm.ALARM_TYPE_PGRUN); + alarm.setDescription("温度超过高限阈值"); + alarm.setUserid(null); + + // 温度定义为二级报警 + alarm.setAlarm_grade("二级报警"); + + return alarm; + } + + /** + * 生成湿度报警记录 + * @return + */ + public PgAlarm getHumAlarmInstance() { + PgAlarm alarm = new PgAlarm(); + alarm.setActive(1); + alarm.setAlarmtypeid(PgAlarm.ALARM_TYPE_PGRUN); + alarm.setDescription("湿度超过高限阈值"); + alarm.setUserid(null); + + // 湿度报警定义为二级报警 + alarm.setAlarm_grade("二级报警"); + + return alarm; + } } diff --git a/src/com/szpg/plc/message/response/read/ReadCH4ValueCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadCH4ValueCommandResponse.java index c26ffa5..13c5968 100644 --- a/src/com/szpg/plc/message/response/read/ReadCH4ValueCommandResponse.java +++ b/src/com/szpg/plc/message/response/read/ReadCH4ValueCommandResponse.java @@ -4,6 +4,7 @@ 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; @@ -25,6 +26,9 @@ import com.szpg.util.NumberFormat; import com.szpg.util.TimeFormat; +/** + * @author TAN YUE + */ public class ReadCH4ValueCommandResponse extends ReadMemoryCommandResponse { /** @@ -33,10 +37,24 @@ private static final long serialVersionUID = 8081222348890587881L; private final Logger logger = Logger.getLogger(this.getClass().getName()); - - private List jwnd; //甲烷浓度值 - private List jwldbjz; //甲烷联动报警值 - private String[] zcList; //甲烷监测的资产列表,从配置文件中获取 + + /** + * 甲烷浓度值 + */ + private List jwnd; + + /** + * 甲烷联动报警值 + */ + private List jwldbjz; + + /** + * 甲烷监测的资产列表,从配置文件中获取 + */ + private String[] zcList; + + private boolean CH4_ON_FJ = false; + private long CLASS_YELLOW_ALARM_INTERVAL = 360 * 60 * 1000L; public ReadCH4ValueCommandResponse() { jwnd = new ArrayList(); @@ -74,94 +92,108 @@ 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) { - ch4Dao.addPblzRecord(jwnd.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), deviceId); - - // (一)如果有报警则立即推送 - // 判断是否超过报警阈值 + // 1 取出报警规则 PgAlarmRule rule = ruleDao.findRuleByDevice(deviceId); + + // 默认的报警阈值 + double high = 0.0; if (null != rule) { - double high = 0.0; try { high = NumberFormat.parseDouble(rule.getHighvalue(), "0.00"); } catch (Exception ex) { logger.error(ex); ex.printStackTrace(); } - - // 甲烷浓度超过高限阈值 - if (high > 0.0001 && value > high) { - PgAlarm alarm = new PgAlarm(); - alarm.setActive(1); - alarm.setAlarm_date(this.getTime().getTime()); - alarm.setAlarm_value(NumberFormat.format(value, "0.00")); - alarm.setAlarmdevid(deviceId); - alarm.setAlarmtypeid(PgAlarm.ALARM_TYPE_PGRUN); - alarm.setDescription("甲烷浓度超过高限阈值"); - alarm.setUserid(null); - // 甲烷报警定义为二级报警 - alarm.setAlarm_grade("二级报警"); - - alarmDao.insertAlarmRecord(alarm); - deviceDao.updateDeviceStatus(deviceId, "甲烷浓度过高"); - - // 将报警日志推送至市级平台 - 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); - - // 将报警值推送至市级平台 - String jwResp = DataPushInterface.addCH4Data(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); - logger.info("同步甲烷浓度值结果:" + jwResp); + } - // 自动打开当前舱段的排风机,手动关闭风机 - // 首先找到当前舱段的排风机资产编号 - if (Boolean.valueOf(Configure.getProperty("sys", "CH4_ON_FJ", "false")) == true) { - String acucode = zcbh.substring(0, zcbh.indexOf(".", 6)); - String cabin = zcbh.substring(zcbh.lastIndexOf(".") + 1, zcbh.lastIndexOf(".") + 2); - List fjs = deviceDao.findDeviceByPositionAndType(acucode, "F", cabin); - if (null != fjs && fjs.isEmpty() == false) { - String baseURL = Configure.getProperty("sys", "PGDSC_API_URL"); - for (PgDevice fj : fjs) { - String fjzcbh = fj.getAssetcode(); + // 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(); - // 调用远程接口启动风机 - HttpRequest.sendGet(baseURL + "remote/turnOnFj.action", "zcbh=" + fjzcbh); - } - } + // 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; } } - } - - // (二)如果监测值有变化则推送 - // 判断甲烷浓度值是否有变化 - double lastValue = ch4Dao.findLastValueByDevice(deviceId); - if (Math.abs(value - lastValue) > 0.01) { - // 将监测值推送至市级平台 + + // 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); - } - - // (三)如果监测值有变化则推送 - // 每天小时各推送一个数据 - int minute = Calendar.getInstance().get(Calendar.MINUTE); - if (minute < 10) { - // 将监测值推送至市级平台 - 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 + "]"); diff --git a/src/com/szpg/plc/message/response/read/ReadCOValueCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadCOValueCommandResponse.java index 1920b62..0b27d03 100644 --- a/src/com/szpg/plc/message/response/read/ReadCOValueCommandResponse.java +++ b/src/com/szpg/plc/message/response/read/ReadCOValueCommandResponse.java @@ -4,6 +4,8 @@ import java.util.Calendar; import java.util.List; +import com.szpg.db.data.PgCO; +import com.szpg.util.*; import org.apache.commons.lang3.StringUtils; import org.apache.log4j.Logger; @@ -18,11 +20,10 @@ import com.szpg.db.data.PgAlarm; import com.szpg.db.data.PgAlarmRule; import com.szpg.plc.message.response.ReadMemoryCommandResponse; -import com.szpg.util.Configure; -import com.szpg.util.DataPushInterface; -import com.szpg.util.NumberFormat; -import com.szpg.util.TimeFormat; +/** + * @author TAN YUE + */ public class ReadCOValueCommandResponse extends ReadMemoryCommandResponse { /** @@ -31,10 +32,24 @@ private static final long serialVersionUID = -6176747812714170040L; private final Logger logger = Logger.getLogger(this.getClass().getName()); - - private List cond; //一氧化碳浓度值 - private List coldbjz; //一氧化碳联动报警值 - private String[] zcList; //一氧化碳监测的资产列表,从配置文件中获取 + + /** + * 一氧化碳浓度值 + */ + private List cond; + + /** + * 一氧化碳联动报警值 + */ + private List coldbjz; + + /** + * 一氧化碳监测的资产列表,从配置文件中获取 + */ + private String[] zcList; + + private boolean CO_ON_FJ = false; + private long CLASS_RED_ALARM_INTERVAL = 60 * 60 * 1000L; public ReadCOValueCommandResponse() { cond = new ArrayList(); @@ -72,80 +87,108 @@ 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 = cond.get(i); - + int deviceId = deviceDao.findDeviceIdByCode(zcbh); if (deviceId > 0) { - coDao.addPblzRecord(cond.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), deviceId); - - // (一)如果有报警则立即推送 - // 判断是否超过报警阈值 + // 1 取出报警规则 PgAlarmRule rule = ruleDao.findRuleByDevice(deviceId); + + // 默认的报警阈值 + double high = 0.0; if (null != rule) { - double high = 0.0; try { high = NumberFormat.parseDouble(rule.getHighvalue(), "0.00"); } catch (Exception ex) { logger.error(ex); ex.printStackTrace(); } - - // 一氧化碳浓度超过高限阈值 - if (high > 0.0001 && value > high) { - PgAlarm alarm = new PgAlarm(); - alarm.setActive(1); - alarm.setAlarm_date(this.getTime().getTime()); - alarm.setAlarm_value(NumberFormat.format(value, "0.00")); - alarm.setAlarmdevid(deviceId); - alarm.setAlarmtypeid(PgAlarm.ALARM_TYPE_PGRUN); - alarm.setDescription("一氧化碳浓度超过高限阈值"); - alarm.setUserid(null); - // 一氧化碳报警定义为一级报警 - alarm.setAlarm_grade("一级报警"); - - alarmDao.insertAlarmRecord(alarm); - deviceDao.updateDeviceStatus(deviceId, "一氧化碳浓度过高"); - - // 将报警日志推送至市级平台 - 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.addCOAlarmData(bjbh, zcbh, bjms, bjsj); - logger.info("同步一氧化碳报警记录日志结果:" + jwbjResp); - - // 将报警值推送至市级平台 - String jwResp = DataPushInterface.addCOData(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); - logger.info("同步一氧化碳浓度值结果:" + jwResp); + } - // 一氧化碳不需要联动控制风机 + // 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_RED_ALARM_INTERVAL) { + continue; + } } - } - - - // (二)如果监测值有变化则推送 - // 判断一氧化碳浓度值是否有变化 - double lastValue = coDao.findLastValueByDevice(deviceId); - if (Math.abs(value - lastValue) > 0.01) { - // 将监测值推送至市级平台 + + // 2.5 插入监测数值 + coDao.addPblzRecord(value, TimeFormat.formatTimestamp(this.getTime().getTime()), deviceId); + + // 2.6 推送给市管廊公司平台 String coResp = DataPushInterface.addCOData(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); logger.info("同步一氧化碳浓度值结果:" + coResp); - } - - // (三)如果监测值有变化则推送 - // 每天小时各推送一个数据 - int minute = Calendar.getInstance().get(Calendar.MINUTE); - if (minute < 10) { - // 将监测值推送至市级平台 - String coResp = DataPushInterface.addCOData(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); - logger.info("同步一氧化碳浓度值结果:" + coResp); + + // 2.7 生成报警记录 + PgAlarm alarm = new PgAlarm().getCOAlarmInstance(); + + 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.addCOAlarmData(bjbh, zcbh, bjms, bjsj); + logger.info("同步一氧化碳报警记录日志结果:" + jwbjResp); + + // 2.10 联动打开风机 + // 自动打开当前舱段的排风机,手动关闭风机 + // 首先找到当前舱段的排风机资产编号 + if (CO_ON_FJ == true) { + String baseURL = Configure.getProperty("sys", "PGDSC_API_URL"); + HttpRequest.sendGet(baseURL + "remote/turnOnFjReactAlarm.action", "zcbh=" + zcbh); + } + } else { + // 3 不需要报警,只处理监测值 + // 3.1 取出上一个监测值 + PgCO lastRec = coDao.findLastRecordByDevice(deviceId); + + // 3.2 计算数值的时间间隔 + long valueTimeInterval = this.getTime().getTimeInMillis() - lastRec.getUptime().getTime(); + + // 3.3 判断条件:是否与原值相同且相距在一小时以内 + if (Math.abs(value - lastRec.getCo()) > 0.01 || valueTimeInterval > CLASS_RED_ALARM_INTERVAL) { + // 3.4 将数据存入数据库 + coDao.addPblzRecord(value, TimeFormat.formatTimestamp(this.getTime().getTime()), deviceId); + + // 3.5 推送给市管廊公司平台 + String coResp = DataPushInterface.addCOData(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步一氧化碳浓度值结果:" + coResp); + } } } else { logger.warn("未找到资产[" + zcbh + "]"); diff --git a/src/com/szpg/plc/message/response/read/ReadHSValueCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadHSValueCommandResponse.java index 3b8f2f6..1980827 100644 --- a/src/com/szpg/plc/message/response/read/ReadHSValueCommandResponse.java +++ b/src/com/szpg/plc/message/response/read/ReadHSValueCommandResponse.java @@ -4,6 +4,7 @@ import java.util.Calendar; import java.util.List; +import com.szpg.db.data.PgSH; import org.apache.commons.lang3.StringUtils; import org.apache.log4j.Logger; @@ -25,6 +26,9 @@ import com.szpg.util.NumberFormat; import com.szpg.util.TimeFormat; +/** + * @author TAN YUE + */ public class ReadHSValueCommandResponse extends ReadMemoryCommandResponse { /** @@ -33,10 +37,24 @@ private static final long serialVersionUID = -3864512113984510244L; private final Logger logger = Logger.getLogger(this.getClass().getName()); - - private List hsnd; //硫化氢浓度值 - private List hsldbjz; //硫化氢联动报警值 - private String[] zcList; // 监测设备资产列表,从配置文件中获取 + + /** + * 硫化氢浓度值 + */ + private List hsnd; + + /** + * 硫化氢联动报警值 + */ + private List hsldbjz; + + /** + * 监测设备资产列表,从配置文件中获取 + */ + private String[] zcList; + + private boolean HS_ON_FJ = false; + private long CLASS_RED_ALARM_INTERVAL = 60 * 60 * 1000L; public ReadHSValueCommandResponse() { hsnd = new ArrayList(); @@ -74,94 +92,108 @@ 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 = hsnd.get(i); - + int deviceId = deviceDao.findDeviceIdByCode(zcbh); if (deviceId > 0) { - hsDao.addPblzRecord(hsnd.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), deviceId); - - // (一)如果有报警则立即推送 - // 判断是否超过报警阈值 + // 1 取出报警规则 PgAlarmRule rule = ruleDao.findRuleByDevice(deviceId); + + // 默认的报警阈值 + double high = 0.0; if (null != rule) { - double high = 0.0; try { high = NumberFormat.parseDouble(rule.getHighvalue(), "0.00"); } catch (Exception ex) { logger.error(ex); ex.printStackTrace(); } - - // 一氧化碳浓度超过高限阈值 - if (high > 0.0001 && value > high) { - PgAlarm alarm = new PgAlarm(); - alarm.setActive(1); - alarm.setAlarm_date(this.getTime().getTime()); - alarm.setAlarm_value(NumberFormat.format(value, "0.00")); - alarm.setAlarmdevid(deviceId); - alarm.setAlarmtypeid(PgAlarm.ALARM_TYPE_PGRUN); - alarm.setDescription("硫化氢浓度超过高限阈值"); - alarm.setUserid(null); - // 硫化氢报警定义为一级报警 - alarm.setAlarm_grade("一级报警"); - - alarmDao.insertAlarmRecord(alarm); - deviceDao.updateDeviceStatus(deviceId, "硫化氢浓度过高"); - - // 将报警日志推送至市级平台 - 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.addHSAlarmData(bjbh, zcbh, bjms, bjsj); - logger.info("同步硫化氢报警记录日志结果:" + jwbjResp); - - // 将报警值推送至市级平台 - String jwResp = DataPushInterface.addHSData(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); - logger.info("同步硫化氢浓度值结果:" + jwResp); - - // 自动打开当前舱段的排风机,手动关闭风机 - // 首先找到当前舱段的排风机资产编号 - if (Boolean.valueOf(Configure.getProperty("sys", "HS_ON_FJ", "false")) == true) { - String acucode = zcbh.substring(0, zcbh.indexOf(".", 6)); - String cabin = zcbh.substring(zcbh.lastIndexOf(".") + 1, zcbh.lastIndexOf(".") + 2); - List fjs = deviceDao.findDeviceByPositionAndType(acucode, "F", cabin); - if (null != fjs && fjs.isEmpty() == false) { - String baseURL = Configure.getProperty("sys", "PGDSC_API_URL"); - for (PgDevice fj : fjs) { - String fjzcbh = fj.getAssetcode(); + } - // 调用远程接口启动风机 - HttpRequest.sendGet(baseURL + "remote/turnOnFj.action", "zcbh=" + fjzcbh); - } - } + // 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_RED_ALARM_INTERVAL) { + continue; } } - } - - // (二)如果监测值有变化则推送 - // 判断硫化氢浓度值是否有变化 - double lastValue = hsDao.findLastValueByDevice(deviceId); - if (Math.abs(value - lastValue) > 0.01) { - // 将监测值推送至市级平台 - String coResp = DataPushInterface.addHSData(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); - logger.info("同步硫化氢浓度值结果:" + coResp); - } - - // (三)如果监测值没有变化 - // 每天小时各推送一个数据 - int minute = Calendar.getInstance().get(Calendar.MINUTE); - if (minute < 10) { - // 将监测值推送至市级平台 - String coResp = DataPushInterface.addHSData(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); - logger.info("同步硫化氢浓度值结果:" + coResp); + + // 2.5 插入监测数值 + hsDao.addPblzRecord(value, TimeFormat.formatTimestamp(this.getTime().getTime()), deviceId); + + // 2.6 推送给市管廊公司平台 + String hsResp = DataPushInterface.addHSData(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步硫化氢浓度值结果:" + hsResp); + + // 2.7 生成报警记录 + PgAlarm alarm = new PgAlarm().getHSAlarmInstance(); + + 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 hsbjResp = DataPushInterface.addHSAlarmData(bjbh, zcbh, bjms, bjsj); + logger.info("同步硫化氢报警记录日志结果:" + hsbjResp); + + // 2.10 联动打开风机 + // 自动打开当前舱段的排风机,手动关闭风机 + // 首先找到当前舱段的排风机资产编号 + if (HS_ON_FJ == true) { + String baseURL = Configure.getProperty("sys", "PGDSC_API_URL"); + HttpRequest.sendGet(baseURL + "remote/turnOnFjReactAlarm.action", "zcbh=" + zcbh); + } + } else { + // 3 不需要报警,只处理监测值 + // 3.1 取出上一个监测值 + PgSH lastRec = hsDao.findLastRecordByDevice(deviceId); + + // 3.2 计算数值的时间间隔 + long valueTimeInterval = this.getTime().getTimeInMillis() - lastRec.getUptime().getTime(); + + // 3.3 判断条件:是否与原值相同且相距在一小时以内 + if (Math.abs(value - lastRec.getSh()) > 0.01 || valueTimeInterval > CLASS_RED_ALARM_INTERVAL) { + // 3.4 将数据存入数据库 + hsDao.addPblzRecord(value, TimeFormat.formatTimestamp(this.getTime().getTime()), deviceId); + + // 3.5 推送给市管廊公司平台 + String hsResp = DataPushInterface.addHSData(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步硫化氢浓度值结果:" + hsResp); + } } } else { logger.warn("未找到资产[" + zcbh + "]"); diff --git a/src/com/szpg/plc/message/response/read/ReadO2ValueCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadO2ValueCommandResponse.java index 822beda..ebeb051 100644 --- a/src/com/szpg/plc/message/response/read/ReadO2ValueCommandResponse.java +++ b/src/com/szpg/plc/message/response/read/ReadO2ValueCommandResponse.java @@ -1,12 +1,5 @@ package com.szpg.plc.message.response.read; -import java.util.ArrayList; -import java.util.Calendar; -import java.util.List; - -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.PgDeviceDao; @@ -17,14 +10,19 @@ import com.szpg.db.dao.impl.PgO2DaoImpl; import com.szpg.db.data.PgAlarm; import com.szpg.db.data.PgAlarmRule; -import com.szpg.db.data.PgDevice; +import com.szpg.db.data.PgO2; 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; +import com.szpg.util.*; +import org.apache.commons.lang3.StringUtils; +import org.apache.log4j.Logger; +import java.util.ArrayList; +import java.util.List; + +/** + * 读取氧气值指令的响应消息 + * @author TAN YUE + */ public class ReadO2ValueCommandResponse extends ReadMemoryCommandResponse { /** @@ -33,14 +31,31 @@ private static final long serialVersionUID = -2816512676498637196L; private final Logger logger = Logger.getLogger(this.getClass().getName()); - - private List o2nd; // 氧气浓度值 - private List o2ldbjz; // 氧气联动报警值 - private String[] zcList; // 氧气监测设备资产列表,从配置文件中获取 + + /** + * 氧气浓度值 + */ + private List o2nd; + + /** + * 氧气联动报警值 + */ + private List o2ldbjz; + + /** + * 氧气监测设备资产列表,从配置文件中获取 + */ + private String[] zcList; + + private boolean O2_ON_FJ = false; + private long CLASS_RED_ALARM_INTERVAL = 60 * 60 * 1000L; public ReadO2ValueCommandResponse() { o2nd = new ArrayList(); o2ldbjz = new ArrayList(); + + O2_ON_FJ = Boolean.valueOf(Configure.getProperty("sys", "O2_ON_FJ", "false")); + CLASS_RED_ALARM_INTERVAL = Integer.parseInt(Configure.getProperty("sys", "CLASS_RED_ALARM_INTERVAL", "60")) * 60 * 1000L; } public List getO2nd() { @@ -78,90 +93,104 @@ if (null != zcList && zcList.length > 0) { // 遍历氧气设备列表,将氧气浓度监测值存入数据库 for (int i = 0; i < zcList.length; i++) { + // 资产编号(设备编号) String zcbh = zcList[i]; - + + // 监测值 float value = o2nd.get(i); int deviceId = deviceDao.findDeviceIdByCode(zcbh); if (deviceId > 0) { - o2Dao.addPblzRecord(o2nd.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), deviceId); - - // (一)如果有报警则立即推送 - // 判断是否超过报警阈值 + // 1 取出报警规则 PgAlarmRule rule = ruleDao.findRuleByDevice(deviceId); + + // 默认的报警阈值 + double low = 18.0; if (null != rule) { - double low = 0.0; try { low = NumberFormat.parseDouble(rule.getLowvalue(), "0.00"); } catch (Exception ex) { logger.error(ex); ex.printStackTrace(); } - - // 氧气浓度低于低限阈值 - if (low > 0.0001 && value < low) { - PgAlarm alarm = new PgAlarm(); - alarm.setActive(1); - alarm.setAlarm_date(this.getTime().getTime()); - alarm.setAlarm_value(NumberFormat.format(value, "0.00")); - alarm.setAlarmdevid(deviceId); - alarm.setAlarmtypeid(PgAlarm.ALARM_TYPE_PGRUN); - alarm.setDescription("氧气浓度低于低限阈值"); - alarm.setUserid(null); - // 氧气报警定义为一级报警 - alarm.setAlarm_grade("一级报警"); - - alarmDao.insertAlarmRecord(alarm); - deviceDao.updateDeviceStatus(deviceId, "氧气浓度过低"); - - // 将报警日志推送至市级平台 - 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.addO2AlarmData(bjbh, zcbh, bjms, bjsj); - logger.info("同步氧气报警记录日志结果:" + jwbjResp); - - // 将报警值推送至市级平台 - String jwResp = DataPushInterface.addO2Data(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); - logger.info("同步氧气浓度值结果:" + jwResp); - - // 自动打开当前舱段的排风机,手动关闭风机 - // 首先找到当前舱段的排风机资产编号 - if (Boolean.valueOf(Configure.getProperty("sys", "O2_ON_FJ", "false")) == true) { - String acucode = zcbh.substring(0, zcbh.indexOf(".", 6)); - String cabin = zcbh.substring(zcbh.lastIndexOf(".") + 1, zcbh.lastIndexOf(".") + 2); - List fjs = deviceDao.findDeviceByPositionAndType(acucode, "F", cabin); - if (null != fjs && fjs.isEmpty() == false) { - String baseURL = Configure.getProperty("sys", "PGDSC_API_URL"); - for (PgDevice fj : fjs) { - String fjzcbh = fj.getAssetcode(); + } - // 调用远程接口启动风机 - HttpRequest.sendGet(baseURL + "remote/turnOnFj.action", "zcbh=" + fjzcbh); - } - } + // 1 判断是否报警 + if (low > 0.0001 && value < low) { + // 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_RED_ALARM_INTERVAL) { + continue; } } - } - - // (二)如果监测值有变化则推送 - // 判断氧气浓度值是否有变化 - double lastValue = o2Dao.findLastValueByDevice(deviceId); - if (Math.abs(value - lastValue) > 0.01) { - // 将监测值推送至市级平台 + + // 2.5 插入监测数值 + o2Dao.addPblzRecord(value, TimeFormat.formatTimestamp(this.getTime().getTime()), deviceId); + + // 2.6 推送给市管廊公司平台 String o2Resp = DataPushInterface.addO2Data(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); logger.info("同步氧气浓度值结果:" + o2Resp); - } - - // (三)如果监测值有变化则推送 - // 每天小时各推送一个数据 - int minute = Calendar.getInstance().get(Calendar.MINUTE); - if (minute < 10) { - // 将监测值推送至市级平台 - String o2Resp = DataPushInterface.addO2Data(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); - logger.info("同步氧气浓度值结果:" + o2Resp); + + // 2.7 生成报警记录 + PgAlarm alarm = new PgAlarm().getO2AlarmInstance(); + + 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.addO2AlarmData(bjbh, zcbh, bjms, bjsj); + logger.info("同步氧气报警记录日志结果:" + jwbjResp); + + // 2.10 联动打开风机 + // 自动打开当前舱段的排风机,手动关闭风机 + // 首先找到当前舱段的排风机资产编号 + if (O2_ON_FJ == true) { + String baseURL = Configure.getProperty("sys", "PGDSC_API_URL"); + HttpRequest.sendGet(baseURL + "remote/turnOnFjReactAlarm.action", "zcbh=" + zcbh); + } + } else { + // 3 不需要报警,只处理监测值 + // 3.1 取出上一个监测值 + PgO2 lastRec = o2Dao.findLastRecordByDevice(deviceId); + + // 3.2 计算数值的时间间隔 + long valueTimeInterval = this.getTime().getTimeInMillis() - lastRec.getUptime().getTime(); + + // 3.3 判断条件:是否与原值相同且相距在一小时以内 + if (Math.abs(value - lastRec.getO2()) > 0.01 || valueTimeInterval > CLASS_RED_ALARM_INTERVAL) { + // 3.4 将数据存入数据库 + o2Dao.addPblzRecord(value, TimeFormat.formatTimestamp(this.getTime().getTime()), deviceId); + + // 3.5 推送给市管廊公司平台 + String o2Resp = DataPushInterface.addO2Data(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步氧气浓度值结果:" + o2Resp); + } } } else { logger.warn("未找到资产[" + zcbh + "]"); diff --git a/src/com/szpg/plc/message/response/read/ReadWSValueCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadWSValueCommandResponse.java index 3d3ebd0..db6af74 100644 --- a/src/com/szpg/plc/message/response/read/ReadWSValueCommandResponse.java +++ b/src/com/szpg/plc/message/response/read/ReadWSValueCommandResponse.java @@ -4,6 +4,7 @@ import java.util.Calendar; import java.util.List; +import com.szpg.db.data.PgTemphum; import org.apache.commons.lang3.StringUtils; import org.apache.log4j.Logger; @@ -25,6 +26,9 @@ import com.szpg.util.NumberFormat; import com.szpg.util.TimeFormat; +/** + * @author TAN YUE + */ public class ReadWSValueCommandResponse extends ReadMemoryCommandResponse { /** @@ -33,12 +37,35 @@ private static final long serialVersionUID = 2964733118081941174L; private final Logger logger = Logger.getLogger(this.getClass().getName()); - - private List wd; //温度监测值 - private List sd; //湿度监测值 - private List wdbjz; //温度报警阈值 - private List sdbjz; //湿度报警阈值 - private String[] zcList; //温湿度监测的资产列表,从配置文件中获取 + + /** + * 温度监测值 + */ + private List wd; + + /** + * 湿度监测值 + */ + private List sd; + + /** + * 温度报警阈值 + */ + private List wdbjz; + + /** + * 湿度报警阈值 + */ + private List sdbjz; + + /** + * 温湿度监测的资产列表,从配置文件中获取 + */ + private String[] zcList; + + private boolean WD_ON_FJ = false; + private boolean SD_ON_FJ = false; + private long CLASS_YELLOW_ALARM_INTERVAL = 360 * 60 * 1000L; public ReadWSValueCommandResponse() { wd = new ArrayList(); @@ -94,59 +121,85 @@ 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 wdValue = wd.get(i); float sdValue = sd.get(i); - + int deviceId = deviceDao.findDeviceIdByCode(zcbh); if (deviceId > 0) { - try { - wsDao.addWsdzRecord(wdValue, sdValue, TimeFormat.formatTimestamp(this.getTime().getTime()), deviceId); - } catch (Exception ex) { - logger.error("添加温湿度监测记录异常"); - } - - // (一)如果有报警则立即推送 - // 判断是否超过报警阈值 + // 1 取出报警规则 PgAlarmRule rule = ruleDao.findRuleByDevice(deviceId); + + // 默认的报警阈值 + double wdHigh = 0.0; + double sdHigh = 0.0; if (null != rule) { - double wdHigh = 0.0; - double sdHigh = 0.0; try { - if (null != rule) { - String highStr = rule.getHighvalue(); - if (null != highStr && highStr.isEmpty() == false && highStr.indexOf(";") > 0) { - wdHigh = NumberFormat.parseDouble(highStr.split(";")[0], "0.00"); - sdHigh = NumberFormat.parseDouble(highStr.split(";")[1], "0.00"); - } + String highStr = rule.getHighvalue(); + if (null != highStr && highStr.isEmpty() == false && highStr.indexOf(";") > 0) { + wdHigh = NumberFormat.parseDouble(highStr.split(";")[0], "0.00"); + sdHigh = NumberFormat.parseDouble(highStr.split(";")[1], "0.00"); } } catch (Exception ex) { logger.error(ex); ex.printStackTrace(); } - - // 温度超过高限阈值 - if (wdHigh > 0.0001 && wdValue > wdHigh) { - PgAlarm wdAlarm = new PgAlarm(); - wdAlarm.setActive(1); + } + + // 1 判断温湿度是否报警 + if (wdHigh > 0.0001 && wdValue > wdHigh) { + // 2 温度需要报警,处理报警记录和监测值 + // 2.1 取出上一个温度报警记录 + PgAlarm lastTempAlarm = alarmDao.findLatestAlarmByDeviceAndType(deviceId, "温度"); + + boolean insertAlarmFlag = true; + if (null != lastTempAlarm) { + // 2.2 计算与上一个报警记录的操作时间间隔 + long tempAlarmTimeInterval = this.getTime().getTimeInMillis() - lastTempAlarm.getLog_time().getTime(); + + // 2.3 上一个温度报警值 + double lastTempAlarmValue = 0.0; + try { + lastTempAlarmValue = NumberFormat.parseDouble(lastTempAlarm.getAlarm_value(), "0.00"); + } catch (Exception ex) { + logger.error(ex); + ex.printStackTrace(); + } + + if (Math.abs(wdValue - lastTempAlarmValue) < 0.01 && tempAlarmTimeInterval < CLASS_YELLOW_ALARM_INTERVAL) { + insertAlarmFlag = false; + } + } + + // 2.4 如果与前值不同 或者 时间在设定的阈值范围之外 则处理报警 + if (insertAlarmFlag == true) { + // 2.5 插入监测数值 + wsDao.addWsdzRecord(wdValue, sdValue, TimeFormat.formatTimestamp(this.getTime().getTime()), deviceId); + + // 2.6 推送给市管廊公司平台 + String wdResp = DataPushInterface.addTempData(zcbh, NumberFormat.format(wdValue, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步温度值结果:" + wdResp); + + // 2.7 生成报警记录 + PgAlarm wdAlarm = new PgAlarm().getTempAlarmInstance(); + wdAlarm.setAlarm_date(this.getTime().getTime()); wdAlarm.setAlarm_value(NumberFormat.format(wdValue, "0.00")); wdAlarm.setAlarmdevid(deviceId); - wdAlarm.setAlarmtypeid(PgAlarm.ALARM_TYPE_PGRUN); - wdAlarm.setDescription("温度超过高限阈值"); - wdAlarm.setUserid(null); - // 温湿度报警定义为二级报警 - wdAlarm.setAlarm_grade("二级报警"); - + wdAlarm.setLog_time(this.getTime().getTime()); + + // 2.8 将上一条报警记录消警 alarmDao.insertAlarmRecord(wdAlarm); 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"); @@ -154,47 +207,61 @@ String bjsj = date.replace("-", ""); String wdbjResp = DataPushInterface.addTempAlarmData(bjbh, zcbh, bjms, bjsj); logger.info("同步温度报警记录日志结果:" + wdbjResp); - - // 将报警值推送至市级平台 - String wdResp = DataPushInterface.addTempData(zcbh, NumberFormat.format(wdValue, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); - logger.info("同步温度值结果:" + wdResp); - + + // 2.10 联动打开风机 // 自动打开当前舱段的排风机,手动关闭风机 // 首先找到当前舱段的排风机资产编号 - if (Boolean.valueOf(Configure.getProperty("sys", "WD_ON_FJ", "false")) == true) { - String acucode = zcbh.substring(0, zcbh.indexOf(".", 6)); - String cabin = zcbh.substring(zcbh.lastIndexOf(".") + 1, zcbh.lastIndexOf(".") + 2); - List fjs = deviceDao.findDeviceByPositionAndType(acucode, "F", cabin); - if (null != fjs && fjs.isEmpty() == false) { - String baseURL = Configure.getProperty("sys", "PGDSC_API_URL"); - for (PgDevice fj : fjs) { - String fjzcbh = fj.getAssetcode(); - - // 调用远程接口启动风机 - HttpRequest.sendGet(baseURL + "remote/turnOnFj.action", "zcbh=" + fjzcbh); - } - } + if (WD_ON_FJ == true) { + String baseURL = Configure.getProperty("sys", "PGDSC_API_URL"); + HttpRequest.sendGet(baseURL + "remote/turnOnFjReactAlarm.action", "zcbh=" + zcbh); } } - - - // 湿度超过高限阈值 - if (sdHigh > 0.0001 && sdValue > sdHigh) { - PgAlarm sdAlarm = new PgAlarm(); - sdAlarm.setActive(1); + } else if (sdHigh > 0.0001 && sdValue > sdHigh) { + // 3 湿度需要报警,处理报警记录和监测值 + // 3.1 取出上一个报警记录 + PgAlarm lastHumAlarm = alarmDao.findLatestAlarmByDeviceAndType(deviceId, "湿度"); + + boolean insertAlarmFlag = true; + if (null != lastHumAlarm) { + // 3.2 计算与上一个报警记录的操作时间间隔 + long humAlarmTimeInterval = this.getTime().getTimeInMillis() - lastHumAlarm.getLog_time().getTime(); + + // 3.3 上一个湿度报警值 + double lastHumAlarmValue = 0.0; + try { + lastHumAlarmValue = NumberFormat.parseDouble(lastHumAlarm.getAlarm_value(), "0.00"); + } catch (Exception ex) { + logger.error(ex); + ex.printStackTrace(); + } + + if (Math.abs(wdValue - lastHumAlarmValue) < 0.01 && humAlarmTimeInterval < CLASS_YELLOW_ALARM_INTERVAL) { + insertAlarmFlag = false; + } + } + + // 3.4 如果与前值不同 或者 时间在设定的阈值范围外 则处理报警 + if (insertAlarmFlag == true) { + // 3.5 插入监测数值 + wsDao.addWsdzRecord(wdValue, sdValue, TimeFormat.formatTimestamp(this.getTime().getTime()), deviceId); + + // 3.6 推送给市管廊公司平台 + String sdResp = DataPushInterface.addHumData(zcbh, NumberFormat.format(sdValue, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步湿度值结果:" + sdResp); + + // 3.7 生成报警记录 + PgAlarm sdAlarm = new PgAlarm().getHumAlarmInstance(); + sdAlarm.setAlarm_date(this.getTime().getTime()); sdAlarm.setAlarm_value(NumberFormat.format(sdValue, "0.00")); sdAlarm.setAlarmdevid(deviceId); - sdAlarm.setAlarmtypeid(PgAlarm.ALARM_TYPE_PGRUN); - sdAlarm.setDescription("湿度超过高限阈值"); - sdAlarm.setUserid(null); - // 温湿度报警定义为二级报警 - sdAlarm.setAlarm_grade("二级报警"); - + sdAlarm.setLog_time(this.getTime().getTime()); + + // 3.8 将上一条报警记录消警 alarmDao.insertAlarmRecord(sdAlarm); deviceDao.updateDeviceStatus(deviceId, "湿度超高"); - - // 将报警日志推送至市级平台 + + // 3.9 向市级平台推送报警日志 String date = TimeFormat.formatDate(getTime().getTime()); int count = alarmDao.findAlarmCountByDate(date); String bjbh = "THXC." + date + "." + NumberFormat.format(count+1, "0000"); @@ -202,44 +269,32 @@ String bjsj = date.replace("-", ""); String sdbjResp = DataPushInterface.addHumAlarmData(bjbh, zcbh, bjms, bjsj); logger.info("同步湿度报警记录日志结果:" + sdbjResp); - - // 将报警值推送至市级平台 + + // 3.10 湿度不需要联动打开风机 + } + } else { + // 4 不需要报警,只处理监测值 + // 4.1 取出上一个监测值 + PgTemphum lastRec = wsDao.findLastRecordByDevice(deviceId); + + // 4.2 计算数值的时间间隔 + long valueTimeInterval = this.getTime().getTimeInMillis() - lastRec.getUptime().getTime(); + + // 4.3 判断条件:是否与原值(温度与湿度)相同且相距在六小时以内 + if (Math.abs(wdValue - lastRec.getTemp()) > 0.01 || + Math.abs(sdValue - lastRec.getHum()) > 0.01 || + valueTimeInterval > CLASS_YELLOW_ALARM_INTERVAL) { + // 4.4 将数据存入数据库 + wsDao.addWsdzRecord(wdValue, sdValue, TimeFormat.formatTimestamp(this.getTime().getTime()), deviceId); + + // 4.5 推送给市管廊公司平台 + String wdResp = DataPushInterface.addTempData(zcbh, NumberFormat.format(wdValue, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步温度值结果:" + wdResp); + String sdResp = DataPushInterface.addHumData(zcbh, NumberFormat.format(sdValue, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); logger.info("同步湿度值结果:" + sdResp); - - // 湿度不需要联动打开风机 } } - - - // (二)如果监测值有变化则推送 - // 判断温度值是否有变化 - double lastTemp = wsDao.findLastTempByDevice(deviceId); - if (Math.abs(wdValue - lastTemp) > 0.01) { - // 将监测值推送至市级平台 - String wdResp = DataPushInterface.addTempData(zcbh, NumberFormat.format(wdValue, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); - logger.info("同步温度值结果:" + wdResp); - } - - // 判断湿度值是否有变化 - double lastHum = wsDao.findLastHumByDevice(deviceId); - if (Math.abs(sdValue - lastHum) > 0.01) { - // 将监测值推送至市级平台 - String sdResp = DataPushInterface.addHumData(zcbh, NumberFormat.format(sdValue, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); - logger.info("同步湿度值结果:" + sdResp); - } - - // (三)如果监测值有变化则推送 - // 每天小时各推送一个数据 - int minute = Calendar.getInstance().get(Calendar.MINUTE); - if (minute < 10) { - // 将监测值推送至市级平台 - String wdResp = DataPushInterface.addTempData(zcbh, NumberFormat.format(wdValue, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); - logger.info("同步温度值结果:" + wdResp); - - String sdResp = DataPushInterface.addHumData(zcbh, NumberFormat.format(sdValue, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); - logger.info("同步湿度值结果:" + sdResp); - } } else { logger.warn("未找到资产[" + zcbh + "]"); } diff --git a/src/com/szpg/rmi/RemoteFJCommandAction.java b/src/com/szpg/rmi/RemoteFJCommandAction.java index 46f3d7f..1bb1239 100644 --- a/src/com/szpg/rmi/RemoteFJCommandAction.java +++ b/src/com/szpg/rmi/RemoteFJCommandAction.java @@ -8,6 +8,7 @@ import com.szpg.db.dao.impl.PgDeviceDaoImpl; import com.szpg.db.dao.impl.PgFjDaoImpl; import com.szpg.db.data.PgAcu; +import com.szpg.db.data.PgDevice; import com.szpg.db.data.PgFjStat; import com.szpg.plc.message.AppMessageConstants; import com.szpg.plc.message.command.ReadMemoryCommand; @@ -29,6 +30,7 @@ import org.apache.struts2.ServletActionContext; import z.json.JSONObject; +import java.util.List; import java.util.concurrent.ScheduledThreadPoolExecutor; import java.util.concurrent.TimeUnit; @@ -366,6 +368,29 @@ } /** + * 根据报警的资产编号联动打开风机 + * @return + * @throws Exception + */ + public String turnOnFjReactAlarm() throws Exception { + PgDeviceDao deviceDao = new PgDeviceDaoImpl(); + String acucode = zcbh.substring(0, zcbh.indexOf(".", 6)); + String cabin = zcbh.substring(zcbh.lastIndexOf(".") + 1, zcbh.lastIndexOf(".") + 2); + List fjs = deviceDao.findDeviceByPositionAndType(acucode, "F", cabin); + if (null != fjs && fjs.isEmpty() == false) { + String baseURL = Configure.getProperty("sys", "PGDSC_API_URL"); + + // 打开舱内的一个风机即可 + String fjzcbh = fjs.get(0).getAssetcode(); + + // 调用远程接口启动风机 + HttpRequest.sendGet(baseURL + "remote/turnOnFj.action", "zcbh=" + fjzcbh); + } + + return null; + } + + /** * 给前端返回 * @param jResult * @throws Exception diff --git a/src/com/szpg/db/dao/PgAlarmDao.java b/src/com/szpg/db/dao/PgAlarmDao.java index 11d8a1d..4ab98d4 100644 --- a/src/com/szpg/db/dao/PgAlarmDao.java +++ b/src/com/szpg/db/dao/PgAlarmDao.java @@ -6,6 +6,7 @@ public int findAlarmCountByDate(String date); public PgAlarm findLatestAlarmByDevice(int deviceId); + public PgAlarm findLatestAlarmByDeviceAndType(int deviceId, String type); public long insertAlarmRecord(PgAlarm alarmRecord); } diff --git a/src/com/szpg/db/dao/PgCODao.java b/src/com/szpg/db/dao/PgCODao.java index 1664f51..5098321 100644 --- a/src/com/szpg/db/dao/PgCODao.java +++ b/src/com/szpg/db/dao/PgCODao.java @@ -20,6 +20,7 @@ public List findPblzByDeviceAndTm(Integer deviceid, String start, String end); public double findLastValueByDevice(Integer deviceid); + public PgCO findLastRecordByDevice(Integer id); public int addPblzRecord(PgCO ch4); public int addPblzRecord(float value, String tm, int deviceid); diff --git a/src/com/szpg/db/dao/PgCh4Dao.java b/src/com/szpg/db/dao/PgCh4Dao.java index e23b964..61fdfcd 100644 --- a/src/com/szpg/db/dao/PgCh4Dao.java +++ b/src/com/szpg/db/dao/PgCh4Dao.java @@ -20,6 +20,7 @@ public List findPblzByDeviceAndTm(Integer deviceid, String start, String end); public double findLastValueByDevice(Integer deviceid); + public PgCh4 findLastRecordByDevice(Integer deviceid); public int addPblzRecord(PgCh4 ch4); public int addPblzRecord(float value, String tm, int deviceid); diff --git a/src/com/szpg/db/dao/PgHSDao.java b/src/com/szpg/db/dao/PgHSDao.java index f89b044..0f0ee53 100644 --- a/src/com/szpg/db/dao/PgHSDao.java +++ b/src/com/szpg/db/dao/PgHSDao.java @@ -20,6 +20,7 @@ public List findPblzByDeviceAndTm(Integer deviceid, String start, String end); public double findLastValueByDevice(Integer deviceid); + public PgSH findLastRecordByDevice(Integer deviceid); public int addPblzRecord(PgSH hs); public int addPblzRecord(float value, String tm, int deviceid); diff --git a/src/com/szpg/db/dao/PgO2Dao.java b/src/com/szpg/db/dao/PgO2Dao.java index 0b3d0bf..678adab 100644 --- a/src/com/szpg/db/dao/PgO2Dao.java +++ b/src/com/szpg/db/dao/PgO2Dao.java @@ -20,6 +20,7 @@ public List findPblzByDeviceAndTm(Integer deviceid, String start, String end); public double findLastValueByDevice(Integer deviceid); + public PgO2 findLastRecordByDevice(Integer deviceid); public int addPblzRecord(PgO2 ch4); public int addPblzRecord(float value, String tm, int deviceid); diff --git a/src/com/szpg/db/dao/PgWsDao.java b/src/com/szpg/db/dao/PgWsDao.java index 370a83f..bfd0eed 100644 --- a/src/com/szpg/db/dao/PgWsDao.java +++ b/src/com/szpg/db/dao/PgWsDao.java @@ -21,6 +21,7 @@ public double findLastTempByDevice(Integer deviceid); public double findLastHumByDevice(Integer deviceid); + public PgTemphum findLastRecordByDevice(Integer deviceid); public int addWsdzRecord(PgTemphum wsdz); public int addWsdzRecord(float temp, float hum, String tm, int deviceid); diff --git a/src/com/szpg/db/dao/impl/PgAlarmDaoImpl.java b/src/com/szpg/db/dao/impl/PgAlarmDaoImpl.java index cedf5fc..ce9ee0f 100644 --- a/src/com/szpg/db/dao/impl/PgAlarmDaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgAlarmDaoImpl.java @@ -8,7 +8,6 @@ import org.apache.commons.dbutils.DbUtils; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.handlers.ArrayListHandler; -import org.apache.commons.dbutils.handlers.BeanListHandler; import org.apache.commons.dbutils.handlers.ScalarHandler; import org.apache.log4j.Logger; @@ -17,6 +16,9 @@ import com.szpg.db.util.ConnectionManager; import com.szpg.util.TimeFormat; +/** + * @author TAN YUE + */ public class PgAlarmDaoImpl implements PgAlarmDao { private final Logger logger = Logger.getLogger(this.getClass().getName()); @@ -33,7 +35,7 @@ QueryRunner runner = new QueryRunner(); param[0] = date; - int count = ((Number) runner.query(conn, sql, new ScalarHandler(1), param)).intValue(); + int count = (runner.query(conn, sql, new ScalarHandler(1), param)).intValue(); return count; } catch (Exception ex) { logger.error("根据日期查询报警记录数异常", ex); @@ -51,7 +53,7 @@ public PgAlarm findLatestAlarmByDevice(int deviceId) { Connection conn = null; String queryStr = "SELECT A.* FROM " + - "(SELECT ID, ACTIVE, ALARM_DATE, ALARM_VALUE, DESCRIPTION, ALARMDEVID, ALARMTYPEID, ALARM_GRADE FROM PG_ALARM WHERE ALARMDEVID = ? ORDER BY ALARM_DATE DESC) A " + + "(SELECT ID, ACTIVE, ALARM_DATE, ALARM_VALUE, DESCRIPTION, ALARMDEVID, ALARMTYPEID, ALARM_GRADE, LOG_TIME, LOG_DESC FROM PG_ALARM WHERE ALARMDEVID = ? ORDER BY ALARM_DATE DESC) A " + "WHERE ROWNUM <= 1"; Object[] param = new Object[1]; try { @@ -60,7 +62,7 @@ QueryRunner runner = new QueryRunner(); param[0] = deviceId; - List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler(), param); + List tempList = runner.query(conn, queryStr, new ArrayListHandler(), param); if (null != tempList && tempList.isEmpty() == false) { PgAlarm alarm = new PgAlarm(); Object[] item = tempList.get(0); @@ -79,6 +81,74 @@ alarm.setAlarmtypeid(((Number) item[6]).intValue()); alarm.setAlarm_grade((String) item[7]); + if (null != item[8]) { + long logTmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[8]).toJdbc()).getTime(); + Calendar logCal = Calendar.getInstance(); + logCal.setTimeInMillis(logTmValue); + alarm.setLog_time(logCal.getTime()); + } else { + alarm.setLog_time(null); + } + + alarm.setLog_desc((String) item[9]); + + logger.debug("根据设备查询最新报警记录成功"); + + return alarm; + } else { + return null; + } + } catch (Exception ex) { + logger.error("根据设备查询最新报警记录成功", ex); + return null; + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + } + + @Override + public PgAlarm findLatestAlarmByDeviceAndType(int deviceId, String type) { + Connection conn = null; + String queryStr = "SELECT A.* FROM " + + "(SELECT ID, ACTIVE, ALARM_DATE, ALARM_VALUE, DESCRIPTION, ALARMDEVID, ALARMTYPEID, ALARM_GRADE, LOG_TIME, LOG_DESC FROM PG_ALARM WHERE ALARMDEVID = ? AND DESCRIPTION LIKE ? ORDER BY ALARM_DATE DESC) A " + + "WHERE ROWNUM <= 1"; + Object[] param = new Object[2]; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + QueryRunner runner = new QueryRunner(); + param[0] = deviceId; + param[1] = "%" + type + "%"; + + List tempList = runner.query(conn, queryStr, new ArrayListHandler(), param); + if (null != tempList && tempList.isEmpty() == false) { + PgAlarm alarm = new PgAlarm(); + Object[] item = tempList.get(0); + + alarm.setId(((Number) item[0]).intValue()); + alarm.setActive(((Number) item[1]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + alarm.setAlarm_date(cal.getTime()); + + alarm.setAlarm_value((String) item[3]); + alarm.setDescription((String) item[4]); + alarm.setAlarmdevid(((Number) item[5]).intValue()); + alarm.setAlarmtypeid(((Number) item[6]).intValue()); + alarm.setAlarm_grade((String) item[7]); + + long logTmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[8]).toJdbc()).getTime(); + Calendar logCal = Calendar.getInstance(); + logCal.setTimeInMillis(logTmValue); + alarm.setLog_time(logCal.getTime()); + alarm.setLog_desc((String) item[9]); + logger.debug("根据设备查询最新报警记录成功"); return alarm; @@ -111,28 +181,31 @@ QueryRunner runner = new QueryRunner(); // 查询同一设备是否有正在报警的消息 - Number id = (Number) runner.query(conn, querySql, new ScalarHandler(1), queryParam); + Number id = runner.query(conn, querySql, new ScalarHandler(1), queryParam); if (null != id) { // 找到设备已存在的记录 // 1先将正在报警的设备自动消警 - String updateSql = "UPDATE PG_ALARM SET ACTIVE=0 WHERE ID=?"; + String updateSql = "UPDATE PG_ALARM SET ACTIVE=0, LOG_TIME=SYSDATE, LOG_DESC=? WHERE ID=?"; - Object[] updateParam = new Object[1]; - updateParam[0] = id.longValue(); - - runner.update(conn, updateSql, updateParam); // 更新报警记录 - } + Object[] updateParam = new Object[2]; + updateParam[0] = "重复报警自动消警"; + updateParam[1] = id.longValue(); + + // 更新报警记录 + runner.update(conn, updateSql, updateParam); + } // 插入新的报警记录 String insertSql = "INSERT INTO PG_ALARM " + - "(ID, ACTIVE, ALARM_DATE, ALARM_VALUE, DESCRIPTION, ALARMDEVID, ALARMTYPEID, USERID, ALARM_GRADE) " + - "VALUES (?, ?, TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), ?, ?, ?, ?, ?, ?)"; + "(ID, ACTIVE, ALARM_DATE, ALARM_VALUE, DESCRIPTION, ALARMDEVID, ALARMTYPEID, USERID, ALARM_GRADE, LOG_TIME, LOG_DESC) " + + "VALUES (?, ?, TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), ?, ?, ?, ?, ?, ?, TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), ?)"; String sqlId = "SELECT SEQ_PG_ALARM_ID.NEXTVAL FROM DUAL"; - long newId = ((Number) runner.query(conn, sqlId, new ScalarHandler(1))).longValue(); // 获取新的id - - Object[] params = new Object[9]; + // 获取新的id + long newId = (runner.query(conn, sqlId, new ScalarHandler(1))).longValue(); + + Object[] params = new Object[11]; params[0] = newId; params[1] = alarmRecord.getActive(); @@ -143,8 +216,11 @@ params[6] = alarmRecord.getAlarmtypeid(); params[7] = alarmRecord.getUserid(); params[8] = alarmRecord.getAlarm_grade(); - - int count = runner.update(conn, insertSql, params); // 新增主表 + params[9] = TimeFormat.formatTimestamp(alarmRecord.getLog_time()); + params[10] = alarmRecord.getLog_desc(); + + // 新增报警记录 + int count = runner.update(conn, insertSql, params); if (count > 0) { logger.debug("插入报警数据成功"); diff --git a/src/com/szpg/db/dao/impl/PgCODaoImpl.java b/src/com/szpg/db/dao/impl/PgCODaoImpl.java index 186ac16..70d672c 100644 --- a/src/com/szpg/db/dao/impl/PgCODaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgCODaoImpl.java @@ -292,6 +292,51 @@ } @Override + public PgCO findLastRecordByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT ID, CO, LOGTIME, PGDEVICEID FROM (SELECT * FROM PG_CO WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, sql, new ArrayListHandler(), param); + if (null != tempList && tempList.size() == 1) { + PgCO co = new PgCO(); + Object[] item = tempList.get(0); + + co.setId(((Number) item[0]).intValue()); + co.setCo(Float.parseFloat((String) item[1])); + co.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + co.setLogtime(cal.getTime()); + co.setUptime(cal.getTime()); + + logger.debug("根据设备ID查询最新一氧化碳监测记录成功" + co + "]"); + + return co; + } else { + return null; + } + } catch (Exception ex) { + logger.error("根据设备ID查询最新一氧化碳监测记录异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override public int addPblzRecord(PgCO co) { return addPblzRecord(co.getCo(), co.getTmStr(), co.getPgdeviceid()); } diff --git a/src/com/szpg/db/dao/impl/PgCh4DaoImpl.java b/src/com/szpg/db/dao/impl/PgCh4DaoImpl.java index 0ed139e..768b6a5 100644 --- a/src/com/szpg/db/dao/impl/PgCh4DaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgCh4DaoImpl.java @@ -54,9 +54,9 @@ list.add(ch4); } return list; - } - else + } else { return null; + } } catch (Exception ex) { logger.error("查询所有甲烷监测值异常", ex); } finally { @@ -100,9 +100,9 @@ logger.debug("根据ID查询甲烷监测值成功" + ch4 + "]"); return ch4; - } - else + } else { return null; + } } catch (Exception ex) { logger.error("根据ID查询甲烷监测值异常", ex); } finally { @@ -149,9 +149,9 @@ logger.debug("根据设备ID查询最新的甲烷监测值成功" + ch4 + "]"); return ch4; - } - else + } else { return null; + } } catch (Exception ex) { logger.error("根据设备ID查询最新的甲烷监测值异常", ex); } finally { @@ -199,9 +199,9 @@ list.add(ch4); } return list; - } - else + } else { return null; + } } catch (Exception ex) { logger.error("根据设备ID查询甲烷监测值异常", ex); } finally { @@ -251,9 +251,9 @@ list.add(ch4); } return list; - } - else + } else { return null; + } } catch (Exception ex) { logger.error("根据设备ID和时间查询甲烷监测值异常", ex); } finally { @@ -293,6 +293,51 @@ } @Override + public PgCh4 findLastRecordByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT ID, CH4, LOGTIME, PGDEVICEID FROM (SELECT * FROM PG_CH4 WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, sql, new ArrayListHandler(), param); + if (null != tempList && tempList.size() == 1) { + PgCh4 ch4 = new PgCh4(); + Object[] item = tempList.get(0); + + ch4.setId(((Number) item[0]).intValue()); + ch4.setCh4(Float.parseFloat((String) item[1])); + ch4.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + ch4.setLogtime(cal.getTime()); + ch4.setUptime(cal.getTime()); + + logger.debug("根据设备ID查询最新甲烷监测记录成功" + ch4 + "]"); + + return ch4; + } else { + return null; + } + } catch (Exception ex) { + logger.error("根据设备ID查询最新甲烷监测记录异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override public int addPblzRecord(PgCh4 ch4) { return addPblzRecord(ch4.getCh4(), ch4.getTmStr(), ch4.getPgdeviceid()); } diff --git a/src/com/szpg/db/dao/impl/PgHSDaoImpl.java b/src/com/szpg/db/dao/impl/PgHSDaoImpl.java index 892e175..fa4ea02 100644 --- a/src/com/szpg/db/dao/impl/PgHSDaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgHSDaoImpl.java @@ -292,6 +292,51 @@ } @Override + public PgSH findLastRecordByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT ID, SH, LOGTIME, PGDEVICEID FROM (SELECT * FROM PG_SH WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, sql, new ArrayListHandler(), param); + if (null != tempList && tempList.size() == 1) { + PgSH sh = new PgSH(); + Object[] item = tempList.get(0); + + sh.setId(((Number) item[0]).intValue()); + sh.setSh(Float.parseFloat((String) item[1])); + sh.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + sh.setLogtime(cal.getTime()); + sh.setUptime(cal.getTime()); + + logger.debug("根据设备ID查询最新硫化氢监测记录成功" + sh + "]"); + + return sh; + } else { + return null; + } + } catch (Exception ex) { + logger.error("根据设备ID查询最新硫化氢监测记录异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override public int addPblzRecord(PgSH sh) { return addPblzRecord(sh.getSh(), sh.getTmStr(), sh.getPgdeviceid()); } diff --git a/src/com/szpg/db/dao/impl/PgO2DaoImpl.java b/src/com/szpg/db/dao/impl/PgO2DaoImpl.java index f58f8cd..842291b 100644 --- a/src/com/szpg/db/dao/impl/PgO2DaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgO2DaoImpl.java @@ -54,9 +54,9 @@ list.add(o2); } return list; - } - else + } else { return null; + } } catch (Exception ex) { logger.error("查询所有氧气监测值异常", ex); } finally { @@ -100,9 +100,9 @@ logger.debug("根据ID查询氧气监测值成功" + o2 + "]"); return o2; - } - else + } else { return null; + } } catch (Exception ex) { logger.error("根据ID查询氧气监测值异常", ex); } finally { @@ -148,9 +148,9 @@ logger.debug("根据设备ID查询最新的氧气监测值成功" + o2 + "]"); return o2; - } - else + } else { return null; + } } catch (Exception ex) { logger.error("根据设备ID查询最新的硫化氢监测值异常", ex); } finally { @@ -198,9 +198,9 @@ list.add(o2); } return list; - } - else + } else { return null; + } } catch (Exception ex) { logger.error("根据设备ID查询氧气监测值异常", ex); } finally { @@ -250,9 +250,9 @@ list.add(o2); } return list; - } - else + } else { return null; + } } catch (Exception ex) { logger.error("根据设备ID和时间查询氧气监测值异常", ex); } finally { @@ -292,6 +292,51 @@ } @Override + public PgO2 findLastRecordByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT ID, O2, LOGTIME, PGDEVICEID FROM (SELECT * FROM PG_O2 WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, sql, new ArrayListHandler(), param); + if (null != tempList && tempList.size() == 1) { + PgO2 o2 = new PgO2(); + Object[] item = tempList.get(0); + + o2.setId(((Number) item[0]).intValue()); + o2.setO2(Float.parseFloat((String) item[1])); + o2.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + o2.setLogtime(cal.getTime()); + o2.setUptime(cal.getTime()); + + logger.debug("根据设备ID查询最新氧气监测记录成功" + o2 + "]"); + + return o2; + } else { + return null; + } + } catch (Exception ex) { + logger.error("根据设备ID查询最新氧气监测记录异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override public int addPblzRecord(PgO2 o2) { return addPblzRecord(o2.getO2(), o2.getTmStr(), o2.getPgdeviceid()); } @@ -316,10 +361,11 @@ QueryRunner runner = new QueryRunner(); int count = runner.update(conn, insertStr, params); - if (count > 0) + if (count > 0) { logger.debug("插入氧气监测值成功[tm=" + tm + ", value=" + value + ", deviceid=" + deviceid + "]"); - else + } else { logger.error("插入氧气监测值失败!"); + } return count; } catch (Exception ex) { diff --git a/src/com/szpg/db/dao/impl/PgWsDaoImpl.java b/src/com/szpg/db/dao/impl/PgWsDaoImpl.java index 679b58f..77925f7 100644 --- a/src/com/szpg/db/dao/impl/PgWsDaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgWsDaoImpl.java @@ -323,6 +323,52 @@ } @Override + public PgTemphum findLastRecordByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT ID, TEMP, HUM, LOGTIME, PGDEVICEID FROM (SELECT * FROM PG_TEMPHUM WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, sql, new ArrayListHandler(), param); + if (null != tempList && tempList.size() == 1) { + PgTemphum temphum = new PgTemphum(); + Object[] item = tempList.get(0); + + temphum.setId(((Number) item[0]).intValue()); + temphum.setTemp(Float.parseFloat((String) item[1])); + temphum.setHum(Float.parseFloat((String) item[2])); + temphum.setPgdeviceid(((Number) item[4]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + temphum.setLogtime(cal.getTime()); + temphum.setUptime(cal.getTime()); + + logger.debug("根据设备ID查询最新温湿度监测记录成功" + temphum + "]"); + + return temphum; + } else { + return null; + } + } catch (Exception ex) { + logger.error("根据设备ID查询最新温湿度监测记录异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override public int addWsdzRecord(PgTemphum ws) { return addWsdzRecord(ws.getTemp(), ws.getHum(), ws.getTmStr(), ws.getPgdeviceid()); } diff --git a/src/com/szpg/db/data/PgAlarm.java b/src/com/szpg/db/data/PgAlarm.java index 5a73ba9..4b97e6a 100644 --- a/src/com/szpg/db/data/PgAlarm.java +++ b/src/com/szpg/db/data/PgAlarm.java @@ -1,9 +1,12 @@ package com.szpg.db.data; -import java.util.Date; - import com.szpg.util.TimeFormat; +import java.util.Date; + +/** + * @author TAN YUE + */ public class PgAlarm implements java.io.Serializable { /** @@ -20,11 +23,28 @@ private Integer alarmtypeid; private Integer userid; private String alarm_grade; - - public static Integer ALARM_TYPE_DEVRUN = 1; //管廊设备运行故障 - public static Integer ALARM_TYPE_PGRUN = 2; //管廊运行环境报警 - public static Integer ALARM_TYPE_PGSAF = 3; //管廊安全防范报警 - public static Integer ALARM_TYPE_INPG = 4; //人员入廊超时报警 + private Date log_time; + private String log_desc; + + /** + * 管廊设备运行故障 + */ + public static Integer ALARM_TYPE_DEVRUN = 1; + + /** + * 管廊运行环境报警 + */ + public static Integer ALARM_TYPE_PGRUN = 2; + + /** + * 管廊安全防范报警 + */ + public static Integer ALARM_TYPE_PGSAF = 3; + + /** + * 人员入廊超时报警 + */ + public static Integer ALARM_TYPE_INPG = 4; public Integer getId() { return id; @@ -97,10 +117,130 @@ public void setAlarm_grade(String alarm_grade) { this.alarm_grade = alarm_grade; } + + public Date getLog_time() { + if (null == log_time) { + return alarm_date; + } + return log_time; + } + + public void setLog_time(Date log_time) { + this.log_time = log_time; + } + + public String getLog_desc() { + return log_desc; + } + + public void setLog_desc(String log_desc) { + this.log_desc = log_desc; + } @Override public String toString() { return "PgAlarm[alarmValue=" + alarm_value + ", alarmDate=" + TimeFormat.formatTimestamp(alarm_date) + ", alarmDevId= " + alarmdevid + "]"; } + /** + * 生成氧气报警记录 + * @return + */ + public PgAlarm getO2AlarmInstance() { + PgAlarm alarm = new PgAlarm(); + alarm.setActive(1); + alarm.setAlarmtypeid(PgAlarm.ALARM_TYPE_PGRUN); + alarm.setDescription("氧气浓度低于低限阈值"); + alarm.setUserid(null); + + // 氧气报警定义为一级报警 + alarm.setAlarm_grade("一级报警"); + + return alarm; + } + + /** + * 生成一氧化碳报警记录 + * @return + */ + public PgAlarm getCOAlarmInstance() { + PgAlarm alarm = new PgAlarm(); + alarm.setActive(1); + alarm.setAlarmtypeid(PgAlarm.ALARM_TYPE_PGRUN); + alarm.setDescription("一氧化碳浓度超过高限阈值"); + alarm.setUserid(null); + + // 一氧化碳报警定义为一级报警 + alarm.setAlarm_grade("一级报警"); + + return alarm; + } + + /** + * 生成硫化氢报警记录 + * @return + */ + public PgAlarm getHSAlarmInstance() { + PgAlarm alarm = new PgAlarm(); + alarm.setActive(1); + alarm.setAlarmtypeid(PgAlarm.ALARM_TYPE_PGRUN); + alarm.setDescription("硫化氢浓度超过高限阈值"); + alarm.setUserid(null); + + // 硫化氢报警定义为一级报警 + alarm.setAlarm_grade("一级报警"); + + return alarm; + } + + /** + * 生成甲烷报警记录 + * @return + */ + public PgAlarm getCH4AlarmInstance() { + PgAlarm alarm = new PgAlarm(); + alarm.setActive(1); + alarm.setAlarmtypeid(PgAlarm.ALARM_TYPE_PGRUN); + alarm.setDescription("甲烷浓度超过高限阈值"); + alarm.setUserid(null); + + // 甲烷报警定义为二级报警 + alarm.setAlarm_grade("二级报警"); + + return alarm; + } + + /** + * 生成温度报警记录 + * @return + */ + public PgAlarm getTempAlarmInstance() { + PgAlarm alarm = new PgAlarm(); + alarm.setActive(1); + alarm.setAlarmtypeid(PgAlarm.ALARM_TYPE_PGRUN); + alarm.setDescription("温度超过高限阈值"); + alarm.setUserid(null); + + // 温度定义为二级报警 + alarm.setAlarm_grade("二级报警"); + + return alarm; + } + + /** + * 生成湿度报警记录 + * @return + */ + public PgAlarm getHumAlarmInstance() { + PgAlarm alarm = new PgAlarm(); + alarm.setActive(1); + alarm.setAlarmtypeid(PgAlarm.ALARM_TYPE_PGRUN); + alarm.setDescription("湿度超过高限阈值"); + alarm.setUserid(null); + + // 湿度报警定义为二级报警 + alarm.setAlarm_grade("二级报警"); + + return alarm; + } } diff --git a/src/com/szpg/plc/message/response/read/ReadCH4ValueCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadCH4ValueCommandResponse.java index c26ffa5..13c5968 100644 --- a/src/com/szpg/plc/message/response/read/ReadCH4ValueCommandResponse.java +++ b/src/com/szpg/plc/message/response/read/ReadCH4ValueCommandResponse.java @@ -4,6 +4,7 @@ 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; @@ -25,6 +26,9 @@ import com.szpg.util.NumberFormat; import com.szpg.util.TimeFormat; +/** + * @author TAN YUE + */ public class ReadCH4ValueCommandResponse extends ReadMemoryCommandResponse { /** @@ -33,10 +37,24 @@ private static final long serialVersionUID = 8081222348890587881L; private final Logger logger = Logger.getLogger(this.getClass().getName()); - - private List jwnd; //甲烷浓度值 - private List jwldbjz; //甲烷联动报警值 - private String[] zcList; //甲烷监测的资产列表,从配置文件中获取 + + /** + * 甲烷浓度值 + */ + private List jwnd; + + /** + * 甲烷联动报警值 + */ + private List jwldbjz; + + /** + * 甲烷监测的资产列表,从配置文件中获取 + */ + private String[] zcList; + + private boolean CH4_ON_FJ = false; + private long CLASS_YELLOW_ALARM_INTERVAL = 360 * 60 * 1000L; public ReadCH4ValueCommandResponse() { jwnd = new ArrayList(); @@ -74,94 +92,108 @@ 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) { - ch4Dao.addPblzRecord(jwnd.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), deviceId); - - // (一)如果有报警则立即推送 - // 判断是否超过报警阈值 + // 1 取出报警规则 PgAlarmRule rule = ruleDao.findRuleByDevice(deviceId); + + // 默认的报警阈值 + double high = 0.0; if (null != rule) { - double high = 0.0; try { high = NumberFormat.parseDouble(rule.getHighvalue(), "0.00"); } catch (Exception ex) { logger.error(ex); ex.printStackTrace(); } - - // 甲烷浓度超过高限阈值 - if (high > 0.0001 && value > high) { - PgAlarm alarm = new PgAlarm(); - alarm.setActive(1); - alarm.setAlarm_date(this.getTime().getTime()); - alarm.setAlarm_value(NumberFormat.format(value, "0.00")); - alarm.setAlarmdevid(deviceId); - alarm.setAlarmtypeid(PgAlarm.ALARM_TYPE_PGRUN); - alarm.setDescription("甲烷浓度超过高限阈值"); - alarm.setUserid(null); - // 甲烷报警定义为二级报警 - alarm.setAlarm_grade("二级报警"); - - alarmDao.insertAlarmRecord(alarm); - deviceDao.updateDeviceStatus(deviceId, "甲烷浓度过高"); - - // 将报警日志推送至市级平台 - 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); - - // 将报警值推送至市级平台 - String jwResp = DataPushInterface.addCH4Data(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); - logger.info("同步甲烷浓度值结果:" + jwResp); + } - // 自动打开当前舱段的排风机,手动关闭风机 - // 首先找到当前舱段的排风机资产编号 - if (Boolean.valueOf(Configure.getProperty("sys", "CH4_ON_FJ", "false")) == true) { - String acucode = zcbh.substring(0, zcbh.indexOf(".", 6)); - String cabin = zcbh.substring(zcbh.lastIndexOf(".") + 1, zcbh.lastIndexOf(".") + 2); - List fjs = deviceDao.findDeviceByPositionAndType(acucode, "F", cabin); - if (null != fjs && fjs.isEmpty() == false) { - String baseURL = Configure.getProperty("sys", "PGDSC_API_URL"); - for (PgDevice fj : fjs) { - String fjzcbh = fj.getAssetcode(); + // 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(); - // 调用远程接口启动风机 - HttpRequest.sendGet(baseURL + "remote/turnOnFj.action", "zcbh=" + fjzcbh); - } - } + // 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; } } - } - - // (二)如果监测值有变化则推送 - // 判断甲烷浓度值是否有变化 - double lastValue = ch4Dao.findLastValueByDevice(deviceId); - if (Math.abs(value - lastValue) > 0.01) { - // 将监测值推送至市级平台 + + // 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); - } - - // (三)如果监测值有变化则推送 - // 每天小时各推送一个数据 - int minute = Calendar.getInstance().get(Calendar.MINUTE); - if (minute < 10) { - // 将监测值推送至市级平台 - 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 + "]"); diff --git a/src/com/szpg/plc/message/response/read/ReadCOValueCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadCOValueCommandResponse.java index 1920b62..0b27d03 100644 --- a/src/com/szpg/plc/message/response/read/ReadCOValueCommandResponse.java +++ b/src/com/szpg/plc/message/response/read/ReadCOValueCommandResponse.java @@ -4,6 +4,8 @@ import java.util.Calendar; import java.util.List; +import com.szpg.db.data.PgCO; +import com.szpg.util.*; import org.apache.commons.lang3.StringUtils; import org.apache.log4j.Logger; @@ -18,11 +20,10 @@ import com.szpg.db.data.PgAlarm; import com.szpg.db.data.PgAlarmRule; import com.szpg.plc.message.response.ReadMemoryCommandResponse; -import com.szpg.util.Configure; -import com.szpg.util.DataPushInterface; -import com.szpg.util.NumberFormat; -import com.szpg.util.TimeFormat; +/** + * @author TAN YUE + */ public class ReadCOValueCommandResponse extends ReadMemoryCommandResponse { /** @@ -31,10 +32,24 @@ private static final long serialVersionUID = -6176747812714170040L; private final Logger logger = Logger.getLogger(this.getClass().getName()); - - private List cond; //一氧化碳浓度值 - private List coldbjz; //一氧化碳联动报警值 - private String[] zcList; //一氧化碳监测的资产列表,从配置文件中获取 + + /** + * 一氧化碳浓度值 + */ + private List cond; + + /** + * 一氧化碳联动报警值 + */ + private List coldbjz; + + /** + * 一氧化碳监测的资产列表,从配置文件中获取 + */ + private String[] zcList; + + private boolean CO_ON_FJ = false; + private long CLASS_RED_ALARM_INTERVAL = 60 * 60 * 1000L; public ReadCOValueCommandResponse() { cond = new ArrayList(); @@ -72,80 +87,108 @@ 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 = cond.get(i); - + int deviceId = deviceDao.findDeviceIdByCode(zcbh); if (deviceId > 0) { - coDao.addPblzRecord(cond.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), deviceId); - - // (一)如果有报警则立即推送 - // 判断是否超过报警阈值 + // 1 取出报警规则 PgAlarmRule rule = ruleDao.findRuleByDevice(deviceId); + + // 默认的报警阈值 + double high = 0.0; if (null != rule) { - double high = 0.0; try { high = NumberFormat.parseDouble(rule.getHighvalue(), "0.00"); } catch (Exception ex) { logger.error(ex); ex.printStackTrace(); } - - // 一氧化碳浓度超过高限阈值 - if (high > 0.0001 && value > high) { - PgAlarm alarm = new PgAlarm(); - alarm.setActive(1); - alarm.setAlarm_date(this.getTime().getTime()); - alarm.setAlarm_value(NumberFormat.format(value, "0.00")); - alarm.setAlarmdevid(deviceId); - alarm.setAlarmtypeid(PgAlarm.ALARM_TYPE_PGRUN); - alarm.setDescription("一氧化碳浓度超过高限阈值"); - alarm.setUserid(null); - // 一氧化碳报警定义为一级报警 - alarm.setAlarm_grade("一级报警"); - - alarmDao.insertAlarmRecord(alarm); - deviceDao.updateDeviceStatus(deviceId, "一氧化碳浓度过高"); - - // 将报警日志推送至市级平台 - 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.addCOAlarmData(bjbh, zcbh, bjms, bjsj); - logger.info("同步一氧化碳报警记录日志结果:" + jwbjResp); - - // 将报警值推送至市级平台 - String jwResp = DataPushInterface.addCOData(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); - logger.info("同步一氧化碳浓度值结果:" + jwResp); + } - // 一氧化碳不需要联动控制风机 + // 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_RED_ALARM_INTERVAL) { + continue; + } } - } - - - // (二)如果监测值有变化则推送 - // 判断一氧化碳浓度值是否有变化 - double lastValue = coDao.findLastValueByDevice(deviceId); - if (Math.abs(value - lastValue) > 0.01) { - // 将监测值推送至市级平台 + + // 2.5 插入监测数值 + coDao.addPblzRecord(value, TimeFormat.formatTimestamp(this.getTime().getTime()), deviceId); + + // 2.6 推送给市管廊公司平台 String coResp = DataPushInterface.addCOData(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); logger.info("同步一氧化碳浓度值结果:" + coResp); - } - - // (三)如果监测值有变化则推送 - // 每天小时各推送一个数据 - int minute = Calendar.getInstance().get(Calendar.MINUTE); - if (minute < 10) { - // 将监测值推送至市级平台 - String coResp = DataPushInterface.addCOData(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); - logger.info("同步一氧化碳浓度值结果:" + coResp); + + // 2.7 生成报警记录 + PgAlarm alarm = new PgAlarm().getCOAlarmInstance(); + + 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.addCOAlarmData(bjbh, zcbh, bjms, bjsj); + logger.info("同步一氧化碳报警记录日志结果:" + jwbjResp); + + // 2.10 联动打开风机 + // 自动打开当前舱段的排风机,手动关闭风机 + // 首先找到当前舱段的排风机资产编号 + if (CO_ON_FJ == true) { + String baseURL = Configure.getProperty("sys", "PGDSC_API_URL"); + HttpRequest.sendGet(baseURL + "remote/turnOnFjReactAlarm.action", "zcbh=" + zcbh); + } + } else { + // 3 不需要报警,只处理监测值 + // 3.1 取出上一个监测值 + PgCO lastRec = coDao.findLastRecordByDevice(deviceId); + + // 3.2 计算数值的时间间隔 + long valueTimeInterval = this.getTime().getTimeInMillis() - lastRec.getUptime().getTime(); + + // 3.3 判断条件:是否与原值相同且相距在一小时以内 + if (Math.abs(value - lastRec.getCo()) > 0.01 || valueTimeInterval > CLASS_RED_ALARM_INTERVAL) { + // 3.4 将数据存入数据库 + coDao.addPblzRecord(value, TimeFormat.formatTimestamp(this.getTime().getTime()), deviceId); + + // 3.5 推送给市管廊公司平台 + String coResp = DataPushInterface.addCOData(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步一氧化碳浓度值结果:" + coResp); + } } } else { logger.warn("未找到资产[" + zcbh + "]"); diff --git a/src/com/szpg/plc/message/response/read/ReadHSValueCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadHSValueCommandResponse.java index 3b8f2f6..1980827 100644 --- a/src/com/szpg/plc/message/response/read/ReadHSValueCommandResponse.java +++ b/src/com/szpg/plc/message/response/read/ReadHSValueCommandResponse.java @@ -4,6 +4,7 @@ import java.util.Calendar; import java.util.List; +import com.szpg.db.data.PgSH; import org.apache.commons.lang3.StringUtils; import org.apache.log4j.Logger; @@ -25,6 +26,9 @@ import com.szpg.util.NumberFormat; import com.szpg.util.TimeFormat; +/** + * @author TAN YUE + */ public class ReadHSValueCommandResponse extends ReadMemoryCommandResponse { /** @@ -33,10 +37,24 @@ private static final long serialVersionUID = -3864512113984510244L; private final Logger logger = Logger.getLogger(this.getClass().getName()); - - private List hsnd; //硫化氢浓度值 - private List hsldbjz; //硫化氢联动报警值 - private String[] zcList; // 监测设备资产列表,从配置文件中获取 + + /** + * 硫化氢浓度值 + */ + private List hsnd; + + /** + * 硫化氢联动报警值 + */ + private List hsldbjz; + + /** + * 监测设备资产列表,从配置文件中获取 + */ + private String[] zcList; + + private boolean HS_ON_FJ = false; + private long CLASS_RED_ALARM_INTERVAL = 60 * 60 * 1000L; public ReadHSValueCommandResponse() { hsnd = new ArrayList(); @@ -74,94 +92,108 @@ 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 = hsnd.get(i); - + int deviceId = deviceDao.findDeviceIdByCode(zcbh); if (deviceId > 0) { - hsDao.addPblzRecord(hsnd.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), deviceId); - - // (一)如果有报警则立即推送 - // 判断是否超过报警阈值 + // 1 取出报警规则 PgAlarmRule rule = ruleDao.findRuleByDevice(deviceId); + + // 默认的报警阈值 + double high = 0.0; if (null != rule) { - double high = 0.0; try { high = NumberFormat.parseDouble(rule.getHighvalue(), "0.00"); } catch (Exception ex) { logger.error(ex); ex.printStackTrace(); } - - // 一氧化碳浓度超过高限阈值 - if (high > 0.0001 && value > high) { - PgAlarm alarm = new PgAlarm(); - alarm.setActive(1); - alarm.setAlarm_date(this.getTime().getTime()); - alarm.setAlarm_value(NumberFormat.format(value, "0.00")); - alarm.setAlarmdevid(deviceId); - alarm.setAlarmtypeid(PgAlarm.ALARM_TYPE_PGRUN); - alarm.setDescription("硫化氢浓度超过高限阈值"); - alarm.setUserid(null); - // 硫化氢报警定义为一级报警 - alarm.setAlarm_grade("一级报警"); - - alarmDao.insertAlarmRecord(alarm); - deviceDao.updateDeviceStatus(deviceId, "硫化氢浓度过高"); - - // 将报警日志推送至市级平台 - 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.addHSAlarmData(bjbh, zcbh, bjms, bjsj); - logger.info("同步硫化氢报警记录日志结果:" + jwbjResp); - - // 将报警值推送至市级平台 - String jwResp = DataPushInterface.addHSData(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); - logger.info("同步硫化氢浓度值结果:" + jwResp); - - // 自动打开当前舱段的排风机,手动关闭风机 - // 首先找到当前舱段的排风机资产编号 - if (Boolean.valueOf(Configure.getProperty("sys", "HS_ON_FJ", "false")) == true) { - String acucode = zcbh.substring(0, zcbh.indexOf(".", 6)); - String cabin = zcbh.substring(zcbh.lastIndexOf(".") + 1, zcbh.lastIndexOf(".") + 2); - List fjs = deviceDao.findDeviceByPositionAndType(acucode, "F", cabin); - if (null != fjs && fjs.isEmpty() == false) { - String baseURL = Configure.getProperty("sys", "PGDSC_API_URL"); - for (PgDevice fj : fjs) { - String fjzcbh = fj.getAssetcode(); + } - // 调用远程接口启动风机 - HttpRequest.sendGet(baseURL + "remote/turnOnFj.action", "zcbh=" + fjzcbh); - } - } + // 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_RED_ALARM_INTERVAL) { + continue; } } - } - - // (二)如果监测值有变化则推送 - // 判断硫化氢浓度值是否有变化 - double lastValue = hsDao.findLastValueByDevice(deviceId); - if (Math.abs(value - lastValue) > 0.01) { - // 将监测值推送至市级平台 - String coResp = DataPushInterface.addHSData(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); - logger.info("同步硫化氢浓度值结果:" + coResp); - } - - // (三)如果监测值没有变化 - // 每天小时各推送一个数据 - int minute = Calendar.getInstance().get(Calendar.MINUTE); - if (minute < 10) { - // 将监测值推送至市级平台 - String coResp = DataPushInterface.addHSData(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); - logger.info("同步硫化氢浓度值结果:" + coResp); + + // 2.5 插入监测数值 + hsDao.addPblzRecord(value, TimeFormat.formatTimestamp(this.getTime().getTime()), deviceId); + + // 2.6 推送给市管廊公司平台 + String hsResp = DataPushInterface.addHSData(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步硫化氢浓度值结果:" + hsResp); + + // 2.7 生成报警记录 + PgAlarm alarm = new PgAlarm().getHSAlarmInstance(); + + 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 hsbjResp = DataPushInterface.addHSAlarmData(bjbh, zcbh, bjms, bjsj); + logger.info("同步硫化氢报警记录日志结果:" + hsbjResp); + + // 2.10 联动打开风机 + // 自动打开当前舱段的排风机,手动关闭风机 + // 首先找到当前舱段的排风机资产编号 + if (HS_ON_FJ == true) { + String baseURL = Configure.getProperty("sys", "PGDSC_API_URL"); + HttpRequest.sendGet(baseURL + "remote/turnOnFjReactAlarm.action", "zcbh=" + zcbh); + } + } else { + // 3 不需要报警,只处理监测值 + // 3.1 取出上一个监测值 + PgSH lastRec = hsDao.findLastRecordByDevice(deviceId); + + // 3.2 计算数值的时间间隔 + long valueTimeInterval = this.getTime().getTimeInMillis() - lastRec.getUptime().getTime(); + + // 3.3 判断条件:是否与原值相同且相距在一小时以内 + if (Math.abs(value - lastRec.getSh()) > 0.01 || valueTimeInterval > CLASS_RED_ALARM_INTERVAL) { + // 3.4 将数据存入数据库 + hsDao.addPblzRecord(value, TimeFormat.formatTimestamp(this.getTime().getTime()), deviceId); + + // 3.5 推送给市管廊公司平台 + String hsResp = DataPushInterface.addHSData(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步硫化氢浓度值结果:" + hsResp); + } } } else { logger.warn("未找到资产[" + zcbh + "]"); diff --git a/src/com/szpg/plc/message/response/read/ReadO2ValueCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadO2ValueCommandResponse.java index 822beda..ebeb051 100644 --- a/src/com/szpg/plc/message/response/read/ReadO2ValueCommandResponse.java +++ b/src/com/szpg/plc/message/response/read/ReadO2ValueCommandResponse.java @@ -1,12 +1,5 @@ package com.szpg.plc.message.response.read; -import java.util.ArrayList; -import java.util.Calendar; -import java.util.List; - -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.PgDeviceDao; @@ -17,14 +10,19 @@ import com.szpg.db.dao.impl.PgO2DaoImpl; import com.szpg.db.data.PgAlarm; import com.szpg.db.data.PgAlarmRule; -import com.szpg.db.data.PgDevice; +import com.szpg.db.data.PgO2; 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; +import com.szpg.util.*; +import org.apache.commons.lang3.StringUtils; +import org.apache.log4j.Logger; +import java.util.ArrayList; +import java.util.List; + +/** + * 读取氧气值指令的响应消息 + * @author TAN YUE + */ public class ReadO2ValueCommandResponse extends ReadMemoryCommandResponse { /** @@ -33,14 +31,31 @@ private static final long serialVersionUID = -2816512676498637196L; private final Logger logger = Logger.getLogger(this.getClass().getName()); - - private List o2nd; // 氧气浓度值 - private List o2ldbjz; // 氧气联动报警值 - private String[] zcList; // 氧气监测设备资产列表,从配置文件中获取 + + /** + * 氧气浓度值 + */ + private List o2nd; + + /** + * 氧气联动报警值 + */ + private List o2ldbjz; + + /** + * 氧气监测设备资产列表,从配置文件中获取 + */ + private String[] zcList; + + private boolean O2_ON_FJ = false; + private long CLASS_RED_ALARM_INTERVAL = 60 * 60 * 1000L; public ReadO2ValueCommandResponse() { o2nd = new ArrayList(); o2ldbjz = new ArrayList(); + + O2_ON_FJ = Boolean.valueOf(Configure.getProperty("sys", "O2_ON_FJ", "false")); + CLASS_RED_ALARM_INTERVAL = Integer.parseInt(Configure.getProperty("sys", "CLASS_RED_ALARM_INTERVAL", "60")) * 60 * 1000L; } public List getO2nd() { @@ -78,90 +93,104 @@ if (null != zcList && zcList.length > 0) { // 遍历氧气设备列表,将氧气浓度监测值存入数据库 for (int i = 0; i < zcList.length; i++) { + // 资产编号(设备编号) String zcbh = zcList[i]; - + + // 监测值 float value = o2nd.get(i); int deviceId = deviceDao.findDeviceIdByCode(zcbh); if (deviceId > 0) { - o2Dao.addPblzRecord(o2nd.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), deviceId); - - // (一)如果有报警则立即推送 - // 判断是否超过报警阈值 + // 1 取出报警规则 PgAlarmRule rule = ruleDao.findRuleByDevice(deviceId); + + // 默认的报警阈值 + double low = 18.0; if (null != rule) { - double low = 0.0; try { low = NumberFormat.parseDouble(rule.getLowvalue(), "0.00"); } catch (Exception ex) { logger.error(ex); ex.printStackTrace(); } - - // 氧气浓度低于低限阈值 - if (low > 0.0001 && value < low) { - PgAlarm alarm = new PgAlarm(); - alarm.setActive(1); - alarm.setAlarm_date(this.getTime().getTime()); - alarm.setAlarm_value(NumberFormat.format(value, "0.00")); - alarm.setAlarmdevid(deviceId); - alarm.setAlarmtypeid(PgAlarm.ALARM_TYPE_PGRUN); - alarm.setDescription("氧气浓度低于低限阈值"); - alarm.setUserid(null); - // 氧气报警定义为一级报警 - alarm.setAlarm_grade("一级报警"); - - alarmDao.insertAlarmRecord(alarm); - deviceDao.updateDeviceStatus(deviceId, "氧气浓度过低"); - - // 将报警日志推送至市级平台 - 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.addO2AlarmData(bjbh, zcbh, bjms, bjsj); - logger.info("同步氧气报警记录日志结果:" + jwbjResp); - - // 将报警值推送至市级平台 - String jwResp = DataPushInterface.addO2Data(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); - logger.info("同步氧气浓度值结果:" + jwResp); - - // 自动打开当前舱段的排风机,手动关闭风机 - // 首先找到当前舱段的排风机资产编号 - if (Boolean.valueOf(Configure.getProperty("sys", "O2_ON_FJ", "false")) == true) { - String acucode = zcbh.substring(0, zcbh.indexOf(".", 6)); - String cabin = zcbh.substring(zcbh.lastIndexOf(".") + 1, zcbh.lastIndexOf(".") + 2); - List fjs = deviceDao.findDeviceByPositionAndType(acucode, "F", cabin); - if (null != fjs && fjs.isEmpty() == false) { - String baseURL = Configure.getProperty("sys", "PGDSC_API_URL"); - for (PgDevice fj : fjs) { - String fjzcbh = fj.getAssetcode(); + } - // 调用远程接口启动风机 - HttpRequest.sendGet(baseURL + "remote/turnOnFj.action", "zcbh=" + fjzcbh); - } - } + // 1 判断是否报警 + if (low > 0.0001 && value < low) { + // 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_RED_ALARM_INTERVAL) { + continue; } } - } - - // (二)如果监测值有变化则推送 - // 判断氧气浓度值是否有变化 - double lastValue = o2Dao.findLastValueByDevice(deviceId); - if (Math.abs(value - lastValue) > 0.01) { - // 将监测值推送至市级平台 + + // 2.5 插入监测数值 + o2Dao.addPblzRecord(value, TimeFormat.formatTimestamp(this.getTime().getTime()), deviceId); + + // 2.6 推送给市管廊公司平台 String o2Resp = DataPushInterface.addO2Data(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); logger.info("同步氧气浓度值结果:" + o2Resp); - } - - // (三)如果监测值有变化则推送 - // 每天小时各推送一个数据 - int minute = Calendar.getInstance().get(Calendar.MINUTE); - if (minute < 10) { - // 将监测值推送至市级平台 - String o2Resp = DataPushInterface.addO2Data(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); - logger.info("同步氧气浓度值结果:" + o2Resp); + + // 2.7 生成报警记录 + PgAlarm alarm = new PgAlarm().getO2AlarmInstance(); + + 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.addO2AlarmData(bjbh, zcbh, bjms, bjsj); + logger.info("同步氧气报警记录日志结果:" + jwbjResp); + + // 2.10 联动打开风机 + // 自动打开当前舱段的排风机,手动关闭风机 + // 首先找到当前舱段的排风机资产编号 + if (O2_ON_FJ == true) { + String baseURL = Configure.getProperty("sys", "PGDSC_API_URL"); + HttpRequest.sendGet(baseURL + "remote/turnOnFjReactAlarm.action", "zcbh=" + zcbh); + } + } else { + // 3 不需要报警,只处理监测值 + // 3.1 取出上一个监测值 + PgO2 lastRec = o2Dao.findLastRecordByDevice(deviceId); + + // 3.2 计算数值的时间间隔 + long valueTimeInterval = this.getTime().getTimeInMillis() - lastRec.getUptime().getTime(); + + // 3.3 判断条件:是否与原值相同且相距在一小时以内 + if (Math.abs(value - lastRec.getO2()) > 0.01 || valueTimeInterval > CLASS_RED_ALARM_INTERVAL) { + // 3.4 将数据存入数据库 + o2Dao.addPblzRecord(value, TimeFormat.formatTimestamp(this.getTime().getTime()), deviceId); + + // 3.5 推送给市管廊公司平台 + String o2Resp = DataPushInterface.addO2Data(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步氧气浓度值结果:" + o2Resp); + } } } else { logger.warn("未找到资产[" + zcbh + "]"); diff --git a/src/com/szpg/plc/message/response/read/ReadWSValueCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadWSValueCommandResponse.java index 3d3ebd0..db6af74 100644 --- a/src/com/szpg/plc/message/response/read/ReadWSValueCommandResponse.java +++ b/src/com/szpg/plc/message/response/read/ReadWSValueCommandResponse.java @@ -4,6 +4,7 @@ import java.util.Calendar; import java.util.List; +import com.szpg.db.data.PgTemphum; import org.apache.commons.lang3.StringUtils; import org.apache.log4j.Logger; @@ -25,6 +26,9 @@ import com.szpg.util.NumberFormat; import com.szpg.util.TimeFormat; +/** + * @author TAN YUE + */ public class ReadWSValueCommandResponse extends ReadMemoryCommandResponse { /** @@ -33,12 +37,35 @@ private static final long serialVersionUID = 2964733118081941174L; private final Logger logger = Logger.getLogger(this.getClass().getName()); - - private List wd; //温度监测值 - private List sd; //湿度监测值 - private List wdbjz; //温度报警阈值 - private List sdbjz; //湿度报警阈值 - private String[] zcList; //温湿度监测的资产列表,从配置文件中获取 + + /** + * 温度监测值 + */ + private List wd; + + /** + * 湿度监测值 + */ + private List sd; + + /** + * 温度报警阈值 + */ + private List wdbjz; + + /** + * 湿度报警阈值 + */ + private List sdbjz; + + /** + * 温湿度监测的资产列表,从配置文件中获取 + */ + private String[] zcList; + + private boolean WD_ON_FJ = false; + private boolean SD_ON_FJ = false; + private long CLASS_YELLOW_ALARM_INTERVAL = 360 * 60 * 1000L; public ReadWSValueCommandResponse() { wd = new ArrayList(); @@ -94,59 +121,85 @@ 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 wdValue = wd.get(i); float sdValue = sd.get(i); - + int deviceId = deviceDao.findDeviceIdByCode(zcbh); if (deviceId > 0) { - try { - wsDao.addWsdzRecord(wdValue, sdValue, TimeFormat.formatTimestamp(this.getTime().getTime()), deviceId); - } catch (Exception ex) { - logger.error("添加温湿度监测记录异常"); - } - - // (一)如果有报警则立即推送 - // 判断是否超过报警阈值 + // 1 取出报警规则 PgAlarmRule rule = ruleDao.findRuleByDevice(deviceId); + + // 默认的报警阈值 + double wdHigh = 0.0; + double sdHigh = 0.0; if (null != rule) { - double wdHigh = 0.0; - double sdHigh = 0.0; try { - if (null != rule) { - String highStr = rule.getHighvalue(); - if (null != highStr && highStr.isEmpty() == false && highStr.indexOf(";") > 0) { - wdHigh = NumberFormat.parseDouble(highStr.split(";")[0], "0.00"); - sdHigh = NumberFormat.parseDouble(highStr.split(";")[1], "0.00"); - } + String highStr = rule.getHighvalue(); + if (null != highStr && highStr.isEmpty() == false && highStr.indexOf(";") > 0) { + wdHigh = NumberFormat.parseDouble(highStr.split(";")[0], "0.00"); + sdHigh = NumberFormat.parseDouble(highStr.split(";")[1], "0.00"); } } catch (Exception ex) { logger.error(ex); ex.printStackTrace(); } - - // 温度超过高限阈值 - if (wdHigh > 0.0001 && wdValue > wdHigh) { - PgAlarm wdAlarm = new PgAlarm(); - wdAlarm.setActive(1); + } + + // 1 判断温湿度是否报警 + if (wdHigh > 0.0001 && wdValue > wdHigh) { + // 2 温度需要报警,处理报警记录和监测值 + // 2.1 取出上一个温度报警记录 + PgAlarm lastTempAlarm = alarmDao.findLatestAlarmByDeviceAndType(deviceId, "温度"); + + boolean insertAlarmFlag = true; + if (null != lastTempAlarm) { + // 2.2 计算与上一个报警记录的操作时间间隔 + long tempAlarmTimeInterval = this.getTime().getTimeInMillis() - lastTempAlarm.getLog_time().getTime(); + + // 2.3 上一个温度报警值 + double lastTempAlarmValue = 0.0; + try { + lastTempAlarmValue = NumberFormat.parseDouble(lastTempAlarm.getAlarm_value(), "0.00"); + } catch (Exception ex) { + logger.error(ex); + ex.printStackTrace(); + } + + if (Math.abs(wdValue - lastTempAlarmValue) < 0.01 && tempAlarmTimeInterval < CLASS_YELLOW_ALARM_INTERVAL) { + insertAlarmFlag = false; + } + } + + // 2.4 如果与前值不同 或者 时间在设定的阈值范围之外 则处理报警 + if (insertAlarmFlag == true) { + // 2.5 插入监测数值 + wsDao.addWsdzRecord(wdValue, sdValue, TimeFormat.formatTimestamp(this.getTime().getTime()), deviceId); + + // 2.6 推送给市管廊公司平台 + String wdResp = DataPushInterface.addTempData(zcbh, NumberFormat.format(wdValue, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步温度值结果:" + wdResp); + + // 2.7 生成报警记录 + PgAlarm wdAlarm = new PgAlarm().getTempAlarmInstance(); + wdAlarm.setAlarm_date(this.getTime().getTime()); wdAlarm.setAlarm_value(NumberFormat.format(wdValue, "0.00")); wdAlarm.setAlarmdevid(deviceId); - wdAlarm.setAlarmtypeid(PgAlarm.ALARM_TYPE_PGRUN); - wdAlarm.setDescription("温度超过高限阈值"); - wdAlarm.setUserid(null); - // 温湿度报警定义为二级报警 - wdAlarm.setAlarm_grade("二级报警"); - + wdAlarm.setLog_time(this.getTime().getTime()); + + // 2.8 将上一条报警记录消警 alarmDao.insertAlarmRecord(wdAlarm); 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"); @@ -154,47 +207,61 @@ String bjsj = date.replace("-", ""); String wdbjResp = DataPushInterface.addTempAlarmData(bjbh, zcbh, bjms, bjsj); logger.info("同步温度报警记录日志结果:" + wdbjResp); - - // 将报警值推送至市级平台 - String wdResp = DataPushInterface.addTempData(zcbh, NumberFormat.format(wdValue, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); - logger.info("同步温度值结果:" + wdResp); - + + // 2.10 联动打开风机 // 自动打开当前舱段的排风机,手动关闭风机 // 首先找到当前舱段的排风机资产编号 - if (Boolean.valueOf(Configure.getProperty("sys", "WD_ON_FJ", "false")) == true) { - String acucode = zcbh.substring(0, zcbh.indexOf(".", 6)); - String cabin = zcbh.substring(zcbh.lastIndexOf(".") + 1, zcbh.lastIndexOf(".") + 2); - List fjs = deviceDao.findDeviceByPositionAndType(acucode, "F", cabin); - if (null != fjs && fjs.isEmpty() == false) { - String baseURL = Configure.getProperty("sys", "PGDSC_API_URL"); - for (PgDevice fj : fjs) { - String fjzcbh = fj.getAssetcode(); - - // 调用远程接口启动风机 - HttpRequest.sendGet(baseURL + "remote/turnOnFj.action", "zcbh=" + fjzcbh); - } - } + if (WD_ON_FJ == true) { + String baseURL = Configure.getProperty("sys", "PGDSC_API_URL"); + HttpRequest.sendGet(baseURL + "remote/turnOnFjReactAlarm.action", "zcbh=" + zcbh); } } - - - // 湿度超过高限阈值 - if (sdHigh > 0.0001 && sdValue > sdHigh) { - PgAlarm sdAlarm = new PgAlarm(); - sdAlarm.setActive(1); + } else if (sdHigh > 0.0001 && sdValue > sdHigh) { + // 3 湿度需要报警,处理报警记录和监测值 + // 3.1 取出上一个报警记录 + PgAlarm lastHumAlarm = alarmDao.findLatestAlarmByDeviceAndType(deviceId, "湿度"); + + boolean insertAlarmFlag = true; + if (null != lastHumAlarm) { + // 3.2 计算与上一个报警记录的操作时间间隔 + long humAlarmTimeInterval = this.getTime().getTimeInMillis() - lastHumAlarm.getLog_time().getTime(); + + // 3.3 上一个湿度报警值 + double lastHumAlarmValue = 0.0; + try { + lastHumAlarmValue = NumberFormat.parseDouble(lastHumAlarm.getAlarm_value(), "0.00"); + } catch (Exception ex) { + logger.error(ex); + ex.printStackTrace(); + } + + if (Math.abs(wdValue - lastHumAlarmValue) < 0.01 && humAlarmTimeInterval < CLASS_YELLOW_ALARM_INTERVAL) { + insertAlarmFlag = false; + } + } + + // 3.4 如果与前值不同 或者 时间在设定的阈值范围外 则处理报警 + if (insertAlarmFlag == true) { + // 3.5 插入监测数值 + wsDao.addWsdzRecord(wdValue, sdValue, TimeFormat.formatTimestamp(this.getTime().getTime()), deviceId); + + // 3.6 推送给市管廊公司平台 + String sdResp = DataPushInterface.addHumData(zcbh, NumberFormat.format(sdValue, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步湿度值结果:" + sdResp); + + // 3.7 生成报警记录 + PgAlarm sdAlarm = new PgAlarm().getHumAlarmInstance(); + sdAlarm.setAlarm_date(this.getTime().getTime()); sdAlarm.setAlarm_value(NumberFormat.format(sdValue, "0.00")); sdAlarm.setAlarmdevid(deviceId); - sdAlarm.setAlarmtypeid(PgAlarm.ALARM_TYPE_PGRUN); - sdAlarm.setDescription("湿度超过高限阈值"); - sdAlarm.setUserid(null); - // 温湿度报警定义为二级报警 - sdAlarm.setAlarm_grade("二级报警"); - + sdAlarm.setLog_time(this.getTime().getTime()); + + // 3.8 将上一条报警记录消警 alarmDao.insertAlarmRecord(sdAlarm); deviceDao.updateDeviceStatus(deviceId, "湿度超高"); - - // 将报警日志推送至市级平台 + + // 3.9 向市级平台推送报警日志 String date = TimeFormat.formatDate(getTime().getTime()); int count = alarmDao.findAlarmCountByDate(date); String bjbh = "THXC." + date + "." + NumberFormat.format(count+1, "0000"); @@ -202,44 +269,32 @@ String bjsj = date.replace("-", ""); String sdbjResp = DataPushInterface.addHumAlarmData(bjbh, zcbh, bjms, bjsj); logger.info("同步湿度报警记录日志结果:" + sdbjResp); - - // 将报警值推送至市级平台 + + // 3.10 湿度不需要联动打开风机 + } + } else { + // 4 不需要报警,只处理监测值 + // 4.1 取出上一个监测值 + PgTemphum lastRec = wsDao.findLastRecordByDevice(deviceId); + + // 4.2 计算数值的时间间隔 + long valueTimeInterval = this.getTime().getTimeInMillis() - lastRec.getUptime().getTime(); + + // 4.3 判断条件:是否与原值(温度与湿度)相同且相距在六小时以内 + if (Math.abs(wdValue - lastRec.getTemp()) > 0.01 || + Math.abs(sdValue - lastRec.getHum()) > 0.01 || + valueTimeInterval > CLASS_YELLOW_ALARM_INTERVAL) { + // 4.4 将数据存入数据库 + wsDao.addWsdzRecord(wdValue, sdValue, TimeFormat.formatTimestamp(this.getTime().getTime()), deviceId); + + // 4.5 推送给市管廊公司平台 + String wdResp = DataPushInterface.addTempData(zcbh, NumberFormat.format(wdValue, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步温度值结果:" + wdResp); + String sdResp = DataPushInterface.addHumData(zcbh, NumberFormat.format(sdValue, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); logger.info("同步湿度值结果:" + sdResp); - - // 湿度不需要联动打开风机 } } - - - // (二)如果监测值有变化则推送 - // 判断温度值是否有变化 - double lastTemp = wsDao.findLastTempByDevice(deviceId); - if (Math.abs(wdValue - lastTemp) > 0.01) { - // 将监测值推送至市级平台 - String wdResp = DataPushInterface.addTempData(zcbh, NumberFormat.format(wdValue, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); - logger.info("同步温度值结果:" + wdResp); - } - - // 判断湿度值是否有变化 - double lastHum = wsDao.findLastHumByDevice(deviceId); - if (Math.abs(sdValue - lastHum) > 0.01) { - // 将监测值推送至市级平台 - String sdResp = DataPushInterface.addHumData(zcbh, NumberFormat.format(sdValue, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); - logger.info("同步湿度值结果:" + sdResp); - } - - // (三)如果监测值有变化则推送 - // 每天小时各推送一个数据 - int minute = Calendar.getInstance().get(Calendar.MINUTE); - if (minute < 10) { - // 将监测值推送至市级平台 - String wdResp = DataPushInterface.addTempData(zcbh, NumberFormat.format(wdValue, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); - logger.info("同步温度值结果:" + wdResp); - - String sdResp = DataPushInterface.addHumData(zcbh, NumberFormat.format(sdValue, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); - logger.info("同步湿度值结果:" + sdResp); - } } else { logger.warn("未找到资产[" + zcbh + "]"); } diff --git a/src/com/szpg/rmi/RemoteFJCommandAction.java b/src/com/szpg/rmi/RemoteFJCommandAction.java index 46f3d7f..1bb1239 100644 --- a/src/com/szpg/rmi/RemoteFJCommandAction.java +++ b/src/com/szpg/rmi/RemoteFJCommandAction.java @@ -8,6 +8,7 @@ import com.szpg.db.dao.impl.PgDeviceDaoImpl; import com.szpg.db.dao.impl.PgFjDaoImpl; import com.szpg.db.data.PgAcu; +import com.szpg.db.data.PgDevice; import com.szpg.db.data.PgFjStat; import com.szpg.plc.message.AppMessageConstants; import com.szpg.plc.message.command.ReadMemoryCommand; @@ -29,6 +30,7 @@ import org.apache.struts2.ServletActionContext; import z.json.JSONObject; +import java.util.List; import java.util.concurrent.ScheduledThreadPoolExecutor; import java.util.concurrent.TimeUnit; @@ -366,6 +368,29 @@ } /** + * 根据报警的资产编号联动打开风机 + * @return + * @throws Exception + */ + public String turnOnFjReactAlarm() throws Exception { + PgDeviceDao deviceDao = new PgDeviceDaoImpl(); + String acucode = zcbh.substring(0, zcbh.indexOf(".", 6)); + String cabin = zcbh.substring(zcbh.lastIndexOf(".") + 1, zcbh.lastIndexOf(".") + 2); + List fjs = deviceDao.findDeviceByPositionAndType(acucode, "F", cabin); + if (null != fjs && fjs.isEmpty() == false) { + String baseURL = Configure.getProperty("sys", "PGDSC_API_URL"); + + // 打开舱内的一个风机即可 + String fjzcbh = fjs.get(0).getAssetcode(); + + // 调用远程接口启动风机 + HttpRequest.sendGet(baseURL + "remote/turnOnFj.action", "zcbh=" + fjzcbh); + } + + return null; + } + + /** * 给前端返回 * @param jResult * @throws Exception diff --git a/src/struts.xml b/src/struts.xml index a4e734d..87c3769 100644 --- a/src/struts.xml +++ b/src/struts.xml @@ -34,6 +34,7 @@ + diff --git a/src/com/szpg/db/dao/PgAlarmDao.java b/src/com/szpg/db/dao/PgAlarmDao.java index 11d8a1d..4ab98d4 100644 --- a/src/com/szpg/db/dao/PgAlarmDao.java +++ b/src/com/szpg/db/dao/PgAlarmDao.java @@ -6,6 +6,7 @@ public int findAlarmCountByDate(String date); public PgAlarm findLatestAlarmByDevice(int deviceId); + public PgAlarm findLatestAlarmByDeviceAndType(int deviceId, String type); public long insertAlarmRecord(PgAlarm alarmRecord); } diff --git a/src/com/szpg/db/dao/PgCODao.java b/src/com/szpg/db/dao/PgCODao.java index 1664f51..5098321 100644 --- a/src/com/szpg/db/dao/PgCODao.java +++ b/src/com/szpg/db/dao/PgCODao.java @@ -20,6 +20,7 @@ public List findPblzByDeviceAndTm(Integer deviceid, String start, String end); public double findLastValueByDevice(Integer deviceid); + public PgCO findLastRecordByDevice(Integer id); public int addPblzRecord(PgCO ch4); public int addPblzRecord(float value, String tm, int deviceid); diff --git a/src/com/szpg/db/dao/PgCh4Dao.java b/src/com/szpg/db/dao/PgCh4Dao.java index e23b964..61fdfcd 100644 --- a/src/com/szpg/db/dao/PgCh4Dao.java +++ b/src/com/szpg/db/dao/PgCh4Dao.java @@ -20,6 +20,7 @@ public List findPblzByDeviceAndTm(Integer deviceid, String start, String end); public double findLastValueByDevice(Integer deviceid); + public PgCh4 findLastRecordByDevice(Integer deviceid); public int addPblzRecord(PgCh4 ch4); public int addPblzRecord(float value, String tm, int deviceid); diff --git a/src/com/szpg/db/dao/PgHSDao.java b/src/com/szpg/db/dao/PgHSDao.java index f89b044..0f0ee53 100644 --- a/src/com/szpg/db/dao/PgHSDao.java +++ b/src/com/szpg/db/dao/PgHSDao.java @@ -20,6 +20,7 @@ public List findPblzByDeviceAndTm(Integer deviceid, String start, String end); public double findLastValueByDevice(Integer deviceid); + public PgSH findLastRecordByDevice(Integer deviceid); public int addPblzRecord(PgSH hs); public int addPblzRecord(float value, String tm, int deviceid); diff --git a/src/com/szpg/db/dao/PgO2Dao.java b/src/com/szpg/db/dao/PgO2Dao.java index 0b3d0bf..678adab 100644 --- a/src/com/szpg/db/dao/PgO2Dao.java +++ b/src/com/szpg/db/dao/PgO2Dao.java @@ -20,6 +20,7 @@ public List findPblzByDeviceAndTm(Integer deviceid, String start, String end); public double findLastValueByDevice(Integer deviceid); + public PgO2 findLastRecordByDevice(Integer deviceid); public int addPblzRecord(PgO2 ch4); public int addPblzRecord(float value, String tm, int deviceid); diff --git a/src/com/szpg/db/dao/PgWsDao.java b/src/com/szpg/db/dao/PgWsDao.java index 370a83f..bfd0eed 100644 --- a/src/com/szpg/db/dao/PgWsDao.java +++ b/src/com/szpg/db/dao/PgWsDao.java @@ -21,6 +21,7 @@ public double findLastTempByDevice(Integer deviceid); public double findLastHumByDevice(Integer deviceid); + public PgTemphum findLastRecordByDevice(Integer deviceid); public int addWsdzRecord(PgTemphum wsdz); public int addWsdzRecord(float temp, float hum, String tm, int deviceid); diff --git a/src/com/szpg/db/dao/impl/PgAlarmDaoImpl.java b/src/com/szpg/db/dao/impl/PgAlarmDaoImpl.java index cedf5fc..ce9ee0f 100644 --- a/src/com/szpg/db/dao/impl/PgAlarmDaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgAlarmDaoImpl.java @@ -8,7 +8,6 @@ import org.apache.commons.dbutils.DbUtils; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.handlers.ArrayListHandler; -import org.apache.commons.dbutils.handlers.BeanListHandler; import org.apache.commons.dbutils.handlers.ScalarHandler; import org.apache.log4j.Logger; @@ -17,6 +16,9 @@ import com.szpg.db.util.ConnectionManager; import com.szpg.util.TimeFormat; +/** + * @author TAN YUE + */ public class PgAlarmDaoImpl implements PgAlarmDao { private final Logger logger = Logger.getLogger(this.getClass().getName()); @@ -33,7 +35,7 @@ QueryRunner runner = new QueryRunner(); param[0] = date; - int count = ((Number) runner.query(conn, sql, new ScalarHandler(1), param)).intValue(); + int count = (runner.query(conn, sql, new ScalarHandler(1), param)).intValue(); return count; } catch (Exception ex) { logger.error("根据日期查询报警记录数异常", ex); @@ -51,7 +53,7 @@ public PgAlarm findLatestAlarmByDevice(int deviceId) { Connection conn = null; String queryStr = "SELECT A.* FROM " + - "(SELECT ID, ACTIVE, ALARM_DATE, ALARM_VALUE, DESCRIPTION, ALARMDEVID, ALARMTYPEID, ALARM_GRADE FROM PG_ALARM WHERE ALARMDEVID = ? ORDER BY ALARM_DATE DESC) A " + + "(SELECT ID, ACTIVE, ALARM_DATE, ALARM_VALUE, DESCRIPTION, ALARMDEVID, ALARMTYPEID, ALARM_GRADE, LOG_TIME, LOG_DESC FROM PG_ALARM WHERE ALARMDEVID = ? ORDER BY ALARM_DATE DESC) A " + "WHERE ROWNUM <= 1"; Object[] param = new Object[1]; try { @@ -60,7 +62,7 @@ QueryRunner runner = new QueryRunner(); param[0] = deviceId; - List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler(), param); + List tempList = runner.query(conn, queryStr, new ArrayListHandler(), param); if (null != tempList && tempList.isEmpty() == false) { PgAlarm alarm = new PgAlarm(); Object[] item = tempList.get(0); @@ -79,6 +81,74 @@ alarm.setAlarmtypeid(((Number) item[6]).intValue()); alarm.setAlarm_grade((String) item[7]); + if (null != item[8]) { + long logTmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[8]).toJdbc()).getTime(); + Calendar logCal = Calendar.getInstance(); + logCal.setTimeInMillis(logTmValue); + alarm.setLog_time(logCal.getTime()); + } else { + alarm.setLog_time(null); + } + + alarm.setLog_desc((String) item[9]); + + logger.debug("根据设备查询最新报警记录成功"); + + return alarm; + } else { + return null; + } + } catch (Exception ex) { + logger.error("根据设备查询最新报警记录成功", ex); + return null; + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + } + + @Override + public PgAlarm findLatestAlarmByDeviceAndType(int deviceId, String type) { + Connection conn = null; + String queryStr = "SELECT A.* FROM " + + "(SELECT ID, ACTIVE, ALARM_DATE, ALARM_VALUE, DESCRIPTION, ALARMDEVID, ALARMTYPEID, ALARM_GRADE, LOG_TIME, LOG_DESC FROM PG_ALARM WHERE ALARMDEVID = ? AND DESCRIPTION LIKE ? ORDER BY ALARM_DATE DESC) A " + + "WHERE ROWNUM <= 1"; + Object[] param = new Object[2]; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + QueryRunner runner = new QueryRunner(); + param[0] = deviceId; + param[1] = "%" + type + "%"; + + List tempList = runner.query(conn, queryStr, new ArrayListHandler(), param); + if (null != tempList && tempList.isEmpty() == false) { + PgAlarm alarm = new PgAlarm(); + Object[] item = tempList.get(0); + + alarm.setId(((Number) item[0]).intValue()); + alarm.setActive(((Number) item[1]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + alarm.setAlarm_date(cal.getTime()); + + alarm.setAlarm_value((String) item[3]); + alarm.setDescription((String) item[4]); + alarm.setAlarmdevid(((Number) item[5]).intValue()); + alarm.setAlarmtypeid(((Number) item[6]).intValue()); + alarm.setAlarm_grade((String) item[7]); + + long logTmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[8]).toJdbc()).getTime(); + Calendar logCal = Calendar.getInstance(); + logCal.setTimeInMillis(logTmValue); + alarm.setLog_time(logCal.getTime()); + alarm.setLog_desc((String) item[9]); + logger.debug("根据设备查询最新报警记录成功"); return alarm; @@ -111,28 +181,31 @@ QueryRunner runner = new QueryRunner(); // 查询同一设备是否有正在报警的消息 - Number id = (Number) runner.query(conn, querySql, new ScalarHandler(1), queryParam); + Number id = runner.query(conn, querySql, new ScalarHandler(1), queryParam); if (null != id) { // 找到设备已存在的记录 // 1先将正在报警的设备自动消警 - String updateSql = "UPDATE PG_ALARM SET ACTIVE=0 WHERE ID=?"; + String updateSql = "UPDATE PG_ALARM SET ACTIVE=0, LOG_TIME=SYSDATE, LOG_DESC=? WHERE ID=?"; - Object[] updateParam = new Object[1]; - updateParam[0] = id.longValue(); - - runner.update(conn, updateSql, updateParam); // 更新报警记录 - } + Object[] updateParam = new Object[2]; + updateParam[0] = "重复报警自动消警"; + updateParam[1] = id.longValue(); + + // 更新报警记录 + runner.update(conn, updateSql, updateParam); + } // 插入新的报警记录 String insertSql = "INSERT INTO PG_ALARM " + - "(ID, ACTIVE, ALARM_DATE, ALARM_VALUE, DESCRIPTION, ALARMDEVID, ALARMTYPEID, USERID, ALARM_GRADE) " + - "VALUES (?, ?, TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), ?, ?, ?, ?, ?, ?)"; + "(ID, ACTIVE, ALARM_DATE, ALARM_VALUE, DESCRIPTION, ALARMDEVID, ALARMTYPEID, USERID, ALARM_GRADE, LOG_TIME, LOG_DESC) " + + "VALUES (?, ?, TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), ?, ?, ?, ?, ?, ?, TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), ?)"; String sqlId = "SELECT SEQ_PG_ALARM_ID.NEXTVAL FROM DUAL"; - long newId = ((Number) runner.query(conn, sqlId, new ScalarHandler(1))).longValue(); // 获取新的id - - Object[] params = new Object[9]; + // 获取新的id + long newId = (runner.query(conn, sqlId, new ScalarHandler(1))).longValue(); + + Object[] params = new Object[11]; params[0] = newId; params[1] = alarmRecord.getActive(); @@ -143,8 +216,11 @@ params[6] = alarmRecord.getAlarmtypeid(); params[7] = alarmRecord.getUserid(); params[8] = alarmRecord.getAlarm_grade(); - - int count = runner.update(conn, insertSql, params); // 新增主表 + params[9] = TimeFormat.formatTimestamp(alarmRecord.getLog_time()); + params[10] = alarmRecord.getLog_desc(); + + // 新增报警记录 + int count = runner.update(conn, insertSql, params); if (count > 0) { logger.debug("插入报警数据成功"); diff --git a/src/com/szpg/db/dao/impl/PgCODaoImpl.java b/src/com/szpg/db/dao/impl/PgCODaoImpl.java index 186ac16..70d672c 100644 --- a/src/com/szpg/db/dao/impl/PgCODaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgCODaoImpl.java @@ -292,6 +292,51 @@ } @Override + public PgCO findLastRecordByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT ID, CO, LOGTIME, PGDEVICEID FROM (SELECT * FROM PG_CO WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, sql, new ArrayListHandler(), param); + if (null != tempList && tempList.size() == 1) { + PgCO co = new PgCO(); + Object[] item = tempList.get(0); + + co.setId(((Number) item[0]).intValue()); + co.setCo(Float.parseFloat((String) item[1])); + co.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + co.setLogtime(cal.getTime()); + co.setUptime(cal.getTime()); + + logger.debug("根据设备ID查询最新一氧化碳监测记录成功" + co + "]"); + + return co; + } else { + return null; + } + } catch (Exception ex) { + logger.error("根据设备ID查询最新一氧化碳监测记录异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override public int addPblzRecord(PgCO co) { return addPblzRecord(co.getCo(), co.getTmStr(), co.getPgdeviceid()); } diff --git a/src/com/szpg/db/dao/impl/PgCh4DaoImpl.java b/src/com/szpg/db/dao/impl/PgCh4DaoImpl.java index 0ed139e..768b6a5 100644 --- a/src/com/szpg/db/dao/impl/PgCh4DaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgCh4DaoImpl.java @@ -54,9 +54,9 @@ list.add(ch4); } return list; - } - else + } else { return null; + } } catch (Exception ex) { logger.error("查询所有甲烷监测值异常", ex); } finally { @@ -100,9 +100,9 @@ logger.debug("根据ID查询甲烷监测值成功" + ch4 + "]"); return ch4; - } - else + } else { return null; + } } catch (Exception ex) { logger.error("根据ID查询甲烷监测值异常", ex); } finally { @@ -149,9 +149,9 @@ logger.debug("根据设备ID查询最新的甲烷监测值成功" + ch4 + "]"); return ch4; - } - else + } else { return null; + } } catch (Exception ex) { logger.error("根据设备ID查询最新的甲烷监测值异常", ex); } finally { @@ -199,9 +199,9 @@ list.add(ch4); } return list; - } - else + } else { return null; + } } catch (Exception ex) { logger.error("根据设备ID查询甲烷监测值异常", ex); } finally { @@ -251,9 +251,9 @@ list.add(ch4); } return list; - } - else + } else { return null; + } } catch (Exception ex) { logger.error("根据设备ID和时间查询甲烷监测值异常", ex); } finally { @@ -293,6 +293,51 @@ } @Override + public PgCh4 findLastRecordByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT ID, CH4, LOGTIME, PGDEVICEID FROM (SELECT * FROM PG_CH4 WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, sql, new ArrayListHandler(), param); + if (null != tempList && tempList.size() == 1) { + PgCh4 ch4 = new PgCh4(); + Object[] item = tempList.get(0); + + ch4.setId(((Number) item[0]).intValue()); + ch4.setCh4(Float.parseFloat((String) item[1])); + ch4.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + ch4.setLogtime(cal.getTime()); + ch4.setUptime(cal.getTime()); + + logger.debug("根据设备ID查询最新甲烷监测记录成功" + ch4 + "]"); + + return ch4; + } else { + return null; + } + } catch (Exception ex) { + logger.error("根据设备ID查询最新甲烷监测记录异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override public int addPblzRecord(PgCh4 ch4) { return addPblzRecord(ch4.getCh4(), ch4.getTmStr(), ch4.getPgdeviceid()); } diff --git a/src/com/szpg/db/dao/impl/PgHSDaoImpl.java b/src/com/szpg/db/dao/impl/PgHSDaoImpl.java index 892e175..fa4ea02 100644 --- a/src/com/szpg/db/dao/impl/PgHSDaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgHSDaoImpl.java @@ -292,6 +292,51 @@ } @Override + public PgSH findLastRecordByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT ID, SH, LOGTIME, PGDEVICEID FROM (SELECT * FROM PG_SH WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, sql, new ArrayListHandler(), param); + if (null != tempList && tempList.size() == 1) { + PgSH sh = new PgSH(); + Object[] item = tempList.get(0); + + sh.setId(((Number) item[0]).intValue()); + sh.setSh(Float.parseFloat((String) item[1])); + sh.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + sh.setLogtime(cal.getTime()); + sh.setUptime(cal.getTime()); + + logger.debug("根据设备ID查询最新硫化氢监测记录成功" + sh + "]"); + + return sh; + } else { + return null; + } + } catch (Exception ex) { + logger.error("根据设备ID查询最新硫化氢监测记录异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override public int addPblzRecord(PgSH sh) { return addPblzRecord(sh.getSh(), sh.getTmStr(), sh.getPgdeviceid()); } diff --git a/src/com/szpg/db/dao/impl/PgO2DaoImpl.java b/src/com/szpg/db/dao/impl/PgO2DaoImpl.java index f58f8cd..842291b 100644 --- a/src/com/szpg/db/dao/impl/PgO2DaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgO2DaoImpl.java @@ -54,9 +54,9 @@ list.add(o2); } return list; - } - else + } else { return null; + } } catch (Exception ex) { logger.error("查询所有氧气监测值异常", ex); } finally { @@ -100,9 +100,9 @@ logger.debug("根据ID查询氧气监测值成功" + o2 + "]"); return o2; - } - else + } else { return null; + } } catch (Exception ex) { logger.error("根据ID查询氧气监测值异常", ex); } finally { @@ -148,9 +148,9 @@ logger.debug("根据设备ID查询最新的氧气监测值成功" + o2 + "]"); return o2; - } - else + } else { return null; + } } catch (Exception ex) { logger.error("根据设备ID查询最新的硫化氢监测值异常", ex); } finally { @@ -198,9 +198,9 @@ list.add(o2); } return list; - } - else + } else { return null; + } } catch (Exception ex) { logger.error("根据设备ID查询氧气监测值异常", ex); } finally { @@ -250,9 +250,9 @@ list.add(o2); } return list; - } - else + } else { return null; + } } catch (Exception ex) { logger.error("根据设备ID和时间查询氧气监测值异常", ex); } finally { @@ -292,6 +292,51 @@ } @Override + public PgO2 findLastRecordByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT ID, O2, LOGTIME, PGDEVICEID FROM (SELECT * FROM PG_O2 WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, sql, new ArrayListHandler(), param); + if (null != tempList && tempList.size() == 1) { + PgO2 o2 = new PgO2(); + Object[] item = tempList.get(0); + + o2.setId(((Number) item[0]).intValue()); + o2.setO2(Float.parseFloat((String) item[1])); + o2.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + o2.setLogtime(cal.getTime()); + o2.setUptime(cal.getTime()); + + logger.debug("根据设备ID查询最新氧气监测记录成功" + o2 + "]"); + + return o2; + } else { + return null; + } + } catch (Exception ex) { + logger.error("根据设备ID查询最新氧气监测记录异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override public int addPblzRecord(PgO2 o2) { return addPblzRecord(o2.getO2(), o2.getTmStr(), o2.getPgdeviceid()); } @@ -316,10 +361,11 @@ QueryRunner runner = new QueryRunner(); int count = runner.update(conn, insertStr, params); - if (count > 0) + if (count > 0) { logger.debug("插入氧气监测值成功[tm=" + tm + ", value=" + value + ", deviceid=" + deviceid + "]"); - else + } else { logger.error("插入氧气监测值失败!"); + } return count; } catch (Exception ex) { diff --git a/src/com/szpg/db/dao/impl/PgWsDaoImpl.java b/src/com/szpg/db/dao/impl/PgWsDaoImpl.java index 679b58f..77925f7 100644 --- a/src/com/szpg/db/dao/impl/PgWsDaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgWsDaoImpl.java @@ -323,6 +323,52 @@ } @Override + public PgTemphum findLastRecordByDevice(Integer deviceid) { + Connection conn = null; + + String sql = "SELECT ID, TEMP, HUM, LOGTIME, PGDEVICEID FROM (SELECT * FROM PG_TEMPHUM WHERE PGDEVICEID = ? ORDER BY ID DESC) WHERE ROWNUM = 1"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, sql, new ArrayListHandler(), param); + if (null != tempList && tempList.size() == 1) { + PgTemphum temphum = new PgTemphum(); + Object[] item = tempList.get(0); + + temphum.setId(((Number) item[0]).intValue()); + temphum.setTemp(Float.parseFloat((String) item[1])); + temphum.setHum(Float.parseFloat((String) item[2])); + temphum.setPgdeviceid(((Number) item[4]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + temphum.setLogtime(cal.getTime()); + temphum.setUptime(cal.getTime()); + + logger.debug("根据设备ID查询最新温湿度监测记录成功" + temphum + "]"); + + return temphum; + } else { + return null; + } + } catch (Exception ex) { + logger.error("根据设备ID查询最新温湿度监测记录异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override public int addWsdzRecord(PgTemphum ws) { return addWsdzRecord(ws.getTemp(), ws.getHum(), ws.getTmStr(), ws.getPgdeviceid()); } diff --git a/src/com/szpg/db/data/PgAlarm.java b/src/com/szpg/db/data/PgAlarm.java index 5a73ba9..4b97e6a 100644 --- a/src/com/szpg/db/data/PgAlarm.java +++ b/src/com/szpg/db/data/PgAlarm.java @@ -1,9 +1,12 @@ package com.szpg.db.data; -import java.util.Date; - import com.szpg.util.TimeFormat; +import java.util.Date; + +/** + * @author TAN YUE + */ public class PgAlarm implements java.io.Serializable { /** @@ -20,11 +23,28 @@ private Integer alarmtypeid; private Integer userid; private String alarm_grade; - - public static Integer ALARM_TYPE_DEVRUN = 1; //管廊设备运行故障 - public static Integer ALARM_TYPE_PGRUN = 2; //管廊运行环境报警 - public static Integer ALARM_TYPE_PGSAF = 3; //管廊安全防范报警 - public static Integer ALARM_TYPE_INPG = 4; //人员入廊超时报警 + private Date log_time; + private String log_desc; + + /** + * 管廊设备运行故障 + */ + public static Integer ALARM_TYPE_DEVRUN = 1; + + /** + * 管廊运行环境报警 + */ + public static Integer ALARM_TYPE_PGRUN = 2; + + /** + * 管廊安全防范报警 + */ + public static Integer ALARM_TYPE_PGSAF = 3; + + /** + * 人员入廊超时报警 + */ + public static Integer ALARM_TYPE_INPG = 4; public Integer getId() { return id; @@ -97,10 +117,130 @@ public void setAlarm_grade(String alarm_grade) { this.alarm_grade = alarm_grade; } + + public Date getLog_time() { + if (null == log_time) { + return alarm_date; + } + return log_time; + } + + public void setLog_time(Date log_time) { + this.log_time = log_time; + } + + public String getLog_desc() { + return log_desc; + } + + public void setLog_desc(String log_desc) { + this.log_desc = log_desc; + } @Override public String toString() { return "PgAlarm[alarmValue=" + alarm_value + ", alarmDate=" + TimeFormat.formatTimestamp(alarm_date) + ", alarmDevId= " + alarmdevid + "]"; } + /** + * 生成氧气报警记录 + * @return + */ + public PgAlarm getO2AlarmInstance() { + PgAlarm alarm = new PgAlarm(); + alarm.setActive(1); + alarm.setAlarmtypeid(PgAlarm.ALARM_TYPE_PGRUN); + alarm.setDescription("氧气浓度低于低限阈值"); + alarm.setUserid(null); + + // 氧气报警定义为一级报警 + alarm.setAlarm_grade("一级报警"); + + return alarm; + } + + /** + * 生成一氧化碳报警记录 + * @return + */ + public PgAlarm getCOAlarmInstance() { + PgAlarm alarm = new PgAlarm(); + alarm.setActive(1); + alarm.setAlarmtypeid(PgAlarm.ALARM_TYPE_PGRUN); + alarm.setDescription("一氧化碳浓度超过高限阈值"); + alarm.setUserid(null); + + // 一氧化碳报警定义为一级报警 + alarm.setAlarm_grade("一级报警"); + + return alarm; + } + + /** + * 生成硫化氢报警记录 + * @return + */ + public PgAlarm getHSAlarmInstance() { + PgAlarm alarm = new PgAlarm(); + alarm.setActive(1); + alarm.setAlarmtypeid(PgAlarm.ALARM_TYPE_PGRUN); + alarm.setDescription("硫化氢浓度超过高限阈值"); + alarm.setUserid(null); + + // 硫化氢报警定义为一级报警 + alarm.setAlarm_grade("一级报警"); + + return alarm; + } + + /** + * 生成甲烷报警记录 + * @return + */ + public PgAlarm getCH4AlarmInstance() { + PgAlarm alarm = new PgAlarm(); + alarm.setActive(1); + alarm.setAlarmtypeid(PgAlarm.ALARM_TYPE_PGRUN); + alarm.setDescription("甲烷浓度超过高限阈值"); + alarm.setUserid(null); + + // 甲烷报警定义为二级报警 + alarm.setAlarm_grade("二级报警"); + + return alarm; + } + + /** + * 生成温度报警记录 + * @return + */ + public PgAlarm getTempAlarmInstance() { + PgAlarm alarm = new PgAlarm(); + alarm.setActive(1); + alarm.setAlarmtypeid(PgAlarm.ALARM_TYPE_PGRUN); + alarm.setDescription("温度超过高限阈值"); + alarm.setUserid(null); + + // 温度定义为二级报警 + alarm.setAlarm_grade("二级报警"); + + return alarm; + } + + /** + * 生成湿度报警记录 + * @return + */ + public PgAlarm getHumAlarmInstance() { + PgAlarm alarm = new PgAlarm(); + alarm.setActive(1); + alarm.setAlarmtypeid(PgAlarm.ALARM_TYPE_PGRUN); + alarm.setDescription("湿度超过高限阈值"); + alarm.setUserid(null); + + // 湿度报警定义为二级报警 + alarm.setAlarm_grade("二级报警"); + + return alarm; + } } diff --git a/src/com/szpg/plc/message/response/read/ReadCH4ValueCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadCH4ValueCommandResponse.java index c26ffa5..13c5968 100644 --- a/src/com/szpg/plc/message/response/read/ReadCH4ValueCommandResponse.java +++ b/src/com/szpg/plc/message/response/read/ReadCH4ValueCommandResponse.java @@ -4,6 +4,7 @@ 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; @@ -25,6 +26,9 @@ import com.szpg.util.NumberFormat; import com.szpg.util.TimeFormat; +/** + * @author TAN YUE + */ public class ReadCH4ValueCommandResponse extends ReadMemoryCommandResponse { /** @@ -33,10 +37,24 @@ private static final long serialVersionUID = 8081222348890587881L; private final Logger logger = Logger.getLogger(this.getClass().getName()); - - private List jwnd; //甲烷浓度值 - private List jwldbjz; //甲烷联动报警值 - private String[] zcList; //甲烷监测的资产列表,从配置文件中获取 + + /** + * 甲烷浓度值 + */ + private List jwnd; + + /** + * 甲烷联动报警值 + */ + private List jwldbjz; + + /** + * 甲烷监测的资产列表,从配置文件中获取 + */ + private String[] zcList; + + private boolean CH4_ON_FJ = false; + private long CLASS_YELLOW_ALARM_INTERVAL = 360 * 60 * 1000L; public ReadCH4ValueCommandResponse() { jwnd = new ArrayList(); @@ -74,94 +92,108 @@ 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) { - ch4Dao.addPblzRecord(jwnd.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), deviceId); - - // (一)如果有报警则立即推送 - // 判断是否超过报警阈值 + // 1 取出报警规则 PgAlarmRule rule = ruleDao.findRuleByDevice(deviceId); + + // 默认的报警阈值 + double high = 0.0; if (null != rule) { - double high = 0.0; try { high = NumberFormat.parseDouble(rule.getHighvalue(), "0.00"); } catch (Exception ex) { logger.error(ex); ex.printStackTrace(); } - - // 甲烷浓度超过高限阈值 - if (high > 0.0001 && value > high) { - PgAlarm alarm = new PgAlarm(); - alarm.setActive(1); - alarm.setAlarm_date(this.getTime().getTime()); - alarm.setAlarm_value(NumberFormat.format(value, "0.00")); - alarm.setAlarmdevid(deviceId); - alarm.setAlarmtypeid(PgAlarm.ALARM_TYPE_PGRUN); - alarm.setDescription("甲烷浓度超过高限阈值"); - alarm.setUserid(null); - // 甲烷报警定义为二级报警 - alarm.setAlarm_grade("二级报警"); - - alarmDao.insertAlarmRecord(alarm); - deviceDao.updateDeviceStatus(deviceId, "甲烷浓度过高"); - - // 将报警日志推送至市级平台 - 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); - - // 将报警值推送至市级平台 - String jwResp = DataPushInterface.addCH4Data(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); - logger.info("同步甲烷浓度值结果:" + jwResp); + } - // 自动打开当前舱段的排风机,手动关闭风机 - // 首先找到当前舱段的排风机资产编号 - if (Boolean.valueOf(Configure.getProperty("sys", "CH4_ON_FJ", "false")) == true) { - String acucode = zcbh.substring(0, zcbh.indexOf(".", 6)); - String cabin = zcbh.substring(zcbh.lastIndexOf(".") + 1, zcbh.lastIndexOf(".") + 2); - List fjs = deviceDao.findDeviceByPositionAndType(acucode, "F", cabin); - if (null != fjs && fjs.isEmpty() == false) { - String baseURL = Configure.getProperty("sys", "PGDSC_API_URL"); - for (PgDevice fj : fjs) { - String fjzcbh = fj.getAssetcode(); + // 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(); - // 调用远程接口启动风机 - HttpRequest.sendGet(baseURL + "remote/turnOnFj.action", "zcbh=" + fjzcbh); - } - } + // 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; } } - } - - // (二)如果监测值有变化则推送 - // 判断甲烷浓度值是否有变化 - double lastValue = ch4Dao.findLastValueByDevice(deviceId); - if (Math.abs(value - lastValue) > 0.01) { - // 将监测值推送至市级平台 + + // 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); - } - - // (三)如果监测值有变化则推送 - // 每天小时各推送一个数据 - int minute = Calendar.getInstance().get(Calendar.MINUTE); - if (minute < 10) { - // 将监测值推送至市级平台 - 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 + "]"); diff --git a/src/com/szpg/plc/message/response/read/ReadCOValueCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadCOValueCommandResponse.java index 1920b62..0b27d03 100644 --- a/src/com/szpg/plc/message/response/read/ReadCOValueCommandResponse.java +++ b/src/com/szpg/plc/message/response/read/ReadCOValueCommandResponse.java @@ -4,6 +4,8 @@ import java.util.Calendar; import java.util.List; +import com.szpg.db.data.PgCO; +import com.szpg.util.*; import org.apache.commons.lang3.StringUtils; import org.apache.log4j.Logger; @@ -18,11 +20,10 @@ import com.szpg.db.data.PgAlarm; import com.szpg.db.data.PgAlarmRule; import com.szpg.plc.message.response.ReadMemoryCommandResponse; -import com.szpg.util.Configure; -import com.szpg.util.DataPushInterface; -import com.szpg.util.NumberFormat; -import com.szpg.util.TimeFormat; +/** + * @author TAN YUE + */ public class ReadCOValueCommandResponse extends ReadMemoryCommandResponse { /** @@ -31,10 +32,24 @@ private static final long serialVersionUID = -6176747812714170040L; private final Logger logger = Logger.getLogger(this.getClass().getName()); - - private List cond; //一氧化碳浓度值 - private List coldbjz; //一氧化碳联动报警值 - private String[] zcList; //一氧化碳监测的资产列表,从配置文件中获取 + + /** + * 一氧化碳浓度值 + */ + private List cond; + + /** + * 一氧化碳联动报警值 + */ + private List coldbjz; + + /** + * 一氧化碳监测的资产列表,从配置文件中获取 + */ + private String[] zcList; + + private boolean CO_ON_FJ = false; + private long CLASS_RED_ALARM_INTERVAL = 60 * 60 * 1000L; public ReadCOValueCommandResponse() { cond = new ArrayList(); @@ -72,80 +87,108 @@ 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 = cond.get(i); - + int deviceId = deviceDao.findDeviceIdByCode(zcbh); if (deviceId > 0) { - coDao.addPblzRecord(cond.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), deviceId); - - // (一)如果有报警则立即推送 - // 判断是否超过报警阈值 + // 1 取出报警规则 PgAlarmRule rule = ruleDao.findRuleByDevice(deviceId); + + // 默认的报警阈值 + double high = 0.0; if (null != rule) { - double high = 0.0; try { high = NumberFormat.parseDouble(rule.getHighvalue(), "0.00"); } catch (Exception ex) { logger.error(ex); ex.printStackTrace(); } - - // 一氧化碳浓度超过高限阈值 - if (high > 0.0001 && value > high) { - PgAlarm alarm = new PgAlarm(); - alarm.setActive(1); - alarm.setAlarm_date(this.getTime().getTime()); - alarm.setAlarm_value(NumberFormat.format(value, "0.00")); - alarm.setAlarmdevid(deviceId); - alarm.setAlarmtypeid(PgAlarm.ALARM_TYPE_PGRUN); - alarm.setDescription("一氧化碳浓度超过高限阈值"); - alarm.setUserid(null); - // 一氧化碳报警定义为一级报警 - alarm.setAlarm_grade("一级报警"); - - alarmDao.insertAlarmRecord(alarm); - deviceDao.updateDeviceStatus(deviceId, "一氧化碳浓度过高"); - - // 将报警日志推送至市级平台 - 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.addCOAlarmData(bjbh, zcbh, bjms, bjsj); - logger.info("同步一氧化碳报警记录日志结果:" + jwbjResp); - - // 将报警值推送至市级平台 - String jwResp = DataPushInterface.addCOData(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); - logger.info("同步一氧化碳浓度值结果:" + jwResp); + } - // 一氧化碳不需要联动控制风机 + // 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_RED_ALARM_INTERVAL) { + continue; + } } - } - - - // (二)如果监测值有变化则推送 - // 判断一氧化碳浓度值是否有变化 - double lastValue = coDao.findLastValueByDevice(deviceId); - if (Math.abs(value - lastValue) > 0.01) { - // 将监测值推送至市级平台 + + // 2.5 插入监测数值 + coDao.addPblzRecord(value, TimeFormat.formatTimestamp(this.getTime().getTime()), deviceId); + + // 2.6 推送给市管廊公司平台 String coResp = DataPushInterface.addCOData(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); logger.info("同步一氧化碳浓度值结果:" + coResp); - } - - // (三)如果监测值有变化则推送 - // 每天小时各推送一个数据 - int minute = Calendar.getInstance().get(Calendar.MINUTE); - if (minute < 10) { - // 将监测值推送至市级平台 - String coResp = DataPushInterface.addCOData(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); - logger.info("同步一氧化碳浓度值结果:" + coResp); + + // 2.7 生成报警记录 + PgAlarm alarm = new PgAlarm().getCOAlarmInstance(); + + 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.addCOAlarmData(bjbh, zcbh, bjms, bjsj); + logger.info("同步一氧化碳报警记录日志结果:" + jwbjResp); + + // 2.10 联动打开风机 + // 自动打开当前舱段的排风机,手动关闭风机 + // 首先找到当前舱段的排风机资产编号 + if (CO_ON_FJ == true) { + String baseURL = Configure.getProperty("sys", "PGDSC_API_URL"); + HttpRequest.sendGet(baseURL + "remote/turnOnFjReactAlarm.action", "zcbh=" + zcbh); + } + } else { + // 3 不需要报警,只处理监测值 + // 3.1 取出上一个监测值 + PgCO lastRec = coDao.findLastRecordByDevice(deviceId); + + // 3.2 计算数值的时间间隔 + long valueTimeInterval = this.getTime().getTimeInMillis() - lastRec.getUptime().getTime(); + + // 3.3 判断条件:是否与原值相同且相距在一小时以内 + if (Math.abs(value - lastRec.getCo()) > 0.01 || valueTimeInterval > CLASS_RED_ALARM_INTERVAL) { + // 3.4 将数据存入数据库 + coDao.addPblzRecord(value, TimeFormat.formatTimestamp(this.getTime().getTime()), deviceId); + + // 3.5 推送给市管廊公司平台 + String coResp = DataPushInterface.addCOData(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步一氧化碳浓度值结果:" + coResp); + } } } else { logger.warn("未找到资产[" + zcbh + "]"); diff --git a/src/com/szpg/plc/message/response/read/ReadHSValueCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadHSValueCommandResponse.java index 3b8f2f6..1980827 100644 --- a/src/com/szpg/plc/message/response/read/ReadHSValueCommandResponse.java +++ b/src/com/szpg/plc/message/response/read/ReadHSValueCommandResponse.java @@ -4,6 +4,7 @@ import java.util.Calendar; import java.util.List; +import com.szpg.db.data.PgSH; import org.apache.commons.lang3.StringUtils; import org.apache.log4j.Logger; @@ -25,6 +26,9 @@ import com.szpg.util.NumberFormat; import com.szpg.util.TimeFormat; +/** + * @author TAN YUE + */ public class ReadHSValueCommandResponse extends ReadMemoryCommandResponse { /** @@ -33,10 +37,24 @@ private static final long serialVersionUID = -3864512113984510244L; private final Logger logger = Logger.getLogger(this.getClass().getName()); - - private List hsnd; //硫化氢浓度值 - private List hsldbjz; //硫化氢联动报警值 - private String[] zcList; // 监测设备资产列表,从配置文件中获取 + + /** + * 硫化氢浓度值 + */ + private List hsnd; + + /** + * 硫化氢联动报警值 + */ + private List hsldbjz; + + /** + * 监测设备资产列表,从配置文件中获取 + */ + private String[] zcList; + + private boolean HS_ON_FJ = false; + private long CLASS_RED_ALARM_INTERVAL = 60 * 60 * 1000L; public ReadHSValueCommandResponse() { hsnd = new ArrayList(); @@ -74,94 +92,108 @@ 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 = hsnd.get(i); - + int deviceId = deviceDao.findDeviceIdByCode(zcbh); if (deviceId > 0) { - hsDao.addPblzRecord(hsnd.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), deviceId); - - // (一)如果有报警则立即推送 - // 判断是否超过报警阈值 + // 1 取出报警规则 PgAlarmRule rule = ruleDao.findRuleByDevice(deviceId); + + // 默认的报警阈值 + double high = 0.0; if (null != rule) { - double high = 0.0; try { high = NumberFormat.parseDouble(rule.getHighvalue(), "0.00"); } catch (Exception ex) { logger.error(ex); ex.printStackTrace(); } - - // 一氧化碳浓度超过高限阈值 - if (high > 0.0001 && value > high) { - PgAlarm alarm = new PgAlarm(); - alarm.setActive(1); - alarm.setAlarm_date(this.getTime().getTime()); - alarm.setAlarm_value(NumberFormat.format(value, "0.00")); - alarm.setAlarmdevid(deviceId); - alarm.setAlarmtypeid(PgAlarm.ALARM_TYPE_PGRUN); - alarm.setDescription("硫化氢浓度超过高限阈值"); - alarm.setUserid(null); - // 硫化氢报警定义为一级报警 - alarm.setAlarm_grade("一级报警"); - - alarmDao.insertAlarmRecord(alarm); - deviceDao.updateDeviceStatus(deviceId, "硫化氢浓度过高"); - - // 将报警日志推送至市级平台 - 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.addHSAlarmData(bjbh, zcbh, bjms, bjsj); - logger.info("同步硫化氢报警记录日志结果:" + jwbjResp); - - // 将报警值推送至市级平台 - String jwResp = DataPushInterface.addHSData(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); - logger.info("同步硫化氢浓度值结果:" + jwResp); - - // 自动打开当前舱段的排风机,手动关闭风机 - // 首先找到当前舱段的排风机资产编号 - if (Boolean.valueOf(Configure.getProperty("sys", "HS_ON_FJ", "false")) == true) { - String acucode = zcbh.substring(0, zcbh.indexOf(".", 6)); - String cabin = zcbh.substring(zcbh.lastIndexOf(".") + 1, zcbh.lastIndexOf(".") + 2); - List fjs = deviceDao.findDeviceByPositionAndType(acucode, "F", cabin); - if (null != fjs && fjs.isEmpty() == false) { - String baseURL = Configure.getProperty("sys", "PGDSC_API_URL"); - for (PgDevice fj : fjs) { - String fjzcbh = fj.getAssetcode(); + } - // 调用远程接口启动风机 - HttpRequest.sendGet(baseURL + "remote/turnOnFj.action", "zcbh=" + fjzcbh); - } - } + // 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_RED_ALARM_INTERVAL) { + continue; } } - } - - // (二)如果监测值有变化则推送 - // 判断硫化氢浓度值是否有变化 - double lastValue = hsDao.findLastValueByDevice(deviceId); - if (Math.abs(value - lastValue) > 0.01) { - // 将监测值推送至市级平台 - String coResp = DataPushInterface.addHSData(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); - logger.info("同步硫化氢浓度值结果:" + coResp); - } - - // (三)如果监测值没有变化 - // 每天小时各推送一个数据 - int minute = Calendar.getInstance().get(Calendar.MINUTE); - if (minute < 10) { - // 将监测值推送至市级平台 - String coResp = DataPushInterface.addHSData(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); - logger.info("同步硫化氢浓度值结果:" + coResp); + + // 2.5 插入监测数值 + hsDao.addPblzRecord(value, TimeFormat.formatTimestamp(this.getTime().getTime()), deviceId); + + // 2.6 推送给市管廊公司平台 + String hsResp = DataPushInterface.addHSData(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步硫化氢浓度值结果:" + hsResp); + + // 2.7 生成报警记录 + PgAlarm alarm = new PgAlarm().getHSAlarmInstance(); + + 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 hsbjResp = DataPushInterface.addHSAlarmData(bjbh, zcbh, bjms, bjsj); + logger.info("同步硫化氢报警记录日志结果:" + hsbjResp); + + // 2.10 联动打开风机 + // 自动打开当前舱段的排风机,手动关闭风机 + // 首先找到当前舱段的排风机资产编号 + if (HS_ON_FJ == true) { + String baseURL = Configure.getProperty("sys", "PGDSC_API_URL"); + HttpRequest.sendGet(baseURL + "remote/turnOnFjReactAlarm.action", "zcbh=" + zcbh); + } + } else { + // 3 不需要报警,只处理监测值 + // 3.1 取出上一个监测值 + PgSH lastRec = hsDao.findLastRecordByDevice(deviceId); + + // 3.2 计算数值的时间间隔 + long valueTimeInterval = this.getTime().getTimeInMillis() - lastRec.getUptime().getTime(); + + // 3.3 判断条件:是否与原值相同且相距在一小时以内 + if (Math.abs(value - lastRec.getSh()) > 0.01 || valueTimeInterval > CLASS_RED_ALARM_INTERVAL) { + // 3.4 将数据存入数据库 + hsDao.addPblzRecord(value, TimeFormat.formatTimestamp(this.getTime().getTime()), deviceId); + + // 3.5 推送给市管廊公司平台 + String hsResp = DataPushInterface.addHSData(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步硫化氢浓度值结果:" + hsResp); + } } } else { logger.warn("未找到资产[" + zcbh + "]"); diff --git a/src/com/szpg/plc/message/response/read/ReadO2ValueCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadO2ValueCommandResponse.java index 822beda..ebeb051 100644 --- a/src/com/szpg/plc/message/response/read/ReadO2ValueCommandResponse.java +++ b/src/com/szpg/plc/message/response/read/ReadO2ValueCommandResponse.java @@ -1,12 +1,5 @@ package com.szpg.plc.message.response.read; -import java.util.ArrayList; -import java.util.Calendar; -import java.util.List; - -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.PgDeviceDao; @@ -17,14 +10,19 @@ import com.szpg.db.dao.impl.PgO2DaoImpl; import com.szpg.db.data.PgAlarm; import com.szpg.db.data.PgAlarmRule; -import com.szpg.db.data.PgDevice; +import com.szpg.db.data.PgO2; 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; +import com.szpg.util.*; +import org.apache.commons.lang3.StringUtils; +import org.apache.log4j.Logger; +import java.util.ArrayList; +import java.util.List; + +/** + * 读取氧气值指令的响应消息 + * @author TAN YUE + */ public class ReadO2ValueCommandResponse extends ReadMemoryCommandResponse { /** @@ -33,14 +31,31 @@ private static final long serialVersionUID = -2816512676498637196L; private final Logger logger = Logger.getLogger(this.getClass().getName()); - - private List o2nd; // 氧气浓度值 - private List o2ldbjz; // 氧气联动报警值 - private String[] zcList; // 氧气监测设备资产列表,从配置文件中获取 + + /** + * 氧气浓度值 + */ + private List o2nd; + + /** + * 氧气联动报警值 + */ + private List o2ldbjz; + + /** + * 氧气监测设备资产列表,从配置文件中获取 + */ + private String[] zcList; + + private boolean O2_ON_FJ = false; + private long CLASS_RED_ALARM_INTERVAL = 60 * 60 * 1000L; public ReadO2ValueCommandResponse() { o2nd = new ArrayList(); o2ldbjz = new ArrayList(); + + O2_ON_FJ = Boolean.valueOf(Configure.getProperty("sys", "O2_ON_FJ", "false")); + CLASS_RED_ALARM_INTERVAL = Integer.parseInt(Configure.getProperty("sys", "CLASS_RED_ALARM_INTERVAL", "60")) * 60 * 1000L; } public List getO2nd() { @@ -78,90 +93,104 @@ if (null != zcList && zcList.length > 0) { // 遍历氧气设备列表,将氧气浓度监测值存入数据库 for (int i = 0; i < zcList.length; i++) { + // 资产编号(设备编号) String zcbh = zcList[i]; - + + // 监测值 float value = o2nd.get(i); int deviceId = deviceDao.findDeviceIdByCode(zcbh); if (deviceId > 0) { - o2Dao.addPblzRecord(o2nd.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), deviceId); - - // (一)如果有报警则立即推送 - // 判断是否超过报警阈值 + // 1 取出报警规则 PgAlarmRule rule = ruleDao.findRuleByDevice(deviceId); + + // 默认的报警阈值 + double low = 18.0; if (null != rule) { - double low = 0.0; try { low = NumberFormat.parseDouble(rule.getLowvalue(), "0.00"); } catch (Exception ex) { logger.error(ex); ex.printStackTrace(); } - - // 氧气浓度低于低限阈值 - if (low > 0.0001 && value < low) { - PgAlarm alarm = new PgAlarm(); - alarm.setActive(1); - alarm.setAlarm_date(this.getTime().getTime()); - alarm.setAlarm_value(NumberFormat.format(value, "0.00")); - alarm.setAlarmdevid(deviceId); - alarm.setAlarmtypeid(PgAlarm.ALARM_TYPE_PGRUN); - alarm.setDescription("氧气浓度低于低限阈值"); - alarm.setUserid(null); - // 氧气报警定义为一级报警 - alarm.setAlarm_grade("一级报警"); - - alarmDao.insertAlarmRecord(alarm); - deviceDao.updateDeviceStatus(deviceId, "氧气浓度过低"); - - // 将报警日志推送至市级平台 - 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.addO2AlarmData(bjbh, zcbh, bjms, bjsj); - logger.info("同步氧气报警记录日志结果:" + jwbjResp); - - // 将报警值推送至市级平台 - String jwResp = DataPushInterface.addO2Data(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); - logger.info("同步氧气浓度值结果:" + jwResp); - - // 自动打开当前舱段的排风机,手动关闭风机 - // 首先找到当前舱段的排风机资产编号 - if (Boolean.valueOf(Configure.getProperty("sys", "O2_ON_FJ", "false")) == true) { - String acucode = zcbh.substring(0, zcbh.indexOf(".", 6)); - String cabin = zcbh.substring(zcbh.lastIndexOf(".") + 1, zcbh.lastIndexOf(".") + 2); - List fjs = deviceDao.findDeviceByPositionAndType(acucode, "F", cabin); - if (null != fjs && fjs.isEmpty() == false) { - String baseURL = Configure.getProperty("sys", "PGDSC_API_URL"); - for (PgDevice fj : fjs) { - String fjzcbh = fj.getAssetcode(); + } - // 调用远程接口启动风机 - HttpRequest.sendGet(baseURL + "remote/turnOnFj.action", "zcbh=" + fjzcbh); - } - } + // 1 判断是否报警 + if (low > 0.0001 && value < low) { + // 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_RED_ALARM_INTERVAL) { + continue; } } - } - - // (二)如果监测值有变化则推送 - // 判断氧气浓度值是否有变化 - double lastValue = o2Dao.findLastValueByDevice(deviceId); - if (Math.abs(value - lastValue) > 0.01) { - // 将监测值推送至市级平台 + + // 2.5 插入监测数值 + o2Dao.addPblzRecord(value, TimeFormat.formatTimestamp(this.getTime().getTime()), deviceId); + + // 2.6 推送给市管廊公司平台 String o2Resp = DataPushInterface.addO2Data(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); logger.info("同步氧气浓度值结果:" + o2Resp); - } - - // (三)如果监测值有变化则推送 - // 每天小时各推送一个数据 - int minute = Calendar.getInstance().get(Calendar.MINUTE); - if (minute < 10) { - // 将监测值推送至市级平台 - String o2Resp = DataPushInterface.addO2Data(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); - logger.info("同步氧气浓度值结果:" + o2Resp); + + // 2.7 生成报警记录 + PgAlarm alarm = new PgAlarm().getO2AlarmInstance(); + + 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.addO2AlarmData(bjbh, zcbh, bjms, bjsj); + logger.info("同步氧气报警记录日志结果:" + jwbjResp); + + // 2.10 联动打开风机 + // 自动打开当前舱段的排风机,手动关闭风机 + // 首先找到当前舱段的排风机资产编号 + if (O2_ON_FJ == true) { + String baseURL = Configure.getProperty("sys", "PGDSC_API_URL"); + HttpRequest.sendGet(baseURL + "remote/turnOnFjReactAlarm.action", "zcbh=" + zcbh); + } + } else { + // 3 不需要报警,只处理监测值 + // 3.1 取出上一个监测值 + PgO2 lastRec = o2Dao.findLastRecordByDevice(deviceId); + + // 3.2 计算数值的时间间隔 + long valueTimeInterval = this.getTime().getTimeInMillis() - lastRec.getUptime().getTime(); + + // 3.3 判断条件:是否与原值相同且相距在一小时以内 + if (Math.abs(value - lastRec.getO2()) > 0.01 || valueTimeInterval > CLASS_RED_ALARM_INTERVAL) { + // 3.4 将数据存入数据库 + o2Dao.addPblzRecord(value, TimeFormat.formatTimestamp(this.getTime().getTime()), deviceId); + + // 3.5 推送给市管廊公司平台 + String o2Resp = DataPushInterface.addO2Data(zcbh, NumberFormat.format(value, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步氧气浓度值结果:" + o2Resp); + } } } else { logger.warn("未找到资产[" + zcbh + "]"); diff --git a/src/com/szpg/plc/message/response/read/ReadWSValueCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadWSValueCommandResponse.java index 3d3ebd0..db6af74 100644 --- a/src/com/szpg/plc/message/response/read/ReadWSValueCommandResponse.java +++ b/src/com/szpg/plc/message/response/read/ReadWSValueCommandResponse.java @@ -4,6 +4,7 @@ import java.util.Calendar; import java.util.List; +import com.szpg.db.data.PgTemphum; import org.apache.commons.lang3.StringUtils; import org.apache.log4j.Logger; @@ -25,6 +26,9 @@ import com.szpg.util.NumberFormat; import com.szpg.util.TimeFormat; +/** + * @author TAN YUE + */ public class ReadWSValueCommandResponse extends ReadMemoryCommandResponse { /** @@ -33,12 +37,35 @@ private static final long serialVersionUID = 2964733118081941174L; private final Logger logger = Logger.getLogger(this.getClass().getName()); - - private List wd; //温度监测值 - private List sd; //湿度监测值 - private List wdbjz; //温度报警阈值 - private List sdbjz; //湿度报警阈值 - private String[] zcList; //温湿度监测的资产列表,从配置文件中获取 + + /** + * 温度监测值 + */ + private List wd; + + /** + * 湿度监测值 + */ + private List sd; + + /** + * 温度报警阈值 + */ + private List wdbjz; + + /** + * 湿度报警阈值 + */ + private List sdbjz; + + /** + * 温湿度监测的资产列表,从配置文件中获取 + */ + private String[] zcList; + + private boolean WD_ON_FJ = false; + private boolean SD_ON_FJ = false; + private long CLASS_YELLOW_ALARM_INTERVAL = 360 * 60 * 1000L; public ReadWSValueCommandResponse() { wd = new ArrayList(); @@ -94,59 +121,85 @@ 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 wdValue = wd.get(i); float sdValue = sd.get(i); - + int deviceId = deviceDao.findDeviceIdByCode(zcbh); if (deviceId > 0) { - try { - wsDao.addWsdzRecord(wdValue, sdValue, TimeFormat.formatTimestamp(this.getTime().getTime()), deviceId); - } catch (Exception ex) { - logger.error("添加温湿度监测记录异常"); - } - - // (一)如果有报警则立即推送 - // 判断是否超过报警阈值 + // 1 取出报警规则 PgAlarmRule rule = ruleDao.findRuleByDevice(deviceId); + + // 默认的报警阈值 + double wdHigh = 0.0; + double sdHigh = 0.0; if (null != rule) { - double wdHigh = 0.0; - double sdHigh = 0.0; try { - if (null != rule) { - String highStr = rule.getHighvalue(); - if (null != highStr && highStr.isEmpty() == false && highStr.indexOf(";") > 0) { - wdHigh = NumberFormat.parseDouble(highStr.split(";")[0], "0.00"); - sdHigh = NumberFormat.parseDouble(highStr.split(";")[1], "0.00"); - } + String highStr = rule.getHighvalue(); + if (null != highStr && highStr.isEmpty() == false && highStr.indexOf(";") > 0) { + wdHigh = NumberFormat.parseDouble(highStr.split(";")[0], "0.00"); + sdHigh = NumberFormat.parseDouble(highStr.split(";")[1], "0.00"); } } catch (Exception ex) { logger.error(ex); ex.printStackTrace(); } - - // 温度超过高限阈值 - if (wdHigh > 0.0001 && wdValue > wdHigh) { - PgAlarm wdAlarm = new PgAlarm(); - wdAlarm.setActive(1); + } + + // 1 判断温湿度是否报警 + if (wdHigh > 0.0001 && wdValue > wdHigh) { + // 2 温度需要报警,处理报警记录和监测值 + // 2.1 取出上一个温度报警记录 + PgAlarm lastTempAlarm = alarmDao.findLatestAlarmByDeviceAndType(deviceId, "温度"); + + boolean insertAlarmFlag = true; + if (null != lastTempAlarm) { + // 2.2 计算与上一个报警记录的操作时间间隔 + long tempAlarmTimeInterval = this.getTime().getTimeInMillis() - lastTempAlarm.getLog_time().getTime(); + + // 2.3 上一个温度报警值 + double lastTempAlarmValue = 0.0; + try { + lastTempAlarmValue = NumberFormat.parseDouble(lastTempAlarm.getAlarm_value(), "0.00"); + } catch (Exception ex) { + logger.error(ex); + ex.printStackTrace(); + } + + if (Math.abs(wdValue - lastTempAlarmValue) < 0.01 && tempAlarmTimeInterval < CLASS_YELLOW_ALARM_INTERVAL) { + insertAlarmFlag = false; + } + } + + // 2.4 如果与前值不同 或者 时间在设定的阈值范围之外 则处理报警 + if (insertAlarmFlag == true) { + // 2.5 插入监测数值 + wsDao.addWsdzRecord(wdValue, sdValue, TimeFormat.formatTimestamp(this.getTime().getTime()), deviceId); + + // 2.6 推送给市管廊公司平台 + String wdResp = DataPushInterface.addTempData(zcbh, NumberFormat.format(wdValue, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步温度值结果:" + wdResp); + + // 2.7 生成报警记录 + PgAlarm wdAlarm = new PgAlarm().getTempAlarmInstance(); + wdAlarm.setAlarm_date(this.getTime().getTime()); wdAlarm.setAlarm_value(NumberFormat.format(wdValue, "0.00")); wdAlarm.setAlarmdevid(deviceId); - wdAlarm.setAlarmtypeid(PgAlarm.ALARM_TYPE_PGRUN); - wdAlarm.setDescription("温度超过高限阈值"); - wdAlarm.setUserid(null); - // 温湿度报警定义为二级报警 - wdAlarm.setAlarm_grade("二级报警"); - + wdAlarm.setLog_time(this.getTime().getTime()); + + // 2.8 将上一条报警记录消警 alarmDao.insertAlarmRecord(wdAlarm); 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"); @@ -154,47 +207,61 @@ String bjsj = date.replace("-", ""); String wdbjResp = DataPushInterface.addTempAlarmData(bjbh, zcbh, bjms, bjsj); logger.info("同步温度报警记录日志结果:" + wdbjResp); - - // 将报警值推送至市级平台 - String wdResp = DataPushInterface.addTempData(zcbh, NumberFormat.format(wdValue, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); - logger.info("同步温度值结果:" + wdResp); - + + // 2.10 联动打开风机 // 自动打开当前舱段的排风机,手动关闭风机 // 首先找到当前舱段的排风机资产编号 - if (Boolean.valueOf(Configure.getProperty("sys", "WD_ON_FJ", "false")) == true) { - String acucode = zcbh.substring(0, zcbh.indexOf(".", 6)); - String cabin = zcbh.substring(zcbh.lastIndexOf(".") + 1, zcbh.lastIndexOf(".") + 2); - List fjs = deviceDao.findDeviceByPositionAndType(acucode, "F", cabin); - if (null != fjs && fjs.isEmpty() == false) { - String baseURL = Configure.getProperty("sys", "PGDSC_API_URL"); - for (PgDevice fj : fjs) { - String fjzcbh = fj.getAssetcode(); - - // 调用远程接口启动风机 - HttpRequest.sendGet(baseURL + "remote/turnOnFj.action", "zcbh=" + fjzcbh); - } - } + if (WD_ON_FJ == true) { + String baseURL = Configure.getProperty("sys", "PGDSC_API_URL"); + HttpRequest.sendGet(baseURL + "remote/turnOnFjReactAlarm.action", "zcbh=" + zcbh); } } - - - // 湿度超过高限阈值 - if (sdHigh > 0.0001 && sdValue > sdHigh) { - PgAlarm sdAlarm = new PgAlarm(); - sdAlarm.setActive(1); + } else if (sdHigh > 0.0001 && sdValue > sdHigh) { + // 3 湿度需要报警,处理报警记录和监测值 + // 3.1 取出上一个报警记录 + PgAlarm lastHumAlarm = alarmDao.findLatestAlarmByDeviceAndType(deviceId, "湿度"); + + boolean insertAlarmFlag = true; + if (null != lastHumAlarm) { + // 3.2 计算与上一个报警记录的操作时间间隔 + long humAlarmTimeInterval = this.getTime().getTimeInMillis() - lastHumAlarm.getLog_time().getTime(); + + // 3.3 上一个湿度报警值 + double lastHumAlarmValue = 0.0; + try { + lastHumAlarmValue = NumberFormat.parseDouble(lastHumAlarm.getAlarm_value(), "0.00"); + } catch (Exception ex) { + logger.error(ex); + ex.printStackTrace(); + } + + if (Math.abs(wdValue - lastHumAlarmValue) < 0.01 && humAlarmTimeInterval < CLASS_YELLOW_ALARM_INTERVAL) { + insertAlarmFlag = false; + } + } + + // 3.4 如果与前值不同 或者 时间在设定的阈值范围外 则处理报警 + if (insertAlarmFlag == true) { + // 3.5 插入监测数值 + wsDao.addWsdzRecord(wdValue, sdValue, TimeFormat.formatTimestamp(this.getTime().getTime()), deviceId); + + // 3.6 推送给市管廊公司平台 + String sdResp = DataPushInterface.addHumData(zcbh, NumberFormat.format(sdValue, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步湿度值结果:" + sdResp); + + // 3.7 生成报警记录 + PgAlarm sdAlarm = new PgAlarm().getHumAlarmInstance(); + sdAlarm.setAlarm_date(this.getTime().getTime()); sdAlarm.setAlarm_value(NumberFormat.format(sdValue, "0.00")); sdAlarm.setAlarmdevid(deviceId); - sdAlarm.setAlarmtypeid(PgAlarm.ALARM_TYPE_PGRUN); - sdAlarm.setDescription("湿度超过高限阈值"); - sdAlarm.setUserid(null); - // 温湿度报警定义为二级报警 - sdAlarm.setAlarm_grade("二级报警"); - + sdAlarm.setLog_time(this.getTime().getTime()); + + // 3.8 将上一条报警记录消警 alarmDao.insertAlarmRecord(sdAlarm); deviceDao.updateDeviceStatus(deviceId, "湿度超高"); - - // 将报警日志推送至市级平台 + + // 3.9 向市级平台推送报警日志 String date = TimeFormat.formatDate(getTime().getTime()); int count = alarmDao.findAlarmCountByDate(date); String bjbh = "THXC." + date + "." + NumberFormat.format(count+1, "0000"); @@ -202,44 +269,32 @@ String bjsj = date.replace("-", ""); String sdbjResp = DataPushInterface.addHumAlarmData(bjbh, zcbh, bjms, bjsj); logger.info("同步湿度报警记录日志结果:" + sdbjResp); - - // 将报警值推送至市级平台 + + // 3.10 湿度不需要联动打开风机 + } + } else { + // 4 不需要报警,只处理监测值 + // 4.1 取出上一个监测值 + PgTemphum lastRec = wsDao.findLastRecordByDevice(deviceId); + + // 4.2 计算数值的时间间隔 + long valueTimeInterval = this.getTime().getTimeInMillis() - lastRec.getUptime().getTime(); + + // 4.3 判断条件:是否与原值(温度与湿度)相同且相距在六小时以内 + if (Math.abs(wdValue - lastRec.getTemp()) > 0.01 || + Math.abs(sdValue - lastRec.getHum()) > 0.01 || + valueTimeInterval > CLASS_YELLOW_ALARM_INTERVAL) { + // 4.4 将数据存入数据库 + wsDao.addWsdzRecord(wdValue, sdValue, TimeFormat.formatTimestamp(this.getTime().getTime()), deviceId); + + // 4.5 推送给市管廊公司平台 + String wdResp = DataPushInterface.addTempData(zcbh, NumberFormat.format(wdValue, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); + logger.info("同步温度值结果:" + wdResp); + String sdResp = DataPushInterface.addHumData(zcbh, NumberFormat.format(sdValue, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); logger.info("同步湿度值结果:" + sdResp); - - // 湿度不需要联动打开风机 } } - - - // (二)如果监测值有变化则推送 - // 判断温度值是否有变化 - double lastTemp = wsDao.findLastTempByDevice(deviceId); - if (Math.abs(wdValue - lastTemp) > 0.01) { - // 将监测值推送至市级平台 - String wdResp = DataPushInterface.addTempData(zcbh, NumberFormat.format(wdValue, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); - logger.info("同步温度值结果:" + wdResp); - } - - // 判断湿度值是否有变化 - double lastHum = wsDao.findLastHumByDevice(deviceId); - if (Math.abs(sdValue - lastHum) > 0.01) { - // 将监测值推送至市级平台 - String sdResp = DataPushInterface.addHumData(zcbh, NumberFormat.format(sdValue, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); - logger.info("同步湿度值结果:" + sdResp); - } - - // (三)如果监测值有变化则推送 - // 每天小时各推送一个数据 - int minute = Calendar.getInstance().get(Calendar.MINUTE); - if (minute < 10) { - // 将监测值推送至市级平台 - String wdResp = DataPushInterface.addTempData(zcbh, NumberFormat.format(wdValue, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); - logger.info("同步温度值结果:" + wdResp); - - String sdResp = DataPushInterface.addHumData(zcbh, NumberFormat.format(sdValue, "0.00"), TimeFormat.format(this.getTime().getTime(), "yyyyMMddHHmmss")); - logger.info("同步湿度值结果:" + sdResp); - } } else { logger.warn("未找到资产[" + zcbh + "]"); } diff --git a/src/com/szpg/rmi/RemoteFJCommandAction.java b/src/com/szpg/rmi/RemoteFJCommandAction.java index 46f3d7f..1bb1239 100644 --- a/src/com/szpg/rmi/RemoteFJCommandAction.java +++ b/src/com/szpg/rmi/RemoteFJCommandAction.java @@ -8,6 +8,7 @@ import com.szpg.db.dao.impl.PgDeviceDaoImpl; import com.szpg.db.dao.impl.PgFjDaoImpl; import com.szpg.db.data.PgAcu; +import com.szpg.db.data.PgDevice; import com.szpg.db.data.PgFjStat; import com.szpg.plc.message.AppMessageConstants; import com.szpg.plc.message.command.ReadMemoryCommand; @@ -29,6 +30,7 @@ import org.apache.struts2.ServletActionContext; import z.json.JSONObject; +import java.util.List; import java.util.concurrent.ScheduledThreadPoolExecutor; import java.util.concurrent.TimeUnit; @@ -366,6 +368,29 @@ } /** + * 根据报警的资产编号联动打开风机 + * @return + * @throws Exception + */ + public String turnOnFjReactAlarm() throws Exception { + PgDeviceDao deviceDao = new PgDeviceDaoImpl(); + String acucode = zcbh.substring(0, zcbh.indexOf(".", 6)); + String cabin = zcbh.substring(zcbh.lastIndexOf(".") + 1, zcbh.lastIndexOf(".") + 2); + List fjs = deviceDao.findDeviceByPositionAndType(acucode, "F", cabin); + if (null != fjs && fjs.isEmpty() == false) { + String baseURL = Configure.getProperty("sys", "PGDSC_API_URL"); + + // 打开舱内的一个风机即可 + String fjzcbh = fjs.get(0).getAssetcode(); + + // 调用远程接口启动风机 + HttpRequest.sendGet(baseURL + "remote/turnOnFj.action", "zcbh=" + fjzcbh); + } + + return null; + } + + /** * 给前端返回 * @param jResult * @throws Exception diff --git a/src/struts.xml b/src/struts.xml index a4e734d..87c3769 100644 --- a/src/struts.xml +++ b/src/struts.xml @@ -34,6 +34,7 @@ + diff --git a/src/sys.properties b/src/sys.properties index b1e7f46..b296ed6 100644 --- a/src/sys.properties +++ b/src/sys.properties @@ -34,4 +34,7 @@ WD_ON_FJ = false SD_ON_FJ = false HS_ON_FJ = false -DS_ON_ZM = false \ No newline at end of file +DS_ON_ZM = false + +CLASS_RED_ALARM_INTERVAL = 60 +CLASS_YELLO_ALARM_INTERVAL = 360 \ No newline at end of file