From b5b95f50e7905e9424628254b3cba7b92aa77cde Mon Sep 17 00:00:00 2001
From: zhaowenyu <35589726@qq.com>
Date: Wed, 03 Dec 2025 14:52:56 +0800
Subject: [PATCH] 2025-12-03 zwy 维护大疆上云、司空错误码!返回前端的错误码和错误详情。

---
 ard-sample/src/main/java/com/ard/sample/manage/service/impl/DeviceServiceImpl.java |  145 ++++++++++++++++++++++++++++++++++++++++++++++-
 1 files changed, 140 insertions(+), 5 deletions(-)

diff --git a/ard-sample/src/main/java/com/ard/sample/manage/service/impl/DeviceServiceImpl.java b/ard-sample/src/main/java/com/ard/sample/manage/service/impl/DeviceServiceImpl.java
index 45bca6f..c66e278 100644
--- a/ard-sample/src/main/java/com/ard/sample/manage/service/impl/DeviceServiceImpl.java
+++ b/ard-sample/src/main/java/com/ard/sample/manage/service/impl/DeviceServiceImpl.java
@@ -1,6 +1,10 @@
 package com.ard.sample.manage.service.impl;
 
 import com.alibaba.fastjson2.JSONObject;
+import com.ard.device.camera.domain.ArdCamera;
+import com.ard.device.camera.service.IArdCameraService;
+import com.ard.device.channel.domain.ArdChannel;
+import com.ard.sample.component.websocket.handler.LiveStreamHandler;
 import com.ard.system.authorize.service.AuthorizeService;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
@@ -65,6 +69,12 @@
 @Slf4j
 @Transactional
 public class DeviceServiceImpl implements IDeviceService {
+
+    @Autowired
+    private LiveStreamHandler _liveStreamHandler;
+
+    @Autowired
+    private IArdCameraService _cameraService;
 
     @Autowired
     private IMessageSenderService messageSender;
@@ -350,11 +360,28 @@
 
     //region 单独写一个方法做权限验证,由于有好多定时任务也在实时获取设备列表,原方法不适用再添加权限注解
     @Override
-    public List<DeviceDTO> getDockList() {
+    public List<DeviceDTO> getDockList(String nickname) {
         List<DeviceDTO> devicesList = this.getDockListByParams(
                 DeviceQueryParam.builder()
                         .domains(List.of(DeviceDomainEnum.GATEWAY.getVal(), DeviceDomainEnum.DOCK.getVal()))
+                        .nickname(nickname)
                         .build());
+        // 在獲取设备列表时,顺便获取直播地址
+        for(DeviceDTO devices : devicesList){
+            _liveStreamHandler.StartLiveStreaming(devices.getDeviceSn());
+            _liveStreamHandler.StartLiveStreaming(devices.getChildDeviceSn());
+            ArdCamera ardCamera = new ArdCamera();
+            ardCamera.setDockId(devices.getId());
+            List<ArdCamera> ardCameraList = _cameraService.selectArdCameraList(ardCamera);
+            for(ArdCamera ardCamera1 : ardCameraList){
+                for(ArdChannel ardChannel : ardCamera1.getChannelList()) {
+                    if(ardChannel.getChanNo() == 1) {
+                        // 修改列表中外接相机地址
+                        updateCameraWebrtcUrl(devices.getDeviceSn(), ardChannel.getArdVtdu().getWebrtcUrl());
+                    }
+                }
+            }
+        }
 
         devicesList.stream()
                 .filter(gateway -> DeviceDomainEnum.DOCK.getVal() == gateway.getDomain() ||
@@ -398,6 +425,7 @@
                                 })
                                 .eq(param.getBoundStatus() != null, DeviceEntity::getBoundStatus,
                                         param.getBoundStatus())
+                                .like(param.getNickname()!=null, DeviceEntity::getNickname, "%" + param.getNickname() + "%")
                                 .orderBy(param.isOrderBy(),
                                         param.isAsc(), DeviceEntity::getId))
                 .stream()
@@ -405,6 +433,90 @@
                 .collect(Collectors.toList());
     }
     //endregion
