diff --git a/common/pom.xml b/common/pom.xml index e741fed..4b72d14 100644 --- a/common/pom.xml +++ b/common/pom.xml @@ -82,5 +82,12 @@ poi-ooxml 4.0.1 + + + + net.coobird + thumbnailator + 0.4.20 + diff --git a/common/src/main/java/com/mh/common/utils/FileUtils.java b/common/src/main/java/com/mh/common/utils/FileUtils.java index 09d4db7..0bbb80b 100644 --- a/common/src/main/java/com/mh/common/utils/FileUtils.java +++ b/common/src/main/java/com/mh/common/utils/FileUtils.java @@ -1,5 +1,6 @@ package com.mh.common.utils; +import net.coobird.thumbnailator.Thumbnails; import org.springframework.web.multipart.MultipartFile; import sun.misc.BASE64Encoder; @@ -54,4 +55,53 @@ public class FileUtils { BASE64Encoder encoder = new BASE64Encoder(); return encoder.encode(data); } + + public static byte[] compressImage(MultipartFile file, long targetSize) throws IOException { + try (InputStream inputStream = file.getInputStream()) { + // 将输入流转换为字节数组 + byte[] originalBytes = new byte[inputStream.available()]; + inputStream.read(originalBytes); + inputStream.close(); + ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(originalBytes); + + // 初始压缩比例 + double compressionRatio = 0.9; + byte[] compressedBytes; + + while (true) { + try (ByteArrayOutputStream outputStream = new ByteArrayOutputStream()) { + Thumbnails.of(byteArrayInputStream) + .scale(compressionRatio) + .outputQuality(compressionRatio) + .toOutputStream(outputStream); + + compressedBytes = outputStream.toByteArray(); + + if (compressedBytes.length <= targetSize) { + return compressedBytes; + } else { + // 调整压缩比例 + compressionRatio -= 0.1; + if (compressionRatio <= 0.1) { + throw new RuntimeException("无法将图像压缩到目标大小"); + } + } + } + + // 重置输入流 + byteArrayInputStream.reset(); + } + } + } + + public static String reSizeImg(MultipartFile file) { + try { + byte[] bytes = compressImage(file, 512 * 1024); + // 对字节数组进行编码,得到base64编码字符串 + BASE64Encoder encoder = new BASE64Encoder(); + return encoder.encode(bytes); + } catch (IOException e) { + throw new RuntimeException(e); + } + } } diff --git a/user-service/pom.xml b/user-service/pom.xml index 7843d51..6b4935d 100644 --- a/user-service/pom.xml +++ b/user-service/pom.xml @@ -34,6 +34,11 @@ org.springframework.boot spring-boot-starter-undertow + + cn.hutool + hutool-all + 5.1.0 + org.springframework.boot diff --git a/user-service/src/main/java/com/mh/user/annotation/applicationListener.java b/user-service/src/main/java/com/mh/user/annotation/ApplicationListener.java similarity index 84% rename from user-service/src/main/java/com/mh/user/annotation/applicationListener.java rename to user-service/src/main/java/com/mh/user/annotation/ApplicationListener.java index 5ba461e..bce50de 100644 --- a/user-service/src/main/java/com/mh/user/annotation/applicationListener.java +++ b/user-service/src/main/java/com/mh/user/annotation/ApplicationListener.java @@ -1,12 +1,11 @@ package com.mh.user.annotation; -import javax.servlet.ServletContextAttributeEvent; import javax.servlet.ServletContextAttributeListener; import javax.servlet.ServletContextEvent; import javax.servlet.ServletContextListener; import javax.servlet.annotation.WebListener; @WebListener -public class applicationListener implements ServletContextListener,ServletContextAttributeListener{ +public class ApplicationListener implements ServletContextListener,ServletContextAttributeListener{ @Override public void contextDestroyed(ServletContextEvent arg0) { diff --git a/user-service/src/main/java/com/mh/user/annotation/CacheChanges.java b/user-service/src/main/java/com/mh/user/annotation/CacheChanges.java new file mode 100644 index 0000000..36cec36 --- /dev/null +++ b/user-service/src/main/java/com/mh/user/annotation/CacheChanges.java @@ -0,0 +1,20 @@ +package com.mh.user.annotation; + +import java.lang.annotation.*; + +/** + * @author LJF + * @version 1.0 + * @project mh_esi + * @description 缓存变动 + * @date 2024-11-19 11:36:47 + */ +@Target(ElementType.METHOD) +@Retention(RetentionPolicy.RUNTIME) +@Documented +public @interface CacheChanges { + + // 缓存类型 + String value() default ""; + +} diff --git a/user-service/src/main/java/com/mh/user/aspect/CacheChangesAsp.java b/user-service/src/main/java/com/mh/user/aspect/CacheChangesAsp.java new file mode 100644 index 0000000..f47588b --- /dev/null +++ b/user-service/src/main/java/com/mh/user/aspect/CacheChangesAsp.java @@ -0,0 +1,75 @@ +package com.mh.user.aspect; + +import com.mh.common.utils.StringUtils; +import com.mh.user.annotation.CacheChanges; +import com.mh.user.entity.MeterManageEntity; +import com.mh.user.service.DeviceCodeParamService; +import com.mh.user.service.SysDictService; +import org.aspectj.lang.JoinPoint; +import org.aspectj.lang.ProceedingJoinPoint; +import org.aspectj.lang.annotation.After; +import org.aspectj.lang.annotation.Around; +import org.aspectj.lang.annotation.Aspect; +import org.aspectj.lang.annotation.Pointcut; +import org.aspectj.lang.reflect.MethodSignature; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.lang.reflect.Method; + +/** + * @author LJF + * @version 1.0 + * @project mh_esi + * @description 缓存数据切面 + * @date 2024-11-19 11:40:50 + */ +@Aspect +@Component +public class CacheChangesAsp { + + @Autowired + private SysDictService sysDictService; + + @Autowired + private DeviceCodeParamService deviceCodeParamService; + + @Pointcut("@annotation(com.mh.user.annotation.CacheChanges)") + public void cachePointCut() { + } + + @After("cachePointCut()") + public void afterAdvice(JoinPoint point) throws Throwable { + // 保存日志 + updateCacheChanges(point); + } + + private void updateCacheChanges(JoinPoint joinPoint) { + + // 获取方法签名 + MethodSignature signature = (MethodSignature) joinPoint.getSignature(); + // 获取方法上的注解 + CacheChanges cacheChanges = signature.getMethod().getAnnotation(CacheChanges.class); + // 获取值 + String value = ""; + if (cacheChanges != null) { + value = cacheChanges.value(); + } + + // 获取项目id参数 + Object[] args = joinPoint.getArgs(); + + switch (value) { + case "sys_dict": + sysDictService.createDictDataCache(); + break; + case "device_code_params": + MeterManageEntity entity = (MeterManageEntity) args[0]; + deviceCodeParamService.createCodeParams(entity); + default: + break; + } + + } + +} 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..cfb98b2 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 @@ -72,11 +72,13 @@ public class DaoAspect { 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()); + if (arg.equals(createBy) || arg.equals(createTime)) { + 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()); + } } } } diff --git a/user-service/src/main/java/com/mh/user/controller/MeterManageController.java b/user-service/src/main/java/com/mh/user/controller/MeterManageController.java index 517b936..c25cd43 100644 --- a/user-service/src/main/java/com/mh/user/controller/MeterManageController.java +++ b/user-service/src/main/java/com/mh/user/controller/MeterManageController.java @@ -3,6 +3,7 @@ package com.mh.user.controller; import com.mh.common.http.HttpResult; import com.mh.common.page.PageRequest; import com.mh.common.page.PageResult; +import com.mh.user.annotation.CacheChanges; import com.mh.user.annotation.FieldParam; import com.mh.user.annotation.SysLogger; import com.mh.user.annotation.TranslationDict; @@ -37,6 +38,7 @@ public class MeterManageController { return meterManageService.queryByPage(pageRequest); } + @CacheChanges(value = "device_code_params") @SysLogger(value="仪表管理信息",optDesc = "编辑仪表管理信息") @PostMapping("/update") public HttpResult updateProInfo(MeterManageEntity entity) { @@ -51,6 +53,7 @@ public class MeterManageController { return HttpResult.ok(entity); } + @CacheChanges(value = "device_code_params") @SysLogger(value="仪表管理信息",optDesc = "添加仪表管理信息") @PostMapping("/save") public HttpResult saveGw(MeterManageEntity entity) { @@ -58,6 +61,7 @@ public class MeterManageController { return HttpResult.ok(); } + @CacheChanges(value = "device_code_params") @SysLogger(value="仪表管理信息",optDesc = "删除仪表管理信息") @GetMapping("/deleteById") public HttpResult deleteProInfo(@RequestParam String id) { diff --git a/user-service/src/main/java/com/mh/user/controller/SysDictController.java b/user-service/src/main/java/com/mh/user/controller/SysDictController.java index 6bfae38..af14c70 100644 --- a/user-service/src/main/java/com/mh/user/controller/SysDictController.java +++ b/user-service/src/main/java/com/mh/user/controller/SysDictController.java @@ -3,6 +3,7 @@ package com.mh.user.controller; import com.mh.common.http.HttpResult; import com.mh.common.page.PageRequest; import com.mh.common.page.PageResult; +import com.mh.user.annotation.CacheChanges; import com.mh.user.annotation.SysLogger; import com.mh.user.model.SysDict; import com.mh.user.service.SysDictService; @@ -29,6 +30,7 @@ public class SysDictController { return sysDictService.findPage(pageRequest); } + @CacheChanges(value = "sys_dict") @SysLogger(value="系统字典管理",optDesc = "编辑系统字典管理") @PostMapping("/update") public HttpResult update(SysDict entity) { @@ -43,6 +45,7 @@ public class SysDictController { return HttpResult.ok(entity); } + @CacheChanges(value = "sys_dict") @SysLogger(value="系统字典管理",optDesc = "添加系统字典管理") @PostMapping("/save") public HttpResult save(SysDict entity) { @@ -50,6 +53,7 @@ public class SysDictController { return HttpResult.ok(); } + @CacheChanges(value = "sys_dict") @SysLogger(value="系统字典管理",optDesc = "删除系统字典管理") @GetMapping("/deleteById") public HttpResult delete(@RequestParam Long id) { diff --git a/user-service/src/main/java/com/mh/user/entity/MeterManageEntity.java b/user-service/src/main/java/com/mh/user/entity/MeterManageEntity.java index 00e4865..ca0d4e5 100644 --- a/user-service/src/main/java/com/mh/user/entity/MeterManageEntity.java +++ b/user-service/src/main/java/com/mh/user/entity/MeterManageEntity.java @@ -193,6 +193,11 @@ public class MeterManageEntity implements Serializable { */ private int registerSize; + /** + * 采集点是否启用 + */ + private String isUse; + @Override public String toString() { return "MeterManageEntity{" + @@ -230,6 +235,7 @@ public class MeterManageEntity implements Serializable { ", projectId=" + projectId + ", communicationType=" + communicationType + ", registerSize=" + registerSize + + ", isUse=" + isUse + '}'; } } diff --git a/user-service/src/main/java/com/mh/user/job/CollectionLoopRunner.java b/user-service/src/main/java/com/mh/user/job/CollectionLoopRunner.java index 16976e1..23745b8 100644 --- a/user-service/src/main/java/com/mh/user/job/CollectionLoopRunner.java +++ b/user-service/src/main/java/com/mh/user/job/CollectionLoopRunner.java @@ -1,14 +1,7 @@ package com.mh.user.job; -import com.mh.common.page.PageRequest; -import com.mh.user.entity.*; -import com.mh.user.factory.Protocol; -import com.mh.user.factory.ProtocolFactory; import com.mh.user.netty.EchoServer; import com.mh.user.service.*; -import com.mh.user.strategy.ProtocolStrategy; -import com.mh.user.strategy.ProtocolStrategyFactory; -import com.mh.user.utils.GetReadOrder485; import gnu.io.SerialPort; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; @@ -16,8 +9,6 @@ import org.springframework.boot.ApplicationArguments; import org.springframework.boot.ApplicationRunner; import org.springframework.stereotype.Component; -import java.util.*; - /** * @author ljf * @title : @@ -31,41 +22,27 @@ public class CollectionLoopRunner implements ApplicationRunner { public static SerialPort serialPort = null; - @Autowired - ProjectInfoService projectInfoService; - - @Autowired - private MeterManageService meterManageService; - @Autowired private DeviceCodeParamService deviceCodeParamService; - @Autowired - private GatewayManageService gatewayManageService; - - @Autowired - private DeviceParamsService deviceParamsService; - @Autowired private SysDictService sysDictService; @Override - public void run(ApplicationArguments args) throws Exception { - List projectInfoEntities = projectInfoService.queryProjectInfo("1"); - if (null != projectInfoEntities && !projectInfoEntities.isEmpty()) { - for (ProjectInfoEntity projectInfoEntity : projectInfoEntities) { - // getReadOrder485.createOrderParam(String.valueOf(projectInfoEntity.getId())); //生成采集参数,1新珠江(6000),2广合科技(6001),3广大科技(6002),6珠江国际,7保利山庄,8东莞迎宾馆 - createOrderParamByStrategy(projectInfoEntity.getSystemId(), String.valueOf(projectInfoEntity.getId())); - } - } + public void run(ApplicationArguments args) { try { + // 生成采集参数 + createCodeParams(); + // 生成字典缓存 + createDictDataCache(); new EchoServer(6001).start(); // 调用服务器的start方法,网关作为客户端,6006新珠江,6001广合科技,6077广大科技 6028(6006)珠江国际,5000保利山庄,6004东莞迎宾馆 } catch (Exception e) { log.info("6001端口已占用!"); } + } - // 生成字典缓存 - createDictDataCache(); + private void createCodeParams() { + deviceCodeParamService.createCodeParams(null); } public void createDictDataCache() { @@ -73,88 +50,4 @@ public class CollectionLoopRunner implements ApplicationRunner { sysDictService.createDictDataCache(); } - public void createOrderParamByStrategy(String systemId, String projectId) throws InterruptedException { - int r; - if (projectId != null && !projectId.isEmpty()) { - r = deviceCodeParamService.queryCount(projectId);//查询记录数 - } else { - r = deviceCodeParamService.queryCount2();//查询记录数 - } - if (r > 0) { - return; - } - List deviceCodeParamEntityList = new ArrayList<>(); - List meterManageEntities = Collections.emptyList(); - - if (projectId != null && !projectId.isEmpty()) { - meterManageEntities = meterManageService.queryBySystemIdAndProjectId(systemId, projectId); - } - - DeviceCodeParamEntity deviceCodeParamEntity = new DeviceCodeParamEntity(); - - // 根据协议进行匹配生成采集报文 - for (MeterManageEntity meterManageEntity : meterManageEntities) { - // 重置采集参数 - deviceCodeParamEntity.reset(); - - // 创建设备报文 - String protocolType = String.valueOf(meterManageEntity.getProtocolType()); - Protocol protocol = ProtocolFactory.matchProtocol(protocolType); - ProtocolStrategy strategy = ProtocolStrategyFactory.matchProtocolStrategy(protocolType); - - if (strategy == null) { - continue; - } - - protocol.setStrategy(strategy); - String sendStr = protocol.createOrder(meterManageEntity); - log.info("采集指令===> {}", sendStr); - - deviceCodeParamEntity.setDeviceAddr(meterManageEntity.getMtCode()); - deviceCodeParamEntity.setDeviceName(meterManageEntity.getMtName()); - deviceCodeParamEntity.setDeviceType(String.valueOf(meterManageEntity.getMtType())); - deviceCodeParamEntity.setStrData(sendStr); - - try { - GatewayManageEntity gatewayManageEntity = gatewayManageService.findById(meterManageEntity.getGatewayId()); - if (gatewayManageEntity != null) { - deviceCodeParamEntity.setDataPort(String.valueOf(gatewayManageEntity.getPort())); - } - } catch (Exception e) { - log.error("查询网关信息失败: {}", e.getMessage()); - } - - try { - DeviceParamsEntity paramsEntity = deviceParamsService.findById(meterManageEntity.getParamId()); - if (paramsEntity != null) { - deviceCodeParamEntity.setBaudRate(paramsEntity.getBaudRate()); - deviceCodeParamEntity.setParity(paramsEntity.getParity()); - } - } catch (Exception e) { - log.error("查询设备参数失败: {}", e.getMessage()); - } - - deviceCodeParamEntity.setBrand(meterManageEntity.getMtBrand()); - deviceCodeParamEntity.setFunCode(meterManageEntity.getFuncCode()); - deviceCodeParamEntity.setRegisterAddr(meterManageEntity.getRegisterAddr()); - deviceCodeParamEntity.setRegisterName(meterManageEntity.getOtherName()); - deviceCodeParamEntity.setDigit(meterManageEntity.getDigits()); - deviceCodeParamEntity.setGrade(meterManageEntity.getGrade()); - deviceCodeParamEntity.setDataValue(null); // 传入值(目前不需要) - deviceCodeParamEntity.setProjectId(projectId); - deviceCodeParamEntity.setCreateTime(new Date()); - - deviceCodeParamEntity.setMmId(meterManageEntity.getId()); - deviceCodeParamEntity.setDataType(meterManageEntity.getDataType()); - deviceCodeParamEntity.setProtocolType(meterManageEntity.getProtocolType()); - - deviceCodeParamEntityList.add(deviceCodeParamEntity.clone()); - } - - if (!deviceCodeParamEntityList.isEmpty()) { - deviceCodeParamService.insertDeviceCodeParamList(deviceCodeParamEntityList); - } - - } - } 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 73821d6..e50a258 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 @@ -100,10 +100,14 @@ public class DealDataJob { Date date=new Date(); Map map= SimpleWeather.queryWeather("广州"); String curDate=sdf1.format(date); + if (map.isEmpty()) { + // 重新请求接口 + map= SimpleWeather.queryWeather("广州"); + } String temperature=map.get("temperature").toString(); String humidity=map.get("humidity").toString(); dealDataService.saveTempHumidity(curDate,temperature,humidity); - log.info(curDate+","+temperature+"℃,"+humidity+"%"); + log.info("{},{}℃,{}%", curDate, temperature, humidity); } catch (Exception e) { // e.printStackTrace(); log.error("调用获取环境温湿度接口失败!", e); @@ -129,7 +133,7 @@ public class DealDataJob { dealDataService.proEnergyDaySum(curDate,projectId); } } - log.info("---------中央热水生产概况汇总,每一小时!"+curDate); + log.info("---------中央热水生产概况汇总,每一小时!{}", curDate); } catch (Exception e) { log.error("中央热水生产概况定时汇总异常", e); } 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 d812099..f2b396d 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 @@ -118,4 +118,7 @@ public interface DeviceCodeParamMapper extends BaseMapper @Insert("insert into device_code_param(device_addr,device_name,device_type,data_port,baud_rate,parity,brand,create_time,project_id,digit,grade) select device_addr,device_name,device_type,data_port,baud_rate,parity,brand,getDate(),project_id,2,grade from device_code " + " where (device_type='电表' or device_type='水表') and project_id=#{projectId} ") void selectInsertDeviceCodeParam(@Param("projectId") String projectId); + + @Delete("delete from device_code_param where project_id=#{projectId} ") + void deleteDeviceCodeParam(@Param("projectId") long projectId); } diff --git a/user-service/src/main/java/com/mh/user/netty/EchoServerHandler.java b/user-service/src/main/java/com/mh/user/netty/EchoServerHandler.java index ab2ae47..6054a65 100644 --- a/user-service/src/main/java/com/mh/user/netty/EchoServerHandler.java +++ b/user-service/src/main/java/com/mh/user/netty/EchoServerHandler.java @@ -198,10 +198,13 @@ public class EchoServerHandler extends ChannelInboundHandlerAdapter { } } - private void analysisReceiveData(String receiveStr, DeviceCodeParamEntity deviceCodeParamEntity) { - // 解析采集的报文,并保存到数据库 - AnalysisReceiveOrder485 analysisReceiveOrder485 = new AnalysisReceiveOrder485(); - analysisReceiveOrder485.analysisReceiveOrder485(receiveStr, deviceCodeParamEntity); + private void analysisReceiveData(final String receiveStr, final DeviceCodeParamEntity deviceCodeParamEntity) { + // 多线程解析数据 + ThreadPoolService.getInstance().execute(() -> { + // 解析采集的报文,并保存到数据库 + AnalysisReceiveOrder485 analysisReceiveOrder485 = new AnalysisReceiveOrder485(); + analysisReceiveOrder485.analysisReceiveOrder485(receiveStr, deviceCodeParamEntity); + }); } private void whiteGateway(ChannelHandlerContext ctx) throws InterruptedException { diff --git a/user-service/src/main/java/com/mh/user/service/DeviceCodeParamService.java b/user-service/src/main/java/com/mh/user/service/DeviceCodeParamService.java index a83801c..15315bf 100644 --- a/user-service/src/main/java/com/mh/user/service/DeviceCodeParamService.java +++ b/user-service/src/main/java/com/mh/user/service/DeviceCodeParamService.java @@ -1,6 +1,7 @@ package com.mh.user.service; import com.mh.user.entity.DeviceCodeParamEntity; +import com.mh.user.entity.MeterManageEntity; import org.apache.ibatis.annotations.Param; @@ -34,4 +35,9 @@ public interface DeviceCodeParamService { //查询插入 void selectInsertDeviceCodeParam(String ProjectID); + + /** + * 创建指令参数缓存 + */ + void createCodeParams(MeterManageEntity entity); } 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 f871417..e27dd79 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 @@ -1,21 +1,50 @@ package com.mh.user.service.impl; -import com.mh.user.entity.DeviceCodeParamEntity; +import com.alibaba.fastjson2.JSONObject; +import com.github.benmanes.caffeine.cache.Cache; +import com.mh.user.entity.*; +import com.mh.user.factory.Protocol; +import com.mh.user.factory.ProtocolFactory; import com.mh.user.mapper.DeviceCodeParamMapper; -import com.mh.user.service.DeviceCodeParamService; +import com.mh.user.model.SysDict; +import com.mh.user.service.*; +import com.mh.user.strategy.ProtocolStrategy; +import com.mh.user.strategy.ProtocolStrategyFactory; +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 org.springframework.transaction.annotation.Transactional; +import java.util.ArrayList; +import java.util.Collections; +import java.util.Date; import java.util.List; @Transactional(rollbackFor = Exception.class) @Service +@Slf4j public class DeviceCodeParamServiceImpl implements DeviceCodeParamService { @Autowired DeviceCodeParamMapper deviceCodeParamMapper; + @Autowired + private ProjectInfoService projectInfoService; + + @Autowired + private MeterManageService meterManageService; + + @Autowired + private GatewayManageService gatewayManageService; + + @Autowired + private DeviceParamsService deviceParamsService; + + @Autowired + @Qualifier("caffeineCache") + private Cache caffeineCache; + @Override public void insertDeviceCodeParam(DeviceCodeParamEntity deviceCodeParamEntity) { @@ -61,4 +90,118 @@ public class DeviceCodeParamServiceImpl implements DeviceCodeParamService { public void selectInsertDeviceCodeParam(String ProjectID) { deviceCodeParamMapper.selectInsertDeviceCodeParam(ProjectID); } + + @Override + public void createCodeParams(MeterManageEntity entity) { + if (entity == null) { + List projectInfoEntities = projectInfoService.queryProjectInfo("1"); + if (null != projectInfoEntities && !projectInfoEntities.isEmpty()) { + for (ProjectInfoEntity projectInfoEntity : projectInfoEntities) { + // getReadOrder485.createOrderParam(String.valueOf(projectInfoEntity.getId())); //生成采集参数,1新珠江(6000),2广合科技(6001),3广大科技(6002),6珠江国际,7保利山庄,8东莞迎宾馆 + createOrderParamByStrategy(projectInfoEntity.getSystemId(), String.valueOf(projectInfoEntity.getId())); + } + } + return; + } + Long projectId = entity.getProjectId(); + if (projectId != 0) { + // 删除数据库存储的采集参数 + deviceCodeParamMapper.deleteDeviceCodeParam(projectId); + // 删除缓存 + caffeineCache.invalidate("code_params_"+projectId); + List deviceCodeParamEntityList = createOrderParamByStrategy("1", String.valueOf(projectId)); + // 放入缓存中 + if (deviceCodeParamEntityList != null) { + caffeineCache.put("code_params_" + projectId, deviceCodeParamEntityList); + } + List test = (List) caffeineCache.getIfPresent("code_params_"+projectId); + log.info("生成采集参数完毕==>{}", JSONObject.toJSONString(test)); + } + } + + public List createOrderParamByStrategy(String systemId, String projectId) { + int r; + if (projectId != null && !projectId.isEmpty()) { + r = queryCount(projectId);//查询记录数 + } else { + r = queryCount2();//查询记录数 + } + if (r > 0) { + return null; + } + List deviceCodeParamEntityList = new ArrayList<>(); + List meterManageEntities = Collections.emptyList(); + + if (projectId != null && !projectId.isEmpty()) { + meterManageEntities = meterManageService.queryBySystemIdAndProjectId(systemId, projectId); + } + + DeviceCodeParamEntity deviceCodeParamEntity = new DeviceCodeParamEntity(); + + // 根据协议进行匹配生成采集报文 + for (MeterManageEntity meterManageEntity : meterManageEntities) { + // 重置采集参数 + deviceCodeParamEntity.reset(); + + // 创建设备报文 + String protocolType = String.valueOf(meterManageEntity.getProtocolType()); + Protocol protocol = ProtocolFactory.matchProtocol(protocolType); + ProtocolStrategy strategy = ProtocolStrategyFactory.matchProtocolStrategy(protocolType); + + if (strategy == null) { + continue; + } + + protocol.setStrategy(strategy); + String sendStr = protocol.createOrder(meterManageEntity); + log.info("采集指令===> {}", sendStr); + + deviceCodeParamEntity.setDeviceAddr(meterManageEntity.getMtCode()); + deviceCodeParamEntity.setDeviceName(meterManageEntity.getMtName()); + deviceCodeParamEntity.setDeviceType(String.valueOf(meterManageEntity.getMtType())); + deviceCodeParamEntity.setStrData(sendStr); + + try { + GatewayManageEntity gatewayManageEntity = gatewayManageService.findById(meterManageEntity.getGatewayId()); + if (gatewayManageEntity != null) { + deviceCodeParamEntity.setDataPort(String.valueOf(gatewayManageEntity.getPort())); + } + } catch (Exception e) { + log.error("查询网关信息失败: {}", e.getMessage()); + } + + try { + DeviceParamsEntity paramsEntity = deviceParamsService.findById(meterManageEntity.getParamId()); + if (paramsEntity != null) { + deviceCodeParamEntity.setBaudRate(paramsEntity.getBaudRate()); + deviceCodeParamEntity.setParity(paramsEntity.getParity()); + } + } catch (Exception e) { + log.error("查询设备参数失败: {}", e.getMessage()); + } + + deviceCodeParamEntity.setBrand(meterManageEntity.getMtBrand()); + deviceCodeParamEntity.setFunCode(meterManageEntity.getFuncCode()); + deviceCodeParamEntity.setRegisterAddr(meterManageEntity.getRegisterAddr()); + deviceCodeParamEntity.setRegisterName(meterManageEntity.getOtherName()); + deviceCodeParamEntity.setDigit(meterManageEntity.getDigits()); + deviceCodeParamEntity.setGrade(meterManageEntity.getGrade()); + deviceCodeParamEntity.setDataValue(null); // 传入值(目前不需要) + deviceCodeParamEntity.setProjectId(projectId); + deviceCodeParamEntity.setCreateTime(new Date()); + + deviceCodeParamEntity.setMmId(meterManageEntity.getId()); + deviceCodeParamEntity.setDataType(meterManageEntity.getDataType()); + deviceCodeParamEntity.setProtocolType(meterManageEntity.getProtocolType()); + + deviceCodeParamEntityList.add(deviceCodeParamEntity.clone()); + } + + if (!deviceCodeParamEntityList.isEmpty()) { + insertDeviceCodeParamList(deviceCodeParamEntityList); + } + + return deviceCodeParamEntityList; + + } } diff --git a/user-service/src/main/java/com/mh/user/service/impl/ProjectInfoServiceImpl.java b/user-service/src/main/java/com/mh/user/service/impl/ProjectInfoServiceImpl.java index 61e8aef..16f4f44 100644 --- a/user-service/src/main/java/com/mh/user/service/impl/ProjectInfoServiceImpl.java +++ b/user-service/src/main/java/com/mh/user/service/impl/ProjectInfoServiceImpl.java @@ -52,7 +52,7 @@ public class ProjectInfoServiceImpl implements ProjectInfoService { @Override public void update(ProjectInfoEntity projectInfoEntity) { if (null != projectInfoEntity.getFile()) { - String fileToBase64 = FileUtils.convertFileToBase64(projectInfoEntity.getFile()); + String fileToBase64 = FileUtils.reSizeImg(projectInfoEntity.getFile()); projectInfoEntity.setPicContent(fileToBase64); projectInfoEntity.setPic(projectInfoEntity.getFile().getOriginalFilename()); } @@ -62,7 +62,7 @@ public class ProjectInfoServiceImpl implements ProjectInfoService { @Override public void save(ProjectInfoEntity projectInfoEntity) { if (null != projectInfoEntity.getFile()) { - String fileToBase64 = FileUtils.convertFileToBase64(projectInfoEntity.getFile()); + String fileToBase64 = FileUtils.reSizeImg(projectInfoEntity.getFile()); projectInfoEntity.setPicContent(fileToBase64); projectInfoEntity.setPic(projectInfoEntity.getFile().getOriginalFilename()); } diff --git a/user-service/src/main/java/com/mh/user/service/impl/SysDictServiceImpl.java b/user-service/src/main/java/com/mh/user/service/impl/SysDictServiceImpl.java index 2f180d8..3f13b21 100644 --- a/user-service/src/main/java/com/mh/user/service/impl/SysDictServiceImpl.java +++ b/user-service/src/main/java/com/mh/user/service/impl/SysDictServiceImpl.java @@ -106,6 +106,8 @@ public class SysDictServiceImpl implements SysDictService { @Override public void createDictDataCache() { + // 删除上次缓存 + caffeineCache.invalidate("sys_dict"); List sysDictList = sysDictMapper.selectList( new QueryWrapper().orderByDesc("create_time")); // 把项目列表放到缓存中 diff --git a/user-service/src/main/java/com/mh/user/utils/SimpleWeather.java b/user-service/src/main/java/com/mh/user/utils/SimpleWeather.java index 06b36f9..d48acc4 100644 --- a/user-service/src/main/java/com/mh/user/utils/SimpleWeather.java +++ b/user-service/src/main/java/com/mh/user/utils/SimpleWeather.java @@ -1,6 +1,7 @@ package com.mh.user.utils; import com.alibaba.fastjson2.JSONObject; +import lombok.extern.slf4j.Slf4j; import java.io.*; import java.net.HttpURLConnection; @@ -10,6 +11,7 @@ import java.nio.charset.StandardCharsets; import java.util.HashMap; import java.util.Map; +@Slf4j public class SimpleWeather { // 天气情况查询接口地址 public static String API_URL = "http://apis.juhe.cn/simpleWeather/query"; @@ -35,16 +37,15 @@ public class SimpleWeather { JSONObject jsonObject = JSONObject.parseObject(response); int error_code = jsonObject.getIntValue("error_code"); if (error_code == 0) { - System.out.println("调用接口成功"); JSONObject result = jsonObject.getJSONObject("result"); JSONObject realtime = result.getJSONObject("realtime"); - System.out.printf("城市:%s%n", result.getString("city")); - System.out.printf("天气:%s%n", realtime.getString("info")); - System.out.printf("温度:%s%n", realtime.getString("temperature")); - System.out.printf("湿度:%s%n", realtime.getString("humidity")); - System.out.printf("风向:%s%n", realtime.getString("direct")); - System.out.printf("风力:%s%n", realtime.getString("power")); - System.out.printf("空气质量:%s%n", realtime.getString("aqi")); + log.info("城市:{}", result.getString("city")); + log.info("天气:{}", realtime.getString("info")); + log.info("温度:{}", realtime.getString("temperature")); + log.info("湿度:{}", realtime.getString("humidity")); + log.info("风向:{}", realtime.getString("direct")); + log.info("风力:{}", realtime.getString("power")); + log.info("空气质量:{}", realtime.getString("aqi")); map.put("city", result.getString("city"));// 城市 map.put("info", realtime.getString("info"));// 天气信息 @@ -55,10 +56,11 @@ public class SimpleWeather { map.put("aqi", realtime.getString("aqi"));// 空气质量 } else { - System.out.println("调用接口失败:" + jsonObject.getString("reason")); + log.info("调用接口失败:{}", jsonObject.getString("reason")); } } catch (Exception e) { e.printStackTrace(); + log.error("调用天气接口失败:", e); } return map; } diff --git a/user-service/src/test/java/com/mh/user/socket/BIOServer.java b/user-service/src/test/java/com/mh/user/socket/BIOServer.java index 91812eb..3b3db17 100644 --- a/user-service/src/test/java/com/mh/user/socket/BIOServer.java +++ b/user-service/src/test/java/com/mh/user/socket/BIOServer.java @@ -1,11 +1,16 @@ package com.mh.user.socket; +import com.mh.user.utils.SimpleWeather; + import java.io.BufferedReader; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.net.ServerSocket; import java.net.Socket; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.Map; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; @@ -22,65 +27,18 @@ public class BIOServer { private static ExecutorService threadPool = Executors.newCachedThreadPool(); public static void main(String[] args) throws Exception { - ServerSocket sc = new ServerSocket(9093); - System.out.println("服务器启动成功!"); - while (!sc.isClosed()) { - Socket request = sc.accept(); // 阻塞 - System.out.println("收到新连接:" + request.toString()); - - // 引用线程池 - threadPool.execute(() -> { - try { - InputStream is = request.getInputStream(); // net+i/o - BufferedReader reader = new BufferedReader(new InputStreamReader(is, "utf-8")); - String msg; - while ((msg = reader.readLine()) != null) { // 没有数据会阻塞 - if (msg.length() == 0) { - break; - } - System.out.println(msg); - } - System.out.println("收到数据,来自:" + request.toString()); - - // 响应http结果 - // 响应结果 - OutputStream outputStream = request.getOutputStream(); - outputStream.write("HTTP/1.1 200 ok\r\n".getBytes()); - outputStream.write("Content-Length: 40\r\n\r\n".getBytes()); - outputStream.write("".getBytes()); - } catch (Exception e) { - // TODO: handle exception - } finally { - try { - request.close(); - } catch (Exception e2) { - // TODO: handle exception - } - } - }); - -// try { -// InputStream is = request.getInputStream(); // net+i/o -// BufferedReader reader = new BufferedReader(new InputStreamReader(is, "utf-8")); -// String msg; -// while ((msg = reader.readLine()) != null) { // 没有数据会阻塞 -// if (msg.length() == 0) { -// break; -// } -// System.out.println(msg); -// } -// System.out.println("收到数据,来自:" + request.toString()); -// } catch (Exception e) { -// // TODO: handle exception -// } finally { -// try { -// request.close(); -// } catch (Exception e2) { -// // TODO: handle exception -// } -// } - + try { + SimpleDateFormat sdf1=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + Date date=new Date(); + Map map= SimpleWeather.queryWeather("广州"); + String curDate=sdf1.format(date); + String temperature=map.get("temperature").toString(); + String humidity=map.get("humidity").toString(); + System.out.println(curDate+","+temperature+"℃,"+humidity+"%"); + } catch (Exception e) { +// e.printStackTrace(); + System.out.println("调用获取环境温湿度接口失败!"+ e); } - } + } }