Bladeren bron

设备故障监控

tanbin 1 jaar geleden
bovenliggende
commit
1ecef0448d
25 gewijzigde bestanden met toevoegingen van 1152 en 7 verwijderingen
  1. 19 0
      device-api-cloud/src/main/java/com/xy/feign/DeviceFaultInfoFeign.java
  2. 19 0
      device-api-cloud/src/main/java/com/xy/feign/DeviceFaultLogFeign.java
  3. 19 0
      device-api-cloud/src/main/java/com/xy/feign/DeviceFaultMonitorConfigFeign.java
  4. 69 0
      device-api-service/src/main/java/com/xy/entity/DeviceFaultInfo.java
  5. 56 0
      device-api-service/src/main/java/com/xy/entity/DeviceFaultLog.java
  6. 63 0
      device-api-service/src/main/java/com/xy/entity/DeviceFaultMonitorConfig.java
  7. 58 0
      device-api-service/src/main/java/com/xy/job/DeviceFaultJob.java
  8. 16 0
      device-api-service/src/main/java/com/xy/mapper/DeviceFaultInfoMapper.java
  9. 16 0
      device-api-service/src/main/java/com/xy/mapper/DeviceFaultLogMapper.java
  10. 16 0
      device-api-service/src/main/java/com/xy/mapper/DeviceFaultMonitorConfigMapper.java
  11. 20 0
      device-api-service/src/main/java/com/xy/mapper/mapper/DeviceFaultInfoMapper.xml
  12. 16 0
      device-api-service/src/main/java/com/xy/mapper/mapper/DeviceFaultLogMapper.xml
  13. 15 0
      device-api-service/src/main/java/com/xy/mapper/mapper/DeviceFaultMonitorConfigMapper.xml
  14. 139 0
      device-api-service/src/main/java/com/xy/service/DeviceFaultInfoServiceImpl.java
  15. 84 0
      device-api-service/src/main/java/com/xy/service/DeviceFaultLogServiceImpl.java
  16. 85 0
      device-api-service/src/main/java/com/xy/service/DeviceFaultMonitorConfigServiceImpl.java
  17. 96 7
      device-api-service/src/main/java/com/xy/service/DeviceMqttConsumerImpl.java
  18. 16 0
      device-api-service/src/main/java/com/xy/service/factory/device/impl/open/OpenDeviceFactoryImpl.java
  19. 102 0
      device-api/src/main/java/com/xy/dto/DeviceFaultInfoDto.java
  20. 92 0
      device-api/src/main/java/com/xy/dto/DeviceFaultLogDto.java
  21. 84 0
      device-api/src/main/java/com/xy/dto/DeviceFaultMonitorConfigDto.java
  22. 16 0
      device-api/src/main/java/com/xy/service/DeviceFaultInfoService.java
  23. 16 0
      device-api/src/main/java/com/xy/service/DeviceFaultLogService.java
  24. 16 0
      device-api/src/main/java/com/xy/service/DeviceFaultMonitorConfigService.java
  25. 4 0
      device-api/src/main/java/com/xy/service/DeviceMqttConsumer.java

+ 19 - 0
device-api-cloud/src/main/java/com/xy/feign/DeviceFaultInfoFeign.java

@@ -0,0 +1,19 @@
+package com.xy.feign;
+
+import com.xy.service.DeviceFaultInfoService;
+import com.xy.FeignInterceptor;
+import com.xy.consts.ServiceConsts;
+import org.springframework.cloud.openfeign.FeignClient;
+
+/**
+ * <p>
+ * 设备故障信息 feign
+ * </p>
+ *
+ * @author 谭斌
+ * @since 2024-01-08
+ */
+@FeignClient(value = ServiceConsts.SERVICE_NAME, configuration = FeignInterceptor.class)
+public interface DeviceFaultInfoFeign extends DeviceFaultInfoService {
+
+}

+ 19 - 0
device-api-cloud/src/main/java/com/xy/feign/DeviceFaultLogFeign.java

@@ -0,0 +1,19 @@
+package com.xy.feign;
+
+import com.xy.service.DeviceFaultLogService;
+import com.xy.FeignInterceptor;
+import com.xy.consts.ServiceConsts;
+import org.springframework.cloud.openfeign.FeignClient;
+
+/**
+ * <p>
+ * 设备故障日志 feign
+ * </p>
+ *
+ * @author 谭斌
+ * @since 2024-01-08
+ */
+@FeignClient(value = ServiceConsts.SERVICE_NAME, configuration = FeignInterceptor.class)
+public interface DeviceFaultLogFeign extends DeviceFaultLogService {
+
+}

+ 19 - 0
device-api-cloud/src/main/java/com/xy/feign/DeviceFaultMonitorConfigFeign.java

@@ -0,0 +1,19 @@
+package com.xy.feign;
+
+import com.xy.service.DeviceFaultMonitorConfigService;
+import com.xy.FeignInterceptor;
+import com.xy.consts.ServiceConsts;
+import org.springframework.cloud.openfeign.FeignClient;
+
+/**
+ * <p>
+ * 设备故障监控配置 feign
+ * </p>
+ *
+ * @author 谭斌
+ * @since 2024-01-08
+ */
+@FeignClient(value = ServiceConsts.SERVICE_NAME, configuration = FeignInterceptor.class)
+public interface DeviceFaultMonitorConfigFeign extends DeviceFaultMonitorConfigService {
+
+}

+ 69 - 0
device-api-service/src/main/java/com/xy/entity/DeviceFaultInfo.java

