|
@@ -7,13 +7,18 @@ import com.zksy.base.alarm.domain.AlarmData;
|
|
|
import com.zksy.base.alarm.mapper.AlarmDataMapper;
|
|
import com.zksy.base.alarm.mapper.AlarmDataMapper;
|
|
|
import com.zksy.base.alarm.service.AlarmDataService;
|
|
import com.zksy.base.alarm.service.AlarmDataService;
|
|
|
import com.zksy.base.domain.EquipmentBase;
|
|
import com.zksy.base.domain.EquipmentBase;
|
|
|
|
|
+import com.zksy.base.domain.EquipmentType;
|
|
|
import com.zksy.base.mapper.EquipmentBaseMapper;
|
|
import com.zksy.base.mapper.EquipmentBaseMapper;
|
|
|
|
|
+import com.zksy.base.mapper.EquipmentTypeMapper;
|
|
|
import com.zksy.ops.mapper.WorkOrderMapper;
|
|
import com.zksy.ops.mapper.WorkOrderMapper;
|
|
|
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 java.time.LocalDateTime;
|
|
import java.time.LocalDateTime;
|
|
|
|
|
+import java.util.ArrayList;
|
|
|
|
|
+import java.util.LinkedHashSet;
|
|
|
import java.util.List;
|
|
import java.util.List;
|
|
|
|
|
+import java.util.Set;
|
|
|
import java.util.stream.Collectors;
|
|
import java.util.stream.Collectors;
|
|
|
|
|
|
|
|
@Service
|
|
@Service
|
|
@@ -23,6 +28,9 @@ public class AlarmDataServiceImpl extends ServiceImpl<AlarmDataMapper, AlarmData
|
|
|
@Autowired
|
|
@Autowired
|
|
|
private EquipmentBaseMapper equipmentBaseMapper;
|
|
private EquipmentBaseMapper equipmentBaseMapper;
|
|
|
|
|
|
|
|
|
|
+ @Autowired
|
|
|
|
|
+ private EquipmentTypeMapper equipmentTypeMapper;
|
|
|
|
|
+
|
|
|
@Autowired
|
|
@Autowired
|
|
|
private WorkOrderMapper workOrderMapper;
|
|
private WorkOrderMapper workOrderMapper;
|
|
|
|
|
|
|
@@ -32,38 +40,18 @@ public class AlarmDataServiceImpl extends ServiceImpl<AlarmDataMapper, AlarmData
|
|
|
Integer alarmStatus, String equipmentType,
|
|
Integer alarmStatus, String equipmentType,
|
|
|
String startTime, String endTime) {
|
|
String startTime, String endTime) {
|
|
|
Page<AlarmData> page = new Page<>(pageNum, pageSize);
|
|
Page<AlarmData> page = new Page<>(pageNum, pageSize);
|
|
|
- LambdaQueryWrapper<AlarmData> queryWrapper = new LambdaQueryWrapper<>();
|
|
|
|
|
|
|
|
|
|
- // 当传入 equipmentType='drainage' 时,通过 equipment_base 关联查询排水类设备编码列表
|
|
|
|
|
- // alarm_data 表的 warning_type 字段含义不同于 early_warning 表,不能直接用 '2' 过滤
|
|
|
|
|
- if ("drainage".equals(equipmentType)) {
|
|
|
|
|
- LambdaQueryWrapper<EquipmentBase> eqQuery = new LambdaQueryWrapper<>();
|
|
|
|
|
- eqQuery.in(EquipmentBase::getEquipmentTypeId, "6", "7", "8", "9")
|
|
|
|
|
- .select(EquipmentBase::getEquipmentCode);
|
|
|
|
|
- List<EquipmentBase> devices = equipmentBaseMapper.selectList(eqQuery);
|
|
|
|
|
- List<String> deviceCodes = devices.stream()
|
|
|
|
|
- .map(EquipmentBase::getEquipmentCode)
|
|
|
|
|
- .filter(code -> code != null && !code.isEmpty())
|
|
|
|
|
- .collect(Collectors.toList());
|
|
|
|
|
- if (deviceCodes.isEmpty()) {
|
|
|
|
|
- // 没有排水类设备,直接返回空结果
|
|
|
|
|
|
|
+ // 当传入 equipmentType='drainage' 时,通过设备类型树关联查询排水类设备编码列表。
|
|
|
|
|
+ // 不能再写死历史类型 ID:当前排水根类型为 2,子类型由 equipment_type.parent_id 维护。
|
|
|
|
|
+ List<String> deviceCodes = deviceCodesForQuery(equipmentType);
|
|
|
|
|
+ if ("drainage".equals(equipmentType) && (deviceCodes == null || deviceCodes.isEmpty())) {
|
|
|
return new Page<>(pageNum, pageSize);
|
|
return new Page<>(pageNum, pageSize);
|
|
|
- }
|
|
|
|
|
- queryWrapper.in(AlarmData::getDeviceCode, deviceCodes);
|
|
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- queryWrapper.like(deviceCode != null, AlarmData::getDeviceCode, deviceCode)
|
|
|
|
|
- .like(warningType != null, AlarmData::getWarningType, warningType)
|
|
|
|
|
- .like(warningCode != null, AlarmData::getWarningCode, warningCode)
|
|
|
|
|
- .eq(alarmStatus != null, AlarmData::getAlarmStatus, alarmStatus);
|
|
|
|
|
- if (startTime != null && !startTime.isEmpty()) {
|
|
|
|
|
- queryWrapper.ge(AlarmData::getAlarmTime, parseDateTime(startTime));
|
|
|
|
|
- }
|
|
|
|
|
- if (endTime != null && !endTime.isEmpty()) {
|
|
|
|
|
- queryWrapper.le(AlarmData::getAlarmTime, parseDateTime(endTime));
|
|
|
|
|
- }
|
|
|
|
|
- queryWrapper.orderByDesc(AlarmData::getAlarmTime);
|
|
|
|
|
- Page<AlarmData> result = this.page(page, queryWrapper);
|
|
|
|
|
|
|
+ // 数据库先按设备编码保留最新一条,再执行分页,避免内存去重造成分页漏数据。
|
|
|
|
|
+ Page<AlarmData> result = (Page<AlarmData>) baseMapper.selectLatestPage(
|
|
|
|
|
+ page, deviceCodes, deviceCode, warningType,
|
|
|
|
|
+ warningCode, alarmStatus, parseStartTime(startTime), parseEndTime(endTime));
|
|
|
|
|
|
|
|
// 填充 deviceName/longitude/latitude:通过 device_code 从 equipment_base 表关联查询
|
|
// 填充 deviceName/longitude/latitude:通过 device_code 从 equipment_base 表关联查询
|
|
|
fillDeviceInfo(result.getRecords());
|
|
fillDeviceInfo(result.getRecords());
|
|
@@ -73,6 +61,66 @@ public class AlarmDataServiceImpl extends ServiceImpl<AlarmDataMapper, AlarmData
|
|
|
return result;
|
|
return result;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+ private List<String> deviceCodesForQuery(String equipmentType) {
|
|
|
|
|
+ if (!"drainage".equals(equipmentType)) {
|
|
|
|
|
+ return null;
|
|
|
|
|
+ }
|
|
|
|
|
+ List<String> drainageTypeIds = findDrainageTypeIds();
|
|
|
|
|
+ if (drainageTypeIds.isEmpty()) {
|
|
|
|
|
+ return List.of();
|
|
|
|
|
+ }
|
|
|
|
|
+ LambdaQueryWrapper<EquipmentBase> eqQuery = new LambdaQueryWrapper<>();
|
|
|
|
|
+ eqQuery.in(EquipmentBase::getEquipmentTypeId, drainageTypeIds)
|
|
|
|
|
+ .select(EquipmentBase::getEquipmentCode);
|
|
|
|
|
+ return equipmentBaseMapper.selectList(eqQuery).stream()
|
|
|
|
|
+ .map(EquipmentBase::getEquipmentCode)
|
|
|
|
|
+ .filter(code -> code != null && !code.isEmpty())
|
|
|
|
|
+ .distinct()
|
|
|
|
|
+ .collect(Collectors.toList());
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ /**
|
|
|
|
|
+ * 读取排水设备根类型及其全部后代类型,避免设备类型调整后报警列表被错误过滤为空。
|
|
|
|
|
+ */
|
|
|
|
|
+ private List<String> findDrainageTypeIds() {
|
|
|
|
|
+ List<EquipmentType> allTypes = equipmentTypeMapper.selectList(null);
|
|
|
|
|
+ if (allTypes == null || allTypes.isEmpty()) {
|
|
|
|
|
+ return new ArrayList<>();
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ Set<Integer> drainageIds = new LinkedHashSet<>();
|
|
|
|
|
+ for (EquipmentType type : allTypes) {
|
|
|
|
|
+ if (type == null || type.getId() == null) {
|
|
|
|
|
+ continue;
|
|
|
|
|
+ }
|
|
|
|
|
+ boolean namedDrainageRoot = "排水设备".equals(type.getTypeName())
|
|
|
|
|
+ && (type.getParentId() == null || type.getParentId() == 0);
|
|
|
|
|
+ boolean currentDrainageRoot = type.getId() == 2
|
|
|
|
|
+ && (type.getParentId() == null || type.getParentId() == 0);
|
|
|
|
|
+ if (namedDrainageRoot || currentDrainageRoot) {
|
|
|
|
|
+ drainageIds.add(type.getId());
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ // 兼容数据中根类型名称被修改但仍使用稳定业务 ID=2 的情况。
|
|
|
|
|
+ if (drainageIds.isEmpty()) {
|
|
|
|
|
+ drainageIds.add(2);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ boolean added;
|
|
|
|
|
+ do {
|
|
|
|
|
+ added = false;
|
|
|
|
|
+ for (EquipmentType type : allTypes) {
|
|
|
|
|
+ if (type != null && type.getId() != null && type.getParentId() != null
|
|
|
|
|
+ && drainageIds.contains(type.getParentId())) {
|
|
|
|
|
+ added |= drainageIds.add(type.getId());
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ } while (added);
|
|
|
|
|
+
|
|
|
|
|
+ return drainageIds.stream().map(String::valueOf).collect(Collectors.toList());
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
private void fillWorkOrderStatus(List<AlarmData> records) {
|
|
private void fillWorkOrderStatus(List<AlarmData> records) {
|
|
|
if (records == null || records.isEmpty()) {
|
|
if (records == null || records.isEmpty()) {
|
|
|
return;
|
|
return;
|
|
@@ -106,6 +154,25 @@ public class AlarmDataServiceImpl extends ServiceImpl<AlarmDataMapper, AlarmData
|
|
|
return LocalDateTime.parse(value, java.time.format.DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
|
|
return LocalDateTime.parse(value, java.time.format.DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+ private LocalDateTime parseStartTime(String value) {
|
|
|
|
|
+ return parseDateTime(value, " 00:00:00");
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ private LocalDateTime parseEndTime(String value) {
|
|
|
|
|
+ return parseDateTime(value, " 23:59:59");
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ private LocalDateTime parseDateTime(String value, String dateSuffix) {
|
|
|
|
|
+ if (value == null || value.trim().isEmpty()) {
|
|
|
|
|
+ return null;
|
|
|
|
|
+ }
|
|
|
|
|
+ String normalized = value.trim();
|
|
|
|
|
+ if (normalized.length() == 10) {
|
|
|
|
|
+ normalized += dateSuffix;
|
|
|
|
|
+ }
|
|
|
|
|
+ return parseDateTime(normalized);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
/**
|
|
/**
|
|
|
* 根据 deviceCode 从 equipment_base 表批量填充 deviceName、longitude、latitude
|
|
* 根据 deviceCode 从 equipment_base 表批量填充 deviceName、longitude、latitude
|
|
|
*/
|
|
*/
|