From 3f0aa45cd91d663dc5041dd1040155884ef00871 Mon Sep 17 00:00:00 2001 From: zms Date: Mon, 24 Feb 2025 14:41:26 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E5=A4=87=E9=80=89=E5=9F=BA?= =?UTF-8?q?=E7=AB=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/imdroid/secapi/client/RtcmClient.java | 2 +- .../com/imdroid/secapi/dto/GnssDevice.java | 1 + .../imdroid/secapi/dto/GnssDeviceJoin.java | 1 + .../executor/D331RtcmMessageExecutor.java | 51 ++++++++++++++++--- .../sideslope/sal/DbDeviceServiceImpl.java | 31 +++++++++++ .../com/imdroid/sideslope/sal/Device.java | 1 + .../imdroid/sideslope/sal/DeviceService.java | 2 + .../sideslope/sal/LocalDeviceServiceImpl.java | 21 ++++++++ .../controller/GnssDeviceController.java | 14 +++-- .../templates/page/gnss_dev_cfg.html | 7 +++ .../templates/page/table/gnss_add_dev.html | 7 +++ 11 files changed, 126 insertions(+), 12 deletions(-) diff --git a/sec-api/src/main/java/com/imdroid/secapi/client/RtcmClient.java b/sec-api/src/main/java/com/imdroid/secapi/client/RtcmClient.java index 50442e01..412f3b39 100644 --- a/sec-api/src/main/java/com/imdroid/secapi/client/RtcmClient.java +++ b/sec-api/src/main/java/com/imdroid/secapi/client/RtcmClient.java @@ -17,7 +17,7 @@ public interface RtcmClient { @GetMapping(value = "/get_device_info") public HttpResp getDeviceInfo(@RequestParam(name = "deviceId") String deviceId, @RequestParam(name = "cmd") String cmd); @PostMapping("/device_param_changed") - HttpResp deviceParamChanged(@RequestParam(name = "deviceId") String deviceId,@RequestParam(name = "oldParentId") String oldParentId); + HttpResp deviceParamChanged(@RequestParam(name = "deviceId") String deviceId,@RequestParam(name = "oldParentId") String oldParentId, @RequestParam("oldParentId1") String oldParentId1); @PostMapping("/group_param_changed") HttpResp groupParamChanged(); diff --git a/sec-api/src/main/java/com/imdroid/secapi/dto/GnssDevice.java b/sec-api/src/main/java/com/imdroid/secapi/dto/GnssDevice.java index 6d126f63..cbda8176 100644 --- a/sec-api/src/main/java/com/imdroid/secapi/dto/GnssDevice.java +++ b/sec-api/src/main/java/com/imdroid/secapi/dto/GnssDevice.java @@ -40,6 +40,7 @@ public class GnssDevice { private String fwddeviceid; //推送的设备名 private String name; private String parentid; + private String parentid1; private Integer devicetype; private String tenantname; private String project_id; diff --git a/sec-api/src/main/java/com/imdroid/secapi/dto/GnssDeviceJoin.java b/sec-api/src/main/java/com/imdroid/secapi/dto/GnssDeviceJoin.java index 7fdc8e21..3a9760a8 100644 --- a/sec-api/src/main/java/com/imdroid/secapi/dto/GnssDeviceJoin.java +++ b/sec-api/src/main/java/com/imdroid/secapi/dto/GnssDeviceJoin.java @@ -22,6 +22,7 @@ public class GnssDeviceJoin { private String fwddeviceid; //推送的设备名 private String name; private String parentid; + private String parentid1; private Integer devicetype; private String tenantname; private String project_id; diff --git a/sec-beidou-rtcm/src/main/java/com/imdroid/sideslope/executor/D331RtcmMessageExecutor.java b/sec-beidou-rtcm/src/main/java/com/imdroid/sideslope/executor/D331RtcmMessageExecutor.java index 9194ce2e..57777cdb 100644 --- a/sec-beidou-rtcm/src/main/java/com/imdroid/sideslope/executor/D331RtcmMessageExecutor.java +++ b/sec-beidou-rtcm/src/main/java/com/imdroid/sideslope/executor/D331RtcmMessageExecutor.java @@ -24,6 +24,7 @@ import org.springframework.stereotype.Component; import javax.annotation.Resource; import java.time.LocalDateTime; +import java.util.ArrayList; import java.util.List; import java.util.Optional; @@ -59,23 +60,43 @@ public class D331RtcmMessageExecutor implements Executor // 推送基站数据 if(deviceBs.getOpMode() == GnssDevice.OP_MODE_USE) { byte[] forwardBytes = message.getSrcData(); - // 要求快速转发,因此用缓存,不要每次都查数据库 - List deviceList = deviceService.findByParentId(id); - //logger.debug("base station {} has {} rovers: ", message.getId(),deviceList.size()); + // 获取使用该基站(包括作为主基站和备选基站)的所有测站 + List primaryDevices = deviceService.findByParentId(id); + List backupDevices = deviceService.findByParentId1(id); + + // 合并两个列表 + List allDevices = new ArrayList<>(); + allDevices.addAll(primaryDevices); + allDevices.addAll(backupDevices); + DeviceChannel deviceChannel = null; - for (Device device : deviceList) { + for (Device device : allDevices) { if (device.getOpMode() != GnssDevice.OP_MODE_USE) continue; String deviceId = device.getDeviceId(); + + // 检查该设备是否应该接收此基站的数据 + String primaryBaseId = device.getParentId(); + String backupBaseId = device.getParentId1(); + + // 如果当前基站是该设备的备选基站,需要检查主基站是否离线 + if (id.equals(backupBaseId)) { + Device primaryBase = deviceService.findByDeviceId(primaryBaseId); + // 如果主基站仍然在线,则跳过备选基站的数据 + if (primaryBase != null && isBaseStationOnline(primaryBase)) { + continue; + } + } + + // 获取设备通道并发送数据 if(device.getDataChannelType() == Device.CHANNEL_TYPE_UDP) { deviceChannel = OnlineChannels.INSTANCE.getDataChannel(deviceId); - } - else { + } else { deviceChannel = OnlineChannels.INSTANCE.getConfigChannel(deviceId); } - if(deviceChannel!=null && deviceChannel.isOnline()){ + if(deviceChannel != null && deviceChannel.isOnline()) { if (logger.isDebugEnabled()) { - logger.debug("forward d331 rtcm to device {}", deviceId); + logger.debug("forward d331 rtcm from {} to device {}", id, deviceId); } if (deviceId.startsWith("2307")) { forwardBytes[2] = (byte) (forwardBytes[2] & 0x07);//兼容不带序号的测站 @@ -167,5 +188,19 @@ public class D331RtcmMessageExecutor implements Executor return D331RtcmMessage.class; } + /** + * 判断住基站是否在线 + * @param baseStation 基站 + * @return 是否在线 + */ + + private boolean isBaseStationOnline(Device baseStation){ + if(baseStation == null) return false; + + LocalDateTime now =LocalDateTime.now(); + return baseStation.getLastRxTime() !=null && + baseStation.getLastRxTime().isAfter(now.minusMinutes(30)); + } + } \ No newline at end of file diff --git a/sec-beidou-rtcm/src/main/java/com/imdroid/sideslope/sal/DbDeviceServiceImpl.java b/sec-beidou-rtcm/src/main/java/com/imdroid/sideslope/sal/DbDeviceServiceImpl.java index 4ea65df1..09b09023 100644 --- a/sec-beidou-rtcm/src/main/java/com/imdroid/sideslope/sal/DbDeviceServiceImpl.java +++ b/sec-beidou-rtcm/src/main/java/com/imdroid/sideslope/sal/DbDeviceServiceImpl.java @@ -32,6 +32,7 @@ public class DbDeviceServiceImpl implements DeviceService { device.setDeviceType(gnssDevice.getDevicetype()); device.setModel(gnssDevice.getModel()); device.setParentId(gnssDevice.getParentid()); + device.setParentId1(gnssDevice.getParentid1()); device.setName(gnssDevice.getName()); device.setProjectId(gnssDevice.getProject_id()); device.setCalcGroupId(gnssDevice.getCalc_group_id()); @@ -59,6 +60,36 @@ public class DbDeviceServiceImpl implements DeviceService { device.setDeviceId(gnssDevice.getDeviceid()); device.setDeviceType(gnssDevice.getDevicetype()); device.setParentId(gnssDevice.getParentid()); + device.setParentId1(gnssDevice.getParentid1()); + device.setName(gnssDevice.getName()); + device.setProjectId(gnssDevice.getProject_id()); + device.setCalcGroupId(gnssDevice.getCalc_group_id()); + device.setOpMode(gnssDevice.getOpmode()); + device.setFwdId(gnssDevice.getFwd_group_id()); + device.setIPose(gnssDevice.getIpose()); + device.setIPosn(gnssDevice.getIposn()); + device.setIPosd(gnssDevice.getIposd()); + device.setEcefx(gnssDevice.getEcefx()); + device.setEcefy(gnssDevice.getEcefy()); + device.setEcefz(gnssDevice.getEcefz()); + deviceList.add(device); + } + return deviceList; + } + + @Override + public List findByParentId1(String parentId1) { + QueryWrapper query = new QueryWrapper<>(); + query.eq("parentid1", parentId1); + List gnssDeviceList = gnssDeviceRepository.selectList(query); + List deviceList = new ArrayList<>(gnssDeviceList.size()); + + for (GnssDevice gnssDevice : gnssDeviceList) { + Device device = new Device(); + device.setDeviceId(gnssDevice.getDeviceid()); + device.setDeviceType(gnssDevice.getDevicetype()); + device.setParentId(gnssDevice.getParentid()); + device.setParentId1(gnssDevice.getParentid1()); // 添加备选基站ID device.setName(gnssDevice.getName()); device.setProjectId(gnssDevice.getProject_id()); device.setCalcGroupId(gnssDevice.getCalc_group_id()); diff --git a/sec-beidou-rtcm/src/main/java/com/imdroid/sideslope/sal/Device.java b/sec-beidou-rtcm/src/main/java/com/imdroid/sideslope/sal/Device.java index 10b3c97c..9c5e757f 100644 --- a/sec-beidou-rtcm/src/main/java/com/imdroid/sideslope/sal/Device.java +++ b/sec-beidou-rtcm/src/main/java/com/imdroid/sideslope/sal/Device.java @@ -37,6 +37,7 @@ public class Device { private String deviceId; private String parentId; + private String parentId1; private String projectId; private String fwdId; diff --git a/sec-beidou-rtcm/src/main/java/com/imdroid/sideslope/sal/DeviceService.java b/sec-beidou-rtcm/src/main/java/com/imdroid/sideslope/sal/DeviceService.java index 6d0f65e6..5217eef7 100644 --- a/sec-beidou-rtcm/src/main/java/com/imdroid/sideslope/sal/DeviceService.java +++ b/sec-beidou-rtcm/src/main/java/com/imdroid/sideslope/sal/DeviceService.java @@ -11,4 +11,6 @@ public interface DeviceService { Device findByDeviceId(String deviceId); List findByParentId(String parentId); + + List findByParentId1(String parentId1); } diff --git a/sec-beidou-rtcm/src/main/java/com/imdroid/sideslope/sal/LocalDeviceServiceImpl.java b/sec-beidou-rtcm/src/main/java/com/imdroid/sideslope/sal/LocalDeviceServiceImpl.java index 43693fb0..6652d22f 100644 --- a/sec-beidou-rtcm/src/main/java/com/imdroid/sideslope/sal/LocalDeviceServiceImpl.java +++ b/sec-beidou-rtcm/src/main/java/com/imdroid/sideslope/sal/LocalDeviceServiceImpl.java @@ -7,6 +7,7 @@ import org.slf4j.LoggerFactory; import org.springframework.stereotype.Component; import javax.annotation.Resource; +import java.util.ArrayList; import java.util.List; import java.util.concurrent.TimeUnit; @@ -57,6 +58,22 @@ public class LocalDeviceServiceImpl implements DeviceService { return device; } + @Override + public List findByParentId1(String parentId1) { + if (parentId1 == null || parentId1.trim().isEmpty()){ + return new ArrayList<>(); + } + List device = subDeviceCache.getIfPresent("backup_" + parentId1); // 使用前缀区分备选基站的缓存 + if (device == null) { + logger.debug("backup base station {} refresh: " + parentId1); + device = delegate.findByParentId1(parentId1); + if (device != null) { + subDeviceCache.put("backup_" + parentId1, device); + } + } + return device; + } + public void refresh(String deviceId, String oldParentId){ Device device = deviceCache.getIfPresent(deviceId); if (device != null) { @@ -66,6 +83,10 @@ public class LocalDeviceServiceImpl implements DeviceService { subDeviceCache.invalidate(oldParentId); } } + + if(device.getParentId1() != null || !device.getParentId1().trim().isEmpty()){ + subDeviceCache.invalidate("back_"+device.getParentId1()); + } deviceCache.invalidate(deviceId); } } diff --git a/sec-beidou/src/main/java/com/imdroid/beidou/controller/GnssDeviceController.java b/sec-beidou/src/main/java/com/imdroid/beidou/controller/GnssDeviceController.java index b6ad50e1..eac9959b 100644 --- a/sec-beidou/src/main/java/com/imdroid/beidou/controller/GnssDeviceController.java +++ b/sec-beidou/src/main/java/com/imdroid/beidou/controller/GnssDeviceController.java @@ -24,6 +24,7 @@ import javax.servlet.http.HttpSession; import java.time.LocalDateTime; import java.util.ArrayList; import java.util.List; +import java.util.Objects; @Controller public class GnssDeviceController extends BasicController{ @@ -115,6 +116,11 @@ public class GnssDeviceController extends BasicController{ if (StringUtils.hasText(parentid)) { queryWrapper.like("parentid", parentid); } + //备选基站 + String parentid1 = search.getString("parentid1"); + if (StringUtils.hasText(parentid1)){ + queryWrapper.like("parentid1", parentid1); + } //项目号 String project_id = search.getString("project_id"); if (StringUtils.hasText(project_id)) { @@ -208,7 +214,9 @@ public class GnssDeviceController extends BasicController{ OpLogManager.OP_OBJ_DEVICE, device.getDeviceid() + " update: " + diff); device.setUpdatetime(LocalDateTime.now()); - if(!old_device.getGroup_id().equals(device.getGroup_id())){ + if(!old_device.getGroup_id().equals(device.getGroup_id())|| + !old_device.getParentid().equals(device.getParentid())|| + !Objects.equals(old_device.getParentid1(),device.getParentid1())){ device.setSyn(false); } num = gnssDeviceMapper.updateById(device); @@ -229,7 +237,7 @@ public class GnssDeviceController extends BasicController{ } else { // 更新组参数的关联个数 updateBasicGroupAssociatedNum(device,old_device); - rtcmClient.deviceParamChanged(device.getDeviceid(), device.getParentid()); + rtcmClient.deviceParamChanged(device.getDeviceid(), device.getParentid(), device.getParentid1()); return HttpResult.ok(); } } @@ -351,7 +359,7 @@ public class GnssDeviceController extends BasicController{ if (num == 0) { return HttpResult.failed(); } else{ - rtcmClient.deviceParamChanged(del_id, null); + rtcmClient.deviceParamChanged(del_id, null, null); return HttpResult.ok(); } } diff --git a/sec-beidou/src/main/resources/templates/page/gnss_dev_cfg.html b/sec-beidou/src/main/resources/templates/page/gnss_dev_cfg.html index cb248163..7dbeb4dd 100644 --- a/sec-beidou/src/main/resources/templates/page/gnss_dev_cfg.html +++ b/sec-beidou/src/main/resources/templates/page/gnss_dev_cfg.html @@ -30,6 +30,12 @@ +
+ +
+ +
+
@@ -128,6 +134,7 @@ {field: 'group_id', title: '基本参数组', width: 60, sort: true}, {field: 'calc_group_id', title: '解算参数组', width: 60, sort: true}, {field: 'parentid', title: '基站编号', width: 80, sort: true}, + {field: 'parentid1', title: '备选基站', width: 80, sort: true}, {field: 'tenantname', title: '所属组织', width: 120}, {field: 'fwd_group_id', title: '推送组', width: 80}, {field: 'fwd_group_id2', title: '推送2', width: 80}, diff --git a/sec-beidou/src/main/resources/templates/page/table/gnss_add_dev.html b/sec-beidou/src/main/resources/templates/page/table/gnss_add_dev.html index f17a1776..31abc800 100644 --- a/sec-beidou/src/main/resources/templates/page/table/gnss_add_dev.html +++ b/sec-beidou/src/main/resources/templates/page/table/gnss_add_dev.html @@ -81,6 +81,12 @@
+
+ +
+ +
+
@@ -307,6 +313,7 @@ $('#name').val(data.name); $('#devicetype').val(data.devicetype); $('#parentid').val(data.parentid); + $('#parentid1').val(data.parentid1); $('#tenantname').val(data.tenantname); $('#project_id').val(data.project_id); $('#project2_id').val(data.project2_id);