feat(service): 根据事务一致性原则,删除设备信息时要调用删除异常规则的方法,删除异常规则时调用删除具体措施步骤的删除方法(删除具体措施步骤已调用删除图片的mapper),删除与其绑定的具体措施步骤,层层嵌套并保证事务一致

- 在 EmsAlarmActionStepServiceImpl 中添加级联删除措施步骤和图片的逻辑
- 在 EmsBaseMonitorInfoServiceImpl 中实现设备信息删除时级联删除异常规则和措施步骤
- 在 EmsRecordAlarmRuleServiceImpl 中添加删除异常规则时级联删除措施步骤和图片的逻辑
- 优化了批量删除方法,确保事务一致性
boardTest
zch 4 weeks ago
parent 4b4063259b
commit d597bbd3fc

@ -5,6 +5,7 @@ import java.io.File;
import java.net.URLDecoder; import java.net.URLDecoder;
import com.os.common.config.RuoYiConfig; import com.os.common.config.RuoYiConfig;
import com.os.common.exception.ServiceException;
import com.os.common.utils.DateUtils; import com.os.common.utils.DateUtils;
import com.os.common.utils.StringUtils; import com.os.common.utils.StringUtils;
import com.os.common.utils.uuid.IdUtils; import com.os.common.utils.uuid.IdUtils;
@ -96,21 +97,67 @@ public class EmsAlarmActionStepServiceImpl implements IEmsAlarmActionStepService
* @return * @return
*/ */
@Override @Override
@Transactional(rollbackFor = Exception.class)
public int deleteEmsAlarmActionStepByObjIds(String[] objIds) public int deleteEmsAlarmActionStepByObjIds(String[] objIds)
{ {
return emsAlarmActionStepMapper.deleteEmsAlarmActionStepByObjIds(objIds); try {
int result = 0;
for (String objId : objIds) {
result += deleteEmsAlarmActionStepByObjId(objId);
}
return result;
} catch (Exception e) {
throw new RuntimeException("批量删除措施步骤失败: " + e.getMessage(), e);
}
} }
/** /**
* *
* *
* @param objId * @param objId
* @return * @return
*/ */
@Override @Override
@Transactional(rollbackFor = Exception.class)
public int deleteEmsAlarmActionStepByObjId(String objId) public int deleteEmsAlarmActionStepByObjId(String objId)
{ {
return emsAlarmActionStepMapper.deleteEmsAlarmActionStepByObjId(objId); try {
// 1. 查询要删除的措施步骤信息
EmsAlarmActionStep actionStep = emsAlarmActionStepMapper.selectEmsAlarmActionStepByObjId(objId);
if (actionStep == null) {
throw new RuntimeException("措施步骤不存在 ");
}
// 2. 删除该步骤关联的所有图片文件
EmsAlarmActionStepImage imageQuery = new EmsAlarmActionStepImage();
imageQuery.setActionStepObjId(objId);
List<EmsAlarmActionStepImage> images = emsAlarmActionStepImageMapper.selectEmsAlarmActionStepImageList(imageQuery);
if (images != null && !images.isEmpty()) {
for (EmsAlarmActionStepImage image : images) {
try {
// 删除物理文件
deleteImageFile(image.getImageUrl());
// 删除数据库记录
emsAlarmActionStepImageMapper.deleteEmsAlarmActionStepImageByObjId(image.getObjId());
} catch (Exception e) {
throw new RuntimeException("删除措施步骤图片失败,导致事务回滚: " + e.getMessage(), e);
}
}
System.out.println("删除措施步骤 " + actionStep.getDescription() + " 关联的 " + images.size() + " 张图片");
}
// 3. 最后删除措施步骤本身
int result = emsAlarmActionStepMapper.deleteEmsAlarmActionStepByObjId(objId);
if (result > 0) {
System.out.println("成功删除措施步骤: " + actionStep.getDescription() + " (ID: " + objId + ")");
}
return result;
} catch (Exception e) {
throw new RuntimeException("删除措施步骤失败: " + e.getMessage(), e);
}
} }
/** /**

@ -5,11 +5,15 @@ import java.util.Iterator;
import java.util.List; import java.util.List;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import com.os.common.exception.ServiceException;
import com.os.common.utils.DateUtils; import com.os.common.utils.DateUtils;
import com.os.common.utils.StringUtils; import com.os.common.utils.StringUtils;
import com.os.ems.base.domain.TreeSelects; import com.os.ems.base.domain.TreeSelects;
import com.os.ems.record.service.IEmsRecordAlarmRuleService;
import com.os.ems.record.domain.EmsRecordAlarmRule;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import com.os.ems.base.mapper.EmsBaseMonitorInfoMapper; import com.os.ems.base.mapper.EmsBaseMonitorInfoMapper;
import com.os.ems.base.domain.EmsBaseMonitorInfo; import com.os.ems.base.domain.EmsBaseMonitorInfo;
import com.os.ems.base.service.IEmsBaseMonitorInfoService; import com.os.ems.base.service.IEmsBaseMonitorInfoService;
@ -26,6 +30,9 @@ public class EmsBaseMonitorInfoServiceImpl implements IEmsBaseMonitorInfoService
@Autowired @Autowired
private EmsBaseMonitorInfoMapper emsBaseMonitorInfoMapper; private EmsBaseMonitorInfoMapper emsBaseMonitorInfoMapper;
@Autowired
private IEmsRecordAlarmRuleService emsRecordAlarmRuleService;
/** /**
* *
* *
@ -93,21 +100,60 @@ public class EmsBaseMonitorInfoServiceImpl implements IEmsBaseMonitorInfoService
* @return * @return
*/ */
@Override @Override
@Transactional(rollbackFor = Exception.class)
public int deleteEmsBaseMonitorInfoByObjIds(Long[] objIds) public int deleteEmsBaseMonitorInfoByObjIds(Long[] objIds)
{ {
for (Long objId : objIds){
// 3. 检查子设备(如果存在,则抛出异常)
EmsBaseMonitorInfo childQuery = new EmsBaseMonitorInfo();
childQuery.setParentId(objId);
List<EmsBaseMonitorInfo> childDevices = emsBaseMonitorInfoMapper.selectEmsBaseMonitorInfoList(childQuery);
if (childDevices != null && !childDevices.isEmpty()) {
throw new ServiceException("存在子节点,无法删除设备信息 ");
}
}
return emsBaseMonitorInfoMapper.deleteEmsBaseMonitorInfoByObjIds(objIds); return emsBaseMonitorInfoMapper.deleteEmsBaseMonitorInfoByObjIds(objIds);
} }
/** /**
* *
* *
* @param objId * @param objId
* @return * @return
*/ */
@Override @Override
@Transactional(rollbackFor = Exception.class)
public int deleteEmsBaseMonitorInfoByObjId(Long objId) public int deleteEmsBaseMonitorInfoByObjId(Long objId)
{ {
return emsBaseMonitorInfoMapper.deleteEmsBaseMonitorInfoByObjId(objId); // 1. 查询要删除的设备信息
EmsBaseMonitorInfo monitorInfo = emsBaseMonitorInfoMapper.selectEmsBaseMonitorInfoByObjId(objId);
if (monitorInfo == null) {
throw new RuntimeException("设备信息不存在 " );
}
// 3. 检查子设备(如果存在,则抛出异常)
EmsBaseMonitorInfo childQuery = new EmsBaseMonitorInfo();
childQuery.setParentId(objId);
List<EmsBaseMonitorInfo> childDevices = emsBaseMonitorInfoMapper.selectEmsBaseMonitorInfoList(childQuery);
if (childDevices != null && !childDevices.isEmpty()) {
throw new ServiceException("存在子节点,无法删除设备信息 ");
}
// 4. 删除该设备关联的所有异常规则(会级联删除措施步骤和图片)
EmsRecordAlarmRule alarmRuleQuery = new EmsRecordAlarmRule();
alarmRuleQuery.setMonitorId(monitorInfo.getMonitorCode());
List<EmsRecordAlarmRule> alarmRules = emsRecordAlarmRuleService.selectEmsRecordAlarmRuleList(alarmRuleQuery);
if (alarmRules != null && !alarmRules.isEmpty()) {
Long[] ruleIds = alarmRules.stream()
.map(EmsRecordAlarmRule::getObjId)
.toArray(Long[]::new);
// 级联删除异常规则(会自动删除关联的措施步骤和图片)
emsRecordAlarmRuleService.deleteEmsRecordAlarmRuleByObjIds(ruleIds);
}
// 5. 最后删除设备本身
int result = emsBaseMonitorInfoMapper.deleteEmsBaseMonitorInfoByObjId(objId);
return result;
} }
/** /**

@ -2,8 +2,11 @@ package com.os.ems.record.service.impl;
import java.util.List; import java.util.List;
import com.os.common.utils.DateUtils; import com.os.common.utils.DateUtils;
import com.os.ems.base.service.IEmsAlarmActionStepService;
import com.os.ems.base.domain.EmsAlarmActionStep;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import com.os.ems.record.mapper.EmsRecordAlarmRuleMapper; import com.os.ems.record.mapper.EmsRecordAlarmRuleMapper;
import com.os.ems.record.domain.EmsRecordAlarmRule; import com.os.ems.record.domain.EmsRecordAlarmRule;
import com.os.ems.record.service.IEmsRecordAlarmRuleService; import com.os.ems.record.service.IEmsRecordAlarmRuleService;
@ -20,6 +23,9 @@ public class EmsRecordAlarmRuleServiceImpl implements IEmsRecordAlarmRuleService
@Autowired @Autowired
private EmsRecordAlarmRuleMapper emsRecordAlarmRuleMapper; private EmsRecordAlarmRuleMapper emsRecordAlarmRuleMapper;
@Autowired
private IEmsAlarmActionStepService emsAlarmActionStepService;
/** /**
* *
* *
@ -77,21 +83,61 @@ public class EmsRecordAlarmRuleServiceImpl implements IEmsRecordAlarmRuleService
* @return * @return
*/ */
@Override @Override
@Transactional(rollbackFor = Exception.class)
public int deleteEmsRecordAlarmRuleByObjIds(Long[] objIds) public int deleteEmsRecordAlarmRuleByObjIds(Long[] objIds)
{ {
return emsRecordAlarmRuleMapper.deleteEmsRecordAlarmRuleByObjIds(objIds); try {
int result = 0;
for (Long objId : objIds) {
result += deleteEmsRecordAlarmRuleByObjId(objId);
}
return result;
} catch (Exception e) {
throw new RuntimeException("批量删除异常规则失败: " + e.getMessage(), e);
}
} }
/** /**
* *
* *
* @param objId * @param objId
* @return * @return
*/ */
@Override @Override
@Transactional(rollbackFor = Exception.class)
public int deleteEmsRecordAlarmRuleByObjId(Long objId) public int deleteEmsRecordAlarmRuleByObjId(Long objId)
{ {
return emsRecordAlarmRuleMapper.deleteEmsRecordAlarmRuleByObjId(objId); try {
// 1. 查询要删除的异常规则信息
EmsRecordAlarmRule alarmRule = emsRecordAlarmRuleMapper.selectEmsRecordAlarmRuleByObjId(objId);
if (alarmRule == null) {
throw new RuntimeException("异常规则不存在ID: " + objId);
}
// 2. 删除该规则关联的所有措施步骤(会级联删除图片文件)
List<EmsAlarmActionStep> actionSteps = emsAlarmActionStepService.selectEmsAlarmActionStepByRuleObjId(objId.toString());
if (actionSteps != null && !actionSteps.isEmpty()) {
String[] stepIds = actionSteps.stream()
.map(EmsAlarmActionStep::getObjId)
.toArray(String[]::new);
// 级联删除措施步骤(会自动删除关联的图片文件)
int deletedSteps = emsAlarmActionStepService.deleteEmsAlarmActionStepByObjIds(stepIds);
System.out.println("删除异常规则 " + alarmRule.getRuleName() + " 关联的 " + deletedSteps + " 个措施步骤");
}
// 3. 最后删除异常规则本身
int result = emsRecordAlarmRuleMapper.deleteEmsRecordAlarmRuleByObjId(objId);
if (result > 0) {
System.out.println("成功删除异常规则: " + alarmRule.getRuleName() + " (ID: " + objId + ")");
}
return result;
} catch (Exception e) {
throw new RuntimeException("删除异常规则失败: " + e.getMessage(), e);
}
} }
/** /**

Loading…
Cancel
Save