Browse Source

feat: 新增channel树的deviceSource筛选;新增对channel表capabilities字段的汇聚;新增汇聚area/eqpbook/channel表的order_num字段自定义排序

feature/agg
yinhuaiwei 3 weeks ago
parent
commit
2811ed7568
10 changed files with 126 additions and 11 deletions
  1. +1
    -1
      inspect-common/inspect-common-security/src/main/java/com/inspect/common/security/handler/GlobalExceptionHandler.java
  2. +2
    -0
      inspect-main/inspect-main-agg/src/main/java/com/inspect/agg/entity/AggBasedataEqpbook.java
  3. +4
    -0
      inspect-main/inspect-main-agg/src/main/java/com/inspect/agg/entity/AggBasedataEqpbookChannel.java
  4. +57
    -0
      inspect-main/inspect-main-agg/src/main/java/com/inspect/agg/service/AggDeviceTreeService.java
  5. +1
    -0
      inspect-main/inspect-main-agg/src/main/java/com/inspect/agg/service/ChannelSyncService.java
  6. +51
    -4
      inspect-main/inspect-main-agg/src/main/java/com/inspect/agg/service/EqpbookTreeService.java
  7. +2
    -1
      inspect-main/inspect-main-agg/src/main/java/com/inspect/agg/web/AggTreeController.java
  8. +0
    -1
      inspect-main/inspect-main-agg/src/main/resources/mapper/AggBasedataAreaMapper.xml
  9. +6
    -3
      inspect-main/inspect-main-agg/src/main/resources/mapper/AggBasedataEqpbookChannelMapper.xml
  10. +2
    -1
      inspect-main/inspect-main-agg/src/main/resources/mapper/AggBasedataEqpbookMapper.xml

+ 1
- 1
inspect-common/inspect-common-security/src/main/java/com/inspect/common/security/handler/GlobalExceptionHandler.java View File