@@ -0,0 +1,69 @@
+package com.xy.entity;
+
+import com.baomidou.mybatisplus.annotation.FieldFill;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+import java.io.Serializable;
+import java.time.LocalDateTime;
+
+/**
+ * <p>
+ * 设备故障信息
+ * </p>
+ *
+ * @author 谭斌
+ * @since 2024-01-08
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@ApiModel(value = "DeviceFaultInfo对象", description = "设备故障信息")
+public class DeviceFaultInfo implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty(value = "ID")
+    @TableId(value = "fault_id", type = IdType.ASSIGN_ID)
+    private Long faultId;
+
+    @ApiModelProperty(value = "商户ID")
+    private Long mercId;
+
+    @ApiModelProperty(value = "设备编号")
+    private Long deviceId;
+
+    @ApiModelProperty(value = "故障描述")
+    private String describe;
+
+    @ApiModelProperty(value = "事件编码")
+    private String eventCode;
+
+    @ApiModelProperty(value = "是否已解决")
+    private Boolean state;
+
+    @ApiModelProperty(value = "创建时间")
+    @TableField(fill = FieldFill.INSERT)
+    private LocalDateTime createTime;
+
+    @ApiModelProperty(value = "更新时间")
+    @TableField(fill = FieldFill.UPDATE)
+    private LocalDateTime updateTime;
+
+    @ApiModelProperty(value = "标记解决时间")
+    private LocalDateTime resolveTime;
+
+    @ApiModelProperty(value = "事件发生次数")
+    private Integer eventNum;
+
+    @ApiModelProperty(value = "故障级别-字典:device_fault_level")
+    private Integer faultLevel;
+
+
+}

+ 56 - 0
device-api-service/src/main/java/com/xy/entity/DeviceFaultLog.java

@@ -0,0 +1,56 @@
+package com.xy.entity;
+
+import com.baomidou.mybatisplus.annotation.*;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+import java.io.Serializable;
+import java.time.LocalDateTime;
+
+/**
+ * <p>
+ * 设备故障日志
+ * </p>
+ *
+ * @author 谭斌
+ * @since 2024-01-08
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@ApiModel(value = "DeviceFaultLog对象", description = "设备故障日志")
+public class DeviceFaultLog implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty(value = "ID")
+    @TableId(value = "log_id", type = IdType.ASSIGN_ID)
+    private Long logId;
+
+    @ApiModelProperty(value = "商户ID")
+    private Long mercId;
+
+    @ApiModelProperty(value = "设备编号")
+    private Long deviceId;
+
+    @ApiModelProperty(value = "故障描述")
+    private String describe;
+
+    @ApiModelProperty(value = "事件编码")
+    private String eventCode;
+
+    @ApiModelProperty(value = "事件发生时间")
+    private LocalDateTime eventTime;
+
+    @ApiModelProperty(value = "创建时间")
+    @TableField(fill = FieldFill.INSERT)
+    private LocalDateTime createTime;
+
+    @TableLogic
+    private Integer deleted;
+
+
+}

+ 63 - 0
device-api-service/src/main/java/com/xy/entity/DeviceFaultMonitorConfig.java

@@ -0,0 +1,63 @@
+package com.xy.entity;
+
+import com.baomidou.mybatisplus.annotation.FieldFill;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+import java.io.Serializable;
+import java.time.LocalDateTime;
+
+/**
+ * <p>
+ * 设备故障监控配置
+ * </p>
+ *
+ * @author 谭斌
+ * @since 2024-01-08
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@ApiModel(value = "DeviceFaultMonitorConfig对象", description = "设备故障监控配置")
+public class DeviceFaultMonitorConfig implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty(value = "ID")
+    @TableId(value = "monitor_id", type = IdType.ASSIGN_ID)
+    private Long monitorId;
+
+    @ApiModelProperty(value = "事件编码")
+    private String eventCode;
+
+    @ApiModelProperty(value = "配置描述")
+    private String configName;
+
+    @ApiModelProperty(value = "是否已启用")
+    private Boolean state;
+
+    @ApiModelProperty(value = "创建时间")
+    @TableField(fill = FieldFill.INSERT)
+    private LocalDateTime createTime;
+
+    @ApiModelProperty(value = "标记解决时间")
+    @TableField(fill = FieldFill.UPDATE)
+    private LocalDateTime updateTime;
+
+    @ApiModelProperty(value = "条件2:达到m次")
+    private Integer eventNum;
+
+    @ApiModelProperty(value = "条件1:最近n分钟")
+    private Long minuteNum;
+
+    @ApiModelProperty(value = "故障级别-字典:device_fault_level")
+    private Integer faultLevel;
+
+
+}

+ 58 - 0
device-api-service/src/main/java/com/xy/job/DeviceFaultJob.java

@@ -0,0 +1,58 @@
+package com.xy.job;
+
+import cn.hutool.core.date.DateUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.xxl.job.core.biz.model.ReturnT;
+import com.xxl.job.core.handler.annotation.XxlJob;
+import com.xy.entity.DeviceFaultLog;
+import com.xy.entity.SysDictRedis;
+import com.xy.service.DeviceFaultLogServiceImpl;
+import com.xy.sys.EnumDataClearSize;
+import com.xy.utils.RecursionUtils;
+import com.xy.utils.SysDictUtils;
+import lombok.AllArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Component;
+
+import java.util.Date;
+
+
+/**
+ * 设备故障job
+ *
+ * @author 谭斌
+ * @date 2024/01/08
+ */
+@Slf4j
+@Component
+@AllArgsConstructor
+public class DeviceFaultJob {
+
+    private DeviceFaultLogServiceImpl deviceFaultLogService;
+
+    /**
+     * 故障日志清理 默认保留n天
+     *
+     * @return
+     */
+    @XxlJob("delDeviceFaultLog")
+    public ReturnT<String> delDeviceFaultLog() {
+        SysDictRedis sysDictRedis = SysDictUtils.get(EnumDataClearSize.Code.CODE.getCode(), EnumDataClearSize.DEVICE_FAULT_LOG_DAY.getCode());
+        Integer saveDay = Integer.valueOf(sysDictRedis.getValue());
+        // 获取当前日期
+        Date today = DateUtil.date();
+        // 获取n天前的日期的开始时间(包含今天)
+        Date daysAgo = DateUtil.beginOfDay(DateUtil.offsetDay(today, -(saveDay - 1)));
+        LambdaQueryWrapper<DeviceFaultLog> lambdaQueryWrapper = new LambdaQueryWrapper<DeviceFaultLog>()
+                .lt(DeviceFaultLog::getEventTime, daysAgo)
+                .last("limit 10000");
+        RecursionUtils.recursion(current -> {
+            boolean remove = deviceFaultLogService.remove(lambdaQueryWrapper);
+            if (!remove) {
+                return false;
+            }
+            return true;
+        });
+        return ReturnT.SUCCESS;
+    }
+}