+
+    // region 多路直播列表,按nickname筛选
+//    /**
+//     * 多路直播列表,按nickname筛选
+//     * */
+//    @Override
+//    public List<DeviceDTO> getDockCameraList(String nickname) {
+//
+//        List<DeviceDTO> devicesList = this.getDockListByParams(
+//                DeviceQueryParam.builder()
+//                        .domains(List.of(DeviceDomainEnum.GATEWAY.getVal(), DeviceDomainEnum.DOCK.getVal()))
+//                        .nickname(nickname)
+//                        .build());
+//
+//        // 在獲取设备列表时,顺便获取直播地址
+//        for(DeviceDTO devices : devicesList){
+//            _liveStreamHandler.StartLiveStreaming(devices.getDeviceSn());
+//            _liveStreamHandler.StartLiveStreaming(devices.getChildDeviceSn());
+//            ArdCamera ardCamera = new ArdCamera();
+//            ardCamera.setDockId(devices.getId());
+//            List<ArdCamera> ardCameraList = _cameraService.selectArdCameraList(ardCamera);
+//            for(ArdCamera ardCamera1 : ardCameraList){
+//                for(ArdChannel ardChannel : ardCamera1.getChannelList()) {
+//                    if(ardChannel.getChanNo() == 1) {
+//                        // 修改列表中外接相机地址
+//                        updateCameraWebrtcUrl(devices.getDeviceSn(), ardChannel.getArdVtdu().getWebrtcUrl());
+//                    }
+//                }
+//            }
+//        }
+//
+//        devicesList.stream()
+//                .filter(gateway -> DeviceDomainEnum.DOCK.getVal() == gateway.getDomain() ||
+//                        RedisOpsUtils.checkExist(RedisConst.DEVICE_ONLINE_PREFIX + gateway.getDeviceSn()))
+//                .forEach(this::spliceDeviceTopoPer);
+//
+//        return devicesList;
+//    }
+
+//    @Override
+//    public void spliceDeviceTopoCamera(DeviceDTO gateway) {
+//        gateway.setStatus(RedisOpsUtils.checkExist(RedisConst.DEVICE_ONLINE_PREFIX + gateway.getDeviceSn()));
+//        // sub device
+//        if (!StringUtils.hasText(gateway.getChildDeviceSn())) {
+//            return;
+//        }
+//        DeviceDTO subDevice =
+//                getDevicesByParams(DeviceQueryParam.builder().deviceSn(gateway.getChildDeviceSn()).build()).get(0);
+//        subDevice.setStatus(RedisOpsUtils.checkExist(RedisConst.DEVICE_ONLINE_PREFIX + subDevice.getDeviceSn()));
+//        gateway.setChildren(subDevice);
+//    }
+
+//    /**
+//     * 按nickname筛选列表
+//     * */
+//    @Override
+//    public List<DeviceDTO> getDockCameraListByParams(DeviceQueryParam param) {
+//        return mapper.selectListPer(
+//                        new LambdaQueryWrapper<DeviceEntity>()
+//                                .eq(StringUtils.hasText(param.getDeviceSn()),
+//                                        DeviceEntity::getDeviceSn, param.getDeviceSn())
+//                                .eq(param.getDeviceType() != null,
+//                                        DeviceEntity::getDeviceType, param.getDeviceType())
+//                                .eq(param.getSubType() != null,
+//                                        DeviceEntity::getSubType, param.getSubType())
+//                                .eq(StringUtils.hasText(param.getChildSn()),
+//                                        DeviceEntity::getChildSn, param.getChildSn())
+//                                .and(!CollectionUtils.isEmpty(param.getDomains()), wrapper -> {
+//                                    for (Integer domain : param.getDomains()) {
+//                                        wrapper.eq(DeviceEntity::getDomain, domain).or();
+//                                    }
+//                                })
+//                                .eq(param.getBoundStatus() != null, DeviceEntity::getBoundStatus,
+//                                        param.getBoundStatus())
+//                                .like(param.getNickname()!=null, DeviceEntity::getNickname, "%" + param.getNickname() + "%")
+//                                .orderBy(param.isOrderBy(),
+//                                        param.isAsc(), DeviceEntity::getId))
+//                .stream()
+//                .map(this::deviceEntityConvertToDTO)
+//                .collect(Collectors.toList());
+//    }
+
+
+    // endregion
 
     @Override
     public Optional<TopologyDeviceDTO> getDeviceTopoForPilot(String sn) {
@@ -753,6 +865,8 @@
                 .firmwareVersion(entity.getFirmwareVersion())
                 .deptId(entity.getDeptId())
                 .workType(entity.getWorkType())
+                .webrtcUrl(entity.getWebrtcUrl())
+                .cameraWebrtcUrl(entity.getCameraWebrtcUrl())
                 .workspaceName(entity.getDeptId() != null
                         ? Optional.ofNullable(sysDeptService.selectDeptById(entity.getDeptId()))
                         .map(SysDept::getDeptName)
@@ -803,6 +917,25 @@
         int update = mapper.update(null, lambdaUpdateWrapper);
         return update > 0;
     }
+
+    @Override
+    public Boolean updateWebrtcUrl(String sn, String webrtcUrl){
+        LambdaUpdateWrapper<DeviceEntity> lambdaUpdateWrapper = new LambdaUpdateWrapper<>();
+        lambdaUpdateWrapper.eq(DeviceEntity::getDeviceSn, sn)
+                .set(DeviceEntity::getWebrtcUrl, webrtcUrl);
+        int update = mapper.update(null, lambdaUpdateWrapper);
+        return update > 0;
+    }
+
+    public Boolean updateCameraWebrtcUrl(String sn, String CameraWebrtcUrl){
+        LambdaUpdateWrapper<DeviceEntity> lambdaUpdateWrapper = new LambdaUpdateWrapper<>();
+        lambdaUpdateWrapper.eq(DeviceEntity::getDeviceSn, sn)
+                .set(DeviceEntity::getCameraWebrtcUrl, CameraWebrtcUrl);
+        int update = mapper.update(null, lambdaUpdateWrapper);
+        return update > 0;
+    }
+
+
 
     @Override
     public Boolean bindDevice(DeviceDTO device) {
@@ -1041,14 +1174,14 @@
                         .data(Map.of(MapKeyConst.DEVICES, deviceOtaFirmwares))
                         .build());
         if (serviceReply.getResult() != ResponseResult.CODE_SUCCESS) {
-            return ResponseResult.error(serviceReply.getResult(), "Firmware Error Code: " + serviceReply.getResult());
+            String errorMsg = CommonErrorEnum.getMsgByCode(serviceReply.getResult());
+            return ResponseResult.error(serviceReply.getResult(), errorMsg);
         }
 
         // Record the device state that needs to be updated.
         deviceOtaFirmwares.forEach(deviceOta -> RedisOpsUtils.setWithExpire(
                 RedisConst.FIRMWARE_UPGRADING_PREFIX + deviceOta.getSn(),
-                bid,
-                RedisConst.DEVICE_ALIVE_SECOND * RedisConst.DEVICE_ALIVE_SECOND));
+                bid,RedisConst.DEVICE_ALIVE_SECOND * RedisConst.DEVICE_ALIVE_SECOND));
         return ResponseResult.success();
     }
 
