This commit is contained in:
parent
95b3be486a
commit
887b23e5ca
@ -3,6 +3,7 @@ package org.dromara.sis.service;
|
||||
|
||||
import com.baomidou.mybatisplus.extension.service.IService;
|
||||
import org.dromara.sis.domain.AlarmRecord;
|
||||
import org.springframework.transaction.annotation.Transactional;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
@ -19,6 +20,9 @@ public interface AlarmRecordService extends IService<AlarmRecord> {
|
||||
*/
|
||||
AlarmRecord convertFromMap(Map<String, Object> map);
|
||||
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
int saveOrUpdateRecords(List<AlarmRecord> records, Map<Long, List<Map<String, Object>>> operatorMap);
|
||||
|
||||
/**
|
||||
* 保存新的报警记录,并关联保存其操作记录
|
||||
* @param records 报警记录列表
|
||||
|
@ -3,6 +3,7 @@ package org.dromara.sis.service;
|
||||
|
||||
import com.baomidou.mybatisplus.extension.service.IService;
|
||||
import org.dromara.sis.domain.AlarmTaskOperator;
|
||||
import org.springframework.transaction.annotation.Transactional;
|
||||
|
||||
|
||||
import java.util.List;
|
||||
@ -21,6 +22,9 @@ public interface AlarmTaskOperatorService extends IService<AlarmTaskOperator> {
|
||||
*/
|
||||
List<AlarmTaskOperator> convertFromMaps(Long alarmRecordId, List<Map<String, Object>> operatorMaps);
|
||||
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
int saveOrUpdateOperators(List<AlarmTaskOperator> operators);
|
||||
|
||||
/**
|
||||
* 批量保存操作记录,自动过滤已存在的记录
|
||||
* @param operators 操作记录列表
|
||||
|
@ -27,6 +27,105 @@ public class AlarmRecordServiceImpl extends ServiceImpl<AlarmRecordMapper, Alarm
|
||||
@Autowired
|
||||
private AlarmTaskOperatorService taskOperatorService;
|
||||
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
@Override
|
||||
public int saveOrUpdateRecords(List<AlarmRecord> records, Map<Long, List<Map<String, Object>>> operatorMap) {
|
||||
if (records == null || records.isEmpty()) return 0;
|
||||
|
||||
// 提取记录ID列表
|
||||
List<Long> ids = records.stream().map(AlarmRecord::getId).collect(Collectors.toList());
|
||||
|
||||
// 查询数据库中已存在的记录
|
||||
LambdaQueryWrapper<AlarmRecord> queryWrapper = new LambdaQueryWrapper<>();
|
||||
queryWrapper.in(AlarmRecord::getId, ids);
|
||||
List<AlarmRecord> existingRecords = this.list(queryWrapper);
|
||||
|
||||
// 创建现有记录的映射,便于快速查找
|
||||
Map<Long, AlarmRecord> existingRecordMap = existingRecords.stream()
|
||||
.collect(Collectors.toMap(AlarmRecord::getId, record -> record));
|
||||
|
||||
List<AlarmRecord> newRecords = new ArrayList<>();
|
||||
List<AlarmRecord> updateRecords = new ArrayList<>();
|
||||
|
||||
// 分类处理记录
|
||||
for (AlarmRecord record : records) {
|
||||
if (existingRecordMap.containsKey(record.getId())) {
|
||||
// 如果记录已存在,检查是否需要更新
|
||||
AlarmRecord existing = existingRecordMap.get(record.getId());
|
||||
if (hasRecordChanges(existing, record)) {
|
||||
updateRecords.add(record);
|
||||
}
|
||||
} else {
|
||||
// 新记录
|
||||
newRecords.add(record);
|
||||
}
|
||||
}
|
||||
|
||||
int result = 0;
|
||||
|
||||
// 批量插入新记录
|
||||
if (!newRecords.isEmpty()) {
|
||||
if (this.saveBatch(newRecords)) {
|
||||
result += newRecords.size();
|
||||
// 保存关联的操作记录
|
||||
saveRelatedOperators(newRecords, operatorMap);
|
||||
}
|
||||
}
|
||||
|
||||
// 批量更新修改过的记录
|
||||
if (!updateRecords.isEmpty()) {
|
||||
if (this.updateBatchById(updateRecords)) {
|
||||
result += updateRecords.size();
|
||||
// 保存关联的操作记录
|
||||
saveRelatedOperators(updateRecords, operatorMap);
|
||||
}
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* 检查两个AlarmRecord对象是否有变化
|
||||
*/
|
||||
private boolean hasRecordChanges(AlarmRecord existing, AlarmRecord updated) {
|
||||
return !java.util.Objects.equals(existing.getTaskCode(), updated.getTaskCode()) ||
|
||||
!java.util.Objects.equals(existing.getDeviceId(), updated.getDeviceId()) ||
|
||||
!java.util.Objects.equals(existing.getDeviceName(), updated.getDeviceName()) ||
|
||||
!java.util.Objects.equals(existing.getDeviceLicenseId(), updated.getDeviceLicenseId()) ||
|
||||
!java.util.Objects.equals(existing.getDeviceSipNum(), updated.getDeviceSipNum()) ||
|
||||
!java.util.Objects.equals(existing.getDeviceLng(), updated.getDeviceLng()) ||
|
||||
!java.util.Objects.equals(existing.getDeviceLat(), updated.getDeviceLat()) ||
|
||||
!java.util.Objects.equals(existing.getConferenceId(), updated.getConferenceId()) ||
|
||||
!java.util.Objects.equals(existing.getConfSipCode(), updated.getConfSipCode()) ||
|
||||
!java.util.Objects.equals(existing.getState(), updated.getState()) ||
|
||||
!java.util.Objects.equals(existing.getStartTime(), updated.getStartTime()) ||
|
||||
!java.util.Objects.equals(existing.getStartTimeUnix(), updated.getStartTimeUnix()) ||
|
||||
!java.util.Objects.equals(existing.getFinishTime(), updated.getFinishTime()) ||
|
||||
!java.util.Objects.equals(existing.getFinishTimeUnix(), updated.getFinishTimeUnix()) ||
|
||||
!java.util.Objects.equals(existing.getRingingTime(), updated.getRingingTime()) ||
|
||||
!java.util.Objects.equals(existing.getRingingTimeUnix(), updated.getRingingTimeUnix()) ||
|
||||
!java.util.Objects.equals(existing.getExpireTime(), updated.getExpireTime()) ||
|
||||
!java.util.Objects.equals(existing.getExpireTimeUnix(), updated.getExpireTimeUnix()) ||
|
||||
!java.util.Objects.equals(existing.getCallExpireTime(), updated.getCallExpireTime()) ||
|
||||
!java.util.Objects.equals(existing.getCallExpireTimeUnix(), updated.getCallExpireTimeUnix()) ||
|
||||
!java.util.Objects.equals(existing.getCallTime(), updated.getCallTime()) ||
|
||||
!java.util.Objects.equals(existing.getCallTimeUnix(), updated.getCallTimeUnix()) ||
|
||||
!java.util.Objects.equals(existing.getDeviceWithCamera(), updated.getDeviceWithCamera()) ||
|
||||
!java.util.Objects.equals(existing.getCompanyCode(), updated.getCompanyCode()) ||
|
||||
!java.util.Objects.equals(existing.getAlarmType(), updated.getAlarmType()) ||
|
||||
!java.util.Objects.equals(existing.getBusinessType(), updated.getBusinessType()) ||
|
||||
!java.util.Objects.equals(existing.getGroupId(), updated.getGroupId()) ||
|
||||
!java.util.Objects.equals(existing.getReportNotifyLevel(), updated.getReportNotifyLevel()) ||
|
||||
!java.util.Objects.equals(existing.getIsHold(), updated.getIsHold()) ||
|
||||
!java.util.Objects.equals(existing.getDisplayAlarmType(), updated.getDisplayAlarmType()) ||
|
||||
!java.util.Objects.equals(existing.getAcceptType(), updated.getAcceptType()) ||
|
||||
!java.util.Objects.equals(existing.getGroupName(), updated.getGroupName()) ||
|
||||
!java.util.Objects.equals(existing.getDeviceLinkman(), updated.getDeviceLinkman()) ||
|
||||
!java.util.Objects.equals(existing.getDevicePhoneNum(), updated.getDevicePhoneNum());
|
||||
}
|
||||
|
||||
|
||||
|
||||
@Override
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
public int saveNewRecords(List<AlarmRecord> records, Map<Long, List<Map<String, Object>>> operatorMap) {
|
||||
@ -75,7 +174,7 @@ public class AlarmRecordServiceImpl extends ServiceImpl<AlarmRecordMapper, Alarm
|
||||
|
||||
// 批量保存操作记录
|
||||
if (!allOperators.isEmpty()) {
|
||||
taskOperatorService.saveNewOperators(allOperators);
|
||||
taskOperatorService.saveOrUpdateOperators(allOperators);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -21,6 +21,98 @@ import java.util.stream.Collectors;
|
||||
@Service
|
||||
public class AlarmTaskOperatorServiceImpl extends ServiceImpl<AlarmTaskOperatorMapper, AlarmTaskOperator> implements AlarmTaskOperatorService {
|
||||
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
@Override
|
||||
public int saveOrUpdateOperators(List<AlarmTaskOperator> operators) {
|
||||
if (operators == null || operators.isEmpty()) return 0;
|
||||
|
||||
// 生成唯一键集合 (alarmRecordId_operatorId)
|
||||
List<String> uniqueKeys = operators.stream()
|
||||
.map(op -> op.getAlarmRecordId() + "_" + op.getOperatorId())
|
||||
.collect(Collectors.toList());
|
||||
|
||||
// 查询已存在的记录
|
||||
LambdaQueryWrapper<AlarmTaskOperator> queryWrapper = new LambdaQueryWrapper<>();
|
||||
boolean first = true;
|
||||
for (String uniqueKey : uniqueKeys) {
|
||||
String[] parts = uniqueKey.split("_");
|
||||
if (parts.length == 2) {
|
||||
Long alarmRecordId = Long.parseLong(parts[0]);
|
||||
Integer operatorId = Integer.parseInt(parts[1]);
|
||||
|
||||
if (!first) {
|
||||
queryWrapper.or();
|
||||
}
|
||||
queryWrapper.nested(wrapper ->
|
||||
wrapper.eq(AlarmTaskOperator::getAlarmRecordId, alarmRecordId)
|
||||
.eq(AlarmTaskOperator::getOperatorId, operatorId)
|
||||
);
|
||||
first = false;
|
||||
}
|
||||
}
|
||||
|
||||
List<AlarmTaskOperator> existingRecords = this.list(queryWrapper);
|
||||
|
||||
// 创建现有记录的映射,便于快速查找
|
||||
Map<String, AlarmTaskOperator> existingRecordMap = existingRecords.stream()
|
||||
.collect(Collectors.toMap(
|
||||
op -> op.getAlarmRecordId() + "_" + op.getOperatorId(),
|
||||
op -> op
|
||||
));
|
||||
|
||||
List<AlarmTaskOperator> newRecords = new ArrayList<>();
|
||||
List<AlarmTaskOperator> updateRecords = new ArrayList<>();
|
||||
|
||||
// 分类处理记录
|
||||
for (AlarmTaskOperator operator : operators) {
|
||||
String key = operator.getAlarmRecordId() + "_" + operator.getOperatorId();
|
||||
if (existingRecordMap.containsKey(key)) {
|
||||
// 如果记录已存在,检查是否需要更新
|
||||
AlarmTaskOperator existing = existingRecordMap.get(key);
|
||||
if (hasChanges(existing, operator)) {
|
||||
// 更新ID以确保正确更新
|
||||
operator.setId(existing.getId());
|
||||
updateRecords.add(operator);
|
||||
}
|
||||
} else {
|
||||
// 新记录
|
||||
newRecords.add(operator);
|
||||
}
|
||||
}
|
||||
|
||||
int result = 0;
|
||||
// 批量插入新记录
|
||||
if (!newRecords.isEmpty()) {
|
||||
result += this.saveBatch(newRecords) ? newRecords.size() : 0;
|
||||
}
|
||||
|
||||
// 批量更新修改过的记录
|
||||
if (!updateRecords.isEmpty()) {
|
||||
result += this.updateBatchById(updateRecords) ? updateRecords.size() : 0;
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* 检查两个AlarmTaskOperator对象是否有变化
|
||||
*/
|
||||
private boolean hasChanges(AlarmTaskOperator existing, AlarmTaskOperator updated) {
|
||||
return !java.util.Objects.equals(existing.getAlarmId(), updated.getAlarmId()) ||
|
||||
!java.util.Objects.equals(existing.getTaskCode(), updated.getTaskCode()) ||
|
||||
!java.util.Objects.equals(existing.getUserId(), updated.getUserId()) ||
|
||||
!java.util.Objects.equals(existing.getUserType(), updated.getUserType()) ||
|
||||
!java.util.Objects.equals(existing.getNickName(), updated.getNickName()) ||
|
||||
!java.util.Objects.equals(existing.getAvatarUrl(), updated.getAvatarUrl()) ||
|
||||
!java.util.Objects.equals(existing.getSipNum(), updated.getSipNum()) ||
|
||||
!java.util.Objects.equals(existing.getAnswerTime(), updated.getAnswerTime()) ||
|
||||
!java.util.Objects.equals(existing.getAnswerTimeUnix(), updated.getAnswerTimeUnix()) ||
|
||||
!java.util.Objects.equals(existing.getFinishTime(), updated.getFinishTime()) ||
|
||||
!java.util.Objects.equals(existing.getFinishTimeUnix(), updated.getFinishTimeUnix()) ||
|
||||
!java.util.Objects.equals(existing.getTransferLevel(), updated.getTransferLevel());
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
public int saveNewOperators(List<AlarmTaskOperator> operators) {
|
||||
|
@ -1,6 +1,9 @@
|
||||
package org.dromara.sis.task;
|
||||
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.apache.dubbo.config.annotation.DubboReference;
|
||||
import org.dromara.property.api.RemoteFloorService;
|
||||
import org.dromara.property.api.domain.vo.RemoteFloorVo;
|
||||
import org.dromara.sis.domain.AlarmRecord;
|
||||
import org.dromara.sis.service.AlarmRecordService;
|
||||
import org.dromara.sis.service.ApiService;
|
||||
@ -77,7 +80,7 @@ public class DataSyncTask {
|
||||
}
|
||||
|
||||
// 保存数据(包含操作记录)
|
||||
int savedCount = alarmRecordService.saveNewRecords(records, operatorMap);
|
||||
int savedCount = alarmRecordService.saveOrUpdateRecords(records, operatorMap);
|
||||
totalSynced += savedCount;
|
||||
|
||||
log.info("第 {} 页同步完成,共 {} 条记录,新增 {} 条", pageNum, recordList.size(), savedCount);
|
||||
|
Loading…
Reference in New Issue
Block a user