feat(device): 增加设备故障记录功能并完善监控逻辑

- 在 DeviceSsjMapper.xml 中添加 ipAddress 和 port 字段映射
- 调整 SQL 查询语句字段顺序以适配新增字段
- MonitoringThread.java 引入 BasFaultRecord 相关类及工具类
- 初始化 basFaultRecordService 和 mydoJobService 服务实例
- 实现设备状态异常检测逻辑,并创建或更新故障记录
- 新增 BasFaultRecord 实体类用于存储设备故障信息
- 创建 BasFaultRecordController 控制器提供 RESTful 接口
- 添加 BasFaultRecordMapper 接口定义数据库操作方法
- 编写 BasFaultRecordMapper.xml 配置文件实现 CRUD 操作
- 实现 BasFaultRecordServiceImpl 业务逻辑处理层
- 定义 IBasFaultRecordService 接口规范服务行为
This commit is contained in:
liuhanqing
2025-12-11 09:19:07 +08:00
parent 2fa7a06e76
commit cbda1d15e8
9 changed files with 645 additions and 2 deletions

View File

@@ -0,0 +1,104 @@
package com.ruoyi.bas.fault.controller;
import java.util.List;
import javax.servlet.http.HttpServletResponse;
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.bas.fault.domain.BasFaultRecord;
import com.ruoyi.bas.fault.service.IBasFaultRecordService;
import com.ruoyi.common.utils.poi.ExcelUtil;
import com.ruoyi.common.core.page.TableDataInfo;
/**
* 设备故障记录Controller
*
* @author ruoyi
* @date 2025-12-11
*/
@RestController
@RequestMapping("/bas/faultRecord")
public class BasFaultRecordController extends BaseController
{
@Autowired
private IBasFaultRecordService basFaultRecordService;
/**
* 查询设备故障记录列表
*/
@PreAuthorize("@ss.hasPermi('bas:faultRecord:list')")
@GetMapping("/list")
public TableDataInfo list(BasFaultRecord basFaultRecord)
{
startPage();
List<BasFaultRecord> list = basFaultRecordService.selectBasFaultRecordList(basFaultRecord);
return getDataTable(list);
}
/**
* 导出设备故障记录列表
*/
@PreAuthorize("@ss.hasPermi('bas:faultRecord:export')")
@Log(title = "设备故障记录", businessType = BusinessType.EXPORT)
@PostMapping("/export")
public void export(HttpServletResponse response, BasFaultRecord basFaultRecord)
{
List<BasFaultRecord> list = basFaultRecordService.selectBasFaultRecordList(basFaultRecord);
ExcelUtil<BasFaultRecord> util = new ExcelUtil<BasFaultRecord>(BasFaultRecord.class);
util.exportExcel(response, list, "设备故障记录数据");
}
/**
* 获取设备故障记录详细信息
*/
@PreAuthorize("@ss.hasPermi('bas:faultRecord:query')")
@GetMapping(value = "/{id}")
public AjaxResult getInfo(@PathVariable("id") String id)
{
return success(basFaultRecordService.selectBasFaultRecordById(id));
}
/**
* 新增设备故障记录
*/
@PreAuthorize("@ss.hasPermi('bas:faultRecord:add')")
@Log(title = "设备故障记录", businessType = BusinessType.INSERT)
@PostMapping
public AjaxResult add(@RequestBody BasFaultRecord basFaultRecord)
{
return toAjax(basFaultRecordService.insertBasFaultRecord(basFaultRecord));
}
/**
* 修改设备故障记录
*/
@PreAuthorize("@ss.hasPermi('bas:faultRecord:edit')")
@Log(title = "设备故障记录", businessType = BusinessType.UPDATE)
@PutMapping
public AjaxResult edit(@RequestBody BasFaultRecord basFaultRecord)
{
return toAjax(basFaultRecordService.updateBasFaultRecord(basFaultRecord));
}
/**
* 删除设备故障记录
*/
@PreAuthorize("@ss.hasPermi('bas:faultRecord:remove')")
@Log(title = "设备故障记录", businessType = BusinessType.DELETE)
@DeleteMapping("/{ids}")
public AjaxResult remove(@PathVariable String[] ids)
{
return toAjax(basFaultRecordService.deleteBasFaultRecordByIds(ids));
}
}

View File