@@ -1056,7 +1189,7 @@
     public void devicePropertySet(String dockSn, DeviceSetPropertyEnum propertyEnum, JsonNode param) {
         boolean dockOnline = this.checkDeviceOnline(dockSn);
         if (!dockOnline) {
-            throw new RuntimeException("Dock is offline.");
+            throw new RuntimeException(CommonErrorEnum.DEVICE_OFFLINE.getErrorMsg());
         }
         DeviceDTO deviceDTO = (DeviceDTO) RedisOpsUtils.get(RedisConst.DEVICE_ONLINE_PREFIX + dockSn);
         boolean deviceOnline = this.checkDeviceOnline(deviceDTO.getChildDeviceSn());
@@ -1193,6 +1326,8 @@
                 .domain(dto.getDomain())
                 .firmwareVersion(dto.getFirmwareVersion())
                 .workType(dto.getWorkType())
+                .webrtcUrl(dto.getWebrtcUrl())
+                .cameraWebrtcUrl(dto.getCameraWebrtcUrl())
                 .compatibleStatus(dto.getFirmwareStatus() == null ? null :
                         DeviceFirmwareStatusEnum.CONSISTENT_UPGRADE != DeviceFirmwareStatusEnum.find(dto.getFirmwareStatus()))
                 .build();

--
Gitblit v1.9.3