+ 16 - 0
device-api-service/src/main/java/com/xy/mapper/DeviceFaultInfoMapper.java

@@ -0,0 +1,16 @@
+package com.xy.mapper;
+
+import com.xy.entity.DeviceFaultInfo;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ * <p>
+ * 设备故障信息 Mapper 接口
+ * </p>
+ *
+ * @author 谭斌
+ * @since 2024-01-08
+ */
+public interface DeviceFaultInfoMapper extends BaseMapper<DeviceFaultInfo> {
+
+}

+ 16 - 0
device-api-service/src/main/java/com/xy/mapper/DeviceFaultLogMapper.java

@@ -0,0 +1,16 @@
+package com.xy.mapper;
+
+import com.xy.entity.DeviceFaultLog;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ * <p>
+ * 设备故障日志 Mapper 接口
+ * </p>
+ *
+ * @author 谭斌
+ * @since 2024-01-08
+ */
+public interface DeviceFaultLogMapper extends BaseMapper<DeviceFaultLog> {
+
+}

+ 16 - 0
device-api-service/src/main/java/com/xy/mapper/DeviceFaultMonitorConfigMapper.java

@@ -0,0 +1,16 @@
+package com.xy.mapper;
+
+import com.xy.entity.DeviceFaultMonitorConfig;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ * <p>
+ * 设备故障监控配置 Mapper 接口
+ * </p>
+ *
+ * @author 谭斌
+ * @since 2024-01-08
+ */
+public interface DeviceFaultMonitorConfigMapper extends BaseMapper<DeviceFaultMonitorConfig> {
+
+}

+ 20 - 0
device-api-service/src/main/java/com/xy/mapper/mapper/DeviceFaultInfoMapper.xml

@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.xy.mapper.DeviceFaultInfoMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.xy.entity.DeviceFaultInfo">
+        <id column="fault_id" property="faultId" />
+        <result column="merc_id" property="mercId" />
+        <result column="device_id" property="deviceId" />
+        <result column="describe" property="describe" />
+        <result column="event_code" property="eventCode" />
+        <result column="state" property="state" />
+        <result column="create_time" property="createTime" />
+        <result column="update_time" property="updateTime" />
+        <result column="resolve_time" property="resolveTime" />
+        <result column="event_num" property="eventNum" />
+        <result column="fault_level" property="faultLevel" />
+    </resultMap>
+
+</mapper>

+ 16 - 0
device-api-service/src/main/java/com/xy/mapper/mapper/DeviceFaultLogMapper.xml

@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.xy.mapper.DeviceFaultLogMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.xy.entity.DeviceFaultLog">
+        <id column="log_id" property="logId" />
+        <result column="merc_id" property="mercId" />
+        <result column="device_id" property="deviceId" />
+        <result column="describe" property="describe" />
+        <result column="event_code" property="eventCode" />
+        <result column="event_time" property="eventTime" />
+        <result column="create_time" property="createTime" />
+    </resultMap>
+
+</mapper>

+ 15 - 0
device-api-service/src/main/java/com/xy/mapper/mapper/DeviceFaultMonitorConfigMapper.xml

@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.xy.mapper.DeviceFaultMonitorConfigMapper">
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.xy.entity.DeviceFaultMonitorConfig">
+        <id column="monitor_id" property="monitorId"/>
+        <result column="event_code" property="eventCode"/>
+        <result column="state" property="state"/>
+        <result column="create_time" property="createTime"/>
+        <result column="update_time" property="updateTime"/>
+        <result column="event_num" property="eventNum"/>
+        <result column="minute_num" property="minuteNum"/>
+        <result column="fault_level" property="faultLevel"/>
+    </resultMap>
+</mapper>

+ 139 - 0
device-api-service/src/main/java/com/xy/service/DeviceFaultInfoServiceImpl.java

