干燥机配套车间生产管理系统/云平台服务端
zhuguifei
4 天以前 8870ea2ebf66b589c83f1d515faeec9bc4c6431e
实时故障添加租户、设备区分
已修改3个文件
91 ■■■■■ 文件已修改
jeecg-boot-base-core/src/main/java/org/jeecg/common/constant/MqttConstant.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
jeecg-boot-base-core/src/main/java/org/jeecg/common/util/DateUtils.java 42 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
jeecg-module-dry/jeecg-module-dry-biz/src/main/java/org/jeecg/modules/dry/service/impl/DryRealTimeDataServiceImpl.java 47 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
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对象
    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;
    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);
      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,27 +820,33 @@
        //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 -> {
                    DryFaultRecordVo vo = (DryFaultRecordVo) redFauMap.get(key);
                    vo.setECount(vo.getECount() + 1);
                    if (redisUtil.hget(String.format(MqttConstant.MQTT_REAL_FAULT, tenantId), key.toString()) != null) {
                        //更新次数
                        redisUtil.hset(String.format(MqttConstant.MQTT_REAL_FAULT, tenantId), key.toString(), vo);
                        System.err.println("报警次数更新,key-" + 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) {
                //更新次数
                redisUtil.hset(String.format(MqttConstant.MQTT_REAL_FAULT, tenantId), key.toString(), vo);
                System.err.println("报警次数更新,key-" + key);
            }
                    if (vo.getECount() >= 3) {
                        vo.setEndTime(new Date());
                        //TODO 结束超过某个时间区间判定为错误数据
                        faultRecordService.save(vo);
                        redisUtil.hdel(String.format(MqttConstant.MQTT_REAL_FAULT, tenantId), key);
                        result.add(vo);
                        System.err.println((faultType == 1 ? "类型:故障" : "类型:报警") + DateUtils.formatDateTime() + "存入数据库");
                    }
                });
            if (vo.getECount() >= 3) {
                vo.setEndTime(new Date());
                //TODO 结束超过某个时间区间判定为错误数据
                faultRecordService.save(vo);
                redisUtil.hdel(String.format(MqttConstant.MQTT_REAL_FAULT, tenantId), key);
                result.add(vo);
                System.err.println((faultType == 1 ? "类型:故障" : "类型:报警") + DateUtils.formatDateTime() + "存入数据库");
            }
        });
        return result;