jeecg-boot-base-core/src/main/java/org/jeecg/common/constant/MqttConstant.java
@@ -82,7 +82,7 @@ String TENANT_UP_PREFIX = "tenant/up"; String TENANT_UP_PREFIX_REALTIME_DATA = TENANT_UP_PREFIX + "/realTime/data"; String TENANT_UP_PREFIX_REALTIME_DATA_EQP = TENANT_UP_PREFIX + "/realTime/data/eqp/test"; String TENANT_UP_PREFIX_REALTIME_DATA_EQP = TENANT_UP_PREFIX + "/realTime/data/eqp"; String TENANT_UP_PREFIX_FAULT_DATA = TENANT_UP_PREFIX + "/fault/data"; String TENANT_UP_PREFIX_REAL_FAULT_DATA = TENANT_UP_PREFIX + "/real/fault/data"; jeecg-boot-base-core/src/main/java/org/jeecg/common/util/DateUtils.java
@@ -8,8 +8,12 @@ import java.text.DateFormat; import java.text.ParseException; import java.text.SimpleDateFormat; import java.time.Instant; import java.time.LocalDateTime; import java.time.ZoneOffset; import java.time.ZonedDateTime; import java.time.format.DateTimeFormatter; import java.time.format.DateTimeParseException; import java.util.Calendar; import java.util.Date; import java.util.GregorianCalendar; @@ -767,15 +771,35 @@ * @return */ public static String zone2Str(String st) { // 解析字符串为ZonedDateTime对象 try { // 尝试解析为时间戳(数字) if (st.matches("^\\d+$")) { long timestamp = Long.parseLong(st); // 假设时间戳是秒级,如果是毫秒级则不需要 *1000 Instant instant = Instant.ofEpochSecond(timestamp); return instant.atZone(ZoneOffset.ofHours(8)) .format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")); } // 尝试解析为常规日期时间格式 try { LocalDateTime localDateTime = LocalDateTime.parse(st, DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")); return localDateTime.atZone(ZoneOffset.ofHours(8)) .format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")); } catch (DateTimeParseException e) { // 不是常规格式,继续尝试ZonedDateTime的默认格式 } // 尝试解析为ZonedDateTime的默认格式 ZonedDateTime zonedDateTime = ZonedDateTime.parse(st); // 转换为中国标准时间(UTC+8) ZonedDateTime cstDateTime = zonedDateTime.withZoneSameInstant(java.time.ZoneOffset.ofHours(8)); // 定义想要的输出格式 DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); // 格式化为想要的字符串 String str = cstDateTime.format(formatter); return str; return zonedDateTime.withZoneSameInstant(ZoneOffset.ofHours(8)) .format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")); } catch (Exception e) { e.printStackTrace(); } return null; } /** jeecg-module-dry/jeecg-module-dry-biz/src/main/java/org/jeecg/modules/dry/service/impl/DryRealTimeDataServiceImpl.java
@@ -180,11 +180,12 @@ DryOrderVo orderVo = (DryOrderVo) redisUtil.hget(CacheConstants.RedisKeyEnum.WORK_ORDER.getCode(), realTimeDataParentVo.getTenantid() + "_" + realTimeDataParentVo.getMachineid()); // 1.2 如果有缓存记录 if (orderVo != null && orderVo.getCode().equals(realTimeDataParentVo.getWorkorder())) { if (orderVo != null && orderVo.getCode() != null && orderVo.getCode().equals(realTimeDataParentVo.getWorkorder())) { // 1.3 没有缓存记录再查询数据库 } else { // 根据租户id和工单号查询数据库是否有记录,有则返回,没有则新增一条再返回 realTimeDataVo.setWorkorder(realTimeDataParentVo.getWorkorder()); orderVo = getOrSaveDryOrderVoDB(realTimeDataVo); } if (orderVo == null) { @@ -819,10 +820,16 @@ //2检测已结束的故障 //2.1如果实时数据不存在redis存在则代表故障结束,存入数据库 Map<Object, Object> curFauMap = redisUtil.hmget(String.format(MqttConstant.MQTT_REAL_FAULT, tenantId)); curFauMap.keySet().stream() Map<Object, DryFaultRecordVo> collect = curFauMap.keySet().stream() .filter(key -> { String[] split = key.toString().split("_"); return split[0].equals(tenantId + "") && split[1].equals(machineId); }) //特别注意,多个报警类型共用方法需要区分类型 .filter(key -> !realFauMap.containsKey(key) && ((DryFaultRecordVo) curFauMap.get(key)).getFaultType() == faultType) .forEach(key -> { .filter(key -> !realFauMap.containsKey(key) && (Objects.equals(((DryFaultRecordVo) curFauMap.get(key)).getFaultType(), faultType))) .collect(Collectors.toMap(key -> key, // 保留原键 key -> (DryFaultRecordVo) curFauMap.get(key))); collect.keySet().forEach(key -> { DryFaultRecordVo vo = (DryFaultRecordVo) redFauMap.get(key); vo.setECount(vo.getECount() + 1); if (redisUtil.hget(String.format(MqttConstant.MQTT_REAL_FAULT, tenantId), key.toString()) != null) {