@@ -0,0 +1,139 @@
+package com.xy.service;
+
+import cn.hutool.core.collection.CollUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.xy.collections.list.JArrayList;
+import com.xy.collections.map.JMap;
+import com.xy.dto.DeviceFaultInfoDto;
+import com.xy.dto.be.MercDto;
+import com.xy.entity.DeviceFaultInfo;
+import com.xy.entity.DeviceFaultLog;
+import com.xy.entity.DeviceInfo;
+import com.xy.error.CommRuntimeException;
+import com.xy.mapper.DeviceFaultInfoMapper;
+import com.xy.service.be.MercService;
+import com.xy.utils.Emptys;
+import com.xy.utils.MybatisPlusQuery;
+import com.xy.utils.PageBean;
+import com.xy.utils.R;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.RequiredArgsConstructor;
+import org.springframework.stereotype.Service;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+
+import java.time.LocalDateTime;
+import java.util.List;
+import java.util.stream.Collectors;
+
+import static com.xy.utils.Beans.copy;
+import static com.xy.utils.PlusBeans.toIPage;
+import static com.xy.utils.PlusBeans.toPageBean;
+
+
+/**
+ * <p>
+ * 设备故障信息 服务实现类
+ * </p>
+ *
+ * @author 谭斌
+ * @since 2024-01-08
+ */
+@Service
+@RequiredArgsConstructor
+@Api(tags = "设备故障信息")
+public class DeviceFaultInfoServiceImpl extends ServiceImpl<DeviceFaultInfoMapper, DeviceFaultInfo> implements DeviceFaultInfoService {
+
+    private final DeviceFaultLogServiceImpl deviceFaultLogService;
+    private final MercService mercService;
+    private final DeviceInfoServiceImpl deviceInfoService;
+
+    @PostMapping("obj")
+    @ApiOperation("对象查询")
+    public R<DeviceFaultInfoDto.Vo> obj(@RequestBody DeviceFaultInfoDto.Vo vo) {
+        DeviceFaultInfoDto.SelectList selectList = copy(DeviceFaultInfoDto.SelectList.class, vo);
+        List<DeviceFaultInfoDto.Vo> list = list(selectList).getData();
+        if (Emptys.check(list)) {
+            return R.ok(list.get(0));
+        }
+        return R.ok();
+    }
+
+    @PostMapping("list")
+    @ApiOperation("集合查询")
+    public R<List<DeviceFaultInfoDto.Vo>> list(@RequestBody DeviceFaultInfoDto.SelectList selectList) {
+        LambdaQueryWrapper<DeviceFaultInfo> lambdaQueryWrapper = new MybatisPlusQuery().eqWrapper(selectList, DeviceFaultInfo.class).build();
+        List<DeviceFaultInfo> list = list(lambdaQueryWrapper);
+        return R.ok(copy(DeviceFaultInfoDto.Vo.class, list));
+    }
+
+    @PostMapping("page")
+    @ApiOperation("分页查询")
+    public R<PageBean<DeviceFaultInfoDto.Vo>> page(@RequestBody DeviceFaultInfoDto.Page page) {
+        PageBean pageBean = page.getPage();
+        LocalDateTime beginTime = page.getBeginCreateTime();
+        LocalDateTime endTime = page.getEndCreateTime();
+        LambdaQueryWrapper<DeviceFaultInfo> lambdaQueryWrapper = new MybatisPlusQuery()
+                .eqWrapper(page, DeviceFaultInfo.class).build()
+                .ge(beginTime != null, DeviceFaultInfo::getCreateTime, beginTime)
+                .le(endTime != null, DeviceFaultInfo::getCreateTime, endTime);
+        IPage<DeviceFaultInfo> iPage = page(toIPage(pageBean), lambdaQueryWrapper);
+        PageBean<DeviceFaultInfoDto.Vo> data = toPageBean(DeviceFaultInfoDto.Vo.class, iPage);
+        List<DeviceFaultInfoDto.Vo> records = data.getRecords();
+        if (CollUtil.isNotEmpty(records)) {
+            List<Long> mercIds = records.stream().map(DeviceFaultInfoDto.Vo::getMercId).distinct().collect(Collectors.toList());
+            List<MercDto.Vo> mercs = mercService.list(new MercDto.SelectList().setMercIds(mercIds)).getData();
+            JMap<Long, MercDto.Vo> longVoJMap = new JArrayList<>(mercs).toMap(MercDto.Vo::getId).cover();
+            records.forEach(r -> {
+                Long mercId = r.getMercId();
+                if (longVoJMap.get(mercId) != null) {
+                    r.setMercName(longVoJMap.get(mercId).getName());
+                }
+            });
+            data.setRecords(records);
+        }
+
+        return R.ok(data);
+    }
+
+    @PostMapping("save")
+    @ApiOperation("添加")
+    public R save(@RequestBody @Validated DeviceFaultInfoDto.Save save) {
+        DeviceFaultInfo saveInfo = copy(DeviceFaultInfo.class, save);
+        save(saveInfo);
+        return R.ok();
+    }
+
+    @PostMapping("update")
+    @ApiOperation("修改")
+    public R update(@RequestBody @Validated DeviceFaultInfoDto.Update update) {
+        DeviceFaultInfo updateInfo = copy(DeviceFaultInfo.class, update);
+        updateById(updateInfo);
+        return R.ok();
+    }
+
+    @PostMapping("resolve")
+    @ApiOperation("标记已解决")
+    public R resolve(@RequestBody @Validated DeviceFaultInfoDto.Update update) {
+        DeviceFaultInfo deviceFaultInfo = this.getById(update.getFaultId());
+        if (deviceFaultInfo == null) {
+            throw new CommRuntimeException("操作对象不存在!");
+        }
+        DeviceFaultInfo updateInfo = copy(DeviceFaultInfo.class, update);
+        updateInfo.setState(true);
+        updateInfo.setFaultLevel(-1);
+        boolean b = updateById(updateInfo);
+        if (b) {
+            //清理日志 故障信息表标记已解决,清除日志表中对应设备事件在标记已解决时间之前所有事件。
+            deviceFaultLogService.remove(Wrappers.<DeviceFaultLog>lambdaUpdate().le(DeviceFaultLog::getEventTime, LocalDateTime.now()));
+            //更新故障等级为正常
+            deviceInfoService.updateById(new DeviceInfo().setDeviceId(deviceFaultInfo.getDeviceId()).setFaultLevel(-1));
+        }
+        return R.ok();
+    }
+}

+ 84 - 0
device-api-service/src/main/java/com/xy/service/DeviceFaultLogServiceImpl.java

