diff --git a/threecolor-modbus-collector/src/main/java/com/xujie/modbus/mapper/SfdcTimeHistMapper.java b/threecolor-modbus-collector/src/main/java/com/xujie/modbus/mapper/SfdcTimeHistMapper.java index f81475b..33db3ab 100644 --- a/threecolor-modbus-collector/src/main/java/com/xujie/modbus/mapper/SfdcTimeHistMapper.java +++ b/threecolor-modbus-collector/src/main/java/com/xujie/modbus/mapper/SfdcTimeHistMapper.java @@ -10,4 +10,6 @@ import org.apache.ibatis.annotations.Param; public interface SfdcTimeHistMapper extends BaseMapper { int updatesfdcTimeHistById(@Param("sfdcTimeHist") SfdcTimeHist sfdcTimeHist); + SfdcTimeHist selectSfdcTimeHistByNew(@Param("site") String site, @Param("seqNo") String seqNo, @Param("createdBy") String createdBy); + } diff --git a/threecolor-modbus-collector/src/main/java/com/xujie/modbus/service/impl/ModbusCollectServiceImpl.java b/threecolor-modbus-collector/src/main/java/com/xujie/modbus/service/impl/ModbusCollectServiceImpl.java index fe3dc42..d92be8f 100644 --- a/threecolor-modbus-collector/src/main/java/com/xujie/modbus/service/impl/ModbusCollectServiceImpl.java +++ b/threecolor-modbus-collector/src/main/java/com/xujie/modbus/service/impl/ModbusCollectServiceImpl.java @@ -26,7 +26,7 @@ import java.util.stream.Collectors; /** * Modbus采集服务实现类 - * + * * @author xujie */ @Service @@ -54,55 +54,55 @@ public class ModbusCollectServiceImpl public void handleSignal(DeviceInfo deviceInfo) { String ip = deviceInfo.getIp(); int port = deviceInfo.getPort() != null ? deviceInfo.getPort() : 502; - + // 计算最大线圈数 int maxCoil = getMaxCoil(deviceInfo); - logger.info("设备信息: {}, IP: {}, Port: {}, 最大线圈数: {}", + logger.info("设备信息: {}, IP: {}, Port: {}, 最大线圈数: {}", deviceInfo.getDeviceName(), ip, port, maxCoil); - + // 读取线圈状态 BitVector coils = ModbusUtil.readCoils(ip, port, 0, maxCoil); if (coils == null) { logger.warn("读取线圈失败 - 设备: {}", deviceInfo.getDeviceName()); return; } - + logger.info("线圈信息: {}", coils); - + // 读取卷A分切信号 int bit1 = 0; if (deviceInfo.getRollSignalAddress1() != null && deviceInfo.getRollSignalAddress1() > 0) { bit1 = coils.getBit(deviceInfo.getRollSignalAddress1() - 1) ? 1 : 0; logger.info("卷A分切信号: {}", bit1); } - + // 读取卷B分切信号 int bit2 = 0; if (deviceInfo.getRollSignalAddress2() != null && deviceInfo.getRollSignalAddress2() > 0) { bit2 = coils.getBit(deviceInfo.getRollSignalAddress2() - 1) ? 1 : 0; logger.info("卷B分切信号: {}", bit2); } - + String nextRollNo = ""; - + // 如果卷A有信号,读取卷A信息 if (bit1 == 1 && deviceInfo.getRollAddress1() != null && deviceInfo.getRollQty1() != null) { List registerData = getRegisterData(deviceInfo); - List roll1 = subAddressValue(deviceInfo.getRollAddress1(), + List roll1 = subAddressValue(deviceInfo.getRollAddress1(), deviceInfo.getRollQty1() - 1, registerData); nextRollNo = convertHexToString(roll1).trim(); logger.info("卷A: {}", nextRollNo); } - + // 如果卷B有信号,读取卷B信息 if (bit2 == 1 && deviceInfo.getRollAddress2() != null && deviceInfo.getRollQty2() != null) { List registerData = getRegisterData(deviceInfo); - List roll2 = subAddressValue(deviceInfo.getRollAddress2(), + List roll2 = subAddressValue(deviceInfo.getRollAddress2(), deviceInfo.getRollQty2() - 1, registerData); nextRollNo = convertHexToString(roll2).trim(); logger.info("卷B: {}", nextRollNo); } - + // 如果存在信号,保存采集数据 if (bit1 == 1 || bit2 == 1) { String rollNo = (String) redisTemplate.opsForValue().get("device:" + ip); @@ -114,32 +114,32 @@ public class ModbusCollectServiceImpl public void handleData(DeviceInfo deviceInfo) { String ip = deviceInfo.getIp(); int port = deviceInfo.getPort() != null ? deviceInfo.getPort() : 502; - + // 读取寄存器数据 List registerData = getRegisterData(deviceInfo); if (registerData.isEmpty()) { logger.warn("读取寄存器数据失败 - 设备: {}", deviceInfo.getDeviceName()); return; } - + // 读取总数 Integer totalQty = null; if (deviceInfo.getTotalQtyAddress() != null && deviceInfo.getTotalQtyAddress() > 0) { totalQty = subAddressValue(deviceInfo.getTotalQtyAddress(), 1, registerData).get(0); logger.info("总数: {}", totalQty); } - + // 读取小卷分切不良数量 List multipleRollsList = new ArrayList<>(); if (deviceInfo.getMultipleRollsAddress() != null && deviceInfo.getMultipleRollsQty() != null) { - List multipleRolls = subAddressValue(deviceInfo.getMultipleRollsAddress(), + List multipleRolls = subAddressValue(deviceInfo.getMultipleRollsAddress(), deviceInfo.getMultipleRollsQty(), registerData); multipleRollsList = multipleRolls.stream() .map(BigDecimal::new) .collect(Collectors.toList()); logger.info("小卷分切不良数量: {}", multipleRollsList); } - + // 从Redis获取上次的数据 Integer preQty = (Integer) redisTemplate.opsForValue().get("deviceQty:" + ip); List preMultipleRollsIntegerList = (List) redisTemplate.opsForValue() @@ -150,21 +150,21 @@ public class ModbusCollectServiceImpl .map(BigDecimal::new) .collect(Collectors.toList()); } - + int preTotalQty = preQty != null ? preQty : 0; - + // 判断是否发生小卷分切(总数归零) if (totalQty != null && preTotalQty > totalQty) { if (preMultipleRollsList.isEmpty()) { preMultipleRollsList = new ArrayList<>(Collections.nCopies( multipleRollsList.size(), BigDecimal.ZERO)); } - logger.info("检测到小卷分切 - 设备: {}, 上次总数: {}, 当前总数: {}", + logger.info("检测到小卷分切 - 设备: {}, 上次总数: {}, 当前总数: {}", deviceInfo.getDeviceName(), preTotalQty, totalQty); - + // 保存小卷分切数据 } - + // 更新Redis缓存 if (totalQty != null) { redisTemplate.opsForValue().set("deviceQty:" + ip, totalQty); @@ -234,90 +234,137 @@ public class ModbusCollectServiceImpl System.out.println("寄存器数据:"+ registerData); logger.info("寄存器数据: {}", registerData); - //site+equipmentNo查询前5分钟,如果5条都是0,0,1,就往sfdc_time_hist插入数据,先要确认中间表有工单号 + //site+equipmentNo查询前failureTime分钟,如果failureTime条都是0,0,1,就往sfdc_time_hist插入数据,先要确认中间表有工单号 List colorLampLisByTime = threeColorLampMapper.getThreeColorLampLisByTime(folderLocation.getSite(), folderLocation.getResourceId(), failureTime); QueryWrapper queryWrapper = new QueryWrapper<>(); queryWrapper.eq("site", folderLocation.getSite()); queryWrapper.eq("resource_id", folderLocation.getResourceId()); + queryWrapper.isNotNull("seq_no"); List resourceScheduleds = resourceScheduledMapper.selectList(queryWrapper); if (resourceScheduleds != null && resourceScheduleds.size()>0){ for(ResourceScheduled resourceScheduled:resourceScheduleds){ - Map map = new HashMap<>(); - for (ThreeColorLamp lamp1 : colorLampLisByTime) { - String key = lamp1.getGreen() + "," + lamp1.getOrange() + "," + lamp1.getRed(); - map.put(key, map.getOrDefault(key, 0) + 1); - } - - boolean hasDuplicateFlag = true; - for (int i = 0; i < colorLampLisByTime.size(); i++) { - ThreeColorLamp lamp2 = colorLampLisByTime.get(i); - String key = lamp2.getGreen() + "," + lamp2.getOrange() + "," + lamp2.getRed(); - boolean hasDuplicate = map.get(key) > 1; - if (!hasDuplicate) { - hasDuplicateFlag = false ; - break; - } - } - - if (hasDuplicateFlag){ - boolean red = false; - for (ThreeColorLamp lamp3 : colorLampLisByTime) { - red = ("0".equals(lamp3.getGreen())) && - ("0".equals(lamp3.getOrange()))&& - ("1".equals(lamp3.getRed())); - if (!red){ - break; + // site+equipmentNo 查询前 failureTime 分钟,如果 **failureTime 条记录全部为 0,0,1**,才插入 sfdc_time_hist + boolean shouldInsertHist = false; + if (colorLampLisByTime != null && colorLampLisByTime.size() >= failureTime) { + // 只取最近 failureTime 条记录做判断 + int size = colorLampLisByTime.size(); + List lastN = colorLampLisByTime.subList(size - failureTime, size); + // 要求条数刚好为 failureTime,且每条都是 0,0,1 + if (lastN.size() == failureTime) { + shouldInsertHist = true; + for (ThreeColorLamp lamp3 : lastN) { + boolean isRed = ("0".equals(lamp3.getGreen())) && + ("0".equals(lamp3.getOrange())) && + ("1".equals(lamp3.getRed())); + if (!isRed) { + shouldInsertHist = false; + break; + } } } + } - if (red){ + if (shouldInsertHist){ if(!"X".equals(resourceScheduled.getIssend())){ - SoscheduledroutingVo soscheduled = threeColorLampMapper.getSoscheduled(resourceScheduled.getSeqNo()); - int histSeqno = threeColorLampMapper.selectHistSeqno(folderLocation.getSite(), resourceScheduled.getSeqNo()); - SfdcTimeHist sfdcTimeHist = new SfdcTimeHist(); - sfdcTimeHist.setSite(folderLocation.getSite()); - sfdcTimeHist.setOrderNo(soscheduled.getOrderno()); - sfdcTimeHist.setItemNo(Double.valueOf(soscheduled.getItemno())); - sfdcTimeHist.setSeqNo(soscheduled.getSeqno()); - sfdcTimeHist.setHistSeqno(histSeqno+1); - Date currentTime = new Date(); - Date fiveMinutesAgo = new Date(currentTime.getTime() - failureTime * 60 * 1000); - sfdcTimeHist.setEventTime(fiveMinutesAgo); - sfdcTimeHist.setEnteredBy(null); - sfdcTimeHist.setEventDesc(null); - sfdcTimeHist.setDowntimeCode(null); - sfdcTimeHist.setEventType("D"); - sfdcTimeHist.setLinkhistSeqno(null); - sfdcTimeHist.setTillenteredBy(null); - sfdcTimeHist.setCompletedFlag("N"); - if("T".equals(resourceScheduled.getStatus())){ - sfdcTimeHist.setDowntimePhasein("调机"); + SfdcTimeHist timeHist = sfdcTimeHistMapper.selectSfdcTimeHistByNew(folderLocation.getSite(), resourceScheduled.getSeqNo(), "自动停机"); + if(timeHist == null){ + SoscheduledroutingVo soscheduled = threeColorLampMapper.getSoscheduled(resourceScheduled.getSeqNo()); + int histSeqno = threeColorLampMapper.selectHistSeqno(folderLocation.getSite(), resourceScheduled.getSeqNo()); + SfdcTimeHist sfdcTimeHist = new SfdcTimeHist(); + sfdcTimeHist.setSite(folderLocation.getSite()); + sfdcTimeHist.setOrderNo(soscheduled.getOrderno()); + sfdcTimeHist.setItemNo(Double.valueOf(soscheduled.getItemno())); + sfdcTimeHist.setSeqNo(soscheduled.getSeqno()); + sfdcTimeHist.setHistSeqno(histSeqno+1); + Date currentTime = new Date(); + Date fiveMinutesAgo = new Date(currentTime.getTime() - failureTime * 60 * 1000); + sfdcTimeHist.setEventTime(fiveMinutesAgo); + sfdcTimeHist.setEnteredBy(null); + sfdcTimeHist.setEventDesc(null); + sfdcTimeHist.setDowntimeCode(null); + sfdcTimeHist.setEventType("D"); + sfdcTimeHist.setLinkhistSeqno(null); + sfdcTimeHist.setTillenteredBy(null); + sfdcTimeHist.setCompletedFlag("N"); + if("T".equals(resourceScheduled.getStatus())){ + sfdcTimeHist.setDowntimePhasein("调机"); + }else{ + sfdcTimeHist.setDowntimePhasein("生产"); + } + + sfdcTimeHist.setRollNo(soscheduled.getRollNo()); + sfdcTimeHist.setCreatedDate(new Date()); + sfdcTimeHist.setCreatedBy("自动停机"); + sfdcTimeHist.setUpdatedDate(new Date()); + sfdcTimeHist.setDelflag("N"); + sfdcTimeHist.setVersion(1); + sfdcTimeHist.setReplaceFlag("0"); + sfdcTimeHist.setBatchNo(null); + sfdcTimeHist.setRemark(null); + sfdcTimeHistMapper.insert(sfdcTimeHist); + logger.info("停机红灯插入数据: {}", sfdcTimeHist); + + UpdateWrapper updateWrapper = new UpdateWrapper<>(); + updateWrapper.eq("site", folderLocation.getSite()); + updateWrapper.eq("resource_id", folderLocation.getResourceId()); + updateWrapper.eq("seq_no", resourceScheduled.getSeqNo()); + updateWrapper.set("issend", "X"); + updateWrapper.set("sfdcid",sfdcTimeHist.getId()); + resourceScheduledMapper.update(updateWrapper); + logger.info("更新了中间表,变为X,sfdcid:{}",sfdcTimeHist.getId()); }else{ - sfdcTimeHist.setDowntimePhasein("生产"); + if( "Y".equals(timeHist.getCompletedFlag())){ + SoscheduledroutingVo soscheduled = threeColorLampMapper.getSoscheduled(resourceScheduled.getSeqNo()); + int histSeqno = threeColorLampMapper.selectHistSeqno(folderLocation.getSite(), resourceScheduled.getSeqNo()); + SfdcTimeHist sfdcTimeHist = new SfdcTimeHist(); + sfdcTimeHist.setSite(folderLocation.getSite()); + sfdcTimeHist.setOrderNo(soscheduled.getOrderno()); + sfdcTimeHist.setItemNo(Double.valueOf(soscheduled.getItemno())); + sfdcTimeHist.setSeqNo(soscheduled.getSeqno()); + sfdcTimeHist.setHistSeqno(histSeqno+1); + Date currentTime = new Date(); + Date fiveMinutesAgo = new Date(currentTime.getTime() - failureTime * 60 * 1000); + sfdcTimeHist.setEventTime(fiveMinutesAgo); + sfdcTimeHist.setEnteredBy(null); + sfdcTimeHist.setEventDesc(null); + sfdcTimeHist.setDowntimeCode(null); + sfdcTimeHist.setEventType("D"); + sfdcTimeHist.setLinkhistSeqno(null); + sfdcTimeHist.setTillenteredBy(null); + sfdcTimeHist.setCompletedFlag("N"); + if("T".equals(resourceScheduled.getStatus())){ + sfdcTimeHist.setDowntimePhasein("调机"); + }else{ + sfdcTimeHist.setDowntimePhasein("生产"); + } + + sfdcTimeHist.setRollNo(soscheduled.getRollNo()); + sfdcTimeHist.setCreatedDate(new Date()); + sfdcTimeHist.setCreatedBy("自动停机"); + sfdcTimeHist.setUpdatedDate(new Date()); + sfdcTimeHist.setDelflag("N"); + sfdcTimeHist.setVersion(1); + sfdcTimeHist.setReplaceFlag("0"); + sfdcTimeHist.setBatchNo(null); + sfdcTimeHist.setRemark(null); + sfdcTimeHistMapper.insert(sfdcTimeHist); + logger.info("停机红灯插入数据: {}", sfdcTimeHist); + + UpdateWrapper updateWrapper = new UpdateWrapper<>(); + updateWrapper.eq("site", folderLocation.getSite()); + updateWrapper.eq("resource_id", folderLocation.getResourceId()); + updateWrapper.eq("seq_no", resourceScheduled.getSeqNo()); + updateWrapper.set("issend", "X"); + updateWrapper.set("sfdcid",sfdcTimeHist.getId()); + resourceScheduledMapper.update(updateWrapper); + logger.info("更新了中间表,变为X,sfdcid:{}",sfdcTimeHist.getId()); + } } - sfdcTimeHist.setRollNo(soscheduled.getRollNo()); - sfdcTimeHist.setCreatedDate(new Date()); - sfdcTimeHist.setCreatedBy("自动停机"); - sfdcTimeHist.setUpdatedDate(new Date()); - sfdcTimeHist.setDelflag("N"); - sfdcTimeHist.setVersion(1); - sfdcTimeHist.setReplaceFlag("0"); - sfdcTimeHist.setBatchNo(null); - sfdcTimeHist.setRemark(null); - sfdcTimeHistMapper.insert(sfdcTimeHist); - - UpdateWrapper updateWrapper = new UpdateWrapper<>(); - updateWrapper.eq("site", folderLocation.getSite()); - updateWrapper.eq("resource_id", folderLocation.getResourceId()); - updateWrapper.eq("seq_no", resourceScheduled.getSeqNo()); - updateWrapper.set("issend", "X"); - updateWrapper.set("sfdcid",sfdcTimeHist.getId()); - resourceScheduledMapper.update(updateWrapper); } - } - }else{ + }else{ + // 不满足连续 failureTime 条 0,0,1 的条件时,保持原有行为:将中间表发送状态置为 Y UpdateWrapper updateWrapper = new UpdateWrapper<>(); updateWrapper.eq("site", folderLocation.getSite()); updateWrapper.eq("resource_id", folderLocation.getResourceId()); @@ -326,6 +373,7 @@ public class ModbusCollectServiceImpl resourceScheduledMapper.update(updateWrapper); } + } }else{ @@ -368,8 +416,13 @@ public class ModbusCollectServiceImpl String nowlamp = registerData.get(0)+"" + registerData.get(1) + ""+registerData.get(2); downlog.setLamp(nowlamp); threeColorLampDownlogMapper.insert(downlog); + logger.info("获取数据不同后统计插入数据: {}", downlog); + logger.info("获取到的亮灯: {}", 1 == registerData.get(0) && 0 == registerData.get(1) && 0 == registerData.get(2)); if(1 == registerData.get(0) && 0 == registerData.get(1) && 0 == registerData.get(2)){ - if(StringUtils.isNotBlank(resourceScheduled.getIssend()) && resourceScheduled.getSfdcid() != null){ + + ResourceScheduled updateResourceScheduled = resourceScheduledMapper.selectById(resourceScheduled.getId()); + logger.info("正常中间表发送状态{},sfdcid{}", resourceScheduled.getIssend(),resourceScheduled.getSfdcid()); + if(StringUtils.isNotBlank(resourceScheduled.getIssend()) && updateResourceScheduled.getSfdcid() != null){ SfdcTimeHist sfdcTimeHist = new SfdcTimeHist(); sfdcTimeHist.setId(resourceScheduled.getSfdcid()); sfdcTimeHist.setSite(folderLocation.getSite()); @@ -377,6 +430,7 @@ public class ModbusCollectServiceImpl sfdcTimeHist.setTillenteredTime(new Date()); sfdcTimeHist.setCompletedFlag("Y"); sfdcTimeHistMapper.updatesfdcTimeHistById(sfdcTimeHist); + logger.info("更新了sfdc表,变为Y,id:{}",resourceScheduled.getSfdcid()); UpdateWrapper updateWrapper = new UpdateWrapper<>(); updateWrapper.eq("site", folderLocation.getSite()); @@ -385,6 +439,7 @@ public class ModbusCollectServiceImpl updateWrapper.set("issend", null); updateWrapper.set("sfdcid",null); resourceScheduledMapper.update(updateWrapper); + logger.info("更新了中间表,变为null,id:{}",resourceScheduled.getId()); } } }else{ @@ -432,6 +487,7 @@ public class ModbusCollectServiceImpl ThreeColorLampDownlog downlog = new ThreeColorLampDownlog(); downlog.setSite(folderLocation.getSite()); + downlog.setResourceId(folderLocation.getResourceId()); downlog.setEventDesc("计划停机"); downlog.setStartDate(new Date()); downlog.setCreateDate(new Date()); @@ -442,6 +498,7 @@ public class ModbusCollectServiceImpl if(downlogChangeLast == null){ ThreeColorLampDownlog downlog = new ThreeColorLampDownlog(); downlog.setSite(folderLocation.getSite()); + downlog.setResourceId(folderLocation.getResourceId()); downlog.setEventDesc("计划停机"); downlog.setStartDate(new Date()); downlog.setCreateDate(new Date()); @@ -478,10 +535,10 @@ public class ModbusCollectServiceImpl private List getRegisterData(DeviceInfo deviceInfo) { String ip = deviceInfo.getIp(); int port = deviceInfo.getPort() != null ? deviceInfo.getPort() : 502; - + int maxAddress = getMaxAddress(deviceInfo); logger.info("获取寄存器数据从 1 ~ {}", maxAddress); - + return ModbusUtil.readRegistersBatch(ip, port, 0, maxAddress); } @@ -507,7 +564,7 @@ public class ModbusCollectServiceImpl */ private int getMaxAddress(DeviceInfo deviceInfo) { int maxAddress = 0; - + if (deviceInfo.getRollAddress1() != null && deviceInfo.getRollQty1() != null) { maxAddress = deviceInfo.getRollAddress1() + deviceInfo.getRollQty1(); } @@ -526,7 +583,7 @@ public class ModbusCollectServiceImpl maxAddress = address; } } - + return maxAddress == 0 ? 1 : maxAddress; } diff --git a/threecolor-modbus-collector/src/main/resources/dao/SfdcTimeHistMapper.xml b/threecolor-modbus-collector/src/main/resources/dao/SfdcTimeHistMapper.xml index 9a4a8fb..c5821e8 100644 --- a/threecolor-modbus-collector/src/main/resources/dao/SfdcTimeHistMapper.xml +++ b/threecolor-modbus-collector/src/main/resources/dao/SfdcTimeHistMapper.xml @@ -6,4 +6,7 @@ UPDATE sfdc_time_hist SET till_time = #{sfdcTimeHist.tillTime}, tillentered_time = #{sfdcTimeHist.tillenteredTime}, completed_flag = #{sfdcTimeHist.completedFlag},total_time = DATEDIFF(MINUTE, event_time, #{sfdcTimeHist.tillTime}) WHERE id = #{sfdcTimeHist.id}; + \ No newline at end of file