SOS同步
Some checks are pending
Gitea Actions Demo / Explore-Gitea-Actions (push) Waiting to run

This commit is contained in:
mocheng 2025-07-28 17:04:22 +08:00
parent 95b3be486a
commit 887b23e5ca
5 changed files with 204 additions and 2 deletions

View File

@ -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 报警记录列表

View File

@ -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 操作记录列表

View File

@ -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);
}
}

View File

@ -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) {

View File

@ -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);