diff --git a/src/main/java/com/xujie/sys/common/utils/TaskUtils.java b/src/main/java/com/xujie/sys/common/utils/TaskUtils.java index f2f9068b..6c2a6b3f 100644 --- a/src/main/java/com/xujie/sys/common/utils/TaskUtils.java +++ b/src/main/java/com/xujie/sys/common/utils/TaskUtils.java @@ -59,5 +59,9 @@ public class TaskUtils { modbusCommunicateService.getInfoByModbus(); } + @Scheduled(cron = "${task.data.readPerSecond}") + public void readPerSecond(){ + modbusCommunicateService.readPerSecond(); + } } diff --git a/src/main/java/com/xujie/sys/modules/reader/service/ModbusCommunicateService.java b/src/main/java/com/xujie/sys/modules/reader/service/ModbusCommunicateService.java index 5a6f63b4..8fc27555 100644 --- a/src/main/java/com/xujie/sys/modules/reader/service/ModbusCommunicateService.java +++ b/src/main/java/com/xujie/sys/modules/reader/service/ModbusCommunicateService.java @@ -3,4 +3,7 @@ package com.xujie.sys.modules.reader.service; public interface ModbusCommunicateService { void getInfoByModbus(); + + void readPerSecond(); + } diff --git a/src/main/java/com/xujie/sys/modules/reader/service/impl/GetInformationForExcelServiceImpl.java b/src/main/java/com/xujie/sys/modules/reader/service/impl/GetInformationForExcelServiceImpl.java index 2a8d1881..cdfeb975 100644 --- a/src/main/java/com/xujie/sys/modules/reader/service/impl/GetInformationForExcelServiceImpl.java +++ b/src/main/java/com/xujie/sys/modules/reader/service/impl/GetInformationForExcelServiceImpl.java @@ -1,5 +1,6 @@ package com.xujie.sys.modules.reader.service.impl; +import cn.hutool.core.io.FileTypeUtil; import com.alibaba.excel.EasyExcel; import com.alibaba.excel.support.ExcelTypeEnum; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; @@ -19,11 +20,14 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import javax.imageio.ImageIO; import java.io.BufferedReader; import java.io.File; import java.io.FileReader; import java.io.IOException; +import java.net.URLConnection; import java.nio.file.Files; +import java.nio.file.Path; import java.util.*; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; @@ -80,6 +84,45 @@ public class GetInformationForExcelServiceImpl extends ServiceImpl> map = new HashMap<>(); + for (File file : files) { + String fileName = file.getName(); + int index = fileName.lastIndexOf("."); + String fileType = fileName.substring(index + 1); + if (!map.containsKey(fileType)){ + List list = new ArrayList<>(); + list.add(file); + map.put(fileType, list); + } else { + map.get(fileType).add(file); + } + } + for (String fileType : map.keySet()) { + if (!location.getSuffix().contains(fileType)){ + continue; + } + List fileList = map.get(fileType); + for (File file : fileList) { + //处理文件 + + // 拷贝文件 + + // 删除文件 + + } + } + } + private void saveInformation(EquipmentFolderLocation equipmentFolderLocation) throws Exception { String folderFiler = equipmentFolderLocation.getFolderPath(); //获取文件夹下所有文件 @@ -186,7 +229,17 @@ public class GetInformationForExcelServiceImpl extends ServiceImpl equipmentDataDetails = saveImage(list, equipmentFolderLocation, batchNo); - getInformationForExcelMapper.saveByExcels(equipmentDataDetails); + int count = 50; + for (int i = 0; i < equipmentDataDetails.size() / count; i++) { + List details = new ArrayList<>(); + for (int j = 0; j < count; j++) { + details.add(equipmentDataDetails.get(i*count+j)); + } + baseMapper.saveByExcels(details); + } + if (equipmentDataDetails.size() % count!= 0){ + baseMapper.saveByExcels(equipmentDataDetails.subList(equipmentDataDetails.size() - (equipmentDataDetails.size() % count), equipmentDataDetails.size())); + } for (String s : imageFiles) { int index = 1; // 创建源文件对象和目标文件夹对象 diff --git a/src/main/java/com/xujie/sys/modules/reader/service/impl/ModbusCommunicateServiceImpl.java b/src/main/java/com/xujie/sys/modules/reader/service/impl/ModbusCommunicateServiceImpl.java index 31536525..3d3eac7b 100644 --- a/src/main/java/com/xujie/sys/modules/reader/service/impl/ModbusCommunicateServiceImpl.java +++ b/src/main/java/com/xujie/sys/modules/reader/service/impl/ModbusCommunicateServiceImpl.java @@ -12,10 +12,9 @@ import com.ghgande.j2mod.modbus.procimg.SimpleRegister; import com.xujie.sys.modules.reader.dao.GetInformationForExcelMapper; import com.xujie.sys.modules.reader.entity.EquipmentDataDetail; import com.xujie.sys.modules.reader.entity.EquipmentFolderLocation; -import com.xujie.sys.modules.reader.service.EquipmentFolderLocationService; -import com.xujie.sys.modules.reader.service.EquipmentFolderSortService; -import com.xujie.sys.modules.reader.service.GetInformationForExcelService; -import com.xujie.sys.modules.reader.service.ModbusCommunicateService; +import com.xujie.sys.modules.reader.entity.EquipmentFolderSortEntity; +import com.xujie.sys.modules.reader.service.*; +import com.xujie.sys.modules.reader.util.CollectUtil; import com.xujie.sys.modules.report.dao.ProcedureDao; import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections.CollectionUtils; @@ -24,11 +23,14 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.util.StringUtils; +import javax.sound.sampled.Port; +import java.math.BigDecimal; import java.net.InetAddress; import java.nio.charset.StandardCharsets; import java.util.ArrayList; import java.util.Date; import java.util.List; +import java.util.Objects; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.TimeUnit; @@ -42,6 +44,8 @@ public class ModbusCommunicateServiceImpl implements ModbusCommunicateService { @Autowired private EquipmentFolderLocationService equipmentFolderLocationService; @Autowired + private EquipmentDataDetailService equipmentDataDetailService; + @Autowired private GetInformationForExcelService getInformationForExcelService; @Autowired @@ -55,31 +59,33 @@ public class ModbusCommunicateServiceImpl implements ModbusCommunicateService { public void getInfoByModbus() { log.info("modbus请求开始解析"); long startTime = System.nanoTime(); - EquipmentFolderLocation folderLocation = equipmentFolderLocationService.lambdaQuery().eq(EquipmentFolderLocation::getSuffix, "PLC").one(); - if (folderLocation == null) { + List list = equipmentFolderLocationService.lambdaQuery().eq(EquipmentFolderLocation::getSuffix, "PLC").list(); + if (list.isEmpty()){ log.error("设备消息未维护"); return; } - final String MODBUS_IP = folderLocation.getIp(); - if (StringUtils.isEmpty(MODBUS_IP) || "127.0.0.1".equals(MODBUS_IP)) { - return; - } - final int MODBUS_PORT = folderLocation.getPort(); - int registerAddress = folderLocation.getRegisterAddress(); - int registerNum = folderLocation.getRegisterNum(); - int unitId = folderLocation.getUnitId(); - int registerAddressInspection = folderLocation.getRegisterAddressInspection(); - int registerNumInspection = folderLocation.getRegisterNumInspection(); - //获取单号 - String inspectionOrderNumber = getInspectionOrderNumber(MODBUS_IP, MODBUS_PORT, registerAddressInspection, registerNumInspection, unitId).trim(); - if (StringUtils.isEmpty(inspectionOrderNumber)) {//判断是空或者是寄存器是零的话就返回 - return; - } + for (EquipmentFolderLocation folderLocation : list) { + //EquipmentFolderLocation folderLocation = equipmentFolderLocationService.lambdaQuery().eq(EquipmentFolderLocation::getSuffix, "PLC").one(); + final String MODBUS_IP = folderLocation.getIp(); + if (StringUtils.isEmpty(MODBUS_IP) || "127.0.0.1".equals(MODBUS_IP)) { + return; + } + final int MODBUS_PORT = folderLocation.getPort(); + int registerAddress = folderLocation.getRegisterAddress(); + int registerNum = folderLocation.getRegisterNum(); + int unitId = folderLocation.getUnitId(); + int registerAddressInspection = folderLocation.getRegisterAddressInspection(); + int registerNumInspection = folderLocation.getRegisterNumInspection(); + //获取单号 + String inspectionOrderNumber = getInspectionOrderNumber(MODBUS_IP, MODBUS_PORT, registerAddressInspection, registerNumInspection, unitId).trim(); + if (StringUtils.isEmpty(inspectionOrderNumber)) {//判断是空或者是寄存器是零的话就返回 + return; + } - //获取对应检验单号的值 - List> floatValues = getValue(MODBUS_IP, MODBUS_PORT, registerAddress, registerNum, unitId); + //获取对应检验单号的值 + List> floatValues = getValue(MODBUS_IP, MODBUS_PORT, registerAddress, registerNum, unitId); - //获取对应的batchNo + //获取对应的batchNo // LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); // wrapper.eq(EquipmentFolderSortEntity::getSite,folderLocation.getSite()); // wrapper.eq(EquipmentFolderSortEntity::getBuNo,folderLocation.getBuNo()); @@ -118,29 +124,107 @@ public class ModbusCommunicateServiceImpl implements ModbusCommunicateService { // } // } - int num = 1; - List detailList = new ArrayList<>(); - for (List aFloat : floatValues) { - for (Float aFloat1 : aFloat) { - EquipmentDataDetail equipmentDataDetail = new EquipmentDataDetail(); - equipmentDataDetail.setInspectionNo(inspectionOrderNumber); - equipmentDataDetail.setValue0(aFloat1.toString()); - equipmentDataDetail.setCreateDate(new Date()); - equipmentDataDetail.setSite(folderLocation.getSite()); - equipmentDataDetail.setEquipmentNo(folderLocation.getEquipmentNo()); - equipmentDataDetail.setBuNo(folderLocation.getBuNo()); - equipmentDataDetail.setBatchNo(1); - equipmentDataDetail.setNum(num); - detailList.add(equipmentDataDetail); - num++; + int num = 1; + List detailList = new ArrayList<>(); + for (List aFloat : floatValues) { + for (Float aFloat1 : aFloat) { + EquipmentDataDetail equipmentDataDetail = new EquipmentDataDetail(); + equipmentDataDetail.setInspectionNo(inspectionOrderNumber); + equipmentDataDetail.setValue0(aFloat1.toString()); + equipmentDataDetail.setCreateDate(new Date()); + equipmentDataDetail.setSite(folderLocation.getSite()); + equipmentDataDetail.setEquipmentNo(folderLocation.getEquipmentNo()); + equipmentDataDetail.setBuNo(folderLocation.getBuNo()); + equipmentDataDetail.setBatchNo(1); + equipmentDataDetail.setNum(num); + detailList.add(equipmentDataDetail); + num++; + } + } + long endTime = System.nanoTime(); + long elapsedTimeInNanos = endTime - startTime; + double elapsedTimeInSeconds = (double) elapsedTimeInNanos / 1_000_000_000.0; + log.info("总时间: {}", elapsedTimeInSeconds); + log.info("num: {}", num); + saveInformation(detailList); + } + } + + @Override + @Transactional + public void readPerSecond() { + List list = equipmentFolderLocationService.lambdaQuery().eq(EquipmentFolderLocation::getSuffix, "RS232/RS485").list(); + if (list.isEmpty()){ + log.info("没有维护RS232/RS485的设备信息"); + return; + } + for (EquipmentFolderLocation device : list) { + String IP = device.getIp();//IP + int PORT = device.getPort();//端口 + int unitId = device.getUnitId();// 从站ID + int ref = device.getRegisterAddress();// 开始地址 + int count = device.getRegisterNum();//数量 + int size = device.getRegisterAddressInspection();// 记录条数所在寄存器地址 + String type = device.getRegisterNumColumntype();// 类型 + + EquipmentFolderSortEntity sort = equipmentFolderSortService.lambdaQuery() + .eq(EquipmentFolderSortEntity::getSite, device.getSite()) + .eq(EquipmentFolderSortEntity::getBuNo, device.getBuNo()) + .eq(EquipmentFolderSortEntity::getFileNo, device.getFileNo()) + .one(); + log.info("IP:{},Port:{}",IP, PORT); + Integer value = CollectUtil.getValue(IP, PORT, unitId, size-1); + if (Objects.isNull(sort) || value == null) { + continue; + }else if (Integer.valueOf(sort.getBatchNo()).equals(value)){ + continue; + }else if (value.equals(0)){ + equipmentFolderSortService.lambdaUpdate() + .eq(EquipmentFolderSortEntity::getSite, device.getSite()) + .eq(EquipmentFolderSortEntity::getBuNo, device.getBuNo()) + .eq(EquipmentFolderSortEntity::getFileNo, device.getFileNo()) + .set(EquipmentFolderSortEntity::getBatchNo,value) + .update(); + continue; + } + List values = CollectUtil.getValues(IP, PORT, unitId, ref-1, count); + List details = new ArrayList<>(); + Date createDate = new Date(); + if ("float".equals(type) && count % 2 == 0){ + for (int i = 0; i < values.size(); i+=2) { + EquipmentDataDetail detail = new EquipmentDataDetail(); + detail.setSite(device.getSite()); + detail.setBuNo(device.getBuNo()); + detail.setFileNo(device.getFileNo()); + detail.setValue0(values.get(i)+"."+values.get(i+1)); + detail.setNum(value); + detail.setCreateDate(createDate); + detail.setEquipmentNo(device.getEquipmentNo()); + details.add(detail); + } + }else if ("int".equals(type)){ + for (int i = 0; i < values.size(); i++) { + EquipmentDataDetail detail = new EquipmentDataDetail(); + detail.setSite(device.getSite()); + detail.setBuNo(device.getBuNo()); + detail.setFileNo(device.getFileNo()); + detail.setValue0(values.get(i).toString()); + detail.setNum(value); + detail.setCreateDate(createDate); + detail.setEquipmentNo(device.getEquipmentNo()); + details.add(detail); + } + } + for (EquipmentDataDetail detail : details) { + equipmentDataDetailService.save(detail); } + equipmentFolderSortService.lambdaUpdate() + .eq(EquipmentFolderSortEntity::getSite, device.getSite()) + .eq(EquipmentFolderSortEntity::getBuNo, device.getBuNo()) + .eq(EquipmentFolderSortEntity::getFileNo, device.getFileNo()) + .set(EquipmentFolderSortEntity::getBatchNo,value) + .update(); } - long endTime = System.nanoTime(); - long elapsedTimeInNanos = endTime - startTime; - double elapsedTimeInSeconds = (double) elapsedTimeInNanos / 1_000_000_000.0; - log.info("总时间: {}", elapsedTimeInSeconds); - log.info("num: {}", num); - saveInformation(detailList); } //应为modbus 寄存器每次最大请求一百多个 这里一次连接多次分多次请求 diff --git a/src/main/java/com/xujie/sys/modules/reader/util/CollectUtil.java b/src/main/java/com/xujie/sys/modules/reader/util/CollectUtil.java new file mode 100644 index 00000000..46550607 --- /dev/null +++ b/src/main/java/com/xujie/sys/modules/reader/util/CollectUtil.java @@ -0,0 +1,43 @@ +package com.xujie.sys.modules.reader.util; + +import com.ghgande.j2mod.modbus.ModbusException; +import com.ghgande.j2mod.modbus.facade.ModbusTCPMaster; +import com.ghgande.j2mod.modbus.procimg.Register; +import lombok.extern.slf4j.Slf4j; + +import java.math.BigDecimal; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; + +@Slf4j +public class CollectUtil { + public static Integer getValue(String IP, int port,int unitId,int ref){ + ModbusTCPMaster master = new ModbusTCPMaster(IP, port); + try { + master.connect(); + Register[] read = master.readMultipleRegisters(unitId,ref,1); + return read[0].getValue(); + } catch (Exception e) { + log.error("连接失败", e); + }finally { + master.disconnect(); + } + return null; + } + + public static List getValues(String IP, int port,int unitId,int ref,int count){ + ModbusTCPMaster master = new ModbusTCPMaster(IP, port); + try { + master.connect(); + Register[] read = master.readMultipleRegisters(unitId,ref,count); + return Arrays.stream(read).map(Register::getValue).collect(Collectors.toList()); + } catch (Exception e) { + log.error("连接失败", e); + }finally { + master.disconnect(); + } + return new ArrayList<>(); + } +} diff --git a/src/main/resources/application-dev.yml b/src/main/resources/application-dev.yml index 8ba1078b..4f7b59f7 100644 --- a/src/main/resources/application-dev.yml +++ b/src/main/resources/application-dev.yml @@ -46,6 +46,7 @@ task: eamWorkPlanTime: 0 0 0 * * ? #点检、维保计划自动生成,每天0点执行 getExcelInformation: 0/30 * * * * ? #每三十秒读取一次文件 modbusCommunicate: 0/30 * * * * ? #获取modbus数据 + readPerSecond: 0 0/1 * * * ? #每分钟执行一次 #发送邮件,每天中午12点执行一次 # sendEmail: 0 0 12 * * ? # sendEmail: 0 0/1 * * * ? #每分钟执行一次