@@ -0,0 +1,84 @@
+package com.xy.service;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.xy.dto.DeviceFaultLogDto;
+import com.xy.entity.DeviceFaultLog;
+import com.xy.mapper.DeviceFaultLogMapper;
+import com.xy.utils.Emptys;
+import com.xy.utils.MybatisPlusQuery;
+import com.xy.utils.PageBean;
+import com.xy.utils.R;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.AllArgsConstructor;
+import org.springframework.stereotype.Service;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+
+import java.util.List;
+
+import static com.xy.utils.Beans.copy;
+import static com.xy.utils.PlusBeans.toIPage;
+import static com.xy.utils.PlusBeans.toPageBean;
+
+
+/**
+* <p>
+* 设备故障日志 服务实现类
+* </p>
+*
+* @author 谭斌
+* @since 2024-01-08
+*/
+@Service
+@AllArgsConstructor
+@Api(tags = "设备故障日志")
+public class DeviceFaultLogServiceImpl extends ServiceImpl<DeviceFaultLogMapper, DeviceFaultLog> implements DeviceFaultLogService {
+
+    @PostMapping("obj")
+    @ApiOperation("对象查询")
+    public R<DeviceFaultLogDto.Vo> obj(@RequestBody DeviceFaultLogDto.Vo vo) {
+        DeviceFaultLogDto.SelectList selectList = copy(DeviceFaultLogDto.SelectList.class, vo);
+        List<DeviceFaultLogDto.Vo> list = list(selectList).getData();
+        if(Emptys.check(list)) {
+            return R.ok(list.get(0));
+        }
+        return R.ok();
+    }
+
+    @PostMapping("list")
+    @ApiOperation("集合查询")
+    public R<List<DeviceFaultLogDto.Vo>> list(@RequestBody DeviceFaultLogDto.SelectList selectList) {
+        LambdaQueryWrapper<DeviceFaultLog> lambdaQueryWrapper = new MybatisPlusQuery().eqWrapper(selectList, DeviceFaultLog.class).build();
+        List<DeviceFaultLog> list = list(lambdaQueryWrapper);
+        return R.ok(copy(DeviceFaultLogDto.Vo.class, list));
+    }
+
+    @PostMapping("page")
+    @ApiOperation("分页查询")
+    public R<PageBean<DeviceFaultLogDto.Vo>> page(@RequestBody DeviceFaultLogDto.Page page) {
+        PageBean pageBean = page.getPage();
+        LambdaQueryWrapper<DeviceFaultLog> lambdaQueryWrapper = new MybatisPlusQuery().eqWrapper(page, DeviceFaultLog.class).build();
+        IPage<DeviceFaultLog> iPage = page(toIPage(pageBean), lambdaQueryWrapper);
+        return R.ok(toPageBean(DeviceFaultLogDto.Vo.class, iPage));
+    }
+
+    @PostMapping("save")
+    @ApiOperation("添加")
+    public R save(@RequestBody @Validated DeviceFaultLogDto.Save save) {
+        DeviceFaultLog saveInfo = copy(DeviceFaultLog.class, save);
+        save(saveInfo);
+        return R.ok();
+    }
+
+    @PostMapping("update")
+    @ApiOperation("修改")
+    public R update(@RequestBody @Validated DeviceFaultLogDto.Update update) {
+        DeviceFaultLog updateInfo = copy(DeviceFaultLog.class, update);
+        updateById(updateInfo);
+        return R.ok();
+    }
+}

+ 85 - 0
device-api-service/src/main/java/com/xy/service/DeviceFaultMonitorConfigServiceImpl.java

@@ -0,0 +1,85 @@
+package com.xy.service;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.xy.dto.DeviceFaultMonitorConfigDto;
+import com.xy.entity.DeviceFaultMonitorConfig;
+import com.xy.mapper.DeviceFaultMonitorConfigMapper;
+import com.xy.utils.Emptys;
+import com.xy.utils.MybatisPlusQuery;
+import com.xy.utils.PageBean;
+import com.xy.utils.R;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.AllArgsConstructor;
+import org.springframework.stereotype.Service;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+
+import java.util.List;
+
+import static com.xy.utils.Beans.copy;
+import static com.xy.utils.PlusBeans.toIPage;
+import static com.xy.utils.PlusBeans.toPageBean;
+
+
+/**
+ * <p>
+ * 设备故障监控配置 服务实现类
+ * </p>
+ *
+ * @author 谭斌
+ * @since 2024-01-08
+ */
+@Service
+@AllArgsConstructor
+@Api(tags = "设备故障监控配置")
+public class DeviceFaultMonitorConfigServiceImpl extends ServiceImpl<DeviceFaultMonitorConfigMapper, DeviceFaultMonitorConfig> implements DeviceFaultMonitorConfigService {
+
+    @PostMapping("obj")
+    @ApiOperation("对象查询")
+    public R<DeviceFaultMonitorConfigDto.Vo> obj(@RequestBody DeviceFaultMonitorConfigDto.Vo vo) {
+        DeviceFaultMonitorConfigDto.SelectList selectList = copy(DeviceFaultMonitorConfigDto.SelectList.class, vo);
+        List<DeviceFaultMonitorConfigDto.Vo> list = list(selectList).getData();
+        if (Emptys.check(list)) {
+            return R.ok(list.get(0));
+        }
+        return R.ok();
+    }
+
+
+    @PostMapping("list")
+    @ApiOperation("集合查询")
+    public R<List<DeviceFaultMonitorConfigDto.Vo>> list(@RequestBody DeviceFaultMonitorConfigDto.SelectList selectList) {
+        LambdaQueryWrapper<DeviceFaultMonitorConfig> lambdaQueryWrapper = new MybatisPlusQuery().eqWrapper(selectList, DeviceFaultMonitorConfig.class).build();
+        List<DeviceFaultMonitorConfig> list = list(lambdaQueryWrapper);
+        return R.ok(copy(DeviceFaultMonitorConfigDto.Vo.class, list));
+    }
+
+    @PostMapping("page")
+    @ApiOperation("分页查询")
+    public R<PageBean<DeviceFaultMonitorConfigDto.Vo>> page(@RequestBody DeviceFaultMonitorConfigDto.Page page) {
+        PageBean pageBean = page.getPage();
+        LambdaQueryWrapper<DeviceFaultMonitorConfig> lambdaQueryWrapper = new MybatisPlusQuery().eqWrapper(page, DeviceFaultMonitorConfig.class).build();
+        IPage<DeviceFaultMonitorConfig> iPage = page(toIPage(pageBean), lambdaQueryWrapper);
+        return R.ok(toPageBean(DeviceFaultMonitorConfigDto.Vo.class, iPage));
+    }
+
+    @PostMapping("save")
+    @ApiOperation("添加")
+    public R save(@RequestBody @Validated DeviceFaultMonitorConfigDto.Save save) {
+        DeviceFaultMonitorConfig saveInfo = copy(DeviceFaultMonitorConfig.class, save);
+        save(saveInfo);
+        return R.ok();
+    }
+
+    @PostMapping("update")
+    @ApiOperation("修改")
+    public R update(@RequestBody @Validated DeviceFaultMonitorConfigDto.Update update) {
+        DeviceFaultMonitorConfig updateInfo = copy(DeviceFaultMonitorConfig.class, update);
+        updateById(updateInfo);
+        return R.ok();
+    }
+}