@@ -0,0 +1,172 @@
package com.ruoyi.bas.fault.domain;
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;
/**
* 设备故障记录对象 bas_fault_record
*
* @author ruoyi
* @date 2025-12-11
*/
public class BasFaultRecord extends BaseEntity
{
private static final long serialVersionUID = 1L;
/** id 主键 */
private String id;
/** 设备id */
@Excel(name = "设备id")
private String deviceId;
/** 设备名称 */
@Excel(name = "设备名称")
private String deviceName;
/** 设备类型 */
@Excel(name = "设备类型")
private String deviceType;
/** 任务号 */
@Excel(name = "任务号")
private String taskNo;
/** 作业id */
@Excel(name = "作业id ")
private String jobId;
/** 报警信息 */
@Excel(name = "报警信息")
private String fault;
/** 报警开始时间 */
@Excel(name = "报警开始时间")
private String startTime;
/** 报警结束时间 */
@Excel(name = "报警结束时间")
private String finishTime;
/** 仓库 */
@Excel(name = "仓库")
private String warehouseId;
public void setId(String id)
{
this.id = id;
}
public String getId()
{
return id;
}
public void setDeviceId(String deviceId)
{
this.deviceId = deviceId;
}
public String getDeviceId()
{
return deviceId;
}
public void setDeviceName(String deviceName)
{
this.deviceName = deviceName;
}
public String getDeviceName()
{
return deviceName;
}
public void setDeviceType(String deviceType)
{
this.deviceType = deviceType;
}
public String getDeviceType()
{
return deviceType;
}
public void setTaskNo(String taskNo)
{
this.taskNo = taskNo;
}
public String getTaskNo()
{
return taskNo;
}
public void setJobId(String jobId)
{
this.jobId = jobId;
}
public String getJobId()
{
return jobId;
}
public void setFault(String fault)
{
this.fault = fault;
}
public String getFault()
{
return fault;
}
public void setStartTime(String startTime)
{
this.startTime = startTime;
}
public String getStartTime()
{
return startTime;
}
public void setFinishTime(String finishTime)
{
this.finishTime = finishTime;
}
public String getFinishTime()
{
return finishTime;
}
public void setWarehouseId(String warehouseId)
{
this.warehouseId = warehouseId;
}
public String getWarehouseId()
{
return warehouseId;
}
@Override
public String toString() {
return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
.append("id", getId())
.append("deviceId", getDeviceId())
.append("deviceName", getDeviceName())
.append("deviceType", getDeviceType())
.append("taskNo", getTaskNo())
.append("jobId", getJobId())
.append("fault", getFault())
.append("startTime", getStartTime())
.append("finishTime", getFinishTime())
.append("warehouseId", getWarehouseId())
.toString();
}
}

View File

@@ -0,0 +1,61 @@
package com.ruoyi.bas.fault.mapper;
import java.util.List;
import com.ruoyi.bas.fault.domain.BasFaultRecord;
/**
* 设备故障记录Mapper接口
*
* @author ruoyi
* @date 2025-12-11
*/
public interface BasFaultRecordMapper
{
/**
* 查询设备故障记录
*
* @param id 设备故障记录主键
* @return 设备故障记录
*/
public BasFaultRecord selectBasFaultRecordById(String id);
/**
* 查询设备故障记录列表
*
* @param basFaultRecord 设备故障记录
* @return 设备故障记录集合
*/
public List<BasFaultRecord> selectBasFaultRecordList(BasFaultRecord basFaultRecord);
/**
* 新增设备故障记录
*
* @param basFaultRecord 设备故障记录
* @return 结果
*/
public int insertBasFaultRecord(BasFaultRecord basFaultRecord);
/**
* 修改设备故障记录
*
* @param basFaultRecord 设备故障记录
* @return 结果
*/
public int updateBasFaultRecord(BasFaultRecord basFaultRecord);
/**
* 删除设备故障记录
*
* @param id 设备故障记录主键
* @return 结果
*/
public int deleteBasFaultRecordById(String id);
/**
* 批量删除设备故障记录
*
* @param ids 需要删除的数据主键集合
* @return 结果
*/
public int deleteBasFaultRecordByIds(String[] ids);
}

View File

@@ -0,0 +1,61 @@
package com.ruoyi.bas.fault.service;
import java.util.List;
import com.ruoyi.bas.fault.domain.BasFaultRecord;
/**
* 设备故障记录Service接口
*
* @author ruoyi
* @date 2025-12-11
*/
public interface IBasFaultRecordService
{
/**
* 查询设备故障记录
*
* @param id 设备故障记录主键
* @return 设备故障记录
*/
public BasFaultRecord selectBasFaultRecordById(String id);
/**
* 查询设备故障记录列表
*
* @param basFaultRecord 设备故障记录
* @return 设备故障记录集合
*/
public List<BasFaultRecord> selectBasFaultRecordList(BasFaultRecord basFaultRecord);
/**
* 新增设备故障记录
*
* @param basFaultRecord 设备故障记录
* @return 结果
*/
public int insertBasFaultRecord(BasFaultRecord basFaultRecord);
/**
* 修改设备故障记录
*
* @param basFaultRecord 设备故障记录
* @return 结果
*/
public int updateBasFaultRecord(BasFaultRecord basFaultRecord);
/**
* 批量删除设备故障记录
*
* @param ids 需要删除的设备故障记录主键集合
* @return 结果
*/
public int deleteBasFaultRecordByIds(String[] ids);
/**
* 删除设备故障记录信息
*
* @param id 设备故障记录主键
* @return 结果
*/
public int deleteBasFaultRecordById(String id);
}