@ -50,7 +50,7 @@ public class GlobalExceptionHandler {
public AjaxResult handleServiceException(ServiceException e, HttpServletRequest request) { public AjaxResult handleServiceException(ServiceException e, HttpServletRequest request) {
log.error(e.getMessage(), e); log.error(e.getMessage(), e);
Integer code = e.getCode(); Integer code = e.getCode();
return StringUtils.isNotNull(code) ? AjaxResult.error(code, "服务器异常,请稍后再试", e.getMessage()) : AjaxResult.error("服务器异常,请稍后再试", e.getMessage());
return StringUtils.isNotNull(code) ? AjaxResult.error(code, e.getMessage()) : AjaxResult.error(e.getMessage());
} }
@ExceptionHandler({RuntimeException.class}) @ExceptionHandler({RuntimeException.class})


+ 2
- 0
inspect-main/inspect-main-agg/src/main/java/com/inspect/agg/entity/AggBasedataEqpbook.java View File

@ -17,6 +17,8 @@ public class AggBasedataEqpbook {
private String stationCode; private String stationCode;
/** 源台账 id */ /** 源台账 id */
private Long eqpbookId; private Long eqpbookId;
/** 汇聚自定义显示顺序 */
private Integer orderNum;
private String patrolDeviceCode; private String patrolDeviceCode;
private String patrolDeviceName; private String patrolDeviceName;
private String stationName; private String stationName;


+ 4
- 0
inspect-main/inspect-main-agg/src/main/java/com/inspect/agg/entity/AggBasedataEqpbookChannel.java View File

@ -18,6 +18,8 @@ public class AggBasedataEqpbookChannel {
private String stationName; private String stationName;
/** 源通道 id */ /** 源通道 id */
private Long channelId; private Long channelId;
/** 汇聚自定义显示顺序 */
private Integer orderNum;
private String channelCode; private String channelCode;
private String channelName; private String channelName;
/** vl/ir/ptz/ng */ /** vl/ir/ptz/ng */
@ -34,6 +36,8 @@ public class AggBasedataEqpbookChannel {
private String patrolDeviceCode; private String patrolDeviceCode;
private String upSystemDeviceCode; private String upSystemDeviceCode;
private String deviceSource; private String deviceSource;
/** 通道能力(JSON 字符串,树接口返回时解析为对象) */
private String capabilities;
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private LocalDateTime updateTime; private LocalDateTime updateTime;
private LocalDateTime syncedAt; private LocalDateTime syncedAt;


+ 57
- 0
inspect-main/inspect-main-agg/src/main/java/com/inspect/agg/service/AggDeviceTreeService.java View File

@ -2,6 +2,8 @@ package com.inspect.agg.service;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collections; import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.Iterator; import java.util.Iterator;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
@ -10,9 +12,12 @@ import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils; import org.springframework.util.StringUtils;
import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.node.ArrayNode;
import com.fasterxml.jackson.databind.node.ObjectNode; import com.fasterxml.jackson.databind.node.ObjectNode;
import com.inspect.agg.config.AggProperties; import com.inspect.agg.config.AggProperties;
import com.inspect.agg.entity.AggBasedataArea;
import com.inspect.agg.entity.AggStation; import com.inspect.agg.entity.AggStation;
import com.inspect.agg.mapper.AggBasedataAreaMapper;
import com.inspect.agg.station.StationApiClient; import com.inspect.agg.station.StationApiClient;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
@ -30,6 +35,7 @@ public class AggDeviceTreeService {
private final StationRegistry stationRegistry; private final StationRegistry stationRegistry;
private final StationApiClient stationApiClient; private final StationApiClient stationApiClient;
private final AggProperties props; private final AggProperties props;
private final AggBasedataAreaMapper areaMapper;
public List<JsonNode> loadRelationTree(String stationCode, Map<String, String> params) { public List<JsonNode> loadRelationTree(String stationCode, Map<String, String> params) {
List<AggStation> stations; List<AggStation> stations;
@ -42,6 +48,7 @@ public class AggDeviceTreeService {
List<JsonNode> result = new ArrayList<>(); List<JsonNode> result = new ArrayList<>();
int pageSize = props.getSync().getBase().getPageSize(); int pageSize = props.getSync().getBase().getPageSize();
for (AggStation station : stations) { for (AggStation station : stations) {
Map<Long, Integer> areaOrder = areaOrderMap(station.getStationCode());
List<JsonNode> roots = stationApiClient.fetchAllRows( List<JsonNode> roots = stationApiClient.fetchAllRows(
station, TREE_PATH, pageSize, 20, params, "dataId"); station, TREE_PATH, pageSize, 20, params, "dataId");
for (JsonNode root : roots) { for (JsonNode root : roots) {
@ -49,12 +56,62 @@ public class AggDeviceTreeService {
normalizeNode(copy, station.getStationCode(), normalizeNode(copy, station.getStationCode(),
station.getStationName() != null ? station.getStationName() : station.getStationCode(), station.getStationName() != null ? station.getStationName() : station.getStationCode(),
aggregate); aggregate);
sortAreaChildren(copy, areaOrder);
result.add(copy); result.add(copy);
} }
} }
return result; return result;
} }
private Map<Long, Integer> areaOrderMap(String stationCode) {
Map<Long, Integer> orderMap = new HashMap<>();
for (AggBasedataArea area : areaMapper.listForTree(stationCode)) {
if (area.getAreaId() != null) {
orderMap.put(area.getAreaId(), area.getOrderNum() == null ? Integer.MAX_VALUE : area.getOrderNum());
}
}
return orderMap;
}
private static void sortAreaChildren(JsonNode node, Map<Long, Integer> areaOrder) {
if (node == null || !node.isObject()) {
return;
}
JsonNode children = node.get("children");
if (children == null || !children.isArray()) {
return;
}
List<JsonNode> sorted = new ArrayList<>();
for (JsonNode child : children) {
sorted.add(child);
}
sorted.sort(Comparator
.comparingInt((JsonNode child) -> isAreaNode(child) ? 0 : 1)
.thenComparingInt(child -> isAreaNode(child) ? areaOrderValue(child, areaOrder) : 0));
ArrayNode array = (ArrayNode) children;
array.removeAll();
for (JsonNode child : sorted) {
array.add(child);
}
for (JsonNode child : array) {
sortAreaChildren(child, areaOrder);
}
}
private static boolean isAreaNode(JsonNode node) {
JsonNode flag = node.get("areaFlag");
return flag != null && "Yes".equals(flag.asText());
}
private static int areaOrderValue(JsonNode node, Map<Long, Integer> areaOrder) {
JsonNode areaId = node.get("areaId");
if (areaId == null || areaId.isNull()) {
return Integer.MAX_VALUE;
}
Integer order = areaOrder.get(areaId.asLong());
return order == null ? Integer.MAX_VALUE : order;
}
private static void normalizeNode(ObjectNode node, String stationCode, String stationName, private static void normalizeNode(ObjectNode node, String stationCode, String stationName,
boolean prefixIds) { boolean prefixIds) {
if (node == null || !node.isObject()) { if (node == null || !node.isObject()) {


+ 1
- 0
inspect-main/inspect-main-agg/src/main/java/com/inspect/agg/service/ChannelSyncService.java View File

@ -92,6 +92,7 @@ public class ChannelSyncService {
c.setPatrolDeviceCode(Rows.text(r, "patroldeviceCode", "patrolDeviceCode")); c.setPatrolDeviceCode(Rows.text(r, "patroldeviceCode", "patrolDeviceCode"));
c.setUpSystemDeviceCode(Rows.text(r, "upSystemDeviceCode")); c.setUpSystemDeviceCode(Rows.text(r, "upSystemDeviceCode"));
c.setDeviceSource(Rows.text(r, "deviceSource")); c.setDeviceSource(Rows.text(r, "deviceSource"));
c.setCapabilities(Rows.jsonText(r, "capabilities"));
c.setUpdateTime(Rows.date(r, "updateTime")); c.setUpdateTime(Rows.date(r, "updateTime"));
c.setSyncedAt(LocalDateTime.now()); c.setSyncedAt(LocalDateTime.now());
c.setIsDeleted(0); c.setIsDeleted(0);


+ 51
- 4
inspect-main/inspect-main-agg/src/main/java/com/inspect/agg/service/EqpbookTreeService.java View File

@ -11,6 +11,9 @@ import java.util.Set;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils; import org.springframework.util.StringUtils;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.inspect.agg.entity.AggBasedataArea; import com.inspect.agg.entity.AggBasedataArea;
import com.inspect.agg.entity.AggBasedataEqpbook; import com.inspect.agg.entity.AggBasedataEqpbook;
import com.inspect.agg.entity.AggBasedataEqpbookChannel; import com.inspect.agg.entity.AggBasedataEqpbookChannel;
@ -19,10 +22,12 @@ import com.inspect.agg.mapper.AggBasedataEqpbookChannelMapper;
import com.inspect.agg.mapper.AggBasedataEqpbookMapper; import com.inspect.agg.mapper.AggBasedataEqpbookMapper;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
/** /**
* 使用汇聚区域、台账和通道数据构建通道树。 * 使用汇聚区域、台账和通道数据构建通道树。
*/ */
@Slf4j
@Service @Service
@RequiredArgsConstructor @RequiredArgsConstructor
public class EqpbookTreeService { public class EqpbookTreeService {
@ -30,11 +35,13 @@ public class EqpbookTreeService {
private final AggBasedataAreaMapper areaMapper; private final AggBasedataAreaMapper areaMapper;
private final AggBasedataEqpbookMapper eqpbookMapper; private final AggBasedataEqpbookMapper eqpbookMapper;
private final AggBasedataEqpbookChannelMapper channelMapper; private final AggBasedataEqpbookChannelMapper channelMapper;
private final ObjectMapper objectMapper;
public List<Map<String, Object>> buildFilterTree(String stationCode, public List<Map<String, Object>> buildFilterTree(String stationCode,
String patrolDeviceName, String patrolDeviceName,
String onlineStatus, String onlineStatus,
String patrolDeviceTypeFlag) {
String patrolDeviceTypeFlag,
String deviceSource) {
List<AggBasedataArea> areas = areaMapper.listForTree(stationCode); List<AggBasedataArea> areas = areaMapper.listForTree(stationCode);
List<AggBasedataEqpbook> eqpbooks = eqpbookMapper.list(stationCode, 0); List<AggBasedataEqpbook> eqpbooks = eqpbookMapper.list(stationCode, 0);
List<AggBasedataEqpbookChannel> channels = channelMapper.list(stationCode, 0); List<AggBasedataEqpbookChannel> channels = channelMapper.list(stationCode, 0);
@ -46,6 +53,9 @@ public class EqpbookTreeService {
Map<String, List<AggBasedataEqpbookChannel>> channelIndex = new HashMap<>(); Map<String, List<AggBasedataEqpbookChannel>> channelIndex = new HashMap<>();
for (AggBasedataEqpbookChannel channel : channels) { for (AggBasedataEqpbookChannel channel : channels) {
if (!matchesDeviceSource(channel, deviceSource)) {
continue;
}
channelIndex.computeIfAbsent(eqpbookKey(channel.getStationCode(), channel.getEqpbookId()), channelIndex.computeIfAbsent(eqpbookKey(channel.getStationCode(), channel.getEqpbookId()),
key -> new ArrayList<>()).add(channel); key -> new ArrayList<>()).add(channel);
} }
@ -81,9 +91,9 @@ public class EqpbookTreeService {
} }
Map<String, Map<String, Object>> areaNodes = new LinkedHashMap<>(); Map<String, Map<String, Object>> areaNodes = new LinkedHashMap<>();
for (String key : selectedAreaKeys) {
AggBasedataArea area = areaIndex.get(key);
if (area == null) continue;
for (AggBasedataArea area : areas) {
String key = areaKey(area.getStationCode(), area.getAreaId());
if (!selectedAreaKeys.contains(key)) continue;
Map<String, Object> node = new LinkedHashMap<>(); Map<String, Object> node = new LinkedHashMap<>();
node.put("id", key); node.put("id", key);
String parentKey = area.getParentId() == null ? null : areaKey(area.getStationCode(), area.getParentId()); String parentKey = area.getParentId() == null ? null : areaKey(area.getStationCode(), area.getParentId());
@ -147,6 +157,8 @@ public class EqpbookTreeService {
channelNode.put("channelName", channel.getChannelName()); channelNode.put("channelName", channel.getChannelName());
channelNode.put("channelFlag", "Yes"); channelNode.put("channelFlag", "Yes");
channelNode.put("channelType", channel.getChannelType()); channelNode.put("channelType", channel.getChannelType());
channelNode.put("deviceSource", channel.getDeviceSource());
channelNode.put("capabilities", parseCapabilities(channel.getCapabilities()));
channelNode.put("host", channel.getHost()); channelNode.put("host", channel.getHost());
channelNode.put("port", channel.getPort()); channelNode.put("port", channel.getPort());
channelNode.put("stationCode", channel.getStationCode()); channelNode.put("stationCode", channel.getStationCode());
@ -171,6 +183,28 @@ public class EqpbookTreeService {
return roots; return roots;
} }
private Map<String, Object> parseCapabilities(String value) {
if (!StringUtils.hasText(value)) {
return null;
}
try {
JsonNode node = objectMapper.readTree(value);
if (node == null || !node.isObject()) {
log.warn("通道 capabilities 不是 JSON 对象,已忽略: {}", abbrev(value));
return null;
}
return objectMapper.convertValue(node, new TypeReference<Map<String, Object>>() {
});
} catch (Exception e) {
log.warn("通道 capabilities 解析失败,已忽略: {}", abbrev(value));
return null;
}
}
private static String abbrev(String value) {
return value.length() <= 120 ? value : value.substring(0, 120);
}
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
private static List<Map<String, Object>> children(Map<String, Object> node) { private static List<Map<String, Object>> children(Map<String, Object> node) {
return (List<Map<String, Object>>) node.get("children"); return (List<Map<String, Object>>) node.get("children");
@ -196,6 +230,19 @@ public class EqpbookTreeService {
&& eqpbook.getPatrolDeviceName().contains(value)); && eqpbook.getPatrolDeviceName().contains(value));
} }
private static boolean matchesDeviceSource(AggBasedataEqpbookChannel channel, String deviceSource) {
if (!StringUtils.hasText(deviceSource)) {
return true;
}
String expected = deviceSource.trim();
String value = channel.getDeviceSource();
String actual = value == null ? "" : value.trim();
if ("其他".equals(expected)) {
return actual.isEmpty() || "其他".equals(actual);
}
return expected.equals(actual);
}
private static boolean matchesType(AggBasedataEqpbook eqpbook, String flag) { private static boolean matchesType(AggBasedataEqpbook eqpbook, String flag) {
if (!StringUtils.hasText(flag)) return true; if (!StringUtils.hasText(flag)) return true;
String type = eqpbook.getDeviceType(); String type = eqpbook.getDeviceType();


+ 2
- 1
inspect-main/inspect-main-agg/src/main/java/com/inspect/agg/web/AggTreeController.java View File

@ -34,9 +34,10 @@ public class AggTreeController {
@RequestParam(value = "patroldeviceName", required = false) String patrolDeviceName, @RequestParam(value = "patroldeviceName", required = false) String patrolDeviceName,
@RequestParam(value = "onlineStatus", required = false) String onlineStatus, @RequestParam(value = "onlineStatus", required = false) String onlineStatus,
@RequestParam(value = "patroldeviceTypeFlag", required = false) String patrolDeviceTypeFlag, @RequestParam(value = "patroldeviceTypeFlag", required = false) String patrolDeviceTypeFlag,
@RequestParam(value = "deviceSource", required = false) String deviceSource,
@RequestParam(required = false) String stationCode) { @RequestParam(required = false) String stationCode) {
List<Map<String, Object>> tree = eqpbookTreeService.buildFilterTree( List<Map<String, Object>> tree = eqpbookTreeService.buildFilterTree(
stationCode, patrolDeviceName, onlineStatus, patrolDeviceTypeFlag);
stationCode, patrolDeviceName, onlineStatus, patrolDeviceTypeFlag, deviceSource);
return AjaxResult.success(tree); return AjaxResult.success(tree);
} }


+ 0
- 1
inspect-main/inspect-main-agg/src/main/resources/mapper/AggBasedataAreaMapper.xml View File

@ -34,7 +34,6 @@
area_addr = VALUES(area_addr), area_addr = VALUES(area_addr),
area_type = VALUES(area_type), area_type = VALUES(area_type),
device_type_code = VALUES(device_type_code), device_type_code = VALUES(device_type_code),
order_num = VALUES(order_num),
status = VALUES(status), status = VALUES(status),
remark = VALUES(remark), remark = VALUES(remark),
update_time = VALUES(update_time), update_time = VALUES(update_time),


+ 6
- 3
inspect-main/inspect-main-agg/src/main/resources/mapper/AggBasedataEqpbookChannelMapper.xml View File

@ -6,6 +6,7 @@
<result column="station_code" property="stationCode"/> <result column="station_code" property="stationCode"/>
<result column="agg_station_name" property="stationName"/> <result column="agg_station_name" property="stationName"/>
<result column="channel_id" property="channelId"/> <result column="channel_id" property="channelId"/>
<result column="order_num" property="orderNum"/>
<result column="channel_code" property="channelCode"/> <result column="channel_code" property="channelCode"/>
<result column="channel_name" property="channelName"/> <result column="channel_name" property="channelName"/>
<result column="channel_type" property="channelType"/> <result column="channel_type" property="channelType"/>
@ -19,6 +20,7 @@
<result column="patrol_device_code" property="patrolDeviceCode"/> <result column="patrol_device_code" property="patrolDeviceCode"/>
<result column="up_system_device_code" property="upSystemDeviceCode"/> <result column="up_system_device_code" property="upSystemDeviceCode"/>
<result column="device_source" property="deviceSource"/> <result column="device_source" property="deviceSource"/>
<result column="capabilities" property="capabilities"/>
<result column="update_time" property="updateTime"/> <result column="update_time" property="updateTime"/>
<result column="synced_at" property="syncedAt"/> <result column="synced_at" property="syncedAt"/>
<result column="is_deleted" property="isDeleted"/> <result column="is_deleted" property="isDeleted"/>
@ -27,8 +29,8 @@
<!-- 骞傜瓑 upsert锛氭寜 (station_code, channel_id) --> <!-- 骞傜瓑 upsert锛氭寜 (station_code, channel_id) -->
<insert id="upsert" parameterType="com.inspect.agg.entity.AggBasedataEqpbookChannel"> <insert id="upsert" parameterType="com.inspect.agg.entity.AggBasedataEqpbookChannel">
INSERT INTO agg_basedata_eqpbook_channel (station_code, channel_id, channel_code, channel_name, channel_type, online_state, channel_content, host, port, area_id, area_name, eqpbook_id, patrol_device_code, up_system_device_code, device_source, update_time, synced_at, is_deleted)
VALUES (#{stationCode}, #{channelId}, #{channelCode}, #{channelName}, #{channelType}, #{onlineState}, #{channelContent}, #{host}, #{port}, #{areaId}, #{areaName}, #{eqpbookId}, #{patrolDeviceCode}, #{upSystemDeviceCode}, #{deviceSource}, #{updateTime}, #{syncedAt}, #{isDeleted})
INSERT INTO agg_basedata_eqpbook_channel (station_code, channel_id, channel_code, channel_name, channel_type, online_state, channel_content, host, port, area_id, area_name, eqpbook_id, patrol_device_code, up_system_device_code, device_source, capabilities, update_time, synced_at, is_deleted)
VALUES (#{stationCode}, #{channelId}, #{channelCode}, #{channelName}, #{channelType}, #{onlineState}, #{channelContent}, #{host}, #{port}, #{areaId}, #{areaName}, #{eqpbookId}, #{patrolDeviceCode}, #{upSystemDeviceCode}, #{deviceSource}, #{capabilities}, #{updateTime}, #{syncedAt}, #{isDeleted})
ON DUPLICATE KEY UPDATE ON DUPLICATE KEY UPDATE
channel_code = VALUES(channel_code), channel_code = VALUES(channel_code),
channel_name = VALUES(channel_name), channel_name = VALUES(channel_name),
@ -43,6 +45,7 @@
patrol_device_code = VALUES(patrol_device_code), patrol_device_code = VALUES(patrol_device_code),
up_system_device_code = VALUES(up_system_device_code), up_system_device_code = VALUES(up_system_device_code),
device_source = VALUES(device_source), device_source = VALUES(device_source),
capabilities = VALUES(capabilities),
update_time = VALUES(update_time), update_time = VALUES(update_time),
synced_at = VALUES(synced_at), synced_at = VALUES(synced_at),
is_deleted = VALUES(is_deleted), is_deleted = VALUES(is_deleted),
@ -66,7 +69,7 @@
LEFT JOIN agg_station s ON s.station_code = c.station_code LEFT JOIN agg_station s ON s.station_code = c.station_code
WHERE c.is_deleted = 0 WHERE c.is_deleted = 0
<if test="stationCode != null and stationCode != ''">AND c.station_code = #{stationCode}</if> <if test="stationCode != null and stationCode != ''">AND c.station_code = #{stationCode}</if>
ORDER BY c.eqpbook_id, c.channel_id
ORDER BY c.eqpbook_id, c.order_num, c.channel_id
<if test="limit > 0">LIMIT #{limit}</if> <if test="limit > 0">LIMIT #{limit}</if>
</select> </select>


+ 2
- 1
inspect-main/inspect-main-agg/src/main/resources/mapper/AggBasedataEqpbookMapper.xml View File

@ -5,6 +5,7 @@
<id column="id" property="id"/> <id column="id" property="id"/>
<result column="station_code" property="stationCode"/> <result column="station_code" property="stationCode"/>
<result column="eqpbook_id" property="eqpbookId"/> <result column="eqpbook_id" property="eqpbookId"/>
<result column="order_num" property="orderNum"/>
<result column="patrol_device_code" property="patrolDeviceCode"/> <result column="patrol_device_code" property="patrolDeviceCode"/>
<result column="patrol_device_name" property="patrolDeviceName"/> <result column="patrol_device_name" property="patrolDeviceName"/>
<result column="agg_station_name" property="stationName"/> <result column="agg_station_name" property="stationName"/>
@ -69,7 +70,7 @@
LEFT JOIN agg_station s ON s.station_code = e.station_code LEFT JOIN agg_station s ON s.station_code = e.station_code
WHERE e.is_deleted = 0 WHERE e.is_deleted = 0
<if test="stationCode != null and stationCode != ''">AND e.station_code = #{stationCode}</if> <if test="stationCode != null and stationCode != ''">AND e.station_code = #{stationCode}</if>
ORDER BY e.area_id, e.eqpbook_id
ORDER BY e.area_id, e.order_num, e.eqpbook_id
<if test="limit > 0">LIMIT #{limit}</if> <if test="limit > 0">LIMIT #{limit}</if>
</select> </select>


Loading…
Cancel
Save