+ 96 - 7
device-api-service/src/main/java/com/xy/service/DeviceMqttConsumerImpl.java

@@ -9,14 +9,13 @@ import cn.hutool.core.util.ObjectUtil;
 import cn.hutool.core.util.StrUtil;
 import cn.hutool.json.JSONObject;
 import cn.hutool.json.JSONUtil;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.xy.config.DeviceThreadPoolConfig;
 import com.xy.device.EnumDeviceOnlineStatus;
 import com.xy.dto.*;
 import com.xy.dto.be.MercDto;
 import com.xy.dto.be.MercUserDeviceDto;
-import com.xy.entity.DeviceEventMsg;
-import com.xy.entity.DeviceInfo;
-import com.xy.entity.SysCodeConfigureRedis;
+import com.xy.entity.*;
 import com.xy.enums.ChannelType;
 import com.xy.enums.MsgConfigId;
 import com.xy.enums.MsgType;
@@ -31,10 +30,7 @@ import org.springframework.scheduling.annotation.Async;
 import org.springframework.stereotype.Service;
 
 import java.time.LocalDateTime;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
+import java.util.*;
 import java.util.stream.Collectors;
 
 @Service
@@ -56,6 +52,10 @@ public class DeviceMqttConsumerImpl implements DeviceMqttConsumer {
 
     private MsgSysMonitorNoticeService msgSysMonitorNoticeService;
 
+    private DeviceFaultLogServiceImpl deviceFaultLogService;
+
+    private DeviceFaultInfoServiceImpl deviceFaultInfoService;
+
     @Override
     @ApiOperation("设备在线")
     @Async(DeviceThreadPoolConfig.DEVICE_NETWORK_POLL)
@@ -196,6 +196,95 @@ public class DeviceMqttConsumerImpl implements DeviceMqttConsumer {
         }
     }
 