View File

@@ -0,0 +1,93 @@
package com.ruoyi.bas.fault.service.impl;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.ruoyi.bas.fault.mapper.BasFaultRecordMapper;
import com.ruoyi.bas.fault.domain.BasFaultRecord;
import com.ruoyi.bas.fault.service.IBasFaultRecordService;
/**
* 设备故障记录Service业务层处理
*
* @author ruoyi
* @date 2025-12-11
*/
@Service
public class BasFaultRecordServiceImpl implements IBasFaultRecordService
{
@Autowired
private BasFaultRecordMapper basFaultRecordMapper;
/**
* 查询设备故障记录
*
* @param id 设备故障记录主键
* @return 设备故障记录
*/
@Override
public BasFaultRecord selectBasFaultRecordById(String id)
{
return basFaultRecordMapper.selectBasFaultRecordById(id);
}
/**
* 查询设备故障记录列表
*
* @param basFaultRecord 设备故障记录
* @return 设备故障记录
*/
@Override
public List<BasFaultRecord> selectBasFaultRecordList(BasFaultRecord basFaultRecord)
{
return basFaultRecordMapper.selectBasFaultRecordList(basFaultRecord);
}
/**
* 新增设备故障记录
*
* @param basFaultRecord 设备故障记录
* @return 结果
*/
@Override
public int insertBasFaultRecord(BasFaultRecord basFaultRecord)
{
return basFaultRecordMapper.insertBasFaultRecord(basFaultRecord);
}
/**
* 修改设备故障记录
*
* @param basFaultRecord 设备故障记录
* @return 结果
*/
@Override
public int updateBasFaultRecord(BasFaultRecord basFaultRecord)
{
return basFaultRecordMapper.updateBasFaultRecord(basFaultRecord);
}
/**
* 批量删除设备故障记录
*
* @param ids 需要删除的设备故障记录主键
* @return 结果
*/
@Override
public int deleteBasFaultRecordByIds(String[] ids)
{
return basFaultRecordMapper.deleteBasFaultRecordByIds(ids);
}
/**
* 删除设备故障记录信息
*
* @param id 设备故障记录主键
* @return 结果
*/
@Override
public int deleteBasFaultRecordById(String id)
{
return basFaultRecordMapper.deleteBasFaultRecordById(id);
}
}

View File

