Browse Source

【功能新增】IoT:设备管理界面增加设备分组功能

YunaiV 8 months ago
parent
commit
39ba4e72da

+ 11 - 6
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/device/IotDeviceController.java

@@ -6,10 +6,7 @@ import cn.iocoder.yudao.framework.common.pojo.PageParam;
 import cn.iocoder.yudao.framework.common.pojo.PageResult;
 import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
 import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
-import cn.iocoder.yudao.module.iot.controller.admin.device.vo.device.IotDevicePageReqVO;
-import cn.iocoder.yudao.module.iot.controller.admin.device.vo.device.IotDeviceRespVO;
-import cn.iocoder.yudao.module.iot.controller.admin.device.vo.device.IotDeviceSaveReqVO;
-import cn.iocoder.yudao.module.iot.controller.admin.device.vo.device.IotDeviceStatusUpdateReqVO;
+import cn.iocoder.yudao.module.iot.controller.admin.device.vo.device.*;
 import cn.iocoder.yudao.module.iot.dal.dataobject.device.IotDeviceDO;
 import cn.iocoder.yudao.module.iot.service.device.IotDeviceService;
 import io.swagger.v3.oas.annotations.Operation;
@@ -62,6 +59,14 @@ public class IotDeviceController {
         return success(true);
     }
 
+    @PutMapping("/update-group")
+    @Operation(summary = "更新设备分组")
+    @PreAuthorize("@ss.hasPermission('iot:device:update')")
+    public CommonResult<Boolean> updateDeviceGroup(@Valid @RequestBody IotDeviceUpdateGroupReqVO updateReqVO) {
+        deviceService.updateDeviceGroup(updateReqVO);
+        return success(true);
+    }
+
     @DeleteMapping("/delete")
     @Operation(summary = "删除单个设备")
     @Parameter(name = "id", description = "编号", required = true)
@@ -102,7 +107,7 @@ public class IotDeviceController {
     @PreAuthorize("@ss.hasPermission('iot:device:export')")
     @ApiAccessLog(operateType = EXPORT)
     public void exportDeviceExcel(@Valid IotDevicePageReqVO exportReqVO,
-                                  HttpServletResponse response) throws IOException {
+            HttpServletResponse response) throws IOException {
         exportReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
         CommonResult<PageResult<IotDeviceRespVO>> result = getDevicePage(exportReqVO);
         // 导出 Excel
@@ -125,7 +130,7 @@ public class IotDeviceController {
             @RequestParam(value = "deviceType", required = false) Integer deviceType) {
         List<IotDeviceDO> list = deviceService.getDeviceList(deviceType);
         return success(convertList(list, device -> // 只返回 id、name 字段
-                new IotDeviceRespVO().setId(device.getId()).setDeviceName(device.getDeviceName())));
+        new IotDeviceRespVO().setId(device.getId()).setDeviceName(device.getDeviceName())));
     }
 
 }

+ 21 - 0
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/device/vo/device/IotDeviceUpdateGroupReqVO.java

@@ -0,0 +1,21 @@
+package cn.iocoder.yudao.module.iot.controller.admin.device.vo.device;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import jakarta.validation.constraints.NotEmpty;
+import lombok.Data;
+
+import java.util.Set;
+
+@Schema(description = "管理后台 - IoT 设备更新分组 Request VO")
+@Data
+public class IotDeviceUpdateGroupReqVO {
+
+    @Schema(description = "设备编号列表", requiredMode = Schema.RequiredMode.REQUIRED, example = "1,2,3")
+    @NotEmpty(message = "设备编号列表不能为空")
+    private Set<Long> ids;
+
+    @Schema(description = "分组编号列表", requiredMode = Schema.RequiredMode.REQUIRED, example = "1,2,3")
+    @NotEmpty(message = "分组编号列表不能为空")
+    private Set<Long> groupIds;
+
+}

+ 15 - 7
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/device/IotDeviceService.java