+    /**
+     * 设备故障
+     *
+     * @param requestParams
+     */
+    @Override
+    public void deviceFault(DeviceMqttDto.RequestParams requestParams) {
+        DeviceFaultLogDto.MqttData mqttData = JSONUtil.toBean(requestParams.getData(), DeviceFaultLogDto.MqttData.class);
+        if (mqttData != null) {
+            DeviceEventMsgDto.Vo deviceEventMsg = mqttData.getDeviceEventMsg();
+            Long mercId = deviceEventMsg.getMercId();
+            String code = deviceEventMsg.getCode();
+            Long deviceId = deviceEventMsg.getDeviceId();
+            String msg = deviceEventMsg.getMsg();
+            //加入故障日志
+            DeviceFaultLog log = new DeviceFaultLog()
+                    .setMercId(mercId)
+                    .setDescribe(msg)
+                    .setEventCode(code)
+                    .setEventTime(deviceEventMsg.getCreateTime())
+                    .setDeviceId(deviceId);
+            deviceFaultLogService.save(log);
+            List<DeviceFaultMonitorConfigDto.Vo> configList = mqttData.getConfigList();
+
+            // 按故障级别排序 降序
+            List<DeviceFaultMonitorConfigDto.Vo> configSortedList = configList.stream()
+                    .sorted(Comparator.comparing(DeviceFaultMonitorConfigDto.Vo::getFaultLevel).reversed())
+                    .collect(Collectors.toList());
+            for (DeviceFaultMonitorConfigDto.Vo config : configSortedList) {
+                Integer eventNum = config.getEventNum();
+
+                Long minuteNum = config.getMinuteNum();
+
+                Integer faultLevel = config.getFaultLevel();
+
+                // 获取当前时间
+                Date now = DateUtil.date();
+
+                // 计算最近n分钟的开始时间
+                Date minutesAgo = DateUtil.offsetMinute(now, -minuteNum.intValue());
+
+                //统计同类事件累计次数
+                Long count = deviceFaultLogService.count(Wrappers.<DeviceFaultLog>lambdaQuery()
+                        .eq(DeviceFaultLog::getDeviceId, deviceId)
+                        .eq(DeviceFaultLog::getMercId, mercId)
+                        .eq(DeviceFaultLog::getEventCode, code)
+                        .ge(DeviceFaultLog::getEventTime, minutesAgo)
+                );
+                //达到阈值次数
+                if (count != null && count.intValue() >= eventNum) {
+                    //故障表入库
+                    //是否已存在 未解决的
+                    DeviceFaultInfo deviceFaultInfo = deviceFaultInfoService.getOne(Wrappers.<DeviceFaultInfo>lambdaQuery()
+                            .eq(DeviceFaultInfo::getDeviceId, deviceId)
+                            .eq(DeviceFaultInfo::getMercId, mercId)
+                            .eq(DeviceFaultInfo::getEventCode, code)
+                            .eq(DeviceFaultInfo::getState, false)
+                    );
+                    if (deviceFaultInfo != null) {
+                        Integer faultLevel1 = deviceFaultInfo.getFaultLevel();
+                        if (faultLevel1.intValue() < faultLevel) {
+                            //小于,当前故障级别,更新
+                            deviceFaultInfo.setFaultLevel(faultLevel);
+                            deviceInfoService.updateById(new DeviceInfo().setDeviceId(deviceId).setFaultLevel(faultLevel));
+                        }
+                        //累加次数
+                        deviceFaultInfo.setEventNum(deviceFaultInfo.getEventNum() + 1);
+                        deviceFaultInfoService.updateById(deviceFaultInfo);
+                    } else {
+                        deviceFaultInfoService.save(new DeviceFaultInfo()
+                                .setMercId(mercId)
+                                .setDeviceId(deviceId)
+                                .setDescribe(msg)
+                                .setFaultLevel(faultLevel)
+                                .setEventCode(code)
+                                .setEventNum(count.intValue())
+                        );
+                        deviceInfoService.updateById(new DeviceInfo().setDeviceId(deviceId).setFaultLevel(faultLevel));
+                    }
+                    //已按最大故障级别排序,所以满足条件就退出循环
+                    break;
+                }
+            }
+
+
+        }
+    }
+
+
     /**
      * 设备联网状态
      *

+ 16 - 0
device-api-service/src/main/java/com/xy/service/factory/device/impl/open/OpenDeviceFactoryImpl.java

@@ -1,5 +1,6 @@
 package com.xy.service.factory.device.impl.open;
 
+import cn.hutool.core.bean.BeanUtil;
 import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.util.StrUtil;
 import cn.hutool.json.JSONObject;
@@ -66,6 +67,8 @@ public class OpenDeviceFactoryImpl implements DeviceFactory {
 
     private DeviceAlgorithmChargingServiceImpl deviceAlgorithmChargingService;
 
+    private DeviceFaultMonitorConfigServiceImpl deviceFaultMonitorConfigService;
+
     @Override
     public R save(DeviceRegisterDto.Save save) {
         LocalDateTime now = LocalDateTime.now();
@@ -294,6 +297,19 @@ public class OpenDeviceFactoryImpl implements DeviceFactory {
             return;
         }
         deviceMqttSendService.devicePushMsg(new MqttDto.RequestParams().setData(JSONUtil.toJsonStr(deviceEventMsg)));
+        //设备故障监控
+        DeviceFaultMonitorConfigDto.SelectList selectList = new DeviceFaultMonitorConfigDto.SelectList();
+        //启用的配置
+        selectList.setState(true);
+        //监控的事件
+        selectList.setEventCode(code);
+        //监控配置
+        List<DeviceFaultMonitorConfigDto.Vo> voList = R.feignCheckData(deviceFaultMonitorConfigService.list(selectList));
+        if (CollUtil.isNotEmpty(voList)) {
+            //存在则发送到mqtt处理
+            DeviceFaultLogDto.MqttData mqttData = new DeviceFaultLogDto.MqttData().setConfigList(voList).setDeviceEventMsg(BeanUtil.copyProperties(deviceEventMsg, DeviceEventMsgDto.Vo.class));
+            deviceMqttSendService.deviceFault(new MqttDto.RequestParams().setData(JSONUtil.toJsonStr(mqttData)));
+        }
     }
 
     @Override

+ 102 - 0
device-api/src/main/java/com/xy/dto/DeviceFaultInfoDto.java

@@ -0,0 +1,102 @@
+package com.xy.dto;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.xy.utils.PageBean;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.experimental.Accessors;
+
+import java.time.LocalDateTime;
+
+/**
+ * <p>
+ * 设备故障信息
+ * </p>
+ *
+ * @author 谭斌
+ * @since 2024-01-08
+ */
+public class DeviceFaultInfoDto {
+
+    @Data
+    @Accessors(chain = true)
+    public static class SelectList extends Vo {
+
+    }
+
+    @Data
+    @Accessors(chain = true)
+    public static class Page extends Vo {
+
+        @ApiModelProperty(value = "分页对象", required = true)
+        private PageBean page;
+
+        @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+        @ApiModelProperty(value = "日志截取开始时间-起")
+        private LocalDateTime beginCreateTime;
+
+        @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+        @ApiModelProperty(value = "日志截取开始时间-始")
+        private LocalDateTime endCreateTime;
+
+    }
+
+    @Data
+    @Accessors(chain = true)
+    public static class Save extends Vo {
+
+    }
+
+    @Data
+    @Accessors(chain = true)
+    public static class Update extends Vo {
+
+    }
+
+    @Data
+    @Accessors(chain = true)
+    public static class Vo {
+
+        @ApiModelProperty(value = "ID")
+        private Long faultId;
+
+        @ApiModelProperty(value = "商户ID")
+        private Long mercId;
+
+        @ApiModelProperty(value = "商户名称")
+        private String mercName;
+
+        @ApiModelProperty(value = "设备编号")
+        private Long deviceId;
+
+        @ApiModelProperty(value = "故障描述")
+        private String describe;
+
+        @ApiModelProperty(value = "事件编码")
+        private String eventCode;
+
+        @ApiModelProperty(value = "是否已解决")
+        private Boolean state;
+
+        @ApiModelProperty(value = "创建时间")
+        @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+        private LocalDateTime createTime;
+
+        @ApiModelProperty(value = "更新时间")
+        @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+        private LocalDateTime updateTime;
+
+        @ApiModelProperty(value = "标记解决时间")
+        @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+        private LocalDateTime resolveTime;
+
+        @ApiModelProperty(value = "事件发生次数")
+        private Integer eventNum;
+
+        @ApiModelProperty(value = "故障级别-字典:device_fault_level")
+        private Integer faultLevel;
+
+
+    }
+
+}

+ 92 - 0
device-api/src/main/java/com/xy/dto/DeviceFaultLogDto.java

