From 202dd5061bd91cf7073ff86f8fbbd8e1e7ceae50 Mon Sep 17 00:00:00 2001 From: 25604 Date: Fri, 21 Nov 2025 18:12:15 +0800 Subject: [PATCH] =?UTF-8?q?1=E3=80=81=E5=8C=97=E5=B8=88=E5=A4=A7=E8=AE=BE?= =?UTF-8?q?=E5=A4=87=E7=9B=91=E6=8E=A5=E5=8F=A3=E7=BC=96=E5=86=99=EF=BC=9B?= =?UTF-8?q?=202=E3=80=81=E5=A4=9A=E8=B7=AF=E6=8E=A7=E5=88=B6=E4=BB=A3?= =?UTF-8?q?=E7=A0=81=E4=BC=98=E5=8C=96=EF=BC=9B=203=E3=80=8107=E8=A7=84?= =?UTF-8?q?=E7=BA=A6=E7=94=B5=E8=A1=A8=E5=85=BC=E5=AE=B9=EF=BC=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/mh/user/constants/Constant.java | 2 + .../mh/user/controller/NowDataController.java | 97 +++++++++++++++++++ .../java/com/mh/user/job/DealDataJob.java | 2 +- .../mh/user/mapper/DeviceInstallMapper.java | 2 +- .../mh/user/mapper/GatewayManageMapper.java | 3 + .../com/mh/user/mapper/NowDataMapper.java | 45 +++++++++ .../com/mh/user/model/MultiControlModel.java | 55 +++++++++++ .../mh/user/serialport/SerialPortThread.java | 63 ++++++------ .../com/mh/user/service/NowDataService.java | 7 ++ .../service/impl/ControlSetServiceImpl.java | 14 ++- .../impl/DeviceCodeParamServiceImpl.java | 12 ++- .../user/service/impl/NowDataServiceImpl.java | 76 ++++++++++++++- .../mh/user/strategy/EleMeterStrategy.java | 13 +++ .../user/strategy/MultiControlStrategy.java | 84 +++++++++++++--- .../user/strategy/PressureTransStrategy.java | 5 + .../com/mh/user/tcp/SendAndReceiveByTcp.java | 3 +- .../com/mh/user/utils/GetReadOrder485.java | 33 +++++++ .../src/main/resources/application-dev.yml | 6 +- .../src/main/resources/application-prod.yml | 28 +++--- .../src/main/resources/application.yml | 2 +- .../mh/user/UserServiceApplicationTests.java | 1 + 21 files changed, 490 insertions(+), 63 deletions(-) create mode 100644 user-service/src/main/java/com/mh/user/model/MultiControlModel.java diff --git a/user-service/src/main/java/com/mh/user/constants/Constant.java b/user-service/src/main/java/com/mh/user/constants/Constant.java index 6068703..0583968 100644 --- a/user-service/src/main/java/com/mh/user/constants/Constant.java +++ b/user-service/src/main/java/com/mh/user/constants/Constant.java @@ -41,6 +41,8 @@ public class Constant { public static final String BRAND_RU_YI = "汝翊"; + public static final String BRAND_MEI_YI = "美仪"; + public static final String BRAND_MEI_DI = "美的"; public static final String BRAND_MEI_DI_TWO = "美的2"; diff --git a/user-service/src/main/java/com/mh/user/controller/NowDataController.java b/user-service/src/main/java/com/mh/user/controller/NowDataController.java index b636c6f..982f292 100644 --- a/user-service/src/main/java/com/mh/user/controller/NowDataController.java +++ b/user-service/src/main/java/com/mh/user/controller/NowDataController.java @@ -5,6 +5,7 @@ import com.mh.user.annotation.BusinessType; import com.mh.user.annotation.SysLogger; import com.mh.user.entity.*; import com.mh.user.model.DeviceModel; +import com.mh.user.model.MultiControlModel; import com.mh.user.model.PumpModel; import com.mh.user.model.WaterLevelModel; import com.mh.user.service.*; @@ -107,6 +108,102 @@ public class NowDataController { } } + @SysLogger(title = "实时监控", optDesc = "实时查看每楼栋多路控制运行情况") + @PostMapping("/queryMultiNow") + public HttpResult queryMultiNowData(@RequestParam(value = "buildingId") String buildingId) { + try { + //把热泵的水温保存到公共信息中中的用水温度和回水温度 + String avgWaterTemp = nowDataService.selectAve(buildingId); + String maxWaterTemp = nowDataService.selectMaxTemp(buildingId); + String buildingName = buildingService.queryBuildingName(buildingId);//获取楼栋名称 + + SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + Date date = new Date(); + String curDate = sdf1.format(date); + curDate = curDate.substring(0, 13) + ":00:00"; + + NowPublicDataEntity nowPublicData = new NowPublicDataEntity(); + nowPublicData.setBuildingId(buildingId); + nowPublicData.setBuildingName(buildingName); + if (avgWaterTemp != null) { + nowPublicData.setBackWaterTemp(avgWaterTemp); + } else { + nowPublicData.setBackWaterTemp("0"); + } + if (maxWaterTemp != null) { + nowPublicData.setUseWaterTemp(maxWaterTemp); + } else { + nowPublicData.setUseWaterTemp("0"); + } + nowPublicDataService.saveNowHistoryPublicData(nowPublicData); + + //监视表生成初始记录 + List list = nowDataService.queryNowData(buildingId); + if (list.isEmpty()) {//实时表生成记录 + List deviceList = deviceInstallService.selectDevices(buildingId, "多路控制"); + if (!deviceList.isEmpty()) { + for (DeviceModel list2 : deviceList) { + NowDataEntity nowData = new NowDataEntity(); + nowData.setPumpId(list2.getDeviceAddr()); + nowData.setPumpName("1号供水泵"); + nowData.setBuildingId(buildingId); + nowData.setBuildingName(buildingName); + nowData.setRunState("0"); + nowData.setIsFault("0"); + nowData.setCurDate(curDate); + nowDataService.saveNowData(nowData); //当前状态表 + nowDataService.saveHistoryData(nowData); //历史状态表 + + nowData.setPumpId(list2.getDeviceAddr()); + nowData.setPumpName("2号供水泵"); + nowData.setBuildingId(buildingId); + nowData.setBuildingName(buildingName); + nowData.setRunState("0"); + nowData.setIsFault("0"); + nowData.setCurDate(curDate); + nowDataService.saveNowData(nowData); //当前状态表 + nowDataService.saveHistoryData(nowData); //历史状态表 + + nowData.setPumpId(list2.getDeviceAddr()); + nowData.setPumpName("1号抽水泵"); + nowData.setBuildingId(buildingId); + nowData.setBuildingName(buildingName); + nowData.setRunState("0"); + nowData.setIsFault("0"); + nowData.setCurDate(curDate); + nowDataService.saveNowData(nowData); //当前状态表 + nowDataService.saveHistoryData(nowData); //历史状态表 + + nowData.setPumpId(list2.getDeviceAddr()); + nowData.setPumpName("2号抽水泵"); + nowData.setBuildingId(buildingId); + nowData.setBuildingName(buildingName); + nowData.setRunState("0"); + nowData.setIsFault("0"); + nowData.setCurDate(curDate); + nowDataService.saveNowData(nowData); //当前状态表 + nowDataService.saveHistoryData(nowData); //历史状态表 + + nowData.setPumpId(list2.getDeviceAddr()); + nowData.setPumpName("补水电磁阀"); + nowData.setBuildingId(buildingId); + nowData.setBuildingName(buildingName); + nowData.setRunState("0"); + nowData.setIsFault("0"); + nowData.setCurDate(curDate); + nowDataService.saveNowData(nowData); //当前状态表 + nowDataService.saveHistoryData(nowData); //历史状态表 + } + } + } + List resultList = nowDataService.queryMultiControlNowData(buildingId); + return HttpResult.ok(resultList); + } catch (Exception e) { + log.error("查询当前监控状态出错!", e); + return HttpResult.error("查询当前监控状态出错!"); + } + } + @SysLogger(title = "实时监控", optDesc = "分别查看热泵运行情况") @PostMapping("/queryNowByPump") public HttpResult queryNowByPump(@RequestParam(value = "buildingId") String buildingId, @RequestParam(value = "pumpId") String pumpId) { diff --git a/user-service/src/main/java/com/mh/user/job/DealDataJob.java b/user-service/src/main/java/com/mh/user/job/DealDataJob.java index 5c19368..e1547b3 100644 --- a/user-service/src/main/java/com/mh/user/job/DealDataJob.java +++ b/user-service/src/main/java/com/mh/user/job/DealDataJob.java @@ -74,7 +74,7 @@ public class DealDataJob { * 采集 */ @Scheduled(cron = "35 0/2 * * * ?") -// @Scheduled(cron = "0/10 * * * * ?") 0 0/5 * * * ? +// @Scheduled(cron = "0 0/1 * * * ?") // @Scheduled(cron = "0 0/5 * * * ?") //5分钟 public void collect() { try { diff --git a/user-service/src/main/java/com/mh/user/mapper/DeviceInstallMapper.java b/user-service/src/main/java/com/mh/user/mapper/DeviceInstallMapper.java index 07be2f8..6fcc077 100644 --- a/user-service/src/main/java/com/mh/user/mapper/DeviceInstallMapper.java +++ b/user-service/src/main/java/com/mh/user/mapper/DeviceInstallMapper.java @@ -87,7 +87,7 @@ public interface DeviceInstallMapper extends BaseMapper { List selectDeviceParams(); @ResultMap("rs") - @Select("select * from device_install where device_type='热泵' or device_type='水位开关' ") + @Select("select * from device_install where device_type='热泵' or device_type='水位开关' or device_type = '多路控制' ") List selectDeviceParams2(); //查询需要手动开关机的热泵 diff --git a/user-service/src/main/java/com/mh/user/mapper/GatewayManageMapper.java b/user-service/src/main/java/com/mh/user/mapper/GatewayManageMapper.java index b2e72a0..75df764 100644 --- a/user-service/src/main/java/com/mh/user/mapper/GatewayManageMapper.java +++ b/user-service/src/main/java/com/mh/user/mapper/GatewayManageMapper.java @@ -112,4 +112,7 @@ public interface GatewayManageMapper { // 根据设备IMEI更新设备在线状态 @Update("update gateway_manage set grade = #{status}, connect_date = getdate() where imei = #{imei}") void updateGatewayManageOnlineByImei(String imei, int status); + + @Select("select top 1 grade from gateway_manage where data_com = #{dataCom} ") + int queryGatewayByDataCom(@Param("dataCom") String dataCom); } diff --git a/user-service/src/main/java/com/mh/user/mapper/NowDataMapper.java b/user-service/src/main/java/com/mh/user/mapper/NowDataMapper.java index 2a9aefb..a6c3ca9 100644 --- a/user-service/src/main/java/com/mh/user/mapper/NowDataMapper.java +++ b/user-service/src/main/java/com/mh/user/mapper/NowDataMapper.java @@ -518,4 +518,49 @@ public interface NowDataMapper { @Delete("delete from now_data where pump_id=#{pumpId} and building_id=#{buildingId}") void deleteNowDataByDeviceAddr(@Param("pumpId") String pumpId, @Param("buildingId") String buildingId); + + @Select("select count(1) from now_data where pump_name like concat('%',#{pumpName},'%') " + + " and building_id=#{buildingId} " + + " and pump_id=#{deviceAddr}") + int selectNowDataByPumName(@Param("buildingId") String buildingId, @Param("deviceAddr") String deviceAddr, @Param("pumpName") String pumpName); + + //查询监控界面实时信息 + @Results(id="rsd",value = { + @Result(property="curDate",column="cur_date"), + @Result(property="buildingId",column="building_id"), + @Result(property="buildingName",column="building_name"), + @Result(property="pumpId",column="pump_id"), + @Result(property ="pumpName",column ="pump_name"), + @Result(property ="tempSet",column ="temp_set"), + @Result(property="waterTemp",column="water_temp"), + @Result(property ="runState",column ="run_state"), + @Result(property ="upWaterState",column ="up_water_state"), + @Result(property ="useWaterState",column ="use_water_state"), + @Result(property ="backWaterState",column ="back_water_state"), + @Result(property ="isFault",column ="is_fault"), + @Result(property ="levelSet",column ="level_set"), + @Result(property ="waterLevel",column ="water_level"), + @Result(property ="tankId",column ="tank_id"), + @Result(property ="tankName",column ="tank_name"), + @Result(property ="envTemp",column ="env_temp") + }) + @Select("select * from now_data where pump_name like concat('%',#{pumpName},'%') " + + "and building_id= #{buildingId} " + + "and pump_id= #{deviceAddr}") + NowDataEntity queryNowDataByPumpName(@Param("buildingId") String buildingId, @Param("deviceAddr") String deviceAddr, @Param("pumpName") String pumpName); + + @Update("") + void updateMultiNowData(NowDataEntity nowDataEntity); } diff --git a/user-service/src/main/java/com/mh/user/model/MultiControlModel.java b/user-service/src/main/java/com/mh/user/model/MultiControlModel.java new file mode 100644 index 0000000..e213cc2 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/model/MultiControlModel.java @@ -0,0 +1,55 @@ +package com.mh.user.model; + +import lombok.Getter; +import lombok.Setter; + +import java.util.StringJoiner; + +/** + * @author LJF + * @version 1.0 + * @project CHWS + * @description 多路控制响应实体类 + * @date 2025-11-20 08:46:22 + */ +@Setter +@Getter +public class MultiControlModel { + + private String curDate; //日期 + private String buildingId; //楼栋编号 + private String buildingName; //楼栋名称 + + private int upPumpRunStateOne; //1号供水泵运行状态 1:运行;0:停止 + private int upPumpIsFaultOne; //1号供水泵故障状态 1:有故障;0:无故障 + private int upPumpRunStateTwo; //2号供水泵运行状态 1:运行;0:停止 + private int upPumpIsFaultTwo; //2号供水泵故障状态 1:有故障;0:无故障 + + private int suctionPumpRunStateOne; //1号抽水泵运行状态 1:运行;0:停止 + private int suctionPumpIsFaultOne; //1号抽水泵故障状态 1:有故障;0:无故障 + private int suctionPumpRunStateTwo; //2号抽水泵运行状态 1:运行;0:停止 + private int suctionPumpIsFaultTwo; //2号抽水泵故障状态 1:有故障;0:无故障 + + private int upValveRunState; //补水电磁阀运行状态 1:运行;0:停止 + + private int gwRunState; // 网关运行状态 标志位(连接状态) 0:正常;1:不在线;2:异常 + + @Override + public String toString() { + return new StringJoiner(", ", MultiControlModel.class.getSimpleName() + "[", "]") + .add("curDate='" + curDate + "'") + .add("buildingId='" + buildingId + "'") + .add("buildingName='" + buildingName + "'") + .add("upPumpRunStateOne=" + upPumpRunStateOne) + .add("upPumpIsFaultOne=" + upPumpIsFaultOne) + .add("upPumpRunStateTwo=" + upPumpRunStateTwo) + .add("upPumpIsFaultTwo=" + upPumpIsFaultTwo) + .add("suctionPumpRunStateOne=" + suctionPumpRunStateOne) + .add("suctionPumpIsFaultOne=" + suctionPumpIsFaultOne) + .add("suctionPumpRunStateTwo=" + suctionPumpRunStateTwo) + .add("suctionPumpIsFaultTwo=" + suctionPumpIsFaultTwo) + .add("upValveRunState=" + upValveRunState) + .add("gwRunState=" + gwRunState) + .toString(); + } +} diff --git a/user-service/src/main/java/com/mh/user/serialport/SerialPortThread.java b/user-service/src/main/java/com/mh/user/serialport/SerialPortThread.java index 31b83f1..826b15f 100644 --- a/user-service/src/main/java/com/mh/user/serialport/SerialPortThread.java +++ b/user-service/src/main/java/com/mh/user/serialport/SerialPortThread.java @@ -1,5 +1,6 @@ package com.mh.user.serialport; +import com.mh.common.utils.StringUtils; import com.mh.user.constants.Constant; import com.mh.user.entity.GatewayManageEntity; import com.mh.user.tcp.SendAndReceiveByTcp; @@ -38,38 +39,46 @@ public class SerialPortThread implements Runnable{ this.countDownLatch = countDownLatch; } - public void run(){ + public void run() { log.info("创建发送接收数据线程>>>>>>>>>>>>>>" + thread); - // 增加判断是什么通讯类型:realCom、tcp - CacheUtil instance = CacheUtil.getInstance(); - List gwList = instance.getGatewayInfo(); - if (gwList != null && !gwList.isEmpty()) { - for (GatewayManageEntity gw : gwList) { - if (gw.getDataCom().toUpperCase().equals("COM"+thread)) { - String communityType = gw.getCommunityType(); - if (Constant.COMMUNITY_TYPE_REAL_COM.equals(communityType)) { - SendAndReceiveByCom sendAndReceiveByCom = new SendAndReceiveByCom(); - try { - sendAndReceiveByCom.sendAndReceive(name, thread); - } catch (Exception e) { - log.error("串口通信发生异常: ", e); - } finally { - this.countDownLatch.countDown(); - } - } else if (Constant.COMMUNITY_TYPE_TCP.equals(communityType)) { - // 开始TCP通信 - SendAndReceiveByTcp sendAndReceiveByTcp = new SendAndReceiveByTcp(); - try { - sendAndReceiveByTcp.sendAndReceive(name, thread, gw.getHeartBeat()); - } catch (Exception e) { - log.error("TCP通信发生异常: ", e); - } finally { - this.countDownLatch.countDown(); + try { + // 增加判断是什么通讯类型:realCom、tcp + CacheUtil instance = CacheUtil.getInstance(); + List gwList = instance.getGatewayInfo(); + if (gwList != null && !gwList.isEmpty()) { + for (GatewayManageEntity gw : gwList) { + if (StringUtils.isBlank(gw.getDataCom())) { + continue; + } + if (gw.getDataCom().toUpperCase().equals("COM" + thread)) { + String communityType = gw.getCommunityType(); + if (Constant.COMMUNITY_TYPE_REAL_COM.equals(communityType)) { + SendAndReceiveByCom sendAndReceiveByCom = new SendAndReceiveByCom(); + try { + sendAndReceiveByCom.sendAndReceive(name, thread); + } catch (Exception e) { + log.error("串口通信发生异常: ", e); + } + return; // 找到并处理后直接返回 + } else if (Constant.COMMUNITY_TYPE_TCP.equals(communityType)) { + // 开始TCP通信 + SendAndReceiveByTcp sendAndReceiveByTcp = new SendAndReceiveByTcp(); + try { + sendAndReceiveByTcp.sendAndReceive(name, thread, gw.getHeartBeat()); + } catch (Exception e) { + log.error("TCP通信发生异常: ", e); + } + return; // 找到并处理后直接返回 } } } } + } finally { + // 确保无论如何都会执行 countDown + if (this.countDownLatch != null) { + this.countDownLatch.countDown(); + } } - } + } diff --git a/user-service/src/main/java/com/mh/user/service/NowDataService.java b/user-service/src/main/java/com/mh/user/service/NowDataService.java index e4a7ddf..b7d841e 100644 --- a/user-service/src/main/java/com/mh/user/service/NowDataService.java +++ b/user-service/src/main/java/com/mh/user/service/NowDataService.java @@ -2,6 +2,7 @@ package com.mh.user.service; import com.mh.user.annotation.SysLogger; import com.mh.user.entity.*; +import com.mh.user.model.MultiControlModel; import com.mh.user.model.WaterLevelModel; import org.apache.ibatis.annotations.Param; import org.apache.ibatis.annotations.Select; @@ -147,5 +148,11 @@ public interface NowDataService { void updateNowPublicData(NowPublicDataEntity publicData); void updatePumpName(String oldPumpId, String oldPumpName, String oldBuildingId, String pumpId, String pumpName, String buildingId, String buildingName); + + NowDataEntity queryNowDataByPumpName(String buildingId, String buildingName, String deviceAddr, String deviceName); + + List queryMultiControlNowData(String buildingId); + + void updateMultiNowData(NowDataEntity nowDataEntity); } diff --git a/user-service/src/main/java/com/mh/user/service/impl/ControlSetServiceImpl.java b/user-service/src/main/java/com/mh/user/service/impl/ControlSetServiceImpl.java index 4c46db9..3ecfb66 100644 --- a/user-service/src/main/java/com/mh/user/service/impl/ControlSetServiceImpl.java +++ b/user-service/src/main/java/com/mh/user/service/impl/ControlSetServiceImpl.java @@ -3,6 +3,7 @@ package com.mh.user.service.impl; import com.mh.common.utils.StringUtils; import com.mh.user.entity.ControlSetEntity; import com.mh.user.mapper.ControlSetMapper; +import com.mh.user.mapper.DeviceInstallMapper; import com.mh.user.service.ControlSetService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -13,6 +14,9 @@ public class ControlSetServiceImpl implements ControlSetService { @Autowired ControlSetMapper controlSetMapper; + @Autowired + DeviceInstallMapper deviceInstallMapper; + @Override public void saveControlSet(ControlSetEntity controlSetEntity) { @@ -33,8 +37,16 @@ public class ControlSetServiceImpl implements ControlSetService { } if (timeName.contains("时控")) { timeName = timeName.replaceAll("时控",""); + timeName = timeName + "时控"; + } else if (timeName.contains("多路控制")) { + // 判断安装信息有没有deviceType='多路控制' + String deviceAddr = deviceInstallMapper.selectDeviceAddr("多路控制", buildingId); + if (StringUtils.isBlank(deviceAddr)) { + return null; + } + return new ControlSetEntity(); } - ControlSetEntity controlSetEntity = controlSetMapper.queryControlSet(buildingId, timeName + "时控"); + ControlSetEntity controlSetEntity = controlSetMapper.queryControlSet(buildingId, timeName); if (null == controlSetEntity) { controlSetEntity = controlSetMapper.queryControlSet(buildingId, timeName + "温控"); } diff --git a/user-service/src/main/java/com/mh/user/service/impl/DeviceCodeParamServiceImpl.java b/user-service/src/main/java/com/mh/user/service/impl/DeviceCodeParamServiceImpl.java index a3a9724..ad5ad71 100644 --- a/user-service/src/main/java/com/mh/user/service/impl/DeviceCodeParamServiceImpl.java +++ b/user-service/src/main/java/com/mh/user/service/impl/DeviceCodeParamServiceImpl.java @@ -64,17 +64,23 @@ public class DeviceCodeParamServiceImpl implements DeviceCodeParamService { @Override public void insertDeviceCodeParamList(List deviceCodeParamEntityList) { - deviceCodeParamMapper.insertDeviceCodeParamList(deviceCodeParamEntityList); + if(!deviceCodeParamEntityList.isEmpty()){ + deviceCodeParamMapper.insertDeviceCodeParamList(deviceCodeParamEntityList); + } } @Override public void insertDeviceCodeParamList2(List deviceCodeParamEntityList) { - deviceCodeParamMapper.insertDeviceCodeParamList2(deviceCodeParamEntityList); + if(!deviceCodeParamEntityList.isEmpty()){ + deviceCodeParamMapper.insertDeviceCodeParamList2(deviceCodeParamEntityList); + } } @Override public void insertDeviceCodeParamList3(List deviceCodeParamEntityList) { - deviceCodeParamMapper.insertDeviceCodeParamList3(deviceCodeParamEntityList); + if(!deviceCodeParamEntityList.isEmpty()){ + deviceCodeParamMapper.insertDeviceCodeParamList3(deviceCodeParamEntityList); + } } @Override diff --git a/user-service/src/main/java/com/mh/user/service/impl/NowDataServiceImpl.java b/user-service/src/main/java/com/mh/user/service/impl/NowDataServiceImpl.java index bffd538..610686b 100644 --- a/user-service/src/main/java/com/mh/user/service/impl/NowDataServiceImpl.java +++ b/user-service/src/main/java/com/mh/user/service/impl/NowDataServiceImpl.java @@ -5,6 +5,7 @@ import com.mh.user.constants.Constant; import com.mh.user.entity.*; import com.mh.user.mapper.*; import com.mh.user.model.DeviceModel; +import com.mh.user.model.MultiControlModel; import com.mh.user.model.PumpModel; import com.mh.user.model.WaterLevelModel; import com.mh.user.service.BuildingService; @@ -14,14 +15,12 @@ import com.mh.user.service.NowDataService; import com.mh.user.utils.DateUtil; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.stereotype.Service; import java.math.BigDecimal; import java.text.SimpleDateFormat; -import java.util.Collections; -import java.util.Date; -import java.util.List; -import java.util.Map; +import java.util.*; import java.util.concurrent.locks.ReentrantLock; @Slf4j @@ -54,6 +53,75 @@ public class NowDataServiceImpl implements NowDataService { ReentrantLock lockB = new ReentrantLock(); @Autowired private AreaMapper areaMapper; + @Qualifier("gatewayManageMapper") + @Autowired + private GatewayManageMapper gatewayManageMapper; + + @Override + public void updateMultiNowData(NowDataEntity nowDataEntity) { + nowDataMapper.updateMultiNowData(nowDataEntity); + } + + @Override + public List queryMultiControlNowData(String buildingId) { + List list = nowDataMapper.queryNowData(buildingId); + if (list.isEmpty()) { + return Collections.emptyList(); + } + // list stream遍历,通过pumpName进行匹配,其中1号供水泵分别赋值 + List result = new ArrayList<>(); + MultiControlModel multiControlModel = new MultiControlModel(); + multiControlModel.setBuildingId(buildingId); + multiControlModel.setBuildingName(list.get(0).getBuildingName()); + multiControlModel.setCurDate(list.get(0).getCurDate()); + for (NowDataEntity nowDataEntity : list) { + switch (nowDataEntity.getPumpName()) { + case "1号供水泵": + multiControlModel.setUpPumpRunStateOne(Integer.parseInt(nowDataEntity.getRunState())); + multiControlModel.setUpPumpIsFaultOne(Integer.parseInt(nowDataEntity.getIsFault())); + break; + case "2号供水泵": + multiControlModel.setUpPumpRunStateTwo(Integer.parseInt(nowDataEntity.getRunState())); + multiControlModel.setUpPumpIsFaultTwo(Integer.parseInt(nowDataEntity.getIsFault())); + break; + case "1号抽水泵": + multiControlModel.setSuctionPumpRunStateOne(Integer.parseInt(nowDataEntity.getRunState())); +// multiControlModel.setSuctionPumpIsFaultOne(Integer.parseInt(nowDataEntity.getIsFault())); + break; + case "2号抽水泵": + multiControlModel.setSuctionPumpRunStateTwo(Integer.parseInt(nowDataEntity.getRunState())); + multiControlModel.setSuctionPumpIsFaultTwo(Integer.parseInt(nowDataEntity.getIsFault())); + break; + case "补水电磁阀": + multiControlModel.setUpValveRunState(Integer.parseInt(nowDataEntity.getRunState())); + break; + } + } + // 在判断网关在线情况 + List devices = deviceInstallMapper.selectOfflineDevice(buildingId, "多路控制"); + if (!devices.isEmpty()) { + DeviceInstallEntity deviceInstallEntity = devices.get(0); + int online = gatewayManageMapper.queryGatewayByDataCom(deviceInstallEntity.getDataCom()); + multiControlModel.setGwRunState(online); + } + result.add(multiControlModel); + return result; + } + + @Override + public NowDataEntity queryNowDataByPumpName(String buildingId, String buildingName, String deviceAddr, String deviceName) { + int count = nowDataMapper.selectNowDataByPumName(buildingId,deviceAddr,deviceName); + if (count==0){ + NowDataEntity nowDataEntity = new NowDataEntity(); + nowDataEntity.setPumpId(deviceAddr); + nowDataEntity.setPumpName(deviceName); + nowDataEntity.setBuildingId(buildingId); + nowDataEntity.setBuildingName(buildingName); + nowDataMapper.saveNowData(nowDataEntity); + return nowDataEntity; + } + return nowDataMapper.queryNowDataByPumpName(buildingId,deviceAddr,deviceName); + } @Override public void saveNowData(NowDataEntity nowDataEntity) { diff --git a/user-service/src/main/java/com/mh/user/strategy/EleMeterStrategy.java b/user-service/src/main/java/com/mh/user/strategy/EleMeterStrategy.java index 088b1b6..4ee8f26 100644 --- a/user-service/src/main/java/com/mh/user/strategy/EleMeterStrategy.java +++ b/user-service/src/main/java/com/mh/user/strategy/EleMeterStrategy.java @@ -59,6 +59,19 @@ public class EleMeterStrategy implements DeviceStrategy { // } String checkWord = ExchangeStringUtil.getStrCRC16(str); //CRC16校验 str = str + checkWord; + } if ("广仪07规约".equals(deviceCodeParamEntity.getBrand())) { + //0代表前面补充0,12代表长度为12,d代表参数为正数型,基表通讯号 + str = String.format("%012d", Long.parseLong(deviceAddr)); + //转换位置 + str = ExchangeStringUtil.changePosition(str); + //拼接功能码 + str = "68" + str + "681104"; + String strData = "00000100"; + //加33操作 + str = str + ExchangeStringUtil.addThree(strData); + //检验和 + String checkSum = ExchangeStringUtil.makeChecksum(str); + str = "FEFEFE" + str + checkSum + "16"; } else { //0代表前面补充0,12代表长度为12,d代表参数为正数型,基表通讯号 str = String.format("%012d", Long.parseLong(deviceAddr)); diff --git a/user-service/src/main/java/com/mh/user/strategy/MultiControlStrategy.java b/user-service/src/main/java/com/mh/user/strategy/MultiControlStrategy.java index 5335e49..8208c3b 100644 --- a/user-service/src/main/java/com/mh/user/strategy/MultiControlStrategy.java +++ b/user-service/src/main/java/com/mh/user/strategy/MultiControlStrategy.java @@ -2,16 +2,16 @@ package com.mh.user.strategy; import com.mh.common.utils.StringUtils; import com.mh.user.constants.Constant; -import com.mh.user.entity.DeviceCodeParamEntity; -import com.mh.user.entity.DeviceInstallEntity; -import com.mh.user.entity.NowPublicDataEntity; -import com.mh.user.entity.SysParamEntity; +import com.mh.user.entity.*; import com.mh.user.service.*; import com.mh.user.utils.ExchangeStringUtil; import com.mh.user.utils.SpringBeanUtil; import lombok.extern.slf4j.Slf4j; import org.springframework.context.ApplicationContext; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; import java.util.Map; /** @@ -59,6 +59,14 @@ public class MultiControlStrategy implements DeviceStrategy { // 设备参数 String param = deviceCodeParamEntity.getParam(); + if (StringUtils.isBlank(param)) { + if ("0010".equals(registerAddr)) { + param = "DO_ALL"; + } else if ("0018".equals(registerAddr)) { + param = "DI_ALL"; + } + } + // 设备值 String dataValue = deviceCodeParamEntity.getDataValue(); @@ -73,6 +81,7 @@ public class MultiControlStrategy implements DeviceStrategy { if (!StringUtils.isBlank(param)) { switch (param) { case "DO_ALL": + deviceCodeParamEntity.setRegisterAddr("0018"); registerAddr = "00180008"; break; case "DO1": @@ -100,6 +109,7 @@ public class MultiControlStrategy implements DeviceStrategy { registerAddr = "001F0001"; break; case "DI_ALL": + deviceCodeParamEntity.setRegisterAddr("0010"); registerAddr = "00100008"; break; case "DI1": @@ -213,7 +223,7 @@ public class MultiControlStrategy implements DeviceStrategy { // 多路控制,长度42,128 public String analysisRelayOrder485(final String dateStr, - final String receiveData, + final String receiveData1, final String registerAddr, final String brand, String buildingId, @@ -231,12 +241,27 @@ public class MultiControlStrategy implements DeviceStrategy { String waterLevelSet = ""; String addr = ""; String param = deviceCodeParamEntity.getParam(); + String receiveData = receiveData1; + if (receiveData1.length() > 42) { + receiveData = receiveData1.substring(0, 42); + } if (Constant.BRAND_YUAN_XIANG.equals(brand)) { String checkStr = receiveData.substring(0, receiveData.length() - 4);// 检验报文 String checkWord = ExchangeStringUtil.getStrCRC16(checkStr); if (checkWord.equalsIgnoreCase(receiveData.substring(receiveData.length() - 4))) { addr = ExchangeStringUtil.hexToDec(checkStr.substring(0, 2));//地址 if (checkStr.startsWith("03", 2)) { + // 判断响应的长度有多长 + int length = receiveData.length(); + if (length == 42) { + if (deviceCodeParamEntity.getRegisterAddr().equals("0010")) { + param = "DI_ALL"; + } else if (deviceCodeParamEntity.getRegisterAddr().equals("0018")) { + param = "DO_ALL"; + } else { + param = "DI_ALL"; + } + } // 根据请求的param参数进行数据截取 switch (param) { case "DI_ALL": @@ -269,11 +294,6 @@ public class MultiControlStrategy implements DeviceStrategy { l1 = checkStr.substring(6, 10); break; } - if (!param.contains("ALL")) { - return l1; - } else { - return l1 + l2 + l3 + l4 + l5 + l6 + l7 + l8; - } } else if (checkStr.startsWith("06", 2) || checkStr.startsWith("04", 2) || checkStr.startsWith("10", 2)) { log.info("时间:{},多路控制地址:{},DO操作成功! ", dateStr, addr); return Constant.SUCCESS; @@ -303,9 +323,10 @@ public class MultiControlStrategy implements DeviceStrategy { nowPublicDataService.saveNowHistoryPublicData(publicData); log.info("地址:{},供回补水状态保存数据库成功!楼栋ID:{},名称:{}", addr, buildingId, buildingName); // 更新now_data表中对应的供水、回水、补水状态 - DeviceInstallEntity deviceInstallEntity = deviceInstallService.selectDevice(addr, "多路控制", buildingId); + DeviceInstallEntity deviceInstallEntity = deviceInstallService.selectDevice(addr, "水位开关", buildingId); if (deviceInstallEntity != null && !StringUtils.isBlank(deviceInstallEntity.getDeviceName())) { + // 判断设备类型是什么类型数据 if (deviceInstallEntity.getDeviceName().contains("低")) { log.info("更新now_data表中低区对应的供水、回水、补水状态,楼栋ID:{},供水状态:{},回水状态:{},补水状态:{}", buildingId, publicData.getUseWater(), publicData.getBackWater(), publicData.getUpWater()); nowDataService.updateNowDataByPumpName("低", buildingId, publicData.getUseWater(), publicData.getBackWater(), publicData.getUpWater()); @@ -324,9 +345,48 @@ public class MultiControlStrategy implements DeviceStrategy { } nowDataService.updateNowPublicData(publicData); } + deviceInstallEntity = deviceInstallService.selectDevice(addr, "多路控制", buildingId); + if (deviceInstallEntity != null + && !StringUtils.isBlank(deviceInstallEntity.getDeviceName())) { + // 查看是否存在1号供水泵、2号供水泵、1号抽水泵、2号抽水泵、补水电磁阀 + NowDataEntity nowDataEntity = nowDataService.queryNowDataByPumpName(buildingId, buildingName, deviceInstallEntity.getDeviceAddr(), "1号供水泵"); + // 多路控制,分别插入或者更新DI点和DO点值 + if (receiveData.length() == 42) { + // l1 l2 l3 l4 l5 l6 l7 l8形成一个key,value + if (param.equals("DI_ALL")) { + nowDataEntity.setRunState(l1); + nowDataEntity.setIsFault(l3); + nowDataService.updateMultiNowData(nowDataEntity); + nowDataEntity = nowDataService.queryNowDataByPumpName(buildingId, buildingName, deviceInstallEntity.getDeviceAddr(), "2号供水泵"); + nowDataEntity.setRunState(l2); + nowDataEntity.setIsFault(l4); + nowDataService.updateMultiNowData(nowDataEntity); + nowDataEntity = nowDataService.queryNowDataByPumpName(buildingId, buildingName, deviceInstallEntity.getDeviceAddr(), "1号抽水泵"); + nowDataEntity.setRunState(l5); + nowDataService.updateMultiNowData(nowDataEntity); + nowDataEntity = nowDataService.queryNowDataByPumpName(buildingId, buildingName, deviceInstallEntity.getDeviceAddr(), "2号抽水泵"); + nowDataEntity.setRunState(l6); + nowDataEntity.setIsFault(l8); + nowDataService.updateMultiNowData(nowDataEntity); + nowDataEntity = nowDataService.queryNowDataByPumpName(buildingId, buildingName, deviceInstallEntity.getDeviceAddr(), "补水电磁阀"); + nowDataEntity.setRunState(l7); + nowDataService.updateMultiNowData(nowDataEntity); + } +// if (param.equals("DO_ALL")) { +// nowDataEntity = nowDataService.queryNowDataByPumpName(buildingId, buildingName, deviceInstallEntity.getDeviceAddr(), "补水电磁阀"); +// nowDataEntity.setRunState(l5); +// nowDataService.updateMultiNowData(nowDataEntity); +// } + } + nowDataService.updateNowPublicData(publicData); + } } } - return Constant.FAIL; + if (!param.contains("ALL")) { + return l1; + } else { + return l1 + l2 + l3 + l4 + l5 + l6 + l7 + l8; + } } return l1; } diff --git a/user-service/src/main/java/com/mh/user/strategy/PressureTransStrategy.java b/user-service/src/main/java/com/mh/user/strategy/PressureTransStrategy.java index 079a7ff..85f11b8 100644 --- a/user-service/src/main/java/com/mh/user/strategy/PressureTransStrategy.java +++ b/user-service/src/main/java/com/mh/user/strategy/PressureTransStrategy.java @@ -54,6 +54,8 @@ public class PressureTransStrategy implements DeviceStrategy { str = str + "0300040001"; // 新款压力变送器 } else if (Constant.BRAND_RU_YI.equals(brand)) { str = str + "0300040001"; + } else if (Constant.BRAND_MEI_YI.equals(brand)) { + str = str + "0304040002"; // 压力输出值 } else { str = str + "0300000002"; // 压力变送器(新的协议) } @@ -85,6 +87,9 @@ public class PressureTransStrategy implements DeviceStrategy { } else if (Constant.BRAND_AU_SUN.equals(brand) || Constant.BRAND_RU_YI.equals(brand)) { data = ExchangeStringUtil.hexToDec(checkStr.substring(6, 10));//十六进制转整形 wtHeight = Double.parseDouble(data) / 100 * 0.102; //通过压力求水高 + } else if (Constant.BRAND_MEI_YI.equals(brand)) { + data = ExchangeStringUtil.hexToDec(checkStr.substring(6, 14));//十六进制转整形 + wtHeight = Double.parseDouble(data); } Double tankHeight; // 默认是高区域 diff --git a/user-service/src/main/java/com/mh/user/tcp/SendAndReceiveByTcp.java b/user-service/src/main/java/com/mh/user/tcp/SendAndReceiveByTcp.java index 71b7b81..326373e 100644 --- a/user-service/src/main/java/com/mh/user/tcp/SendAndReceiveByTcp.java +++ b/user-service/src/main/java/com/mh/user/tcp/SendAndReceiveByTcp.java @@ -114,7 +114,7 @@ public class SendAndReceiveByTcp { continue; } // 处理返回来的数据报文 - dealReceiveData(dateStr, keyVal, i, deviceAddr, deviceType, registerAddr, brand, buildingId, buildingName, receiveMsg, device, null); + dealReceiveData(dateStr, keyVal, i, deviceAddr, deviceType, registerAddr, brand, buildingId, buildingName, receiveMsg, device, deviceManageEntityList.get(i)); } else { log.error("没有找到心跳包数据:{}", heartBeat); } @@ -122,6 +122,7 @@ public class SendAndReceiveByTcp { log.error("发送窗口数据异常==>", e); } } + log.info("----------------{}采集完成----------------", sort); } catch (Exception e) { log.error("-------------串口采集异常!----------->>", e); } diff --git a/user-service/src/main/java/com/mh/user/utils/GetReadOrder485.java b/user-service/src/main/java/com/mh/user/utils/GetReadOrder485.java index 9f4164a..4a3095a 100644 --- a/user-service/src/main/java/com/mh/user/utils/GetReadOrder485.java +++ b/user-service/src/main/java/com/mh/user/utils/GetReadOrder485.java @@ -1045,6 +1045,39 @@ public class GetReadOrder485 { deviceCodeParamEntityList.add(deviceCodeParamEntity2); } } + if (devices.getDeviceType().equals("多路控制")) { + if (Constant.BRAND_YUAN_XIANG.equals(devices.getBrand())) { + DeviceCodeParamEntity deviceCodeParamEntity2 = new DeviceCodeParamEntity(); + deviceCodeParamEntity2.setRegisterAddr("0018");//DO点:读多路启停状态 + deviceCodeParamEntity2.setFunCode("03"); + deviceCodeParamEntity2.setDeviceAddr(devices.getDeviceAddr()); + deviceCodeParamEntity2.setDeviceName(devices.getDeviceName()); + deviceCodeParamEntity2.setDeviceType(devices.getDeviceType()); + deviceCodeParamEntity2.setBaudrate(devices.getBaudRate()); + deviceCodeParamEntity2.setBrand(devices.getBrand()); + deviceCodeParamEntity2.setDataCom(devices.getDataCom()); + // 只获取字符串数字 + deviceCodeParamEntity2.setThread(ExchangeStringUtil.getNumFromString(devices.getDataCom())); + deviceCodeParamEntity2.setBuildingId(devices.getBuildingId()); + deviceCodeParamEntity2.setParity(devices.getParity()); + deviceCodeParamEntityList.add(deviceCodeParamEntity2); + + DeviceCodeParamEntity deviceCodeParamEntity4 = new DeviceCodeParamEntity(); + deviceCodeParamEntity4.setRegisterAddr("0010");//DI点:读取多路运行故障状态 + deviceCodeParamEntity4.setFunCode("03"); + deviceCodeParamEntity4.setDeviceAddr(devices.getDeviceAddr()); + deviceCodeParamEntity4.setDeviceName(devices.getDeviceName()); + deviceCodeParamEntity4.setDeviceType(devices.getDeviceType()); + deviceCodeParamEntity4.setBaudrate(devices.getBaudRate()); + deviceCodeParamEntity4.setBrand(devices.getBrand()); + deviceCodeParamEntity4.setDataCom(devices.getDataCom()); + // 只获取字符串数字 + deviceCodeParamEntity4.setThread(ExchangeStringUtil.getNumFromString(devices.getDataCom())); + deviceCodeParamEntity4.setBuildingId(devices.getBuildingId()); + deviceCodeParamEntity4.setParity(devices.getParity()); + deviceCodeParamEntityList.add(deviceCodeParamEntity4); + } + } deviceCodeParamService.insertDeviceCodeParamList3(deviceCodeParamEntityList); } } diff --git a/user-service/src/main/resources/application-dev.yml b/user-service/src/main/resources/application-dev.yml index a582bc5..3e9f819 100644 --- a/user-service/src/main/resources/application-dev.yml +++ b/user-service/src/main/resources/application-dev.yml @@ -8,10 +8,14 @@ spring: type: com.alibaba.druid.pool.DruidDataSource druid: #添加allowMultiQueries=true 在批量更新时才不会出错 - url: jdbc:sqlserver://127.0.0.1:1433;DatabaseName=chws_chx;allowMultiQueries=true + url: jdbc:sqlserver://127.0.0.1:1433;DatabaseName=chws_bsdz;allowMultiQueries=true driver-class-name: com.microsoft.sqlserver.jdbc.SQLServerDriver username: sa password: mh@803 +# url: jdbc:sqlserver://127.0.0.1:1433;DatabaseName=chws_hx;allowMultiQueries=true +# driver-class-name: com.microsoft.sqlserver.jdbc.SQLServerDriver +# username: sa +# password: mh@803 # url: jdbc:sqlserver://119.29.33.133:2008;DatabaseName=chws_gsh;allowMultiQueries=true # driver-class-name: com.microsoft.sqlserver.jdbc.SQLServerDriver # username: chws diff --git a/user-service/src/main/resources/application-prod.yml b/user-service/src/main/resources/application-prod.yml index 5b24c93..a2a4ab1 100644 --- a/user-service/src/main/resources/application-prod.yml +++ b/user-service/src/main/resources/application-prod.yml @@ -1,5 +1,5 @@ server: - port: 8762 #8761创新、8762广商、8763华厦、广州理工,华粤8762,广外8764 + port: 8762 #8761创新、8762广商、8763华厦、广州理工,华粤8762,广外8764,北师大(珠海)8762 spring: application: name: user-service @@ -19,20 +19,20 @@ spring: # username: test # password: minghan123456@ # #华厦云服务器 - url: jdbc:sqlserver://127.0.0.1:1433;DatabaseName=CHWS;allowMultiQueries=true - driver-class-name: com.microsoft.sqlserver.jdbc.SQLServerDriver - username: chws - password: minghan123456@ +# url: jdbc:sqlserver://127.0.0.1:1433;DatabaseName=CHWS;allowMultiQueries=true +# driver-class-name: com.microsoft.sqlserver.jdbc.SQLServerDriver +# username: chws +# password: minghan123456@ #创新服务器 # url: jdbc:sqlserver://106.55.173.225:57238;DatabaseName=chws_chx;allowMultiQueries=true # driver-class-name: com.microsoft.sqlserver.jdbc.SQLServerDriver # username: chws_gsh # password: Mhtech@803 -# #广商服务器 -# url: jdbc:sqlserver://106.55.173.225:57238;DatabaseName=chws_gsh;allowMultiQueries=true -# driver-class-name: com.microsoft.sqlserver.jdbc.SQLServerDriver -# username: chws_gsh -# password: Mhtech@803 + #广商服务器 + url: jdbc:sqlserver://175.178.153.91:8033;DatabaseName=chws_gsh;allowMultiQueries=true + driver-class-name: com.microsoft.sqlserver.jdbc.SQLServerDriver + username: chws_gsh + password: Mhtech@803gsh #本机 # url: jdbc:sqlserver://127.0.0.1:9956;DatabaseName=CHWS;allowMultiQueries=true # driver-class-name: com.microsoft.sqlserver.jdbc.SQLServerDriver @@ -58,12 +58,18 @@ spring: # username: chws_gw # password: chws_gw@803 - # 华软江门 +# # 华软江门 # url: jdbc:sqlserver://127.0.0.1:57238;DatabaseName=chws_jm;allowMultiQueries=true # driver-class-name: com.microsoft.sqlserver.jdbc.SQLServerDriver # username: chws_jm # password: Mhtech@803 +# # 华软江门 +# url: jdbc:sqlserver://127.0.0.1:8033;DatabaseName=chws_bsdz;allowMultiQueries=true +# driver-class-name: com.microsoft.sqlserver.jdbc.SQLServerDriver +# username: chws_bsdz +# password: Mhtech@803803 + filters: stat,wall,config max-active: 100 initial-size: 1 diff --git a/user-service/src/main/resources/application.yml b/user-service/src/main/resources/application.yml index 9f96606..3d7808a 100644 --- a/user-service/src/main/resources/application.yml +++ b/user-service/src/main/resources/application.yml @@ -1,3 +1,3 @@ spring: profiles: - active: prod + active: dev diff --git a/user-service/src/test/java/com/mh/user/UserServiceApplicationTests.java b/user-service/src/test/java/com/mh/user/UserServiceApplicationTests.java index c514dfb..343df81 100644 --- a/user-service/src/test/java/com/mh/user/UserServiceApplicationTests.java +++ b/user-service/src/test/java/com/mh/user/UserServiceApplicationTests.java @@ -124,6 +124,7 @@ class UserServiceApplicationTests { "59", "46栋", "30030200E105C8", + null ); }