From 19248479eb624178ce0f6b0c3dda027f1f7e3ab6 Mon Sep 17 00:00:00 2001 From: mh Date: Wed, 10 Jan 2024 17:44:14 +0800 Subject: [PATCH] =?UTF-8?q?1=E3=80=81=E8=AE=BE=E5=A4=87=E6=9B=B4=E6=8D=A2?= =?UTF-8?q?=EF=BC=8C=E5=8A=A8=E6=80=81=E6=B7=BB=E5=8A=A0=E9=87=87=E9=9B=86?= =?UTF-8?q?=E6=8C=87=E4=BB=A4=E4=BB=A5=E5=8F=8A=E5=A2=9E=E5=8A=A0=E6=A0=A1?= =?UTF-8?q?=E9=AA=8C=E4=BD=8D=EF=BC=9B2=E3=80=81=E5=A2=9E=E5=8A=A0?= =?UTF-8?q?=E6=97=B6=E6=8E=A7=E6=A0=A1=E9=AA=8C=EF=BC=9B3=E3=80=81?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E7=91=9E=E6=98=9F=E7=83=AD=E6=B3=B5=E6=97=B6?= =?UTF-8?q?=E9=92=9F=E6=A0=A1=E9=AA=8C=EF=BC=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- user-service/pom.xml | 16 +- .../com/mh/user/UserServiceApplication.java | 1 - .../java/com/mh/user/aspect/DaoAspect.java | 182 +++--- .../java/com/mh/user/config/QuartzConfig.java | 1 - .../controller/DeviceInstallController.java | 5 + .../user/controller/SerialPortController.java | 2 - .../mh/user/entity/DeviceInstallEntity.java | 5 + .../com/mh/user/entity/WaterLevelEntity.java | 1 + .../java/com/mh/user/job/DealDataJob.java | 3 - .../mh/user/mapper/DeviceCodeParamMapper.java | 15 +- .../mh/user/mapper/DeviceInstallMapper.java | 12 +- .../com/mh/user/mapper/NowDataMapper.java | 7 +- .../serialport/SerialPortSendReceive.java | 558 +++++++++--------- .../serialport/SerialPortSendReceive2.java | 4 +- .../mh/user/serialport/SerialPortSingle.java | 436 +++++++------- .../mh/user/serialport/SerialPortSingle2.java | 15 +- .../mh/user/service/DeviceInstallService.java | 2 + .../com/mh/user/service/NowDataService.java | 2 +- .../impl/DeviceControlServiceImpl.java | 56 +- .../impl/DeviceInstallServiceImpl.java | 19 +- .../user/service/impl/NowDataServiceImpl.java | 4 +- .../user/utils/AnalysisReceiveOrder485.java | 21 +- .../java/com/mh/user/utils/CacheUtil.java | 7 + .../com/mh/user/utils/GetReadOrder485.java | 34 +- .../java/com/mh/user/utils/TimedTask2.java | 204 +++---- .../src/main/resources/application-dev.yml | 6 +- .../src/main/resources/application-prod.yml | 18 +- .../mh/user/UserServiceApplicationTests.java | 15 +- 热水新增脚本.sql | 7 + 29 files changed, 891 insertions(+), 767 deletions(-) diff --git a/user-service/pom.xml b/user-service/pom.xml index aaefc8a..76b5093 100644 --- a/user-service/pom.xml +++ b/user-service/pom.xml @@ -36,11 +36,11 @@ spring-boot-starter-quartz - - org.springframework.cloud - spring-cloud-starter-config - 2.2.2.RELEASE - + + + + + org.springframework.boot spring-boot-starter-test @@ -142,6 +142,12 @@ 2.8.8 + + org.apache.commons + commons-collections4 + 4.4 + + diff --git a/user-service/src/main/java/com/mh/user/UserServiceApplication.java b/user-service/src/main/java/com/mh/user/UserServiceApplication.java index 711235b..3c4b759 100644 --- a/user-service/src/main/java/com/mh/user/UserServiceApplication.java +++ b/user-service/src/main/java/com/mh/user/UserServiceApplication.java @@ -3,7 +3,6 @@ package com.mh.user; import com.mh.user.job.CollectionLoopRunner; import com.mh.user.serialport.SerialPortListener; import com.mh.user.serialport.SerialPortUtil; -import com.mh.user.utils.TimedTask2; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.builder.SpringApplicationBuilder; diff --git a/user-service/src/main/java/com/mh/user/aspect/DaoAspect.java b/user-service/src/main/java/com/mh/user/aspect/DaoAspect.java index cb54017..7732dd7 100644 --- a/user-service/src/main/java/com/mh/user/aspect/DaoAspect.java +++ b/user-service/src/main/java/com/mh/user/aspect/DaoAspect.java @@ -1,91 +1,91 @@ -package com.mh.user.aspect; - -import java.util.Date; - -import javax.servlet.http.HttpServletRequest; - -import com.mh.common.utils.StringUtils; -import com.mh.user.utils.SecurityUtils; -import org.apache.commons.beanutils.BeanUtils; -import org.aspectj.lang.ProceedingJoinPoint; -import org.aspectj.lang.annotation.Around; -import org.aspectj.lang.annotation.Aspect; -import org.aspectj.lang.annotation.Pointcut; -import org.springframework.context.annotation.Configuration; -import org.springframework.stereotype.Component; -import org.springframework.web.context.request.RequestContextHolder; -import org.springframework.web.context.request.ServletRequestAttributes; - -/** - * DAO切面,插入创建人,创建时间,修改人,修改时间 - * @author Louis - * @date Oct 29, 2018 - */ -@Aspect -@Component -@Configuration -public class DaoAspect { - private static final String createBy = "createBy"; - private static final String createTime = "createTime"; - private static final String lastUpdateBy = "lastUpdateBy"; - private static final String lastUpdateTime = "lastUpdateTime"; - - @Pointcut("execution(* com.mh.*.mapper.*.update*(..))") - public void daoUpdate() { - } - - @Pointcut("execution(* com.mh.*.mapper.*.insert*(..))") - public void daoCreate() { - } - - @Around("daoUpdate()") - public Object doAroundUpdate(ProceedingJoinPoint pjp) throws Throwable { - ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes(); - if (attributes == null) { - return pjp.proceed(); - } - HttpServletRequest request = attributes.getRequest(); - String token = request.getHeader("token"); - String username = getUserName(); - if (token != null && username != null) { - Object[] objects = pjp.getArgs(); - if (objects != null && objects.length > 0) { - for (Object arg : objects) { - BeanUtils.setProperty(arg, lastUpdateBy, username); - BeanUtils.setProperty(arg, lastUpdateTime, new Date()); - } - } - } - Object object = pjp.proceed(); - return object; - - } - - @Around("daoCreate()") - public Object doAroundCreate(ProceedingJoinPoint pjp) throws Throwable { - ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes(); - if (attributes == null) { - return pjp.proceed(); - } - Object[] objects = pjp.getArgs(); - if (objects != null && objects.length > 0) { - for (Object arg : objects) { - String username = getUserName(); - if (username != null) { - if (StringUtils.isBlank(BeanUtils.getProperty(arg, createBy))) { - BeanUtils.setProperty(arg, createBy, username); - } - if (StringUtils.isBlank(BeanUtils.getProperty(arg, createTime))) { - BeanUtils.setProperty(arg, createTime, new Date()); - } - } - } - } - Object object = pjp.proceed(); - return object; - } - - private String getUserName() { - return SecurityUtils.getUsername(); - } -} +//package com.mh.user.aspect; +// +//import java.util.Date; +// +//import javax.servlet.http.HttpServletRequest; +// +//import com.mh.common.utils.StringUtils; +//import com.mh.user.utils.SecurityUtils; +//import org.apache.commons.beanutils.BeanUtils; +//import org.aspectj.lang.ProceedingJoinPoint; +//import org.aspectj.lang.annotation.Around; +//import org.aspectj.lang.annotation.Aspect; +//import org.aspectj.lang.annotation.Pointcut; +//import org.springframework.context.annotation.Configuration; +//import org.springframework.stereotype.Component; +//import org.springframework.web.context.request.RequestContextHolder; +//import org.springframework.web.context.request.ServletRequestAttributes; +// +///** +// * DAO切面,插入创建人,创建时间,修改人,修改时间 +// * @author Louis +// * @date Oct 29, 2018 +// */ +//@Aspect +//@Component +//@Configuration +//public class DaoAspect { +// private static final String createBy = "createBy"; +// private static final String createTime = "createTime"; +// private static final String lastUpdateBy = "lastUpdateBy"; +// private static final String lastUpdateTime = "lastUpdateTime"; +// +// @Pointcut("execution(* com.mh.*.mapper.*.update*(..))") +// public void daoUpdate() { +// } +// +// @Pointcut("execution(* com.mh.*.mapper.*.insert*(..))") +// public void daoCreate() { +// } +// +// @Around("daoUpdate()") +// public Object doAroundUpdate(ProceedingJoinPoint pjp) throws Throwable { +// ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes(); +// if (attributes == null) { +// return pjp.proceed(); +// } +// HttpServletRequest request = attributes.getRequest(); +// String token = request.getHeader("token"); +// String username = getUserName(); +// if (token != null && username != null) { +// Object[] objects = pjp.getArgs(); +// if (objects != null && objects.length > 0) { +// for (Object arg : objects) { +// BeanUtils.setProperty(arg, lastUpdateBy, username); +// BeanUtils.setProperty(arg, lastUpdateTime, new Date()); +// } +// } +// } +// Object object = pjp.proceed(); +// return object; +// +// } +// +// @Around("daoCreate()") +// public Object doAroundCreate(ProceedingJoinPoint pjp) throws Throwable { +// ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes(); +// if (attributes == null) { +// return pjp.proceed(); +// } +// Object[] objects = pjp.getArgs(); +// if (objects != null && objects.length > 0) { +// for (Object arg : objects) { +// String username = getUserName(); +// if (username != null) { +// if (StringUtils.isBlank(BeanUtils.getProperty(arg, createBy))) { +// BeanUtils.setProperty(arg, createBy, username); +// } +// if (StringUtils.isBlank(BeanUtils.getProperty(arg, createTime))) { +// BeanUtils.setProperty(arg, createTime, new Date()); +// } +// } +// } +// } +// Object object = pjp.proceed(); +// return object; +// } +// +// private String getUserName() { +// return SecurityUtils.getUsername(); +// } +//} diff --git a/user-service/src/main/java/com/mh/user/config/QuartzConfig.java b/user-service/src/main/java/com/mh/user/config/QuartzConfig.java index 81e381f..609c1b0 100644 --- a/user-service/src/main/java/com/mh/user/config/QuartzConfig.java +++ b/user-service/src/main/java/com/mh/user/config/QuartzConfig.java @@ -1,7 +1,6 @@ package com.mh.user.config; import com.mh.user.job.JobFactory; -import com.mh.user.utils.TimedTask2; import lombok.extern.slf4j.Slf4j; import org.quartz.Scheduler; import org.springframework.context.annotation.Bean; diff --git a/user-service/src/main/java/com/mh/user/controller/DeviceInstallController.java b/user-service/src/main/java/com/mh/user/controller/DeviceInstallController.java index 41874ff..4da6bb3 100644 --- a/user-service/src/main/java/com/mh/user/controller/DeviceInstallController.java +++ b/user-service/src/main/java/com/mh/user/controller/DeviceInstallController.java @@ -1,6 +1,7 @@ package com.mh.user.controller; import com.mh.common.http.HttpResult; +import com.mh.common.utils.StringUtils; import com.mh.user.annotation.BusinessType; import com.mh.user.annotation.SysLogger; import com.mh.user.entity.BuildingEntity; @@ -55,6 +56,10 @@ public class DeviceInstallController { DeviceInstallEntity oldEntity = deviceInstallService.selectDeviceById(deviceInstallEntity.getId()); // 删除全部的device_code_param值 deviceInstallService.deleteParamCode(oldEntity); + // 设置校验位 + if (StringUtils.isBlank(deviceInstallEntity.getParity())) { + deviceInstallEntity.setParity(oldEntity.getParity()); + } // 在创建新的device_code_param值 deviceInstallService.createParamCode(deviceInstallEntity); // 更新device_install diff --git a/user-service/src/main/java/com/mh/user/controller/SerialPortController.java b/user-service/src/main/java/com/mh/user/controller/SerialPortController.java index cea853a..8e2b0f0 100644 --- a/user-service/src/main/java/com/mh/user/controller/SerialPortController.java +++ b/user-service/src/main/java/com/mh/user/controller/SerialPortController.java @@ -11,8 +11,6 @@ import com.mh.user.entity.DeviceInstallEntity; import com.mh.user.entity.PumpSetEntity; import com.mh.user.model.DeviceModel; import com.mh.user.model.SerialPortModel; -import com.mh.user.serialport.SerialPortSendReceive; -import com.mh.user.serialport.SerialPortSingle; import com.mh.user.serialport.SerialPortSingle2; import com.mh.user.service.ControlSetService; import com.mh.user.service.DeviceInstallService; diff --git a/user-service/src/main/java/com/mh/user/entity/DeviceInstallEntity.java b/user-service/src/main/java/com/mh/user/entity/DeviceInstallEntity.java index 1cba23f..8bdd5c5 100644 --- a/user-service/src/main/java/com/mh/user/entity/DeviceInstallEntity.java +++ b/user-service/src/main/java/com/mh/user/entity/DeviceInstallEntity.java @@ -32,5 +32,10 @@ public class DeviceInstallEntity { private String remarks; private double dayValue; private double deviationValue; + private int isUse; + + private int isFault; + + private String seat; } diff --git a/user-service/src/main/java/com/mh/user/entity/WaterLevelEntity.java b/user-service/src/main/java/com/mh/user/entity/WaterLevelEntity.java index ee9b7d2..7488a20 100644 --- a/user-service/src/main/java/com/mh/user/entity/WaterLevelEntity.java +++ b/user-service/src/main/java/com/mh/user/entity/WaterLevelEntity.java @@ -10,6 +10,7 @@ public class WaterLevelEntity { private Date curDate; private String buildingID; private String buildingName; + private String deviceName; private String level00; private String level02; private String level08; 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 5d8bbba..0a398e4 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 @@ -1,13 +1,10 @@ package com.mh.user.job; import com.mh.user.constants.Constant; -import com.mh.user.serialport.SerialPortSendReceive; import com.mh.user.serialport.SerialPortThread; import com.mh.user.service.DeviceCodeParamService; import com.mh.user.service.DealDataService; -import com.mh.user.utils.AnalysisReceiveOrder485; import com.mh.user.utils.ComThreadPoolService; -import com.mh.user.utils.GetReadOrder485; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.scheduling.annotation.Scheduled; diff --git a/user-service/src/main/java/com/mh/user/mapper/DeviceCodeParamMapper.java b/user-service/src/main/java/com/mh/user/mapper/DeviceCodeParamMapper.java index 3c47cb3..6e8c8cc 100644 --- a/user-service/src/main/java/com/mh/user/mapper/DeviceCodeParamMapper.java +++ b/user-service/src/main/java/com/mh/user/mapper/DeviceCodeParamMapper.java @@ -101,11 +101,12 @@ public interface DeviceCodeParamMapper { "register_addr," + "create_time," + "building_id," + - "parity" + + "parity," + + "thread" + ")" + "values " + "" + - "(#{item.deviceAddr},#{item.deviceName},#{item.deviceType},#{item.dataCom},#{item.baudrate},#{item.brand},#{item.funCode},#{item.registerAddr},getDate(),#{item.buildingId},#{item.parity})" + + "(#{item.deviceAddr},#{item.deviceName},#{item.deviceType},#{item.dataCom},#{item.baudrate},#{item.brand},#{item.funCode},#{item.registerAddr},getDate(),#{item.buildingId},#{item.parity},#{item.thread})" + "" + "") void insertDeviceCodeParamList(@Param("deviceCodeParamEntityList") List deviceCodeParamEntityList); @@ -123,11 +124,12 @@ public interface DeviceCodeParamMapper { "register_addr," + "create_time," + "building_id," + - "parity" + + "parity," + + "thread" + ")" + "values " + "" + - "(#{item.deviceAddr},#{item.deviceName},#{item.deviceType},#{item.dataCom},#{item.baudrate},#{item.brand},#{item.funCode},#{item.registerAddr},getDate(),#{item.buildingId},#{item.parity})" + + "(#{item.deviceAddr},#{item.deviceName},#{item.deviceType},#{item.dataCom},#{item.baudrate},#{item.brand},#{item.funCode},#{item.registerAddr},getDate(),#{item.buildingId},#{item.parity},#{item.thread})" + "" + "") void insertDeviceCodeParamList2(@Param("deviceCodeParamEntityList") List deviceCodeParamEntityList); @@ -145,11 +147,12 @@ public interface DeviceCodeParamMapper { "register_addr," + "create_time," + "building_id," + - "parity" + + "parity," + + "thread" + ")" + "values " + "" + - "(#{item.deviceAddr},#{item.deviceName},#{item.deviceType},#{item.dataCom},#{item.baudrate},#{item.brand},#{item.funCode},#{item.registerAddr},getDate(),#{item.buildingId},#{item.parity})" + + "(#{item.deviceAddr},#{item.deviceName},#{item.deviceType},#{item.dataCom},#{item.baudrate},#{item.brand},#{item.funCode},#{item.registerAddr},getDate(),#{item.buildingId},#{item.parity},#{item.thread})" + "" + "") void insertDeviceCodeParamList3(@Param("deviceCodeParamEntityList") List deviceCodeParamEntityList); 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 1d209e7..ea8215b 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 @@ -6,11 +6,13 @@ import com.mh.user.mapper.provider.DeviceInstallProvider; import com.mh.user.model.DeviceModel; import org.apache.ibatis.annotations.*; import org.apache.ibatis.mapping.StatementType; +import tk.mybatis.mapper.common.BaseMapper; + import java.util.Date; import java.util.List; @Mapper -public interface DeviceInstallMapper { +public interface DeviceInstallMapper extends BaseMapper { /** * 设备安装模块 @@ -41,6 +43,7 @@ public interface DeviceInstallMapper { " , installer = #{installer} " + " , building_id = #{buildingId} " + " , remarks = #{remarks} " + + " , parity = #{parity} " + " where id = #{id} " + "") int updateDevice(DeviceInstallEntity deviceInstallEntity); @@ -320,6 +323,13 @@ public interface DeviceInstallMapper { @Param("deviceType") String deviceType, @Param("buildingId") String buildingId); + @ResultMap("rs") @Select("select * from device_install where id = #{id} ") DeviceInstallEntity selectDeviceById(@Param("id") Long id); + + @Update("update device_install set last_value = #{lastValue}, last_date = getdate() where device_addr = #{deviceAddr} and building_id = #{buildingId} and device_type = #{deviceType} ") + void updateLastValueByOther(@Param("deviceAddr") String addr, + @Param("lastValue") String strWtLevel, + @Param("deviceType") String deviceType, + @Param("buildingId") String buildingId); } 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 f763403..bacacfd 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 @@ -176,7 +176,8 @@ public interface NowDataMapper { @Results({ @Result(property="curDate",column="cur_date"), @Result(property="buildingID",column="building_id"), - @Result(property="buildingName",column="building_name") + @Result(property="buildingName",column="building_name"), + @Result(property="deviceName",column="device_name") }) @SelectProvider(type = NowDataProvider.class,method = "queryBuildWaterLevel") List queryBuildWaterLevel(@Param("curDate") String curDate, @@ -305,9 +306,9 @@ public interface NowDataMapper { void proWaterTemp(@Param("curDate") String curDate,@Param("buildingID") String buildingID,@Param("pumpID") String pumpID); //生成楼栋水位 - @Select("exec pro_waterLevel #{curDate,jdbcType=VARCHAR,mode=IN},#{buildingID,jdbcType=VARCHAR,mode=IN} ") + @Select("exec pro_waterLevel #{curDate,jdbcType=VARCHAR,mode=IN},#{buildingID,jdbcType=VARCHAR,mode=IN}, #{deviceAddr,jdbcType=VARCHAR,mode=IN} ") @Options(statementType = StatementType.CALLABLE) - void proWaterLevel(@Param("curDate") String curDate,@Param("buildingID") String buildingID); + void proWaterLevel(@Param("curDate") String curDate,@Param("buildingID") String buildingID, @Param("deviceAddr") String deviceAddr); //在没有接收到返回值前设置监控界面热泵是否离线 @Update("update now_data set run_state=#{strState} where building_id=#{buildingId} and pump_id=#{pumpId}") diff --git a/user-service/src/main/java/com/mh/user/serialport/SerialPortSendReceive.java b/user-service/src/main/java/com/mh/user/serialport/SerialPortSendReceive.java index 1bb1db6..8032496 100644 --- a/user-service/src/main/java/com/mh/user/serialport/SerialPortSendReceive.java +++ b/user-service/src/main/java/com/mh/user/serialport/SerialPortSendReceive.java @@ -1,281 +1,281 @@ -package com.mh.user.serialport; - -import com.mh.user.constants.Constant; -import com.mh.user.entity.DeviceCodeParamEntity; -import com.mh.user.service.BuildingService; -import com.mh.user.service.DeviceCodeParamService; -import com.mh.user.service.DeviceInstallService; -import com.mh.user.service.NowDataService; -import com.mh.user.utils.*; -import lombok.extern.slf4j.Slf4j; -import org.springframework.context.ApplicationContext; -import gnu.io.SerialPort; -import java.nio.ByteBuffer; -import java.nio.charset.StandardCharsets; -import java.text.SimpleDateFormat; -import java.util.ArrayList; -import java.util.Date; -import java.util.List; - -/** - * @author nxr - * @title : - * @description : 串口发送和接收处理,采集类 - * @updateTime 2022-08-10 - * @throws : - */ -@Slf4j -public class SerialPortSendReceive { - - private String receiveStr = null; - public SerialPort serialPort = null; - private int size = 0; - private int baudrate=9600; - private String parity=null; - List deviceManageEntityList; - // 调用service - ApplicationContext context = SpringBeanUtil.getApplicationContext(); - DeviceCodeParamService deviceCodeParamService = context.getBean(DeviceCodeParamService.class); - DeviceInstallService deviceInstallService = context.getBean(DeviceInstallService.class); - NowDataService nowDataService = context.getBean(NowDataService.class); - BuildingService buildingService = context.getBean(BuildingService.class); - AnalysisReceiveOrder485 analysisReceiveOrder485 = new AnalysisReceiveOrder485(); - - public void serialPortSend(String sort,String thread) { - //查看所有串口 - SerialPortUtil serialPortUtil = SerialPortUtil.getSerialPortUtil(); - ArrayList port = serialPortUtil.findPort(); - SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); - Date date = new Date(); - String dateStr = df.format(date); - -// SerialTool serialPortUtil = SerialTool.getSerialPortUtil(); +//package com.mh.user.serialport; +// +//import com.mh.user.constants.Constant; +//import com.mh.user.entity.DeviceCodeParamEntity; +//import com.mh.user.service.BuildingService; +//import com.mh.user.service.DeviceCodeParamService; +//import com.mh.user.service.DeviceInstallService; +//import com.mh.user.service.NowDataService; +//import com.mh.user.utils.*; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.context.ApplicationContext; +//import gnu.io.SerialPort; +//import java.nio.ByteBuffer; +//import java.nio.charset.StandardCharsets; +//import java.text.SimpleDateFormat; +//import java.util.ArrayList; +//import java.util.Date; +//import java.util.List; +// +///** +// * @author nxr +// * @title : +// * @description : 串口发送和接收处理,采集类 +// * @updateTime 2022-08-10 +// * @throws : +// */ +//@Slf4j +//public class SerialPortSendReceive { +// +// private String receiveStr = null; +// public SerialPort serialPort = null; +// private int size = 0; +// private int baudrate=9600; +// private String parity=null; +// List deviceManageEntityList; +// // 调用service +// ApplicationContext context = SpringBeanUtil.getApplicationContext(); +// DeviceCodeParamService deviceCodeParamService = context.getBean(DeviceCodeParamService.class); +// DeviceInstallService deviceInstallService = context.getBean(DeviceInstallService.class); +// NowDataService nowDataService = context.getBean(NowDataService.class); +// BuildingService buildingService = context.getBean(BuildingService.class); +// AnalysisReceiveOrder485 analysisReceiveOrder485 = new AnalysisReceiveOrder485(); +// +// public void serialPortSend(String sort,String thread) { +// //查看所有串口 +// SerialPortUtil serialPortUtil = SerialPortUtil.getSerialPortUtil(); // ArrayList port = serialPortUtil.findPort(); -// comName=comName.toUpperCase(); //转为大写 -// if (port.contains(comName)){ - try{ - //生成对应的采集指令 - if (sort.equals("1")){ //水温、水位 - deviceManageEntityList = deviceCodeParamService.queryCodeParam3(thread); - }else if (sort.equals("2")){ //采集水、电、运行状态! - deviceManageEntityList = deviceCodeParamService.queryCodeParam4(thread); - }else if (sort.equals("3")){ //采集设定温度、设定水位、故障状态! - deviceManageEntityList = deviceCodeParamService.queryCodeParam5(thread); - }else{ - deviceManageEntityList = deviceCodeParamService.queryCodeParam3(thread); - } - size = deviceManageEntityList.size(); - for (int i=0;i", e); - } - receiveStr=""; - //从串口读取数据 - byte[] bytes= serialPortUtil.readFromPort(serialPort); - try { - String byteStr = new String(bytes, 0, bytes.length).trim(); - } catch (NullPointerException e) { - serialPortUtil.closePort(serialPort); - Thread.sleep(2000); - log.info("串口"+serialPort+"没有数据返回!"+i); - log.info("----------------"+deviceType+"离线,设备号:"+deviceAddr+",所属楼栋:"+buildingName+"----------------"); - Constant.WEB_FLAG=false;//可以采集的状态 - if(i==size-1){ - Constant.FLAG=false; - } - String time1=deviceInstallService.selectLastDate(deviceType,deviceAddr,buildingId); - Date date1=new Date(); - String time2=df.format(date1); - if (time1==null){ - time1=df.format(date1); - } - int d= ExchangeStringUtil.compareCopyTime(time1,time2); - if (d==1){ - deviceInstallService.updateNotOnline(deviceAddr,deviceType,buildingId,"离线"); //所有设备离线 - if (deviceType.equals("热泵")){ - nowDataService.updateRunState(buildingId,deviceAddr,"离线", buildingName); //监控界面状态表热泵在线状态 - } - } - continue; - } - receiveStr = receiveStr + printHexString(bytes); - //去掉空格和null - receiveStr = receiveStr.replace("null", ""); - receiveStr = receiveStr.replace(" ", ""); - log.info("串口"+serialPort+"接受第"+i+"数据:" + receiveStr + ",大小: " + receiveStr.length()); - try{ - serialPortUtil.closePort(serialPort); - log.info("关闭"+serialPort); - }catch (Exception e){ -// e.printStackTrace(); - Constant.WEB_FLAG=false;//可以采集的状态 - if(i==size-1){ - Constant.FLAG=false; - } - log.error("关闭"+serialPort+"失败!"); - } - //返回值全部变成大写 - String receiveData = receiveStr.toUpperCase(); - //截取去掉FE - String dataStr; - if (receiveData.length()>8){ - String str1=receiveData.substring(0,8); - String str2=receiveData.substring(8); - dataStr=str1.replace("FE", "")+str2; - }else{ - dataStr = receiveData.replace("FE", ""); - } - deviceInstallService.updateOnline(deviceAddr,deviceType,buildingId,"在线"); //设备在线 - log.info("----------------"+deviceType+"在线,设备号:"+deviceAddr+",所属楼栋:"+buildingName+"----------------"); - if (deviceType.equals("热泵")){ - String strState=nowDataService.selectState(buildingId,deviceAddr); - if (strState!=null && strState.equals("离线")){ //采集到数据 - nowDataService.updateRunState(buildingId,deviceAddr,"不运行", buildingName); //监控界面状态表热泵在线状态 - } - } - try{ - SerialPortSendReceive2.analysisReceiveData(dateStr, deviceType, registerAddr, brand, buildingId, dataStr, analysisReceiveOrder485, nowDataService, buildingName); - }catch (Exception e){ -// e.printStackTrace(); - Constant.WEB_FLAG=false;//可以采集的状态 - if(i==size-1){ - Constant.FLAG=false; - } - log.error(deviceManageEntityList.get(i).getDeviceType()+"保存数据库失败!"+i); - } - Thread.sleep(1000); - }else{ - Constant.WEB_FLAG=false;//可以采集的状态 - if(i==size-1){ - Constant.FLAG=false; - } - log.info("-------------串口:"+comName+"不存在!-------------"); - } - if(i==size-1){ - Constant.FLAG=false; - log.info("-------------一轮采集完,采集标志Constant.Flag="+Constant.FLAG+"-------------"); - } - } - }catch (Exception e){ - e.printStackTrace(); - Constant.WEB_FLAG=false;//可以采集的状态 - Constant.FLAG=false; - log.error("-------------串口采集异常!-------------"); - } -// }else { -// log.info("串口:"+comName+"不存在!"); +// SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); +// Date date = new Date(); +// String dateStr = df.format(date); +// +//// SerialTool serialPortUtil = SerialTool.getSerialPortUtil(); +//// ArrayList port = serialPortUtil.findPort(); +//// comName=comName.toUpperCase(); //转为大写 +//// if (port.contains(comName)){ +// try{ +// //生成对应的采集指令 +// if (sort.equals("1")){ //水温、水位 +// deviceManageEntityList = deviceCodeParamService.queryCodeParam3(thread); +// }else if (sort.equals("2")){ //采集水、电、运行状态! +// deviceManageEntityList = deviceCodeParamService.queryCodeParam4(thread); +// }else if (sort.equals("3")){ //采集设定温度、设定水位、故障状态! +// deviceManageEntityList = deviceCodeParamService.queryCodeParam5(thread); +// }else{ +// deviceManageEntityList = deviceCodeParamService.queryCodeParam3(thread); +// } +// size = deviceManageEntityList.size(); +// for (int i=0;i", e); +// } +// receiveStr=""; +// //从串口读取数据 +// byte[] bytes= serialPortUtil.readFromPort(serialPort); +// try { +// String byteStr = new String(bytes, 0, bytes.length).trim(); +// } catch (NullPointerException e) { +// serialPortUtil.closePort(serialPort); +// Thread.sleep(2000); +// log.info("串口"+serialPort+"没有数据返回!"+i); +// log.info("----------------"+deviceType+"离线,设备号:"+deviceAddr+",所属楼栋:"+buildingName+"----------------"); +// Constant.WEB_FLAG=false;//可以采集的状态 +// if(i==size-1){ +// Constant.FLAG=false; +// } +// String time1=deviceInstallService.selectLastDate(deviceType,deviceAddr,buildingId); +// Date date1=new Date(); +// String time2=df.format(date1); +// if (time1==null){ +// time1=df.format(date1); +// } +// int d= ExchangeStringUtil.compareCopyTime(time1,time2); +// if (d==1){ +// deviceInstallService.updateNotOnline(deviceAddr,deviceType,buildingId,"离线"); //所有设备离线 +// if (deviceType.equals("热泵")){ +// nowDataService.updateRunState(buildingId,deviceAddr,"离线", buildingName); //监控界面状态表热泵在线状态 +// } +// } +// continue; +// } +// receiveStr = receiveStr + printHexString(bytes); +// //去掉空格和null +// receiveStr = receiveStr.replace("null", ""); +// receiveStr = receiveStr.replace(" ", ""); +// log.info("串口"+serialPort+"接受第"+i+"数据:" + receiveStr + ",大小: " + receiveStr.length()); +// try{ +// serialPortUtil.closePort(serialPort); +// log.info("关闭"+serialPort); +// }catch (Exception e){ +//// e.printStackTrace(); +// Constant.WEB_FLAG=false;//可以采集的状态 +// if(i==size-1){ +// Constant.FLAG=false; +// } +// log.error("关闭"+serialPort+"失败!"); +// } +// //返回值全部变成大写 +// String receiveData = receiveStr.toUpperCase(); +// //截取去掉FE +// String dataStr; +// if (receiveData.length()>8){ +// String str1=receiveData.substring(0,8); +// String str2=receiveData.substring(8); +// dataStr=str1.replace("FE", "")+str2; +// }else{ +// dataStr = receiveData.replace("FE", ""); +// } +// deviceInstallService.updateOnline(deviceAddr,deviceType,buildingId,"在线"); //设备在线 +// log.info("----------------"+deviceType+"在线,设备号:"+deviceAddr+",所属楼栋:"+buildingName+"----------------"); +// if (deviceType.equals("热泵")){ +// String strState=nowDataService.selectState(buildingId,deviceAddr); +// if (strState!=null && strState.equals("离线")){ //采集到数据 +// nowDataService.updateRunState(buildingId,deviceAddr,"不运行", buildingName); //监控界面状态表热泵在线状态 +// } +// } +// try{ +// SerialPortSendReceive2.analysisReceiveData(dateStr, deviceType, registerAddr, brand, buildingId, dataStr, analysisReceiveOrder485, nowDataService, buildingName); +// }catch (Exception e){ +//// e.printStackTrace(); +// Constant.WEB_FLAG=false;//可以采集的状态 +// if(i==size-1){ +// Constant.FLAG=false; +// } +// log.error(deviceManageEntityList.get(i).getDeviceType()+"保存数据库失败!"+i); +// } +// Thread.sleep(1000); +// }else{ +// Constant.WEB_FLAG=false;//可以采集的状态 +// if(i==size-1){ +// Constant.FLAG=false; +// } +// log.info("-------------串口:"+comName+"不存在!-------------"); +// } +// if(i==size-1){ +// Constant.FLAG=false; +// log.info("-------------一轮采集完,采集标志Constant.Flag="+Constant.FLAG+"-------------"); +// } +// } +// }catch (Exception e){ +// e.printStackTrace(); +// Constant.WEB_FLAG=false;//可以采集的状态 +// Constant.FLAG=false; +// log.error("-------------串口采集异常!-------------"); +// } +//// }else { +//// log.info("串口:"+comName+"不存在!"); +//// } +// } +// /** +// * 字节数组转16进制字符串 +// * @param b 字节数组 +// * @return 16进制字符串 +// */ +// public static String printHexString(byte[] b) { +// StringBuilder sbf = new StringBuilder(); +// for (byte value : b) { +// String hex = Integer.toHexString(value & 0xFF); +// if (hex.length() == 1) { +// hex = '0' + hex; +// } +// sbf.append(hex.toUpperCase()).append(" "); // } - } - /** - * 字节数组转16进制字符串 - * @param b 字节数组 - * @return 16进制字符串 - */ - public static String printHexString(byte[] b) { - StringBuilder sbf = new StringBuilder(); - for (byte value : b) { - String hex = Integer.toHexString(value & 0xFF); - if (hex.length() == 1) { - hex = '0' + hex; - } - sbf.append(hex.toUpperCase()).append(" "); - } - return sbf.toString().trim(); - } - - /** - * 十六进制字符串转byte[] - * @param hex 十六进制字符串 - * @return byte[] - */ - public static byte[] hexStr2Byte(String hex) { - if (hex == null) { - return new byte[] {}; - } - - // 奇数位补0 - if (hex.length() % 2 != 0) { - hex = "0" + hex; - } - - int length = hex.length(); - ByteBuffer buffer = ByteBuffer.allocate(length / 2); - for (int i = 0; i < length; i++) { - String hexStr = hex.charAt(i) + ""; - i++; - hexStr += hex.charAt(i); - byte b = (byte) Integer.parseInt(hexStr, 16); - buffer.put(b); - } - return buffer.array(); - } - - /** - * 16进制转换成为string类型字符串 - * @param s 待转换字符串 - */ - public static String hexStringToString(String s) { - if (s == null || "".equals(s)) { - return null; - } - s = s.replace(" ", ""); - byte[] baKeyword = new byte[s.length() / 2]; - for (int i = 0; i < baKeyword.length; i++) { - try { - baKeyword[i] = (byte) (0xff & Integer.parseInt(s.substring(i * 2, i * 2 + 2), 16)); - } catch (Exception e) { - e.printStackTrace(); - } - } - try { - s = new String(baKeyword, StandardCharsets.UTF_8); - } catch (Exception e1) { - e1.printStackTrace(); - } - return s; - } -} +// return sbf.toString().trim(); +// } +// +// /** +// * 十六进制字符串转byte[] +// * @param hex 十六进制字符串 +// * @return byte[] +// */ +// public static byte[] hexStr2Byte(String hex) { +// if (hex == null) { +// return new byte[] {}; +// } +// +// // 奇数位补0 +// if (hex.length() % 2 != 0) { +// hex = "0" + hex; +// } +// +// int length = hex.length(); +// ByteBuffer buffer = ByteBuffer.allocate(length / 2); +// for (int i = 0; i < length; i++) { +// String hexStr = hex.charAt(i) + ""; +// i++; +// hexStr += hex.charAt(i); +// byte b = (byte) Integer.parseInt(hexStr, 16); +// buffer.put(b); +// } +// return buffer.array(); +// } +// +// /** +// * 16进制转换成为string类型字符串 +// * @param s 待转换字符串 +// */ +// public static String hexStringToString(String s) { +// if (s == null || "".equals(s)) { +// return null; +// } +// s = s.replace(" ", ""); +// byte[] baKeyword = new byte[s.length() / 2]; +// for (int i = 0; i < baKeyword.length; i++) { +// try { +// baKeyword[i] = (byte) (0xff & Integer.parseInt(s.substring(i * 2, i * 2 + 2), 16)); +// } catch (Exception e) { +// e.printStackTrace(); +// } +// } +// try { +// s = new String(baKeyword, StandardCharsets.UTF_8); +// } catch (Exception e1) { +// e1.printStackTrace(); +// } +// return s; +// } +//} diff --git a/user-service/src/main/java/com/mh/user/serialport/SerialPortSendReceive2.java b/user-service/src/main/java/com/mh/user/serialport/SerialPortSendReceive2.java index a351e23..a589425 100644 --- a/user-service/src/main/java/com/mh/user/serialport/SerialPortSendReceive2.java +++ b/user-service/src/main/java/com/mh/user/serialport/SerialPortSendReceive2.java @@ -212,7 +212,7 @@ public class SerialPortSendReceive2 { String buildingName) { if ((dataStr.length() == 36 || dataStr.length() == 44 || dataStr.length() == 40 || dataStr.length() == 50) && deviceType.equals("电表")) { analysisReceiveOrder485.analysisMeterOrder485(dataStr, registerAddr, brand, buildingId, buildingName); - nowDataService.proWaterLevel(dateStr, buildingId); //保存时间点楼栋水位 + nowDataService.proWaterLevel(dateStr, buildingId, ""); //保存时间点楼栋水位 } else if ((dataStr.length() == 18 || dataStr.length() == 70 || dataStr.length() == 44) && deviceType.equals("水表")) { analysisReceiveOrder485.analysisWtMeterOrder485(dataStr, registerAddr, brand, buildingId, buildingName); } else if (deviceType.equals("压变")) { @@ -230,7 +230,7 @@ public class SerialPortSendReceive2 { } else if (deviceType.equals("水位开关") && registerAddr.equals("0010")) { analysisReceiveOrder485.analysisPumpStateOrder(dataStr, registerAddr, brand, buildingId, buildingName); //创新,热泵状态与水位共用一个8路设备 // analysisReceiveOrder485.analysisRelayOrder485(dataStr,registerAddr,brand,buildingId); //华厦 - nowDataService.proWaterLevel(dateStr, buildingId); //保存时间点楼栋水位 + nowDataService.proWaterLevel(dateStr, buildingId, ""); //保存时间点楼栋水位 } else if (deviceType.equals("温度变送器")) { analysisReceiveOrder485.analysisMulTempOrder485(dataStr, registerAddr, brand, buildingId, buildingName); } else if (deviceType.equals("热泵状态")) { diff --git a/user-service/src/main/java/com/mh/user/serialport/SerialPortSingle.java b/user-service/src/main/java/com/mh/user/serialport/SerialPortSingle.java index 93b38ce..15c80e9 100644 --- a/user-service/src/main/java/com/mh/user/serialport/SerialPortSingle.java +++ b/user-service/src/main/java/com/mh/user/serialport/SerialPortSingle.java @@ -1,219 +1,219 @@ -package com.mh.user.serialport; - -import com.mh.user.constants.Constant; -import com.mh.user.entity.DeviceCodeParamEntity; -import com.mh.user.service.BuildingService; -import com.mh.user.service.DeviceCodeParamService; -import com.mh.user.service.DeviceInstallService; -import com.mh.user.service.NowDataService; -import com.mh.user.utils.AnalysisReceiveOrder485; -import com.mh.user.utils.SendOrderUtils; -import com.mh.user.utils.SpringBeanUtil; -import lombok.extern.slf4j.Slf4j; -import org.springframework.context.ApplicationContext; -import org.springframework.stereotype.Component; -//import purejavacomm.SerialPort; -import gnu.io.SerialPort; - -import java.nio.ByteBuffer; -import java.nio.charset.StandardCharsets; -import java.util.ArrayList; -import java.util.List; - -/** - * @author nxr - * @title : - * @description : 串口发送和接收处理,操作类 - * @updateTime 2022-08-10 - * @throws : - */ -@Slf4j -public class SerialPortSingle { - - public SerialPort serialPort = null; - private String receiveStr = null; - private int baudrate = 9600; - private String parity = null; - - // 调用service - ApplicationContext context = SpringBeanUtil.getApplicationContext(); - //DeviceCodeParamService deviceCodeParamService = context.getBean(DeviceCodeParamService.class); - AnalysisReceiveOrder485 analysisReceiveOrder485 = new AnalysisReceiveOrder485(); - DeviceInstallService deviceInstallService = context.getBean(DeviceInstallService.class); - NowDataService nowDataService = context.getBean(NowDataService.class); - BuildingService buildingService = context.getBean(BuildingService.class); - - public String serialPortSend(DeviceCodeParamEntity deviceCodeParamEntity) { - - //查看所有串口 - SerialPortUtil serialPortUtil = SerialPortUtil.getSerialPortUtil(); - ArrayList port = serialPortUtil.findPort(); -// SerialTool serialPortUtil = SerialTool.getSerialPortUtil(); +//package com.mh.user.serialport; +// +//import com.mh.user.constants.Constant; +//import com.mh.user.entity.DeviceCodeParamEntity; +//import com.mh.user.service.BuildingService; +//import com.mh.user.service.DeviceCodeParamService; +//import com.mh.user.service.DeviceInstallService; +//import com.mh.user.service.NowDataService; +//import com.mh.user.utils.AnalysisReceiveOrder485; +//import com.mh.user.utils.SendOrderUtils; +//import com.mh.user.utils.SpringBeanUtil; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.context.ApplicationContext; +//import org.springframework.stereotype.Component; +////import purejavacomm.SerialPort; +//import gnu.io.SerialPort; +// +//import java.nio.ByteBuffer; +//import java.nio.charset.StandardCharsets; +//import java.util.ArrayList; +//import java.util.List; +// +///** +// * @author nxr +// * @title : +// * @description : 串口发送和接收处理,操作类 +// * @updateTime 2022-08-10 +// * @throws : +// */ +//@Slf4j +//public class SerialPortSingle { +// +// public SerialPort serialPort = null; +// private String receiveStr = null; +// private int baudrate = 9600; +// private String parity = null; +// +// // 调用service +// ApplicationContext context = SpringBeanUtil.getApplicationContext(); +// //DeviceCodeParamService deviceCodeParamService = context.getBean(DeviceCodeParamService.class); +// AnalysisReceiveOrder485 analysisReceiveOrder485 = new AnalysisReceiveOrder485(); +// DeviceInstallService deviceInstallService = context.getBean(DeviceInstallService.class); +// NowDataService nowDataService = context.getBean(NowDataService.class); +// BuildingService buildingService = context.getBean(BuildingService.class); +// +// public String serialPortSend(DeviceCodeParamEntity deviceCodeParamEntity) { +// +// //查看所有串口 +// SerialPortUtil serialPortUtil = SerialPortUtil.getSerialPortUtil(); // ArrayList port = serialPortUtil.findPort(); - String rtData = ""; -// System.out.println("发现全部串口:" + port); - String comName = deviceCodeParamEntity.getDataCom().toUpperCase(); - if (!port.contains(comName)) { - log.info("串口:" + comName + "不存在!"); - return "fail"; - } - try { - try { - baudrate = deviceCodeParamEntity.getBaudrate(); - parity = deviceCodeParamEntity.getParity(); - if (parity == null || parity.equals("") || parity.equalsIgnoreCase("none")) { - serialPort = serialPortUtil.openPort(comName, baudrate, SerialPort.DATABITS_8, SerialPort.PARITY_NONE, SerialPort.PARITY_ODD); - } else { - serialPort = serialPortUtil.openPort(comName, baudrate, SerialPort.DATABITS_8, SerialPort.PARITY_EVEN, SerialPort.PARITY_ODD); - } - //向串口发送指令 - log.info("-----------------------------单抄向串口" + serialPort + "发送指令!-----------------------------"); - SendOrderUtils.sendSerialPort(deviceCodeParamEntity, serialPort); - Thread.sleep(1500); - } catch (Exception e) { - log.error("前端设置出现异常==>", e); - return "fail"; - } - //对返回数据进行相关解析处理 - receiveStr = null; - byte[] bytes = serialPortUtil.readFromPort(serialPort); //读取串口数据 - if (null == bytes) { - serialPortUtil.closePort(serialPort); - log.info("单抄串口" + serialPort + "异常,没有数据返回!关闭串口"); - return "fail"; - } - receiveStr = receiveStr + printHexString(bytes); - //去掉空格和null - receiveStr = receiveStr.replace("null", ""); - receiveStr = receiveStr.replace(" ", ""); - log.info("串口" + serialPort + "接收数据:" + receiveStr + ",大小: " + receiveStr.length()); - //返回值全部变成大写 - String receiveData = receiveStr.toUpperCase(); - //截取去掉FE - String dataStr = receiveData.replace("FE", ""); - String deviceType = deviceCodeParamEntity.getDeviceType(); - String deviceAddr = deviceCodeParamEntity.getDeviceAddr(); - String registerAddr = deviceCodeParamEntity.getRegisterAddr(); - String brand = deviceCodeParamEntity.getBrand(); - String buildingId = deviceCodeParamEntity.getBuildingId(); - String buildingName = buildingService.queryBuildingName(buildingId); //查询楼栋名称 - - deviceInstallService.updateOnline(deviceAddr, deviceType, buildingId, "在线"); //设备在线 - log.info(deviceType + "在线,设备号:" + deviceAddr + ",所属楼栋:" + buildingName); - if (deviceType.equals("热泵")) { - String strState = nowDataService.selectState(buildingId, deviceAddr); - if (strState != null && strState.equals("离线")) { //采集到数据 - nowDataService.updateRunState(buildingId, deviceAddr, "不运行", buildingName); //监控界面状态表热泵在线状态 - } - } - try { - if ((dataStr.length() == 18 || dataStr.length() == 70 || dataStr.length() == 44) && deviceType.equals("水表")) { - rtData = analysisReceiveOrder485.analysisWtMeterOrder4852(dataStr, registerAddr, brand, buildingId, buildingName); - } else if ((dataStr.length() == 36 || dataStr.length() == 44 || dataStr.length() == 40 || dataStr.length() == 50) && deviceType.equals("电表")) { - rtData = analysisReceiveOrder485.analysisMeterOrder4852(dataStr, registerAddr, brand, buildingId, buildingName); - } else if (deviceType.equals("压变")) { - rtData = analysisReceiveOrder485.analysisPressureOrder4852(dataStr, registerAddr, brand, buildingId, buildingName); - } else if ((dataStr.length() == 30) && deviceType.equals("状态检测")) {//五路状态读取,兼容旧版系统 - analysisReceiveOrder485.analysisStateOrder485(dataStr, registerAddr, brand, buildingId, buildingName); - } else if (deviceType.equals("水位开关") && (registerAddr.equals("0018") || registerAddr.equals("0017"))) { - rtData = analysisReceiveOrder485.analysisRelayOrder4852(dataStr, registerAddr, brand, buildingId, buildingName); - } else if (deviceType.equals("热泵")) { - rtData = analysisReceiveOrder485.analysisPumpOrder4852(dataStr, registerAddr, brand, buildingId, buildingName); - } else if (deviceType.equals("时控")) { - rtData = analysisReceiveOrder485.analysisTimeSetOrder4852(dataStr, registerAddr, brand, buildingId, buildingName); - } else if (deviceType.equals("水位开关") && registerAddr.equals("0010")) { //热泵状态 - rtData = analysisReceiveOrder485.analysisPumpStateOrder2(dataStr, registerAddr, brand, buildingId, buildingName); - } else if (deviceType.equals("温度变送器")) { - rtData = analysisReceiveOrder485.analysisMulTempOrder4852(dataStr, registerAddr, brand, buildingId, buildingName); - } else if (deviceType.equals("热泵状态")) { - rtData = analysisReceiveOrder485.analysisPumpStateOrder2(dataStr, registerAddr, brand, buildingId, buildingName); - } - } catch (Exception e) { - log.error(deviceCodeParamEntity.getDeviceType() + "单抄保存数据库失败!"); - return "fail"; - } - Thread.sleep(500); - log.info("-----------------------------" + serialPort + "单抄结束!-----------------------------"); - return rtData; - } catch (Exception e) { - log.error("前端设置出现异常==>", e); - return "fail"; - } finally { - if (null != serialPort) { - serialPortUtil.closePort(serialPort); - } - } - } - - /** - * 字节数组转16进制字符串 - * - * @param b 字节数组 - * @return 16进制字符串 - */ - public static String printHexString(byte[] b) { - StringBuilder sbf = new StringBuilder(); - for (byte value : b) { - String hex = Integer.toHexString(value & 0xFF); - if (hex.length() == 1) { - hex = '0' + hex; - } - sbf.append(hex.toUpperCase()).append(" "); - } - return sbf.toString().trim(); - } - - /** - * 十六进制字符串转byte[] - * - * @param hex 十六进制字符串 - * @return byte[] - */ - public static byte[] hexStr2Byte(String hex) { - if (hex == null) { - return new byte[]{}; - } - - // 奇数位补0 - if (hex.length() % 2 != 0) { - hex = "0" + hex; - } - - int length = hex.length(); - ByteBuffer buffer = ByteBuffer.allocate(length / 2); - for (int i = 0; i < length; i++) { - String hexStr = hex.charAt(i) + ""; - i++; - hexStr += hex.charAt(i); - byte b = (byte) Integer.parseInt(hexStr, 16); - buffer.put(b); - } - return buffer.array(); - } - - /** - * 16进制转换成为string类型字符串 - * - * @param s 待转换字符串 - */ - public static String hexStringToString(String s) { - if (s == null || "".equals(s)) { - return null; - } - s = s.replace(" ", ""); - byte[] baKeyword = new byte[s.length() / 2]; - for (int i = 0; i < baKeyword.length; i++) { - try { - baKeyword[i] = (byte) (0xff & Integer.parseInt(s.substring(i * 2, i * 2 + 2), 16)); - } catch (Exception e) { - e.printStackTrace(); - } - } - try { - s = new String(baKeyword, StandardCharsets.UTF_8); - } catch (Exception e1) { - e1.printStackTrace(); - } - return s; - } -} +//// SerialTool serialPortUtil = SerialTool.getSerialPortUtil(); +//// ArrayList port = serialPortUtil.findPort(); +// String rtData = ""; +//// System.out.println("发现全部串口:" + port); +// String comName = deviceCodeParamEntity.getDataCom().toUpperCase(); +// if (!port.contains(comName)) { +// log.info("串口:" + comName + "不存在!"); +// return "fail"; +// } +// try { +// try { +// baudrate = deviceCodeParamEntity.getBaudrate(); +// parity = deviceCodeParamEntity.getParity(); +// if (parity == null || parity.equals("") || parity.equalsIgnoreCase("none")) { +// serialPort = serialPortUtil.openPort(comName, baudrate, SerialPort.DATABITS_8, SerialPort.PARITY_NONE, SerialPort.PARITY_ODD); +// } else { +// serialPort = serialPortUtil.openPort(comName, baudrate, SerialPort.DATABITS_8, SerialPort.PARITY_EVEN, SerialPort.PARITY_ODD); +// } +// //向串口发送指令 +// log.info("-----------------------------单抄向串口" + serialPort + "发送指令!-----------------------------"); +// SendOrderUtils.sendSerialPort(deviceCodeParamEntity, serialPort); +// Thread.sleep(1500); +// } catch (Exception e) { +// log.error("前端设置出现异常==>", e); +// return "fail"; +// } +// //对返回数据进行相关解析处理 +// receiveStr = null; +// byte[] bytes = serialPortUtil.readFromPort(serialPort); //读取串口数据 +// if (null == bytes) { +// serialPortUtil.closePort(serialPort); +// log.info("单抄串口" + serialPort + "异常,没有数据返回!关闭串口"); +// return "fail"; +// } +// receiveStr = receiveStr + printHexString(bytes); +// //去掉空格和null +// receiveStr = receiveStr.replace("null", ""); +// receiveStr = receiveStr.replace(" ", ""); +// log.info("串口" + serialPort + "接收数据:" + receiveStr + ",大小: " + receiveStr.length()); +// //返回值全部变成大写 +// String receiveData = receiveStr.toUpperCase(); +// //截取去掉FE +// String dataStr = receiveData.replace("FE", ""); +// String deviceType = deviceCodeParamEntity.getDeviceType(); +// String deviceAddr = deviceCodeParamEntity.getDeviceAddr(); +// String registerAddr = deviceCodeParamEntity.getRegisterAddr(); +// String brand = deviceCodeParamEntity.getBrand(); +// String buildingId = deviceCodeParamEntity.getBuildingId(); +// String buildingName = buildingService.queryBuildingName(buildingId); //查询楼栋名称 +// +// deviceInstallService.updateOnline(deviceAddr, deviceType, buildingId, "在线"); //设备在线 +// log.info(deviceType + "在线,设备号:" + deviceAddr + ",所属楼栋:" + buildingName); +// if (deviceType.equals("热泵")) { +// String strState = nowDataService.selectState(buildingId, deviceAddr); +// if (strState != null && strState.equals("离线")) { //采集到数据 +// nowDataService.updateRunState(buildingId, deviceAddr, "不运行", buildingName); //监控界面状态表热泵在线状态 +// } +// } +// try { +// if ((dataStr.length() == 18 || dataStr.length() == 70 || dataStr.length() == 44) && deviceType.equals("水表")) { +// rtData = analysisReceiveOrder485.analysisWtMeterOrder4852(dataStr, registerAddr, brand, buildingId, buildingName); +// } else if ((dataStr.length() == 36 || dataStr.length() == 44 || dataStr.length() == 40 || dataStr.length() == 50) && deviceType.equals("电表")) { +// rtData = analysisReceiveOrder485.analysisMeterOrder4852(dataStr, registerAddr, brand, buildingId, buildingName); +// } else if (deviceType.equals("压变")) { +// rtData = analysisReceiveOrder485.analysisPressureOrder4852(dataStr, registerAddr, brand, buildingId, buildingName); +// } else if ((dataStr.length() == 30) && deviceType.equals("状态检测")) {//五路状态读取,兼容旧版系统 +// analysisReceiveOrder485.analysisStateOrder485(dataStr, registerAddr, brand, buildingId, buildingName); +// } else if (deviceType.equals("水位开关") && (registerAddr.equals("0018") || registerAddr.equals("0017"))) { +// rtData = analysisReceiveOrder485.analysisRelayOrder4852(dataStr, registerAddr, brand, buildingId, buildingName); +// } else if (deviceType.equals("热泵")) { +// rtData = analysisReceiveOrder485.analysisPumpOrder4852(dataStr, registerAddr, brand, buildingId, buildingName); +// } else if (deviceType.equals("时控")) { +// rtData = analysisReceiveOrder485.analysisTimeSetOrder4852(dataStr, registerAddr, brand, buildingId, buildingName); +// } else if (deviceType.equals("水位开关") && registerAddr.equals("0010")) { //热泵状态 +// rtData = analysisReceiveOrder485.analysisPumpStateOrder2(dataStr, registerAddr, brand, buildingId, buildingName); +// } else if (deviceType.equals("温度变送器")) { +// rtData = analysisReceiveOrder485.analysisMulTempOrder4852(dataStr, registerAddr, brand, buildingId, buildingName); +// } else if (deviceType.equals("热泵状态")) { +// rtData = analysisReceiveOrder485.analysisPumpStateOrder2(dataStr, registerAddr, brand, buildingId, buildingName); +// } +// } catch (Exception e) { +// log.error(deviceCodeParamEntity.getDeviceType() + "单抄保存数据库失败!"); +// return "fail"; +// } +// Thread.sleep(500); +// log.info("-----------------------------" + serialPort + "单抄结束!-----------------------------"); +// return rtData; +// } catch (Exception e) { +// log.error("前端设置出现异常==>", e); +// return "fail"; +// } finally { +// if (null != serialPort) { +// serialPortUtil.closePort(serialPort); +// } +// } +// } +// +// /** +// * 字节数组转16进制字符串 +// * +// * @param b 字节数组 +// * @return 16进制字符串 +// */ +// public static String printHexString(byte[] b) { +// StringBuilder sbf = new StringBuilder(); +// for (byte value : b) { +// String hex = Integer.toHexString(value & 0xFF); +// if (hex.length() == 1) { +// hex = '0' + hex; +// } +// sbf.append(hex.toUpperCase()).append(" "); +// } +// return sbf.toString().trim(); +// } +// +// /** +// * 十六进制字符串转byte[] +// * +// * @param hex 十六进制字符串 +// * @return byte[] +// */ +// public static byte[] hexStr2Byte(String hex) { +// if (hex == null) { +// return new byte[]{}; +// } +// +// // 奇数位补0 +// if (hex.length() % 2 != 0) { +// hex = "0" + hex; +// } +// +// int length = hex.length(); +// ByteBuffer buffer = ByteBuffer.allocate(length / 2); +// for (int i = 0; i < length; i++) { +// String hexStr = hex.charAt(i) + ""; +// i++; +// hexStr += hex.charAt(i); +// byte b = (byte) Integer.parseInt(hexStr, 16); +// buffer.put(b); +// } +// return buffer.array(); +// } +// +// /** +// * 16进制转换成为string类型字符串 +// * +// * @param s 待转换字符串 +// */ +// public static String hexStringToString(String s) { +// if (s == null || "".equals(s)) { +// return null; +// } +// s = s.replace(" ", ""); +// byte[] baKeyword = new byte[s.length() / 2]; +// for (int i = 0; i < baKeyword.length; i++) { +// try { +// baKeyword[i] = (byte) (0xff & Integer.parseInt(s.substring(i * 2, i * 2 + 2), 16)); +// } catch (Exception e) { +// e.printStackTrace(); +// } +// } +// try { +// s = new String(baKeyword, StandardCharsets.UTF_8); +// } catch (Exception e1) { +// e1.printStackTrace(); +// } +// return s; +// } +//} diff --git a/user-service/src/main/java/com/mh/user/serialport/SerialPortSingle2.java b/user-service/src/main/java/com/mh/user/serialport/SerialPortSingle2.java index e2dac04..257af2c 100644 --- a/user-service/src/main/java/com/mh/user/serialport/SerialPortSingle2.java +++ b/user-service/src/main/java/com/mh/user/serialport/SerialPortSingle2.java @@ -46,9 +46,9 @@ public class SerialPortSingle2 { } else { serialPort = SerialTool.openPort(comName, baudrate, SerialPort.DATABITS_8, SerialPort.STOPBITS_1, SerialPort.PARITY_EVEN); } - //向串口发送指令 - log.info("-----------------------------单抄向串口" + serialPort + "发送指令!-----------------------------"); if (serialPort != null) { + //向串口发送指令 + log.info("-----------------------------单抄向串口" + serialPort.getName() + "发送指令!-----------------------------"); String sendStr = SendOrderUtils.getSendStr(deviceCodeParamEntity); SerialTool.sendToPort(SerialTool.HexString2Bytes(sendStr), serialPort, sendStr, deviceCodeParamEntity.getDeviceType()); CacheTools.initReceiveMsg(serialPort.getName()); @@ -92,7 +92,7 @@ public class SerialPortSingle2 { return "fail"; } receiveStr = receiveStr.replace("null", "").replace(" ", ""); - log.info("串口" + serialPort + "接收数据:" + receiveStr + ",大小: " + receiveStr.length()); + log.info("串口" + serialPort.getName() + "接收数据:" + receiveStr + ",大小: " + receiveStr.length()); //返回值全部变成大写 String receiveData = receiveStr.toUpperCase(); //截取去掉FE @@ -127,6 +127,7 @@ public class SerialPortSingle2 { rtData = analysisReceiveOrder485.analysisPumpOrder4852(dataStr, registerAddr, brand, buildingId, buildingName); } else if (deviceType.equals("时控")) { rtData = analysisReceiveOrder485.analysisTimeSetOrder4852(dataStr, registerAddr, brand, buildingId, buildingName); + log.info("时控读取或者设置返回值==>{}", rtData); } else if (deviceType.equals("水位开关") && !StringUtils.isBlank(registerAddr) && registerAddr.equals("0010")) { //热泵状态 rtData = analysisReceiveOrder485.analysisPumpStateOrder2(dataStr, registerAddr, brand, buildingId, buildingName); } else if (deviceType.equals("温度变送器")) { @@ -140,22 +141,22 @@ public class SerialPortSingle2 { return "fail"; } } else { + log.info("串口为空,无法进行采集控制"); return "fail"; } SerialTool.closePort(serialPort); - System.out.println("关闭" + serialPort); Thread.sleep(200); - log.info("-----------------------------" + serialPort + "单抄结束!-----------------------------"); + log.info("-----------------------------" + serialPort.getName() + "单抄结束!-----------------------------"); return rtData; } catch (Exception e) { - log.info("单抄串口" + serialPort + "异常,没有数据返回!关闭串口", e); + log.info("单抄串口" + serialPort.getName() + "异常,没有数据返回!关闭串口", e); } finally { try { if (null != serialPort) { SerialTool.closePort(serialPort); } } catch (IOException e) { - throw new RuntimeException(e); + log.error("关闭串口异常!", e); } } return "fail"; diff --git a/user-service/src/main/java/com/mh/user/service/DeviceInstallService.java b/user-service/src/main/java/com/mh/user/service/DeviceInstallService.java index cc5dbba..d837c92 100644 --- a/user-service/src/main/java/com/mh/user/service/DeviceInstallService.java +++ b/user-service/src/main/java/com/mh/user/service/DeviceInstallService.java @@ -181,4 +181,6 @@ public interface DeviceInstallService { DeviceInstallEntity selectDeviceById(Long id); void deleteParamCode(DeviceInstallEntity oldEntity); + + void updateLastValueByOther(String addr, String strWtLevel, String deviceType, String buildingId); } 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 d3f8a9d..796fa47 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 @@ -100,7 +100,7 @@ public interface NowDataService { void proWaterTemp(String curDate,String buildingID,String pumpID); //生成楼栋水位 - void proWaterLevel(String curDate,String buildingID); + void proWaterLevel(String curDate,String buildingID, String deviceAddr); //在没有接收到返回值前设置监控界面热泵是否离线 void updateRunState(String buildingId,String pumpId,String strState, String buildingName); diff --git a/user-service/src/main/java/com/mh/user/service/impl/DeviceControlServiceImpl.java b/user-service/src/main/java/com/mh/user/service/impl/DeviceControlServiceImpl.java index 2a51123..b7410e8 100644 --- a/user-service/src/main/java/com/mh/user/service/impl/DeviceControlServiceImpl.java +++ b/user-service/src/main/java/com/mh/user/service/impl/DeviceControlServiceImpl.java @@ -87,6 +87,7 @@ public class DeviceControlServiceImpl implements DeviceControlService { switch (deviceType) { case "时控": rtData = handleTimeControl(serialPortModel, deviceCodeParam, controlData, rtData, type, serialPortSingle); + log.info("设备类型为时控==>{}", rtData); break; case "水位开关": rtData = handleWaterLevelSwitch(serialPortModel, deviceCodeParam, controlData, rtData, type, serialPortSingle); @@ -110,6 +111,20 @@ public class DeviceControlServiceImpl implements DeviceControlService { } if (Constant.WRITE.equals(type)) { rtData = serialPortSingle.serialPortSend(deviceCodeParam);//生成并发送指令 + log.info("写入设备返回值==>{}", rtData); + // 如果是瑞星泵,需要在发送启动指令 + if (!StringUtils.isBlank(brand) && brand.equals("瑞星") + && (deviceCodeParam.getParam().equals("时段1") || deviceCodeParam.getParam().equals("时段2")) + && !rtData.equals(Constant.FAIL)) { + deviceCodeParam.setFunCode("06"); + // 开启热泵定时 + if ("0028".equals(deviceCodeParam.getRegisterAddr())) { + deviceCodeParam.setRegisterAddr("00230001"); + } if ("002A".equals(deviceCodeParam.getRegisterAddr())) { + deviceCodeParam.setRegisterAddr("00240001"); + } + rtData = serialPortSingle.serialPortSend(deviceCodeParam); + } } } return rtData; @@ -202,16 +217,27 @@ public class DeviceControlServiceImpl implements DeviceControlService { String time = serialPortModel.getDataValue(); if (Constant.READ.equals(type)) { deviceCodeParam.setFunCode("03"); //功能码读数据 - if (deviceCodeParam.getParam().equals("L1")) { - deviceCodeParam.setRegisterAddr("0009"); //寄存器地址,L3路,L1(0009),L2(000D) - } else if (deviceCodeParam.getParam().equals("L2")) { - deviceCodeParam.setRegisterAddr("000D"); - } else { - deviceCodeParam.setRegisterAddr("0011"); + switch (deviceCodeParam.getParam()) { + case "L1": + deviceCodeParam.setRegisterAddr("0009"); //寄存器地址,L3路,L1(0009),L2(000D) + break; + case "L2": + deviceCodeParam.setRegisterAddr("000D"); + break; + case "L3": + deviceCodeParam.setRegisterAddr("0011"); + break; + case "checkTime": + // 时控校准时间读取 + deviceCodeParam.setRegisterAddr("0000"); + break; } rtData = serialPortSingle.serialPortSend(deviceCodeParam);//生成并发送指令 time = rtData; } else { + if ("checkTime".equals(deviceCodeParam.getParam())) { + deviceCodeParam.setRegisterAddr("0000"); + } deviceCodeParam.setFunCode("10"); //功能码写数据 } if (time.length() == 16) { @@ -285,17 +311,21 @@ public class DeviceControlServiceImpl implements DeviceControlService { nowDataService.upTempSet2(deviceCodeParam.getBuildingId(), serialPortModel.getDataValue(), deviceCodeParam.getDeviceAddr());//更新实时状态表 log.info("楼栋编号:" + deviceCodeParam.getBuildingId() + ",设定温度:" + serialPortModel.getDataValue() + ",热泵编号:" + deviceCodeParam.getDeviceAddr()); } else if (deviceCodeParam.getParam().equals("时段1") || deviceCodeParam.getParam().equals("时段2")) { - if (deviceCodeParam.getBrand().equals("美的")) { + if (deviceCodeParam.getBrand().equals("美的") || deviceCodeParam.getBrand().equals("瑞星")) { //发送指令 if (Constant.READ.equals(type)) { deviceCodeParam.setFunCode("03"); //功能码读数据 } else { deviceCodeParam.setFunCode("10"); //功能码写数据 } - if ("时段1".equals(deviceCodeParam.getParam())) { + if ("时段1".equals(deviceCodeParam.getParam()) && "美的".equals(deviceCodeParam.getBrand())) { deviceCodeParam.setRegisterAddr("0656"); //寄存器地址 - } else { + } else if ("时段2".equals(deviceCodeParam.getParam()) && "美的".equals(deviceCodeParam.getBrand())) { deviceCodeParam.setRegisterAddr("065A"); //寄存器地址 + } else if ("时段1".equals(deviceCodeParam.getParam()) && "瑞星".equals(deviceCodeParam.getBrand())) { + deviceCodeParam.setRegisterAddr("0028"); //寄存器地址 + } else if ("时段2".equals(deviceCodeParam.getParam()) && "瑞星".equals(deviceCodeParam.getBrand())) { + deviceCodeParam.setRegisterAddr("002C"); //寄存器地址 } if (Constant.READ.equals(type)) { @@ -345,6 +375,14 @@ public class DeviceControlServiceImpl implements DeviceControlService { } rtData = serialPortSingle.serialPortSend(deviceCodeParam);//生成并发送指令 return rtData; + } else if ("closeTime".equals(deviceCodeParam.getParam())) { + // 关闭热泵 + deviceCodeParam.setFunCode("06"); //功能码读数据 + if ("瑞星".equals(deviceCodeParam.getBrand()) && "1".equals(deviceCodeParam.getDataValue())) { + deviceCodeParam.setRegisterAddr("00230000"); + } else { + deviceCodeParam.setRegisterAddr("00240000"); //寄存器地址 + } } return rtData; } diff --git a/user-service/src/main/java/com/mh/user/service/impl/DeviceInstallServiceImpl.java b/user-service/src/main/java/com/mh/user/service/impl/DeviceInstallServiceImpl.java index 923bff0..dce1a1e 100644 --- a/user-service/src/main/java/com/mh/user/service/impl/DeviceInstallServiceImpl.java +++ b/user-service/src/main/java/com/mh/user/service/impl/DeviceInstallServiceImpl.java @@ -4,19 +4,13 @@ import com.mh.user.entity.DeviceCodeParamEntity; import com.mh.user.entity.DeviceInstallEntity; import com.mh.user.entity.DeviceInstallTempEntity; import com.mh.user.entity.UploadDeviceInstallEntity; -import com.mh.user.exception.CommonNum; -import com.mh.user.exception.ServiceRuntimeException; import com.mh.user.mapper.DeviceCodeParamMapper; import com.mh.user.mapper.DeviceInstallMapper; -import com.mh.user.mapper.provider.DeviceInstallProvider; import com.mh.user.model.DeviceModel; -import com.mh.user.serialport.SerialPortSendReceive; import com.mh.user.service.BuildingService; import com.mh.user.service.DeviceInstallService; +import com.mh.user.utils.CacheUtil; import lombok.extern.slf4j.Slf4j; -import org.apache.ibatis.annotations.Param; -import org.apache.ibatis.annotations.SelectProvider; -import org.checkerframework.checker.units.qual.A; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -165,6 +159,8 @@ public class DeviceInstallServiceImpl implements DeviceInstallService { default: break; } + // 删除之前的缓存 + CacheUtil.getInstance().deleteCache(); } @Override @@ -256,6 +252,10 @@ public class DeviceInstallServiceImpl implements DeviceInstallService { @Override public int deleteDevice(String id) { + // 根据id查询对应的deviceInstall + DeviceInstallEntity oldEntity = deviceInstallMapper.selectDeviceById(Long.valueOf(id)); + // 删除全部的device_code_param值 + this.deleteParamCode(oldEntity); return deviceInstallMapper.deleteDevice(id); } @@ -412,5 +412,10 @@ public class DeviceInstallServiceImpl implements DeviceInstallService { deviceCodeParamMapper.deleteParamCode2(oldEntity); deviceCodeParamMapper.deleteParamCode3(oldEntity); } + + @Override + public void updateLastValueByOther(String addr, String strWtLevel, String deviceType, String buildingId) { + deviceInstallMapper.updateLastValueByOther(addr, strWtLevel, deviceType, buildingId); + } } 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 6b835a3..b54c88b 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 @@ -453,8 +453,8 @@ public class NowDataServiceImpl implements NowDataService { } @Override - public void proWaterLevel(String curDate, String buildingID) { - nowDataMapper.proWaterLevel(curDate, buildingID); + public void proWaterLevel(String curDate, String buildingID, String deviceAddr) { + nowDataMapper.proWaterLevel(curDate, buildingID, deviceAddr); } @Override diff --git a/user-service/src/main/java/com/mh/user/utils/AnalysisReceiveOrder485.java b/user-service/src/main/java/com/mh/user/utils/AnalysisReceiveOrder485.java index 9758026..a33b03e 100644 --- a/user-service/src/main/java/com/mh/user/utils/AnalysisReceiveOrder485.java +++ b/user-service/src/main/java/com/mh/user/utils/AnalysisReceiveOrder485.java @@ -581,8 +581,8 @@ public class AnalysisReceiveOrder485 { } else if (registerAddr.equalsIgnoreCase("0656") || registerAddr.equalsIgnoreCase("065A") || registerAddr.equalsIgnoreCase("065E")) { //定时设置值 - String startTime = checkStr.substring(8, 10) + checkStr.substring(12, 14); - String closetTime = checkStr.substring(16, 18) + checkStr.substring(20, 22); + String startTime = ExchangeStringUtil.hexToDec(checkStr.substring(8, 10)) + ExchangeStringUtil.hexToDec(checkStr.substring(12, 14)); + String closetTime = ExchangeStringUtil.hexToDec(checkStr.substring(16, 18)) + ExchangeStringUtil.hexToDec(checkStr.substring(20, 22)); sValue = startTime + closetTime; } rtData = sValue; @@ -642,8 +642,11 @@ public class AnalysisReceiveOrder485 { } else if (registerAddr.equalsIgnoreCase("0028") || registerAddr.equalsIgnoreCase("002C") || registerAddr.equalsIgnoreCase("0030")) { //读定时设置值 - String startTime = checkStr.substring(8, 10) + checkStr.substring(12, 14); - String closetTime = checkStr.substring(16, 18) + checkStr.substring(20, 22); + // 01 03 08 0003 0000 0016 0000 4713 + String startTime = ExchangeStringUtil.addZeroForNum(ExchangeStringUtil.hexToDec(checkStr.substring(6, 10)), 2) + + ExchangeStringUtil.addZeroForNum(ExchangeStringUtil.hexToDec(checkStr.substring(10, 14)), 2); + String closetTime = ExchangeStringUtil.addZeroForNum(ExchangeStringUtil.hexToDec(checkStr.substring(14, 18)), 2) + + ExchangeStringUtil.addZeroForNum(ExchangeStringUtil.hexToDec(checkStr.substring(18, 22)), 2); sValue = startTime + closetTime; } } else if (checkStr.substring(2, 4).equalsIgnoreCase("10")) { @@ -851,9 +854,12 @@ public class AnalysisReceiveOrder485 { } DecimalFormat df = new DecimalFormat("0.0"); String strWtLevel = df.format(wtLevel); + // 更新device_install数据 + deviceInstallService.updateLastValueByOther(addr, strWtLevel, "压变", buildingId); + nowDataService.saveNowHistoryData2(addr, "压变", strWtLevel, "waterLevel", buildingId); log.info("压变号:" + addr + ",保存数据库成功!楼栋名称:" + buildingName); - nowDataService.proWaterLevel(dateStr, buildingId); //楼栋水位 + nowDataService.proWaterLevel(dateStr, buildingId, addr); //楼栋水位 log.info("------保存每栋楼小时水位情况" + dateStr + "------"); } // }); @@ -896,9 +902,12 @@ public class AnalysisReceiveOrder485 { DecimalFormat df = new DecimalFormat("0.0"); String strWtLevel = df.format(wtLevel); result = strWtLevel; + // 更新device_install数据 + deviceInstallService.updateLastValueByOther(addr, strWtLevel, "压变", buildingId); + nowDataService.saveNowHistoryData2(addr, "压变", strWtLevel, "waterLevel", buildingId); log.info("压变号:" + addr + ",保存数据库成功!楼栋名称:" + buildingName); - nowDataService.proWaterLevel(dateStr, buildingId); //楼栋水位 + nowDataService.proWaterLevel(dateStr, buildingId, addr); //楼栋水位 log.info("------保存每栋楼小时水位情况------" + dateStr); } } else { diff --git a/user-service/src/main/java/com/mh/user/utils/CacheUtil.java b/user-service/src/main/java/com/mh/user/utils/CacheUtil.java index d10f522..5c07f23 100644 --- a/user-service/src/main/java/com/mh/user/utils/CacheUtil.java +++ b/user-service/src/main/java/com/mh/user/utils/CacheUtil.java @@ -75,5 +75,12 @@ public class CacheUtil { return JSONArray.parseArray(JSONObject.toJSONString(cacheObject), DeviceCodeParamEntity.class); } + /** + * 删除缓存 + */ + public void deleteCache() { + caffeineCache.invalidateAll(); + } + } 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 d4874c7..a604c55 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 @@ -180,18 +180,23 @@ public class GetReadOrder485 { str = str + "03002C0004"; param = "时段2"; } + } else if ("06".equals(funCode)) { + str = str + funCode + registerAddr;// 定时开机开关机 + if ("0023".equals(registerAddr)) { + param = "时段1"; + } else { + param = "时段2"; + } } else {//10 if (registerAddr == null || registerAddr.equals("") || registerAddr.equalsIgnoreCase("000A")) {//温度设定,写 str = str + "10000A000102" + ExchangeStringUtil.addZeroForNum(ExchangeStringUtil.decToHex(String.valueOf(dataValue)), 4); //写,待测试 - } else if (registerAddr.equalsIgnoreCase("0028")) {//时段1 + } else if (registerAddr.equalsIgnoreCase("0028") || registerAddr.equalsIgnoreCase("002C")) {//时段1 if (dataValue.length() == 8) { - String strData = "00" + dataValue.substring(0, 2) + "00" + dataValue.substring(2, 4) + "00" + dataValue.substring(4, 6) + "00" + dataValue.substring(6, 8); - str = str + "100028000408" + strData; //写 - } - } else if (registerAddr.equalsIgnoreCase("002C")) {//时段2 - if (dataValue.length() == 8) { - String strData = "00" + dataValue.substring(0, 2) + "00" + dataValue.substring(2, 4) + "00" + dataValue.substring(4, 6) + "00" + dataValue.substring(6, 8); - str = str + "10002C000408" + strData; //写 + String strData = "00" + ExchangeStringUtil.addZeroForNum(ExchangeStringUtil.IntToHex(Integer.parseInt(dataValue.substring(0, 2))),2) + + "00" + ExchangeStringUtil.addZeroForNum(ExchangeStringUtil.IntToHex(Integer.parseInt(dataValue.substring(2, 4))),2) + + "00" + ExchangeStringUtil.addZeroForNum(ExchangeStringUtil.IntToHex(Integer.parseInt(dataValue.substring(4, 6))),2) + + "00" + ExchangeStringUtil.addZeroForNum(ExchangeStringUtil.IntToHex(Integer.parseInt(dataValue.substring(6, 8))),2); + str = str + "10"+registerAddr+"000408" + strData; //写 } } } @@ -517,10 +522,19 @@ public class GetReadOrder485 { funCode = ExchangeStringUtil.addZeroForNum(funCode, 2); // 功能码 if (funCode.equals("03")) { //功能码,读 - str = str + "03" + registerAddr + "0004"; + if (orderParamModel.getParam().equals("checkTime")) { + // 读取时间:0A 03 00 00 00 03 04 B0 + str = str + "03" + registerAddr + "0003"; + } else { + str = str + "03" + registerAddr + "0004"; + } } else if (funCode.equals("10")) {//写 - if (!dataValue.equals("")) { + if (!dataValue.equals("") && !orderParamModel.getParam().equals("checkTime")) { str = str + "10" + registerAddr + "000408" + dataValue; + } else { + // 校验时间:0A 10 00 00 00 03 06 00 24 01 10 08 59 48 CF + // 0A 10 00 00 00 03 06 00 24 01 10 09 40 8B 95 + str = str + "10" + registerAddr + "00030600" + dataValue.substring(2); } } } diff --git a/user-service/src/main/java/com/mh/user/utils/TimedTask2.java b/user-service/src/main/java/com/mh/user/utils/TimedTask2.java index fe30c44..e372fcf 100644 --- a/user-service/src/main/java/com/mh/user/utils/TimedTask2.java +++ b/user-service/src/main/java/com/mh/user/utils/TimedTask2.java @@ -1,75 +1,39 @@ -package com.mh.user.utils; - -import com.mh.user.entity.DeviceCodeParamEntity; -import com.mh.user.entity.DeviceInstallEntity; -import com.mh.user.entity.PumpSetEntity; -import com.mh.user.model.SerialPortModel; -import com.mh.user.serialport.SerialPortSingle; -import com.mh.user.service.DeviceInstallService; -import com.mh.user.service.PumpSetService; -import io.swagger.models.auth.In; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.context.ApplicationContext; - -import java.text.SimpleDateFormat; -import java.util.*; - -public class TimedTask2 { - - ApplicationContext context = SpringBeanUtil.getApplicationContext(); - PumpSetService pumpSetService=context.getBean(PumpSetService.class); - DeviceInstallService deviceInstallService=context.getBean(DeviceInstallService.class); - - public void cronJobClose(int shi, int fen, int miao) { //定时关机 - Calendar cal = Calendar.getInstance(); - // 每天定点执行 - cal.set(Calendar.HOUR_OF_DAY, shi); - cal.set(Calendar.MINUTE, fen); - cal.set(Calendar.SECOND, miao); - - Timer timer = new Timer(); - timer.schedule(new TimerTask() { - - public void run() { - // 把run方法里的内容换成你要执行的内容 - SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); - System.out.println("当前的系统时间为:" + sdf.format(new Date())); - SerialPortSingle serialPortSingle = new SerialPortSingle(); //发送接收类 - DeviceCodeParamEntity deviceCodeParam=new DeviceCodeParamEntity();//参数实体类 - List deviceList=deviceInstallService.selectDevicePump(); - if (deviceList.size()>0){ - for (DeviceInstallEntity deviceInstall :deviceList){ - deviceCodeParam.setDeviceAddr(deviceInstall.getDeviceAddr()); //传入通讯编号 - deviceCodeParam.setDeviceType(deviceInstall.getDeviceType()); - deviceCodeParam.setDataCom(deviceInstall.getDataCom()); - deviceCodeParam.setBaudrate(deviceInstall.getBaudRate()); - deviceCodeParam.setParity(deviceInstall.getParity()); - deviceCodeParam.setDataValue("0000");//传入相关参数值,关机 - deviceCodeParam.setBuildingId(deviceInstall.getBuildingId()); - deviceCodeParam.setBrand(deviceInstall.getBrand()); - deviceCodeParam.setRegisterAddr("0000"); //寄存器地址 - deviceCodeParam.setFunCode("06"); - serialPortSingle.serialPortSend(deviceCodeParam);//生成并发送指令 - } - } - } - }, cal.getTime(), 24 * 60 * 60 * 1000); - } - - public void cronJobStart(int shi, int fen, int miao) { //定时开机 - Calendar cal = Calendar.getInstance(); - // 每天定点执行 - cal.set(Calendar.HOUR_OF_DAY, shi); - cal.set(Calendar.MINUTE, fen); - cal.set(Calendar.SECOND, miao); - - Timer timer = new Timer(); - timer.schedule(new TimerTask() { - - public void run() { - // 把run方法里的内容换成你要执行的内容 - SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); - System.out.println("当前的系统时间为:" + sdf.format(new Date())); +//package com.mh.user.utils; +// +//import com.mh.user.entity.DeviceCodeParamEntity; +//import com.mh.user.entity.DeviceInstallEntity; +//import com.mh.user.entity.PumpSetEntity; +//import com.mh.user.model.SerialPortModel; +//import com.mh.user.serialport.SerialPortSingle; +//import com.mh.user.service.DeviceInstallService; +//import com.mh.user.service.PumpSetService; +//import io.swagger.models.auth.In; +//import org.springframework.beans.factory.annotation.Autowired; +//import org.springframework.context.ApplicationContext; +// +//import java.text.SimpleDateFormat; +//import java.util.*; +// +//public class TimedTask2 { +// +// ApplicationContext context = SpringBeanUtil.getApplicationContext(); +// PumpSetService pumpSetService=context.getBean(PumpSetService.class); +// DeviceInstallService deviceInstallService=context.getBean(DeviceInstallService.class); +// +// public void cronJobClose(int shi, int fen, int miao) { //定时关机 +// Calendar cal = Calendar.getInstance(); +// // 每天定点执行 +// cal.set(Calendar.HOUR_OF_DAY, shi); +// cal.set(Calendar.MINUTE, fen); +// cal.set(Calendar.SECOND, miao); +// +// Timer timer = new Timer(); +// timer.schedule(new TimerTask() { +// +// public void run() { +// // 把run方法里的内容换成你要执行的内容 +// SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); +// System.out.println("当前的系统时间为:" + sdf.format(new Date())); // SerialPortSingle serialPortSingle = new SerialPortSingle(); //发送接收类 // DeviceCodeParamEntity deviceCodeParam=new DeviceCodeParamEntity();//参数实体类 // List deviceList=deviceInstallService.selectDevicePump(); @@ -80,7 +44,7 @@ public class TimedTask2 { // deviceCodeParam.setDataCom(deviceInstall.getDataCom()); // deviceCodeParam.setBaudrate(deviceInstall.getBaudRate()); // deviceCodeParam.setParity(deviceInstall.getParity()); -// deviceCodeParam.setDataValue("0003");//传入相关参数值,制热 +// deviceCodeParam.setDataValue("0000");//传入相关参数值,关机 // deviceCodeParam.setBuildingId(deviceInstall.getBuildingId()); // deviceCodeParam.setBrand(deviceInstall.getBrand()); // deviceCodeParam.setRegisterAddr("0000"); //寄存器地址 @@ -88,33 +52,69 @@ public class TimedTask2 { // serialPortSingle.serialPortSend(deviceCodeParam);//生成并发送指令 // } // } - - } - }, cal.getTime(), 24 * 60 * 60 * 1000); - } - - public void cronJob(){ - PumpSetEntity pumpSet=pumpSetService.queryHandTime(); - if (pumpSet!=null){ - String HH=""; - String mm=""; - String startTime=pumpSet.getStartTime1(); - HH=startTime.substring(0,2); - mm=startTime.substring(3,5); -// cronJobStart(Integer.valueOf(HH), Integer.valueOf(mm), 00); - cronJobStart(16, 13, 00); - System.out.println("-----------小时:"+HH+",分钟:"+mm+"-----------"); -// String closeTime=pumpSet.getCloseTime1(); -// HH=closeTime.substring(0,2); -// mm=closeTime.substring(3,5); -// cronJobClose(Integer.valueOf(HH), Integer.valueOf(mm), 00); - System.out.println("-----------小时:"+HH+",分钟:"+mm+"-----------"); - } - } +// } +// }, cal.getTime(), 24 * 60 * 60 * 1000); +// } +// +// public void cronJobStart(int shi, int fen, int miao) { //定时开机 +// Calendar cal = Calendar.getInstance(); +// // 每天定点执行 +// cal.set(Calendar.HOUR_OF_DAY, shi); +// cal.set(Calendar.MINUTE, fen); +// cal.set(Calendar.SECOND, miao); +// +// Timer timer = new Timer(); +// timer.schedule(new TimerTask() { +// +// public void run() { +// // 把run方法里的内容换成你要执行的内容 +// SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); +// System.out.println("当前的系统时间为:" + sdf.format(new Date())); +//// SerialPortSingle serialPortSingle = new SerialPortSingle(); //发送接收类 +//// DeviceCodeParamEntity deviceCodeParam=new DeviceCodeParamEntity();//参数实体类 +//// List deviceList=deviceInstallService.selectDevicePump(); +//// if (deviceList.size()>0){ +//// for (DeviceInstallEntity deviceInstall :deviceList){ +//// deviceCodeParam.setDeviceAddr(deviceInstall.getDeviceAddr()); //传入通讯编号 +//// deviceCodeParam.setDeviceType(deviceInstall.getDeviceType()); +//// deviceCodeParam.setDataCom(deviceInstall.getDataCom()); +//// deviceCodeParam.setBaudrate(deviceInstall.getBaudRate()); +//// deviceCodeParam.setParity(deviceInstall.getParity()); +//// deviceCodeParam.setDataValue("0003");//传入相关参数值,制热 +//// deviceCodeParam.setBuildingId(deviceInstall.getBuildingId()); +//// deviceCodeParam.setBrand(deviceInstall.getBrand()); +//// deviceCodeParam.setRegisterAddr("0000"); //寄存器地址 +//// deviceCodeParam.setFunCode("06"); +//// serialPortSingle.serialPortSend(deviceCodeParam);//生成并发送指令 +//// } +//// } +// +// } +// }, cal.getTime(), 24 * 60 * 60 * 1000); +// } +// +// public void cronJob(){ +// PumpSetEntity pumpSet=pumpSetService.queryHandTime(); +// if (pumpSet!=null){ +// String HH=""; +// String mm=""; +// String startTime=pumpSet.getStartTime1(); +// HH=startTime.substring(0,2); +// mm=startTime.substring(3,5); +//// cronJobStart(Integer.valueOf(HH), Integer.valueOf(mm), 00); +// cronJobStart(16, 13, 00); +// System.out.println("-----------小时:"+HH+",分钟:"+mm+"-----------"); +//// String closeTime=pumpSet.getCloseTime1(); +//// HH=closeTime.substring(0,2); +//// mm=closeTime.substring(3,5); +//// cronJobClose(Integer.valueOf(HH), Integer.valueOf(mm), 00); +// System.out.println("-----------小时:"+HH+",分钟:"+mm+"-----------"); +// } +// } +//// +//// public static void main(String[] args) { +//// cronJob(11, 46, 0); //24小时制 时分秒 +//// } +// // -// public static void main(String[] args) { -// cronJob(11, 46, 0); //24小时制 时分秒 -// } - - -} +//} diff --git a/user-service/src/main/resources/application-dev.yml b/user-service/src/main/resources/application-dev.yml index 76591e9..bd40c48 100644 --- a/user-service/src/main/resources/application-dev.yml +++ b/user-service/src/main/resources/application-dev.yml @@ -1,5 +1,5 @@ server: - port: 8761 #8761创新、8762广商、8763华厦、广州理工 + port: 8762 #8761创新、8762广商、8763华厦、广州理工 spring: application: name: user-service @@ -12,6 +12,10 @@ spring: 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 +# password: mh@803 filters: stat,wall,config max-active: 100 diff --git a/user-service/src/main/resources/application-prod.yml b/user-service/src/main/resources/application-prod.yml index e37e54e..16512cb 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: 8763 #8761创新、8762广商、8763华厦、广州理工 + port: 8762 #8761创新、8762广商、8763华厦、广州理工 spring: application: name: user-service @@ -14,10 +14,10 @@ spring: # password: mh@803 ## url: jdbc:sqlserver://120.25.220.177:32012;DatabaseName=M_CHWS;allowMultiQueries=true #阿里云服务器-广州理工 - url: jdbc:sqlserver://120.25.220.177:32012;DatabaseName=CHWS;allowMultiQueries=true - driver-class-name: com.microsoft.sqlserver.jdbc.SQLServerDriver - username: test - password: minghan123456@ +# url: jdbc:sqlserver://120.25.220.177:32012;DatabaseName=CHWS;allowMultiQueries=true +# driver-class-name: com.microsoft.sqlserver.jdbc.SQLServerDriver +# username: test +# password: minghan123456@ #华厦云服务器 # url: jdbc:sqlserver://127.0.0.1:1433;DatabaseName=CHWS;allowMultiQueries=true # driver-class-name: com.microsoft.sqlserver.jdbc.SQLServerDriver @@ -29,10 +29,10 @@ spring: # username: chws # 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 - # 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 + password: mh@803 #本机 # url: jdbc:sqlserver://127.0.0.1:9956;DatabaseName=CHWS;allowMultiQueries=true # driver-class-name: com.microsoft.sqlserver.jdbc.SQLServerDriver 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 fa5edbd..cf46173 100644 --- a/user-service/src/test/java/com/mh/user/UserServiceApplicationTests.java +++ b/user-service/src/test/java/com/mh/user/UserServiceApplicationTests.java @@ -57,7 +57,7 @@ class UserServiceApplicationTests { //0203020008FD82 // analysis.analysisPumpOrder485("0203020008FD82","0641"); // getReadOrder485.createOrderParam(); -// analysis.analysisRelayOrder485("220611000000013A220611000000023B220611000000033C220611000000043D220611000000053E220611000000063F22061100000007402206110000000841","0017","中凯"); + analysis.analysisTimeSetOrder4852("0B10000900041162",null, null, null, null); } @Test public void testHotWater() throws InterruptedException { @@ -92,4 +92,17 @@ class UserServiceApplicationTests { } } + @Test + public void testGetPump() { + String dataValue = "03002200"; + System.out.println(ExchangeStringUtil.IntToHex(Integer.parseInt(dataValue.substring(0, 2)))); + System.out.println(ExchangeStringUtil.IntToHex(Integer.parseInt(dataValue.substring(2, 4)))); + System.out.println(ExchangeStringUtil.IntToHex(Integer.parseInt(dataValue.substring(4, 6)))); + System.out.println(ExchangeStringUtil.IntToHex(Integer.parseInt(dataValue.substring(6, 8)))); + String strData = "00" + ExchangeStringUtil.addZeroForNum(ExchangeStringUtil.IntToHex(Integer.parseInt(dataValue.substring(0, 2))),2) + + "00" + ExchangeStringUtil.addZeroForNum(ExchangeStringUtil.IntToHex(Integer.parseInt(dataValue.substring(2, 4))),2) + + "00" + ExchangeStringUtil.addZeroForNum(ExchangeStringUtil.IntToHex(Integer.parseInt(dataValue.substring(4, 6))),2) + + "00" + ExchangeStringUtil.addZeroForNum(ExchangeStringUtil.IntToHex(Integer.parseInt(dataValue.substring(6, 8))),2); + System.out.println(strData); + } } diff --git a/热水新增脚本.sql b/热水新增脚本.sql index 48cf469..829c418 100644 --- a/热水新增脚本.sql +++ b/热水新增脚本.sql @@ -3,3 +3,10 @@ create index pump_set_pump_id_building_id on pump_set(pump_id, building_id); create index now_data_building_id on pump_set(building_id); create index now_data_pump_id on pump_set(pump_id); + +-- 2024-01-08 新增字段,waterLevel表 +alter table waterLevel add device_addr varchar(32) not null default ''; +exec sp_addextendedproperty N'MS_Description', N'设备地址', N'schema', N'dbo',N'table', N'waterLevel', N'column', N'device_addr'; +alter table waterLevel add device_name varchar(50) not null default ''; +exec sp_addextendedproperty N'MS_Description', N'设备名称', N'schema', N'dbo',N'table', N'waterLevel', N'column', N'device_name'; +