@@ -1,13 +1,25 @@
package com.ruoyi.schedule.scheduleTask.monit; package com.ruoyi.schedule.scheduleTask.monit;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.convert.Convert;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.IdUtil;
import cn.hutool.core.util.ObjUtil;
import com.ruoyi.bas.fault.domain.BasFaultRecord;
import com.ruoyi.bas.fault.service.IBasFaultRecordService;
import com.ruoyi.common.utils.spring.SpringUtils; import com.ruoyi.common.utils.spring.SpringUtils;
import com.ruoyi.device.ddj.domain.MsgDdj;
import com.ruoyi.device.ddj.service.IMsgDdjService; import com.ruoyi.device.ddj.service.IMsgDdjService;
import com.ruoyi.device.ssj.domain.DeviceSsj; import com.ruoyi.device.ssj.domain.DeviceSsj;
import com.ruoyi.device.ssj.service.IDeviceSsjService; import com.ruoyi.device.ssj.service.IDeviceSsjService;
import com.ruoyi.job.domain.MydoJob;
import com.ruoyi.job.service.IMydoJobService;
import com.ruoyi.schedule.plcRead.ddj.PlcDdjRead; import com.ruoyi.schedule.plcRead.ddj.PlcDdjRead;
import com.ruoyi.schedule.plcRead.ssj.PlcSsjRead; import com.ruoyi.schedule.plcRead.ssj.PlcSsjRead;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import java.util.List;
/** /**
* 监控线程 * 监控线程
*/ */
@@ -18,11 +30,15 @@ public class MonitoringThread implements Runnable {
private IDeviceSsjService deviceSsjService; private IDeviceSsjService deviceSsjService;
private IMsgDdjService msgDdjService; private IMsgDdjService msgDdjService;
private IBasFaultRecordService basFaultRecordService;
private IMydoJobService mydoJobService;
public void init() { public void init() {
deviceSsjService = SpringUtils.getBean(IDeviceSsjService.class); deviceSsjService = SpringUtils.getBean(IDeviceSsjService.class);
msgDdjService = SpringUtils.getBean(IMsgDdjService.class); msgDdjService = SpringUtils.getBean(IMsgDdjService.class);
basFaultRecordService = SpringUtils.getBean(IBasFaultRecordService.class);
mydoJobService = SpringUtils.getBean(IMydoJobService.class);
} }
@Override @Override
@@ -34,7 +50,43 @@ public class MonitoringThread implements Runnable {
deviceSsjService.updateDeviceSsj(deviceSsj); deviceSsjService.updateDeviceSsj(deviceSsj);
} }
for (String ddjCode : PlcDdjRead.deviceDdjMap.keySet()) { for (String ddjCode : PlcDdjRead.deviceDdjMap.keySet()) {
msgDdjService.updateMsgDdj(PlcDdjRead.deviceDdjMap.get(ddjCode)); MsgDdj msgDdj = PlcDdjRead.deviceDdjMap.get(ddjCode);
msgDdjService.updateMsgDdj(msgDdj);
if (msgDdj.getSbzt() > 1000) {
BasFaultRecord param = new BasFaultRecord();
param.setTaskNo(msgDdj.getRwh() + "");
param.setDeviceId(String.valueOf(msgDdj.getId()));
param.setDeviceType("DDJ");
param.setJobId("0");
List<BasFaultRecord> basFaultRecords = basFaultRecordService.selectBasFaultRecordList(param);
if (CollUtil.isEmpty(basFaultRecords)) {
BasFaultRecord faultRecord = new BasFaultRecord();
faultRecord.setId(IdUtil.fastSimpleUUID());
faultRecord.setDeviceId(String.valueOf(msgDdj.getId()));
faultRecord.setDeviceName(msgDdj.getName());
faultRecord.setDeviceType("DDJ");
faultRecord.setJobId("0");
faultRecord.setTaskNo(msgDdj.getRwh() + "");
faultRecord.setFault(msgDdj.getSbzt() + "");
faultRecord.setStartTime(DateUtil.formatDateTime(DateUtil.date()));
//faultRecord.setWarehouseId(mydoJob.getWarehouseId());
basFaultRecordService.insertBasFaultRecord(faultRecord);
}
}
if (msgDdj.getSbzt() < 1000 && msgDdj.getCzfs() == 5){
BasFaultRecord param = new BasFaultRecord();
param.setTaskNo(msgDdj.getRwh() + "");
param.setDeviceId(String.valueOf(msgDdj.getId()));
param.setDeviceType("DDJ");
List<BasFaultRecord> basFaultRecords = basFaultRecordService.selectBasFaultRecordList(param);
if (CollUtil.isNotEmpty(basFaultRecords)) {
BasFaultRecord faultRecord = basFaultRecords.get(0);
faultRecord.setJobId("1");
faultRecord.setFinishTime(DateUtil.formatDateTime(DateUtil.date()));
basFaultRecordService.updateBasFaultRecord(faultRecord);
}
}
} }
try { try {
Thread.sleep(1500); Thread.sleep(1500);

View File

@@ -0,0 +1,98 @@
<?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.bas.fault.mapper.BasFaultRecordMapper">
<resultMap type="BasFaultRecord" id="BasFaultRecordResult">
<result property="id" column="id" />
<result property="deviceId" column="device_id" />
<result property="deviceName" column="device_name" />
<result property="deviceType" column="device_type" />
<result property="taskNo" column="task_no" />
<result property="jobId" column="job_id" />
<result property="fault" column="fault" />
<result property="startTime" column="start_time" />
<result property="finishTime" column="finish_time" />
<result property="warehouseId" column="warehouse_id" />
</resultMap>
<sql id="selectBasFaultRecordVo">
select id, device_id, device_name, device_type, task_no, job_id, fault, start_time, finish_time, warehouse_id from bas_fault_record
</sql>
<select id="selectBasFaultRecordList" parameterType="BasFaultRecord" resultMap="BasFaultRecordResult">
<include refid="selectBasFaultRecordVo"/>
<where>
<if test="deviceId != null and deviceId != ''"> and device_id = #{deviceId}</if>
<if test="deviceName != null and deviceName != ''"> and device_name like concat('%', #{deviceName}, '%')</if>
<if test="deviceType != null and deviceType != ''"> and device_type = #{deviceType}</if>
<if test="taskNo != null and taskNo != ''"> and task_no = #{taskNo}</if>
<if test="jobId != null and jobId != ''"> and job_id = #{jobId}</if>
<if test="fault != null and fault != ''"> and fault = #{fault}</if>
<if test="startTime != null and startTime != ''"> and start_time = #{startTime}</if>
<if test="finishTime != null and finishTime != ''"> and finish_time = #{finishTime}</if>
<if test="warehouseId != null and warehouseId != ''"> and warehouse_id = #{warehouseId}</if>
</where>
</select>
<select id="selectBasFaultRecordById" parameterType="String" resultMap="BasFaultRecordResult">
<include refid="selectBasFaultRecordVo"/>
where id = #{id}
</select>
<insert id="insertBasFaultRecord" parameterType="BasFaultRecord">
insert into bas_fault_record
<trim prefix="(" suffix=")" suffixOverrides=",">
<if test="id != null and id != ''">id,</if>
<if test="deviceId != null and deviceId != ''">device_id,</if>
<if test="deviceName != null and deviceName != ''">device_name,</if>
<if test="deviceType != null and deviceType != ''">device_type,</if>
<if test="taskNo != null">task_no,</if>
<if test="jobId != null">job_id,</if>
<if test="fault != null">fault,</if>
<if test="startTime != null">start_time,</if>
<if test="finishTime != null">finish_time,</if>
<if test="warehouseId != null">warehouse_id,</if>
</trim>
<trim prefix="values (" suffix=")" suffixOverrides=",">
<if test="id != null and id != ''">#{id},</if>
<if test="deviceId != null and deviceId != ''">#{deviceId},</if>
<if test="deviceName != null and deviceName != ''">#{deviceName},</if>
<if test="deviceType != null and deviceType != ''">#{deviceType},</if>
<if test="taskNo != null">#{taskNo},</if>
<if test="jobId != null">#{jobId},</if>
<if test="fault != null">#{fault},</if>
<if test="startTime != null">#{startTime},</if>
<if test="finishTime != null">#{finishTime},</if>
<if test="warehouseId != null">#{warehouseId},</if>
</trim>
</insert>
<update id="updateBasFaultRecord" parameterType="BasFaultRecord">
update bas_fault_record
<trim prefix="SET" suffixOverrides=",">
<if test="deviceId != null and deviceId != ''">device_id = #{deviceId},</if>
<if test="deviceName != null and deviceName != ''">device_name = #{deviceName},</if>
<if test="deviceType != null and deviceType != ''">device_type = #{deviceType},</if>
<if test="taskNo != null">task_no = #{taskNo},</if>
<if test="jobId != null">job_id = #{jobId},</if>
<if test="fault != null">fault = #{fault},</if>
<if test="startTime != null">start_time = #{startTime},</if>
<if test="finishTime != null">finish_time = #{finishTime},</if>
<if test="warehouseId != null">warehouse_id = #{warehouseId},</if>
</trim>
where id = #{id}
</update>
<delete id="deleteBasFaultRecordById" parameterType="String">
delete from bas_fault_record where id = #{id}
</delete>
<delete id="deleteBasFaultRecordByIds" parameterType="String">
delete from bas_fault_record where id in
<foreach item="id" collection="array" open="(" separator="," close=")">
#{id}
</foreach>
</delete>
</mapper>

View File

@@ -22,10 +22,12 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<result property="exception" column="exception" /> <result property="exception" column="exception" />
<result property="traySize" column="tray_size" /> <result property="traySize" column="tray_size" />
<result property="allowPut" column="allow_put" /> <result property="allowPut" column="allow_put" />
<result property="ipAddress" column="ip_address" />
<result property="port" column="port" />
</resultMap> </resultMap>
<sql id="selectDeviceSsjVo"> <sql id="selectDeviceSsjVo">
select id, device_code , name , type, ip_address, plc_db_read_address, is_active, create_time, plc_db_write_address, rkqq, kx, dw, tray_code, task_no,exception,tray_size,allow_put from device_ssj select id, device_code , name , type, plc_db_read_address, is_active, create_time, plc_db_write_address, rkqq, kx, dw, tray_code, task_no,exception,tray_size,allow_put,ip_address , port from device_ssj
</sql> </sql>
<select id="selectDeviceSsjList" parameterType="DeviceSsj" resultMap="DeviceSsjResult"> <select id="selectDeviceSsjList" parameterType="DeviceSsj" resultMap="DeviceSsjResult">