diff --git a/casic-alarm/src/main/java/com/casic/missiles/modular/alarm/service/IAlarmRecordsService.java b/casic-alarm/src/main/java/com/casic/missiles/modular/alarm/service/IAlarmRecordsService.java index 1d00c2e..a0bd20d 100644 --- a/casic-alarm/src/main/java/com/casic/missiles/modular/alarm/service/IAlarmRecordsService.java +++ b/casic-alarm/src/main/java/com/casic/missiles/modular/alarm/service/IAlarmRecordsService.java @@ -23,4 +23,6 @@ List alarmListNoPage(DataScope dataScope, String keywords, String alarmType, String alarmContent,String beginTime, String endTime); boolean cancelAlarm(int id,String jobStatus, String handleMessage, long personId); + + Integer insertAlarmRecord(AlarmRecords alarmRec); } diff --git a/casic-alarm/src/main/java/com/casic/missiles/modular/alarm/service/IAlarmRecordsService.java b/casic-alarm/src/main/java/com/casic/missiles/modular/alarm/service/IAlarmRecordsService.java index 1d00c2e..a0bd20d 100644 --- a/casic-alarm/src/main/java/com/casic/missiles/modular/alarm/service/IAlarmRecordsService.java +++ b/casic-alarm/src/main/java/com/casic/missiles/modular/alarm/service/IAlarmRecordsService.java @@ -23,4 +23,6 @@ List alarmListNoPage(DataScope dataScope, String keywords, String alarmType, String alarmContent,String beginTime, String endTime); boolean cancelAlarm(int id,String jobStatus, String handleMessage, long personId); + + Integer insertAlarmRecord(AlarmRecords alarmRec); } diff --git a/casic-alarm/src/main/java/com/casic/missiles/modular/alarm/service/IAlarmRuleService.java b/casic-alarm/src/main/java/com/casic/missiles/modular/alarm/service/IAlarmRuleService.java index a4b78e0..394f24f 100644 --- a/casic-alarm/src/main/java/com/casic/missiles/modular/alarm/service/IAlarmRuleService.java +++ b/casic-alarm/src/main/java/com/casic/missiles/modular/alarm/service/IAlarmRuleService.java @@ -23,4 +23,6 @@ boolean updateRule( int id, float highValue, float lowValue); List getNoAlarmDevice(DataScope dataScope); + AlarmRule selectAlarmRuleByDev(String devcode, String grade); + } diff --git a/casic-alarm/src/main/java/com/casic/missiles/modular/alarm/service/IAlarmRecordsService.java b/casic-alarm/src/main/java/com/casic/missiles/modular/alarm/service/IAlarmRecordsService.java index 1d00c2e..a0bd20d 100644 --- a/casic-alarm/src/main/java/com/casic/missiles/modular/alarm/service/IAlarmRecordsService.java +++ b/casic-alarm/src/main/java/com/casic/missiles/modular/alarm/service/IAlarmRecordsService.java @@ -23,4 +23,6 @@ List alarmListNoPage(DataScope dataScope, String keywords, String alarmType, String alarmContent,String beginTime, String endTime); boolean cancelAlarm(int id,String jobStatus, String handleMessage, long personId); + + Integer insertAlarmRecord(AlarmRecords alarmRec); } diff --git a/casic-alarm/src/main/java/com/casic/missiles/modular/alarm/service/IAlarmRuleService.java b/casic-alarm/src/main/java/com/casic/missiles/modular/alarm/service/IAlarmRuleService.java index a4b78e0..394f24f 100644 --- a/casic-alarm/src/main/java/com/casic/missiles/modular/alarm/service/IAlarmRuleService.java +++ b/casic-alarm/src/main/java/com/casic/missiles/modular/alarm/service/IAlarmRuleService.java @@ -23,4 +23,6 @@ boolean updateRule( int id, float highValue, float lowValue); List getNoAlarmDevice(DataScope dataScope); + AlarmRule selectAlarmRuleByDev(String devcode, String grade); + } diff --git a/casic-alarm/src/main/java/com/casic/missiles/modular/alarm/service/impl/AlarmRecordsServiceImpl.java b/casic-alarm/src/main/java/com/casic/missiles/modular/alarm/service/impl/AlarmRecordsServiceImpl.java index 8ff1739..7b510c6 100644 --- a/casic-alarm/src/main/java/com/casic/missiles/modular/alarm/service/impl/AlarmRecordsServiceImpl.java +++ b/casic-alarm/src/main/java/com/casic/missiles/modular/alarm/service/impl/AlarmRecordsServiceImpl.java @@ -52,4 +52,9 @@ return this.baseMapper.cancelAlarm(id,jobStatus,handleMessage,personId); } + @Override + public Integer insertAlarmRecord(AlarmRecords alarmRec) { + this.baseMapper.cancelAlarmByNewRecord(alarmRec.getDevcode(), alarmRec.getAlarmType()); + return this.baseMapper.insert(alarmRec); + } } diff --git a/casic-alarm/src/main/java/com/casic/missiles/modular/alarm/service/IAlarmRecordsService.java b/casic-alarm/src/main/java/com/casic/missiles/modular/alarm/service/IAlarmRecordsService.java index 1d00c2e..a0bd20d 100644 --- a/casic-alarm/src/main/java/com/casic/missiles/modular/alarm/service/IAlarmRecordsService.java +++ b/casic-alarm/src/main/java/com/casic/missiles/modular/alarm/service/IAlarmRecordsService.java @@ -23,4 +23,6 @@ List alarmListNoPage(DataScope dataScope, String keywords, String alarmType, String alarmContent,String beginTime, String endTime); boolean cancelAlarm(int id,String jobStatus, String handleMessage, long personId); + + Integer insertAlarmRecord(AlarmRecords alarmRec); } diff --git a/casic-alarm/src/main/java/com/casic/missiles/modular/alarm/service/IAlarmRuleService.java b/casic-alarm/src/main/java/com/casic/missiles/modular/alarm/service/IAlarmRuleService.java index a4b78e0..394f24f 100644 --- a/casic-alarm/src/main/java/com/casic/missiles/modular/alarm/service/IAlarmRuleService.java +++ b/casic-alarm/src/main/java/com/casic/missiles/modular/alarm/service/IAlarmRuleService.java @@ -23,4 +23,6 @@ boolean updateRule( int id, float highValue, float lowValue); List getNoAlarmDevice(DataScope dataScope); + AlarmRule selectAlarmRuleByDev(String devcode, String grade); + } diff --git a/casic-alarm/src/main/java/com/casic/missiles/modular/alarm/service/impl/AlarmRecordsServiceImpl.java b/casic-alarm/src/main/java/com/casic/missiles/modular/alarm/service/impl/AlarmRecordsServiceImpl.java index 8ff1739..7b510c6 100644 --- a/casic-alarm/src/main/java/com/casic/missiles/modular/alarm/service/impl/AlarmRecordsServiceImpl.java +++ b/casic-alarm/src/main/java/com/casic/missiles/modular/alarm/service/impl/AlarmRecordsServiceImpl.java @@ -52,4 +52,9 @@ return this.baseMapper.cancelAlarm(id,jobStatus,handleMessage,personId); } + @Override + public Integer insertAlarmRecord(AlarmRecords alarmRec) { + this.baseMapper.cancelAlarmByNewRecord(alarmRec.getDevcode(), alarmRec.getAlarmType()); + return this.baseMapper.insert(alarmRec); + } } diff --git a/casic-alarm/src/main/java/com/casic/missiles/modular/alarm/service/impl/AlarmRuleServiceImpl.java b/casic-alarm/src/main/java/com/casic/missiles/modular/alarm/service/impl/AlarmRuleServiceImpl.java index 234a66c..515a3d0 100644 --- a/casic-alarm/src/main/java/com/casic/missiles/modular/alarm/service/impl/AlarmRuleServiceImpl.java +++ b/casic-alarm/src/main/java/com/casic/missiles/modular/alarm/service/impl/AlarmRuleServiceImpl.java @@ -40,4 +40,9 @@ public List getNoAlarmDevice(DataScope dataScope) { return this.baseMapper.getNoAlarmDevice(dataScope); } + + @Override + public AlarmRule selectAlarmRuleByDev(String devcode, String grade) { + return this.baseMapper.selectAlarmRuleByDev(devcode, grade); + } } diff --git a/casic-alarm/src/main/java/com/casic/missiles/modular/alarm/service/IAlarmRecordsService.java b/casic-alarm/src/main/java/com/casic/missiles/modular/alarm/service/IAlarmRecordsService.java index 1d00c2e..a0bd20d 100644 --- a/casic-alarm/src/main/java/com/casic/missiles/modular/alarm/service/IAlarmRecordsService.java +++ b/casic-alarm/src/main/java/com/casic/missiles/modular/alarm/service/IAlarmRecordsService.java @@ -23,4 +23,6 @@ List alarmListNoPage(DataScope dataScope, String keywords, String alarmType, String alarmContent,String beginTime, String endTime); boolean cancelAlarm(int id,String jobStatus, String handleMessage, long personId); + + Integer insertAlarmRecord(AlarmRecords alarmRec); } diff --git a/casic-alarm/src/main/java/com/casic/missiles/modular/alarm/service/IAlarmRuleService.java b/casic-alarm/src/main/java/com/casic/missiles/modular/alarm/service/IAlarmRuleService.java index a4b78e0..394f24f 100644 --- a/casic-alarm/src/main/java/com/casic/missiles/modular/alarm/service/IAlarmRuleService.java +++ b/casic-alarm/src/main/java/com/casic/missiles/modular/alarm/service/IAlarmRuleService.java @@ -23,4 +23,6 @@ boolean updateRule( int id, float highValue, float lowValue); List getNoAlarmDevice(DataScope dataScope); + AlarmRule selectAlarmRuleByDev(String devcode, String grade); + } diff --git a/casic-alarm/src/main/java/com/casic/missiles/modular/alarm/service/impl/AlarmRecordsServiceImpl.java b/casic-alarm/src/main/java/com/casic/missiles/modular/alarm/service/impl/AlarmRecordsServiceImpl.java index 8ff1739..7b510c6 100644 --- a/casic-alarm/src/main/java/com/casic/missiles/modular/alarm/service/impl/AlarmRecordsServiceImpl.java +++ b/casic-alarm/src/main/java/com/casic/missiles/modular/alarm/service/impl/AlarmRecordsServiceImpl.java @@ -52,4 +52,9 @@ return this.baseMapper.cancelAlarm(id,jobStatus,handleMessage,personId); } + @Override + public Integer insertAlarmRecord(AlarmRecords alarmRec) { + this.baseMapper.cancelAlarmByNewRecord(alarmRec.getDevcode(), alarmRec.getAlarmType()); + return this.baseMapper.insert(alarmRec); + } } diff --git a/casic-alarm/src/main/java/com/casic/missiles/modular/alarm/service/impl/AlarmRuleServiceImpl.java b/casic-alarm/src/main/java/com/casic/missiles/modular/alarm/service/impl/AlarmRuleServiceImpl.java index 234a66c..515a3d0 100644 --- a/casic-alarm/src/main/java/com/casic/missiles/modular/alarm/service/impl/AlarmRuleServiceImpl.java +++ b/casic-alarm/src/main/java/com/casic/missiles/modular/alarm/service/impl/AlarmRuleServiceImpl.java @@ -40,4 +40,9 @@ public List getNoAlarmDevice(DataScope dataScope) { return this.baseMapper.getNoAlarmDevice(dataScope); } + + @Override + public AlarmRule selectAlarmRuleByDev(String devcode, String grade) { + return this.baseMapper.selectAlarmRuleByDev(devcode, grade); + } } diff --git a/casic-alarm/src/main/java/com/casic/missiles/modular/system/controller/WaterMeterDataReceiver.java b/casic-alarm/src/main/java/com/casic/missiles/modular/system/controller/WaterMeterDataReceiver.java new file mode 100644 index 0000000..8ce1070 --- /dev/null +++ b/casic-alarm/src/main/java/com/casic/missiles/modular/system/controller/WaterMeterDataReceiver.java @@ -0,0 +1,150 @@ +package com.casic.missiles.modular.system.controller; + +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.modular.alarm.service.IAlarmRecordsService; +import com.casic.missiles.modular.alarm.service.IAlarmRuleService; +import com.casic.missiles.modular.system.dto.DeviceWellDto; +import com.casic.missiles.modular.system.model.AlarmRecords; +import com.casic.missiles.modular.system.model.AlarmRule; +import com.casic.missiles.modular.system.model.DataWaterMeter; +import com.casic.missiles.modular.system.model.Device; +import com.casic.missiles.modular.system.service.IDeviceService; +import com.casic.missiles.modular.system.service.IWaterMeterDataService; +import lombok.extern.java.Log; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import javax.annotation.Resource; +import java.text.DecimalFormat; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.Map; + +@Log +@Controller +@RequestMapping("/meter") +public class WaterMeterDataReceiver extends BaseController { + + @Resource + private IWaterMeterDataService waterMeterDataService; + + @Resource + private IDeviceService deviceService; + + @Resource + private IAlarmRuleService alarmRuleService; + @Resource + private IAlarmRecordsService alarmRecordsService; + + private DecimalFormat df2 = new DecimalFormat("0.00"); + + @RequestMapping(value = "/data/recv") + @ResponseBody + public Object dataRecv(@RequestBody(required = true) Map meterData) throws ParseException { + // 判断必填字段 + if (meterData.containsKey("MeterAddr") == false) { + return ResponseData.error("设备地址字段缺失"); + } + if (meterData.containsKey("MeterNumber") == false) { + return ResponseData.error("水表读数字段缺失"); + } + if (meterData.containsKey("ReadDate") == false) { + return ResponseData.error("上报时间字段缺失"); + } + + // 创建原始记录对象 + DataWaterMeter dataWaterMeter = new DataWaterMeter(); + + // 赋值设备地址 + String meterAddr = meterData.get("MeterAddr").toString(); + dataWaterMeter.setDevcode(meterAddr); + + // 赋值井编号 + DeviceWellDto wellDto = deviceService.selectWellByDevcode(meterAddr); + if (null == wellDto) { + log.info("没有找到" + meterAddr + "对应的井编号"); + return ResponseData.success(); + } + dataWaterMeter.setWellCode(wellDto.getWellCode()); + + // 能找到关联的井 则必然能找到设备 不判空 + Device device = deviceService.getDeviceByDevCode(meterAddr); + + // 赋值水表读数 + Double meterNumber = 0.0; + String numType = meterData.get("MeterNumber").getClass().getSimpleName(); + if (numType.equals("String")) { + meterNumber = Double.parseDouble(meterData.get("MeterNumber").toString()); + } else if (numType.equals("BigDecimal")) { + meterNumber = ((Number) meterData.get("MeterNumber")).doubleValue(); + } + dataWaterMeter.setFlowAcc(String.valueOf(meterNumber)); + + // 赋值数据采集时间 + String readDate = meterData.get("ReadDate").toString(); + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + dataWaterMeter.setUptime(sdf.parse(readDate)); + + // 赋值阀门状态 + if (meterData.containsKey("ValveStatus") == true) { + dataWaterMeter.setStatus(meterData.get("ValveStatus").toString()); + } + + dataWaterMeter.setLogtime(Calendar.getInstance().getTime()); + + // 保存到数据库 同时计算日/月用水量 + double flowAccToday = waterMeterDataService.saveWaterMeterData(dataWaterMeter); + + // 判断是否报警/预警 + AlarmRule alarmRule = alarmRuleService.selectAlarmRuleByDev(meterAddr, "1"); // 报警 + AlarmRule alarmRuleWarn = alarmRuleService.selectAlarmRuleByDev(meterAddr, "2"); // 预警 + if (null != alarmRule && null != alarmRule.getHighvalue()) { + if (flowAccToday - alarmRule.getHighvalue() > 0) { + // 超出报警阈值 生成一条报警消息 + AlarmRecords alarmRecord = new AlarmRecords(); + + alarmRecord.setDeviceId(device.getId()); + alarmRecord.setDevcode(meterAddr); + alarmRecord.setWellCode(wellDto.getWellCode()); + alarmRecord.setAlarmType("1"); // 业务报警 + alarmRecord.setAlarmContent("日用水量超阈值报警"); + alarmRecord.setAlarmValue(df2.format(flowAccToday)); + alarmRecord.setAlarmTime(Calendar.getInstance().getTime()); + alarmRecord.setStatus("1"); + alarmRecord.setAlarmMessage("日用水量超阈值报警"); + + alarmRecordsService.insertAlarmRecord(alarmRecord); + + // 向前端推送报警 + } else { + // 如果没有报警则判断是否预警 + if (null != alarmRuleWarn && null != alarmRuleWarn.getHighvalue()) { + if (flowAccToday - alarmRuleWarn.getHighvalue() > 0) { + // 超出预警阈值 生成一条预警消息 + AlarmRecords alarmRecord = new AlarmRecords(); + + alarmRecord.setDeviceId(device.getId()); + alarmRecord.setDevcode(meterAddr); + alarmRecord.setWellCode(wellDto.getWellCode()); + alarmRecord.setAlarmType("3"); // 业务报警 + alarmRecord.setAlarmContent("日用水量超阈值预警"); + alarmRecord.setAlarmValue(df2.format(flowAccToday)); + alarmRecord.setAlarmTime(Calendar.getInstance().getTime()); + alarmRecord.setStatus("1"); + alarmRecord.setAlarmMessage("日用水量超阈值预警"); + + alarmRecordsService.insertAlarmRecord(alarmRecord); + + // 向前端推送报警 + } + } + } + } + + return ResponseData.success(); + } +} diff --git a/casic-alarm/src/main/java/com/casic/missiles/modular/alarm/service/IAlarmRecordsService.java b/casic-alarm/src/main/java/com/casic/missiles/modular/alarm/service/IAlarmRecordsService.java index 1d00c2e..a0bd20d 100644 --- a/casic-alarm/src/main/java/com/casic/missiles/modular/alarm/service/IAlarmRecordsService.java +++ b/casic-alarm/src/main/java/com/casic/missiles/modular/alarm/service/IAlarmRecordsService.java @@ -23,4 +23,6 @@ List alarmListNoPage(DataScope dataScope, String keywords, String alarmType, String alarmContent,String beginTime, String endTime); boolean cancelAlarm(int id,String jobStatus, String handleMessage, long personId); + + Integer insertAlarmRecord(AlarmRecords alarmRec); } diff --git a/casic-alarm/src/main/java/com/casic/missiles/modular/alarm/service/IAlarmRuleService.java b/casic-alarm/src/main/java/com/casic/missiles/modular/alarm/service/IAlarmRuleService.java index a4b78e0..394f24f 100644 --- a/casic-alarm/src/main/java/com/casic/missiles/modular/alarm/service/IAlarmRuleService.java +++ b/casic-alarm/src/main/java/com/casic/missiles/modular/alarm/service/IAlarmRuleService.java @@ -23,4 +23,6 @@ boolean updateRule( int id, float highValue, float lowValue); List getNoAlarmDevice(DataScope dataScope); + AlarmRule selectAlarmRuleByDev(String devcode, String grade); + } diff --git a/casic-alarm/src/main/java/com/casic/missiles/modular/alarm/service/impl/AlarmRecordsServiceImpl.java b/casic-alarm/src/main/java/com/casic/missiles/modular/alarm/service/impl/AlarmRecordsServiceImpl.java index 8ff1739..7b510c6 100644 --- a/casic-alarm/src/main/java/com/casic/missiles/modular/alarm/service/impl/AlarmRecordsServiceImpl.java +++ b/casic-alarm/src/main/java/com/casic/missiles/modular/alarm/service/impl/AlarmRecordsServiceImpl.java @@ -52,4 +52,9 @@ return this.baseMapper.cancelAlarm(id,jobStatus,handleMessage,personId); } + @Override + public Integer insertAlarmRecord(AlarmRecords alarmRec) { + this.baseMapper.cancelAlarmByNewRecord(alarmRec.getDevcode(), alarmRec.getAlarmType()); + return this.baseMapper.insert(alarmRec); + } } diff --git a/casic-alarm/src/main/java/com/casic/missiles/modular/alarm/service/impl/AlarmRuleServiceImpl.java b/casic-alarm/src/main/java/com/casic/missiles/modular/alarm/service/impl/AlarmRuleServiceImpl.java index 234a66c..515a3d0 100644 --- a/casic-alarm/src/main/java/com/casic/missiles/modular/alarm/service/impl/AlarmRuleServiceImpl.java +++ b/casic-alarm/src/main/java/com/casic/missiles/modular/alarm/service/impl/AlarmRuleServiceImpl.java @@ -40,4 +40,9 @@ public List getNoAlarmDevice(DataScope dataScope) { return this.baseMapper.getNoAlarmDevice(dataScope); } + + @Override + public AlarmRule selectAlarmRuleByDev(String devcode, String grade) { + return this.baseMapper.selectAlarmRuleByDev(devcode, grade); + } } diff --git a/casic-alarm/src/main/java/com/casic/missiles/modular/system/controller/WaterMeterDataReceiver.java b/casic-alarm/src/main/java/com/casic/missiles/modular/system/controller/WaterMeterDataReceiver.java new file mode 100644 index 0000000..8ce1070 --- /dev/null +++ b/casic-alarm/src/main/java/com/casic/missiles/modular/system/controller/WaterMeterDataReceiver.java @@ -0,0 +1,150 @@ +package com.casic.missiles.modular.system.controller; + +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.modular.alarm.service.IAlarmRecordsService; +import com.casic.missiles.modular.alarm.service.IAlarmRuleService; +import com.casic.missiles.modular.system.dto.DeviceWellDto; +import com.casic.missiles.modular.system.model.AlarmRecords; +import com.casic.missiles.modular.system.model.AlarmRule; +import com.casic.missiles.modular.system.model.DataWaterMeter; +import com.casic.missiles.modular.system.model.Device; +import com.casic.missiles.modular.system.service.IDeviceService; +import com.casic.missiles.modular.system.service.IWaterMeterDataService; +import lombok.extern.java.Log; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import javax.annotation.Resource; +import java.text.DecimalFormat; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.Map; + +@Log +@Controller +@RequestMapping("/meter") +public class WaterMeterDataReceiver extends BaseController { + + @Resource + private IWaterMeterDataService waterMeterDataService; + + @Resource + private IDeviceService deviceService; + + @Resource + private IAlarmRuleService alarmRuleService; + @Resource + private IAlarmRecordsService alarmRecordsService; + + private DecimalFormat df2 = new DecimalFormat("0.00"); + + @RequestMapping(value = "/data/recv") + @ResponseBody + public Object dataRecv(@RequestBody(required = true) Map meterData) throws ParseException { + // 判断必填字段 + if (meterData.containsKey("MeterAddr") == false) { + return ResponseData.error("设备地址字段缺失"); + } + if (meterData.containsKey("MeterNumber") == false) { + return ResponseData.error("水表读数字段缺失"); + } + if (meterData.containsKey("ReadDate") == false) { + return ResponseData.error("上报时间字段缺失"); + } + + // 创建原始记录对象 + DataWaterMeter dataWaterMeter = new DataWaterMeter(); + + // 赋值设备地址 + String meterAddr = meterData.get("MeterAddr").toString(); + dataWaterMeter.setDevcode(meterAddr); + + // 赋值井编号 + DeviceWellDto wellDto = deviceService.selectWellByDevcode(meterAddr); + if (null == wellDto) { + log.info("没有找到" + meterAddr + "对应的井编号"); + return ResponseData.success(); + } + dataWaterMeter.setWellCode(wellDto.getWellCode()); + + // 能找到关联的井 则必然能找到设备 不判空 + Device device = deviceService.getDeviceByDevCode(meterAddr); + + // 赋值水表读数 + Double meterNumber = 0.0; + String numType = meterData.get("MeterNumber").getClass().getSimpleName(); + if (numType.equals("String")) { + meterNumber = Double.parseDouble(meterData.get("MeterNumber").toString()); + } else if (numType.equals("BigDecimal")) { + meterNumber = ((Number) meterData.get("MeterNumber")).doubleValue(); + } + dataWaterMeter.setFlowAcc(String.valueOf(meterNumber)); + + // 赋值数据采集时间 + String readDate = meterData.get("ReadDate").toString(); + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + dataWaterMeter.setUptime(sdf.parse(readDate)); + + // 赋值阀门状态 + if (meterData.containsKey("ValveStatus") == true) { + dataWaterMeter.setStatus(meterData.get("ValveStatus").toString()); + } + + dataWaterMeter.setLogtime(Calendar.getInstance().getTime()); + + // 保存到数据库 同时计算日/月用水量 + double flowAccToday = waterMeterDataService.saveWaterMeterData(dataWaterMeter); + + // 判断是否报警/预警 + AlarmRule alarmRule = alarmRuleService.selectAlarmRuleByDev(meterAddr, "1"); // 报警 + AlarmRule alarmRuleWarn = alarmRuleService.selectAlarmRuleByDev(meterAddr, "2"); // 预警 + if (null != alarmRule && null != alarmRule.getHighvalue()) { + if (flowAccToday - alarmRule.getHighvalue() > 0) { + // 超出报警阈值 生成一条报警消息 + AlarmRecords alarmRecord = new AlarmRecords(); + + alarmRecord.setDeviceId(device.getId()); + alarmRecord.setDevcode(meterAddr); + alarmRecord.setWellCode(wellDto.getWellCode()); + alarmRecord.setAlarmType("1"); // 业务报警 + alarmRecord.setAlarmContent("日用水量超阈值报警"); + alarmRecord.setAlarmValue(df2.format(flowAccToday)); + alarmRecord.setAlarmTime(Calendar.getInstance().getTime()); + alarmRecord.setStatus("1"); + alarmRecord.setAlarmMessage("日用水量超阈值报警"); + + alarmRecordsService.insertAlarmRecord(alarmRecord); + + // 向前端推送报警 + } else { + // 如果没有报警则判断是否预警 + if (null != alarmRuleWarn && null != alarmRuleWarn.getHighvalue()) { + if (flowAccToday - alarmRuleWarn.getHighvalue() > 0) { + // 超出预警阈值 生成一条预警消息 + AlarmRecords alarmRecord = new AlarmRecords(); + + alarmRecord.setDeviceId(device.getId()); + alarmRecord.setDevcode(meterAddr); + alarmRecord.setWellCode(wellDto.getWellCode()); + alarmRecord.setAlarmType("3"); // 业务报警 + alarmRecord.setAlarmContent("日用水量超阈值预警"); + alarmRecord.setAlarmValue(df2.format(flowAccToday)); + alarmRecord.setAlarmTime(Calendar.getInstance().getTime()); + alarmRecord.setStatus("1"); + alarmRecord.setAlarmMessage("日用水量超阈值预警"); + + alarmRecordsService.insertAlarmRecord(alarmRecord); + + // 向前端推送报警 + } + } + } + } + + return ResponseData.success(); + } +} diff --git a/casic-alarm/src/main/java/com/casic/missiles/modular/system/dao/AlarmRecordsMapper.java b/casic-alarm/src/main/java/com/casic/missiles/modular/system/dao/AlarmRecordsMapper.java index 408d5c6..a6f05c4 100644 --- a/casic-alarm/src/main/java/com/casic/missiles/modular/system/dao/AlarmRecordsMapper.java +++ b/casic-alarm/src/main/java/com/casic/missiles/modular/system/dao/AlarmRecordsMapper.java @@ -24,4 +24,6 @@ List alarmListNoPage(@Param("scope") DataScope dataScope, @Param("keywords") String keywords, @Param("alarmType") String alarmType, @Param("alarmContent") String alarmContent, @Param("beginTime") String beginTime, @Param("endTime") String endTime); boolean cancelAlarm(@Param("id") int id,@Param("jobStatus")String jobStatus,@Param("handleMessage") String handleMessage,@Param("personId") long personId); + + boolean cancelAlarmByNewRecord(@Param("devcode") String devcode, @Param("alarmType") String alarmType); } diff --git a/casic-alarm/src/main/java/com/casic/missiles/modular/alarm/service/IAlarmRecordsService.java b/casic-alarm/src/main/java/com/casic/missiles/modular/alarm/service/IAlarmRecordsService.java index 1d00c2e..a0bd20d 100644 --- a/casic-alarm/src/main/java/com/casic/missiles/modular/alarm/service/IAlarmRecordsService.java +++ b/casic-alarm/src/main/java/com/casic/missiles/modular/alarm/service/IAlarmRecordsService.java @@ -23,4 +23,6 @@ List alarmListNoPage(DataScope dataScope, String keywords, String alarmType, String alarmContent,String beginTime, String endTime); boolean cancelAlarm(int id,String jobStatus, String handleMessage, long personId); + + Integer insertAlarmRecord(AlarmRecords alarmRec); } diff --git a/casic-alarm/src/main/java/com/casic/missiles/modular/alarm/service/IAlarmRuleService.java b/casic-alarm/src/main/java/com/casic/missiles/modular/alarm/service/IAlarmRuleService.java index a4b78e0..394f24f 100644 --- a/casic-alarm/src/main/java/com/casic/missiles/modular/alarm/service/IAlarmRuleService.java +++ b/casic-alarm/src/main/java/com/casic/missiles/modular/alarm/service/IAlarmRuleService.java @@ -23,4 +23,6 @@ boolean updateRule( int id, float highValue, float lowValue); List getNoAlarmDevice(DataScope dataScope); + AlarmRule selectAlarmRuleByDev(String devcode, String grade); + } diff --git a/casic-alarm/src/main/java/com/casic/missiles/modular/alarm/service/impl/AlarmRecordsServiceImpl.java b/casic-alarm/src/main/java/com/casic/missiles/modular/alarm/service/impl/AlarmRecordsServiceImpl.java index 8ff1739..7b510c6 100644 --- a/casic-alarm/src/main/java/com/casic/missiles/modular/alarm/service/impl/AlarmRecordsServiceImpl.java +++ b/casic-alarm/src/main/java/com/casic/missiles/modular/alarm/service/impl/AlarmRecordsServiceImpl.java @@ -52,4 +52,9 @@ return this.baseMapper.cancelAlarm(id,jobStatus,handleMessage,personId); } + @Override + public Integer insertAlarmRecord(AlarmRecords alarmRec) { + this.baseMapper.cancelAlarmByNewRecord(alarmRec.getDevcode(), alarmRec.getAlarmType()); + return this.baseMapper.insert(alarmRec); + } } diff --git a/casic-alarm/src/main/java/com/casic/missiles/modular/alarm/service/impl/AlarmRuleServiceImpl.java b/casic-alarm/src/main/java/com/casic/missiles/modular/alarm/service/impl/AlarmRuleServiceImpl.java index 234a66c..515a3d0 100644 --- a/casic-alarm/src/main/java/com/casic/missiles/modular/alarm/service/impl/AlarmRuleServiceImpl.java +++ b/casic-alarm/src/main/java/com/casic/missiles/modular/alarm/service/impl/AlarmRuleServiceImpl.java @@ -40,4 +40,9 @@ public List getNoAlarmDevice(DataScope dataScope) { return this.baseMapper.getNoAlarmDevice(dataScope); } + + @Override + public AlarmRule selectAlarmRuleByDev(String devcode, String grade) { + return this.baseMapper.selectAlarmRuleByDev(devcode, grade); + } } diff --git a/casic-alarm/src/main/java/com/casic/missiles/modular/system/controller/WaterMeterDataReceiver.java b/casic-alarm/src/main/java/com/casic/missiles/modular/system/controller/WaterMeterDataReceiver.java new file mode 100644 index 0000000..8ce1070 --- /dev/null +++ b/casic-alarm/src/main/java/com/casic/missiles/modular/system/controller/WaterMeterDataReceiver.java @@ -0,0 +1,150 @@ +package com.casic.missiles.modular.system.controller; + +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.modular.alarm.service.IAlarmRecordsService; +import com.casic.missiles.modular.alarm.service.IAlarmRuleService; +import com.casic.missiles.modular.system.dto.DeviceWellDto; +import com.casic.missiles.modular.system.model.AlarmRecords; +import com.casic.missiles.modular.system.model.AlarmRule; +import com.casic.missiles.modular.system.model.DataWaterMeter; +import com.casic.missiles.modular.system.model.Device; +import com.casic.missiles.modular.system.service.IDeviceService; +import com.casic.missiles.modular.system.service.IWaterMeterDataService; +import lombok.extern.java.Log; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import javax.annotation.Resource; +import java.text.DecimalFormat; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.Map; + +@Log +@Controller +@RequestMapping("/meter") +public class WaterMeterDataReceiver extends BaseController { + + @Resource + private IWaterMeterDataService waterMeterDataService; + + @Resource + private IDeviceService deviceService; + + @Resource + private IAlarmRuleService alarmRuleService; + @Resource + private IAlarmRecordsService alarmRecordsService; + + private DecimalFormat df2 = new DecimalFormat("0.00"); + + @RequestMapping(value = "/data/recv") + @ResponseBody + public Object dataRecv(@RequestBody(required = true) Map meterData) throws ParseException { + // 判断必填字段 + if (meterData.containsKey("MeterAddr") == false) { + return ResponseData.error("设备地址字段缺失"); + } + if (meterData.containsKey("MeterNumber") == false) { + return ResponseData.error("水表读数字段缺失"); + } + if (meterData.containsKey("ReadDate") == false) { + return ResponseData.error("上报时间字段缺失"); + } + + // 创建原始记录对象 + DataWaterMeter dataWaterMeter = new DataWaterMeter(); + + // 赋值设备地址 + String meterAddr = meterData.get("MeterAddr").toString(); + dataWaterMeter.setDevcode(meterAddr); + + // 赋值井编号 + DeviceWellDto wellDto = deviceService.selectWellByDevcode(meterAddr); + if (null == wellDto) { + log.info("没有找到" + meterAddr + "对应的井编号"); + return ResponseData.success(); + } + dataWaterMeter.setWellCode(wellDto.getWellCode()); + + // 能找到关联的井 则必然能找到设备 不判空 + Device device = deviceService.getDeviceByDevCode(meterAddr); + + // 赋值水表读数 + Double meterNumber = 0.0; + String numType = meterData.get("MeterNumber").getClass().getSimpleName(); + if (numType.equals("String")) { + meterNumber = Double.parseDouble(meterData.get("MeterNumber").toString()); + } else if (numType.equals("BigDecimal")) { + meterNumber = ((Number) meterData.get("MeterNumber")).doubleValue(); + } + dataWaterMeter.setFlowAcc(String.valueOf(meterNumber)); + + // 赋值数据采集时间 + String readDate = meterData.get("ReadDate").toString(); + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + dataWaterMeter.setUptime(sdf.parse(readDate)); + + // 赋值阀门状态 + if (meterData.containsKey("ValveStatus") == true) { + dataWaterMeter.setStatus(meterData.get("ValveStatus").toString()); + } + + dataWaterMeter.setLogtime(Calendar.getInstance().getTime()); + + // 保存到数据库 同时计算日/月用水量 + double flowAccToday = waterMeterDataService.saveWaterMeterData(dataWaterMeter); + + // 判断是否报警/预警 + AlarmRule alarmRule = alarmRuleService.selectAlarmRuleByDev(meterAddr, "1"); // 报警 + AlarmRule alarmRuleWarn = alarmRuleService.selectAlarmRuleByDev(meterAddr, "2"); // 预警 + if (null != alarmRule && null != alarmRule.getHighvalue()) { + if (flowAccToday - alarmRule.getHighvalue() > 0) { + // 超出报警阈值 生成一条报警消息 + AlarmRecords alarmRecord = new AlarmRecords(); + + alarmRecord.setDeviceId(device.getId()); + alarmRecord.setDevcode(meterAddr); + alarmRecord.setWellCode(wellDto.getWellCode()); + alarmRecord.setAlarmType("1"); // 业务报警 + alarmRecord.setAlarmContent("日用水量超阈值报警"); + alarmRecord.setAlarmValue(df2.format(flowAccToday)); + alarmRecord.setAlarmTime(Calendar.getInstance().getTime()); + alarmRecord.setStatus("1"); + alarmRecord.setAlarmMessage("日用水量超阈值报警"); + + alarmRecordsService.insertAlarmRecord(alarmRecord); + + // 向前端推送报警 + } else { + // 如果没有报警则判断是否预警 + if (null != alarmRuleWarn && null != alarmRuleWarn.getHighvalue()) { + if (flowAccToday - alarmRuleWarn.getHighvalue() > 0) { + // 超出预警阈值 生成一条预警消息 + AlarmRecords alarmRecord = new AlarmRecords(); + + alarmRecord.setDeviceId(device.getId()); + alarmRecord.setDevcode(meterAddr); + alarmRecord.setWellCode(wellDto.getWellCode()); + alarmRecord.setAlarmType("3"); // 业务报警 + alarmRecord.setAlarmContent("日用水量超阈值预警"); + alarmRecord.setAlarmValue(df2.format(flowAccToday)); + alarmRecord.setAlarmTime(Calendar.getInstance().getTime()); + alarmRecord.setStatus("1"); + alarmRecord.setAlarmMessage("日用水量超阈值预警"); + + alarmRecordsService.insertAlarmRecord(alarmRecord); + + // 向前端推送报警 + } + } + } + } + + return ResponseData.success(); + } +} diff --git a/casic-alarm/src/main/java/com/casic/missiles/modular/system/dao/AlarmRecordsMapper.java b/casic-alarm/src/main/java/com/casic/missiles/modular/system/dao/AlarmRecordsMapper.java index 408d5c6..a6f05c4 100644 --- a/casic-alarm/src/main/java/com/casic/missiles/modular/system/dao/AlarmRecordsMapper.java +++ b/casic-alarm/src/main/java/com/casic/missiles/modular/system/dao/AlarmRecordsMapper.java @@ -24,4 +24,6 @@ List alarmListNoPage(@Param("scope") DataScope dataScope, @Param("keywords") String keywords, @Param("alarmType") String alarmType, @Param("alarmContent") String alarmContent, @Param("beginTime") String beginTime, @Param("endTime") String endTime); boolean cancelAlarm(@Param("id") int id,@Param("jobStatus")String jobStatus,@Param("handleMessage") String handleMessage,@Param("personId") long personId); + + boolean cancelAlarmByNewRecord(@Param("devcode") String devcode, @Param("alarmType") String alarmType); } diff --git a/casic-alarm/src/main/java/com/casic/missiles/modular/system/dao/AlarmRuleMapper.java b/casic-alarm/src/main/java/com/casic/missiles/modular/system/dao/AlarmRuleMapper.java index da4f54c..00f33ee 100644 --- a/casic-alarm/src/main/java/com/casic/missiles/modular/system/dao/AlarmRuleMapper.java +++ b/casic-alarm/src/main/java/com/casic/missiles/modular/system/dao/AlarmRuleMapper.java @@ -23,4 +23,6 @@ List> ruleListViaParam(@Param("page") Page> page, @Param("keywords") String keywords, @Param("deviceType") String deviceType,@Param("dataScope") DataScope dataScope); boolean updateRule(@Param("id") int id,@Param("highValue") float highValue,@Param("lowValue") float lowValue); List getNoAlarmDevice(@Param("dataScope") DataScope dataScope); + + AlarmRule selectAlarmRuleByDev(@Param("devcode") String devcode, @Param("grade") String grade); } diff --git a/casic-alarm/src/main/java/com/casic/missiles/modular/alarm/service/IAlarmRecordsService.java b/casic-alarm/src/main/java/com/casic/missiles/modular/alarm/service/IAlarmRecordsService.java index 1d00c2e..a0bd20d 100644 --- a/casic-alarm/src/main/java/com/casic/missiles/modular/alarm/service/IAlarmRecordsService.java +++ b/casic-alarm/src/main/java/com/casic/missiles/modular/alarm/service/IAlarmRecordsService.java @@ -23,4 +23,6 @@ List alarmListNoPage(DataScope dataScope, String keywords, String alarmType, String alarmContent,String beginTime, String endTime); boolean cancelAlarm(int id,String jobStatus, String handleMessage, long personId); + + Integer insertAlarmRecord(AlarmRecords alarmRec); } diff --git a/casic-alarm/src/main/java/com/casic/missiles/modular/alarm/service/IAlarmRuleService.java b/casic-alarm/src/main/java/com/casic/missiles/modular/alarm/service/IAlarmRuleService.java index a4b78e0..394f24f 100644 --- a/casic-alarm/src/main/java/com/casic/missiles/modular/alarm/service/IAlarmRuleService.java +++ b/casic-alarm/src/main/java/com/casic/missiles/modular/alarm/service/IAlarmRuleService.java @@ -23,4 +23,6 @@ boolean updateRule( int id, float highValue, float lowValue); List getNoAlarmDevice(DataScope dataScope); + AlarmRule selectAlarmRuleByDev(String devcode, String grade); + } diff --git a/casic-alarm/src/main/java/com/casic/missiles/modular/alarm/service/impl/AlarmRecordsServiceImpl.java b/casic-alarm/src/main/java/com/casic/missiles/modular/alarm/service/impl/AlarmRecordsServiceImpl.java index 8ff1739..7b510c6 100644 --- a/casic-alarm/src/main/java/com/casic/missiles/modular/alarm/service/impl/AlarmRecordsServiceImpl.java +++ b/casic-alarm/src/main/java/com/casic/missiles/modular/alarm/service/impl/AlarmRecordsServiceImpl.java @@ -52,4 +52,9 @@ return this.baseMapper.cancelAlarm(id,jobStatus,handleMessage,personId); } + @Override + public Integer insertAlarmRecord(AlarmRecords alarmRec) { + this.baseMapper.cancelAlarmByNewRecord(alarmRec.getDevcode(), alarmRec.getAlarmType()); + return this.baseMapper.insert(alarmRec); + } } diff --git a/casic-alarm/src/main/java/com/casic/missiles/modular/alarm/service/impl/AlarmRuleServiceImpl.java b/casic-alarm/src/main/java/com/casic/missiles/modular/alarm/service/impl/AlarmRuleServiceImpl.java index 234a66c..515a3d0 100644 --- a/casic-alarm/src/main/java/com/casic/missiles/modular/alarm/service/impl/AlarmRuleServiceImpl.java +++ b/casic-alarm/src/main/java/com/casic/missiles/modular/alarm/service/impl/AlarmRuleServiceImpl.java @@ -40,4 +40,9 @@ public List getNoAlarmDevice(DataScope dataScope) { return this.baseMapper.getNoAlarmDevice(dataScope); } + + @Override + public AlarmRule selectAlarmRuleByDev(String devcode, String grade) { + return this.baseMapper.selectAlarmRuleByDev(devcode, grade); + } } diff --git a/casic-alarm/src/main/java/com/casic/missiles/modular/system/controller/WaterMeterDataReceiver.java b/casic-alarm/src/main/java/com/casic/missiles/modular/system/controller/WaterMeterDataReceiver.java new file mode 100644 index 0000000..8ce1070 --- /dev/null +++ b/casic-alarm/src/main/java/com/casic/missiles/modular/system/controller/WaterMeterDataReceiver.java @@ -0,0 +1,150 @@ +package com.casic.missiles.modular.system.controller; + +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.modular.alarm.service.IAlarmRecordsService; +import com.casic.missiles.modular.alarm.service.IAlarmRuleService; +import com.casic.missiles.modular.system.dto.DeviceWellDto; +import com.casic.missiles.modular.system.model.AlarmRecords; +import com.casic.missiles.modular.system.model.AlarmRule; +import com.casic.missiles.modular.system.model.DataWaterMeter; +import com.casic.missiles.modular.system.model.Device; +import com.casic.missiles.modular.system.service.IDeviceService; +import com.casic.missiles.modular.system.service.IWaterMeterDataService; +import lombok.extern.java.Log; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import javax.annotation.Resource; +import java.text.DecimalFormat; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.Map; + +@Log +@Controller +@RequestMapping("/meter") +public class WaterMeterDataReceiver extends BaseController { + + @Resource + private IWaterMeterDataService waterMeterDataService; + + @Resource + private IDeviceService deviceService; + + @Resource + private IAlarmRuleService alarmRuleService; + @Resource + private IAlarmRecordsService alarmRecordsService; + + private DecimalFormat df2 = new DecimalFormat("0.00"); + + @RequestMapping(value = "/data/recv") + @ResponseBody + public Object dataRecv(@RequestBody(required = true) Map meterData) throws ParseException { + // 判断必填字段 + if (meterData.containsKey("MeterAddr") == false) { + return ResponseData.error("设备地址字段缺失"); + } + if (meterData.containsKey("MeterNumber") == false) { + return ResponseData.error("水表读数字段缺失"); + } + if (meterData.containsKey("ReadDate") == false) { + return ResponseData.error("上报时间字段缺失"); + } + + // 创建原始记录对象 + DataWaterMeter dataWaterMeter = new DataWaterMeter(); + + // 赋值设备地址 + String meterAddr = meterData.get("MeterAddr").toString(); + dataWaterMeter.setDevcode(meterAddr); + + // 赋值井编号 + DeviceWellDto wellDto = deviceService.selectWellByDevcode(meterAddr); + if (null == wellDto) { + log.info("没有找到" + meterAddr + "对应的井编号"); + return ResponseData.success(); + } + dataWaterMeter.setWellCode(wellDto.getWellCode()); + + // 能找到关联的井 则必然能找到设备 不判空 + Device device = deviceService.getDeviceByDevCode(meterAddr); + + // 赋值水表读数 + Double meterNumber = 0.0; + String numType = meterData.get("MeterNumber").getClass().getSimpleName(); + if (numType.equals("String")) { + meterNumber = Double.parseDouble(meterData.get("MeterNumber").toString()); + } else if (numType.equals("BigDecimal")) { + meterNumber = ((Number) meterData.get("MeterNumber")).doubleValue(); + } + dataWaterMeter.setFlowAcc(String.valueOf(meterNumber)); + + // 赋值数据采集时间 + String readDate = meterData.get("ReadDate").toString(); + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + dataWaterMeter.setUptime(sdf.parse(readDate)); + + // 赋值阀门状态 + if (meterData.containsKey("ValveStatus") == true) { + dataWaterMeter.setStatus(meterData.get("ValveStatus").toString()); + } + + dataWaterMeter.setLogtime(Calendar.getInstance().getTime()); + + // 保存到数据库 同时计算日/月用水量 + double flowAccToday = waterMeterDataService.saveWaterMeterData(dataWaterMeter); + + // 判断是否报警/预警 + AlarmRule alarmRule = alarmRuleService.selectAlarmRuleByDev(meterAddr, "1"); // 报警 + AlarmRule alarmRuleWarn = alarmRuleService.selectAlarmRuleByDev(meterAddr, "2"); // 预警 + if (null != alarmRule && null != alarmRule.getHighvalue()) { + if (flowAccToday - alarmRule.getHighvalue() > 0) { + // 超出报警阈值 生成一条报警消息 + AlarmRecords alarmRecord = new AlarmRecords(); + + alarmRecord.setDeviceId(device.getId()); + alarmRecord.setDevcode(meterAddr); + alarmRecord.setWellCode(wellDto.getWellCode()); + alarmRecord.setAlarmType("1"); // 业务报警 + alarmRecord.setAlarmContent("日用水量超阈值报警"); + alarmRecord.setAlarmValue(df2.format(flowAccToday)); + alarmRecord.setAlarmTime(Calendar.getInstance().getTime()); + alarmRecord.setStatus("1"); + alarmRecord.setAlarmMessage("日用水量超阈值报警"); + + alarmRecordsService.insertAlarmRecord(alarmRecord); + + // 向前端推送报警 + } else { + // 如果没有报警则判断是否预警 + if (null != alarmRuleWarn && null != alarmRuleWarn.getHighvalue()) { + if (flowAccToday - alarmRuleWarn.getHighvalue() > 0) { + // 超出预警阈值 生成一条预警消息 + AlarmRecords alarmRecord = new AlarmRecords(); + + alarmRecord.setDeviceId(device.getId()); + alarmRecord.setDevcode(meterAddr); + alarmRecord.setWellCode(wellDto.getWellCode()); + alarmRecord.setAlarmType("3"); // 业务报警 + alarmRecord.setAlarmContent("日用水量超阈值预警"); + alarmRecord.setAlarmValue(df2.format(flowAccToday)); + alarmRecord.setAlarmTime(Calendar.getInstance().getTime()); + alarmRecord.setStatus("1"); + alarmRecord.setAlarmMessage("日用水量超阈值预警"); + + alarmRecordsService.insertAlarmRecord(alarmRecord); + + // 向前端推送报警 + } + } + } + } + + return ResponseData.success(); + } +} diff --git a/casic-alarm/src/main/java/com/casic/missiles/modular/system/dao/AlarmRecordsMapper.java b/casic-alarm/src/main/java/com/casic/missiles/modular/system/dao/AlarmRecordsMapper.java index 408d5c6..a6f05c4 100644 --- a/casic-alarm/src/main/java/com/casic/missiles/modular/system/dao/AlarmRecordsMapper.java +++ b/casic-alarm/src/main/java/com/casic/missiles/modular/system/dao/AlarmRecordsMapper.java @@ -24,4 +24,6 @@ List alarmListNoPage(@Param("scope") DataScope dataScope, @Param("keywords") String keywords, @Param("alarmType") String alarmType, @Param("alarmContent") String alarmContent, @Param("beginTime") String beginTime, @Param("endTime") String endTime); boolean cancelAlarm(@Param("id") int id,@Param("jobStatus")String jobStatus,@Param("handleMessage") String handleMessage,@Param("personId") long personId); + + boolean cancelAlarmByNewRecord(@Param("devcode") String devcode, @Param("alarmType") String alarmType); } diff --git a/casic-alarm/src/main/java/com/casic/missiles/modular/system/dao/AlarmRuleMapper.java b/casic-alarm/src/main/java/com/casic/missiles/modular/system/dao/AlarmRuleMapper.java index da4f54c..00f33ee 100644 --- a/casic-alarm/src/main/java/com/casic/missiles/modular/system/dao/AlarmRuleMapper.java +++ b/casic-alarm/src/main/java/com/casic/missiles/modular/system/dao/AlarmRuleMapper.java @@ -23,4 +23,6 @@ List> ruleListViaParam(@Param("page") Page> page, @Param("keywords") String keywords, @Param("deviceType") String deviceType,@Param("dataScope") DataScope dataScope); boolean updateRule(@Param("id") int id,@Param("highValue") float highValue,@Param("lowValue") float lowValue); List getNoAlarmDevice(@Param("dataScope") DataScope dataScope); + + AlarmRule selectAlarmRuleByDev(@Param("devcode") String devcode, @Param("grade") String grade); } diff --git a/casic-alarm/src/main/java/com/casic/missiles/modular/system/dao/mapping/AlarmRecordsMapper.xml b/casic-alarm/src/main/java/com/casic/missiles/modular/system/dao/mapping/AlarmRecordsMapper.xml index d9cfd1e..73047da 100644 --- a/casic-alarm/src/main/java/com/casic/missiles/modular/system/dao/mapping/AlarmRecordsMapper.xml +++ b/casic-alarm/src/main/java/com/casic/missiles/modular/system/dao/mapping/AlarmRecordsMapper.xml @@ -116,4 +116,12 @@ AND aj.ID = #{id} + + UPDATE alarm_records ar + + ar.status = 0 + + WHERE ar.devcode = #{devcode} and ar.alarm_type = #{alarmType} + + diff --git a/casic-alarm/src/main/java/com/casic/missiles/modular/alarm/service/IAlarmRecordsService.java b/casic-alarm/src/main/java/com/casic/missiles/modular/alarm/service/IAlarmRecordsService.java index 1d00c2e..a0bd20d 100644 --- a/casic-alarm/src/main/java/com/casic/missiles/modular/alarm/service/IAlarmRecordsService.java +++ b/casic-alarm/src/main/java/com/casic/missiles/modular/alarm/service/IAlarmRecordsService.java @@ -23,4 +23,6 @@ List alarmListNoPage(DataScope dataScope, String keywords, String alarmType, String alarmContent,String beginTime, String endTime); boolean cancelAlarm(int id,String jobStatus, String handleMessage, long personId); + + Integer insertAlarmRecord(AlarmRecords alarmRec); } diff --git a/casic-alarm/src/main/java/com/casic/missiles/modular/alarm/service/IAlarmRuleService.java b/casic-alarm/src/main/java/com/casic/missiles/modular/alarm/service/IAlarmRuleService.java index a4b78e0..394f24f 100644 --- a/casic-alarm/src/main/java/com/casic/missiles/modular/alarm/service/IAlarmRuleService.java +++ b/casic-alarm/src/main/java/com/casic/missiles/modular/alarm/service/IAlarmRuleService.java @@ -23,4 +23,6 @@ boolean updateRule( int id, float highValue, float lowValue); List getNoAlarmDevice(DataScope dataScope); + AlarmRule selectAlarmRuleByDev(String devcode, String grade); + } diff --git a/casic-alarm/src/main/java/com/casic/missiles/modular/alarm/service/impl/AlarmRecordsServiceImpl.java b/casic-alarm/src/main/java/com/casic/missiles/modular/alarm/service/impl/AlarmRecordsServiceImpl.java index 8ff1739..7b510c6 100644 --- a/casic-alarm/src/main/java/com/casic/missiles/modular/alarm/service/impl/AlarmRecordsServiceImpl.java +++ b/casic-alarm/src/main/java/com/casic/missiles/modular/alarm/service/impl/AlarmRecordsServiceImpl.java @@ -52,4 +52,9 @@ return this.baseMapper.cancelAlarm(id,jobStatus,handleMessage,personId); } + @Override + public Integer insertAlarmRecord(AlarmRecords alarmRec) { + this.baseMapper.cancelAlarmByNewRecord(alarmRec.getDevcode(), alarmRec.getAlarmType()); + return this.baseMapper.insert(alarmRec); + } } diff --git a/casic-alarm/src/main/java/com/casic/missiles/modular/alarm/service/impl/AlarmRuleServiceImpl.java b/casic-alarm/src/main/java/com/casic/missiles/modular/alarm/service/impl/AlarmRuleServiceImpl.java index 234a66c..515a3d0 100644 --- a/casic-alarm/src/main/java/com/casic/missiles/modular/alarm/service/impl/AlarmRuleServiceImpl.java +++ b/casic-alarm/src/main/java/com/casic/missiles/modular/alarm/service/impl/AlarmRuleServiceImpl.java @@ -40,4 +40,9 @@ public List getNoAlarmDevice(DataScope dataScope) { return this.baseMapper.getNoAlarmDevice(dataScope); } + + @Override + public AlarmRule selectAlarmRuleByDev(String devcode, String grade) { + return this.baseMapper.selectAlarmRuleByDev(devcode, grade); + } } diff --git a/casic-alarm/src/main/java/com/casic/missiles/modular/system/controller/WaterMeterDataReceiver.java b/casic-alarm/src/main/java/com/casic/missiles/modular/system/controller/WaterMeterDataReceiver.java new file mode 100644 index 0000000..8ce1070 --- /dev/null +++ b/casic-alarm/src/main/java/com/casic/missiles/modular/system/controller/WaterMeterDataReceiver.java @@ -0,0 +1,150 @@ +package com.casic.missiles.modular.system.controller; + +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.modular.alarm.service.IAlarmRecordsService; +import com.casic.missiles.modular.alarm.service.IAlarmRuleService; +import com.casic.missiles.modular.system.dto.DeviceWellDto; +import com.casic.missiles.modular.system.model.AlarmRecords; +import com.casic.missiles.modular.system.model.AlarmRule; +import com.casic.missiles.modular.system.model.DataWaterMeter; +import com.casic.missiles.modular.system.model.Device; +import com.casic.missiles.modular.system.service.IDeviceService; +import com.casic.missiles.modular.system.service.IWaterMeterDataService; +import lombok.extern.java.Log; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import javax.annotation.Resource; +import java.text.DecimalFormat; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.Map; + +@Log +@Controller +@RequestMapping("/meter") +public class WaterMeterDataReceiver extends BaseController { + + @Resource + private IWaterMeterDataService waterMeterDataService; + + @Resource + private IDeviceService deviceService; + + @Resource + private IAlarmRuleService alarmRuleService; + @Resource + private IAlarmRecordsService alarmRecordsService; + + private DecimalFormat df2 = new DecimalFormat("0.00"); + + @RequestMapping(value = "/data/recv") + @ResponseBody + public Object dataRecv(@RequestBody(required = true) Map meterData) throws ParseException { + // 判断必填字段 + if (meterData.containsKey("MeterAddr") == false) { + return ResponseData.error("设备地址字段缺失"); + } + if (meterData.containsKey("MeterNumber") == false) { + return ResponseData.error("水表读数字段缺失"); + } + if (meterData.containsKey("ReadDate") == false) { + return ResponseData.error("上报时间字段缺失"); + } + + // 创建原始记录对象 + DataWaterMeter dataWaterMeter = new DataWaterMeter(); + + // 赋值设备地址 + String meterAddr = meterData.get("MeterAddr").toString(); + dataWaterMeter.setDevcode(meterAddr); + + // 赋值井编号 + DeviceWellDto wellDto = deviceService.selectWellByDevcode(meterAddr); + if (null == wellDto) { + log.info("没有找到" + meterAddr + "对应的井编号"); + return ResponseData.success(); + } + dataWaterMeter.setWellCode(wellDto.getWellCode()); + + // 能找到关联的井 则必然能找到设备 不判空 + Device device = deviceService.getDeviceByDevCode(meterAddr); + + // 赋值水表读数 + Double meterNumber = 0.0; + String numType = meterData.get("MeterNumber").getClass().getSimpleName(); + if (numType.equals("String")) { + meterNumber = Double.parseDouble(meterData.get("MeterNumber").toString()); + } else if (numType.equals("BigDecimal")) { + meterNumber = ((Number) meterData.get("MeterNumber")).doubleValue(); + } + dataWaterMeter.setFlowAcc(String.valueOf(meterNumber)); + + // 赋值数据采集时间 + String readDate = meterData.get("ReadDate").toString(); + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + dataWaterMeter.setUptime(sdf.parse(readDate)); + + // 赋值阀门状态 + if (meterData.containsKey("ValveStatus") == true) { + dataWaterMeter.setStatus(meterData.get("ValveStatus").toString()); + } + + dataWaterMeter.setLogtime(Calendar.getInstance().getTime()); + + // 保存到数据库 同时计算日/月用水量 + double flowAccToday = waterMeterDataService.saveWaterMeterData(dataWaterMeter); + + // 判断是否报警/预警 + AlarmRule alarmRule = alarmRuleService.selectAlarmRuleByDev(meterAddr, "1"); // 报警 + AlarmRule alarmRuleWarn = alarmRuleService.selectAlarmRuleByDev(meterAddr, "2"); // 预警 + if (null != alarmRule && null != alarmRule.getHighvalue()) { + if (flowAccToday - alarmRule.getHighvalue() > 0) { + // 超出报警阈值 生成一条报警消息 + AlarmRecords alarmRecord = new AlarmRecords(); + + alarmRecord.setDeviceId(device.getId()); + alarmRecord.setDevcode(meterAddr); + alarmRecord.setWellCode(wellDto.getWellCode()); + alarmRecord.setAlarmType("1"); // 业务报警 + alarmRecord.setAlarmContent("日用水量超阈值报警"); + alarmRecord.setAlarmValue(df2.format(flowAccToday)); + alarmRecord.setAlarmTime(Calendar.getInstance().getTime()); + alarmRecord.setStatus("1"); + alarmRecord.setAlarmMessage("日用水量超阈值报警"); + + alarmRecordsService.insertAlarmRecord(alarmRecord); + + // 向前端推送报警 + } else { + // 如果没有报警则判断是否预警 + if (null != alarmRuleWarn && null != alarmRuleWarn.getHighvalue()) { + if (flowAccToday - alarmRuleWarn.getHighvalue() > 0) { + // 超出预警阈值 生成一条预警消息 + AlarmRecords alarmRecord = new AlarmRecords(); + + alarmRecord.setDeviceId(device.getId()); + alarmRecord.setDevcode(meterAddr); + alarmRecord.setWellCode(wellDto.getWellCode()); + alarmRecord.setAlarmType("3"); // 业务报警 + alarmRecord.setAlarmContent("日用水量超阈值预警"); + alarmRecord.setAlarmValue(df2.format(flowAccToday)); + alarmRecord.setAlarmTime(Calendar.getInstance().getTime()); + alarmRecord.setStatus("1"); + alarmRecord.setAlarmMessage("日用水量超阈值预警"); + + alarmRecordsService.insertAlarmRecord(alarmRecord); + + // 向前端推送报警 + } + } + } + } + + return ResponseData.success(); + } +} diff --git a/casic-alarm/src/main/java/com/casic/missiles/modular/system/dao/AlarmRecordsMapper.java b/casic-alarm/src/main/java/com/casic/missiles/modular/system/dao/AlarmRecordsMapper.java index 408d5c6..a6f05c4 100644 --- a/casic-alarm/src/main/java/com/casic/missiles/modular/system/dao/AlarmRecordsMapper.java +++ b/casic-alarm/src/main/java/com/casic/missiles/modular/system/dao/AlarmRecordsMapper.java @@ -24,4 +24,6 @@ List alarmListNoPage(@Param("scope") DataScope dataScope, @Param("keywords") String keywords, @Param("alarmType") String alarmType, @Param("alarmContent") String alarmContent, @Param("beginTime") String beginTime, @Param("endTime") String endTime); boolean cancelAlarm(@Param("id") int id,@Param("jobStatus")String jobStatus,@Param("handleMessage") String handleMessage,@Param("personId") long personId); + + boolean cancelAlarmByNewRecord(@Param("devcode") String devcode, @Param("alarmType") String alarmType); } diff --git a/casic-alarm/src/main/java/com/casic/missiles/modular/system/dao/AlarmRuleMapper.java b/casic-alarm/src/main/java/com/casic/missiles/modular/system/dao/AlarmRuleMapper.java index da4f54c..00f33ee 100644 --- a/casic-alarm/src/main/java/com/casic/missiles/modular/system/dao/AlarmRuleMapper.java +++ b/casic-alarm/src/main/java/com/casic/missiles/modular/system/dao/AlarmRuleMapper.java @@ -23,4 +23,6 @@ List> ruleListViaParam(@Param("page") Page> page, @Param("keywords") String keywords, @Param("deviceType") String deviceType,@Param("dataScope") DataScope dataScope); boolean updateRule(@Param("id") int id,@Param("highValue") float highValue,@Param("lowValue") float lowValue); List getNoAlarmDevice(@Param("dataScope") DataScope dataScope); + + AlarmRule selectAlarmRuleByDev(@Param("devcode") String devcode, @Param("grade") String grade); } diff --git a/casic-alarm/src/main/java/com/casic/missiles/modular/system/dao/mapping/AlarmRecordsMapper.xml b/casic-alarm/src/main/java/com/casic/missiles/modular/system/dao/mapping/AlarmRecordsMapper.xml index d9cfd1e..73047da 100644 --- a/casic-alarm/src/main/java/com/casic/missiles/modular/system/dao/mapping/AlarmRecordsMapper.xml +++ b/casic-alarm/src/main/java/com/casic/missiles/modular/system/dao/mapping/AlarmRecordsMapper.xml @@ -116,4 +116,12 @@ AND aj.ID = #{id} + + UPDATE alarm_records ar + + ar.status = 0 + + WHERE ar.devcode = #{devcode} and ar.alarm_type = #{alarmType} + + diff --git a/casic-alarm/src/main/java/com/casic/missiles/modular/system/dao/mapping/AlarmRuleMapper.xml b/casic-alarm/src/main/java/com/casic/missiles/modular/system/dao/mapping/AlarmRuleMapper.xml index 4743d51..20a0cc3 100644 --- a/casic-alarm/src/main/java/com/casic/missiles/modular/system/dao/mapping/AlarmRuleMapper.xml +++ b/casic-alarm/src/main/java/com/casic/missiles/modular/system/dao/mapping/AlarmRuleMapper.xml @@ -80,4 +80,9 @@ SELECT r.devcode FROM alarm_rule r) AND d.VALID=1 AND d.deviceType IN (2,6,8,10) + + diff --git a/casic-alarm/src/main/java/com/casic/missiles/modular/alarm/service/IAlarmRecordsService.java b/casic-alarm/src/main/java/com/casic/missiles/modular/alarm/service/IAlarmRecordsService.java index 1d00c2e..a0bd20d 100644 --- a/casic-alarm/src/main/java/com/casic/missiles/modular/alarm/service/IAlarmRecordsService.java +++ b/casic-alarm/src/main/java/com/casic/missiles/modular/alarm/service/IAlarmRecordsService.java @@ -23,4 +23,6 @@ List alarmListNoPage(DataScope dataScope, String keywords, String alarmType, String alarmContent,String beginTime, String endTime); boolean cancelAlarm(int id,String jobStatus, String handleMessage, long personId); + + Integer insertAlarmRecord(AlarmRecords alarmRec); } diff --git a/casic-alarm/src/main/java/com/casic/missiles/modular/alarm/service/IAlarmRuleService.java b/casic-alarm/src/main/java/com/casic/missiles/modular/alarm/service/IAlarmRuleService.java index a4b78e0..394f24f 100644 --- a/casic-alarm/src/main/java/com/casic/missiles/modular/alarm/service/IAlarmRuleService.java +++ b/casic-alarm/src/main/java/com/casic/missiles/modular/alarm/service/IAlarmRuleService.java @@ -23,4 +23,6 @@ boolean updateRule( int id, float highValue, float lowValue); List getNoAlarmDevice(DataScope dataScope); + AlarmRule selectAlarmRuleByDev(String devcode, String grade); + } diff --git a/casic-alarm/src/main/java/com/casic/missiles/modular/alarm/service/impl/AlarmRecordsServiceImpl.java b/casic-alarm/src/main/java/com/casic/missiles/modular/alarm/service/impl/AlarmRecordsServiceImpl.java index 8ff1739..7b510c6 100644 --- a/casic-alarm/src/main/java/com/casic/missiles/modular/alarm/service/impl/AlarmRecordsServiceImpl.java +++ b/casic-alarm/src/main/java/com/casic/missiles/modular/alarm/service/impl/AlarmRecordsServiceImpl.java @@ -52,4 +52,9 @@ return this.baseMapper.cancelAlarm(id,jobStatus,handleMessage,personId); } + @Override + public Integer insertAlarmRecord(AlarmRecords alarmRec) { + this.baseMapper.cancelAlarmByNewRecord(alarmRec.getDevcode(), alarmRec.getAlarmType()); + return this.baseMapper.insert(alarmRec); + } } diff --git a/casic-alarm/src/main/java/com/casic/missiles/modular/alarm/service/impl/AlarmRuleServiceImpl.java b/casic-alarm/src/main/java/com/casic/missiles/modular/alarm/service/impl/AlarmRuleServiceImpl.java index 234a66c..515a3d0 100644 --- a/casic-alarm/src/main/java/com/casic/missiles/modular/alarm/service/impl/AlarmRuleServiceImpl.java +++ b/casic-alarm/src/main/java/com/casic/missiles/modular/alarm/service/impl/AlarmRuleServiceImpl.java @@ -40,4 +40,9 @@ public List getNoAlarmDevice(DataScope dataScope) { return this.baseMapper.getNoAlarmDevice(dataScope); } + + @Override + public AlarmRule selectAlarmRuleByDev(String devcode, String grade) { + return this.baseMapper.selectAlarmRuleByDev(devcode, grade); + } } diff --git a/casic-alarm/src/main/java/com/casic/missiles/modular/system/controller/WaterMeterDataReceiver.java b/casic-alarm/src/main/java/com/casic/missiles/modular/system/controller/WaterMeterDataReceiver.java new file mode 100644 index 0000000..8ce1070 --- /dev/null +++ b/casic-alarm/src/main/java/com/casic/missiles/modular/system/controller/WaterMeterDataReceiver.java @@ -0,0 +1,150 @@ +package com.casic.missiles.modular.system.controller; + +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.modular.alarm.service.IAlarmRecordsService; +import com.casic.missiles.modular.alarm.service.IAlarmRuleService; +import com.casic.missiles.modular.system.dto.DeviceWellDto; +import com.casic.missiles.modular.system.model.AlarmRecords; +import com.casic.missiles.modular.system.model.AlarmRule; +import com.casic.missiles.modular.system.model.DataWaterMeter; +import com.casic.missiles.modular.system.model.Device; +import com.casic.missiles.modular.system.service.IDeviceService; +import com.casic.missiles.modular.system.service.IWaterMeterDataService; +import lombok.extern.java.Log; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import javax.annotation.Resource; +import java.text.DecimalFormat; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.Map; + +@Log +@Controller +@RequestMapping("/meter") +public class WaterMeterDataReceiver extends BaseController { + + @Resource + private IWaterMeterDataService waterMeterDataService; + + @Resource + private IDeviceService deviceService; + + @Resource + private IAlarmRuleService alarmRuleService; + @Resource + private IAlarmRecordsService alarmRecordsService; + + private DecimalFormat df2 = new DecimalFormat("0.00"); + + @RequestMapping(value = "/data/recv") + @ResponseBody + public Object dataRecv(@RequestBody(required = true) Map meterData) throws ParseException { + // 判断必填字段 + if (meterData.containsKey("MeterAddr") == false) { + return ResponseData.error("设备地址字段缺失"); + } + if (meterData.containsKey("MeterNumber") == false) { + return ResponseData.error("水表读数字段缺失"); + } + if (meterData.containsKey("ReadDate") == false) { + return ResponseData.error("上报时间字段缺失"); + } + + // 创建原始记录对象 + DataWaterMeter dataWaterMeter = new DataWaterMeter(); + + // 赋值设备地址 + String meterAddr = meterData.get("MeterAddr").toString(); + dataWaterMeter.setDevcode(meterAddr); + + // 赋值井编号 + DeviceWellDto wellDto = deviceService.selectWellByDevcode(meterAddr); + if (null == wellDto) { + log.info("没有找到" + meterAddr + "对应的井编号"); + return ResponseData.success(); + } + dataWaterMeter.setWellCode(wellDto.getWellCode()); + + // 能找到关联的井 则必然能找到设备 不判空 + Device device = deviceService.getDeviceByDevCode(meterAddr); + + // 赋值水表读数 + Double meterNumber = 0.0; + String numType = meterData.get("MeterNumber").getClass().getSimpleName(); + if (numType.equals("String")) { + meterNumber = Double.parseDouble(meterData.get("MeterNumber").toString()); + } else if (numType.equals("BigDecimal")) { + meterNumber = ((Number) meterData.get("MeterNumber")).doubleValue(); + } + dataWaterMeter.setFlowAcc(String.valueOf(meterNumber)); + + // 赋值数据采集时间 + String readDate = meterData.get("ReadDate").toString(); + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + dataWaterMeter.setUptime(sdf.parse(readDate)); + + // 赋值阀门状态 + if (meterData.containsKey("ValveStatus") == true) { + dataWaterMeter.setStatus(meterData.get("ValveStatus").toString()); + } + + dataWaterMeter.setLogtime(Calendar.getInstance().getTime()); + + // 保存到数据库 同时计算日/月用水量 + double flowAccToday = waterMeterDataService.saveWaterMeterData(dataWaterMeter); + + // 判断是否报警/预警 + AlarmRule alarmRule = alarmRuleService.selectAlarmRuleByDev(meterAddr, "1"); // 报警 + AlarmRule alarmRuleWarn = alarmRuleService.selectAlarmRuleByDev(meterAddr, "2"); // 预警 + if (null != alarmRule && null != alarmRule.getHighvalue()) { + if (flowAccToday - alarmRule.getHighvalue() > 0) { + // 超出报警阈值 生成一条报警消息 + AlarmRecords alarmRecord = new AlarmRecords(); + + alarmRecord.setDeviceId(device.getId()); + alarmRecord.setDevcode(meterAddr); + alarmRecord.setWellCode(wellDto.getWellCode()); + alarmRecord.setAlarmType("1"); // 业务报警 + alarmRecord.setAlarmContent("日用水量超阈值报警"); + alarmRecord.setAlarmValue(df2.format(flowAccToday)); + alarmRecord.setAlarmTime(Calendar.getInstance().getTime()); + alarmRecord.setStatus("1"); + alarmRecord.setAlarmMessage("日用水量超阈值报警"); + + alarmRecordsService.insertAlarmRecord(alarmRecord); + + // 向前端推送报警 + } else { + // 如果没有报警则判断是否预警 + if (null != alarmRuleWarn && null != alarmRuleWarn.getHighvalue()) { + if (flowAccToday - alarmRuleWarn.getHighvalue() > 0) { + // 超出预警阈值 生成一条预警消息 + AlarmRecords alarmRecord = new AlarmRecords(); + + alarmRecord.setDeviceId(device.getId()); + alarmRecord.setDevcode(meterAddr); + alarmRecord.setWellCode(wellDto.getWellCode()); + alarmRecord.setAlarmType("3"); // 业务报警 + alarmRecord.setAlarmContent("日用水量超阈值预警"); + alarmRecord.setAlarmValue(df2.format(flowAccToday)); + alarmRecord.setAlarmTime(Calendar.getInstance().getTime()); + alarmRecord.setStatus("1"); + alarmRecord.setAlarmMessage("日用水量超阈值预警"); + + alarmRecordsService.insertAlarmRecord(alarmRecord); + + // 向前端推送报警 + } + } + } + } + + return ResponseData.success(); + } +} diff --git a/casic-alarm/src/main/java/com/casic/missiles/modular/system/dao/AlarmRecordsMapper.java b/casic-alarm/src/main/java/com/casic/missiles/modular/system/dao/AlarmRecordsMapper.java index 408d5c6..a6f05c4 100644 --- a/casic-alarm/src/main/java/com/casic/missiles/modular/system/dao/AlarmRecordsMapper.java +++ b/casic-alarm/src/main/java/com/casic/missiles/modular/system/dao/AlarmRecordsMapper.java @@ -24,4 +24,6 @@ List alarmListNoPage(@Param("scope") DataScope dataScope, @Param("keywords") String keywords, @Param("alarmType") String alarmType, @Param("alarmContent") String alarmContent, @Param("beginTime") String beginTime, @Param("endTime") String endTime); boolean cancelAlarm(@Param("id") int id,@Param("jobStatus")String jobStatus,@Param("handleMessage") String handleMessage,@Param("personId") long personId); + + boolean cancelAlarmByNewRecord(@Param("devcode") String devcode, @Param("alarmType") String alarmType); } diff --git a/casic-alarm/src/main/java/com/casic/missiles/modular/system/dao/AlarmRuleMapper.java b/casic-alarm/src/main/java/com/casic/missiles/modular/system/dao/AlarmRuleMapper.java index da4f54c..00f33ee 100644 --- a/casic-alarm/src/main/java/com/casic/missiles/modular/system/dao/AlarmRuleMapper.java +++ b/casic-alarm/src/main/java/com/casic/missiles/modular/system/dao/AlarmRuleMapper.java @@ -23,4 +23,6 @@ List> ruleListViaParam(@Param("page") Page> page, @Param("keywords") String keywords, @Param("deviceType") String deviceType,@Param("dataScope") DataScope dataScope); boolean updateRule(@Param("id") int id,@Param("highValue") float highValue,@Param("lowValue") float lowValue); List getNoAlarmDevice(@Param("dataScope") DataScope dataScope); + + AlarmRule selectAlarmRuleByDev(@Param("devcode") String devcode, @Param("grade") String grade); } diff --git a/casic-alarm/src/main/java/com/casic/missiles/modular/system/dao/mapping/AlarmRecordsMapper.xml b/casic-alarm/src/main/java/com/casic/missiles/modular/system/dao/mapping/AlarmRecordsMapper.xml index d9cfd1e..73047da 100644 --- a/casic-alarm/src/main/java/com/casic/missiles/modular/system/dao/mapping/AlarmRecordsMapper.xml +++ b/casic-alarm/src/main/java/com/casic/missiles/modular/system/dao/mapping/AlarmRecordsMapper.xml @@ -116,4 +116,12 @@ AND aj.ID = #{id} + + UPDATE alarm_records ar + + ar.status = 0 + + WHERE ar.devcode = #{devcode} and ar.alarm_type = #{alarmType} + + diff --git a/casic-alarm/src/main/java/com/casic/missiles/modular/system/dao/mapping/AlarmRuleMapper.xml b/casic-alarm/src/main/java/com/casic/missiles/modular/system/dao/mapping/AlarmRuleMapper.xml index 4743d51..20a0cc3 100644 --- a/casic-alarm/src/main/java/com/casic/missiles/modular/system/dao/mapping/AlarmRuleMapper.xml +++ b/casic-alarm/src/main/java/com/casic/missiles/modular/system/dao/mapping/AlarmRuleMapper.xml @@ -80,4 +80,9 @@ SELECT r.devcode FROM alarm_rule r) AND d.VALID=1 AND d.deviceType IN (2,6,8,10) + + diff --git a/casic-alarm/src/main/java/com/casic/missiles/modular/system/model/AlarmRecords.java b/casic-alarm/src/main/java/com/casic/missiles/modular/system/model/AlarmRecords.java index 7ffdcc6..2d4f5ed 100644 --- a/casic-alarm/src/main/java/com/casic/missiles/modular/system/model/AlarmRecords.java +++ b/casic-alarm/src/main/java/com/casic/missiles/modular/system/model/AlarmRecords.java @@ -26,7 +26,7 @@ * 主键 */ @TableId(value = "ID", type = IdType.AUTO) - private Integer id; + private Long id; /** * 设备ID */ @@ -96,11 +96,11 @@ this.jobStatus = jobStatus; } - public Integer getId() { + public Long getId() { return id; } - public void setId(Integer id) { + public void setId(Long id) { this.id = id; } diff --git a/casic-alarm/src/main/java/com/casic/missiles/modular/alarm/service/IAlarmRecordsService.java b/casic-alarm/src/main/java/com/casic/missiles/modular/alarm/service/IAlarmRecordsService.java index 1d00c2e..a0bd20d 100644 --- a/casic-alarm/src/main/java/com/casic/missiles/modular/alarm/service/IAlarmRecordsService.java +++ b/casic-alarm/src/main/java/com/casic/missiles/modular/alarm/service/IAlarmRecordsService.java @@ -23,4 +23,6 @@ List alarmListNoPage(DataScope dataScope, String keywords, String alarmType, String alarmContent,String beginTime, String endTime); boolean cancelAlarm(int id,String jobStatus, String handleMessage, long personId); + + Integer insertAlarmRecord(AlarmRecords alarmRec); } diff --git a/casic-alarm/src/main/java/com/casic/missiles/modular/alarm/service/IAlarmRuleService.java b/casic-alarm/src/main/java/com/casic/missiles/modular/alarm/service/IAlarmRuleService.java index a4b78e0..394f24f 100644 --- a/casic-alarm/src/main/java/com/casic/missiles/modular/alarm/service/IAlarmRuleService.java +++ b/casic-alarm/src/main/java/com/casic/missiles/modular/alarm/service/IAlarmRuleService.java @@ -23,4 +23,6 @@ boolean updateRule( int id, float highValue, float lowValue); List getNoAlarmDevice(DataScope dataScope); + AlarmRule selectAlarmRuleByDev(String devcode, String grade); + } diff --git a/casic-alarm/src/main/java/com/casic/missiles/modular/alarm/service/impl/AlarmRecordsServiceImpl.java b/casic-alarm/src/main/java/com/casic/missiles/modular/alarm/service/impl/AlarmRecordsServiceImpl.java index 8ff1739..7b510c6 100644 --- a/casic-alarm/src/main/java/com/casic/missiles/modular/alarm/service/impl/AlarmRecordsServiceImpl.java +++ b/casic-alarm/src/main/java/com/casic/missiles/modular/alarm/service/impl/AlarmRecordsServiceImpl.java @@ -52,4 +52,9 @@ return this.baseMapper.cancelAlarm(id,jobStatus,handleMessage,personId); } + @Override + public Integer insertAlarmRecord(AlarmRecords alarmRec) { + this.baseMapper.cancelAlarmByNewRecord(alarmRec.getDevcode(), alarmRec.getAlarmType()); + return this.baseMapper.insert(alarmRec); + } } diff --git a/casic-alarm/src/main/java/com/casic/missiles/modular/alarm/service/impl/AlarmRuleServiceImpl.java b/casic-alarm/src/main/java/com/casic/missiles/modular/alarm/service/impl/AlarmRuleServiceImpl.java index 234a66c..515a3d0 100644 --- a/casic-alarm/src/main/java/com/casic/missiles/modular/alarm/service/impl/AlarmRuleServiceImpl.java +++ b/casic-alarm/src/main/java/com/casic/missiles/modular/alarm/service/impl/AlarmRuleServiceImpl.java @@ -40,4 +40,9 @@ public List getNoAlarmDevice(DataScope dataScope) { return this.baseMapper.getNoAlarmDevice(dataScope); } + + @Override + public AlarmRule selectAlarmRuleByDev(String devcode, String grade) { + return this.baseMapper.selectAlarmRuleByDev(devcode, grade); + } } diff --git a/casic-alarm/src/main/java/com/casic/missiles/modular/system/controller/WaterMeterDataReceiver.java b/casic-alarm/src/main/java/com/casic/missiles/modular/system/controller/WaterMeterDataReceiver.java new file mode 100644 index 0000000..8ce1070 --- /dev/null +++ b/casic-alarm/src/main/java/com/casic/missiles/modular/system/controller/WaterMeterDataReceiver.java @@ -0,0 +1,150 @@ +package com.casic.missiles.modular.system.controller; + +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.modular.alarm.service.IAlarmRecordsService; +import com.casic.missiles.modular.alarm.service.IAlarmRuleService; +import com.casic.missiles.modular.system.dto.DeviceWellDto; +import com.casic.missiles.modular.system.model.AlarmRecords; +import com.casic.missiles.modular.system.model.AlarmRule; +import com.casic.missiles.modular.system.model.DataWaterMeter; +import com.casic.missiles.modular.system.model.Device; +import com.casic.missiles.modular.system.service.IDeviceService; +import com.casic.missiles.modular.system.service.IWaterMeterDataService; +import lombok.extern.java.Log; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import javax.annotation.Resource; +import java.text.DecimalFormat; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.Map; + +@Log +@Controller +@RequestMapping("/meter") +public class WaterMeterDataReceiver extends BaseController { + + @Resource + private IWaterMeterDataService waterMeterDataService; + + @Resource + private IDeviceService deviceService; + + @Resource + private IAlarmRuleService alarmRuleService; + @Resource + private IAlarmRecordsService alarmRecordsService; + + private DecimalFormat df2 = new DecimalFormat("0.00"); + + @RequestMapping(value = "/data/recv") + @ResponseBody + public Object dataRecv(@RequestBody(required = true) Map meterData) throws ParseException { + // 判断必填字段 + if (meterData.containsKey("MeterAddr") == false) { + return ResponseData.error("设备地址字段缺失"); + } + if (meterData.containsKey("MeterNumber") == false) { + return ResponseData.error("水表读数字段缺失"); + } + if (meterData.containsKey("ReadDate") == false) { + return ResponseData.error("上报时间字段缺失"); + } + + // 创建原始记录对象 + DataWaterMeter dataWaterMeter = new DataWaterMeter(); + + // 赋值设备地址 + String meterAddr = meterData.get("MeterAddr").toString(); + dataWaterMeter.setDevcode(meterAddr); + + // 赋值井编号 + DeviceWellDto wellDto = deviceService.selectWellByDevcode(meterAddr); + if (null == wellDto) { + log.info("没有找到" + meterAddr + "对应的井编号"); + return ResponseData.success(); + } + dataWaterMeter.setWellCode(wellDto.getWellCode()); + + // 能找到关联的井 则必然能找到设备 不判空 + Device device = deviceService.getDeviceByDevCode(meterAddr); + + // 赋值水表读数 + Double meterNumber = 0.0; + String numType = meterData.get("MeterNumber").getClass().getSimpleName(); + if (numType.equals("String")) { + meterNumber = Double.parseDouble(meterData.get("MeterNumber").toString()); + } else if (numType.equals("BigDecimal")) { + meterNumber = ((Number) meterData.get("MeterNumber")).doubleValue(); + } + dataWaterMeter.setFlowAcc(String.valueOf(meterNumber)); + + // 赋值数据采集时间 + String readDate = meterData.get("ReadDate").toString(); + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + dataWaterMeter.setUptime(sdf.parse(readDate)); + + // 赋值阀门状态 + if (meterData.containsKey("ValveStatus") == true) { + dataWaterMeter.setStatus(meterData.get("ValveStatus").toString()); + } + + dataWaterMeter.setLogtime(Calendar.getInstance().getTime()); + + // 保存到数据库 同时计算日/月用水量 + double flowAccToday = waterMeterDataService.saveWaterMeterData(dataWaterMeter); + + // 判断是否报警/预警 + AlarmRule alarmRule = alarmRuleService.selectAlarmRuleByDev(meterAddr, "1"); // 报警 + AlarmRule alarmRuleWarn = alarmRuleService.selectAlarmRuleByDev(meterAddr, "2"); // 预警 + if (null != alarmRule && null != alarmRule.getHighvalue()) { + if (flowAccToday - alarmRule.getHighvalue() > 0) { + // 超出报警阈值 生成一条报警消息 + AlarmRecords alarmRecord = new AlarmRecords(); + + alarmRecord.setDeviceId(device.getId()); + alarmRecord.setDevcode(meterAddr); + alarmRecord.setWellCode(wellDto.getWellCode()); + alarmRecord.setAlarmType("1"); // 业务报警 + alarmRecord.setAlarmContent("日用水量超阈值报警"); + alarmRecord.setAlarmValue(df2.format(flowAccToday)); + alarmRecord.setAlarmTime(Calendar.getInstance().getTime()); + alarmRecord.setStatus("1"); + alarmRecord.setAlarmMessage("日用水量超阈值报警"); + + alarmRecordsService.insertAlarmRecord(alarmRecord); + + // 向前端推送报警 + } else { + // 如果没有报警则判断是否预警 + if (null != alarmRuleWarn && null != alarmRuleWarn.getHighvalue()) { + if (flowAccToday - alarmRuleWarn.getHighvalue() > 0) { + // 超出预警阈值 生成一条预警消息 + AlarmRecords alarmRecord = new AlarmRecords(); + + alarmRecord.setDeviceId(device.getId()); + alarmRecord.setDevcode(meterAddr); + alarmRecord.setWellCode(wellDto.getWellCode()); + alarmRecord.setAlarmType("3"); // 业务报警 + alarmRecord.setAlarmContent("日用水量超阈值预警"); + alarmRecord.setAlarmValue(df2.format(flowAccToday)); + alarmRecord.setAlarmTime(Calendar.getInstance().getTime()); + alarmRecord.setStatus("1"); + alarmRecord.setAlarmMessage("日用水量超阈值预警"); + + alarmRecordsService.insertAlarmRecord(alarmRecord); + + // 向前端推送报警 + } + } + } + } + + return ResponseData.success(); + } +} diff --git a/casic-alarm/src/main/java/com/casic/missiles/modular/system/dao/AlarmRecordsMapper.java b/casic-alarm/src/main/java/com/casic/missiles/modular/system/dao/AlarmRecordsMapper.java index 408d5c6..a6f05c4 100644 --- a/casic-alarm/src/main/java/com/casic/missiles/modular/system/dao/AlarmRecordsMapper.java +++ b/casic-alarm/src/main/java/com/casic/missiles/modular/system/dao/AlarmRecordsMapper.java @@ -24,4 +24,6 @@ List alarmListNoPage(@Param("scope") DataScope dataScope, @Param("keywords") String keywords, @Param("alarmType") String alarmType, @Param("alarmContent") String alarmContent, @Param("beginTime") String beginTime, @Param("endTime") String endTime); boolean cancelAlarm(@Param("id") int id,@Param("jobStatus")String jobStatus,@Param("handleMessage") String handleMessage,@Param("personId") long personId); + + boolean cancelAlarmByNewRecord(@Param("devcode") String devcode, @Param("alarmType") String alarmType); } diff --git a/casic-alarm/src/main/java/com/casic/missiles/modular/system/dao/AlarmRuleMapper.java b/casic-alarm/src/main/java/com/casic/missiles/modular/system/dao/AlarmRuleMapper.java index da4f54c..00f33ee 100644 --- a/casic-alarm/src/main/java/com/casic/missiles/modular/system/dao/AlarmRuleMapper.java +++ b/casic-alarm/src/main/java/com/casic/missiles/modular/system/dao/AlarmRuleMapper.java @@ -23,4 +23,6 @@ List> ruleListViaParam(@Param("page") Page> page, @Param("keywords") String keywords, @Param("deviceType") String deviceType,@Param("dataScope") DataScope dataScope); boolean updateRule(@Param("id") int id,@Param("highValue") float highValue,@Param("lowValue") float lowValue); List getNoAlarmDevice(@Param("dataScope") DataScope dataScope); + + AlarmRule selectAlarmRuleByDev(@Param("devcode") String devcode, @Param("grade") String grade); } diff --git a/casic-alarm/src/main/java/com/casic/missiles/modular/system/dao/mapping/AlarmRecordsMapper.xml b/casic-alarm/src/main/java/com/casic/missiles/modular/system/dao/mapping/AlarmRecordsMapper.xml index d9cfd1e..73047da 100644 --- a/casic-alarm/src/main/java/com/casic/missiles/modular/system/dao/mapping/AlarmRecordsMapper.xml +++ b/casic-alarm/src/main/java/com/casic/missiles/modular/system/dao/mapping/AlarmRecordsMapper.xml @@ -116,4 +116,12 @@ AND aj.ID = #{id} + + UPDATE alarm_records ar + + ar.status = 0 + + WHERE ar.devcode = #{devcode} and ar.alarm_type = #{alarmType} + + diff --git a/casic-alarm/src/main/java/com/casic/missiles/modular/system/dao/mapping/AlarmRuleMapper.xml b/casic-alarm/src/main/java/com/casic/missiles/modular/system/dao/mapping/AlarmRuleMapper.xml index 4743d51..20a0cc3 100644 --- a/casic-alarm/src/main/java/com/casic/missiles/modular/system/dao/mapping/AlarmRuleMapper.xml +++ b/casic-alarm/src/main/java/com/casic/missiles/modular/system/dao/mapping/AlarmRuleMapper.xml @@ -80,4 +80,9 @@ SELECT r.devcode FROM alarm_rule r) AND d.VALID=1 AND d.deviceType IN (2,6,8,10) + + diff --git a/casic-alarm/src/main/java/com/casic/missiles/modular/system/model/AlarmRecords.java b/casic-alarm/src/main/java/com/casic/missiles/modular/system/model/AlarmRecords.java index 7ffdcc6..2d4f5ed 100644 --- a/casic-alarm/src/main/java/com/casic/missiles/modular/system/model/AlarmRecords.java +++ b/casic-alarm/src/main/java/com/casic/missiles/modular/system/model/AlarmRecords.java @@ -26,7 +26,7 @@ * 主键 */ @TableId(value = "ID", type = IdType.AUTO) - private Integer id; + private Long id; /** * 设备ID */ @@ -96,11 +96,11 @@ this.jobStatus = jobStatus; } - public Integer getId() { + public Long getId() { return id; } - public void setId(Integer id) { + public void setId(Long id) { this.id = id; } diff --git a/casic-device/src/main/java/com/casic/missiles/modular/system/controller/WaterMeterDataReceiver.java b/casic-device/src/main/java/com/casic/missiles/modular/system/controller/WaterMeterDataReceiver.java deleted file mode 100644 index 335cd41..0000000 --- a/casic-device/src/main/java/com/casic/missiles/modular/system/controller/WaterMeterDataReceiver.java +++ /dev/null @@ -1,89 +0,0 @@ -package com.casic.missiles.modular.system.controller; - -import com.casic.missiles.core.base.controller.BaseController; -import com.casic.missiles.core.base.response.ResponseData; -import com.casic.missiles.modular.system.dto.DeviceWellDto; -import com.casic.missiles.modular.system.model.DataWaterMeter; -import com.casic.missiles.modular.system.service.IDeviceService; -import com.casic.missiles.modular.system.service.IWaterMeterDataService; -import lombok.extern.java.Log; -import org.springframework.stereotype.Controller; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.ResponseBody; - -import javax.annotation.Resource; -import java.text.ParseException; -import java.text.SimpleDateFormat; -import java.util.Calendar; -import java.util.Map; -import java.util.logging.Level; - -@Log -@Controller -@RequestMapping("/meter") -public class WaterMeterDataReceiver extends BaseController { - - @Resource - private IWaterMeterDataService waterMeterDataService; - - @Resource - private IDeviceService deviceService; - - @RequestMapping(value = "/data/recv") - @ResponseBody - public Object dataRecv(@RequestBody(required = true) Map meterData) throws ParseException { - // 判断必填字段 - if (meterData.containsKey("MeterAddr") == false) { - return ResponseData.error("设备地址字段缺失"); - } - if (meterData.containsKey("MeterNumber") == false) { - return ResponseData.error("水表读数字段缺失"); - } - if (meterData.containsKey("ReadDate") == false) { - return ResponseData.error("上报时间字段缺失"); - } - - // 创建原始记录对象 - DataWaterMeter dataWaterMeter = new DataWaterMeter(); - - // 赋值设备地址 - String meterAddr = meterData.get("MeterAddr").toString(); - dataWaterMeter.setDevcode(meterAddr); - - // 赋值井编号 - DeviceWellDto wellDto = deviceService.selectWellByDevcode(meterAddr); - if (null == wellDto) { - log.info("没有找到" + meterAddr + "对应的井编号"); - return ResponseData.success(); - } - dataWaterMeter.setWellCode(wellDto.getWellCode()); - - // 赋值水表读数 - Double meterNumber = 0.0; - String numType = meterData.get("MeterNumber").getClass().getSimpleName(); - if (numType.equals("String")) { - meterNumber = Double.parseDouble(meterData.get("MeterNumber").toString()); - } else if (numType.equals("BigDecimal")) { - meterNumber = ((Number) meterData.get("MeterNumber")).doubleValue(); - } - dataWaterMeter.setFlowAcc(String.valueOf(meterNumber)); - - // 赋值数据采集时间 - String readDate = meterData.get("ReadDate").toString(); - SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); - dataWaterMeter.setUptime(sdf.parse(readDate)); - - // 赋值阀门状态 - if (meterData.containsKey("ValveStatus") == true) { - dataWaterMeter.setStatus(meterData.get("ValveStatus").toString()); - } - - dataWaterMeter.setLogtime(Calendar.getInstance().getTime()); - - // 保存到数据库 同时计算日/月用水量 - waterMeterDataService.saveWaterMeterData(dataWaterMeter); - - return ResponseData.success(); - } -} diff --git a/casic-alarm/src/main/java/com/casic/missiles/modular/alarm/service/IAlarmRecordsService.java b/casic-alarm/src/main/java/com/casic/missiles/modular/alarm/service/IAlarmRecordsService.java index 1d00c2e..a0bd20d 100644 --- a/casic-alarm/src/main/java/com/casic/missiles/modular/alarm/service/IAlarmRecordsService.java +++ b/casic-alarm/src/main/java/com/casic/missiles/modular/alarm/service/IAlarmRecordsService.java @@ -23,4 +23,6 @@ List alarmListNoPage(DataScope dataScope, String keywords, String alarmType, String alarmContent,String beginTime, String endTime); boolean cancelAlarm(int id,String jobStatus, String handleMessage, long personId); + + Integer insertAlarmRecord(AlarmRecords alarmRec); } diff --git a/casic-alarm/src/main/java/com/casic/missiles/modular/alarm/service/IAlarmRuleService.java b/casic-alarm/src/main/java/com/casic/missiles/modular/alarm/service/IAlarmRuleService.java index a4b78e0..394f24f 100644 --- a/casic-alarm/src/main/java/com/casic/missiles/modular/alarm/service/IAlarmRuleService.java +++ b/casic-alarm/src/main/java/com/casic/missiles/modular/alarm/service/IAlarmRuleService.java @@ -23,4 +23,6 @@ boolean updateRule( int id, float highValue, float lowValue); List getNoAlarmDevice(DataScope dataScope); + AlarmRule selectAlarmRuleByDev(String devcode, String grade); + } diff --git a/casic-alarm/src/main/java/com/casic/missiles/modular/alarm/service/impl/AlarmRecordsServiceImpl.java b/casic-alarm/src/main/java/com/casic/missiles/modular/alarm/service/impl/AlarmRecordsServiceImpl.java index 8ff1739..7b510c6 100644 --- a/casic-alarm/src/main/java/com/casic/missiles/modular/alarm/service/impl/AlarmRecordsServiceImpl.java +++ b/casic-alarm/src/main/java/com/casic/missiles/modular/alarm/service/impl/AlarmRecordsServiceImpl.java @@ -52,4 +52,9 @@ return this.baseMapper.cancelAlarm(id,jobStatus,handleMessage,personId); } + @Override + public Integer insertAlarmRecord(AlarmRecords alarmRec) { + this.baseMapper.cancelAlarmByNewRecord(alarmRec.getDevcode(), alarmRec.getAlarmType()); + return this.baseMapper.insert(alarmRec); + } } diff --git a/casic-alarm/src/main/java/com/casic/missiles/modular/alarm/service/impl/AlarmRuleServiceImpl.java b/casic-alarm/src/main/java/com/casic/missiles/modular/alarm/service/impl/AlarmRuleServiceImpl.java index 234a66c..515a3d0 100644 --- a/casic-alarm/src/main/java/com/casic/missiles/modular/alarm/service/impl/AlarmRuleServiceImpl.java +++ b/casic-alarm/src/main/java/com/casic/missiles/modular/alarm/service/impl/AlarmRuleServiceImpl.java @@ -40,4 +40,9 @@ public List getNoAlarmDevice(DataScope dataScope) { return this.baseMapper.getNoAlarmDevice(dataScope); } + + @Override + public AlarmRule selectAlarmRuleByDev(String devcode, String grade) { + return this.baseMapper.selectAlarmRuleByDev(devcode, grade); + } } diff --git a/casic-alarm/src/main/java/com/casic/missiles/modular/system/controller/WaterMeterDataReceiver.java b/casic-alarm/src/main/java/com/casic/missiles/modular/system/controller/WaterMeterDataReceiver.java new file mode 100644 index 0000000..8ce1070 --- /dev/null +++ b/casic-alarm/src/main/java/com/casic/missiles/modular/system/controller/WaterMeterDataReceiver.java @@ -0,0 +1,150 @@ +package com.casic.missiles.modular.system.controller; + +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.modular.alarm.service.IAlarmRecordsService; +import com.casic.missiles.modular.alarm.service.IAlarmRuleService; +import com.casic.missiles.modular.system.dto.DeviceWellDto; +import com.casic.missiles.modular.system.model.AlarmRecords; +import com.casic.missiles.modular.system.model.AlarmRule; +import com.casic.missiles.modular.system.model.DataWaterMeter; +import com.casic.missiles.modular.system.model.Device; +import com.casic.missiles.modular.system.service.IDeviceService; +import com.casic.missiles.modular.system.service.IWaterMeterDataService; +import lombok.extern.java.Log; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import javax.annotation.Resource; +import java.text.DecimalFormat; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.Map; + +@Log +@Controller +@RequestMapping("/meter") +public class WaterMeterDataReceiver extends BaseController { + + @Resource + private IWaterMeterDataService waterMeterDataService; + + @Resource + private IDeviceService deviceService; + + @Resource + private IAlarmRuleService alarmRuleService; + @Resource + private IAlarmRecordsService alarmRecordsService; + + private DecimalFormat df2 = new DecimalFormat("0.00"); + + @RequestMapping(value = "/data/recv") + @ResponseBody + public Object dataRecv(@RequestBody(required = true) Map meterData) throws ParseException { + // 判断必填字段 + if (meterData.containsKey("MeterAddr") == false) { + return ResponseData.error("设备地址字段缺失"); + } + if (meterData.containsKey("MeterNumber") == false) { + return ResponseData.error("水表读数字段缺失"); + } + if (meterData.containsKey("ReadDate") == false) { + return ResponseData.error("上报时间字段缺失"); + } + + // 创建原始记录对象 + DataWaterMeter dataWaterMeter = new DataWaterMeter(); + + // 赋值设备地址 + String meterAddr = meterData.get("MeterAddr").toString(); + dataWaterMeter.setDevcode(meterAddr); + + // 赋值井编号 + DeviceWellDto wellDto = deviceService.selectWellByDevcode(meterAddr); + if (null == wellDto) { + log.info("没有找到" + meterAddr + "对应的井编号"); + return ResponseData.success(); + } + dataWaterMeter.setWellCode(wellDto.getWellCode()); + + // 能找到关联的井 则必然能找到设备 不判空 + Device device = deviceService.getDeviceByDevCode(meterAddr); + + // 赋值水表读数 + Double meterNumber = 0.0; + String numType = meterData.get("MeterNumber").getClass().getSimpleName(); + if (numType.equals("String")) { + meterNumber = Double.parseDouble(meterData.get("MeterNumber").toString()); + } else if (numType.equals("BigDecimal")) { + meterNumber = ((Number) meterData.get("MeterNumber")).doubleValue(); + } + dataWaterMeter.setFlowAcc(String.valueOf(meterNumber)); + + // 赋值数据采集时间 + String readDate = meterData.get("ReadDate").toString(); + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + dataWaterMeter.setUptime(sdf.parse(readDate)); + + // 赋值阀门状态 + if (meterData.containsKey("ValveStatus") == true) { + dataWaterMeter.setStatus(meterData.get("ValveStatus").toString()); + } + + dataWaterMeter.setLogtime(Calendar.getInstance().getTime()); + + // 保存到数据库 同时计算日/月用水量 + double flowAccToday = waterMeterDataService.saveWaterMeterData(dataWaterMeter); + + // 判断是否报警/预警 + AlarmRule alarmRule = alarmRuleService.selectAlarmRuleByDev(meterAddr, "1"); // 报警 + AlarmRule alarmRuleWarn = alarmRuleService.selectAlarmRuleByDev(meterAddr, "2"); // 预警 + if (null != alarmRule && null != alarmRule.getHighvalue()) { + if (flowAccToday - alarmRule.getHighvalue() > 0) { + // 超出报警阈值 生成一条报警消息 + AlarmRecords alarmRecord = new AlarmRecords(); + + alarmRecord.setDeviceId(device.getId()); + alarmRecord.setDevcode(meterAddr); + alarmRecord.setWellCode(wellDto.getWellCode()); + alarmRecord.setAlarmType("1"); // 业务报警 + alarmRecord.setAlarmContent("日用水量超阈值报警"); + alarmRecord.setAlarmValue(df2.format(flowAccToday)); + alarmRecord.setAlarmTime(Calendar.getInstance().getTime()); + alarmRecord.setStatus("1"); + alarmRecord.setAlarmMessage("日用水量超阈值报警"); + + alarmRecordsService.insertAlarmRecord(alarmRecord); + + // 向前端推送报警 + } else { + // 如果没有报警则判断是否预警 + if (null != alarmRuleWarn && null != alarmRuleWarn.getHighvalue()) { + if (flowAccToday - alarmRuleWarn.getHighvalue() > 0) { + // 超出预警阈值 生成一条预警消息 + AlarmRecords alarmRecord = new AlarmRecords(); + + alarmRecord.setDeviceId(device.getId()); + alarmRecord.setDevcode(meterAddr); + alarmRecord.setWellCode(wellDto.getWellCode()); + alarmRecord.setAlarmType("3"); // 业务报警 + alarmRecord.setAlarmContent("日用水量超阈值预警"); + alarmRecord.setAlarmValue(df2.format(flowAccToday)); + alarmRecord.setAlarmTime(Calendar.getInstance().getTime()); + alarmRecord.setStatus("1"); + alarmRecord.setAlarmMessage("日用水量超阈值预警"); + + alarmRecordsService.insertAlarmRecord(alarmRecord); + + // 向前端推送报警 + } + } + } + } + + return ResponseData.success(); + } +} diff --git a/casic-alarm/src/main/java/com/casic/missiles/modular/system/dao/AlarmRecordsMapper.java b/casic-alarm/src/main/java/com/casic/missiles/modular/system/dao/AlarmRecordsMapper.java index 408d5c6..a6f05c4 100644 --- a/casic-alarm/src/main/java/com/casic/missiles/modular/system/dao/AlarmRecordsMapper.java +++ b/casic-alarm/src/main/java/com/casic/missiles/modular/system/dao/AlarmRecordsMapper.java @@ -24,4 +24,6 @@ List alarmListNoPage(@Param("scope") DataScope dataScope, @Param("keywords") String keywords, @Param("alarmType") String alarmType, @Param("alarmContent") String alarmContent, @Param("beginTime") String beginTime, @Param("endTime") String endTime); boolean cancelAlarm(@Param("id") int id,@Param("jobStatus")String jobStatus,@Param("handleMessage") String handleMessage,@Param("personId") long personId); + + boolean cancelAlarmByNewRecord(@Param("devcode") String devcode, @Param("alarmType") String alarmType); } diff --git a/casic-alarm/src/main/java/com/casic/missiles/modular/system/dao/AlarmRuleMapper.java b/casic-alarm/src/main/java/com/casic/missiles/modular/system/dao/AlarmRuleMapper.java index da4f54c..00f33ee 100644 --- a/casic-alarm/src/main/java/com/casic/missiles/modular/system/dao/AlarmRuleMapper.java +++ b/casic-alarm/src/main/java/com/casic/missiles/modular/system/dao/AlarmRuleMapper.java @@ -23,4 +23,6 @@ List> ruleListViaParam(@Param("page") Page> page, @Param("keywords") String keywords, @Param("deviceType") String deviceType,@Param("dataScope") DataScope dataScope); boolean updateRule(@Param("id") int id,@Param("highValue") float highValue,@Param("lowValue") float lowValue); List getNoAlarmDevice(@Param("dataScope") DataScope dataScope); + + AlarmRule selectAlarmRuleByDev(@Param("devcode") String devcode, @Param("grade") String grade); } diff --git a/casic-alarm/src/main/java/com/casic/missiles/modular/system/dao/mapping/AlarmRecordsMapper.xml b/casic-alarm/src/main/java/com/casic/missiles/modular/system/dao/mapping/AlarmRecordsMapper.xml index d9cfd1e..73047da 100644 --- a/casic-alarm/src/main/java/com/casic/missiles/modular/system/dao/mapping/AlarmRecordsMapper.xml +++ b/casic-alarm/src/main/java/com/casic/missiles/modular/system/dao/mapping/AlarmRecordsMapper.xml @@ -116,4 +116,12 @@ AND aj.ID = #{id} + + UPDATE alarm_records ar + + ar.status = 0 + + WHERE ar.devcode = #{devcode} and ar.alarm_type = #{alarmType} + + diff --git a/casic-alarm/src/main/java/com/casic/missiles/modular/system/dao/mapping/AlarmRuleMapper.xml b/casic-alarm/src/main/java/com/casic/missiles/modular/system/dao/mapping/AlarmRuleMapper.xml index 4743d51..20a0cc3 100644 --- a/casic-alarm/src/main/java/com/casic/missiles/modular/system/dao/mapping/AlarmRuleMapper.xml +++ b/casic-alarm/src/main/java/com/casic/missiles/modular/system/dao/mapping/AlarmRuleMapper.xml @@ -80,4 +80,9 @@ SELECT r.devcode FROM alarm_rule r) AND d.VALID=1 AND d.deviceType IN (2,6,8,10) + + diff --git a/casic-alarm/src/main/java/com/casic/missiles/modular/system/model/AlarmRecords.java b/casic-alarm/src/main/java/com/casic/missiles/modular/system/model/AlarmRecords.java index 7ffdcc6..2d4f5ed 100644 --- a/casic-alarm/src/main/java/com/casic/missiles/modular/system/model/AlarmRecords.java +++ b/casic-alarm/src/main/java/com/casic/missiles/modular/system/model/AlarmRecords.java @@ -26,7 +26,7 @@ * 主键 */ @TableId(value = "ID", type = IdType.AUTO) - private Integer id; + private Long id; /** * 设备ID */ @@ -96,11 +96,11 @@ this.jobStatus = jobStatus; } - public Integer getId() { + public Long getId() { return id; } - public void setId(Integer id) { + public void setId(Long id) { this.id = id; } diff --git a/casic-device/src/main/java/com/casic/missiles/modular/system/controller/WaterMeterDataReceiver.java b/casic-device/src/main/java/com/casic/missiles/modular/system/controller/WaterMeterDataReceiver.java deleted file mode 100644 index 335cd41..0000000 --- a/casic-device/src/main/java/com/casic/missiles/modular/system/controller/WaterMeterDataReceiver.java +++ /dev/null @@ -1,89 +0,0 @@ -package com.casic.missiles.modular.system.controller; - -import com.casic.missiles.core.base.controller.BaseController; -import com.casic.missiles.core.base.response.ResponseData; -import com.casic.missiles.modular.system.dto.DeviceWellDto; -import com.casic.missiles.modular.system.model.DataWaterMeter; -import com.casic.missiles.modular.system.service.IDeviceService; -import com.casic.missiles.modular.system.service.IWaterMeterDataService; -import lombok.extern.java.Log; -import org.springframework.stereotype.Controller; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.ResponseBody; - -import javax.annotation.Resource; -import java.text.ParseException; -import java.text.SimpleDateFormat; -import java.util.Calendar; -import java.util.Map; -import java.util.logging.Level; - -@Log -@Controller -@RequestMapping("/meter") -public class WaterMeterDataReceiver extends BaseController { - - @Resource - private IWaterMeterDataService waterMeterDataService; - - @Resource - private IDeviceService deviceService; - - @RequestMapping(value = "/data/recv") - @ResponseBody - public Object dataRecv(@RequestBody(required = true) Map meterData) throws ParseException { - // 判断必填字段 - if (meterData.containsKey("MeterAddr") == false) { - return ResponseData.error("设备地址字段缺失"); - } - if (meterData.containsKey("MeterNumber") == false) { - return ResponseData.error("水表读数字段缺失"); - } - if (meterData.containsKey("ReadDate") == false) { - return ResponseData.error("上报时间字段缺失"); - } - - // 创建原始记录对象 - DataWaterMeter dataWaterMeter = new DataWaterMeter(); - - // 赋值设备地址 - String meterAddr = meterData.get("MeterAddr").toString(); - dataWaterMeter.setDevcode(meterAddr); - - // 赋值井编号 - DeviceWellDto wellDto = deviceService.selectWellByDevcode(meterAddr); - if (null == wellDto) { - log.info("没有找到" + meterAddr + "对应的井编号"); - return ResponseData.success(); - } - dataWaterMeter.setWellCode(wellDto.getWellCode()); - - // 赋值水表读数 - Double meterNumber = 0.0; - String numType = meterData.get("MeterNumber").getClass().getSimpleName(); - if (numType.equals("String")) { - meterNumber = Double.parseDouble(meterData.get("MeterNumber").toString()); - } else if (numType.equals("BigDecimal")) { - meterNumber = ((Number) meterData.get("MeterNumber")).doubleValue(); - } - dataWaterMeter.setFlowAcc(String.valueOf(meterNumber)); - - // 赋值数据采集时间 - String readDate = meterData.get("ReadDate").toString(); - SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); - dataWaterMeter.setUptime(sdf.parse(readDate)); - - // 赋值阀门状态 - if (meterData.containsKey("ValveStatus") == true) { - dataWaterMeter.setStatus(meterData.get("ValveStatus").toString()); - } - - dataWaterMeter.setLogtime(Calendar.getInstance().getTime()); - - // 保存到数据库 同时计算日/月用水量 - waterMeterDataService.saveWaterMeterData(dataWaterMeter); - - return ResponseData.success(); - } -} diff --git a/casic-sluicewell/src/main/java/com/casic/missiles/modular/system/service/IWaterMeterDataService.java b/casic-sluicewell/src/main/java/com/casic/missiles/modular/system/service/IWaterMeterDataService.java index 71ed7ba..7bee98b 100644 --- a/casic-sluicewell/src/main/java/com/casic/missiles/modular/system/service/IWaterMeterDataService.java +++ b/casic-sluicewell/src/main/java/com/casic/missiles/modular/system/service/IWaterMeterDataService.java @@ -7,7 +7,7 @@ public interface IWaterMeterDataService extends IService { - boolean saveWaterMeterData(DataWaterMeter dataWaterMeter); + double saveWaterMeterData(DataWaterMeter dataWaterMeter); Map selectLatestDayAccByDevice(String devcode, String date); } diff --git a/casic-alarm/src/main/java/com/casic/missiles/modular/alarm/service/IAlarmRecordsService.java b/casic-alarm/src/main/java/com/casic/missiles/modular/alarm/service/IAlarmRecordsService.java index 1d00c2e..a0bd20d 100644 --- a/casic-alarm/src/main/java/com/casic/missiles/modular/alarm/service/IAlarmRecordsService.java +++ b/casic-alarm/src/main/java/com/casic/missiles/modular/alarm/service/IAlarmRecordsService.java @@ -23,4 +23,6 @@ List alarmListNoPage(DataScope dataScope, String keywords, String alarmType, String alarmContent,String beginTime, String endTime); boolean cancelAlarm(int id,String jobStatus, String handleMessage, long personId); + + Integer insertAlarmRecord(AlarmRecords alarmRec); } diff --git a/casic-alarm/src/main/java/com/casic/missiles/modular/alarm/service/IAlarmRuleService.java b/casic-alarm/src/main/java/com/casic/missiles/modular/alarm/service/IAlarmRuleService.java index a4b78e0..394f24f 100644 --- a/casic-alarm/src/main/java/com/casic/missiles/modular/alarm/service/IAlarmRuleService.java +++ b/casic-alarm/src/main/java/com/casic/missiles/modular/alarm/service/IAlarmRuleService.java @@ -23,4 +23,6 @@ boolean updateRule( int id, float highValue, float lowValue); List getNoAlarmDevice(DataScope dataScope); + AlarmRule selectAlarmRuleByDev(String devcode, String grade); + } diff --git a/casic-alarm/src/main/java/com/casic/missiles/modular/alarm/service/impl/AlarmRecordsServiceImpl.java b/casic-alarm/src/main/java/com/casic/missiles/modular/alarm/service/impl/AlarmRecordsServiceImpl.java index 8ff1739..7b510c6 100644 --- a/casic-alarm/src/main/java/com/casic/missiles/modular/alarm/service/impl/AlarmRecordsServiceImpl.java +++ b/casic-alarm/src/main/java/com/casic/missiles/modular/alarm/service/impl/AlarmRecordsServiceImpl.java @@ -52,4 +52,9 @@ return this.baseMapper.cancelAlarm(id,jobStatus,handleMessage,personId); } + @Override + public Integer insertAlarmRecord(AlarmRecords alarmRec) { + this.baseMapper.cancelAlarmByNewRecord(alarmRec.getDevcode(), alarmRec.getAlarmType()); + return this.baseMapper.insert(alarmRec); + } } diff --git a/casic-alarm/src/main/java/com/casic/missiles/modular/alarm/service/impl/AlarmRuleServiceImpl.java b/casic-alarm/src/main/java/com/casic/missiles/modular/alarm/service/impl/AlarmRuleServiceImpl.java index 234a66c..515a3d0 100644 --- a/casic-alarm/src/main/java/com/casic/missiles/modular/alarm/service/impl/AlarmRuleServiceImpl.java +++ b/casic-alarm/src/main/java/com/casic/missiles/modular/alarm/service/impl/AlarmRuleServiceImpl.java @@ -40,4 +40,9 @@ public List getNoAlarmDevice(DataScope dataScope) { return this.baseMapper.getNoAlarmDevice(dataScope); } + + @Override + public AlarmRule selectAlarmRuleByDev(String devcode, String grade) { + return this.baseMapper.selectAlarmRuleByDev(devcode, grade); + } } diff --git a/casic-alarm/src/main/java/com/casic/missiles/modular/system/controller/WaterMeterDataReceiver.java b/casic-alarm/src/main/java/com/casic/missiles/modular/system/controller/WaterMeterDataReceiver.java new file mode 100644 index 0000000..8ce1070 --- /dev/null +++ b/casic-alarm/src/main/java/com/casic/missiles/modular/system/controller/WaterMeterDataReceiver.java @@ -0,0 +1,150 @@ +package com.casic.missiles.modular.system.controller; + +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.modular.alarm.service.IAlarmRecordsService; +import com.casic.missiles.modular.alarm.service.IAlarmRuleService; +import com.casic.missiles.modular.system.dto.DeviceWellDto; +import com.casic.missiles.modular.system.model.AlarmRecords; +import com.casic.missiles.modular.system.model.AlarmRule; +import com.casic.missiles.modular.system.model.DataWaterMeter; +import com.casic.missiles.modular.system.model.Device; +import com.casic.missiles.modular.system.service.IDeviceService; +import com.casic.missiles.modular.system.service.IWaterMeterDataService; +import lombok.extern.java.Log; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import javax.annotation.Resource; +import java.text.DecimalFormat; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.Map; + +@Log +@Controller +@RequestMapping("/meter") +public class WaterMeterDataReceiver extends BaseController { + + @Resource + private IWaterMeterDataService waterMeterDataService; + + @Resource + private IDeviceService deviceService; + + @Resource + private IAlarmRuleService alarmRuleService; + @Resource + private IAlarmRecordsService alarmRecordsService; + + private DecimalFormat df2 = new DecimalFormat("0.00"); + + @RequestMapping(value = "/data/recv") + @ResponseBody + public Object dataRecv(@RequestBody(required = true) Map meterData) throws ParseException { + // 判断必填字段 + if (meterData.containsKey("MeterAddr") == false) { + return ResponseData.error("设备地址字段缺失"); + } + if (meterData.containsKey("MeterNumber") == false) { + return ResponseData.error("水表读数字段缺失"); + } + if (meterData.containsKey("ReadDate") == false) { + return ResponseData.error("上报时间字段缺失"); + } + + // 创建原始记录对象 + DataWaterMeter dataWaterMeter = new DataWaterMeter(); + + // 赋值设备地址 + String meterAddr = meterData.get("MeterAddr").toString(); + dataWaterMeter.setDevcode(meterAddr); + + // 赋值井编号 + DeviceWellDto wellDto = deviceService.selectWellByDevcode(meterAddr); + if (null == wellDto) { + log.info("没有找到" + meterAddr + "对应的井编号"); + return ResponseData.success(); + } + dataWaterMeter.setWellCode(wellDto.getWellCode()); + + // 能找到关联的井 则必然能找到设备 不判空 + Device device = deviceService.getDeviceByDevCode(meterAddr); + + // 赋值水表读数 + Double meterNumber = 0.0; + String numType = meterData.get("MeterNumber").getClass().getSimpleName(); + if (numType.equals("String")) { + meterNumber = Double.parseDouble(meterData.get("MeterNumber").toString()); + } else if (numType.equals("BigDecimal")) { + meterNumber = ((Number) meterData.get("MeterNumber")).doubleValue(); + } + dataWaterMeter.setFlowAcc(String.valueOf(meterNumber)); + + // 赋值数据采集时间 + String readDate = meterData.get("ReadDate").toString(); + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + dataWaterMeter.setUptime(sdf.parse(readDate)); + + // 赋值阀门状态 + if (meterData.containsKey("ValveStatus") == true) { + dataWaterMeter.setStatus(meterData.get("ValveStatus").toString()); + } + + dataWaterMeter.setLogtime(Calendar.getInstance().getTime()); + + // 保存到数据库 同时计算日/月用水量 + double flowAccToday = waterMeterDataService.saveWaterMeterData(dataWaterMeter); + + // 判断是否报警/预警 + AlarmRule alarmRule = alarmRuleService.selectAlarmRuleByDev(meterAddr, "1"); // 报警 + AlarmRule alarmRuleWarn = alarmRuleService.selectAlarmRuleByDev(meterAddr, "2"); // 预警 + if (null != alarmRule && null != alarmRule.getHighvalue()) { + if (flowAccToday - alarmRule.getHighvalue() > 0) { + // 超出报警阈值 生成一条报警消息 + AlarmRecords alarmRecord = new AlarmRecords(); + + alarmRecord.setDeviceId(device.getId()); + alarmRecord.setDevcode(meterAddr); + alarmRecord.setWellCode(wellDto.getWellCode()); + alarmRecord.setAlarmType("1"); // 业务报警 + alarmRecord.setAlarmContent("日用水量超阈值报警"); + alarmRecord.setAlarmValue(df2.format(flowAccToday)); + alarmRecord.setAlarmTime(Calendar.getInstance().getTime()); + alarmRecord.setStatus("1"); + alarmRecord.setAlarmMessage("日用水量超阈值报警"); + + alarmRecordsService.insertAlarmRecord(alarmRecord); + + // 向前端推送报警 + } else { + // 如果没有报警则判断是否预警 + if (null != alarmRuleWarn && null != alarmRuleWarn.getHighvalue()) { + if (flowAccToday - alarmRuleWarn.getHighvalue() > 0) { + // 超出预警阈值 生成一条预警消息 + AlarmRecords alarmRecord = new AlarmRecords(); + + alarmRecord.setDeviceId(device.getId()); + alarmRecord.setDevcode(meterAddr); + alarmRecord.setWellCode(wellDto.getWellCode()); + alarmRecord.setAlarmType("3"); // 业务报警 + alarmRecord.setAlarmContent("日用水量超阈值预警"); + alarmRecord.setAlarmValue(df2.format(flowAccToday)); + alarmRecord.setAlarmTime(Calendar.getInstance().getTime()); + alarmRecord.setStatus("1"); + alarmRecord.setAlarmMessage("日用水量超阈值预警"); + + alarmRecordsService.insertAlarmRecord(alarmRecord); + + // 向前端推送报警 + } + } + } + } + + return ResponseData.success(); + } +} diff --git a/casic-alarm/src/main/java/com/casic/missiles/modular/system/dao/AlarmRecordsMapper.java b/casic-alarm/src/main/java/com/casic/missiles/modular/system/dao/AlarmRecordsMapper.java index 408d5c6..a6f05c4 100644 --- a/casic-alarm/src/main/java/com/casic/missiles/modular/system/dao/AlarmRecordsMapper.java +++ b/casic-alarm/src/main/java/com/casic/missiles/modular/system/dao/AlarmRecordsMapper.java @@ -24,4 +24,6 @@ List alarmListNoPage(@Param("scope") DataScope dataScope, @Param("keywords") String keywords, @Param("alarmType") String alarmType, @Param("alarmContent") String alarmContent, @Param("beginTime") String beginTime, @Param("endTime") String endTime); boolean cancelAlarm(@Param("id") int id,@Param("jobStatus")String jobStatus,@Param("handleMessage") String handleMessage,@Param("personId") long personId); + + boolean cancelAlarmByNewRecord(@Param("devcode") String devcode, @Param("alarmType") String alarmType); } diff --git a/casic-alarm/src/main/java/com/casic/missiles/modular/system/dao/AlarmRuleMapper.java b/casic-alarm/src/main/java/com/casic/missiles/modular/system/dao/AlarmRuleMapper.java index da4f54c..00f33ee 100644 --- a/casic-alarm/src/main/java/com/casic/missiles/modular/system/dao/AlarmRuleMapper.java +++ b/casic-alarm/src/main/java/com/casic/missiles/modular/system/dao/AlarmRuleMapper.java @@ -23,4 +23,6 @@ List> ruleListViaParam(@Param("page") Page> page, @Param("keywords") String keywords, @Param("deviceType") String deviceType,@Param("dataScope") DataScope dataScope); boolean updateRule(@Param("id") int id,@Param("highValue") float highValue,@Param("lowValue") float lowValue); List getNoAlarmDevice(@Param("dataScope") DataScope dataScope); + + AlarmRule selectAlarmRuleByDev(@Param("devcode") String devcode, @Param("grade") String grade); } diff --git a/casic-alarm/src/main/java/com/casic/missiles/modular/system/dao/mapping/AlarmRecordsMapper.xml b/casic-alarm/src/main/java/com/casic/missiles/modular/system/dao/mapping/AlarmRecordsMapper.xml index d9cfd1e..73047da 100644 --- a/casic-alarm/src/main/java/com/casic/missiles/modular/system/dao/mapping/AlarmRecordsMapper.xml +++ b/casic-alarm/src/main/java/com/casic/missiles/modular/system/dao/mapping/AlarmRecordsMapper.xml @@ -116,4 +116,12 @@ AND aj.ID = #{id} + + UPDATE alarm_records ar + + ar.status = 0 + + WHERE ar.devcode = #{devcode} and ar.alarm_type = #{alarmType} + + diff --git a/casic-alarm/src/main/java/com/casic/missiles/modular/system/dao/mapping/AlarmRuleMapper.xml b/casic-alarm/src/main/java/com/casic/missiles/modular/system/dao/mapping/AlarmRuleMapper.xml index 4743d51..20a0cc3 100644 --- a/casic-alarm/src/main/java/com/casic/missiles/modular/system/dao/mapping/AlarmRuleMapper.xml +++ b/casic-alarm/src/main/java/com/casic/missiles/modular/system/dao/mapping/AlarmRuleMapper.xml @@ -80,4 +80,9 @@ SELECT r.devcode FROM alarm_rule r) AND d.VALID=1 AND d.deviceType IN (2,6,8,10) + + diff --git a/casic-alarm/src/main/java/com/casic/missiles/modular/system/model/AlarmRecords.java b/casic-alarm/src/main/java/com/casic/missiles/modular/system/model/AlarmRecords.java index 7ffdcc6..2d4f5ed 100644 --- a/casic-alarm/src/main/java/com/casic/missiles/modular/system/model/AlarmRecords.java +++ b/casic-alarm/src/main/java/com/casic/missiles/modular/system/model/AlarmRecords.java @@ -26,7 +26,7 @@ * 主键 */ @TableId(value = "ID", type = IdType.AUTO) - private Integer id; + private Long id; /** * 设备ID */ @@ -96,11 +96,11 @@ this.jobStatus = jobStatus; } - public Integer getId() { + public Long getId() { return id; } - public void setId(Integer id) { + public void setId(Long id) { this.id = id; } diff --git a/casic-device/src/main/java/com/casic/missiles/modular/system/controller/WaterMeterDataReceiver.java b/casic-device/src/main/java/com/casic/missiles/modular/system/controller/WaterMeterDataReceiver.java deleted file mode 100644 index 335cd41..0000000 --- a/casic-device/src/main/java/com/casic/missiles/modular/system/controller/WaterMeterDataReceiver.java +++ /dev/null @@ -1,89 +0,0 @@ -package com.casic.missiles.modular.system.controller; - -import com.casic.missiles.core.base.controller.BaseController; -import com.casic.missiles.core.base.response.ResponseData; -import com.casic.missiles.modular.system.dto.DeviceWellDto; -import com.casic.missiles.modular.system.model.DataWaterMeter; -import com.casic.missiles.modular.system.service.IDeviceService; -import com.casic.missiles.modular.system.service.IWaterMeterDataService; -import lombok.extern.java.Log; -import org.springframework.stereotype.Controller; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.ResponseBody; - -import javax.annotation.Resource; -import java.text.ParseException; -import java.text.SimpleDateFormat; -import java.util.Calendar; -import java.util.Map; -import java.util.logging.Level; - -@Log -@Controller -@RequestMapping("/meter") -public class WaterMeterDataReceiver extends BaseController { - - @Resource - private IWaterMeterDataService waterMeterDataService; - - @Resource - private IDeviceService deviceService; - - @RequestMapping(value = "/data/recv") - @ResponseBody - public Object dataRecv(@RequestBody(required = true) Map meterData) throws ParseException { - // 判断必填字段 - if (meterData.containsKey("MeterAddr") == false) { - return ResponseData.error("设备地址字段缺失"); - } - if (meterData.containsKey("MeterNumber") == false) { - return ResponseData.error("水表读数字段缺失"); - } - if (meterData.containsKey("ReadDate") == false) { - return ResponseData.error("上报时间字段缺失"); - } - - // 创建原始记录对象 - DataWaterMeter dataWaterMeter = new DataWaterMeter(); - - // 赋值设备地址 - String meterAddr = meterData.get("MeterAddr").toString(); - dataWaterMeter.setDevcode(meterAddr); - - // 赋值井编号 - DeviceWellDto wellDto = deviceService.selectWellByDevcode(meterAddr); - if (null == wellDto) { - log.info("没有找到" + meterAddr + "对应的井编号"); - return ResponseData.success(); - } - dataWaterMeter.setWellCode(wellDto.getWellCode()); - - // 赋值水表读数 - Double meterNumber = 0.0; - String numType = meterData.get("MeterNumber").getClass().getSimpleName(); - if (numType.equals("String")) { - meterNumber = Double.parseDouble(meterData.get("MeterNumber").toString()); - } else if (numType.equals("BigDecimal")) { - meterNumber = ((Number) meterData.get("MeterNumber")).doubleValue(); - } - dataWaterMeter.setFlowAcc(String.valueOf(meterNumber)); - - // 赋值数据采集时间 - String readDate = meterData.get("ReadDate").toString(); - SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); - dataWaterMeter.setUptime(sdf.parse(readDate)); - - // 赋值阀门状态 - if (meterData.containsKey("ValveStatus") == true) { - dataWaterMeter.setStatus(meterData.get("ValveStatus").toString()); - } - - dataWaterMeter.setLogtime(Calendar.getInstance().getTime()); - - // 保存到数据库 同时计算日/月用水量 - waterMeterDataService.saveWaterMeterData(dataWaterMeter); - - return ResponseData.success(); - } -} diff --git a/casic-sluicewell/src/main/java/com/casic/missiles/modular/system/service/IWaterMeterDataService.java b/casic-sluicewell/src/main/java/com/casic/missiles/modular/system/service/IWaterMeterDataService.java index 71ed7ba..7bee98b 100644 --- a/casic-sluicewell/src/main/java/com/casic/missiles/modular/system/service/IWaterMeterDataService.java +++ b/casic-sluicewell/src/main/java/com/casic/missiles/modular/system/service/IWaterMeterDataService.java @@ -7,7 +7,7 @@ public interface IWaterMeterDataService extends IService { - boolean saveWaterMeterData(DataWaterMeter dataWaterMeter); + double saveWaterMeterData(DataWaterMeter dataWaterMeter); Map selectLatestDayAccByDevice(String devcode, String date); } diff --git a/casic-sluicewell/src/main/java/com/casic/missiles/modular/system/service/impl/WaterMeterDataServiceImpl.java b/casic-sluicewell/src/main/java/com/casic/missiles/modular/system/service/impl/WaterMeterDataServiceImpl.java index 1d77a78..1fe2cac 100644 --- a/casic-sluicewell/src/main/java/com/casic/missiles/modular/system/service/impl/WaterMeterDataServiceImpl.java +++ b/casic-sluicewell/src/main/java/com/casic/missiles/modular/system/service/impl/WaterMeterDataServiceImpl.java @@ -24,10 +24,13 @@ @Override @Transactional - public boolean saveWaterMeterData(DataWaterMeter dataWaterMeter) { + public double saveWaterMeterData(DataWaterMeter dataWaterMeter) { // 1. 保存原始记录 this.baseMapper.insert(dataWaterMeter); + // 用于返回的日用水量 + double flowAccDayRet = 0.0; + // 日用水量 Map waterMeterDay = new HashMap<>(); waterMeterDay.put("wellCode", dataWaterMeter.getWellCode()); @@ -52,9 +55,11 @@ Calendar lastDay = Calendar.getInstance(); lastDay.setTime(sdfDate.parse(lastDayAcc.get("DATE").toString())); + // 计算间隔天数 long delta = today.getTimeInMillis() - lastDay.getTimeInMillis(); int dateDelta = (int) (delta / (3600 * 24 * 1000)); + // 计算与上一条日用水量的差值 Double flowAccDelta = Double.parseDouble(dataWaterMeter.getFlowAcc()) - Double.parseDouble(lastDayAcc.get("flowAcc").toString()); // 时间间隔为1天 @@ -64,6 +69,9 @@ waterMeterDay.put("flowAccDate", df2.format(flowAccDelta)); this.baseMapper.insertDataWatermeterDay(waterMeterDay); + // 间隔一天 日用水量=差值 + flowAccDayRet = flowAccDelta; + if (today.get(Calendar.DATE) == 1) { // 是每月的第一天 则新增月用水量 waterMeterMonth.put("flowAccMonth", waterMeterDay.get("flowAccDate")); @@ -88,6 +96,8 @@ } else { // 间隔多天 double avgFlowAccDay = flowAccDelta / dateDelta; + // 间隔多天 日用水量=平均值 + flowAccDayRet = avgFlowAccDay; for (int i = 0; i < dateDelta; i++) { waterMeterDay.put("flowAcc", df2.format(Double.parseDouble(lastDayAcc.get("flowAcc").toString()) + avgFlowAccDay * (i+1))); // 当日水表读数 // 当日用水量 = (当日水表读数 - 昨日水表读数) / 天数 @@ -129,13 +139,16 @@ waterMeterDay.put("flowAccDate", dataWaterMeter.getFlowAcc()); this.baseMapper.insertDataWatermeterDay(waterMeterDay); + // 没有上一条记录 日用水量 = 当前读数 + flowAccDayRet = Double.parseDouble(dataWaterMeter.getFlowAcc()); + waterMeterMonth.put("flowAccMonth", dataWaterMeter.getFlowAcc()); waterMeterMonth.put("firstAcc", 0); waterMeterMonth.put("lastAcc", dataWaterMeter.getFlowAcc()); this.baseMapper.insertDataWatermeterMonth(waterMeterMonth); } - return true; + return flowAccDayRet; } @Override