@@ -0,0 +1,92 @@
+package com.xy.dto;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.xy.utils.PageBean;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.experimental.Accessors;
+
+import java.time.LocalDateTime;
+import java.util.List;
+
+/**
+ * <p>
+ * 设备故障日志
+ * </p>
+ *
+ * @author 谭斌
+ * @since 2024-01-08
+ */
+public class DeviceFaultLogDto {
+
+    @Data
+    @Accessors(chain = true)
+    public static class SelectList extends Vo {
+
+    }
+
+    @Data
+    @Accessors(chain = true)
+    public static class Page extends Vo {
+
+        @ApiModelProperty(value = "分页对象", required = true)
+        private PageBean page;
+
+    }
+
+    @Data
+    @Accessors(chain = true)
+    public static class Save extends Vo {
+
+    }
+
+    @Data
+    @Accessors(chain = true)
+    public static class Update extends Vo {
+
+    }
+
+    @Data
+    @Accessors(chain = true)
+    public static class Vo {
+
+        @ApiModelProperty(value = "ID")
+        private Long logId;
+
+        @ApiModelProperty(value = "商户ID")
+        private Long mercId;
+
+        @ApiModelProperty(value = "设备编号")
+        private Long deviceId;
+
+        @ApiModelProperty(value = "故障描述")
+        private String describe;
+
+        @ApiModelProperty(value = "事件编码")
+        private String eventCode;
+
+        @ApiModelProperty(value = "事件发生时间")
+        @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+        private LocalDateTime eventTime;
+
+        @ApiModelProperty(value = "创建时间")
+        @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+        private LocalDateTime createTime;
+
+
+    }
+
+    @Data
+    @Accessors(chain = true)
+    public static class MqttData {
+
+        @ApiModelProperty(value = "ID")
+        private DeviceEventMsgDto.Vo deviceEventMsg;
+
+        @ApiModelProperty(value = "配置信息")
+        List<DeviceFaultMonitorConfigDto.Vo> configList;
+
+
+    }
+
+}

+ 84 - 0
device-api/src/main/java/com/xy/dto/DeviceFaultMonitorConfigDto.java

@@ -0,0 +1,84 @@
+package com.xy.dto;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.xy.utils.PageBean;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.experimental.Accessors;
+
+import java.time.LocalDateTime;
+
+/**
+ * <p>
+ * 设备故障监控配置
+ * </p>
+ *
+ * @author 谭斌
+ * @since 2024-01-08
+ */
+public class DeviceFaultMonitorConfigDto {
+
+    @Data
+    @Accessors(chain = true)
+    public static class SelectList extends Vo {
+
+    }
+
+    @Data
+    @Accessors(chain = true)
+    public static class Page extends Vo {
+
+        @ApiModelProperty(value = "分页对象", required = true)
+        private PageBean page;
+
+    }
+
+    @Data
+    @Accessors(chain = true)
+    public static class Save extends Vo {
+
+    }
+
+    @Data
+    @Accessors(chain = true)
+    public static class Update extends Vo {
+
+    }
+
+    @Data
+    @Accessors(chain = true)
+    public static class Vo {
+
+        @ApiModelProperty(value = "ID")
+        private Long monitorId;
+
+        @ApiModelProperty(value = "事件编码")
+        private String eventCode;
+        
+        @ApiModelProperty(value = "配置描述")
+        private String configName;
+
+        @ApiModelProperty(value = "是否已启用")
+        private Boolean state;
+
+        @ApiModelProperty(value = "创建时间")
+        @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+        private LocalDateTime createTime;
+
+        @ApiModelProperty(value = "标记解决时间")
+        @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+        private LocalDateTime updateTime;
+
+        @ApiModelProperty(value = "条件2:达到m次")
+        private Integer eventNum;
+
+        @ApiModelProperty(value = "条件1:最近n分钟")
+        private Long minuteNum;
+
+        @ApiModelProperty(value = "故障级别-字典:device_fault_level")
+        private Integer faultLevel;
+
+
+    }
+
+}

+ 16 - 0
device-api/src/main/java/com/xy/service/DeviceFaultInfoService.java

@@ -0,0 +1,16 @@
+package com.xy.service;
+
+import com.xy.annotate.RestMappingController;
+
+/**
+ * <p>
+ * 设备故障信息 服务类
+ * </p>
+ *
+ * @author 谭斌
+ * @since 2024-01-08
+ */
+@RestMappingController("/device-fault-info")
+public interface DeviceFaultInfoService {
+
+}

+ 16 - 0
device-api/src/main/java/com/xy/service/DeviceFaultLogService.java

@@ -0,0 +1,16 @@
+package com.xy.service;
+
+import com.xy.annotate.RestMappingController;
+
+/**
+ * <p>
+ * 设备故障日志 服务类
+ * </p>
+ *
+ * @author 谭斌
+ * @since 2024-01-08
+ */
+@RestMappingController("/device-fault-log")
+public interface DeviceFaultLogService {
+
+}

+ 16 - 0
device-api/src/main/java/com/xy/service/DeviceFaultMonitorConfigService.java

@@ -0,0 +1,16 @@
+package com.xy.service;
+
+import com.xy.annotate.RestMappingController;
+
+/**
+ * <p>
+ * 设备故障监控配置 服务类
+ * </p>
+ *
+ * @author 谭斌
+ * @since 2024-01-08
+ */
+@RestMappingController("/device-fault-monitor-config")
+public interface DeviceFaultMonitorConfigService {
+
+}

+ 4 - 0
device-api/src/main/java/com/xy/service/DeviceMqttConsumer.java

@@ -35,4 +35,8 @@ public interface DeviceMqttConsumer {
      */
     @PostMapping("devicePushMsg")
     void devicePushMsg(@RequestBody @Validated DeviceMqttDto.RequestParams requestParams);
+
+    @PostMapping("deviceFault")
+    void deviceFault(@RequestBody @Validated DeviceMqttDto.RequestParams requestParams);
+
 }