diff --git a/src/main/java/org/well/well/AlarmEnumDTO/PressureAlarmEnum.java b/src/main/java/org/well/well/AlarmEnumDTO/PressureAlarmEnum.java new file mode 100644 index 0000000..b228805 --- /dev/null +++ b/src/main/java/org/well/well/AlarmEnumDTO/PressureAlarmEnum.java @@ -0,0 +1,62 @@ +package org.well.well.AlarmEnumDTO; + +/** + * @author cz + * @date 2023-11-10 + */ +public enum PressureAlarmEnum { + + NO_DATA("设备异常", -1), + + NORMAL("正常", 0), + + OVER_THRESH("压力超限", 1), + + PressureCommunicationFailure("压力传感器通讯失败", 2), + + PressureError("压力传感器异常", 3), + + PressureUnknown("压力未知异常", 4), + + OVER_THRESH1("一级压力超限", 5), + + OVER_THRESH2("二级压力超限", 6); + + // 成员变量 + private String name; + private int index; + + // 构造方法 + private PressureAlarmEnum(String name, int index) { + this.name = name; + this.index = index; + } + + public int getIndex() { + return this.index; + } + + public String getName() { + return this.name; + } + + public static PressureAlarmEnum getByIndex(String index) { + try { + for (PressureAlarmEnum temp : values()) { + if (temp.index == Integer.parseInt(index)) { + return temp; + } + } + } catch (Exception e) { + } + return null; + } + + //覆盖方法 + @Override + public String toString() { + return this.name; + } + + +} diff --git a/src/main/java/org/well/well/AlarmEnumDTO/PressureAlarmEnum.java b/src/main/java/org/well/well/AlarmEnumDTO/PressureAlarmEnum.java new file mode 100644 index 0000000..b228805 --- /dev/null +++ b/src/main/java/org/well/well/AlarmEnumDTO/PressureAlarmEnum.java @@ -0,0 +1,62 @@ +package org.well.well.AlarmEnumDTO; + +/** + * @author cz + * @date 2023-11-10 + */ +public enum PressureAlarmEnum { + + NO_DATA("设备异常", -1), + + NORMAL("正常", 0), + + OVER_THRESH("压力超限", 1), + + PressureCommunicationFailure("压力传感器通讯失败", 2), + + PressureError("压力传感器异常", 3), + + PressureUnknown("压力未知异常", 4), + + OVER_THRESH1("一级压力超限", 5), + + OVER_THRESH2("二级压力超限", 6); + + // 成员变量 + private String name; + private int index; + + // 构造方法 + private PressureAlarmEnum(String name, int index) { + this.name = name; + this.index = index; + } + + public int getIndex() { + return this.index; + } + + public String getName() { + return this.name; + } + + public static PressureAlarmEnum getByIndex(String index) { + try { + for (PressureAlarmEnum temp : values()) { + if (temp.index == Integer.parseInt(index)) { + return temp; + } + } + } catch (Exception e) { + } + return null; + } + + //覆盖方法 + @Override + public String toString() { + return this.name; + } + + +} diff --git a/src/main/java/org/well/well/base/DeviceTypeEnum.java b/src/main/java/org/well/well/base/DeviceTypeEnum.java index aa4fa46..9b354ba 100644 --- a/src/main/java/org/well/well/base/DeviceTypeEnum.java +++ b/src/main/java/org/well/well/base/DeviceTypeEnum.java @@ -27,8 +27,9 @@ LG("燃气智能监测终端(一体化)", 22), Tube("管盯", 23), WellPlus("井盖液位一体机", 24), - HydrogenSulfide("课题硫化氢检测仪", 25); - + HydrogenSulfide("课题硫化氢检测仪", 25), + Pressure("压力监测终端", 31), + GasDetector("点型可燃气体探测器", 32); // 成员变量 private String name; diff --git a/src/main/java/org/well/well/AlarmEnumDTO/PressureAlarmEnum.java b/src/main/java/org/well/well/AlarmEnumDTO/PressureAlarmEnum.java new file mode 100644 index 0000000..b228805 --- /dev/null +++ b/src/main/java/org/well/well/AlarmEnumDTO/PressureAlarmEnum.java @@ -0,0 +1,62 @@ +package org.well.well.AlarmEnumDTO; + +/** + * @author cz + * @date 2023-11-10 + */ +public enum PressureAlarmEnum { + + NO_DATA("设备异常", -1), + + NORMAL("正常", 0), + + OVER_THRESH("压力超限", 1), + + PressureCommunicationFailure("压力传感器通讯失败", 2), + + PressureError("压力传感器异常", 3), + + PressureUnknown("压力未知异常", 4), + + OVER_THRESH1("一级压力超限", 5), + + OVER_THRESH2("二级压力超限", 6); + + // 成员变量 + private String name; + private int index; + + // 构造方法 + private PressureAlarmEnum(String name, int index) { + this.name = name; + this.index = index; + } + + public int getIndex() { + return this.index; + } + + public String getName() { + return this.name; + } + + public static PressureAlarmEnum getByIndex(String index) { + try { + for (PressureAlarmEnum temp : values()) { + if (temp.index == Integer.parseInt(index)) { + return temp; + } + } + } catch (Exception e) { + } + return null; + } + + //覆盖方法 + @Override + public String toString() { + return this.name; + } + + +} diff --git a/src/main/java/org/well/well/base/DeviceTypeEnum.java b/src/main/java/org/well/well/base/DeviceTypeEnum.java index aa4fa46..9b354ba 100644 --- a/src/main/java/org/well/well/base/DeviceTypeEnum.java +++ b/src/main/java/org/well/well/base/DeviceTypeEnum.java @@ -27,8 +27,9 @@ LG("燃气智能监测终端(一体化)", 22), Tube("管盯", 23), WellPlus("井盖液位一体机", 24), - HydrogenSulfide("课题硫化氢检测仪", 25); - + HydrogenSulfide("课题硫化氢检测仪", 25), + Pressure("压力监测终端", 31), + GasDetector("点型可燃气体探测器", 32); // 成员变量 private String name; diff --git a/src/main/java/org/well/well/domain/Pressure.java b/src/main/java/org/well/well/domain/Pressure.java new file mode 100644 index 0000000..b625539 --- /dev/null +++ b/src/main/java/org/well/well/domain/Pressure.java @@ -0,0 +1,153 @@ +package org.well.well.domain; + +import org.well.well.util.SnowFlakeUtil; + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.Id; +import javax.persistence.Table; +import java.sql.Timestamp; + +/** + * 压力监测终端 + * + * @author cz + * @date 2023-11-10 + */ +@Entity +@Table(name = "data_pressure") +public class Pressure { + + /** + * + */ + private static final long serialVersionUID = 566089135526318712L; + + private Long dbId; + private String devCode; //设备编号 + private String wellCode; //井编号 + private String dataValue; //浓度 + private String cell; //电池电量 + private String descn; //状态描述 + private Timestamp uptime; //采集时间 + private Timestamp logtime; //记录时间 + private String pci; + private String rsrp; + private String snr; + + @Id +// @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name = "ID") + public Long getDbId() { + return dbId; + } + + public void setDbId(Long dbId) { + this.dbId = dbId; + } + + @Column(name = "DATA_VALUE") + public String getDataValue() { + return dataValue; + } + + public void setDataValue(String dataValue) { + this.dataValue = dataValue; + } + + @Column(name = "DEVCODE") + public String getDevCode() { + return devCode; + } + + public void setDevCode(String devCode) { + this.devCode = devCode; + } + + @Column(name = "WELL_CODE") + public String getWellCode() { + return wellCode; + } + + public void setWellCode(String wellCode) { + this.wellCode = wellCode; + } + + @Column(name = "DESCN") + public String getDescn() { + return descn; + } + + public void setDescn(String descn) { + this.descn = descn; + } + + @Column(name = "CELL") + public String getCell() { + return cell; + } + + public void setCell(String cell) { + this.cell = cell; + } + + @Column(name = "UPTIME") + public Timestamp getUptime() { + return uptime; + } + + public void setUptime(Timestamp uptime) { + this.uptime = uptime; + } + + @Column(name = "LOGTIME") + public Timestamp getLogtime() { + return logtime; + } + + public void setLogtime(Timestamp logtime) { + this.logtime = logtime; + } + + @Column(name = "PCI") + public String getPci() { + return pci; + } + + public void setPci(String pci) { + this.pci = pci; + } + + @Column(name = "RSRP") + public String getRsrp() { + return rsrp; + } + + public void setRsrp(String rsrp) { + this.rsrp = rsrp; + } + + @Column(name = "SNR") + public String getSnr() { + return snr; + } + + public void setSnr(String snr) { + this.snr = snr; + } + + public Pressure() { + } + + public Pressure(String devCode, String wellCode, String dataValue, String cell, Timestamp uptime, Timestamp logtime) { + this.dbId = SnowFlakeUtil.getId(); + this.devCode = devCode; + this.wellCode = wellCode; + this.dataValue = dataValue; + this.cell = cell; + this.uptime = uptime; + this.logtime = logtime; + } + + +} diff --git a/src/main/java/org/well/well/AlarmEnumDTO/PressureAlarmEnum.java b/src/main/java/org/well/well/AlarmEnumDTO/PressureAlarmEnum.java new file mode 100644 index 0000000..b228805 --- /dev/null +++ b/src/main/java/org/well/well/AlarmEnumDTO/PressureAlarmEnum.java @@ -0,0 +1,62 @@ +package org.well.well.AlarmEnumDTO; + +/** + * @author cz + * @date 2023-11-10 + */ +public enum PressureAlarmEnum { + + NO_DATA("设备异常", -1), + + NORMAL("正常", 0), + + OVER_THRESH("压力超限", 1), + + PressureCommunicationFailure("压力传感器通讯失败", 2), + + PressureError("压力传感器异常", 3), + + PressureUnknown("压力未知异常", 4), + + OVER_THRESH1("一级压力超限", 5), + + OVER_THRESH2("二级压力超限", 6); + + // 成员变量 + private String name; + private int index; + + // 构造方法 + private PressureAlarmEnum(String name, int index) { + this.name = name; + this.index = index; + } + + public int getIndex() { + return this.index; + } + + public String getName() { + return this.name; + } + + public static PressureAlarmEnum getByIndex(String index) { + try { + for (PressureAlarmEnum temp : values()) { + if (temp.index == Integer.parseInt(index)) { + return temp; + } + } + } catch (Exception e) { + } + return null; + } + + //覆盖方法 + @Override + public String toString() { + return this.name; + } + + +} diff --git a/src/main/java/org/well/well/base/DeviceTypeEnum.java b/src/main/java/org/well/well/base/DeviceTypeEnum.java index aa4fa46..9b354ba 100644 --- a/src/main/java/org/well/well/base/DeviceTypeEnum.java +++ b/src/main/java/org/well/well/base/DeviceTypeEnum.java @@ -27,8 +27,9 @@ LG("燃气智能监测终端(一体化)", 22), Tube("管盯", 23), WellPlus("井盖液位一体机", 24), - HydrogenSulfide("课题硫化氢检测仪", 25); - + HydrogenSulfide("课题硫化氢检测仪", 25), + Pressure("压力监测终端", 31), + GasDetector("点型可燃气体探测器", 32); // 成员变量 private String name; diff --git a/src/main/java/org/well/well/domain/Pressure.java b/src/main/java/org/well/well/domain/Pressure.java new file mode 100644 index 0000000..b625539 --- /dev/null +++ b/src/main/java/org/well/well/domain/Pressure.java @@ -0,0 +1,153 @@ +package org.well.well.domain; + +import org.well.well.util.SnowFlakeUtil; + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.Id; +import javax.persistence.Table; +import java.sql.Timestamp; + +/** + * 压力监测终端 + * + * @author cz + * @date 2023-11-10 + */ +@Entity +@Table(name = "data_pressure") +public class Pressure { + + /** + * + */ + private static final long serialVersionUID = 566089135526318712L; + + private Long dbId; + private String devCode; //设备编号 + private String wellCode; //井编号 + private String dataValue; //浓度 + private String cell; //电池电量 + private String descn; //状态描述 + private Timestamp uptime; //采集时间 + private Timestamp logtime; //记录时间 + private String pci; + private String rsrp; + private String snr; + + @Id +// @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name = "ID") + public Long getDbId() { + return dbId; + } + + public void setDbId(Long dbId) { + this.dbId = dbId; + } + + @Column(name = "DATA_VALUE") + public String getDataValue() { + return dataValue; + } + + public void setDataValue(String dataValue) { + this.dataValue = dataValue; + } + + @Column(name = "DEVCODE") + public String getDevCode() { + return devCode; + } + + public void setDevCode(String devCode) { + this.devCode = devCode; + } + + @Column(name = "WELL_CODE") + public String getWellCode() { + return wellCode; + } + + public void setWellCode(String wellCode) { + this.wellCode = wellCode; + } + + @Column(name = "DESCN") + public String getDescn() { + return descn; + } + + public void setDescn(String descn) { + this.descn = descn; + } + + @Column(name = "CELL") + public String getCell() { + return cell; + } + + public void setCell(String cell) { + this.cell = cell; + } + + @Column(name = "UPTIME") + public Timestamp getUptime() { + return uptime; + } + + public void setUptime(Timestamp uptime) { + this.uptime = uptime; + } + + @Column(name = "LOGTIME") + public Timestamp getLogtime() { + return logtime; + } + + public void setLogtime(Timestamp logtime) { + this.logtime = logtime; + } + + @Column(name = "PCI") + public String getPci() { + return pci; + } + + public void setPci(String pci) { + this.pci = pci; + } + + @Column(name = "RSRP") + public String getRsrp() { + return rsrp; + } + + public void setRsrp(String rsrp) { + this.rsrp = rsrp; + } + + @Column(name = "SNR") + public String getSnr() { + return snr; + } + + public void setSnr(String snr) { + this.snr = snr; + } + + public Pressure() { + } + + public Pressure(String devCode, String wellCode, String dataValue, String cell, Timestamp uptime, Timestamp logtime) { + this.dbId = SnowFlakeUtil.getId(); + this.devCode = devCode; + this.wellCode = wellCode; + this.dataValue = dataValue; + this.cell = cell; + this.uptime = uptime; + this.logtime = logtime; + } + + +} diff --git a/src/main/java/org/well/well/manager/PressureManager.java b/src/main/java/org/well/well/manager/PressureManager.java new file mode 100644 index 0000000..ad7a8ca --- /dev/null +++ b/src/main/java/org/well/well/manager/PressureManager.java @@ -0,0 +1,164 @@ +package org.well.well.manager; + +import net.sf.json.JSONArray; +import net.sf.json.JSONObject; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.well.well.AlarmEnumDTO.PressureAlarmEnum; +import org.well.well.base.DeviceTypeEnum; +import org.well.well.core.hibernate.HibernateEntityDao; +import org.well.well.core.util.DateUtils; +import org.well.well.core.util.StringUtils; +import org.well.well.core.util.ThreadUtil; +import org.well.well.domain.*; +import org.well.well.util.SnowFlakeUtil; + +import javax.annotation.Resource; +import java.io.IOException; +import java.sql.Timestamp; +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * 接入压力设备 + * + * @author cz + * @date 2023-11-10 + */ +@Service +public class PressureManager extends HibernateEntityDao { + + @Resource + private AlarmRecordManager alarmRecordManager; + @Resource + private AlarmRuleManager alarmRuleManager; + @Resource + private DeviceManager deviceManager; + @Resource + private BusWellManager busWellManager; + @Resource + private AlarmJobManager alarmJobManager; + + private final Logger logger = LoggerFactory.getLogger(this.getClass().getName()); + + public Map saveData(String devcode, String wellCode, + String dataValue, String cell, String uptime) { + + Map resultMap = new HashMap(); + try { + String timeFormat = DateUtils.DateFormat(uptime); + Pressure pressure = new Pressure(devcode, wellCode, dataValue, cell, + new Timestamp(StringUtils.isNotBlank(timeFormat) ? DateUtils.sdf4.parse(timeFormat).getTime() : null), + new Timestamp((new Date()).getTime())); + save(pressure); + } catch (Exception e) { + e.printStackTrace(); + logger.error("----uptime时间转换失败-----:" + uptime); + } + return resultMap; + } + + + @Transactional + public void processNormalData(JSONObject jsonObject, String devCode) { + String cell = jsonObject.getString("cell"); + JSONArray jsonArray = jsonObject.getJSONArray("datas"); + BusWell busWell = busWellManager.getWellByDevCode(devCode); + for (int i = 0; i < jsonArray.size(); i++) { + try { + String dataValue = ((JSONObject) jsonArray.get(i)).getString("dataValue"); + String upTime = ((JSONObject) jsonArray.get(i)).getString("uptime"); + dataValue = String.format("%.2f", Double.valueOf(dataValue)); + //1.存数据 + saveData(devCode, busWell == null ? "" : busWell.getWellCode(), dataValue, cell, upTime);//存储采集数据 + //2.有无超限处理流程(判断最后一条数据) + if (i < jsonArray.size() - 1) { + continue; + } + //4.清除设备告警 + alarmRecordManager.clearAlarmByNormalData(devCode, ""); + //单个设备设置的报警规则 + List ruleRankList = alarmRuleManager.getRuleRank(devCode); + float rankThresh = 0; + String isAlarm = "1"; + if (ruleRankList.size() > 0 && ruleRankList.get(0)[0] != null) { + Object rankValue = ((Object[]) ruleRankList.get(ruleRankList.size() - 1))[2]; + rankThresh = rankValue != null ? Float.valueOf(rankValue.toString()) : 0; + isAlarm = ((Object[]) ruleRankList.get(ruleRankList.size() - 1))[4].toString(); + } + + if (rankThresh > 0 && "1".equals(isAlarm) && Float.valueOf(dataValue) >= rankThresh) {//浓度超限 + Device device = deviceManager.getDeviceByDevCode(devCode); + //获取报警等级 + String alarmContent = PressureAlarmEnum.OVER_THRESH.getName(); + Integer alarmLevel = 0; + for (int j = 0; j < ruleRankList.size(); j++) { + Object rankValue = ((Object[]) ruleRankList.get(j))[2]; + if (null != rankValue) { + if (Float.valueOf(dataValue) >= Float.valueOf(rankValue.toString())) { + alarmLevel = Integer.valueOf(((Object[]) ruleRankList.get(j))[0].toString()); + break; + } + } + } + + if (device == null) { + return;//未注册设备舍弃 + } + AlarmJob alarmJob = alarmJobManager.getByDevAndType(devCode, "1"); + Long jobId = alarmJob == null ? SnowFlakeUtil.getId() : alarmJob.getId(); + if (alarmJob == null) { + alarmJobManager.saveData(jobId, devCode, busWell != null ? + busWell.getWellCode() : "", DeviceTypeEnum.Pressure.toString(), "1"); + } + //1.写入新的告警 + alarmRecordManager.saveData(jobId, "1", alarmLevel, + alarmContent, dataValue, device, + devCode, busWell != null ? busWell.getWellCode() : "", upTime, alarmContent); + //2.toDo:向app推送报警消息 + ThreadUtil.excuteMsg(null, alarmContent, busWell == null ? "" : busWell.getWellCode()); + + } else { + alarmJobManager.updateAlarmJobByDevCode(devCode, "数据正常,系统自动结束工单"); + } + //3.清离线 + deviceManager.clearOffline(devCode); + + } catch (IOException e) { + e.printStackTrace(); + logger.error("--------ERROR:设备编号:" + devCode + ",存储数据:" + jsonArray.get(i).toString() + "失败-------"); + } + } + } + + + public void processAlarmData(JSONObject jsonObject, String devCode) { + JSONArray jsonArray = jsonObject.getJSONArray("eventType"); + String logtime = jsonObject.getString("logTime"); + for (int i = 0; i < jsonArray.size(); i++) { + try { + //1.清除同类型的报警信息 + alarmRecordManager.clearAlarm(devCode, "2", + String.valueOf(PressureAlarmEnum.valueOf(jsonArray.get(i).toString()).getIndex())); + //2.写入新的报警 + Device device = deviceManager.getDeviceByDevCode(devCode); + if (null == device) return;//没注册设备舍弃 + BusWell busWell = busWellManager.getWellByDevCode(devCode); + alarmRecordManager.saveData(null, "2", null, + PressureAlarmEnum.valueOf(jsonArray.get(i).toString()).getName(), + String.valueOf(PressureAlarmEnum.valueOf(jsonArray.get(i).toString()).getIndex()), + device, devCode, null != busWell ? busWell.getWellCode() : "", logtime, + PressureAlarmEnum.valueOf(jsonArray.get(i).toString()).getName()); + + } catch (IOException e) { + e.printStackTrace(); + logger.error("--------ERROR:设备编号:" + devCode + ",存储报警数据:" + jsonArray.get(i).toString() + "失败-------"); + } + } + } + +} diff --git a/src/main/java/org/well/well/AlarmEnumDTO/PressureAlarmEnum.java b/src/main/java/org/well/well/AlarmEnumDTO/PressureAlarmEnum.java new file mode 100644 index 0000000..b228805 --- /dev/null +++ b/src/main/java/org/well/well/AlarmEnumDTO/PressureAlarmEnum.java @@ -0,0 +1,62 @@ +package org.well.well.AlarmEnumDTO; + +/** + * @author cz + * @date 2023-11-10 + */ +public enum PressureAlarmEnum { + + NO_DATA("设备异常", -1), + + NORMAL("正常", 0), + + OVER_THRESH("压力超限", 1), + + PressureCommunicationFailure("压力传感器通讯失败", 2), + + PressureError("压力传感器异常", 3), + + PressureUnknown("压力未知异常", 4), + + OVER_THRESH1("一级压力超限", 5), + + OVER_THRESH2("二级压力超限", 6); + + // 成员变量 + private String name; + private int index; + + // 构造方法 + private PressureAlarmEnum(String name, int index) { + this.name = name; + this.index = index; + } + + public int getIndex() { + return this.index; + } + + public String getName() { + return this.name; + } + + public static PressureAlarmEnum getByIndex(String index) { + try { + for (PressureAlarmEnum temp : values()) { + if (temp.index == Integer.parseInt(index)) { + return temp; + } + } + } catch (Exception e) { + } + return null; + } + + //覆盖方法 + @Override + public String toString() { + return this.name; + } + + +} diff --git a/src/main/java/org/well/well/base/DeviceTypeEnum.java b/src/main/java/org/well/well/base/DeviceTypeEnum.java index aa4fa46..9b354ba 100644 --- a/src/main/java/org/well/well/base/DeviceTypeEnum.java +++ b/src/main/java/org/well/well/base/DeviceTypeEnum.java @@ -27,8 +27,9 @@ LG("燃气智能监测终端(一体化)", 22), Tube("管盯", 23), WellPlus("井盖液位一体机", 24), - HydrogenSulfide("课题硫化氢检测仪", 25); - + HydrogenSulfide("课题硫化氢检测仪", 25), + Pressure("压力监测终端", 31), + GasDetector("点型可燃气体探测器", 32); // 成员变量 private String name; diff --git a/src/main/java/org/well/well/domain/Pressure.java b/src/main/java/org/well/well/domain/Pressure.java new file mode 100644 index 0000000..b625539 --- /dev/null +++ b/src/main/java/org/well/well/domain/Pressure.java @@ -0,0 +1,153 @@ +package org.well.well.domain; + +import org.well.well.util.SnowFlakeUtil; + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.Id; +import javax.persistence.Table; +import java.sql.Timestamp; + +/** + * 压力监测终端 + * + * @author cz + * @date 2023-11-10 + */ +@Entity +@Table(name = "data_pressure") +public class Pressure { + + /** + * + */ + private static final long serialVersionUID = 566089135526318712L; + + private Long dbId; + private String devCode; //设备编号 + private String wellCode; //井编号 + private String dataValue; //浓度 + private String cell; //电池电量 + private String descn; //状态描述 + private Timestamp uptime; //采集时间 + private Timestamp logtime; //记录时间 + private String pci; + private String rsrp; + private String snr; + + @Id +// @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name = "ID") + public Long getDbId() { + return dbId; + } + + public void setDbId(Long dbId) { + this.dbId = dbId; + } + + @Column(name = "DATA_VALUE") + public String getDataValue() { + return dataValue; + } + + public void setDataValue(String dataValue) { + this.dataValue = dataValue; + } + + @Column(name = "DEVCODE") + public String getDevCode() { + return devCode; + } + + public void setDevCode(String devCode) { + this.devCode = devCode; + } + + @Column(name = "WELL_CODE") + public String getWellCode() { + return wellCode; + } + + public void setWellCode(String wellCode) { + this.wellCode = wellCode; + } + + @Column(name = "DESCN") + public String getDescn() { + return descn; + } + + public void setDescn(String descn) { + this.descn = descn; + } + + @Column(name = "CELL") + public String getCell() { + return cell; + } + + public void setCell(String cell) { + this.cell = cell; + } + + @Column(name = "UPTIME") + public Timestamp getUptime() { + return uptime; + } + + public void setUptime(Timestamp uptime) { + this.uptime = uptime; + } + + @Column(name = "LOGTIME") + public Timestamp getLogtime() { + return logtime; + } + + public void setLogtime(Timestamp logtime) { + this.logtime = logtime; + } + + @Column(name = "PCI") + public String getPci() { + return pci; + } + + public void setPci(String pci) { + this.pci = pci; + } + + @Column(name = "RSRP") + public String getRsrp() { + return rsrp; + } + + public void setRsrp(String rsrp) { + this.rsrp = rsrp; + } + + @Column(name = "SNR") + public String getSnr() { + return snr; + } + + public void setSnr(String snr) { + this.snr = snr; + } + + public Pressure() { + } + + public Pressure(String devCode, String wellCode, String dataValue, String cell, Timestamp uptime, Timestamp logtime) { + this.dbId = SnowFlakeUtil.getId(); + this.devCode = devCode; + this.wellCode = wellCode; + this.dataValue = dataValue; + this.cell = cell; + this.uptime = uptime; + this.logtime = logtime; + } + + +} diff --git a/src/main/java/org/well/well/manager/PressureManager.java b/src/main/java/org/well/well/manager/PressureManager.java new file mode 100644 index 0000000..ad7a8ca --- /dev/null +++ b/src/main/java/org/well/well/manager/PressureManager.java @@ -0,0 +1,164 @@ +package org.well.well.manager; + +import net.sf.json.JSONArray; +import net.sf.json.JSONObject; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.well.well.AlarmEnumDTO.PressureAlarmEnum; +import org.well.well.base.DeviceTypeEnum; +import org.well.well.core.hibernate.HibernateEntityDao; +import org.well.well.core.util.DateUtils; +import org.well.well.core.util.StringUtils; +import org.well.well.core.util.ThreadUtil; +import org.well.well.domain.*; +import org.well.well.util.SnowFlakeUtil; + +import javax.annotation.Resource; +import java.io.IOException; +import java.sql.Timestamp; +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * 接入压力设备 + * + * @author cz + * @date 2023-11-10 + */ +@Service +public class PressureManager extends HibernateEntityDao { + + @Resource + private AlarmRecordManager alarmRecordManager; + @Resource + private AlarmRuleManager alarmRuleManager; + @Resource + private DeviceManager deviceManager; + @Resource + private BusWellManager busWellManager; + @Resource + private AlarmJobManager alarmJobManager; + + private final Logger logger = LoggerFactory.getLogger(this.getClass().getName()); + + public Map saveData(String devcode, String wellCode, + String dataValue, String cell, String uptime) { + + Map resultMap = new HashMap(); + try { + String timeFormat = DateUtils.DateFormat(uptime); + Pressure pressure = new Pressure(devcode, wellCode, dataValue, cell, + new Timestamp(StringUtils.isNotBlank(timeFormat) ? DateUtils.sdf4.parse(timeFormat).getTime() : null), + new Timestamp((new Date()).getTime())); + save(pressure); + } catch (Exception e) { + e.printStackTrace(); + logger.error("----uptime时间转换失败-----:" + uptime); + } + return resultMap; + } + + + @Transactional + public void processNormalData(JSONObject jsonObject, String devCode) { + String cell = jsonObject.getString("cell"); + JSONArray jsonArray = jsonObject.getJSONArray("datas"); + BusWell busWell = busWellManager.getWellByDevCode(devCode); + for (int i = 0; i < jsonArray.size(); i++) { + try { + String dataValue = ((JSONObject) jsonArray.get(i)).getString("dataValue"); + String upTime = ((JSONObject) jsonArray.get(i)).getString("uptime"); + dataValue = String.format("%.2f", Double.valueOf(dataValue)); + //1.存数据 + saveData(devCode, busWell == null ? "" : busWell.getWellCode(), dataValue, cell, upTime);//存储采集数据 + //2.有无超限处理流程(判断最后一条数据) + if (i < jsonArray.size() - 1) { + continue; + } + //4.清除设备告警 + alarmRecordManager.clearAlarmByNormalData(devCode, ""); + //单个设备设置的报警规则 + List ruleRankList = alarmRuleManager.getRuleRank(devCode); + float rankThresh = 0; + String isAlarm = "1"; + if (ruleRankList.size() > 0 && ruleRankList.get(0)[0] != null) { + Object rankValue = ((Object[]) ruleRankList.get(ruleRankList.size() - 1))[2]; + rankThresh = rankValue != null ? Float.valueOf(rankValue.toString()) : 0; + isAlarm = ((Object[]) ruleRankList.get(ruleRankList.size() - 1))[4].toString(); + } + + if (rankThresh > 0 && "1".equals(isAlarm) && Float.valueOf(dataValue) >= rankThresh) {//浓度超限 + Device device = deviceManager.getDeviceByDevCode(devCode); + //获取报警等级 + String alarmContent = PressureAlarmEnum.OVER_THRESH.getName(); + Integer alarmLevel = 0; + for (int j = 0; j < ruleRankList.size(); j++) { + Object rankValue = ((Object[]) ruleRankList.get(j))[2]; + if (null != rankValue) { + if (Float.valueOf(dataValue) >= Float.valueOf(rankValue.toString())) { + alarmLevel = Integer.valueOf(((Object[]) ruleRankList.get(j))[0].toString()); + break; + } + } + } + + if (device == null) { + return;//未注册设备舍弃 + } + AlarmJob alarmJob = alarmJobManager.getByDevAndType(devCode, "1"); + Long jobId = alarmJob == null ? SnowFlakeUtil.getId() : alarmJob.getId(); + if (alarmJob == null) { + alarmJobManager.saveData(jobId, devCode, busWell != null ? + busWell.getWellCode() : "", DeviceTypeEnum.Pressure.toString(), "1"); + } + //1.写入新的告警 + alarmRecordManager.saveData(jobId, "1", alarmLevel, + alarmContent, dataValue, device, + devCode, busWell != null ? busWell.getWellCode() : "", upTime, alarmContent); + //2.toDo:向app推送报警消息 + ThreadUtil.excuteMsg(null, alarmContent, busWell == null ? "" : busWell.getWellCode()); + + } else { + alarmJobManager.updateAlarmJobByDevCode(devCode, "数据正常,系统自动结束工单"); + } + //3.清离线 + deviceManager.clearOffline(devCode); + + } catch (IOException e) { + e.printStackTrace(); + logger.error("--------ERROR:设备编号:" + devCode + ",存储数据:" + jsonArray.get(i).toString() + "失败-------"); + } + } + } + + + public void processAlarmData(JSONObject jsonObject, String devCode) { + JSONArray jsonArray = jsonObject.getJSONArray("eventType"); + String logtime = jsonObject.getString("logTime"); + for (int i = 0; i < jsonArray.size(); i++) { + try { + //1.清除同类型的报警信息 + alarmRecordManager.clearAlarm(devCode, "2", + String.valueOf(PressureAlarmEnum.valueOf(jsonArray.get(i).toString()).getIndex())); + //2.写入新的报警 + Device device = deviceManager.getDeviceByDevCode(devCode); + if (null == device) return;//没注册设备舍弃 + BusWell busWell = busWellManager.getWellByDevCode(devCode); + alarmRecordManager.saveData(null, "2", null, + PressureAlarmEnum.valueOf(jsonArray.get(i).toString()).getName(), + String.valueOf(PressureAlarmEnum.valueOf(jsonArray.get(i).toString()).getIndex()), + device, devCode, null != busWell ? busWell.getWellCode() : "", logtime, + PressureAlarmEnum.valueOf(jsonArray.get(i).toString()).getName()); + + } catch (IOException e) { + e.printStackTrace(); + logger.error("--------ERROR:设备编号:" + devCode + ",存储报警数据:" + jsonArray.get(i).toString() + "失败-------"); + } + } + } + +} diff --git a/src/main/java/org/well/well/resp/PressureResponse.java b/src/main/java/org/well/well/resp/PressureResponse.java new file mode 100644 index 0000000..847b91a --- /dev/null +++ b/src/main/java/org/well/well/resp/PressureResponse.java @@ -0,0 +1,57 @@ +package org.well.well.resp; + +import net.sf.json.JSONObject; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.context.support.ClassPathXmlApplicationContext; +import org.well.well.base.AbstractResponse; +import org.well.well.base.DeviceTypeEnum; +import org.well.well.manager.DeviceConfigManager; +import org.well.well.manager.ImeiManager; +import org.well.well.manager.MethaneManager; +import org.well.well.manager.PressureManager; + +/** + * 压力接受处理响应 + */ +public class PressureResponse extends AbstractResponse { + private final Logger logger = LoggerFactory.getLogger(this.getClass().getName()); + private static final String[] mType = {"Data", "Event", "SetResponse", "GetResponse", "StartupRequest"}; + + @Override + public void run() { + ClassPathXmlApplicationContext ac = this.getAc(); + PressureManager pressureManager = ac.getBean(PressureManager.class); + DeviceConfigManager deviceConfigManager = ac.getBean(DeviceConfigManager.class); + ImeiManager imeiManager = ac.getBean(ImeiManager.class); + JSONObject json = JSONObject.fromObject(this.getContent()); + String devCode = json.getString("devCode"); + JSONObject jsonObject = json.getJSONObject("mBody"); + if (mType[0].equals(json.get("mType")) || mType[3].equals(json.get("mType"))) {//存储上报数据 + pressureManager.processNormalData(jsonObject, devCode); + } else if (mType[1].equals(json.get("mType"))) {//存储报警事件 + pressureManager.processAlarmData(jsonObject, devCode); + } else if (mType[2].equals(json.get("mType"))) {//更新下发参数状态 + try { + //下发配置回填数据 + if (DeviceTypeEnum.Pressure.name().equals(json.get("devType"))) { + if ("PressureConfigSuccess".equals(jsonObject.get("bType"))) { + deviceConfigManager.updateStatus(devCode); + } + } + } catch (Exception e) { + e.printStackTrace(); + logger.error("--------ERROR:设备编号:" + devCode + ",更新参数下发状态失败-------"); + } + } else if (mType[4].equals(json.get("mType"))) {//三码存储 + try { + String imei = jsonObject.get("imei").toString(); + String iccid = jsonObject.get("iccid").toString(); + imeiManager.saveData(devCode, imei, iccid); + } catch (Exception e) { + e.printStackTrace(); + logger.error("--------ERROR:设备编号:" + devCode + ",更新参数下发状态失败-------"); + } + } + } +} diff --git a/src/main/java/org/well/well/AlarmEnumDTO/PressureAlarmEnum.java b/src/main/java/org/well/well/AlarmEnumDTO/PressureAlarmEnum.java new file mode 100644 index 0000000..b228805 --- /dev/null +++ b/src/main/java/org/well/well/AlarmEnumDTO/PressureAlarmEnum.java @@ -0,0 +1,62 @@ +package org.well.well.AlarmEnumDTO; + +/** + * @author cz + * @date 2023-11-10 + */ +public enum PressureAlarmEnum { + + NO_DATA("设备异常", -1), + + NORMAL("正常", 0), + + OVER_THRESH("压力超限", 1), + + PressureCommunicationFailure("压力传感器通讯失败", 2), + + PressureError("压力传感器异常", 3), + + PressureUnknown("压力未知异常", 4), + + OVER_THRESH1("一级压力超限", 5), + + OVER_THRESH2("二级压力超限", 6); + + // 成员变量 + private String name; + private int index; + + // 构造方法 + private PressureAlarmEnum(String name, int index) { + this.name = name; + this.index = index; + } + + public int getIndex() { + return this.index; + } + + public String getName() { + return this.name; + } + + public static PressureAlarmEnum getByIndex(String index) { + try { + for (PressureAlarmEnum temp : values()) { + if (temp.index == Integer.parseInt(index)) { + return temp; + } + } + } catch (Exception e) { + } + return null; + } + + //覆盖方法 + @Override + public String toString() { + return this.name; + } + + +} diff --git a/src/main/java/org/well/well/base/DeviceTypeEnum.java b/src/main/java/org/well/well/base/DeviceTypeEnum.java index aa4fa46..9b354ba 100644 --- a/src/main/java/org/well/well/base/DeviceTypeEnum.java +++ b/src/main/java/org/well/well/base/DeviceTypeEnum.java @@ -27,8 +27,9 @@ LG("燃气智能监测终端(一体化)", 22), Tube("管盯", 23), WellPlus("井盖液位一体机", 24), - HydrogenSulfide("课题硫化氢检测仪", 25); - + HydrogenSulfide("课题硫化氢检测仪", 25), + Pressure("压力监测终端", 31), + GasDetector("点型可燃气体探测器", 32); // 成员变量 private String name; diff --git a/src/main/java/org/well/well/domain/Pressure.java b/src/main/java/org/well/well/domain/Pressure.java new file mode 100644 index 0000000..b625539 --- /dev/null +++ b/src/main/java/org/well/well/domain/Pressure.java @@ -0,0 +1,153 @@ +package org.well.well.domain; + +import org.well.well.util.SnowFlakeUtil; + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.Id; +import javax.persistence.Table; +import java.sql.Timestamp; + +/** + * 压力监测终端 + * + * @author cz + * @date 2023-11-10 + */ +@Entity +@Table(name = "data_pressure") +public class Pressure { + + /** + * + */ + private static final long serialVersionUID = 566089135526318712L; + + private Long dbId; + private String devCode; //设备编号 + private String wellCode; //井编号 + private String dataValue; //浓度 + private String cell; //电池电量 + private String descn; //状态描述 + private Timestamp uptime; //采集时间 + private Timestamp logtime; //记录时间 + private String pci; + private String rsrp; + private String snr; + + @Id +// @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name = "ID") + public Long getDbId() { + return dbId; + } + + public void setDbId(Long dbId) { + this.dbId = dbId; + } + + @Column(name = "DATA_VALUE") + public String getDataValue() { + return dataValue; + } + + public void setDataValue(String dataValue) { + this.dataValue = dataValue; + } + + @Column(name = "DEVCODE") + public String getDevCode() { + return devCode; + } + + public void setDevCode(String devCode) { + this.devCode = devCode; + } + + @Column(name = "WELL_CODE") + public String getWellCode() { + return wellCode; + } + + public void setWellCode(String wellCode) { + this.wellCode = wellCode; + } + + @Column(name = "DESCN") + public String getDescn() { + return descn; + } + + public void setDescn(String descn) { + this.descn = descn; + } + + @Column(name = "CELL") + public String getCell() { + return cell; + } + + public void setCell(String cell) { + this.cell = cell; + } + + @Column(name = "UPTIME") + public Timestamp getUptime() { + return uptime; + } + + public void setUptime(Timestamp uptime) { + this.uptime = uptime; + } + + @Column(name = "LOGTIME") + public Timestamp getLogtime() { + return logtime; + } + + public void setLogtime(Timestamp logtime) { + this.logtime = logtime; + } + + @Column(name = "PCI") + public String getPci() { + return pci; + } + + public void setPci(String pci) { + this.pci = pci; + } + + @Column(name = "RSRP") + public String getRsrp() { + return rsrp; + } + + public void setRsrp(String rsrp) { + this.rsrp = rsrp; + } + + @Column(name = "SNR") + public String getSnr() { + return snr; + } + + public void setSnr(String snr) { + this.snr = snr; + } + + public Pressure() { + } + + public Pressure(String devCode, String wellCode, String dataValue, String cell, Timestamp uptime, Timestamp logtime) { + this.dbId = SnowFlakeUtil.getId(); + this.devCode = devCode; + this.wellCode = wellCode; + this.dataValue = dataValue; + this.cell = cell; + this.uptime = uptime; + this.logtime = logtime; + } + + +} diff --git a/src/main/java/org/well/well/manager/PressureManager.java b/src/main/java/org/well/well/manager/PressureManager.java new file mode 100644 index 0000000..ad7a8ca --- /dev/null +++ b/src/main/java/org/well/well/manager/PressureManager.java @@ -0,0 +1,164 @@ +package org.well.well.manager; + +import net.sf.json.JSONArray; +import net.sf.json.JSONObject; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.well.well.AlarmEnumDTO.PressureAlarmEnum; +import org.well.well.base.DeviceTypeEnum; +import org.well.well.core.hibernate.HibernateEntityDao; +import org.well.well.core.util.DateUtils; +import org.well.well.core.util.StringUtils; +import org.well.well.core.util.ThreadUtil; +import org.well.well.domain.*; +import org.well.well.util.SnowFlakeUtil; + +import javax.annotation.Resource; +import java.io.IOException; +import java.sql.Timestamp; +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * 接入压力设备 + * + * @author cz + * @date 2023-11-10 + */ +@Service +public class PressureManager extends HibernateEntityDao { + + @Resource + private AlarmRecordManager alarmRecordManager; + @Resource + private AlarmRuleManager alarmRuleManager; + @Resource + private DeviceManager deviceManager; + @Resource + private BusWellManager busWellManager; + @Resource + private AlarmJobManager alarmJobManager; + + private final Logger logger = LoggerFactory.getLogger(this.getClass().getName()); + + public Map saveData(String devcode, String wellCode, + String dataValue, String cell, String uptime) { + + Map resultMap = new HashMap(); + try { + String timeFormat = DateUtils.DateFormat(uptime); + Pressure pressure = new Pressure(devcode, wellCode, dataValue, cell, + new Timestamp(StringUtils.isNotBlank(timeFormat) ? DateUtils.sdf4.parse(timeFormat).getTime() : null), + new Timestamp((new Date()).getTime())); + save(pressure); + } catch (Exception e) { + e.printStackTrace(); + logger.error("----uptime时间转换失败-----:" + uptime); + } + return resultMap; + } + + + @Transactional + public void processNormalData(JSONObject jsonObject, String devCode) { + String cell = jsonObject.getString("cell"); + JSONArray jsonArray = jsonObject.getJSONArray("datas"); + BusWell busWell = busWellManager.getWellByDevCode(devCode); + for (int i = 0; i < jsonArray.size(); i++) { + try { + String dataValue = ((JSONObject) jsonArray.get(i)).getString("dataValue"); + String upTime = ((JSONObject) jsonArray.get(i)).getString("uptime"); + dataValue = String.format("%.2f", Double.valueOf(dataValue)); + //1.存数据 + saveData(devCode, busWell == null ? "" : busWell.getWellCode(), dataValue, cell, upTime);//存储采集数据 + //2.有无超限处理流程(判断最后一条数据) + if (i < jsonArray.size() - 1) { + continue; + } + //4.清除设备告警 + alarmRecordManager.clearAlarmByNormalData(devCode, ""); + //单个设备设置的报警规则 + List ruleRankList = alarmRuleManager.getRuleRank(devCode); + float rankThresh = 0; + String isAlarm = "1"; + if (ruleRankList.size() > 0 && ruleRankList.get(0)[0] != null) { + Object rankValue = ((Object[]) ruleRankList.get(ruleRankList.size() - 1))[2]; + rankThresh = rankValue != null ? Float.valueOf(rankValue.toString()) : 0; + isAlarm = ((Object[]) ruleRankList.get(ruleRankList.size() - 1))[4].toString(); + } + + if (rankThresh > 0 && "1".equals(isAlarm) && Float.valueOf(dataValue) >= rankThresh) {//浓度超限 + Device device = deviceManager.getDeviceByDevCode(devCode); + //获取报警等级 + String alarmContent = PressureAlarmEnum.OVER_THRESH.getName(); + Integer alarmLevel = 0; + for (int j = 0; j < ruleRankList.size(); j++) { + Object rankValue = ((Object[]) ruleRankList.get(j))[2]; + if (null != rankValue) { + if (Float.valueOf(dataValue) >= Float.valueOf(rankValue.toString())) { + alarmLevel = Integer.valueOf(((Object[]) ruleRankList.get(j))[0].toString()); + break; + } + } + } + + if (device == null) { + return;//未注册设备舍弃 + } + AlarmJob alarmJob = alarmJobManager.getByDevAndType(devCode, "1"); + Long jobId = alarmJob == null ? SnowFlakeUtil.getId() : alarmJob.getId(); + if (alarmJob == null) { + alarmJobManager.saveData(jobId, devCode, busWell != null ? + busWell.getWellCode() : "", DeviceTypeEnum.Pressure.toString(), "1"); + } + //1.写入新的告警 + alarmRecordManager.saveData(jobId, "1", alarmLevel, + alarmContent, dataValue, device, + devCode, busWell != null ? busWell.getWellCode() : "", upTime, alarmContent); + //2.toDo:向app推送报警消息 + ThreadUtil.excuteMsg(null, alarmContent, busWell == null ? "" : busWell.getWellCode()); + + } else { + alarmJobManager.updateAlarmJobByDevCode(devCode, "数据正常,系统自动结束工单"); + } + //3.清离线 + deviceManager.clearOffline(devCode); + + } catch (IOException e) { + e.printStackTrace(); + logger.error("--------ERROR:设备编号:" + devCode + ",存储数据:" + jsonArray.get(i).toString() + "失败-------"); + } + } + } + + + public void processAlarmData(JSONObject jsonObject, String devCode) { + JSONArray jsonArray = jsonObject.getJSONArray("eventType"); + String logtime = jsonObject.getString("logTime"); + for (int i = 0; i < jsonArray.size(); i++) { + try { + //1.清除同类型的报警信息 + alarmRecordManager.clearAlarm(devCode, "2", + String.valueOf(PressureAlarmEnum.valueOf(jsonArray.get(i).toString()).getIndex())); + //2.写入新的报警 + Device device = deviceManager.getDeviceByDevCode(devCode); + if (null == device) return;//没注册设备舍弃 + BusWell busWell = busWellManager.getWellByDevCode(devCode); + alarmRecordManager.saveData(null, "2", null, + PressureAlarmEnum.valueOf(jsonArray.get(i).toString()).getName(), + String.valueOf(PressureAlarmEnum.valueOf(jsonArray.get(i).toString()).getIndex()), + device, devCode, null != busWell ? busWell.getWellCode() : "", logtime, + PressureAlarmEnum.valueOf(jsonArray.get(i).toString()).getName()); + + } catch (IOException e) { + e.printStackTrace(); + logger.error("--------ERROR:设备编号:" + devCode + ",存储报警数据:" + jsonArray.get(i).toString() + "失败-------"); + } + } + } + +} diff --git a/src/main/java/org/well/well/resp/PressureResponse.java b/src/main/java/org/well/well/resp/PressureResponse.java new file mode 100644 index 0000000..847b91a --- /dev/null +++ b/src/main/java/org/well/well/resp/PressureResponse.java @@ -0,0 +1,57 @@ +package org.well.well.resp; + +import net.sf.json.JSONObject; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.context.support.ClassPathXmlApplicationContext; +import org.well.well.base.AbstractResponse; +import org.well.well.base.DeviceTypeEnum; +import org.well.well.manager.DeviceConfigManager; +import org.well.well.manager.ImeiManager; +import org.well.well.manager.MethaneManager; +import org.well.well.manager.PressureManager; + +/** + * 压力接受处理响应 + */ +public class PressureResponse extends AbstractResponse { + private final Logger logger = LoggerFactory.getLogger(this.getClass().getName()); + private static final String[] mType = {"Data", "Event", "SetResponse", "GetResponse", "StartupRequest"}; + + @Override + public void run() { + ClassPathXmlApplicationContext ac = this.getAc(); + PressureManager pressureManager = ac.getBean(PressureManager.class); + DeviceConfigManager deviceConfigManager = ac.getBean(DeviceConfigManager.class); + ImeiManager imeiManager = ac.getBean(ImeiManager.class); + JSONObject json = JSONObject.fromObject(this.getContent()); + String devCode = json.getString("devCode"); + JSONObject jsonObject = json.getJSONObject("mBody"); + if (mType[0].equals(json.get("mType")) || mType[3].equals(json.get("mType"))) {//存储上报数据 + pressureManager.processNormalData(jsonObject, devCode); + } else if (mType[1].equals(json.get("mType"))) {//存储报警事件 + pressureManager.processAlarmData(jsonObject, devCode); + } else if (mType[2].equals(json.get("mType"))) {//更新下发参数状态 + try { + //下发配置回填数据 + if (DeviceTypeEnum.Pressure.name().equals(json.get("devType"))) { + if ("PressureConfigSuccess".equals(jsonObject.get("bType"))) { + deviceConfigManager.updateStatus(devCode); + } + } + } catch (Exception e) { + e.printStackTrace(); + logger.error("--------ERROR:设备编号:" + devCode + ",更新参数下发状态失败-------"); + } + } else if (mType[4].equals(json.get("mType"))) {//三码存储 + try { + String imei = jsonObject.get("imei").toString(); + String iccid = jsonObject.get("iccid").toString(); + imeiManager.saveData(devCode, imei, iccid); + } catch (Exception e) { + e.printStackTrace(); + logger.error("--------ERROR:设备编号:" + devCode + ",更新参数下发状态失败-------"); + } + } + } +} diff --git a/src/main/java/org/well/well/util/ResponseResolver.java b/src/main/java/org/well/well/util/ResponseResolver.java index 4314736..9541f50 100644 --- a/src/main/java/org/well/well/util/ResponseResolver.java +++ b/src/main/java/org/well/well/util/ResponseResolver.java @@ -31,6 +31,8 @@ abstractResponseHashMap.put(DeviceTypeEnum.Tube.name(), new TubeResponse()); abstractResponseHashMap.put(DeviceTypeEnum.WellPlus.name(), new WellPlusResponse()); abstractResponseHashMap.put(DeviceTypeEnum.HydrogenSulfide.name(), new H2SResponse()); + abstractResponseHashMap.put(DeviceTypeEnum.GasDetector.name(), new H2SResponse()); + abstractResponseHashMap.put(DeviceTypeEnum.Pressure.name(), new PressureResponse()); } diff --git a/src/main/java/org/well/well/AlarmEnumDTO/PressureAlarmEnum.java b/src/main/java/org/well/well/AlarmEnumDTO/PressureAlarmEnum.java new file mode 100644 index 0000000..b228805 --- /dev/null +++ b/src/main/java/org/well/well/AlarmEnumDTO/PressureAlarmEnum.java @@ -0,0 +1,62 @@ +package org.well.well.AlarmEnumDTO; + +/** + * @author cz + * @date 2023-11-10 + */ +public enum PressureAlarmEnum { + + NO_DATA("设备异常", -1), + + NORMAL("正常", 0), + + OVER_THRESH("压力超限", 1), + + PressureCommunicationFailure("压力传感器通讯失败", 2), + + PressureError("压力传感器异常", 3), + + PressureUnknown("压力未知异常", 4), + + OVER_THRESH1("一级压力超限", 5), + + OVER_THRESH2("二级压力超限", 6); + + // 成员变量 + private String name; + private int index; + + // 构造方法 + private PressureAlarmEnum(String name, int index) { + this.name = name; + this.index = index; + } + + public int getIndex() { + return this.index; + } + + public String getName() { + return this.name; + } + + public static PressureAlarmEnum getByIndex(String index) { + try { + for (PressureAlarmEnum temp : values()) { + if (temp.index == Integer.parseInt(index)) { + return temp; + } + } + } catch (Exception e) { + } + return null; + } + + //覆盖方法 + @Override + public String toString() { + return this.name; + } + + +} diff --git a/src/main/java/org/well/well/base/DeviceTypeEnum.java b/src/main/java/org/well/well/base/DeviceTypeEnum.java index aa4fa46..9b354ba 100644 --- a/src/main/java/org/well/well/base/DeviceTypeEnum.java +++ b/src/main/java/org/well/well/base/DeviceTypeEnum.java @@ -27,8 +27,9 @@ LG("燃气智能监测终端(一体化)", 22), Tube("管盯", 23), WellPlus("井盖液位一体机", 24), - HydrogenSulfide("课题硫化氢检测仪", 25); - + HydrogenSulfide("课题硫化氢检测仪", 25), + Pressure("压力监测终端", 31), + GasDetector("点型可燃气体探测器", 32); // 成员变量 private String name; diff --git a/src/main/java/org/well/well/domain/Pressure.java b/src/main/java/org/well/well/domain/Pressure.java new file mode 100644 index 0000000..b625539 --- /dev/null +++ b/src/main/java/org/well/well/domain/Pressure.java @@ -0,0 +1,153 @@ +package org.well.well.domain; + +import org.well.well.util.SnowFlakeUtil; + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.Id; +import javax.persistence.Table; +import java.sql.Timestamp; + +/** + * 压力监测终端 + * + * @author cz + * @date 2023-11-10 + */ +@Entity +@Table(name = "data_pressure") +public class Pressure { + + /** + * + */ + private static final long serialVersionUID = 566089135526318712L; + + private Long dbId; + private String devCode; //设备编号 + private String wellCode; //井编号 + private String dataValue; //浓度 + private String cell; //电池电量 + private String descn; //状态描述 + private Timestamp uptime; //采集时间 + private Timestamp logtime; //记录时间 + private String pci; + private String rsrp; + private String snr; + + @Id +// @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name = "ID") + public Long getDbId() { + return dbId; + } + + public void setDbId(Long dbId) { + this.dbId = dbId; + } + + @Column(name = "DATA_VALUE") + public String getDataValue() { + return dataValue; + } + + public void setDataValue(String dataValue) { + this.dataValue = dataValue; + } + + @Column(name = "DEVCODE") + public String getDevCode() { + return devCode; + } + + public void setDevCode(String devCode) { + this.devCode = devCode; + } + + @Column(name = "WELL_CODE") + public String getWellCode() { + return wellCode; + } + + public void setWellCode(String wellCode) { + this.wellCode = wellCode; + } + + @Column(name = "DESCN") + public String getDescn() { + return descn; + } + + public void setDescn(String descn) { + this.descn = descn; + } + + @Column(name = "CELL") + public String getCell() { + return cell; + } + + public void setCell(String cell) { + this.cell = cell; + } + + @Column(name = "UPTIME") + public Timestamp getUptime() { + return uptime; + } + + public void setUptime(Timestamp uptime) { + this.uptime = uptime; + } + + @Column(name = "LOGTIME") + public Timestamp getLogtime() { + return logtime; + } + + public void setLogtime(Timestamp logtime) { + this.logtime = logtime; + } + + @Column(name = "PCI") + public String getPci() { + return pci; + } + + public void setPci(String pci) { + this.pci = pci; + } + + @Column(name = "RSRP") + public String getRsrp() { + return rsrp; + } + + public void setRsrp(String rsrp) { + this.rsrp = rsrp; + } + + @Column(name = "SNR") + public String getSnr() { + return snr; + } + + public void setSnr(String snr) { + this.snr = snr; + } + + public Pressure() { + } + + public Pressure(String devCode, String wellCode, String dataValue, String cell, Timestamp uptime, Timestamp logtime) { + this.dbId = SnowFlakeUtil.getId(); + this.devCode = devCode; + this.wellCode = wellCode; + this.dataValue = dataValue; + this.cell = cell; + this.uptime = uptime; + this.logtime = logtime; + } + + +} diff --git a/src/main/java/org/well/well/manager/PressureManager.java b/src/main/java/org/well/well/manager/PressureManager.java new file mode 100644 index 0000000..ad7a8ca --- /dev/null +++ b/src/main/java/org/well/well/manager/PressureManager.java @@ -0,0 +1,164 @@ +package org.well.well.manager; + +import net.sf.json.JSONArray; +import net.sf.json.JSONObject; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.well.well.AlarmEnumDTO.PressureAlarmEnum; +import org.well.well.base.DeviceTypeEnum; +import org.well.well.core.hibernate.HibernateEntityDao; +import org.well.well.core.util.DateUtils; +import org.well.well.core.util.StringUtils; +import org.well.well.core.util.ThreadUtil; +import org.well.well.domain.*; +import org.well.well.util.SnowFlakeUtil; + +import javax.annotation.Resource; +import java.io.IOException; +import java.sql.Timestamp; +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * 接入压力设备 + * + * @author cz + * @date 2023-11-10 + */ +@Service +public class PressureManager extends HibernateEntityDao { + + @Resource + private AlarmRecordManager alarmRecordManager; + @Resource + private AlarmRuleManager alarmRuleManager; + @Resource + private DeviceManager deviceManager; + @Resource + private BusWellManager busWellManager; + @Resource + private AlarmJobManager alarmJobManager; + + private final Logger logger = LoggerFactory.getLogger(this.getClass().getName()); + + public Map saveData(String devcode, String wellCode, + String dataValue, String cell, String uptime) { + + Map resultMap = new HashMap(); + try { + String timeFormat = DateUtils.DateFormat(uptime); + Pressure pressure = new Pressure(devcode, wellCode, dataValue, cell, + new Timestamp(StringUtils.isNotBlank(timeFormat) ? DateUtils.sdf4.parse(timeFormat).getTime() : null), + new Timestamp((new Date()).getTime())); + save(pressure); + } catch (Exception e) { + e.printStackTrace(); + logger.error("----uptime时间转换失败-----:" + uptime); + } + return resultMap; + } + + + @Transactional + public void processNormalData(JSONObject jsonObject, String devCode) { + String cell = jsonObject.getString("cell"); + JSONArray jsonArray = jsonObject.getJSONArray("datas"); + BusWell busWell = busWellManager.getWellByDevCode(devCode); + for (int i = 0; i < jsonArray.size(); i++) { + try { + String dataValue = ((JSONObject) jsonArray.get(i)).getString("dataValue"); + String upTime = ((JSONObject) jsonArray.get(i)).getString("uptime"); + dataValue = String.format("%.2f", Double.valueOf(dataValue)); + //1.存数据 + saveData(devCode, busWell == null ? "" : busWell.getWellCode(), dataValue, cell, upTime);//存储采集数据 + //2.有无超限处理流程(判断最后一条数据) + if (i < jsonArray.size() - 1) { + continue; + } + //4.清除设备告警 + alarmRecordManager.clearAlarmByNormalData(devCode, ""); + //单个设备设置的报警规则 + List ruleRankList = alarmRuleManager.getRuleRank(devCode); + float rankThresh = 0; + String isAlarm = "1"; + if (ruleRankList.size() > 0 && ruleRankList.get(0)[0] != null) { + Object rankValue = ((Object[]) ruleRankList.get(ruleRankList.size() - 1))[2]; + rankThresh = rankValue != null ? Float.valueOf(rankValue.toString()) : 0; + isAlarm = ((Object[]) ruleRankList.get(ruleRankList.size() - 1))[4].toString(); + } + + if (rankThresh > 0 && "1".equals(isAlarm) && Float.valueOf(dataValue) >= rankThresh) {//浓度超限 + Device device = deviceManager.getDeviceByDevCode(devCode); + //获取报警等级 + String alarmContent = PressureAlarmEnum.OVER_THRESH.getName(); + Integer alarmLevel = 0; + for (int j = 0; j < ruleRankList.size(); j++) { + Object rankValue = ((Object[]) ruleRankList.get(j))[2]; + if (null != rankValue) { + if (Float.valueOf(dataValue) >= Float.valueOf(rankValue.toString())) { + alarmLevel = Integer.valueOf(((Object[]) ruleRankList.get(j))[0].toString()); + break; + } + } + } + + if (device == null) { + return;//未注册设备舍弃 + } + AlarmJob alarmJob = alarmJobManager.getByDevAndType(devCode, "1"); + Long jobId = alarmJob == null ? SnowFlakeUtil.getId() : alarmJob.getId(); + if (alarmJob == null) { + alarmJobManager.saveData(jobId, devCode, busWell != null ? + busWell.getWellCode() : "", DeviceTypeEnum.Pressure.toString(), "1"); + } + //1.写入新的告警 + alarmRecordManager.saveData(jobId, "1", alarmLevel, + alarmContent, dataValue, device, + devCode, busWell != null ? busWell.getWellCode() : "", upTime, alarmContent); + //2.toDo:向app推送报警消息 + ThreadUtil.excuteMsg(null, alarmContent, busWell == null ? "" : busWell.getWellCode()); + + } else { + alarmJobManager.updateAlarmJobByDevCode(devCode, "数据正常,系统自动结束工单"); + } + //3.清离线 + deviceManager.clearOffline(devCode); + + } catch (IOException e) { + e.printStackTrace(); + logger.error("--------ERROR:设备编号:" + devCode + ",存储数据:" + jsonArray.get(i).toString() + "失败-------"); + } + } + } + + + public void processAlarmData(JSONObject jsonObject, String devCode) { + JSONArray jsonArray = jsonObject.getJSONArray("eventType"); + String logtime = jsonObject.getString("logTime"); + for (int i = 0; i < jsonArray.size(); i++) { + try { + //1.清除同类型的报警信息 + alarmRecordManager.clearAlarm(devCode, "2", + String.valueOf(PressureAlarmEnum.valueOf(jsonArray.get(i).toString()).getIndex())); + //2.写入新的报警 + Device device = deviceManager.getDeviceByDevCode(devCode); + if (null == device) return;//没注册设备舍弃 + BusWell busWell = busWellManager.getWellByDevCode(devCode); + alarmRecordManager.saveData(null, "2", null, + PressureAlarmEnum.valueOf(jsonArray.get(i).toString()).getName(), + String.valueOf(PressureAlarmEnum.valueOf(jsonArray.get(i).toString()).getIndex()), + device, devCode, null != busWell ? busWell.getWellCode() : "", logtime, + PressureAlarmEnum.valueOf(jsonArray.get(i).toString()).getName()); + + } catch (IOException e) { + e.printStackTrace(); + logger.error("--------ERROR:设备编号:" + devCode + ",存储报警数据:" + jsonArray.get(i).toString() + "失败-------"); + } + } + } + +} diff --git a/src/main/java/org/well/well/resp/PressureResponse.java b/src/main/java/org/well/well/resp/PressureResponse.java new file mode 100644 index 0000000..847b91a --- /dev/null +++ b/src/main/java/org/well/well/resp/PressureResponse.java @@ -0,0 +1,57 @@ +package org.well.well.resp; + +import net.sf.json.JSONObject; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.context.support.ClassPathXmlApplicationContext; +import org.well.well.base.AbstractResponse; +import org.well.well.base.DeviceTypeEnum; +import org.well.well.manager.DeviceConfigManager; +import org.well.well.manager.ImeiManager; +import org.well.well.manager.MethaneManager; +import org.well.well.manager.PressureManager; + +/** + * 压力接受处理响应 + */ +public class PressureResponse extends AbstractResponse { + private final Logger logger = LoggerFactory.getLogger(this.getClass().getName()); + private static final String[] mType = {"Data", "Event", "SetResponse", "GetResponse", "StartupRequest"}; + + @Override + public void run() { + ClassPathXmlApplicationContext ac = this.getAc(); + PressureManager pressureManager = ac.getBean(PressureManager.class); + DeviceConfigManager deviceConfigManager = ac.getBean(DeviceConfigManager.class); + ImeiManager imeiManager = ac.getBean(ImeiManager.class); + JSONObject json = JSONObject.fromObject(this.getContent()); + String devCode = json.getString("devCode"); + JSONObject jsonObject = json.getJSONObject("mBody"); + if (mType[0].equals(json.get("mType")) || mType[3].equals(json.get("mType"))) {//存储上报数据 + pressureManager.processNormalData(jsonObject, devCode); + } else if (mType[1].equals(json.get("mType"))) {//存储报警事件 + pressureManager.processAlarmData(jsonObject, devCode); + } else if (mType[2].equals(json.get("mType"))) {//更新下发参数状态 + try { + //下发配置回填数据 + if (DeviceTypeEnum.Pressure.name().equals(json.get("devType"))) { + if ("PressureConfigSuccess".equals(jsonObject.get("bType"))) { + deviceConfigManager.updateStatus(devCode); + } + } + } catch (Exception e) { + e.printStackTrace(); + logger.error("--------ERROR:设备编号:" + devCode + ",更新参数下发状态失败-------"); + } + } else if (mType[4].equals(json.get("mType"))) {//三码存储 + try { + String imei = jsonObject.get("imei").toString(); + String iccid = jsonObject.get("iccid").toString(); + imeiManager.saveData(devCode, imei, iccid); + } catch (Exception e) { + e.printStackTrace(); + logger.error("--------ERROR:设备编号:" + devCode + ",更新参数下发状态失败-------"); + } + } + } +} diff --git a/src/main/java/org/well/well/util/ResponseResolver.java b/src/main/java/org/well/well/util/ResponseResolver.java index 4314736..9541f50 100644 --- a/src/main/java/org/well/well/util/ResponseResolver.java +++ b/src/main/java/org/well/well/util/ResponseResolver.java @@ -31,6 +31,8 @@ abstractResponseHashMap.put(DeviceTypeEnum.Tube.name(), new TubeResponse()); abstractResponseHashMap.put(DeviceTypeEnum.WellPlus.name(), new WellPlusResponse()); abstractResponseHashMap.put(DeviceTypeEnum.HydrogenSulfide.name(), new H2SResponse()); + abstractResponseHashMap.put(DeviceTypeEnum.GasDetector.name(), new H2SResponse()); + abstractResponseHashMap.put(DeviceTypeEnum.Pressure.name(), new PressureResponse()); } diff --git a/src/main/resources/wellSensor/application.properties b/src/main/resources/wellSensor/application.properties index 07b9872..24f5b11 100644 --- a/src/main/resources/wellSensor/application.properties +++ b/src/main/resources/wellSensor/application.properties @@ -171,7 +171,7 @@ #bootstrap.servers = localhost:9092 bootstrap.servers = 111.198.10.15:12502 -kafka.topic = gas +kafka.topic = pressure bootstrap.groupid = 2 # ============================================================================ diff --git a/src/main/java/org/well/well/AlarmEnumDTO/PressureAlarmEnum.java b/src/main/java/org/well/well/AlarmEnumDTO/PressureAlarmEnum.java new file mode 100644 index 0000000..b228805 --- /dev/null +++ b/src/main/java/org/well/well/AlarmEnumDTO/PressureAlarmEnum.java @@ -0,0 +1,62 @@ +package org.well.well.AlarmEnumDTO; + +/** + * @author cz + * @date 2023-11-10 + */ +public enum PressureAlarmEnum { + + NO_DATA("设备异常", -1), + + NORMAL("正常", 0), + + OVER_THRESH("压力超限", 1), + + PressureCommunicationFailure("压力传感器通讯失败", 2), + + PressureError("压力传感器异常", 3), + + PressureUnknown("压力未知异常", 4), + + OVER_THRESH1("一级压力超限", 5), + + OVER_THRESH2("二级压力超限", 6); + + // 成员变量 + private String name; + private int index; + + // 构造方法 + private PressureAlarmEnum(String name, int index) { + this.name = name; + this.index = index; + } + + public int getIndex() { + return this.index; + } + + public String getName() { + return this.name; + } + + public static PressureAlarmEnum getByIndex(String index) { + try { + for (PressureAlarmEnum temp : values()) { + if (temp.index == Integer.parseInt(index)) { + return temp; + } + } + } catch (Exception e) { + } + return null; + } + + //覆盖方法 + @Override + public String toString() { + return this.name; + } + + +} diff --git a/src/main/java/org/well/well/base/DeviceTypeEnum.java b/src/main/java/org/well/well/base/DeviceTypeEnum.java index aa4fa46..9b354ba 100644 --- a/src/main/java/org/well/well/base/DeviceTypeEnum.java +++ b/src/main/java/org/well/well/base/DeviceTypeEnum.java @@ -27,8 +27,9 @@ LG("燃气智能监测终端(一体化)", 22), Tube("管盯", 23), WellPlus("井盖液位一体机", 24), - HydrogenSulfide("课题硫化氢检测仪", 25); - + HydrogenSulfide("课题硫化氢检测仪", 25), + Pressure("压力监测终端", 31), + GasDetector("点型可燃气体探测器", 32); // 成员变量 private String name; diff --git a/src/main/java/org/well/well/domain/Pressure.java b/src/main/java/org/well/well/domain/Pressure.java new file mode 100644 index 0000000..b625539 --- /dev/null +++ b/src/main/java/org/well/well/domain/Pressure.java @@ -0,0 +1,153 @@ +package org.well.well.domain; + +import org.well.well.util.SnowFlakeUtil; + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.Id; +import javax.persistence.Table; +import java.sql.Timestamp; + +/** + * 压力监测终端 + * + * @author cz + * @date 2023-11-10 + */ +@Entity +@Table(name = "data_pressure") +public class Pressure { + + /** + * + */ + private static final long serialVersionUID = 566089135526318712L; + + private Long dbId; + private String devCode; //设备编号 + private String wellCode; //井编号 + private String dataValue; //浓度 + private String cell; //电池电量 + private String descn; //状态描述 + private Timestamp uptime; //采集时间 + private Timestamp logtime; //记录时间 + private String pci; + private String rsrp; + private String snr; + + @Id +// @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name = "ID") + public Long getDbId() { + return dbId; + } + + public void setDbId(Long dbId) { + this.dbId = dbId; + } + + @Column(name = "DATA_VALUE") + public String getDataValue() { + return dataValue; + } + + public void setDataValue(String dataValue) { + this.dataValue = dataValue; + } + + @Column(name = "DEVCODE") + public String getDevCode() { + return devCode; + } + + public void setDevCode(String devCode) { + this.devCode = devCode; + } + + @Column(name = "WELL_CODE") + public String getWellCode() { + return wellCode; + } + + public void setWellCode(String wellCode) { + this.wellCode = wellCode; + } + + @Column(name = "DESCN") + public String getDescn() { + return descn; + } + + public void setDescn(String descn) { + this.descn = descn; + } + + @Column(name = "CELL") + public String getCell() { + return cell; + } + + public void setCell(String cell) { + this.cell = cell; + } + + @Column(name = "UPTIME") + public Timestamp getUptime() { + return uptime; + } + + public void setUptime(Timestamp uptime) { + this.uptime = uptime; + } + + @Column(name = "LOGTIME") + public Timestamp getLogtime() { + return logtime; + } + + public void setLogtime(Timestamp logtime) { + this.logtime = logtime; + } + + @Column(name = "PCI") + public String getPci() { + return pci; + } + + public void setPci(String pci) { + this.pci = pci; + } + + @Column(name = "RSRP") + public String getRsrp() { + return rsrp; + } + + public void setRsrp(String rsrp) { + this.rsrp = rsrp; + } + + @Column(name = "SNR") + public String getSnr() { + return snr; + } + + public void setSnr(String snr) { + this.snr = snr; + } + + public Pressure() { + } + + public Pressure(String devCode, String wellCode, String dataValue, String cell, Timestamp uptime, Timestamp logtime) { + this.dbId = SnowFlakeUtil.getId(); + this.devCode = devCode; + this.wellCode = wellCode; + this.dataValue = dataValue; + this.cell = cell; + this.uptime = uptime; + this.logtime = logtime; + } + + +} diff --git a/src/main/java/org/well/well/manager/PressureManager.java b/src/main/java/org/well/well/manager/PressureManager.java new file mode 100644 index 0000000..ad7a8ca --- /dev/null +++ b/src/main/java/org/well/well/manager/PressureManager.java @@ -0,0 +1,164 @@ +package org.well.well.manager; + +import net.sf.json.JSONArray; +import net.sf.json.JSONObject; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.well.well.AlarmEnumDTO.PressureAlarmEnum; +import org.well.well.base.DeviceTypeEnum; +import org.well.well.core.hibernate.HibernateEntityDao; +import org.well.well.core.util.DateUtils; +import org.well.well.core.util.StringUtils; +import org.well.well.core.util.ThreadUtil; +import org.well.well.domain.*; +import org.well.well.util.SnowFlakeUtil; + +import javax.annotation.Resource; +import java.io.IOException; +import java.sql.Timestamp; +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * 接入压力设备 + * + * @author cz + * @date 2023-11-10 + */ +@Service +public class PressureManager extends HibernateEntityDao { + + @Resource + private AlarmRecordManager alarmRecordManager; + @Resource + private AlarmRuleManager alarmRuleManager; + @Resource + private DeviceManager deviceManager; + @Resource + private BusWellManager busWellManager; + @Resource + private AlarmJobManager alarmJobManager; + + private final Logger logger = LoggerFactory.getLogger(this.getClass().getName()); + + public Map saveData(String devcode, String wellCode, + String dataValue, String cell, String uptime) { + + Map resultMap = new HashMap(); + try { + String timeFormat = DateUtils.DateFormat(uptime); + Pressure pressure = new Pressure(devcode, wellCode, dataValue, cell, + new Timestamp(StringUtils.isNotBlank(timeFormat) ? DateUtils.sdf4.parse(timeFormat).getTime() : null), + new Timestamp((new Date()).getTime())); + save(pressure); + } catch (Exception e) { + e.printStackTrace(); + logger.error("----uptime时间转换失败-----:" + uptime); + } + return resultMap; + } + + + @Transactional + public void processNormalData(JSONObject jsonObject, String devCode) { + String cell = jsonObject.getString("cell"); + JSONArray jsonArray = jsonObject.getJSONArray("datas"); + BusWell busWell = busWellManager.getWellByDevCode(devCode); + for (int i = 0; i < jsonArray.size(); i++) { + try { + String dataValue = ((JSONObject) jsonArray.get(i)).getString("dataValue"); + String upTime = ((JSONObject) jsonArray.get(i)).getString("uptime"); + dataValue = String.format("%.2f", Double.valueOf(dataValue)); + //1.存数据 + saveData(devCode, busWell == null ? "" : busWell.getWellCode(), dataValue, cell, upTime);//存储采集数据 + //2.有无超限处理流程(判断最后一条数据) + if (i < jsonArray.size() - 1) { + continue; + } + //4.清除设备告警 + alarmRecordManager.clearAlarmByNormalData(devCode, ""); + //单个设备设置的报警规则 + List ruleRankList = alarmRuleManager.getRuleRank(devCode); + float rankThresh = 0; + String isAlarm = "1"; + if (ruleRankList.size() > 0 && ruleRankList.get(0)[0] != null) { + Object rankValue = ((Object[]) ruleRankList.get(ruleRankList.size() - 1))[2]; + rankThresh = rankValue != null ? Float.valueOf(rankValue.toString()) : 0; + isAlarm = ((Object[]) ruleRankList.get(ruleRankList.size() - 1))[4].toString(); + } + + if (rankThresh > 0 && "1".equals(isAlarm) && Float.valueOf(dataValue) >= rankThresh) {//浓度超限 + Device device = deviceManager.getDeviceByDevCode(devCode); + //获取报警等级 + String alarmContent = PressureAlarmEnum.OVER_THRESH.getName(); + Integer alarmLevel = 0; + for (int j = 0; j < ruleRankList.size(); j++) { + Object rankValue = ((Object[]) ruleRankList.get(j))[2]; + if (null != rankValue) { + if (Float.valueOf(dataValue) >= Float.valueOf(rankValue.toString())) { + alarmLevel = Integer.valueOf(((Object[]) ruleRankList.get(j))[0].toString()); + break; + } + } + } + + if (device == null) { + return;//未注册设备舍弃 + } + AlarmJob alarmJob = alarmJobManager.getByDevAndType(devCode, "1"); + Long jobId = alarmJob == null ? SnowFlakeUtil.getId() : alarmJob.getId(); + if (alarmJob == null) { + alarmJobManager.saveData(jobId, devCode, busWell != null ? + busWell.getWellCode() : "", DeviceTypeEnum.Pressure.toString(), "1"); + } + //1.写入新的告警 + alarmRecordManager.saveData(jobId, "1", alarmLevel, + alarmContent, dataValue, device, + devCode, busWell != null ? busWell.getWellCode() : "", upTime, alarmContent); + //2.toDo:向app推送报警消息 + ThreadUtil.excuteMsg(null, alarmContent, busWell == null ? "" : busWell.getWellCode()); + + } else { + alarmJobManager.updateAlarmJobByDevCode(devCode, "数据正常,系统自动结束工单"); + } + //3.清离线 + deviceManager.clearOffline(devCode); + + } catch (IOException e) { + e.printStackTrace(); + logger.error("--------ERROR:设备编号:" + devCode + ",存储数据:" + jsonArray.get(i).toString() + "失败-------"); + } + } + } + + + public void processAlarmData(JSONObject jsonObject, String devCode) { + JSONArray jsonArray = jsonObject.getJSONArray("eventType"); + String logtime = jsonObject.getString("logTime"); + for (int i = 0; i < jsonArray.size(); i++) { + try { + //1.清除同类型的报警信息 + alarmRecordManager.clearAlarm(devCode, "2", + String.valueOf(PressureAlarmEnum.valueOf(jsonArray.get(i).toString()).getIndex())); + //2.写入新的报警 + Device device = deviceManager.getDeviceByDevCode(devCode); + if (null == device) return;//没注册设备舍弃 + BusWell busWell = busWellManager.getWellByDevCode(devCode); + alarmRecordManager.saveData(null, "2", null, + PressureAlarmEnum.valueOf(jsonArray.get(i).toString()).getName(), + String.valueOf(PressureAlarmEnum.valueOf(jsonArray.get(i).toString()).getIndex()), + device, devCode, null != busWell ? busWell.getWellCode() : "", logtime, + PressureAlarmEnum.valueOf(jsonArray.get(i).toString()).getName()); + + } catch (IOException e) { + e.printStackTrace(); + logger.error("--------ERROR:设备编号:" + devCode + ",存储报警数据:" + jsonArray.get(i).toString() + "失败-------"); + } + } + } + +} diff --git a/src/main/java/org/well/well/resp/PressureResponse.java b/src/main/java/org/well/well/resp/PressureResponse.java new file mode 100644 index 0000000..847b91a --- /dev/null +++ b/src/main/java/org/well/well/resp/PressureResponse.java @@ -0,0 +1,57 @@ +package org.well.well.resp; + +import net.sf.json.JSONObject; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.context.support.ClassPathXmlApplicationContext; +import org.well.well.base.AbstractResponse; +import org.well.well.base.DeviceTypeEnum; +import org.well.well.manager.DeviceConfigManager; +import org.well.well.manager.ImeiManager; +import org.well.well.manager.MethaneManager; +import org.well.well.manager.PressureManager; + +/** + * 压力接受处理响应 + */ +public class PressureResponse extends AbstractResponse { + private final Logger logger = LoggerFactory.getLogger(this.getClass().getName()); + private static final String[] mType = {"Data", "Event", "SetResponse", "GetResponse", "StartupRequest"}; + + @Override + public void run() { + ClassPathXmlApplicationContext ac = this.getAc(); + PressureManager pressureManager = ac.getBean(PressureManager.class); + DeviceConfigManager deviceConfigManager = ac.getBean(DeviceConfigManager.class); + ImeiManager imeiManager = ac.getBean(ImeiManager.class); + JSONObject json = JSONObject.fromObject(this.getContent()); + String devCode = json.getString("devCode"); + JSONObject jsonObject = json.getJSONObject("mBody"); + if (mType[0].equals(json.get("mType")) || mType[3].equals(json.get("mType"))) {//存储上报数据 + pressureManager.processNormalData(jsonObject, devCode); + } else if (mType[1].equals(json.get("mType"))) {//存储报警事件 + pressureManager.processAlarmData(jsonObject, devCode); + } else if (mType[2].equals(json.get("mType"))) {//更新下发参数状态 + try { + //下发配置回填数据 + if (DeviceTypeEnum.Pressure.name().equals(json.get("devType"))) { + if ("PressureConfigSuccess".equals(jsonObject.get("bType"))) { + deviceConfigManager.updateStatus(devCode); + } + } + } catch (Exception e) { + e.printStackTrace(); + logger.error("--------ERROR:设备编号:" + devCode + ",更新参数下发状态失败-------"); + } + } else if (mType[4].equals(json.get("mType"))) {//三码存储 + try { + String imei = jsonObject.get("imei").toString(); + String iccid = jsonObject.get("iccid").toString(); + imeiManager.saveData(devCode, imei, iccid); + } catch (Exception e) { + e.printStackTrace(); + logger.error("--------ERROR:设备编号:" + devCode + ",更新参数下发状态失败-------"); + } + } + } +} diff --git a/src/main/java/org/well/well/util/ResponseResolver.java b/src/main/java/org/well/well/util/ResponseResolver.java index 4314736..9541f50 100644 --- a/src/main/java/org/well/well/util/ResponseResolver.java +++ b/src/main/java/org/well/well/util/ResponseResolver.java @@ -31,6 +31,8 @@ abstractResponseHashMap.put(DeviceTypeEnum.Tube.name(), new TubeResponse()); abstractResponseHashMap.put(DeviceTypeEnum.WellPlus.name(), new WellPlusResponse()); abstractResponseHashMap.put(DeviceTypeEnum.HydrogenSulfide.name(), new H2SResponse()); + abstractResponseHashMap.put(DeviceTypeEnum.GasDetector.name(), new H2SResponse()); + abstractResponseHashMap.put(DeviceTypeEnum.Pressure.name(), new PressureResponse()); } diff --git a/src/main/resources/wellSensor/application.properties b/src/main/resources/wellSensor/application.properties index 07b9872..24f5b11 100644 --- a/src/main/resources/wellSensor/application.properties +++ b/src/main/resources/wellSensor/application.properties @@ -171,7 +171,7 @@ #bootstrap.servers = localhost:9092 bootstrap.servers = 111.198.10.15:12502 -kafka.topic = gas +kafka.topic = pressure bootstrap.groupid = 2 # ============================================================================ diff --git a/target/classes/wellSensor/application.properties b/target/classes/wellSensor/application.properties index 07b9872..24f5b11 100644 --- a/target/classes/wellSensor/application.properties +++ b/target/classes/wellSensor/application.properties @@ -171,7 +171,7 @@ #bootstrap.servers = localhost:9092 bootstrap.servers = 111.198.10.15:12502 -kafka.topic = gas +kafka.topic = pressure bootstrap.groupid = 2 # ============================================================================