diff --git a/ruoyi-modules/Property/src/main/java/org/dromara/property/controller/InspectionTaskDetailController.java b/ruoyi-modules/Property/src/main/java/org/dromara/property/controller/InspectionTaskDetailController.java index 78f70f8b..c080cd01 100644 --- a/ruoyi-modules/Property/src/main/java/org/dromara/property/controller/InspectionTaskDetailController.java +++ b/ruoyi-modules/Property/src/main/java/org/dromara/property/controller/InspectionTaskDetailController.java @@ -40,7 +40,7 @@ public class InspectionTaskDetailController extends BaseController { /** * 查询巡检明细列表 */ - @SaCheckPermission("system:taskDetail:list") + //@SaCheckPermission("system:taskDetail:list") @GetMapping("/list") public TableDataInfo list(InspectionTaskDetailBo bo, PageQuery pageQuery) { return inspectionTaskDetailService.queryPageList(bo, pageQuery); diff --git a/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/bo/ResidentPersonBo.java b/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/bo/ResidentPersonBo.java index da62b997..706a9c32 100644 --- a/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/bo/ResidentPersonBo.java +++ b/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/bo/ResidentPersonBo.java @@ -41,7 +41,7 @@ public class ResidentPersonBo extends BaseEntity { /** * 人员类型 */ - @NotBlank(message = "人员类型不能为空", groups = { AddGroup.class, EditGroup.class }) + //@NotBlank(message = "人员类型不能为空", groups = { AddGroup.class, EditGroup.class }) private String type; /** * 性别 diff --git a/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/bo/TbBuildingBo.java b/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/bo/TbBuildingBo.java index 2205ff6b..458da36d 100644 --- a/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/bo/TbBuildingBo.java +++ b/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/bo/TbBuildingBo.java @@ -75,13 +75,13 @@ public class TbBuildingBo extends BaseEntity { /** * 经度 */ - @NotBlank(message = "经度不能为空", groups = {AddGroup.class, EditGroup.class}) + //@NotBlank(message = "经度不能为空", groups = {AddGroup.class, EditGroup.class}) private String lon; /** * 维度 */ - @NotBlank(message = "维度不能为空", groups = {AddGroup.class, EditGroup.class}) + //@NotBlank(message = "维度不能为空", groups = {AddGroup.class, EditGroup.class}) private String lat; /** diff --git a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/service/AlarmRecordService.java b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/service/AlarmRecordService.java index dc650a55..a9a55362 100644 --- a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/service/AlarmRecordService.java +++ b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/service/AlarmRecordService.java @@ -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 convertFromMap(Map map); + @Transactional(rollbackFor = Exception.class) + int saveOrUpdateRecords(List records, Map>> operatorMap); + /** * 保存新的报警记录,并关联保存其操作记录 * @param records 报警记录列表 diff --git a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/service/AlarmTaskOperatorService.java b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/service/AlarmTaskOperatorService.java index b20d9042..8faac488 100644 --- a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/service/AlarmTaskOperatorService.java +++ b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/service/AlarmTaskOperatorService.java @@ -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 { */ List convertFromMaps(Long alarmRecordId, List> operatorMaps); + @Transactional(rollbackFor = Exception.class) + int saveOrUpdateOperators(List operators); + /** * 批量保存操作记录,自动过滤已存在的记录 * @param operators 操作记录列表 diff --git a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/service/impl/AlarmRecordServiceImpl.java b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/service/impl/AlarmRecordServiceImpl.java index 043448a7..59e1a7e8 100644 --- a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/service/impl/AlarmRecordServiceImpl.java +++ b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/service/impl/AlarmRecordServiceImpl.java @@ -27,6 +27,105 @@ public class AlarmRecordServiceImpl extends ServiceImpl records, Map>> operatorMap) { + if (records == null || records.isEmpty()) return 0; + + // 提取记录ID列表 + List ids = records.stream().map(AlarmRecord::getId).collect(Collectors.toList()); + + // 查询数据库中已存在的记录 + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.in(AlarmRecord::getId, ids); + List existingRecords = this.list(queryWrapper); + + // 创建现有记录的映射,便于快速查找 + Map existingRecordMap = existingRecords.stream() + .collect(Collectors.toMap(AlarmRecord::getId, record -> record)); + + List newRecords = new ArrayList<>(); + List 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 records, Map>> operatorMap) { @@ -75,7 +174,7 @@ public class AlarmRecordServiceImpl extends ServiceImpl implements AlarmTaskOperatorService { + @Transactional(rollbackFor = Exception.class) + @Override + public int saveOrUpdateOperators(List operators) { + if (operators == null || operators.isEmpty()) return 0; + + // 生成唯一键集合 (alarmRecordId_operatorId) + List uniqueKeys = operators.stream() + .map(op -> op.getAlarmRecordId() + "_" + op.getOperatorId()) + .collect(Collectors.toList()); + + // 查询已存在的记录 + LambdaQueryWrapper 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 existingRecords = this.list(queryWrapper); + + // 创建现有记录的映射,便于快速查找 + Map existingRecordMap = existingRecords.stream() + .collect(Collectors.toMap( + op -> op.getAlarmRecordId() + "_" + op.getOperatorId(), + op -> op + )); + + List newRecords = new ArrayList<>(); + List 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 operators) { diff --git a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/task/DataSyncTask.java b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/task/DataSyncTask.java index f4e725df..438e9c12 100644 --- a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/task/DataSyncTask.java +++ b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/task/DataSyncTask.java @@ -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);