@@ -4,6 +4,7 @@ import cn.iocoder.yudao.framework.common.pojo.PageResult;
 import cn.iocoder.yudao.module.iot.controller.admin.device.vo.device.IotDevicePageReqVO;
 import cn.iocoder.yudao.module.iot.controller.admin.device.vo.device.IotDeviceSaveReqVO;
 import cn.iocoder.yudao.module.iot.controller.admin.device.vo.device.IotDeviceStatusUpdateReqVO;
+import cn.iocoder.yudao.module.iot.controller.admin.device.vo.device.IotDeviceUpdateGroupReqVO;
 import cn.iocoder.yudao.module.iot.dal.dataobject.device.IotDeviceDO;
 import jakarta.validation.Valid;
 
@@ -33,6 +34,20 @@ public interface IotDeviceService {
      */
     void updateDevice(@Valid IotDeviceSaveReqVO updateReqVO);
 
+    /**
+     * 更新设备状态
+     *
+     * @param updateReqVO 更新信息
+     */
+    void updateDeviceStatus(IotDeviceStatusUpdateReqVO updateReqVO);
+
+    /**
+     * 更新设备分组
+     *
+     * @param updateReqVO 更新信息
+     */
+    void updateDeviceGroup(@Valid IotDeviceUpdateGroupReqVO updateReqVO);
+
     /**
      * 删除单个设备
      *
@@ -71,13 +86,6 @@ public interface IotDeviceService {
      */
     List<IotDeviceDO> getDeviceList(@Nullable Integer deviceType);
 
-    /**
-     * 更新设备状态
-     *
-     * @param updateReqVO 更新信息
-     */
-    void updateDeviceStatus(IotDeviceStatusUpdateReqVO updateReqVO);
-
     /**
      * 获得设备数量
      *

+ 19 - 1
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/device/IotDeviceServiceImpl.java

@@ -9,6 +9,7 @@ import cn.iocoder.yudao.framework.tenant.core.aop.TenantIgnore;
 import cn.iocoder.yudao.module.iot.controller.admin.device.vo.device.IotDevicePageReqVO;
 import cn.iocoder.yudao.module.iot.controller.admin.device.vo.device.IotDeviceSaveReqVO;
 import cn.iocoder.yudao.module.iot.controller.admin.device.vo.device.IotDeviceStatusUpdateReqVO;
+import cn.iocoder.yudao.module.iot.controller.admin.device.vo.device.IotDeviceUpdateGroupReqVO;
 import cn.iocoder.yudao.module.iot.dal.dataobject.device.IotDeviceDO;
 import cn.iocoder.yudao.module.iot.dal.dataobject.product.IotProductDO;
 import cn.iocoder.yudao.module.iot.dal.mysql.device.IotDeviceMapper;
@@ -29,6 +30,7 @@ import java.util.List;
 import java.util.Objects;
 
 import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
+import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertList;
 import static cn.iocoder.yudao.module.iot.enums.ErrorCodeConstants.*;
 
 /**
@@ -67,7 +69,7 @@ public class IotDeviceServiceImpl implements IotDeviceService {
         }
         // 1.4 校验父设备是否为合法网关
         if (IotProductDeviceTypeEnum.isGateway(product.getDeviceType())
-            && createReqVO.getGatewayId() != null) {
+                && createReqVO.getGatewayId() != null) {
             validateGatewayDeviceExists(createReqVO.getGatewayId());
         }
         // 1.5 校验分组存在
@@ -107,6 +109,22 @@ public class IotDeviceServiceImpl implements IotDeviceService {
         deviceMapper.updateById(updateObj);
     }
 
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void updateDeviceGroup(IotDeviceUpdateGroupReqVO updateReqVO) {
+        // 1.1 校验设备存在
+        List<IotDeviceDO> devices = deviceMapper.selectBatchIds(updateReqVO.getIds());
+        if (CollUtil.isEmpty(devices)) {
+            return;
+        }
+        // 1.2 校验分组存在
+        deviceGroupService.validateDeviceGroupExists(updateReqVO.getGroupIds());
+
+        // 3. 更新设备分组
+        deviceMapper.updateBatch(convertList(devices, device -> new IotDeviceDO()
+                .setId(device.getId()).setGroupIds(updateReqVO.getGroupIds())));
+    }
+
     @Override
     public void deleteDevice(Long id) {
         // 1.1 校验存在