diff --git a/ruoyi-ems/src/main/java/org/dromara/ems/base/controller/EmsBaseMonitorInfoController.java b/ruoyi-ems/src/main/java/org/dromara/ems/base/controller/EmsBaseMonitorInfoController.java index 1ee79a0..691e84c 100644 --- a/ruoyi-ems/src/main/java/org/dromara/ems/base/controller/EmsBaseMonitorInfoController.java +++ b/ruoyi-ems/src/main/java/org/dromara/ems/base/controller/EmsBaseMonitorInfoController.java @@ -104,4 +104,5 @@ public class EmsBaseMonitorInfoController extends EmsBaseController { return toAjax(emsBaseMonitorInfoService.deleteEmsBaseMonitorInfoByObjIds(objIds)); } + } diff --git a/ruoyi-ems/src/main/java/org/dromara/ems/base/domain/EmsAlarmActionStep.java b/ruoyi-ems/src/main/java/org/dromara/ems/base/domain/EmsAlarmActionStep.java index c4532ec..460b5b2 100644 --- a/ruoyi-ems/src/main/java/org/dromara/ems/base/domain/EmsAlarmActionStep.java +++ b/ruoyi-ems/src/main/java/org/dromara/ems/base/domain/EmsAlarmActionStep.java @@ -1,6 +1,8 @@ package org.dromara.ems.base.domain; import cn.idev.excel.annotation.ExcelIgnoreUnannotated; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; import lombok.Data; import lombok.EqualsAndHashCode; import org.apache.commons.lang3.builder.ToStringBuilder; @@ -24,6 +26,7 @@ public class EmsAlarmActionStep extends BaseEntity private static final long serialVersionUID = 1L; /** 主键ID */ + @TableId(value = "obj_id", type = IdType.ASSIGN_ID) private String objId; /** 关联的报警规则ID (逻辑关联 ems_record_alarm_rule.obj_id) */ diff --git a/ruoyi-ems/src/main/java/org/dromara/ems/base/domain/EmsAlarmActionStepImage.java b/ruoyi-ems/src/main/java/org/dromara/ems/base/domain/EmsAlarmActionStepImage.java index 210c37b..bf65b65 100644 --- a/ruoyi-ems/src/main/java/org/dromara/ems/base/domain/EmsAlarmActionStepImage.java +++ b/ruoyi-ems/src/main/java/org/dromara/ems/base/domain/EmsAlarmActionStepImage.java @@ -1,6 +1,8 @@ package org.dromara.ems.base.domain; import cn.idev.excel.annotation.ExcelIgnoreUnannotated; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; import lombok.Data; import lombok.EqualsAndHashCode; import org.apache.commons.lang3.builder.ToStringBuilder; @@ -24,6 +26,7 @@ public class EmsAlarmActionStepImage extends BaseEntity private static final long serialVersionUID = 1L; /** 主键ID */ + @TableId(value = "obj_id", type = IdType.ASSIGN_ID) private String objId; /** 关联的措施步骤ID */ diff --git a/ruoyi-ems/src/main/java/org/dromara/ems/base/domain/EmsBaseCollectDeviceInfo.java b/ruoyi-ems/src/main/java/org/dromara/ems/base/domain/EmsBaseCollectDeviceInfo.java index 5014e05..b0e26fd 100644 --- a/ruoyi-ems/src/main/java/org/dromara/ems/base/domain/EmsBaseCollectDeviceInfo.java +++ b/ruoyi-ems/src/main/java/org/dromara/ems/base/domain/EmsBaseCollectDeviceInfo.java @@ -1,8 +1,11 @@ package org.dromara.ems.base.domain; import cn.idev.excel.annotation.format.DateTimeFormat; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; import com.fasterxml.jackson.annotation.JsonFormat; import lombok.Data; +import lombok.EqualsAndHashCode; import org.apache.commons.lang3.builder.ToStringBuilder; import org.apache.commons.lang3.builder.ToStringStyle; import org.dromara.common.mybatis.core.domain.BaseEntity; @@ -16,6 +19,7 @@ import java.util.Date; * @author Yinq * @date 2024-05-20 */ +@EqualsAndHashCode(callSuper = true) @Data public class EmsBaseCollectDeviceInfo extends BaseEntity { @Serial @@ -24,6 +28,7 @@ public class EmsBaseCollectDeviceInfo extends BaseEntity { /** * 自增标识 */ + @TableId(value = "obj_id", type = IdType.ASSIGN_ID) private Long objId; /** @@ -142,10 +147,6 @@ public class EmsBaseCollectDeviceInfo extends BaseEntity { private String onlineStatus; - public String getEnergyTypeName() { - return energyTypeName; - } - public void setEnergyTypeName(String energyTypeName) { this.energyTypeName = energyTypeName; } @@ -154,238 +155,118 @@ public class EmsBaseCollectDeviceInfo extends BaseEntity { this.objId = objId; } - public Long getObjId() { - return objId; - } - public void setCollectDeviceId(String collectDeviceId) { this.collectDeviceId = collectDeviceId; } - public String getCollectDeviceId() { - return collectDeviceId; - } - public void setCollectDeviceName(String collectDeviceName) { this.collectDeviceName = collectDeviceName; } - public String getCollectDeviceName() { - return collectDeviceName; - } - public void setEnergyTypeId(Long energyTypeId) { this.energyTypeId = energyTypeId; } - public Long getEnergyTypeId() { - return energyTypeId; - } - public void setModel(String model) { this.model = model; } - public String getModel() { - return model; - } - public void setManufacturer(String manufacturer) { this.manufacturer = manufacturer; } - public String getManufacturer() { - return manufacturer; - } - public void setIpAddress(String ipAddress) { this.ipAddress = ipAddress; } - public String getIpAddress() { - return ipAddress; - } - public void setProduceDate(Date produceDate) { this.produceDate = produceDate; } - public Date getProduceDate() { - return produceDate; - } - public void setSettingAddress(String settingAddress) { this.settingAddress = settingAddress; } - public String getSettingAddress() { - return settingAddress; - } - public void setIsFlag(String isFlag) { this.isFlag = isFlag; } - public String getIsFlag() { - return isFlag; - } - - public String getRemark() { - return remark; - } - public void setRemark(String remark) { this.remark = remark; } - public String getTenantId() { - return tenantId; - } - public void setTenantId(String tenantId) { this.tenantId = tenantId; } - public String getProtocolType() { - return protocolType; - } - public void setProtocolType(String protocolType) { this.protocolType = protocolType; } - public String getProtocolVersion() { - return protocolVersion; - } - public void setProtocolVersion(String protocolVersion) { this.protocolVersion = protocolVersion; } - public Integer getPort() { - return port; - } - public void setPort(Integer port) { this.port = port; } - public Integer getSlaveNo() { - return slaveNo; - } - public void setSlaveNo(Integer slaveNo) { this.slaveNo = slaveNo; } - public String getSerialPort() { - return serialPort; - } - public void setSerialPort(String serialPort) { this.serialPort = serialPort; } - public Integer getBaudRate() { - return baudRate; - } - public void setBaudRate(Integer baudRate) { this.baudRate = baudRate; } - public Integer getDataBits() { - return dataBits; - } - public void setDataBits(Integer dataBits) { this.dataBits = dataBits; } - public Integer getStopBits() { - return stopBits; - } - public void setStopBits(Integer stopBits) { this.stopBits = stopBits; } - public String getParity() { - return parity; - } - public void setParity(String parity) { this.parity = parity; } - public String getOpcEndpointUrl() { - return opcEndpointUrl; - } - public void setOpcEndpointUrl(String opcEndpointUrl) { this.opcEndpointUrl = opcEndpointUrl; } - public String getOpcSecurityPolicy() { - return opcSecurityPolicy; - } - public void setOpcSecurityPolicy(String opcSecurityPolicy) { this.opcSecurityPolicy = opcSecurityPolicy; } - public String getOpcSecurityMode() { - return opcSecurityMode; - } - public void setOpcSecurityMode(String opcSecurityMode) { this.opcSecurityMode = opcSecurityMode; } - public String getUsername() { - return username; - } - public void setUsername(String username) { this.username = username; } - public String getPassword() { - return password; - } - public void setPassword(String password) { this.password = password; } - public Date getHeartbeatTime() { - return heartbeatTime; - } - public void setHeartbeatTime(Date heartbeatTime) { this.heartbeatTime = heartbeatTime; } - public Date getLastOnlineTime() { - return lastOnlineTime; - } - public void setLastOnlineTime(Date lastOnlineTime) { this.lastOnlineTime = lastOnlineTime; } - public Integer getOfflineTimeoutSec() { - return offlineTimeoutSec; - } - public void setOfflineTimeoutSec(Integer offlineTimeoutSec) { this.offlineTimeoutSec = offlineTimeoutSec; } - public String getOnlineStatus() { - return onlineStatus; - } - public void setOnlineStatus(String onlineStatus) { this.onlineStatus = onlineStatus; } diff --git a/ruoyi-ems/src/main/java/org/dromara/ems/base/domain/EmsBaseEnergyPrice.java b/ruoyi-ems/src/main/java/org/dromara/ems/base/domain/EmsBaseEnergyPrice.java index 32d3b06..320e4d8 100644 --- a/ruoyi-ems/src/main/java/org/dromara/ems/base/domain/EmsBaseEnergyPrice.java +++ b/ruoyi-ems/src/main/java/org/dromara/ems/base/domain/EmsBaseEnergyPrice.java @@ -2,6 +2,8 @@ package org.dromara.ems.base.domain; import cn.idev.excel.annotation.ExcelIgnoreUnannotated; import cn.idev.excel.annotation.format.DateTimeFormat; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; import com.fasterxml.jackson.annotation.JsonFormat; import lombok.Data; import lombok.EqualsAndHashCode; @@ -28,6 +30,7 @@ public class EmsBaseEnergyPrice extends BaseEntity private static final long serialVersionUID = 1L; /** 主键标识 */ + @TableId(value = "obj_id", type = IdType.ASSIGN_ID) private Long objId; /** 能源类型编号 */ diff --git a/ruoyi-ems/src/main/java/org/dromara/ems/base/domain/EmsBaseEnergyType.java b/ruoyi-ems/src/main/java/org/dromara/ems/base/domain/EmsBaseEnergyType.java index cdd2e50..15bafba 100644 --- a/ruoyi-ems/src/main/java/org/dromara/ems/base/domain/EmsBaseEnergyType.java +++ b/ruoyi-ems/src/main/java/org/dromara/ems/base/domain/EmsBaseEnergyType.java @@ -1,6 +1,8 @@ package org.dromara.ems.base.domain; import cn.idev.excel.annotation.ExcelIgnoreUnannotated; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; import lombok.Data; import lombok.EqualsAndHashCode; import org.apache.commons.lang3.builder.ToStringBuilder; @@ -25,6 +27,7 @@ public class EmsBaseEnergyType extends BaseEntity private static final long serialVersionUID = 1L; /** 自增标识 */ + @TableId(value = "obj_id", type = IdType.ASSIGN_ID) private Long objId; /** 能源类型编号 */ diff --git a/ruoyi-ems/src/main/java/org/dromara/ems/base/domain/EmsBaseMonitorInfo.java b/ruoyi-ems/src/main/java/org/dromara/ems/base/domain/EmsBaseMonitorInfo.java index 6952b05..d39795c 100644 --- a/ruoyi-ems/src/main/java/org/dromara/ems/base/domain/EmsBaseMonitorInfo.java +++ b/ruoyi-ems/src/main/java/org/dromara/ems/base/domain/EmsBaseMonitorInfo.java @@ -1,6 +1,9 @@ package org.dromara.ems.base.domain; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; import lombok.Data; +import lombok.EqualsAndHashCode; import org.apache.commons.lang3.builder.ToStringBuilder; import org.apache.commons.lang3.builder.ToStringStyle; import org.dromara.common.mybatis.core.domain.BaseEntity; @@ -16,6 +19,7 @@ import java.util.List; * @author Yinq * @date 2024-05-08 */ +@EqualsAndHashCode(callSuper = true) @Data public class EmsBaseMonitorInfo extends BaseEntity { @@ -23,6 +27,7 @@ public class EmsBaseMonitorInfo extends BaseEntity private static final long serialVersionUID = 1L; /** 自增标识 */ + @TableId(value = "obj_id", type = IdType.ASSIGN_ID) private Long objId; /** 计量设备编号 */ diff --git a/ruoyi-ems/src/main/java/org/dromara/ems/base/domain/EmsBaseMonitorThreshold.java b/ruoyi-ems/src/main/java/org/dromara/ems/base/domain/EmsBaseMonitorThreshold.java index a045b7b..291d0e6 100644 --- a/ruoyi-ems/src/main/java/org/dromara/ems/base/domain/EmsBaseMonitorThreshold.java +++ b/ruoyi-ems/src/main/java/org/dromara/ems/base/domain/EmsBaseMonitorThreshold.java @@ -1,6 +1,8 @@ package org.dromara.ems.base.domain; import cn.idev.excel.annotation.ExcelIgnoreUnannotated; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; import lombok.Data; import lombok.EqualsAndHashCode; import org.apache.commons.lang3.builder.ToStringBuilder; @@ -26,6 +28,7 @@ public class EmsBaseMonitorThreshold extends BaseEntity { /** * 主键标识 */ + @TableId(value = "obj_id", type = IdType.ASSIGN_ID) private Long objId; /** diff --git a/ruoyi-ems/src/main/java/org/dromara/ems/base/domain/EmsBaseMonitorWorkUnit.java b/ruoyi-ems/src/main/java/org/dromara/ems/base/domain/EmsBaseMonitorWorkUnit.java index 365b5ab..0c84704 100644 --- a/ruoyi-ems/src/main/java/org/dromara/ems/base/domain/EmsBaseMonitorWorkUnit.java +++ b/ruoyi-ems/src/main/java/org/dromara/ems/base/domain/EmsBaseMonitorWorkUnit.java @@ -2,6 +2,8 @@ package org.dromara.ems.base.domain; import cn.idev.excel.annotation.ExcelIgnoreUnannotated; import cn.idev.excel.annotation.format.DateTimeFormat; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; import com.fasterxml.jackson.annotation.JsonFormat; import lombok.Data; import lombok.EqualsAndHashCode; @@ -30,6 +32,7 @@ public class EmsBaseMonitorWorkUnit extends BaseEntity /** * 主键标识 */ + @TableId(value = "obj_id", type = IdType.ASSIGN_ID) private Long objId; /** diff --git a/ruoyi-ems/src/main/java/org/dromara/ems/base/domain/EmsBaseSharePrice.java b/ruoyi-ems/src/main/java/org/dromara/ems/base/domain/EmsBaseSharePrice.java index d389fca..5fcaac8 100644 --- a/ruoyi-ems/src/main/java/org/dromara/ems/base/domain/EmsBaseSharePrice.java +++ b/ruoyi-ems/src/main/java/org/dromara/ems/base/domain/EmsBaseSharePrice.java @@ -1,6 +1,8 @@ package org.dromara.ems.base.domain; import cn.idev.excel.annotation.ExcelIgnoreUnannotated; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; import lombok.Data; import lombok.EqualsAndHashCode; import org.apache.commons.lang3.builder.ToStringBuilder; @@ -27,6 +29,7 @@ public class EmsBaseSharePrice extends BaseEntity /** * 自增标识 */ + @TableId(value = "obj_id", type = IdType.ASSIGN_ID) private Long objId; /** diff --git a/ruoyi-ems/src/main/java/org/dromara/ems/base/domain/EmsBaseWorkUnit.java b/ruoyi-ems/src/main/java/org/dromara/ems/base/domain/EmsBaseWorkUnit.java index a8a70c2..8e080aa 100644 --- a/ruoyi-ems/src/main/java/org/dromara/ems/base/domain/EmsBaseWorkUnit.java +++ b/ruoyi-ems/src/main/java/org/dromara/ems/base/domain/EmsBaseWorkUnit.java @@ -2,6 +2,8 @@ package org.dromara.ems.base.domain; import cn.idev.excel.annotation.ExcelIgnoreUnannotated; import cn.idev.excel.annotation.format.DateTimeFormat; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; import com.fasterxml.jackson.annotation.JsonFormat; import lombok.Data; import lombok.EqualsAndHashCode; @@ -28,6 +30,7 @@ public class EmsBaseWorkUnit extends BaseEntity private static final long serialVersionUID = 1L; /** 主键标识 */ + @TableId(value = "obj_id", type = IdType.ASSIGN_ID) private Long objId; /** 统计单元编号 */ diff --git a/ruoyi-ems/src/main/java/org/dromara/ems/base/service/impl/EmsBaseMonitorInfoServiceImpl.java b/ruoyi-ems/src/main/java/org/dromara/ems/base/service/impl/EmsBaseMonitorInfoServiceImpl.java index f7f20e6..881162c 100644 --- a/ruoyi-ems/src/main/java/org/dromara/ems/base/service/impl/EmsBaseMonitorInfoServiceImpl.java +++ b/ruoyi-ems/src/main/java/org/dromara/ems/base/service/impl/EmsBaseMonitorInfoServiceImpl.java @@ -1,6 +1,7 @@ package org.dromara.ems.base.service.impl; import cn.hutool.core.util.ObjectUtil; +import com.baomidou.mybatisplus.core.toolkit.IdWorker; import lombok.RequiredArgsConstructor; import org.dromara.common.core.exception.ServiceException; import org.dromara.common.core.utils.DateUtils; @@ -75,8 +76,13 @@ public class EmsBaseMonitorInfoServiceImpl implements IEmsBaseMonitorInfoService * @return 结果 */ @Override + @Transactional(rollbackFor = Exception.class) public int insertEmsBaseMonitorInfo(EmsBaseMonitorInfo emsBaseMonitorInfo) { + if (emsBaseMonitorInfo.getObjId() == null) { + // 手写 XML 的动态列在 MyBatis-Plus 自动填充前已完成解析,这里提前生成 ASSIGN_ID 主键,避免 obj_id 未进入 INSERT 列。 + emsBaseMonitorInfo.setObjId(IdWorker.getId()); + } emsBaseMonitorInfo.setCreateTime(DateUtils.getNowDate()); return emsBaseMonitorInfoMapper.insertEmsBaseMonitorInfo(emsBaseMonitorInfo); } diff --git a/ruoyi-ems/src/main/java/org/dromara/ems/info/domain/DailyFaultRecord.java b/ruoyi-ems/src/main/java/org/dromara/ems/info/domain/DailyFaultRecord.java index 507b048..d5c18fb 100644 --- a/ruoyi-ems/src/main/java/org/dromara/ems/info/domain/DailyFaultRecord.java +++ b/ruoyi-ems/src/main/java/org/dromara/ems/info/domain/DailyFaultRecord.java @@ -3,6 +3,8 @@ package org.dromara.ems.info.domain; import cn.idev.excel.annotation.ExcelIgnoreUnannotated; import cn.idev.excel.annotation.ExcelProperty; import cn.idev.excel.annotation.format.DateTimeFormat; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; import lombok.Data; import lombok.EqualsAndHashCode; import org.apache.commons.lang3.builder.ToStringBuilder; @@ -25,6 +27,7 @@ public class DailyFaultRecord extends BaseEntity private static final long serialVersionUID = 1L; /** 主键,自增ID */ + @TableId(value = "id", type = IdType.ASSIGN_ID) private Long id; /** 日期 */ diff --git a/ruoyi-ems/src/main/java/org/dromara/ems/info/domain/FaultHandlingRecord.java b/ruoyi-ems/src/main/java/org/dromara/ems/info/domain/FaultHandlingRecord.java index bffec23..661cbcf 100644 --- a/ruoyi-ems/src/main/java/org/dromara/ems/info/domain/FaultHandlingRecord.java +++ b/ruoyi-ems/src/main/java/org/dromara/ems/info/domain/FaultHandlingRecord.java @@ -3,6 +3,8 @@ package org.dromara.ems.info.domain; import cn.idev.excel.annotation.ExcelIgnoreUnannotated; import cn.idev.excel.annotation.ExcelProperty; import cn.idev.excel.annotation.format.DateTimeFormat; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; import lombok.Data; import lombok.EqualsAndHashCode; import org.apache.commons.lang3.builder.ToStringBuilder; @@ -25,6 +27,7 @@ public class FaultHandlingRecord extends BaseEntity private static final long serialVersionUID = 1L; /** 主键,自增ID */ + @TableId(value = "id", type = IdType.ASSIGN_ID) private Long id; /** 故障日期 */ diff --git a/ruoyi-ems/src/main/java/org/dromara/ems/info/domain/LuggageSystemPlcBufferBatteryLifecycle.java b/ruoyi-ems/src/main/java/org/dromara/ems/info/domain/LuggageSystemPlcBufferBatteryLifecycle.java index eb141a0..02c08b8 100644 --- a/ruoyi-ems/src/main/java/org/dromara/ems/info/domain/LuggageSystemPlcBufferBatteryLifecycle.java +++ b/ruoyi-ems/src/main/java/org/dromara/ems/info/domain/LuggageSystemPlcBufferBatteryLifecycle.java @@ -3,6 +3,8 @@ package org.dromara.ems.info.domain; import cn.idev.excel.annotation.ExcelIgnoreUnannotated; import cn.idev.excel.annotation.ExcelProperty; import cn.idev.excel.annotation.format.DateTimeFormat; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; import lombok.Data; import lombok.EqualsAndHashCode; import org.apache.commons.lang3.builder.ToStringBuilder; @@ -25,6 +27,7 @@ public class LuggageSystemPlcBufferBatteryLifecycle extends BaseEntity private static final long serialVersionUID = 1L; /** 主键,自增ID */ + @TableId(value = "objid", type = IdType.ASSIGN_ID) private Long objid; /** 类型 */ diff --git a/ruoyi-ems/src/main/java/org/dromara/ems/info/domain/LuggageSystemSecurityDoorBatteryLifecycle.java b/ruoyi-ems/src/main/java/org/dromara/ems/info/domain/LuggageSystemSecurityDoorBatteryLifecycle.java index e5e70ff..e5d2e8e 100644 --- a/ruoyi-ems/src/main/java/org/dromara/ems/info/domain/LuggageSystemSecurityDoorBatteryLifecycle.java +++ b/ruoyi-ems/src/main/java/org/dromara/ems/info/domain/LuggageSystemSecurityDoorBatteryLifecycle.java @@ -3,6 +3,8 @@ package org.dromara.ems.info.domain; import cn.idev.excel.annotation.ExcelIgnoreUnannotated; import cn.idev.excel.annotation.ExcelProperty; import cn.idev.excel.annotation.format.DateTimeFormat; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; import lombok.Data; import lombok.EqualsAndHashCode; import org.apache.commons.lang3.builder.ToStringBuilder; @@ -25,6 +27,7 @@ public class LuggageSystemSecurityDoorBatteryLifecycle extends BaseEntity private static final long serialVersionUID = 1L; /** 主键,自增ID */ + @TableId(value = "objid", type = IdType.ASSIGN_ID) private Long objid; /** 类型 */ diff --git a/ruoyi-ems/src/main/java/org/dromara/ems/info/domain/PowerEnergySparePartsRegistration.java b/ruoyi-ems/src/main/java/org/dromara/ems/info/domain/PowerEnergySparePartsRegistration.java index 96c64f3..4a7bcc2 100644 --- a/ruoyi-ems/src/main/java/org/dromara/ems/info/domain/PowerEnergySparePartsRegistration.java +++ b/ruoyi-ems/src/main/java/org/dromara/ems/info/domain/PowerEnergySparePartsRegistration.java @@ -3,6 +3,8 @@ package org.dromara.ems.info.domain; import cn.idev.excel.annotation.ExcelIgnoreUnannotated; import cn.idev.excel.annotation.ExcelProperty; import cn.idev.excel.annotation.format.DateTimeFormat; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; import lombok.Data; import lombok.EqualsAndHashCode; import org.apache.commons.lang3.builder.ToStringBuilder; @@ -25,6 +27,7 @@ public class PowerEnergySparePartsRegistration extends BaseEntity private static final long serialVersionUID = 1L; /** 主键,自增ID */ + @TableId(value = "objid", type = IdType.ASSIGN_ID) private Long objid; /** 日期 */ diff --git a/ruoyi-ems/src/main/java/org/dromara/ems/info/domain/PowerEnergySupervisionChecklist.java b/ruoyi-ems/src/main/java/org/dromara/ems/info/domain/PowerEnergySupervisionChecklist.java index 65cfda1..fcde613 100644 --- a/ruoyi-ems/src/main/java/org/dromara/ems/info/domain/PowerEnergySupervisionChecklist.java +++ b/ruoyi-ems/src/main/java/org/dromara/ems/info/domain/PowerEnergySupervisionChecklist.java @@ -3,6 +3,8 @@ package org.dromara.ems.info.domain; import cn.idev.excel.annotation.ExcelIgnoreUnannotated; import cn.idev.excel.annotation.ExcelProperty; import cn.idev.excel.annotation.format.DateTimeFormat; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; import lombok.Data; import lombok.EqualsAndHashCode; import org.apache.commons.lang3.builder.ToStringBuilder; @@ -25,6 +27,7 @@ public class PowerEnergySupervisionChecklist extends BaseEntity private static final long serialVersionUID = 1L; /** 主键,自增ID */ + @TableId(value = "id", type = IdType.ASSIGN_ID) private Long id; /** 日期 */ diff --git a/ruoyi-ems/src/main/java/org/dromara/ems/info/domain/SparePartsInventory.java b/ruoyi-ems/src/main/java/org/dromara/ems/info/domain/SparePartsInventory.java index 5734cc5..83ded70 100644 --- a/ruoyi-ems/src/main/java/org/dromara/ems/info/domain/SparePartsInventory.java +++ b/ruoyi-ems/src/main/java/org/dromara/ems/info/domain/SparePartsInventory.java @@ -3,6 +3,8 @@ package org.dromara.ems.info.domain; import cn.idev.excel.annotation.ExcelIgnoreUnannotated; import cn.idev.excel.annotation.ExcelProperty; import cn.idev.excel.annotation.format.DateTimeFormat; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; import lombok.Data; import lombok.EqualsAndHashCode; import org.apache.commons.lang3.builder.ToStringBuilder; @@ -25,6 +27,7 @@ public class SparePartsInventory extends BaseEntity private static final long serialVersionUID = 1L; /** 主键 */ + @TableId(value = "objid", type = IdType.ASSIGN_ID) private Long objid; /** 入库时间 */ diff --git a/ruoyi-ems/src/main/java/org/dromara/ems/info/domain/SparePartsInventoryCheck.java b/ruoyi-ems/src/main/java/org/dromara/ems/info/domain/SparePartsInventoryCheck.java index a463fd4..4b13e6f 100644 --- a/ruoyi-ems/src/main/java/org/dromara/ems/info/domain/SparePartsInventoryCheck.java +++ b/ruoyi-ems/src/main/java/org/dromara/ems/info/domain/SparePartsInventoryCheck.java @@ -2,6 +2,8 @@ package org.dromara.ems.info.domain; import cn.idev.excel.annotation.ExcelIgnoreUnannotated; import cn.idev.excel.annotation.ExcelProperty; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; import com.fasterxml.jackson.annotation.JsonFormat; import lombok.Data; import lombok.EqualsAndHashCode; @@ -26,6 +28,7 @@ public class SparePartsInventoryCheck extends BaseEntity private static final long serialVersionUID = 1L; /** 主键 */ + @TableId(value = "id", type = IdType.ASSIGN_ID) private Long id; /** 备件库存主表ID */ diff --git a/ruoyi-ems/src/main/java/org/dromara/ems/info/domain/SparePartsUsageRecord.java b/ruoyi-ems/src/main/java/org/dromara/ems/info/domain/SparePartsUsageRecord.java index a213589..c365c03 100644 --- a/ruoyi-ems/src/main/java/org/dromara/ems/info/domain/SparePartsUsageRecord.java +++ b/ruoyi-ems/src/main/java/org/dromara/ems/info/domain/SparePartsUsageRecord.java @@ -3,6 +3,8 @@ package org.dromara.ems.info.domain; import cn.idev.excel.annotation.ExcelIgnoreUnannotated; import cn.idev.excel.annotation.ExcelProperty; import cn.idev.excel.annotation.format.DateTimeFormat; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; import lombok.Data; import lombok.EqualsAndHashCode; import org.apache.commons.lang3.builder.ToStringBuilder; @@ -25,6 +27,7 @@ public class SparePartsUsageRecord extends BaseEntity private static final long serialVersionUID = 1L; /** 主键,自增ID */ + @TableId(value = "id", type = IdType.ASSIGN_ID) private Long id; /** 日期 */ diff --git a/ruoyi-ems/src/main/java/org/dromara/ems/info/domain/UpsBatteryLifecycle.java b/ruoyi-ems/src/main/java/org/dromara/ems/info/domain/UpsBatteryLifecycle.java index 71c05bc..28f5e4b 100644 --- a/ruoyi-ems/src/main/java/org/dromara/ems/info/domain/UpsBatteryLifecycle.java +++ b/ruoyi-ems/src/main/java/org/dromara/ems/info/domain/UpsBatteryLifecycle.java @@ -3,6 +3,8 @@ package org.dromara.ems.info.domain; import cn.idev.excel.annotation.ExcelIgnoreUnannotated; import cn.idev.excel.annotation.ExcelProperty; import cn.idev.excel.annotation.format.DateTimeFormat; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; import lombok.Data; import lombok.EqualsAndHashCode; import org.apache.commons.lang3.builder.ToStringBuilder; @@ -25,6 +27,7 @@ public class UpsBatteryLifecycle extends BaseEntity private static final long serialVersionUID = 1L; /** 主键,自增ID */ + @TableId(value = "id", type = IdType.ASSIGN_ID) private Long id; /** 类型 */ diff --git a/ruoyi-ems/src/main/java/org/dromara/ems/record/domain/EmsRecordAlarmData.java b/ruoyi-ems/src/main/java/org/dromara/ems/record/domain/EmsRecordAlarmData.java index 35abfc4..f1287a4 100644 --- a/ruoyi-ems/src/main/java/org/dromara/ems/record/domain/EmsRecordAlarmData.java +++ b/ruoyi-ems/src/main/java/org/dromara/ems/record/domain/EmsRecordAlarmData.java @@ -3,6 +3,8 @@ package org.dromara.ems.record.domain; import cn.idev.excel.annotation.ExcelIgnoreUnannotated; import cn.idev.excel.annotation.ExcelProperty; import cn.idev.excel.annotation.format.DateTimeFormat; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; import com.fasterxml.jackson.annotation.JsonFormat; import lombok.Data; import lombok.EqualsAndHashCode; @@ -28,6 +30,7 @@ public class EmsRecordAlarmData extends BaseEntity private static final long serialVersionUID = 1L; /** 自增标识 */ + @TableId(value = "obj_id", type = IdType.ASSIGN_ID) private Long objId; /** 计量设备编号 */ diff --git a/ruoyi-ems/src/main/java/org/dromara/ems/record/domain/EmsRecordAlarmRule.java b/ruoyi-ems/src/main/java/org/dromara/ems/record/domain/EmsRecordAlarmRule.java index 1bedb3c..66a227a 100644 --- a/ruoyi-ems/src/main/java/org/dromara/ems/record/domain/EmsRecordAlarmRule.java +++ b/ruoyi-ems/src/main/java/org/dromara/ems/record/domain/EmsRecordAlarmRule.java @@ -3,6 +3,8 @@ package org.dromara.ems.record.domain; import cn.idev.excel.annotation.ExcelIgnoreUnannotated; import cn.idev.excel.annotation.ExcelProperty; import cn.idev.excel.annotation.format.DateTimeFormat; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; import com.fasterxml.jackson.annotation.JsonFormat; import lombok.Data; import lombok.EqualsAndHashCode; @@ -28,6 +30,7 @@ public class EmsRecordAlarmRule extends BaseEntity private static final long serialVersionUID = 1L; /** 自增标识 */ + @TableId(value = "obj_id", type = IdType.ASSIGN_ID) private Long objId; /** 规则编号 */ diff --git a/ruoyi-ems/src/main/java/org/dromara/ems/record/domain/EmsRecordDnbInstant.java b/ruoyi-ems/src/main/java/org/dromara/ems/record/domain/EmsRecordDnbInstant.java index 56cb26d..bfbd4f8 100644 --- a/ruoyi-ems/src/main/java/org/dromara/ems/record/domain/EmsRecordDnbInstant.java +++ b/ruoyi-ems/src/main/java/org/dromara/ems/record/domain/EmsRecordDnbInstant.java @@ -3,6 +3,8 @@ package org.dromara.ems.record.domain; import cn.idev.excel.annotation.ExcelIgnoreUnannotated; import cn.idev.excel.annotation.ExcelProperty; import cn.idev.excel.annotation.format.DateTimeFormat; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; import com.fasterxml.jackson.annotation.JsonFormat; import lombok.Data; import lombok.EqualsAndHashCode; @@ -28,6 +30,7 @@ public class EmsRecordDnbInstant extends BaseEntity private static final long serialVersionUID = 1L; /** 主键标识 */ + @TableId(value = "obj_id", type = IdType.ASSIGN_ID) private Long objId; /** 计量设备编号 */ diff --git a/ruoyi-ems/src/main/java/org/dromara/ems/record/domain/EmsRecordSteamInstant.java b/ruoyi-ems/src/main/java/org/dromara/ems/record/domain/EmsRecordSteamInstant.java index dfff79b..dff8cd0 100644 --- a/ruoyi-ems/src/main/java/org/dromara/ems/record/domain/EmsRecordSteamInstant.java +++ b/ruoyi-ems/src/main/java/org/dromara/ems/record/domain/EmsRecordSteamInstant.java @@ -3,6 +3,8 @@ package org.dromara.ems.record.domain; import cn.idev.excel.annotation.ExcelIgnoreUnannotated; import cn.idev.excel.annotation.ExcelProperty; import cn.idev.excel.annotation.format.DateTimeFormat; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; import com.fasterxml.jackson.annotation.JsonFormat; import lombok.Data; import lombok.EqualsAndHashCode; @@ -31,6 +33,7 @@ public class EmsRecordSteamInstant extends BaseEntity /** * 自增标识 */ + @TableId(value = "obj_id", type = IdType.ASSIGN_ID) private Long objId; /** diff --git a/ruoyi-ems/src/main/java/org/dromara/ems/record/domain/EmsRecordWaterInstant.java b/ruoyi-ems/src/main/java/org/dromara/ems/record/domain/EmsRecordWaterInstant.java index 2cd9980..77fea45 100644 --- a/ruoyi-ems/src/main/java/org/dromara/ems/record/domain/EmsRecordWaterInstant.java +++ b/ruoyi-ems/src/main/java/org/dromara/ems/record/domain/EmsRecordWaterInstant.java @@ -3,6 +3,8 @@ package org.dromara.ems.record.domain; import cn.idev.excel.annotation.ExcelIgnoreUnannotated; import cn.idev.excel.annotation.ExcelProperty; import cn.idev.excel.annotation.format.DateTimeFormat; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; import com.fasterxml.jackson.annotation.JsonFormat; import lombok.Data; import lombok.EqualsAndHashCode; @@ -28,6 +30,7 @@ public class EmsRecordWaterInstant extends BaseEntity private static final long serialVersionUID = 1L; /** */ + @TableId(value = "obj_id", type = IdType.ASSIGN_ID) private Long objId; /** 计量设备编号 */ diff --git a/ruoyi-ems/src/main/java/org/dromara/ems/record/domain/EmsVibrationInstant.java b/ruoyi-ems/src/main/java/org/dromara/ems/record/domain/EmsVibrationInstant.java index 70340c0..3635f69 100644 --- a/ruoyi-ems/src/main/java/org/dromara/ems/record/domain/EmsVibrationInstant.java +++ b/ruoyi-ems/src/main/java/org/dromara/ems/record/domain/EmsVibrationInstant.java @@ -3,6 +3,8 @@ package org.dromara.ems.record.domain; import cn.idev.excel.annotation.ExcelIgnoreUnannotated; import cn.idev.excel.annotation.ExcelProperty; import cn.idev.excel.annotation.format.DateTimeFormat; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; import com.fasterxml.jackson.annotation.JsonFormat; import lombok.Data; import lombok.EqualsAndHashCode; @@ -40,6 +42,7 @@ public class EmsVibrationInstant extends BaseEntity } /** 主键标识 */ + @TableId(value = "obj_id", type = IdType.ASSIGN_ID) private Long objId; /** 采集时间 */ diff --git a/ruoyi-ems/src/main/java/org/dromara/ems/record/domain/RecordIotenvInstant.java b/ruoyi-ems/src/main/java/org/dromara/ems/record/domain/RecordIotenvInstant.java index 7b63b64..f21f8ef 100644 --- a/ruoyi-ems/src/main/java/org/dromara/ems/record/domain/RecordIotenvInstant.java +++ b/ruoyi-ems/src/main/java/org/dromara/ems/record/domain/RecordIotenvInstant.java @@ -3,6 +3,8 @@ package org.dromara.ems.record.domain; import cn.idev.excel.annotation.ExcelIgnoreUnannotated; import cn.idev.excel.annotation.ExcelProperty; import cn.idev.excel.annotation.format.DateTimeFormat; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; import com.fasterxml.jackson.annotation.JsonFormat; import lombok.Data; import lombok.EqualsAndHashCode; @@ -26,6 +28,7 @@ public class RecordIotenvInstant extends BaseEntity private static final long serialVersionUID = 1L; /** 主键标识 */ + @TableId(value = "objid", type = IdType.ASSIGN_ID) private Long objid; /** 计量设备编号 */ diff --git a/ruoyi-ems/src/main/java/org/dromara/ems/record/domain/TWTempertureData.java b/ruoyi-ems/src/main/java/org/dromara/ems/record/domain/TWTempertureData.java index 0622033..5a44816 100644 --- a/ruoyi-ems/src/main/java/org/dromara/ems/record/domain/TWTempertureData.java +++ b/ruoyi-ems/src/main/java/org/dromara/ems/record/domain/TWTempertureData.java @@ -3,6 +3,8 @@ package org.dromara.ems.record.domain; import cn.idev.excel.annotation.ExcelIgnoreUnannotated; import cn.idev.excel.annotation.ExcelProperty; import cn.idev.excel.annotation.format.DateTimeFormat; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; import com.fasterxml.jackson.annotation.JsonFormat; import lombok.Data; import lombok.EqualsAndHashCode; @@ -28,6 +30,7 @@ public class TWTempertureData extends BaseEntity private static final long serialVersionUID = 1L; /** 主键标识 */ + @TableId(value = "objid", type = IdType.ASSIGN_ID) private Long objid; /** 计量设备编号 */ diff --git a/ruoyi-ems/src/main/java/org/dromara/ems/record/mapper/EmsRecordAlarmDataMapper.java b/ruoyi-ems/src/main/java/org/dromara/ems/record/mapper/EmsRecordAlarmDataMapper.java index 0c91a93..4a98efe 100644 --- a/ruoyi-ems/src/main/java/org/dromara/ems/record/mapper/EmsRecordAlarmDataMapper.java +++ b/ruoyi-ems/src/main/java/org/dromara/ems/record/mapper/EmsRecordAlarmDataMapper.java @@ -4,6 +4,7 @@ import org.apache.ibatis.annotations.Param; import org.dromara.ems.record.domain.EmsRecordAlarmData; import org.dromara.ems.record.domain.vo.EmsRecordAlarmDataSummaryVo; +import java.util.Collection; import java.util.Date; import java.util.List; @@ -23,6 +24,17 @@ public interface EmsRecordAlarmDataMapper */ public EmsRecordAlarmData selectEmsRecordAlarmDataByObjId(Long objId); + /** + * 批量查询异常数据记录。 + * + *

告警确认入口会一次提交多个 objId,这里先批量读取当前状态, + * 避免逐条 SELECT 放大数据库压力。

+ * + * @param objIds 异常数据记录主键集合 + * @return 异常数据记录集合 + */ + List selectEmsRecordAlarmDataByObjIds(@Param("objIds") Collection objIds); + /** * 查询异常数据记录列表 * @@ -69,6 +81,19 @@ public interface EmsRecordAlarmDataMapper */ int markAlarmHandled(EmsRecordAlarmData emsRecordAlarmData); + /** + * 批量将告警记录标记为已处理。 + * + *

仍保留 alarm_status 条件,是为了让并发确认只影响未处理记录, + * 防止重复点击把已处理记录再次写成成功。

+ * + * @param objIds 告警主键集合 + * @param emsRecordAlarmData 告警处理信息 + * @return 实际更新条数 + */ + int markAlarmHandledBatch(@Param("objIds") Collection objIds, + @Param("alarmData") EmsRecordAlarmData emsRecordAlarmData); + /** * 删除异常数据记录 * diff --git a/ruoyi-ems/src/main/java/org/dromara/ems/record/service/impl/EmsRecordAlarmDataServiceImpl.java b/ruoyi-ems/src/main/java/org/dromara/ems/record/service/impl/EmsRecordAlarmDataServiceImpl.java index dec4fe8..3b551d9 100644 --- a/ruoyi-ems/src/main/java/org/dromara/ems/record/service/impl/EmsRecordAlarmDataServiceImpl.java +++ b/ruoyi-ems/src/main/java/org/dromara/ems/record/service/impl/EmsRecordAlarmDataServiceImpl.java @@ -202,38 +202,73 @@ public class EmsRecordAlarmDataServiceImpl implements IEmsRecordAlarmDataService return result; } result.setRequestCount(objIds.length); + Map requestCountMap = new LinkedHashMap<>(); for (Long objId : objIds) { - EmsRecordAlarmData existing = emsRecordAlarmDataMapper.selectEmsRecordAlarmDataByObjId(objId); + if (objId == null) { + throw new ServiceException("告警ID不能为空"); + } + requestCountMap.merge(objId, 1, Integer::sum); + } + + List uniqueObjIds = new ArrayList<>(requestCountMap.keySet()); + List existingAlarmList = emsRecordAlarmDataMapper.selectEmsRecordAlarmDataByObjIds(uniqueObjIds); + Map existingAlarmMap = new HashMap<>(existingAlarmList.size()); + for (EmsRecordAlarmData alarmData : existingAlarmList) { + existingAlarmMap.put(alarmData.getObjId(), alarmData); + } + + List pendingIds = new ArrayList<>(); + for (Long objId : uniqueObjIds) { + int requestTimes = requestCountMap.get(objId); + EmsRecordAlarmData existing = existingAlarmMap.get(objId); if (existing == null) { - result.setMissingCount(result.getMissingCount() + 1); - result.getMissingIds().add(objId); + result.setMissingCount(result.getMissingCount() + requestTimes); + addRepeatedId(result.getMissingIds(), objId, requestTimes); continue; } if (Objects.equals(existing.getAlarmStatus(), EmsAlarmStatusConstants.HANDLED)) { - result.setAlreadyHandledCount(result.getAlreadyHandledCount() + 1); - result.getAlreadyHandledIds().add(objId); + result.setAlreadyHandledCount(result.getAlreadyHandledCount() + requestTimes); + addRepeatedId(result.getAlreadyHandledIds(), objId, requestTimes); continue; } - EmsRecordAlarmData alarmData = new EmsRecordAlarmData(); - alarmData.setObjId(objId); - alarmData.setAlarmStatus(EmsAlarmStatusConstants.HANDLED); - alarmData.setOperationName(getUsername()); - alarmData.setOperationTime(DateUtils.getNowDate()); - alarmData.setConfirmUserId(getUserId()); - alarmData.setUpdateTime(DateUtils.getNowDate()); - // 只允许从“未处理”切到“已处理”,这样并发确认时第二次提交会拿到 0 行更新。 - int updated = emsRecordAlarmDataMapper.markAlarmHandled(alarmData); - if (updated > 0) { - result.setUpdatedCount(result.getUpdatedCount() + updated); - result.getSuccessIds().add(objId); - } else { - result.setAlreadyHandledCount(result.getAlreadyHandledCount() + 1); - result.getAlreadyHandledIds().add(objId); + pendingIds.add(objId); + if (requestTimes > 1) { + // 同一个请求体重复提交相同告警时,只让首个 ID 参与更新,其余保持与逐条处理一致:视为已处理。 + result.setAlreadyHandledCount(result.getAlreadyHandledCount() + requestTimes - 1); + addRepeatedId(result.getAlreadyHandledIds(), objId, requestTimes - 1); } } + + if (!pendingIds.isEmpty()) { + Date operationTime = DateUtils.getNowDate(); + EmsRecordAlarmData alarmData = new EmsRecordAlarmData(); + alarmData.setAlarmStatus(EmsAlarmStatusConstants.HANDLED); + alarmData.setOperationName(getUsername()); + alarmData.setOperationTime(operationTime); + alarmData.setConfirmUserId(getUserId()); + alarmData.setUpdateTime(operationTime); + int updated = emsRecordAlarmDataMapper.markAlarmHandledBatch(pendingIds, alarmData); + if (updated != pendingIds.size()) { + throw new ServiceException("告警状态已被并发修改,请刷新后重试"); + } + result.setUpdatedCount(result.getUpdatedCount() + updated); + result.getSuccessIds().addAll(pendingIds); + } return result; } + /** + * 按请求次数回填结果 ID。 + * + *

前端可能因为批量勾选或重复提交带来重复 objId,返回列表保留重复次数, + * 便于调用方核对 requestCount 与各类处理数量。

+ */ + private void addRepeatedId(List targetIds, Long objId, int repeatTimes) { + for (int i = 0; i < repeatTimes; i++) { + targetIds.add(objId); + } + } + /** * 物联网数据阈值检查定时任务 * 每分钟执行一次,检查当天分表中的最新数据是否超过阈值 @@ -477,7 +512,7 @@ public class EmsRecordAlarmDataServiceImpl implements IEmsRecordAlarmDataService case 8: // 气体浓度 return record.getConcentration(); default: - System.out.println("未知的监测字段: " + monitorField); + log.warn("未知的监测字段,monitorField={}", monitorField); return null; } } @@ -712,7 +747,7 @@ public class EmsRecordAlarmDataServiceImpl implements IEmsRecordAlarmDataService // 第一层:批次内去重 List deduplicatedList = performBatchDeduplication(alarmDataList); - System.out.println("批次内去重:原始 " + alarmDataList.size() + " 条,去重后 " + deduplicatedList.size() + " 条"); + log.debug("批次内去重完成,originalCount={}, deduplicatedCount={}", alarmDataList.size(), deduplicatedList.size()); // 第二层:数据库去重并插入 int insertedCount = 0; @@ -723,7 +758,7 @@ public class EmsRecordAlarmDataServiceImpl implements IEmsRecordAlarmDataService // 获取记录时间(现在存储的是recordTime) Date recordTime = alarmData.getCollectTime(); if (recordTime == null) { - System.out.println("跳过无记录时间的异常数据"); + log.warn("跳过无记录时间的异常数据,monitorId={}, cause={}", alarmData.getMonitorId(), alarmData.getCause()); continue; } @@ -744,21 +779,18 @@ public class EmsRecordAlarmDataServiceImpl implements IEmsRecordAlarmDataService int result = insertEmsRecordAlarmData(alarmData); if (result > 0) { insertedCount++; - System.out.println("成功插入异常数据 - 设备:" + alarmData.getMonitorId() + - ", 原因:" + alarmData.getCause() + - ", 记录时间:" + alarmData.getCollectTime() + - ", 数值:" + alarmData.getAlarmData()); + log.info("成功插入异常数据,monitorId={}, cause={}, collectTime={}, alarmData={}", + alarmData.getMonitorId(), alarmData.getCause(), alarmData.getCollectTime(), alarmData.getAlarmData()); } } else { - System.out.println("跳过重复异常数据 - 设备:" + alarmData.getMonitorId() + - ", 原因:" + alarmData.getCause() + - ", 记录时间:" + alarmData.getCollectTime() + - ", 10分钟内已存在 " + existingCount + " 条相同记录"); + log.debug("跳过重复异常数据,monitorId={}, cause={}, collectTime={}, duplicateCount={}", + alarmData.getMonitorId(), alarmData.getCause(), alarmData.getCollectTime(), existingCount); } } catch (Exception e) { - System.err.println("插入异常数据时发生错误: " + e.getMessage()); - e.printStackTrace(); + log.error("插入异常数据失败,monitorId={}, cause={}, collectTime={}", + alarmData.getMonitorId(), alarmData.getCause(), alarmData.getCollectTime(), e); + throw new ServiceException("异常数据入库失败,请检查采集数据和告警规则配置"); } } @@ -788,7 +820,7 @@ public class EmsRecordAlarmDataServiceImpl implements IEmsRecordAlarmDataService if (uniqueKey != null && !uniqueRecords.containsKey(uniqueKey)) { uniqueRecords.put(uniqueKey, alarmData); } else if (uniqueKey != null) { - System.out.println("批次内发现重复记录,已跳过 - " + uniqueKey); + log.debug("批次内发现重复记录,已跳过,uniqueKey={}", uniqueKey); } } diff --git a/ruoyi-ems/src/main/java/org/dromara/ems/record/service/impl/EmsRecordAlarmRuleServiceImpl.java b/ruoyi-ems/src/main/java/org/dromara/ems/record/service/impl/EmsRecordAlarmRuleServiceImpl.java index 54c8d8e..0d7debf 100644 --- a/ruoyi-ems/src/main/java/org/dromara/ems/record/service/impl/EmsRecordAlarmRuleServiceImpl.java +++ b/ruoyi-ems/src/main/java/org/dromara/ems/record/service/impl/EmsRecordAlarmRuleServiceImpl.java @@ -1,6 +1,7 @@ package org.dromara.ems.record.service.impl; import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; import org.dromara.common.core.utils.DateUtils; import org.dromara.ems.base.domain.EmsAlarmActionStep; import org.dromara.ems.base.domain.EmsAlarmNotifyGroup; @@ -21,6 +22,7 @@ import java.util.List; * @date 2024-05-15 */ @Service +@Slf4j @RequiredArgsConstructor public class EmsRecordAlarmRuleServiceImpl implements IEmsRecordAlarmRuleService { @@ -132,14 +134,14 @@ public class EmsRecordAlarmRuleServiceImpl implements IEmsRecordAlarmRuleService // 级联删除措施步骤(会自动删除关联的图片文件) int deletedSteps = emsAlarmActionStepService.deleteEmsAlarmActionStepByObjIds(stepIds); - System.out.println("删除异常规则 " + alarmRule.getRuleName() + " 关联的 " + deletedSteps + " 个措施步骤"); + log.info("删除异常规则关联措施步骤,ruleName={}, deletedSteps={}", alarmRule.getRuleName(), deletedSteps); } // 3. 最后删除异常规则本身 int result = emsRecordAlarmRuleMapper.deleteEmsRecordAlarmRuleByObjId(objId); if (result > 0) { - System.out.println("成功删除异常规则: " + alarmRule.getRuleName() + " (ID: " + objId + ")"); + log.info("成功删除异常规则,ruleName={}, objId={}", alarmRule.getRuleName(), objId); } return result; diff --git a/ruoyi-ems/src/main/java/org/dromara/ems/record/service/impl/RecordIotenvInstantServiceImpl.java b/ruoyi-ems/src/main/java/org/dromara/ems/record/service/impl/RecordIotenvInstantServiceImpl.java index ce776cc..9bbef4c 100644 --- a/ruoyi-ems/src/main/java/org/dromara/ems/record/service/impl/RecordIotenvInstantServiceImpl.java +++ b/ruoyi-ems/src/main/java/org/dromara/ems/record/service/impl/RecordIotenvInstantServiceImpl.java @@ -1,7 +1,9 @@ package org.dromara.ems.record.service.impl; import cn.hutool.http.HttpStatus; +import jakarta.annotation.PreDestroy; import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; import org.dromara.common.core.exception.ServiceException; import org.dromara.common.mybatis.core.page.TableDataInfo; import org.dromara.ems.base.domain.EmsBaseMonitorInfo; @@ -23,7 +25,9 @@ import java.time.format.DateTimeParseException; import java.util.*; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; +import java.util.concurrent.ExecutionException; import java.util.concurrent.Future; +import java.util.concurrent.TimeUnit; import java.util.regex.Pattern; import java.util.stream.Collectors; @@ -34,6 +38,7 @@ import java.util.stream.Collectors; * @date 2025-04-28 */ @Service +@Slf4j @RequiredArgsConstructor public class RecordIotenvInstantServiceImpl implements IRecordIotenvInstantService { @@ -49,6 +54,32 @@ public class RecordIotenvInstantServiceImpl implements IRecordIotenvInstantServi private static final String BEGIN_RECORD_TIME_KEY = "beginRecordTime"; private static final String END_RECORD_TIME_KEY = "endRecordTime"; private static final int LATEST_TABLE_LOOKBACK_DAYS = 7; + private static final int MULTI_MONITOR_QUERY_THREADS = 20; + private static final long EXECUTOR_SHUTDOWN_TIMEOUT_SECONDS = 30L; + private static final BigDecimal SENSOR_POSITIVE_MIN_VALUE = BigDecimal.ZERO; + /** + * 温湿度/噪声导出沿用历史有效量程上限 79。 + * 这里先集中为常量,避免分页查询、导出过滤和后续字典配置迁移时出现多处魔法值不一致。 + */ + private static final BigDecimal ENV_SENSOR_VALID_MAX_VALUE = new BigDecimal("79"); + /** + * 振动类字段沿用历史有效量程上限 80,当前业务语义为小于 80 才进入有效数据。 + */ + private static final BigDecimal VIBRATION_SENSOR_VALID_MAX_VALUE = new BigDecimal("80"); + + /** + * 多测点历史查询共用线程池。 + * 这里不在每次查询时 new 线程池,避免高并发查询下反复创建/销毁线程造成资源泄露和数据库连接抖动。 + */ + private final ExecutorService multiMonitorQueryExecutor = Executors.newFixedThreadPool( + MULTI_MONITOR_QUERY_THREADS, + runnable -> { + Thread thread = new Thread(runnable); + thread.setName("iotenv-multi-query-" + thread.getId()); + thread.setDaemon(true); + return thread; + } + ); /** * 查询物联网数据 @@ -315,47 +346,63 @@ public class RecordIotenvInstantServiceImpl implements IRecordIotenvInstantServi * @return 合并后的查询结果 */ private List selectMultipleMonitorData(List tableNames, RecordIotenvInstant recordIotenvInstant,String[] monitorIds) { - // 创建线程池 - int threadCount = Math.min(monitorIds.length,20); - ExecutorService executorService = Executors.newFixedThreadPool(threadCount); + if (monitorIds == null || monitorIds.length == 0) { + return new ArrayList<>(); + } - //创建任务列表 - List>> futures = new ArrayList<>(); + // 每个测点一个独立查询对象,避免并发任务共享同一个 BO 导致 monitorId 被互相覆盖。 + List>> futures = new ArrayList<>(); + for (String monitorId : monitorIds) { + Future> future = multiMonitorQueryExecutor.submit(() -> { + RecordIotenvInstant query = new RecordIotenvInstant(); + BeanUtils.copyProperties(recordIotenvInstant, query); + query.setMonitorId(monitorId); + query.setMonitorIds(null); + return recordIotenvInstantMapper.selectRecordIotenvInstantListFromTables(tableNames, query); + }); + futures.add(future); + } - // 为每个设备创建查询任务 - for(String monitorId : monitorIds){ - Future> future - = executorService.submit(() -> { - // 创建新的查询对象,避免并发修改 - RecordIotenvInstant query = new RecordIotenvInstant(); - BeanUtils.copyProperties(recordIotenvInstant, query); - query.setMonitorId(monitorId); - query.setMonitorIds(null); // 清空数组,使用单个ID查询 + List result = new ArrayList<>(); + for (Future> future : futures) { + try { + List partialResult = future.get(); + if (partialResult != null && !partialResult.isEmpty()) { + result.addAll(partialResult); + } + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + cancelUnfinishedTasks(futures); + throw new ServiceException("多测点数据查询被中断,请稍后重试"); + } catch (ExecutionException e) { + cancelUnfinishedTasks(futures); + log.error("多测点数据查询失败", e); + throw new ServiceException("多测点数据查询失败,请稍后重试"); + } + } + return result; + } - // 执行查询 - return recordIotenvInstantMapper - .selectRecordIotenvInstantListFromTables(tableNames, query); - }); - futures.add(future); - } + private void cancelUnfinishedTasks(List>> futures) { + for (Future> future : futures) { + if (!future.isDone()) { + future.cancel(true); + } + } + } - // 收集所有查询结果 - List result = new ArrayList<>(); - for (Future> future : futures) { - try { - List partialResult = future.get(); - if (partialResult != null && !partialResult.isEmpty()) { - result.addAll(partialResult); - } - } catch (Exception e) { - // 记录异常但继续处理其他结果 - e.printStackTrace(); - } - } - // 关闭线程池 - executorService.shutdown(); - - return result; + @PreDestroy + public void shutdownMultiMonitorQueryExecutor() { + multiMonitorQueryExecutor.shutdown(); + try { + if (!multiMonitorQueryExecutor.awaitTermination(EXECUTOR_SHUTDOWN_TIMEOUT_SECONDS, TimeUnit.SECONDS)) { + // 应用停机时不再等待长查询,避免进程无法及时退出。 + multiMonitorQueryExecutor.shutdownNow(); + } + } catch (InterruptedException e) { + multiMonitorQueryExecutor.shutdownNow(); + Thread.currentThread().interrupt(); + } } @Override @@ -597,7 +644,7 @@ public class RecordIotenvInstantServiceImpl implements IRecordIotenvInstantServi }).collect(Collectors.toList()); } - /** 判断指定振动参数是否有效:>0且<80 */ + /** 判断指定振动参数是否有效:大于0且小于振动字段历史有效上限 */ private boolean isValidVibrationParam(RecordIotenvInstant record, String vibrationParam) { BigDecimal value = null; switch (vibrationParam) { @@ -616,7 +663,7 @@ public class RecordIotenvInstantServiceImpl implements IRecordIotenvInstantServi default: return false; } - return value != null && value.compareTo(BigDecimal.ZERO) > 0 && value.compareTo(new BigDecimal("80")) < 0; + return isValidVibrationValue(value, VIBRATION_SENSOR_VALID_MAX_VALUE); } /** 判断记录对于指定类型是否有效 */ @@ -635,33 +682,37 @@ public class RecordIotenvInstantServiceImpl implements IRecordIotenvInstantServi } } - /** 判断温度是否有效:>0且<=79 */ + /** 判断温度是否有效:大于0且不超过环境类字段历史有效上限 */ private boolean isValidTemperature(BigDecimal temperature) { - return temperature != null && temperature.compareTo(BigDecimal.ZERO) > 0 && temperature.compareTo(new BigDecimal("79")) <= 0; + return isValidEnvSensorValue(temperature); } - /** 判断湿度是否有效:>0且<=79 */ + /** 判断湿度是否有效:大于0且不超过环境类字段历史有效上限 */ private boolean isValidHumidity(BigDecimal humidity) { - return humidity != null && humidity.compareTo(BigDecimal.ZERO) > 0 && humidity.compareTo(new BigDecimal("79")) <= 0; + return isValidEnvSensorValue(humidity); } - /** 判断噪声是否有效:>0且<=79 */ + /** 判断噪声是否有效:大于0且不超过环境类字段历史有效上限 */ private boolean isValidNoise(BigDecimal noise) { - return noise != null && noise.compareTo(BigDecimal.ZERO) > 0 && noise.compareTo(new BigDecimal("79")) <= 0; + return isValidEnvSensorValue(noise); } - /** 判断是否有有效的振动数据:>0且<80 */ + /** 判断是否有有效的振动数据:大于0且小于振动字段历史有效上限 */ private boolean hasValidVibrationData(RecordIotenvInstant record) { - BigDecimal upperLimit = new BigDecimal("80"); - return isValidVibrationValue(record.getVibrationSpeed(), upperLimit) || - isValidVibrationValue(record.getVibrationDisplacement(), upperLimit) || - isValidVibrationValue(record.getVibrationAcceleration(), upperLimit) || - isValidVibrationValue(record.getVibrationTemp(), upperLimit); + return isValidVibrationValue(record.getVibrationSpeed(), VIBRATION_SENSOR_VALID_MAX_VALUE) || + isValidVibrationValue(record.getVibrationDisplacement(), VIBRATION_SENSOR_VALID_MAX_VALUE) || + isValidVibrationValue(record.getVibrationAcceleration(), VIBRATION_SENSOR_VALID_MAX_VALUE) || + isValidVibrationValue(record.getVibrationTemp(), VIBRATION_SENSOR_VALID_MAX_VALUE); } - /** 判断振动值是否有效:>0且<80 */ + /** 判断环境类传感器值是否有效,先保留历史上限,后续可迁移到配置表。 */ + private boolean isValidEnvSensorValue(BigDecimal value) { + return value != null && value.compareTo(SENSOR_POSITIVE_MIN_VALUE) > 0 && value.compareTo(ENV_SENSOR_VALID_MAX_VALUE) <= 0; + } + + /** 判断振动值是否有效:大于0且小于指定上限 */ private boolean isValidVibrationValue(BigDecimal value, BigDecimal upperLimit) { - return value != null && value.compareTo(BigDecimal.ZERO) > 0 && value.compareTo(upperLimit) < 0; + return value != null && value.compareTo(SENSOR_POSITIVE_MIN_VALUE) > 0 && value.compareTo(upperLimit) < 0; } /** 判断记录是否有任何有效数据 */ diff --git a/ruoyi-ems/src/main/java/org/dromara/ems/report/domain/EmsReportPointDnb.java b/ruoyi-ems/src/main/java/org/dromara/ems/report/domain/EmsReportPointDnb.java index 6031496..f632235 100644 --- a/ruoyi-ems/src/main/java/org/dromara/ems/report/domain/EmsReportPointDnb.java +++ b/ruoyi-ems/src/main/java/org/dromara/ems/report/domain/EmsReportPointDnb.java @@ -3,6 +3,8 @@ package org.dromara.ems.report.domain; import cn.idev.excel.annotation.ExcelIgnoreUnannotated; import cn.idev.excel.annotation.ExcelProperty; import cn.idev.excel.annotation.format.DateTimeFormat; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; import com.fasterxml.jackson.annotation.JsonFormat; import lombok.Data; import lombok.EqualsAndHashCode; @@ -31,6 +33,7 @@ public class EmsReportPointDnb extends BaseEntity /** * 主键标识 */ + @TableId(value = "obj_id", type = IdType.ASSIGN_ID) private Long objId; /** diff --git a/ruoyi-ems/src/main/java/org/dromara/ems/report/domain/EmsReportPointSteam.java b/ruoyi-ems/src/main/java/org/dromara/ems/report/domain/EmsReportPointSteam.java index cab1e3b..7f96013 100644 --- a/ruoyi-ems/src/main/java/org/dromara/ems/report/domain/EmsReportPointSteam.java +++ b/ruoyi-ems/src/main/java/org/dromara/ems/report/domain/EmsReportPointSteam.java @@ -3,6 +3,8 @@ package org.dromara.ems.report.domain; import cn.idev.excel.annotation.ExcelIgnoreUnannotated; import cn.idev.excel.annotation.ExcelProperty; import cn.idev.excel.annotation.format.DateTimeFormat; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; import com.fasterxml.jackson.annotation.JsonFormat; import lombok.Data; import lombok.EqualsAndHashCode; @@ -31,6 +33,7 @@ public class EmsReportPointSteam extends BaseEntity /** * 主键标识 */ + @TableId(value = "obj_id", type = IdType.ASSIGN_ID) private Long objId; /** diff --git a/ruoyi-ems/src/main/java/org/dromara/ems/report/domain/EmsReportPointWater.java b/ruoyi-ems/src/main/java/org/dromara/ems/report/domain/EmsReportPointWater.java index df801a9..a723143 100644 --- a/ruoyi-ems/src/main/java/org/dromara/ems/report/domain/EmsReportPointWater.java +++ b/ruoyi-ems/src/main/java/org/dromara/ems/report/domain/EmsReportPointWater.java @@ -3,6 +3,8 @@ package org.dromara.ems.report.domain; import cn.idev.excel.annotation.ExcelIgnoreUnannotated; import cn.idev.excel.annotation.ExcelProperty; import cn.idev.excel.annotation.format.DateTimeFormat; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; import com.fasterxml.jackson.annotation.JsonFormat; import lombok.Data; import lombok.EqualsAndHashCode; @@ -30,6 +32,7 @@ public class EmsReportPointWater extends BaseEntity /** * 主键标识 */ + @TableId(value = "obj_id", type = IdType.ASSIGN_ID) private Long objId; /** diff --git a/ruoyi-ems/src/main/java/org/dromara/ems/report/service/impl/TempBoardServiceImpl.java b/ruoyi-ems/src/main/java/org/dromara/ems/report/service/impl/TempBoardServiceImpl.java index 6f2cb6e..edcc2b6 100644 --- a/ruoyi-ems/src/main/java/org/dromara/ems/report/service/impl/TempBoardServiceImpl.java +++ b/ruoyi-ems/src/main/java/org/dromara/ems/report/service/impl/TempBoardServiceImpl.java @@ -17,6 +17,7 @@ import java.util.Calendar; import java.util.Collections; import java.util.Date; import java.util.List; +import java.util.regex.Pattern; /** * 温度看板 Service 实现 @@ -46,6 +47,12 @@ public class TempBoardServiceImpl implements ITempBoardService { private static final String DATETIME_FORMAT = "yyyy-MM-dd HH:mm:ss"; + /** + * 动态分表名白名单。 + * MyBatis XML 使用 ${tableName} 拼接真实表名,必须在进入 Mapper 前再做一次 Service 层断言。 + */ + private static final Pattern TABLE_NAME_PATTERN = Pattern.compile("^record_iotenv_instant_\\d{8}$"); + /** 线程安全的静态格式化器,替代每次 new SimpleDateFormat */ private static final DateTimeFormatter FMT = DateTimeFormatter.ofPattern(DATETIME_FORMAT); @@ -73,7 +80,20 @@ public class TempBoardServiceImpl implements ITempBoardService { if (diffMs > maxRangeMs) { throw new ServiceException("查询跨度不能超过" + MAX_QUERY_DAYS + "天,请缩小范围"); } - return partitionService.resolveTables(query.getStartTime(), query.getEndTime()); + List tableNames = partitionService.resolveTables(query.getStartTime(), query.getEndTime()); + validateResolvedTableNames(tableNames); + return tableNames; + } + + /** + * 分表路由服务已经按固定规则生成表名,这里仍然复核一次,避免后续维护时把外部表名绕进 ${tableName}。 + */ + private void validateResolvedTableNames(List tableNames) { + for (String tableName : tableNames) { + if (!TABLE_NAME_PATTERN.matcher(tableName).matches()) { + throw new ServiceException("非法分表名称:" + tableName); + } + } } /** Date → 格式化字符串(兼容旧接口) */ diff --git a/ruoyi-ems/src/main/resources/mapper/ems/base/EmsBaseMonitorInfoMapper.xml b/ruoyi-ems/src/main/resources/mapper/ems/base/EmsBaseMonitorInfoMapper.xml index a0c9965..cbe4911 100644 --- a/ruoyi-ems/src/main/resources/mapper/ems/base/EmsBaseMonitorInfoMapper.xml +++ b/ruoyi-ems/src/main/resources/mapper/ems/base/EmsBaseMonitorInfoMapper.xml @@ -134,11 +134,10 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" + parameterType="org.dromara.ems.base.domain.EmsBaseMonitorInfo"> insert into ems_base_monitor_info + obj_id, parent_id, monitor_code, monitor_name, @@ -187,6 +186,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" update_time, + #{objId}, #{parentId}, #{monitorCode}, #{monitorName}, diff --git a/ruoyi-ems/src/main/resources/mapper/ems/record/EmsRecordAlarmDataMapper.xml b/ruoyi-ems/src/main/resources/mapper/ems/record/EmsRecordAlarmDataMapper.xml index 9e18531..2759c93 100644 --- a/ruoyi-ems/src/main/resources/mapper/ems/record/EmsRecordAlarmDataMapper.xml +++ b/ruoyi-ems/src/main/resources/mapper/ems/record/EmsRecordAlarmDataMapper.xml @@ -138,6 +138,14 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" where rad.obj_id = #{objId} + + insert into ems_record_alarm_data @@ -242,6 +250,20 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" and alarm_status <> #{alarmStatus} + + update ems_record_alarm_data + set alarm_status = #{alarmData.alarmStatus}, + operation_name = #{alarmData.operationName}, + operation_time = #{alarmData.operationTime}, + confirm_user_id = #{alarmData.confirmUserId}, + update_time = #{alarmData.updateTime} + where obj_id in + + #{objId} + + and alarm_status <> #{alarmData.alarmStatus} + + delete from ems_record_alarm_data where obj_id = #{objId} diff --git a/ruoyi-ems/src/main/resources/mapper/ems/record/RecordIotenvInstantMapper.xml b/ruoyi-ems/src/main/resources/mapper/ems/record/RecordIotenvInstantMapper.xml index 70d4d93..0be44a4 100644 --- a/ruoyi-ems/src/main/resources/mapper/ems/record/RecordIotenvInstantMapper.xml +++ b/ruoyi-ems/src/main/resources/mapper/ems/record/RecordIotenvInstantMapper.xml @@ -128,7 +128,11 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" - + - - - - - - + diff --git a/ruoyi-ems/src/main/resources/mapper/ems/report/TempBoardMapper.xml b/ruoyi-ems/src/main/resources/mapper/ems/report/TempBoardMapper.xml index b9c0e94..59be08e 100644 --- a/ruoyi-ems/src/main/resources/mapper/ems/report/TempBoardMapper.xml +++ b/ruoyi-ems/src/main/resources/mapper/ems/report/TempBoardMapper.xml @@ -2,6 +2,11 @@ + + t.monitorId,