From 47fd97f6a9000ac1df5c6f9f483806a661b0457c Mon Sep 17 00:00:00 2001 From: qinjie <463333974@qq.com> Date: Tue, 10 Dec 2024 12:35:37 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E6=8F=90=E9=86=92=E5=8A=9F?= =?UTF-8?q?=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/RemindController.java | 38 ++++++ .../com/isu/gaswellwatch/dao/RemindDao.java | 27 +++++ .../isu/gaswellwatch/entity/RemindRecord.java | 38 ++++++ .../gaswellwatch/entity/RemindSetting.java | 44 +++++++ .../BusinessMessageHandlerListener.java | 111 +++++++++++++++++- .../modbus/impl/CommandServiceImpl.java | 3 +- .../service/DeviceOptLogService.java | 2 +- .../gaswellwatch/service/RemindService.java | 18 +++ .../service/impl/DeviceOptLogServiceImpl.java | 9 +- .../service/impl/RemindServiceImpl.java | 36 ++++++ .../isu/gaswellwatch/vo/RemindRecordVO.java | 39 ++++++ src/main/resources/mapper/RemindDao.xml | 42 +++++++ 12 files changed, 396 insertions(+), 11 deletions(-) create mode 100644 src/main/java/com/isu/gaswellwatch/controller/RemindController.java create mode 100644 src/main/java/com/isu/gaswellwatch/dao/RemindDao.java create mode 100644 src/main/java/com/isu/gaswellwatch/entity/RemindRecord.java create mode 100644 src/main/java/com/isu/gaswellwatch/entity/RemindSetting.java create mode 100644 src/main/java/com/isu/gaswellwatch/service/RemindService.java create mode 100644 src/main/java/com/isu/gaswellwatch/service/impl/RemindServiceImpl.java create mode 100644 src/main/java/com/isu/gaswellwatch/vo/RemindRecordVO.java create mode 100644 src/main/resources/mapper/RemindDao.xml diff --git a/src/main/java/com/isu/gaswellwatch/controller/RemindController.java b/src/main/java/com/isu/gaswellwatch/controller/RemindController.java new file mode 100644 index 0000000..f591380 --- /dev/null +++ b/src/main/java/com/isu/gaswellwatch/controller/RemindController.java @@ -0,0 +1,38 @@ +package com.isu.gaswellwatch.controller; + + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.isu.gaswellwatch.entity.Response; +import com.isu.gaswellwatch.service.RemindService; +import com.isu.gaswellwatch.service.SummaryService; +import com.isu.gaswellwatch.vo.RemindRecordVO; +import com.isu.gaswellwatch.vo.summary.PieSummaryVO; +import jakarta.annotation.Resource; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import java.util.List; + + +@RestController +@RequestMapping("remind") +public class RemindController { + + + @Resource + private RemindService remindService; + + @GetMapping("/page") + public Response> page(@RequestParam(defaultValue = "1") Integer currentPage, + @RequestParam(defaultValue = "10") Integer pageSize, + @RequestParam(required = false) Long deviceId, + @RequestParam(required = false) String startTime, + @RequestParam(required = false) String endTime, + @RequestParam(required = false) String gasWellName) { + return Response.succeed(this.remindService.page(currentPage, pageSize, deviceId, startTime, endTime,gasWellName)); + } + +} + diff --git a/src/main/java/com/isu/gaswellwatch/dao/RemindDao.java b/src/main/java/com/isu/gaswellwatch/dao/RemindDao.java new file mode 100644 index 0000000..cf6586a --- /dev/null +++ b/src/main/java/com/isu/gaswellwatch/dao/RemindDao.java @@ -0,0 +1,27 @@ +package com.isu.gaswellwatch.dao; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.isu.gaswellwatch.entity.RemindRecord; +import com.isu.gaswellwatch.entity.RemindSetting; +import com.isu.gaswellwatch.entity.RoleMenu; +import com.isu.gaswellwatch.vo.RemindRecordVO; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; +import org.springframework.stereotype.Repository; + +import java.util.List; + +@Mapper +@Repository +public interface RemindDao extends BaseMapper { + + List getAllRemindSetting(); + + Page page(Page page, + @Param("deviceId")Long deviceId, + @Param("startTime")String startTime, + @Param("endTime")String endTime, + @Param("gasWellName")String gasWellName); +} + diff --git a/src/main/java/com/isu/gaswellwatch/entity/RemindRecord.java b/src/main/java/com/isu/gaswellwatch/entity/RemindRecord.java new file mode 100644 index 0000000..2c19304 --- /dev/null +++ b/src/main/java/com/isu/gaswellwatch/entity/RemindRecord.java @@ -0,0 +1,38 @@ +package com.isu.gaswellwatch.entity; + +import com.baomidou.mybatisplus.extension.activerecord.Model; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.Date; + +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +@JsonSerialize(include=JsonSerialize.Inclusion.NON_NULL) +public class RemindRecord extends Model { + + /** id */ + private Long id; + + /** 设备ID */ + private Long deviceId; + + /** 所属气井 */ + private Long gasWell; + + /** 提醒内容 */ + private String content; + + /** 创建时间 */ + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + private Date createTime; + + + +} diff --git a/src/main/java/com/isu/gaswellwatch/entity/RemindSetting.java b/src/main/java/com/isu/gaswellwatch/entity/RemindSetting.java new file mode 100644 index 0000000..c47fed0 --- /dev/null +++ b/src/main/java/com/isu/gaswellwatch/entity/RemindSetting.java @@ -0,0 +1,44 @@ +package com.isu.gaswellwatch.entity; + +import com.baomidou.mybatisplus.extension.activerecord.Model; +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.Builder; +import lombok.Data; + +import java.util.Date; + +@Data +@Builder +public class RemindSetting extends Model { + + /* id */ + private Long id; + + /* 设备ID */ + private Long deviceId; + + /* 字段 */ + private String field; + + /* 字段名称 */ + private String fieldName; + + /* 字段类型 */ + private String fieldType; + + /* 字段最小值 */ + private String minValue; + + /* 字段最大值 */ + private String maxValue; + + /* 创建时间 */ + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + private Date createTime; + + /* 更新时间 */ + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + private Date updateTime; + + +} diff --git a/src/main/java/com/isu/gaswellwatch/modbus/data/listener/BusinessMessageHandlerListener.java b/src/main/java/com/isu/gaswellwatch/modbus/data/listener/BusinessMessageHandlerListener.java index 30c333a..4f45b9d 100755 --- a/src/main/java/com/isu/gaswellwatch/modbus/data/listener/BusinessMessageHandlerListener.java +++ b/src/main/java/com/isu/gaswellwatch/modbus/data/listener/BusinessMessageHandlerListener.java @@ -2,16 +2,43 @@ package com.isu.gaswellwatch.modbus.data.listener; import com.alibaba.fastjson2.JSON; import com.alibaba.fastjson2.JSONObject; +import com.isu.gaswellwatch.config.SnowflakeConfig; +import com.isu.gaswellwatch.entity.RemindRecord; +import com.isu.gaswellwatch.entity.RemindSetting; +import com.isu.gaswellwatch.modbus.data.PersistenceHandler; +import com.isu.gaswellwatch.service.DeviceOptLogService; +import com.isu.gaswellwatch.service.DeviceService; +import com.isu.gaswellwatch.service.RemindService; +import com.isu.gaswellwatch.vo.DeviceVO; +import jakarta.annotation.Resource; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; import org.springframework.amqp.core.BatchMessageListener; import org.springframework.amqp.core.Message; +import org.springframework.stereotype.Service; +import java.math.BigDecimal; +import java.util.ArrayList; +import java.util.HashMap; import java.util.List; +import java.util.Map; @Slf4j +@Service @RequiredArgsConstructor public class BusinessMessageHandlerListener implements BatchMessageListener { + + @Resource + private DeviceService deviceService; + @Resource + private DeviceOptLogService deviceOptLogService; + @Resource + private RemindService remindService; + @Resource + private SnowflakeConfig snowflakeConfig; + + @Override public void onMessage(Message message) { this.onMessageBatch(List.of(message)); @@ -21,33 +48,105 @@ public class BusinessMessageHandlerListener implements BatchMessageListener { public void onMessageBatch(List messages) { //读取全部提醒字段的配置 + List settingList = remindService.getAllRemindSetting(); + List recordList = new ArrayList<>(); + + //将settingList转换为map,key为deviceId,value为List + Map> deviceRemindSettingMap = new HashMap<>(); + for (RemindSetting setting : settingList) { + if(deviceRemindSettingMap.containsKey(setting.getDeviceId())){ + deviceRemindSettingMap.get(setting.getDeviceId()).add(setting); + }else{ + deviceRemindSettingMap.put(setting.getDeviceId(),List.of(setting)); + } + } + + + Map deviceWellStatusMap = new HashMap<>(); for (Message message : messages) { String messageString = new String(message.getBody()); - log.info("收到业务消息:{}", messageString); JSONObject messageObject= JSON.parseObject(messageString); if(messageObject.containsKey("old")){ JSONObject oldObject = messageObject.getJSONObject("old"); JSONObject newObject = messageObject.getJSONObject("new"); String deviceId = oldObject.getString("deviceId"); - //TODO + if(StringUtils.isEmpty(deviceId)){ + continue; + } //根据设备ID获取设备的产品类型 - + DeviceVO device = deviceService.getDevice(Long.valueOf(deviceId)); //根据对应的产品类型,用对应的气井开关字段获取开关状态(wellStatus,solenoidValveStatus,firstSolenoidStatus) - + String wellStatusKey = getWellStatusKey(device); //比对新旧数据,看开关状态是否一致 + if(!oldObject.getString(wellStatusKey).equals(newObject.getString(wellStatusKey))){ + deviceWellStatusMap.put(Long.valueOf(deviceId),newObject.getInteger(wellStatusKey)); + } //根据ID找到对应的提醒字段配置 + if(deviceRemindSettingMap.containsKey(Long.valueOf(deviceId))){ + List remindSettings = deviceRemindSettingMap.get(Long.valueOf(deviceId)); + for (RemindSetting remindSetting : remindSettings) { + //遍历该id下的所有字段的配置,检查新消息中字段的值是否符合提醒条件 + //暂时只处理number类型的字段 + if("number".equals(remindSetting.getFieldType())){ + BigDecimal newValue = newObject.getBigDecimal(remindSetting.getField()); + if(newValue != null){ + if(!StringUtils.isEmpty(remindSetting.getMaxValue())){ + if(newValue.compareTo(new BigDecimal(remindSetting.getMaxValue())) > 0){ + //如果大于最大值,则保存提醒记录 + addRemindRecordToList(remindSetting, deviceId, device, newValue, recordList); + }else if(!StringUtils.isEmpty(remindSetting.getMinValue())){ + if(newValue.compareTo(new BigDecimal(remindSetting.getMinValue())) < 0){ + //如果小于最小值,则保存提醒记录 + addRemindRecordToList(remindSetting, deviceId, device, newValue, recordList); + } + } + } + } + } + + + } + } - //遍历该id下的所有字段的配置,检查新消息中字段的值是否符合提醒条件 } } - //若不一致则批量记录设备操作日志 + //若不一致则记录设备操作日志 + if(!deviceWellStatusMap.isEmpty()){ + for (Map.Entry entry : deviceWellStatusMap.entrySet()) { + this.deviceOptLogService.saveGasWellOptLog(entry.getValue(), entry.getKey(),"device"); + } + } //如果提醒数据不为空,批量保存提醒记录 + if(!recordList.isEmpty()){ + this.remindService.saveBatch(recordList); + } + } + + private void addRemindRecordToList(RemindSetting remindSetting, String deviceId, DeviceVO device, BigDecimal newValue, List recordList) { + RemindRecord remindRecord = new RemindRecord(); + remindRecord.setId(snowflakeConfig.snowflakeId()); + remindRecord.setDeviceId(Long.valueOf(deviceId)); + remindRecord.setGasWell(device.getGasWell().getId()); + remindRecord.setContent("【"+ remindSetting.getFieldName()+"】的值达到"+ newValue +",请及时处理"); + recordList.add(remindRecord); + } + + private static String getWellStatusKey(DeviceVO device) { + String wellStatusKey = ""; + if(PersistenceHandler.KNPCV1_MODBUS_TYPE.equals(device.getDeviceType().getCode())){ + wellStatusKey = "wellStatus"; + } else if(PersistenceHandler.ETC_MODBUS_TYPE.equals(device.getDeviceType().getCode())){ + wellStatusKey = "solenoidValveStatus"; + } else if(PersistenceHandler.SCSS_MODBUS_TYPE.equals(device.getDeviceType().getCode())){ + wellStatusKey = "firstSolenoidStatus"; + } + return wellStatusKey; } } diff --git a/src/main/java/com/isu/gaswellwatch/modbus/impl/CommandServiceImpl.java b/src/main/java/com/isu/gaswellwatch/modbus/impl/CommandServiceImpl.java index 5d45b6c..af84864 100644 --- a/src/main/java/com/isu/gaswellwatch/modbus/impl/CommandServiceImpl.java +++ b/src/main/java/com/isu/gaswellwatch/modbus/impl/CommandServiceImpl.java @@ -58,8 +58,7 @@ public class CommandServiceImpl implements CommandService { Command.SCSS_TURN_OFF_THE_WELL.equals(command.getCode())) { flag = 0; } - ; - this.deviceOptLogService.saveGasWellOptLog(flag, command.getDeviceId()); + this.deviceOptLogService.saveGasWellOptLog(flag, command.getDeviceId(),""); return result; } diff --git a/src/main/java/com/isu/gaswellwatch/service/DeviceOptLogService.java b/src/main/java/com/isu/gaswellwatch/service/DeviceOptLogService.java index 6b5d3f4..4db3750 100644 --- a/src/main/java/com/isu/gaswellwatch/service/DeviceOptLogService.java +++ b/src/main/java/com/isu/gaswellwatch/service/DeviceOptLogService.java @@ -8,7 +8,7 @@ import java.util.Date; public interface DeviceOptLogService extends IService { - void saveGasWellOptLog(Integer isOpen, Long deviceId); + void saveGasWellOptLog(Integer isOpen, Long deviceId,String source); Page page(Page page, Date start, Date end, Long deviceId); } diff --git a/src/main/java/com/isu/gaswellwatch/service/RemindService.java b/src/main/java/com/isu/gaswellwatch/service/RemindService.java new file mode 100644 index 0000000..86e77a5 --- /dev/null +++ b/src/main/java/com/isu/gaswellwatch/service/RemindService.java @@ -0,0 +1,18 @@ +package com.isu.gaswellwatch.service; + + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.IService; +import com.isu.gaswellwatch.entity.RemindRecord; +import com.isu.gaswellwatch.entity.RemindSetting; +import com.isu.gaswellwatch.vo.RemindRecordVO; + +import java.util.List; + +public interface RemindService extends IService { + + List getAllRemindSetting(); + + Page page(Integer currentPage, Integer pageSize, Long deviceId, String startTime, String endTime,String gasWellName); +} + diff --git a/src/main/java/com/isu/gaswellwatch/service/impl/DeviceOptLogServiceImpl.java b/src/main/java/com/isu/gaswellwatch/service/impl/DeviceOptLogServiceImpl.java index e3ffb36..7b2815f 100644 --- a/src/main/java/com/isu/gaswellwatch/service/impl/DeviceOptLogServiceImpl.java +++ b/src/main/java/com/isu/gaswellwatch/service/impl/DeviceOptLogServiceImpl.java @@ -36,7 +36,7 @@ public class DeviceOptLogServiceImpl extends ServiceImpl implements RemindService { + + @Resource + private RemindDao remindDao; + + @Override + public List getAllRemindSetting() { + return remindDao.getAllRemindSetting(); + } + + @Override + public Page page(Integer currentPage, Integer pageSize, Long deviceId, String startTime, String endTime,String gasWellName) { + return remindDao.page(new Page<>(currentPage, pageSize), deviceId, startTime, endTime,gasWellName); + } +} + diff --git a/src/main/java/com/isu/gaswellwatch/vo/RemindRecordVO.java b/src/main/java/com/isu/gaswellwatch/vo/RemindRecordVO.java new file mode 100644 index 0000000..0bad0ca --- /dev/null +++ b/src/main/java/com/isu/gaswellwatch/vo/RemindRecordVO.java @@ -0,0 +1,39 @@ +package com.isu.gaswellwatch.vo; + +import com.baomidou.mybatisplus.extension.activerecord.Model; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import com.isu.gaswellwatch.entity.GasWell; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.Date; + +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +@JsonSerialize(include=JsonSerialize.Inclusion.NON_NULL) +public class RemindRecordVO extends Model { + + /** id */ + private Long id; + + /** 设备ID */ + private Long deviceId; + + /** 所属气井 */ + private GasWell gasWell; + + /** 提醒内容 */ + private String content; + + /** 创建时间 */ + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + private Date createTime; + + + +} diff --git a/src/main/resources/mapper/RemindDao.xml b/src/main/resources/mapper/RemindDao.xml new file mode 100644 index 0000000..fe0a41f --- /dev/null +++ b/src/main/resources/mapper/RemindDao.xml @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + + + + + + + + + +