‘liusuyi’
2023-06-06 3a0f24e5517b574a203cec8088fdd3d9165862aa
增加管线泄露报警入库
已添加9个文件
已重命名1个文件
已修改12个文件
1194 ■■■■■ 文件已修改
ard-work/pom.xml 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ard-work/src/main/java/com/ruoyi/alarm/globalAlarm/service/GlobalAlarmServiceImpl.java 42 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ard-work/src/main/java/com/ruoyi/alarm/globalAlarm/service/IGlobalAlarmService.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ard-work/src/main/java/com/ruoyi/alarm/tubeAlarm/controller/ArdAlarmTubeController.java 105 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ard-work/src/main/java/com/ruoyi/alarm/tubeAlarm/domain/ArdAlarmTube.java 210 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ard-work/src/main/java/com/ruoyi/alarm/tubeAlarm/mapper/ArdAlarmTubeMapper.java 62 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ard-work/src/main/java/com/ruoyi/alarm/tubeAlarm/service/IArdAlarmTubeService.java 62 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ard-work/src/main/java/com/ruoyi/alarm/tubeAlarm/service/impl/ArdAlarmTubeServiceImpl.java 90 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ard-work/src/main/java/com/ruoyi/config/AsyncConfiguration.java 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ard-work/src/main/java/com/ruoyi/inspect/service/impl/ArdVideoInspectTaskServiceImpl.java 补丁 | 查看 | 原始文档 | blame | 历史
ard-work/src/main/java/com/ruoyi/inspect/service/impl/ArdVideoInspectTaskStepServiceImpl.java 4 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ard-work/src/main/java/com/ruoyi/utils/mqtt/MqttConsumer.java 174 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ard-work/src/main/java/com/ruoyi/utils/mqtt/MqttConsumerCallback.java 100 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ard-work/src/main/java/com/ruoyi/utils/mqtt/PropertiesUtil.java 54 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ard-work/src/main/resources/mapper/alarm/ArdAlarmTubeMapper.xml 117 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ard-work/src/main/resources/mapper/alarmpoints/ArdTubesDetailsMapper.xml 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ard-work/src/main/resources/mapper/inspect/ArdVideoInspectRecordMapper.xml 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/resources/application-ard.yml 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/resources/application-druid.yml 10 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/resources/application.yml 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/resources/logback.xml 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-framework/src/main/java/com/ruoyi/framework/aspectj/LogAspect.java 96 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ard-work/pom.xml
@@ -77,6 +77,12 @@
            <artifactId>forest-spring-boot-starter</artifactId>
            <version>1.5.22</version>
        </dependency>
        <!--mqtt-->
        <dependency>
            <groupId>org.springframework.integration</groupId>
            <artifactId>spring-integration-mqtt</artifactId>
            <version>6.0.3</version>
        </dependency>
        <dependency>
            <groupId>com.ruoyi</groupId>
            <artifactId>ruoyi-system</artifactId>
ard-work/src/main/java/com/ruoyi/alarm/globalAlarm/service/GlobalAlarmServiceImpl.java
@@ -1,8 +1,18 @@
package com.ruoyi.alarm.globalAlarm.service;
import com.alibaba.fastjson2.JSONObject;
import com.ruoyi.alarm.globalAlarm.domain.GlobalAlarmCondition;
import com.ruoyi.alarm.stealAlarm.domain.ArdAlarmStealelec;
import com.ruoyi.alarm.stealAlarm.mapper.ArdAlarmStealelecMapper;
import com.ruoyi.alarm.tubeAlarm.domain.ArdAlarmTube;
import com.ruoyi.alarm.tubeAlarm.mapper.ArdAlarmTubeMapper;
import com.ruoyi.alarm.tubeAlarm.service.IArdAlarmTubeService;
import com.ruoyi.alarmpoints.tube.domain.ArdTubes;
import com.ruoyi.alarmpoints.tube.domain.ArdTubesDetails;
import com.ruoyi.alarmpoints.tube.mapper.ArdTubesDetailsMapper;
import com.ruoyi.alarmpoints.tube.mapper.ArdTubesMapper;
import com.ruoyi.common.utils.uuid.UUID;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
@@ -20,7 +30,12 @@
public class GlobalAlarmServiceImpl implements IGlobalAlarmService {
    @Resource
    ArdAlarmStealelecMapper ardAlarmStealelecMapper;
    @Resource
    IArdAlarmTubeService ardAlarmTubeService;
    @Resource
    ArdTubesMapper ardTubesMapper;
    @Resource
    ArdTubesDetailsMapper ardTubesDetailsMapper;
    @Override
    public List<Object> selectAlarmLogs(GlobalAlarmCondition condition) {
        switch (condition.getCommand()) {
@@ -32,4 +47,29 @@
        }
    }
    @Override
    @Async("alarmExecutor")
    public void receiveAlarm(String topic,String message)
    {
        switch (topic)
        {
            case "tube":
                ArdAlarmTube ardAlarmTube = JSONObject.parseObject(message,ArdAlarmTube.class);
                ardAlarmTube.setId(UUID.randomUUID().toString().replace("-",""));
                ArdTubesDetails atd=new ArdTubesDetails();
                atd.setReelNumber(ardAlarmTube.getTubeId());
                List<ArdTubesDetails> ardTubesDetails = ardTubesDetailsMapper.selectArdTubesDetailsList(atd);
                if(ardTubesDetails.size()>0)
                {
                    String tubeId = ardTubesDetails.get(0).getTubeId();
                    ArdTubes ardTubes = ardTubesMapper.selectArdTubesById(tubeId);
                    ardAlarmTube.setTubeName(ardTubes.getName());
                    ardAlarmTube.setColor(ardTubes.getColor());
                    ardAlarmTube.setPipeDiameter(ardTubes.getPipeDiameter());
                    ardAlarmTube.setTubeType(ardTubes.getType());
                }
                int i = ardAlarmTubeService.insertArdAlarmTube(ardAlarmTube);
                break;
        }
    }
}
ard-work/src/main/java/com/ruoyi/alarm/globalAlarm/service/IGlobalAlarmService.java
@@ -13,4 +13,6 @@
 **/
public interface IGlobalAlarmService {
    public List<Object> selectAlarmLogs(GlobalAlarmCondition condition);
    public void receiveAlarm(String topic,String message);
}
ard-work/src/main/java/com/ruoyi/alarm/tubeAlarm/controller/ArdAlarmTubeController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,105 @@
package com.ruoyi.alarm.tubeAlarm.controller;
import java.util.List;
import javax.servlet.http.HttpServletResponse;
import com.ruoyi.alarm.tubeAlarm.domain.ArdAlarmTube;
import com.ruoyi.alarm.tubeAlarm.service.IArdAlarmTubeService;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.ruoyi.common.annotation.Log;
import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.enums.BusinessType;
import com.ruoyi.common.utils.poi.ExcelUtil;
import com.ruoyi.common.core.page.TableDataInfo;
/**
 * ç®¡çº¿æ³„露报警Controller
 *
 * @author åˆ˜è‹ä¹‰
 * @date 2023-06-06
 */
@RestController
@RequestMapping("/alarm/tubeAlarm")
public class ArdAlarmTubeController extends BaseController
{
    @Autowired
    private IArdAlarmTubeService ardAlarmTubeService;
    /**
     * æŸ¥è¯¢ç®¡çº¿æ³„露报警列表
     */
    @PreAuthorize("@ss.hasPermi('alarm:tubeAlarm:list')")
    @GetMapping("/list")
    public TableDataInfo list(ArdAlarmTube ardAlarmTube)
    {
        startPage();
        List<ArdAlarmTube> list = ardAlarmTubeService.selectArdAlarmTubeList(ardAlarmTube);
        return getDataTable(list);
    }
    /**
     * å¯¼å‡ºç®¡çº¿æ³„露报警列表
     */
    @PreAuthorize("@ss.hasPermi('alarm:tubeAlarm:export')")
    @Log(title = "管线泄露报警", businessType = BusinessType.EXPORT)
    @PostMapping("/export")
    public void export(HttpServletResponse response, ArdAlarmTube ardAlarmTube)
    {
        List<ArdAlarmTube> list = ardAlarmTubeService.selectArdAlarmTubeList(ardAlarmTube);
        ExcelUtil<ArdAlarmTube> util = new ExcelUtil<ArdAlarmTube>(ArdAlarmTube.class);
        util.exportExcel(response, list, "管线泄露报警数据");
    }
    /**
     * èŽ·å–ç®¡çº¿æ³„éœ²æŠ¥è­¦è¯¦ç»†ä¿¡æ¯
     */
    @PreAuthorize("@ss.hasPermi('alarm:tubeAlarm:query')")
    @GetMapping(value = "/{id}")
    public AjaxResult getInfo(@PathVariable("id") String id)
    {
        return success(ardAlarmTubeService.selectArdAlarmTubeById(id));
    }
    /**
     * æ–°å¢žç®¡çº¿æ³„露报警
     */
    @PreAuthorize("@ss.hasPermi('alarm:tubeAlarm:add')")
    @Log(title = "管线泄露报警", businessType = BusinessType.INSERT)
    @PostMapping
    public AjaxResult add(@RequestBody ArdAlarmTube ardAlarmTube)
    {
        return toAjax(ardAlarmTubeService.insertArdAlarmTube(ardAlarmTube));
    }
    /**
     * ä¿®æ”¹ç®¡çº¿æ³„露报警
     */
    @PreAuthorize("@ss.hasPermi('alarm:tubeAlarm:edit')")
    @Log(title = "管线泄露报警", businessType = BusinessType.UPDATE)
    @PutMapping
    public AjaxResult edit(@RequestBody ArdAlarmTube ardAlarmTube)
    {
        return toAjax(ardAlarmTubeService.updateArdAlarmTube(ardAlarmTube));
    }
    /**
     * åˆ é™¤ç®¡çº¿æ³„露报警
     */
    @PreAuthorize("@ss.hasPermi('alarm:tubeAlarm:remove')")
    @Log(title = "管线泄露报警", businessType = BusinessType.DELETE)
    @DeleteMapping("/{ids}")
    public AjaxResult remove(@PathVariable String[] ids)
    {
        return toAjax(ardAlarmTubeService.deleteArdAlarmTubeByIds(ids));
    }
}
ard-work/src/main/java/com/ruoyi/alarm/tubeAlarm/domain/ArdAlarmTube.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,210 @@
package com.ruoyi.alarm.tubeAlarm.domain;
import java.util.Date;
import com.fasterxml.jackson.annotation.JsonFormat;
import org.apache.commons.lang3.builder.ToStringBuilder;
import org.apache.commons.lang3.builder.ToStringStyle;
import com.ruoyi.common.annotation.Excel;
import com.ruoyi.common.core.domain.BaseEntity;
/**
 * ç®¡çº¿æ³„露报警对象 ard_alarm_tube
 *
 * @author åˆ˜è‹ä¹‰
 * @date 2023-06-06
 */
public class ArdAlarmTube extends BaseEntity
{
    private static final long serialVersionUID = 1L;
    /** ä¸»é”® */
    private String id;
    /** æŠ¥è­¦ä¸»æœº */
    @Excel(name = "报警主机")
    private String host;
    /** ç®¡çº¿id */
    @Excel(name = "管线id")
    private String tubeId;
    /** ç®¡çº¿åç§° */
    @Excel(name = "管线名称")
    private String tubeName;
    /** ç®¡çº¿ç±»åž‹-油管-水管 */
    @Excel(name = "管线类型-油管-水管")
    private String tubeType;
    /** ç®¡å¾„ */
    @Excel(name = "管径")
    private String pipeDiameter;
    /** é¢œè‰² */
    @Excel(name = "颜色")
    private String color;
    /** ä½ç½® */
    @Excel(name = "位置")
    private String position;
    /** ç±»åž‹GXALARM */
    @Excel(name = "类型GXALARM")
    private String type;
    /** ç±»åž‹ä¸­æ–‡ */
    @Excel(name = "类型中文")
    private String alarmType;
    /** æŠ¥è­¦æ—¶é—´ */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @Excel(name = "报警时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss")
    private Date alarmTime;
    /** ç”¨æˆ·å */
    @Excel(name = "用户名")
    private String watcher;
    /** æŸ¥çœ‹æ—¶é—´ */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @Excel(name = "查看时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss")
    private Date viewTime;
    public void setId(String id)
    {
        this.id = id;
    }
    public String getId()
    {
        return id;
    }
    public void setHost(String host)
    {
        this.host = host;
    }
    public String getHost()
    {
        return host;
    }
    public void setTubeId(String tubeId)
    {
        this.tubeId = tubeId;
    }
    public String getTubeId()
    {
        return tubeId;
    }
    public void setTubeName(String tubeName)
    {
        this.tubeName = tubeName;
    }
    public String getTubeName()
    {
        return tubeName;
    }
    public void setTubeType(String tubeType)
    {
        this.tubeType = tubeType;
    }
    public String getTubeType()
    {
        return tubeType;
    }
    public void setPipeDiameter(String pipeDiameter)
    {
        this.pipeDiameter = pipeDiameter;
    }
    public String getPipeDiameter()
    {
        return pipeDiameter;
    }
    public void setColor(String color)
    {
        this.color = color;
    }
    public String getColor()
    {
        return color;
    }
    public void setPosition(String position)
    {
        this.position = position;
    }
    public String getPosition()
    {
        return position;
    }
    public void setType(String type)
    {
        this.type = type;
    }
    public String getType()
    {
        return type;
    }
    public void setAlarmType(String alarmType)
    {
        this.alarmType = alarmType;
    }
    public String getAlarmType()
    {
        return alarmType;
    }
    public void setAlarmTime(Date alarmTime)
    {
        this.alarmTime = alarmTime;
    }
    public Date getAlarmTime()
    {
        return alarmTime;
    }
    public void setWatcher(String watcher)
    {
        this.watcher = watcher;
    }
    public String getWatcher()
    {
        return watcher;
    }
    public void setViewTime(Date viewTime)
    {
        this.viewTime = viewTime;
    }
    public Date getViewTime()
    {
        return viewTime;
    }
    @Override
    public String toString() {
        return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
            .append("id", getId())
            .append("host", getHost())
            .append("tubeId", getTubeId())
            .append("tubeName", getTubeName())
            .append("tubeType", getTubeType())
            .append("pipeDiameter", getPipeDiameter())
            .append("color", getColor())
            .append("position", getPosition())
            .append("type", getType())
            .append("alarmType", getAlarmType())
            .append("alarmTime", getAlarmTime())
            .append("watcher", getWatcher())
            .append("createTime", getCreateTime())
            .append("viewTime", getViewTime())
            .toString();
    }
}
ard-work/src/main/java/com/ruoyi/alarm/tubeAlarm/mapper/ArdAlarmTubeMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,62 @@
package com.ruoyi.alarm.tubeAlarm.mapper;
import java.util.List;
import com.ruoyi.alarm.tubeAlarm.domain.ArdAlarmTube;
/**
 * ç®¡çº¿æ³„露报警Mapper接口
 *
 * @author åˆ˜è‹ä¹‰
 * @date 2023-06-06
 */
public interface ArdAlarmTubeMapper
{
    /**
     * æŸ¥è¯¢ç®¡çº¿æ³„露报警
     *
     * @param id ç®¡çº¿æ³„露报警主键
     * @return ç®¡çº¿æ³„露报警
     */
    public ArdAlarmTube selectArdAlarmTubeById(String id);
    /**
     * æŸ¥è¯¢ç®¡çº¿æ³„露报警列表
     *
     * @param ardAlarmTube ç®¡çº¿æ³„露报警
     * @return ç®¡çº¿æ³„露报警集合
     */
    public List<ArdAlarmTube> selectArdAlarmTubeList(ArdAlarmTube ardAlarmTube);
    /**
     * æ–°å¢žç®¡çº¿æ³„露报警
     *
     * @param ardAlarmTube ç®¡çº¿æ³„露报警
     * @return ç»“æžœ
     */
    public int insertArdAlarmTube(ArdAlarmTube ardAlarmTube);
    /**
     * ä¿®æ”¹ç®¡çº¿æ³„露报警
     *
     * @param ardAlarmTube ç®¡çº¿æ³„露报警
     * @return ç»“æžœ
     */
    public int updateArdAlarmTube(ArdAlarmTube ardAlarmTube);
    /**
     * åˆ é™¤ç®¡çº¿æ³„露报警
     *
     * @param id ç®¡çº¿æ³„露报警主键
     * @return ç»“æžœ
     */
    public int deleteArdAlarmTubeById(String id);
    /**
     * æ‰¹é‡åˆ é™¤ç®¡çº¿æ³„露报警
     *
     * @param ids éœ€è¦åˆ é™¤çš„æ•°æ®ä¸»é”®é›†åˆ
     * @return ç»“æžœ
     */
    public int deleteArdAlarmTubeByIds(String[] ids);
}
ard-work/src/main/java/com/ruoyi/alarm/tubeAlarm/service/IArdAlarmTubeService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,62 @@
package com.ruoyi.alarm.tubeAlarm.service;
import java.util.List;
import com.ruoyi.alarm.tubeAlarm.domain.ArdAlarmTube;
/**
 * ç®¡çº¿æ³„露报警Service接口
 *
 * @author åˆ˜è‹ä¹‰
 * @date 2023-06-06
 */
public interface IArdAlarmTubeService
{
    /**
     * æŸ¥è¯¢ç®¡çº¿æ³„露报警
     *
     * @param id ç®¡çº¿æ³„露报警主键
     * @return ç®¡çº¿æ³„露报警
     */
    public ArdAlarmTube selectArdAlarmTubeById(String id);
    /**
     * æŸ¥è¯¢ç®¡çº¿æ³„露报警列表
     *
     * @param ardAlarmTube ç®¡çº¿æ³„露报警
     * @return ç®¡çº¿æ³„露报警集合
     */
    public List<ArdAlarmTube> selectArdAlarmTubeList(ArdAlarmTube ardAlarmTube);
    /**
     * æ–°å¢žç®¡çº¿æ³„露报警
     *
     * @param ardAlarmTube ç®¡çº¿æ³„露报警
     * @return ç»“æžœ
     */
    public int insertArdAlarmTube(ArdAlarmTube ardAlarmTube);
    /**
     * ä¿®æ”¹ç®¡çº¿æ³„露报警
     *
     * @param ardAlarmTube ç®¡çº¿æ³„露报警
     * @return ç»“æžœ
     */
    public int updateArdAlarmTube(ArdAlarmTube ardAlarmTube);
    /**
     * æ‰¹é‡åˆ é™¤ç®¡çº¿æ³„露报警
     *
     * @param ids éœ€è¦åˆ é™¤çš„管线泄露报警主键集合
     * @return ç»“æžœ
     */
    public int deleteArdAlarmTubeByIds(String[] ids);
    /**
     * åˆ é™¤ç®¡çº¿æ³„露报警信息
     *
     * @param id ç®¡çº¿æ³„露报警主键
     * @return ç»“æžœ
     */
    public int deleteArdAlarmTubeById(String id);
}
ard-work/src/main/java/com/ruoyi/alarm/tubeAlarm/service/impl/ArdAlarmTubeServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,90 @@
package com.ruoyi.alarm.tubeAlarm.service.impl;
import com.ruoyi.alarm.tubeAlarm.domain.ArdAlarmTube;
import com.ruoyi.alarm.tubeAlarm.mapper.ArdAlarmTubeMapper;
import com.ruoyi.alarm.tubeAlarm.service.IArdAlarmTubeService;
import com.ruoyi.common.utils.DateUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
/**
 * ç®¡çº¿æ³„露报警Service业务层处理
 *
 * @author åˆ˜è‹ä¹‰
 * @date 2023-06-06
 */
@Service
public class ArdAlarmTubeServiceImpl implements IArdAlarmTubeService {
    @Autowired
    private ArdAlarmTubeMapper ardAlarmTubeMapper;
    /**
     * æŸ¥è¯¢ç®¡çº¿æ³„露报警
     *
     * @param id ç®¡çº¿æ³„露报警主键
     * @return ç®¡çº¿æ³„露报警
     */
    @Override
    public ArdAlarmTube selectArdAlarmTubeById(String id) {
        return ardAlarmTubeMapper.selectArdAlarmTubeById(id);
    }
    /**
     * æŸ¥è¯¢ç®¡çº¿æ³„露报警列表
     *
     * @param ardAlarmTube ç®¡çº¿æ³„露报警
     * @return ç®¡çº¿æ³„露报警
     */
    @Override
    public List<ArdAlarmTube> selectArdAlarmTubeList(ArdAlarmTube ardAlarmTube) {
        return ardAlarmTubeMapper.selectArdAlarmTubeList(ardAlarmTube);
    }
    /**
     * æ–°å¢žç®¡çº¿æ³„露报警
     *
     * @param ardAlarmTube ç®¡çº¿æ³„露报警
     * @return ç»“æžœ
     */
    @Override
    public int insertArdAlarmTube(ArdAlarmTube ardAlarmTube) {
                ardAlarmTube.setCreateTime(DateUtils.getNowDate());
            return ardAlarmTubeMapper.insertArdAlarmTube(ardAlarmTube);
    }
    /**
     * ä¿®æ”¹ç®¡çº¿æ³„露报警
     *
     * @param ardAlarmTube ç®¡çº¿æ³„露报警
     * @return ç»“æžœ
     */
    @Override
    public int updateArdAlarmTube(ArdAlarmTube ardAlarmTube) {
        return ardAlarmTubeMapper.updateArdAlarmTube(ardAlarmTube);
    }
    /**
     * æ‰¹é‡åˆ é™¤ç®¡çº¿æ³„露报警
     *
     * @param ids éœ€è¦åˆ é™¤çš„管线泄露报警主键
     * @return ç»“æžœ
     */
    @Override
    public int deleteArdAlarmTubeByIds(String[] ids) {
        return ardAlarmTubeMapper.deleteArdAlarmTubeByIds(ids);
    }
    /**
     * åˆ é™¤ç®¡çº¿æ³„露报警信息
     *
     * @param id ç®¡çº¿æ³„露报警主键
     * @return ç»“æžœ
     */
    @Override
    public int deleteArdAlarmTubeById(String id) {
        return ardAlarmTubeMapper.deleteArdAlarmTubeById(id);
    }
}
ard-work/src/main/java/com/ruoyi/config/AsyncConfiguration.java
ÎļþÃû´Ó ard-work/src/main/java/com/ruoyi/device/hiksdk/config/AsyncConfiguration.java ÐÞ¸Ä
@@ -1,4 +1,4 @@
package com.ruoyi.device.hiksdk.config;
package com.ruoyi.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@@ -38,4 +38,25 @@
        executor.initialize();
        return executor;
    }
    @Bean("alarmExecutor")
    public Executor alarmExecutor(){
        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
        //配置核心线程数
        executor.setCorePoolSize(15);
        //配置最大线程数
        executor.setMaxPoolSize(30);
        //配置队列大小
        executor.setQueueCapacity(1000);
        //线程的名称前缀
        executor.setThreadNamePrefix("alarmExecutor-");
        //线程活跃时间(秒)
        //executor.setKeepAliveSeconds(60);
        //等待所有任务结束后再关闭线程池
        executor.setWaitForTasksToCompleteOnShutdown(true);
        //设置拒绝策略
        //executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
        //执行初始化
        executor.initialize();
        return executor;
    }
}
ard-work/src/main/java/com/ruoyi/inspect/service/impl/ArdVideoInspectTaskServiceImpl.java
ard-work/src/main/java/com/ruoyi/inspect/service/impl/ArdVideoInspectTaskStepServiceImpl.java
@@ -9,6 +9,8 @@
import com.ruoyi.inspect.domain.ArdVideoInspectTaskStep;
import com.ruoyi.inspect.service.IArdVideoInspectTaskStepService;
import javax.annotation.Resource;
/**
 * è§†é¢‘巡检步骤Service业务层处理
 *
@@ -17,7 +19,7 @@
 */
@Service
public class ArdVideoInspectTaskStepServiceImpl implements IArdVideoInspectTaskStepService {
    @Autowired
    @Resource
    private ArdVideoInspectTaskStepMapper ardVideoInspectTaskStepMapper;
    /**
ard-work/src/main/java/com/ruoyi/utils/mqtt/MqttConsumer.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,174 @@
package com.ruoyi.utils.mqtt;
import lombok.extern.slf4j.Slf4j;
import org.eclipse.paho.client.mqttv3.*;
import org.eclipse.paho.client.mqttv3.persist.MemoryPersistence;
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.stereotype.Component;
import java.io.UnsupportedEncodingException;
/**
 * @Description: mqtt消费客户端
 * @ClassName: MqttConsumer
 * @Author: åˆ˜è‹ä¹‰
 * @Date: 2023å¹´05月29日9:55
 * @Version: 1.0
 **/
@Component
@Slf4j(topic = "mqtt")
public class MqttConsumer implements ApplicationRunner {
    private static MqttClient client;
    @Override
    public void run(ApplicationArguments args) {
        log.info("初始化并启动mqtt......");
        if(PropertiesUtil.MQTT_ENABLED)
        {
            this.connect();
        }
    }
    /**
     * è¿žæŽ¥mqtt服务器
     */
    private void connect() {
        try {
            // 1 åˆ›å»ºå®¢æˆ·ç«¯
            getClient();
            // 2 è®¾ç½®é…ç½®
            MqttConnectOptions options = getOptions();
            String[] topic = PropertiesUtil.MQTT_TOPIC.split(",");
            // 3 æ¶ˆæ¯å‘布质量
            int[] qos = getQos(topic.length);
            // 4 æœ€åŽè®¾ç½®
            create(options, topic, qos);
        } catch (Exception e) {
            log.error("mqtt连接异常:" + e);
        }
    }
    /**
     *  åˆ›å»ºå®¢æˆ·ç«¯  --- 1 ---
     */
    public void getClient() {
        try {
            if (null == client) {
                client = new MqttClient(PropertiesUtil.MQTT_HOST, PropertiesUtil.MQTT_CLIENT_ID, new MemoryPersistence());
            }
            log.info("--创建mqtt客户端");
        } catch (Exception e) {
            log.error("创建mqtt客户端异常:" + e);
        }
    }
    /**
     *  ç”Ÿæˆé…ç½®å¯¹è±¡ï¼Œç”¨æˆ·åï¼Œå¯†ç ç­‰  --- 2 ---
     */
    public MqttConnectOptions getOptions() {
        MqttConnectOptions options = new MqttConnectOptions();
        //设置用户名密码
        options.setUserName(PropertiesUtil.MQTT_USER_NAME);
        options.setPassword(PropertiesUtil.MQTT_PASSWORD.toCharArray());
        // è®¾ç½®è¶…æ—¶æ—¶é—´
        options.setConnectionTimeout(PropertiesUtil.MQTT_TIMEOUT);
        // è®¾ç½®ä¼šè¯å¿ƒè·³æ—¶é—´
        options.setKeepAliveInterval(PropertiesUtil.MQTT_KEEP_ALIVE);
        // æ˜¯å¦æ¸…除session
        options.setCleanSession(false);
        log.info("--生成mqtt配置对象");
        return options;
    }
    /**
     *  qos   --- 3 ---
     */
    public int[] getQos(int length) {
        int[] qos = new int[length];
        for (int i = 0; i < length; i++) {
            /**
             *  MQTT协议中有三种消息发布服务质量:
             *
             * QOS0: â€œè‡³å¤šä¸€æ¬¡â€ï¼Œæ¶ˆæ¯å‘布完全依赖底层 TCP/IP ç½‘络。会发生消息丢失或重复。这一级别可用于如下情况,环境传感器数据,丢失一次读记录无所谓,因为不久后还会有第二次发送。
             * QOS1: â€œè‡³å°‘一次”,确保消息到达,但消息重复可能会发生。
             * QOS2: â€œåªæœ‰ä¸€æ¬¡â€ï¼Œç¡®ä¿æ¶ˆæ¯åˆ°è¾¾ä¸€æ¬¡ã€‚这一级别可用于如下情况,在计费系统中,消息重复或丢失会导致不正确的结果,资源开销大
             */
            qos[i] = 1;
        }
        log.info("--设置消息发布质量");
        return qos;
    }
    /**
     *  è£…载各种实例和订阅主题  --- 4 ---
     */
    public void create(MqttConnectOptions options, String[] topic, int[] qos) {
        try {
            client.setCallback(new MqttConsumerCallback(client, options, topic, qos));
            log.info("--添加回调处理类");
            client.connect(options);
        } catch (Exception e) {
            log.info("装载实例或订阅主题异常:" + e);
        }
    }
    /**
     * è®¢é˜…某个主题
     *
     * @param topic
     * @param qos
     */
    public void subscribe(String topic, int qos) {
        try {
            log.info("topic:" + topic);
            client.subscribe(topic, qos);
        } catch (MqttException e) {
            e.printStackTrace();
        }
    }
    /**
     * å‘布,非持久化
     *
     *  qos根据文档设置为1
     *
     * @param topic
     * @param msg
     */
    public static void publish(String topic, String msg) {
        publish(1, false, topic, msg);
    }
    /**
     * å‘布
     */
    public static void publish(int qos, boolean retained, String topic, String pushMessage) {
        log.info("【主题】:" + topic + "【qos】:" + qos + "【pushMessage】:" + pushMessage);
        MqttMessage message = new MqttMessage();
        message.setQos(qos);
        message.setRetained(retained);
        try {
            message.setPayload(pushMessage.getBytes("UTF-8"));
        } catch (UnsupportedEncodingException e) {
            log.error("mqtt编码异常:" + e.getMessage());
        }
        MqttTopic mTopic = client.getTopic(topic);
        if (null == mTopic) {
            log.error("topic:" + topic + " ä¸å­˜åœ¨");
        }
        MqttDeliveryToken token;
        try {
            token = mTopic.publish(message);
            token.waitForCompletion();
            if (token.isComplete()) {
                log.info("消息发送成功");
            }
        } catch (MqttPersistenceException e) {
            e.printStackTrace();
        } catch (MqttException e) {
            e.printStackTrace();
        }
    }
}
ard-work/src/main/java/com/ruoyi/utils/mqtt/MqttConsumerCallback.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,100 @@
package com.ruoyi.utils.mqtt;
import com.ruoyi.alarm.globalAlarm.service.GlobalAlarmServiceImpl;
import com.ruoyi.common.utils.spring.SpringUtils;
import lombok.extern.slf4j.Slf4j;
import org.eclipse.paho.client.mqttv3.*;
import java.nio.charset.StandardCharsets;
import java.util.Arrays;
/**
 * @Description: mqtt回调处理类
 * @ClassName: MqttConsumerCallback
 * @Author: åˆ˜è‹ä¹‰
 * @Date: 2023å¹´05月29日9:55
 * @Version: 1.0
 **/
@Slf4j(topic = "mqtt")
public class MqttConsumerCallback implements MqttCallbackExtended {
    private MqttClient client;
    private MqttConnectOptions options;
    private String[] topic;
    private int[] qos;
    public MqttConsumerCallback(MqttClient client, MqttConnectOptions options, String[] topic, int[] qos) {
        this.client = client;
        this.options = options;
        this.topic = topic;
        this.qos = qos;
    }
    /**
     * æ–­å¼€é‡è¿ž
     */
    @Override
    public void connectionLost(Throwable cause) {
        log.info("MQTT连接断开,发起重连......");
        try {
            while (!client.isConnected()) {
                Thread.sleep(5000);
                if (null != client && !client.isConnected()) {
                    client.reconnect();
                    log.error("尝试重新连接");
                } else {
                    client.connect(options);
                    log.error("尝试建立新连接");
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    /**
     * æŽ¥æ”¶åˆ°æ¶ˆæ¯è°ƒç”¨ä»¤ç‰Œä¸­è°ƒç”¨
     */
    @Override
    public void deliveryComplete(IMqttDeliveryToken token) {
        //log.info("deliveryComplete---------" + Arrays.toString(topic));
    }
    /**
     * æ¶ˆæ¯å¤„理
     */
    @Override
    public void messageArrived(String topic, MqttMessage message) {
        try {
            // subscribe后得到的消息会执行到这里面
            log.info("接收消息 ã€ä¸»é¢˜ã€‘:" + topic + " ã€å†…容】:" + new String(message.getPayload()));
            //进行业务处理(接收报警数据)
            GlobalAlarmServiceImpl globalAlarmService = SpringUtils.getBean(GlobalAlarmServiceImpl.class);
            globalAlarmService.receiveAlarm(topic, new String(message.getPayload(), StandardCharsets.UTF_8));
        } catch (Exception e) {
            log.info("处理mqtt消息异常:" + e);
        }
    }
    /**
     * mqtt连接后订阅主题
     */
    @Override
    public void connectComplete(boolean b, String s) {
        try {
            if (null != topic && null != qos) {
                if (client.isConnected()) {
                    client.subscribe(topic, qos);
                    log.info("mqtt连接成功,客户端ID:" + PropertiesUtil.MQTT_CLIENT_ID);
                    log.info("--订阅主题::" + Arrays.toString(topic));
                } else {
                    log.info("mqtt连接失败,客户端ID:" + PropertiesUtil.MQTT_CLIENT_ID);
                }
            }
        } catch (Exception e) {
            log.info("mqtt订阅主题异常:" + e);
        }
    }
}
ard-work/src/main/java/com/ruoyi/utils/mqtt/PropertiesUtil.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,54 @@
package com.ruoyi.utils.mqtt;
import org.springframework.beans.factory.config.YamlPropertiesFactoryBean;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.Resource;
import org.springframework.stereotype.Component;
import java.util.Objects;
import java.util.Properties;
/**
 * @Description: èŽ·å–é…ç½®ä¿¡æ¯
 * @ClassName: PropertiesUtil
 * @Author: åˆ˜è‹ä¹‰
 * @Date: 2023å¹´06月06日9:40
 * @Version: 1.0
 **/
@Component
public class PropertiesUtil {
    public static String MQTT_HOST;
    public static String MQTT_CLIENT_ID;
    public static String MQTT_USER_NAME;
    public static String MQTT_PASSWORD;
    public static String MQTT_TOPIC;
    public static Integer MQTT_TIMEOUT;
    public static Integer MQTT_KEEP_ALIVE;
    public static Boolean MQTT_ENABLED;
    static {
        MQTT_HOST = getYmlNew("mqtt.host");
        MQTT_CLIENT_ID = getYmlNew("mqtt.clientId");
        MQTT_USER_NAME = getYmlNew("mqtt.username");
        MQTT_PASSWORD = getYmlNew("mqtt.password");
        MQTT_TOPIC = getYmlNew("mqtt.topic");
        MQTT_TIMEOUT = Integer.valueOf(Objects.requireNonNull(getYmlNew("mqtt.timeout")));
        MQTT_KEEP_ALIVE = Integer.valueOf(Objects.requireNonNull(getYmlNew("mqtt.keepalive")));
        MQTT_ENABLED = Boolean.valueOf(getYmlNew("mqtt.enabled"));
    }
    public static String getYmlNew(String key) {
        Resource resource = new ClassPathResource("application-ard.yml");
        Properties properties;
        try {
            YamlPropertiesFactoryBean yamlFactory = new YamlPropertiesFactoryBean();
            yamlFactory.setResources(resource);
            properties = yamlFactory.getObject();
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
        assert properties != null;
        return properties.get(key).toString();
    }
}
ard-work/src/main/resources/mapper/alarm/ArdAlarmTubeMapper.xml
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,117 @@
<?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.ruoyi.alarm.tubeAlarm.mapper.ArdAlarmTubeMapper">
    <resultMap type="ArdAlarmTube" id="ArdAlarmTubeResult">
        <result property="id"    column="id"    />
        <result property="host"    column="host"    />
        <result property="tubeId"    column="tube_id"    />
        <result property="tubeName"    column="tube_name"    />
        <result property="tubeType"    column="tube_type"    />
        <result property="pipeDiameter"    column="pipe_diameter"    />
        <result property="color"    column="color"    />
        <result property="position"    column="position"    />
        <result property="type"    column="type"    />
        <result property="alarmType"    column="alarm_type"    />
        <result property="alarmTime"    column="alarm_time"    />
        <result property="watcher"    column="watcher"    />
        <result property="createTime"    column="create_time"    />
        <result property="viewTime"    column="view_time"    />
    </resultMap>
    <sql id="selectArdAlarmTubeVo">
        select id, host, tube_id, tube_name, tube_type, pipe_diameter, color, position, type, alarm_type, alarm_time, watcher, create_time, view_time from ard_alarm_tube
    </sql>
    <select id="selectArdAlarmTubeList" parameterType="ArdAlarmTube" resultMap="ArdAlarmTubeResult">
        <include refid="selectArdAlarmTubeVo"/>
        <where>
            <if test="host != null  and host != ''"> and host = #{host}</if>
            <if test="tubeId != null "> and tube_id = #{tubeId}</if>
            <if test="tubeName != null  and tubeName != ''"> and tube_name like '%'||#{tubeName}||'%'</if>
            <if test="tubeType != null  and tubeType != ''"> and tube_type = #{tubeType}</if>
            <if test="pipeDiameter != null  and pipeDiameter != ''"> and pipe_diameter = #{pipeDiameter}</if>
            <if test="color != null  and color != ''"> and color = #{color}</if>
            <if test="position != null  and position != ''"> and position = #{position}</if>
            <if test="type != null  and type != ''"> and type = #{type}</if>
            <if test="alarmType != null  and alarmType != ''"> and alarm_type = #{alarmType}</if>
            <if test="alarmTime != null "> and alarm_time = #{alarmTime}</if>
            <if test="watcher != null  and watcher != ''"> and watcher = #{watcher}</if>
            <if test="viewTime != null "> and view_time = #{viewTime}</if>
        </where>
    </select>
    <select id="selectArdAlarmTubeById" parameterType="String" resultMap="ArdAlarmTubeResult">
        <include refid="selectArdAlarmTubeVo"/>
        where id = #{id}
    </select>
    <insert id="insertArdAlarmTube" parameterType="ArdAlarmTube">
        insert into ard_alarm_tube
        <trim prefix="(" suffix=")" suffixOverrides=",">
            <if test="id != null">id,</if>
            <if test="host != null">host,</if>
            <if test="tubeId != null">tube_id,</if>
            <if test="tubeName != null">tube_name,</if>
            <if test="tubeType != null">tube_type,</if>
            <if test="pipeDiameter != null">pipe_diameter,</if>
            <if test="color != null">color,</if>
            <if test="position != null">position,</if>
            <if test="type != null">type,</if>
            <if test="alarmType != null">alarm_type,</if>
            <if test="alarmTime != null">alarm_time,</if>
            <if test="watcher != null">watcher,</if>
            <if test="createTime != null">create_time,</if>
            <if test="viewTime != null">view_time,</if>
         </trim>
        <trim prefix="values (" suffix=")" suffixOverrides=",">
            <if test="id != null">#{id},</if>
            <if test="host != null">#{host},</if>
            <if test="tubeId != null">#{tubeId},</if>
            <if test="tubeName != null">#{tubeName},</if>
            <if test="tubeType != null">#{tubeType},</if>
            <if test="pipeDiameter != null">#{pipeDiameter},</if>
            <if test="color != null">#{color},</if>
            <if test="position != null">#{position},</if>
            <if test="type != null">#{type},</if>
            <if test="alarmType != null">#{alarmType},</if>
            <if test="alarmTime != null">#{alarmTime},</if>
            <if test="watcher != null">#{watcher},</if>
            <if test="createTime != null">#{createTime},</if>
            <if test="viewTime != null">#{viewTime},</if>
         </trim>
    </insert>
    <update id="updateArdAlarmTube" parameterType="ArdAlarmTube">
        update ard_alarm_tube
        <trim prefix="SET" suffixOverrides=",">
            <if test="host != null">host = #{host},</if>
            <if test="tubeId != null">tube_id = #{tubeId},</if>
            <if test="tubeName != null">tube_name = #{tubeName},</if>
            <if test="tubeType != null">tube_type = #{tubeType},</if>
            <if test="pipeDiameter != null">pipe_diameter = #{pipeDiameter},</if>
            <if test="color != null">color = #{color},</if>
            <if test="position != null">position = #{position},</if>
            <if test="type != null">type = #{type},</if>
            <if test="alarmType != null">alarm_type = #{alarmType},</if>
            <if test="alarmTime != null">alarm_time = #{alarmTime},</if>
            <if test="watcher != null">watcher = #{watcher},</if>
            <if test="createTime != null">create_time = #{createTime},</if>
            <if test="viewTime != null">view_time = #{viewTime},</if>
        </trim>
        where id = #{id}
    </update>
    <delete id="deleteArdAlarmTubeById" parameterType="String">
        delete from ard_alarm_tube where id = #{id}
    </delete>
    <delete id="deleteArdAlarmTubeByIds" parameterType="String">
        delete from ard_alarm_tube where id in
        <foreach item="id" collection="array" open="(" separator="," close=")">
            #{id}
        </foreach>
    </delete>
</mapper>
ard-work/src/main/resources/mapper/alarmpoints/ArdTubesDetailsMapper.xml
@@ -68,7 +68,7 @@
    </select>
    <select id="selectArdTubesDetailsByReelNumber" parameterType="String" resultMap="ArdTubesDetailsResult">
        <include refid="selectArdTubesDetailsVo"/>
        where reel_number = #{reelNumber} and tube_id=#{tubeId}
        where reel_number = #{reelNumber}
    </select>
    <insert id="insertArdTubesDetails" parameterType="ArdTubesDetails">
        insert into ard_tubes_details
ard-work/src/main/resources/mapper/inspect/ArdVideoInspectRecordMapper.xml
@@ -15,7 +15,7 @@
    </resultMap>
    <sql id="selectArdVideoInspectRecordVo">
        select id, start_time, end_time, record_file_path, step_id, dept_id, user_id from ard_video_inspect_record
        select id, start_time, end_time, record_file_path, step_id, dept_id, user_id,well_name from ard_video_inspect_record
    </sql>
    <select id="selectArdVideoInspectRecordList" parameterType="ArdVideoInspectRecord" resultMap="ArdVideoInspectRecordResult">
@@ -36,7 +36,7 @@
            <if test="startTime != null  and startTime != ''">and start_time like ('${startTime}%')</if>
            <if test="stepId != null  and stepId != ''">and step_id = #{stepId}</if>
        </where>
        order by start_time desc
    </select>
    <!--按月份统计文件数量-->
    <select id="selectArdVideoInspectRecordCountByStartMonth" parameterType="String" resultType="java.util.HashMap">
ruoyi-admin/src/main/resources/application-ard.yml
@@ -14,3 +14,13 @@
  retry-count: 0 # è¯·æ±‚失败后重试次数,默认为0次不重试
  ssl-protocol: SSLv3 # å•向验证的HTTPS的默认SSL协议,默认为SSLv3
  logEnabled: true # æ‰“开或关闭日志,默认为true
#mqtt
mqtt:
  host: tcp://192.168.1.15:1883
  clientId: m3
  username: admin
  password: xzx12345
  topic: tube
  timeout: 100
  keepalive: 60
  enabled: true
ruoyi-admin/src/main/resources/application-druid.yml
@@ -6,12 +6,12 @@
        druid:
            # ä¸»åº“数据源
            master:
                url: jdbc:postgresql://111.40.46.199:15432/ry-vue?stringtype=unspecified
                username: postgres
                password: Yykj.2021
#                url: jdbc:postgresql://127.0.0.1:5432/ry-vue?stringtype=unspecified
#                url: jdbc:postgresql://111.40.46.199:15432/ry-vue?stringtype=unspecified
#                username: postgres
#                password: postgres
#                password: Yykj.2021
                url: jdbc:postgresql://192.168.1.15:5432/ry-vue?stringtype=unspecified
                username: postgres
                password: postgres
            # ä»Žåº“数据源
            slave:
                # ä»Žæ•°æ®æºå¼€å…³/默认关闭
ruoyi-admin/src/main/resources/application.yml
@@ -36,7 +36,7 @@
# æ—¥å¿—配置
logging:
  level:
    com.ruoyi.inspect: debug
    com.ruoyi.inspect: info
    org.springframework: warn
# ç”¨æˆ·é…ç½®
ruoyi-admin/src/main/resources/logback.xml
@@ -134,6 +134,19 @@
            <pattern>${log.pattern}</pattern>
        </encoder>
    </appender>
    <!--mqtt日志输出-->
    <appender name="mqtt" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${log.path}/mqtt.log</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!--按天回滚daily-->
            <fileNamePattern>${log.path}/mqtt.%d{yyyy-MM-dd}.log</fileNamePattern>
            <!--日志最大的历史60天-->
            <maxHistory>60</maxHistory>
        </rollingPolicy>
        <encoder>
            <pattern>${log.pattern}</pattern>
        </encoder>
    </appender>
    <!--PatrolInspectionTask日志输出-->
    <appender name="PatrolInspectionTask" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${log.path}/PatrolInspectionTask.log</file>
@@ -186,8 +199,12 @@
    <logger name="websocket" level="INFO">
        <appender-ref ref="websocket"/>
    </logger>
    <!--websocket日志打印等级-->
    <!--光电巡检日志打印等级-->
    <logger name="PatrolInspectionTask" level="INFO">
        <appender-ref ref="PatrolInspectionTask"/>
    </logger>
    <!--mqtt日志打印等级-->
    <logger name="mqtt" level="INFO">
        <appender-ref ref="mqtt"/>
    </logger>
</configuration> 
ruoyi-framework/src/main/java/com/ruoyi/framework/aspectj/LogAspect.java
@@ -4,6 +4,7 @@
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.AfterThrowing;
@@ -34,11 +35,12 @@
 */
@Aspect
@Component
public class LogAspect
{
public class LogAspect {
    private static final Logger log = LoggerFactory.getLogger(LogAspect.class);
    /** æŽ’除敏感属性字段 */
    /**
     * æŽ’除敏感属性字段
     */
    public static final String[] EXCLUDE_PROPERTIES = { "password", "oldPassword", "newPassword", "confirmPassword" };
    /**
@@ -47,8 +49,7 @@
     * @param joinPoint åˆ‡ç‚¹
     */
    @AfterReturning(pointcut = "@annotation(controllerLog)", returning = "jsonResult")
    public void doAfterReturning(JoinPoint joinPoint, Log controllerLog, Object jsonResult)
    {
    public void doAfterReturning(JoinPoint joinPoint, Log controllerLog, Object jsonResult) {
        handleLog(joinPoint, controllerLog, null, jsonResult);
    }
@@ -59,15 +60,12 @@
     * @param e å¼‚常
     */
    @AfterThrowing(value = "@annotation(controllerLog)", throwing = "e")
    public void doAfterThrowing(JoinPoint joinPoint, Log controllerLog, Exception e)
    {
    public void doAfterThrowing(JoinPoint joinPoint, Log controllerLog, Exception e) {
        handleLog(joinPoint, controllerLog, e, null);
    }
    protected void handleLog(final JoinPoint joinPoint, Log controllerLog, final Exception e, Object jsonResult)
    {
        try
        {
    protected void handleLog(final JoinPoint joinPoint, Log controllerLog, final Exception e, Object jsonResult) {
        try {
            // èŽ·å–å½“å‰çš„ç”¨æˆ·
            LoginUser loginUser = SecurityUtils.getLoginUser();
@@ -78,13 +76,11 @@
            String ip = IpUtils.getIpAddr(ServletUtils.getRequest());
            operLog.setOperIp(ip);
            operLog.setOperUrl(StringUtils.substring(ServletUtils.getRequest().getRequestURI(), 0, 255));
            if (loginUser != null)
            {
            if (loginUser != null) {
                operLog.setOperName(loginUser.getUsername());
            }
            if (e != null)
            {
            if (e != null) {
                operLog.setStatus(BusinessStatus.FAIL.ordinal());
                operLog.setErrorMsg(StringUtils.substring(e.getMessage(), 0, 2000));
            }
@@ -98,15 +94,14 @@
            getControllerMethodDescription(joinPoint, controllerLog, operLog, jsonResult);
            //判断状态码
            Map resultMap=(Map)jsonResult;
            if(resultMap.get("code").equals(500))
            {
            if (StringUtils.isNotNull(resultMap)) {
                if (resultMap.get("code").equals(500)) {
                operLog.setStatus(BusinessStatus.FAIL.ordinal());
                }
            }
            // ä¿å­˜æ•°æ®åº“
            AsyncManager.me().execute(AsyncFactory.recordOper(operLog));
        }
        catch (Exception exp)
        {
        } catch (Exception exp) {
            // è®°å½•本地异常日志
            log.error("异常信息:{}", exp.getMessage());
            exp.printStackTrace();
@@ -120,8 +115,7 @@
     * @param operLog æ“ä½œæ—¥å¿—
     * @throws Exception
     */
    public void getControllerMethodDescription(JoinPoint joinPoint, Log log, SysOperLog operLog, Object jsonResult) throws Exception
    {
    public void getControllerMethodDescription(JoinPoint joinPoint, Log log, SysOperLog operLog, Object jsonResult) throws Exception {
        // è®¾ç½®action动作
        operLog.setBusinessType(log.businessType().ordinal());
        // è®¾ç½®æ ‡é¢˜
@@ -129,14 +123,12 @@
        // è®¾ç½®æ“ä½œäººç±»åˆ«
        operLog.setOperatorType(log.operatorType().ordinal());
        // æ˜¯å¦éœ€è¦ä¿å­˜request,参数和值
        if (log.isSaveRequestData())
        {
        if (log.isSaveRequestData()) {
            // èŽ·å–å‚æ•°çš„ä¿¡æ¯ï¼Œä¼ å…¥åˆ°æ•°æ®åº“ä¸­ã€‚
            setRequestValue(joinPoint, operLog);
        }
        // æ˜¯å¦éœ€è¦ä¿å­˜response,参数和值
        if (log.isSaveResponseData() && StringUtils.isNotNull(jsonResult))
        {
        if (log.isSaveResponseData() && StringUtils.isNotNull(jsonResult)) {
            operLog.setJsonResult(StringUtils.substring(JSON.toJSONString(jsonResult), 0, 2000));
        }
    }
@@ -147,16 +139,12 @@
     * @param operLog æ“ä½œæ—¥å¿—
     * @throws Exception å¼‚常
     */
    private void setRequestValue(JoinPoint joinPoint, SysOperLog operLog) throws Exception
    {
    private void setRequestValue(JoinPoint joinPoint, SysOperLog operLog) throws Exception {
        String requestMethod = operLog.getRequestMethod();
        if (HttpMethod.PUT.name().equals(requestMethod) || HttpMethod.POST.name().equals(requestMethod))
        {
        if (HttpMethod.PUT.name().equals(requestMethod) || HttpMethod.POST.name().equals(requestMethod)) {
            String params = argsArrayToString(joinPoint.getArgs());
            operLog.setOperParam(StringUtils.substring(params, 0, 2000));
        }
        else
        {
        } else {
            Map<?, ?> paramsMap = ServletUtils.getParamMap(ServletUtils.getRequest());
            operLog.setOperParam(StringUtils.substring(JSON.toJSONString(paramsMap, excludePropertyPreFilter()), 0, 2000));
        }
@@ -165,22 +153,15 @@
    /**
     * å‚数拼装
     */
    private String argsArrayToString(Object[] paramsArray)
    {
    private String argsArrayToString(Object[] paramsArray) {
        String params = "";
        if (paramsArray != null && paramsArray.length > 0)
        {
            for (Object o : paramsArray)
            {
                if (StringUtils.isNotNull(o) && !isFilterObject(o))
                {
                    try
                    {
        if (paramsArray != null && paramsArray.length > 0) {
            for (Object o : paramsArray) {
                if (StringUtils.isNotNull(o) && !isFilterObject(o)) {
                    try {
                        String jsonObj = JSON.toJSONString(o, excludePropertyPreFilter());
                        params += jsonObj.toString() + " ";
                    }
                    catch (Exception e)
                    {
                    } catch (Exception e) {
                    }
                }
            }
@@ -191,8 +172,7 @@
    /**
     * å¿½ç•¥æ•æ„Ÿå±žæ€§
     */
    public PropertyPreExcludeFilter excludePropertyPreFilter()
    {
    public PropertyPreExcludeFilter excludePropertyPreFilter() {
        return new PropertyPreExcludeFilter().addExcludes(EXCLUDE_PROPERTIES);
    }
@@ -203,26 +183,18 @@
     * @return å¦‚果是需要过滤的对象,则返回true;否则返回false。
     */
    @SuppressWarnings("rawtypes")
    public boolean isFilterObject(final Object o)
    {
    public boolean isFilterObject(final Object o) {
        Class<?> clazz = o.getClass();
        if (clazz.isArray())
        {
        if (clazz.isArray()) {
            return clazz.getComponentType().isAssignableFrom(MultipartFile.class);
        }
        else if (Collection.class.isAssignableFrom(clazz))
        {
        } else if (Collection.class.isAssignableFrom(clazz)) {
            Collection collection = (Collection) o;
            for (Object value : collection)
            {
            for (Object value : collection) {
                return value instanceof MultipartFile;
            }
        }
        else if (Map.class.isAssignableFrom(clazz))
        {
        } else if (Map.class.isAssignableFrom(clazz)) {
            Map map = (Map) o;
            for (Object value : map.entrySet())
            {
            for (Object value : map.entrySet()) {
                Map.Entry entry = (Map.Entry) value;
                return entry.getValue() instanceof MultipartFile;
            }