Prechádzať zdrojové kódy

feat: 设备分组批量导入

gaoyoulong 1 rok pred
rodič
commit
b2524e67b4

+ 26 - 4
iot-module/iot-manager/src/main/java/cc/iotkit/manager/controller/DeviceController.java

@@ -12,6 +12,7 @@ package cc.iotkit.manager.controller;
 import cc.iotkit.common.api.PageRequest;
 import cc.iotkit.common.api.Paging;
 import cc.iotkit.common.api.Request;
+import cc.iotkit.common.excel.utils.ExcelUtil;
 import cc.iotkit.common.thing.ThingModelMessage;
 import cc.iotkit.manager.dto.bo.device.*;
 import cc.iotkit.manager.dto.bo.deviceconfig.DeviceConfigAddBo;
@@ -19,6 +20,7 @@ import cc.iotkit.manager.dto.bo.devicegroup.DeviceAddGroupBo;
 import cc.iotkit.manager.dto.bo.devicegroup.DeviceGroupBo;
 import cc.iotkit.manager.dto.bo.thingmodel.ThingModelMessageBo;
 import cc.iotkit.manager.dto.vo.deviceconfig.DeviceConfigVo;
+import cc.iotkit.manager.dto.vo.devicegroup.DeviceGroupImportVo;
 import cc.iotkit.manager.dto.vo.devicegroup.DeviceGroupVo;
 import cc.iotkit.manager.dto.vo.deviceinfo.DeviceInfoVo;
 import cc.iotkit.manager.dto.vo.deviceinfo.ParentDeviceVo;
@@ -37,12 +39,12 @@ import io.swagger.annotations.ApiOperation;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.validation.annotation.Validated;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.RequestBody;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.bind.annotation.*;
 import org.springframework.web.context.request.async.DeferredResult;
+import org.springframework.web.multipart.MultipartFile;
 
+import javax.servlet.http.HttpServletResponse;
+import java.util.ArrayList;
 import java.util.List;
 
 @Api(tags = {"设备"})
@@ -232,6 +234,26 @@ public class DeviceController {
         return deviceServiceImpl.addGroup(group.getData().to(DeviceGroup.class));
     }
 
+
+    /**
+     * 导入设备分组-批量添加设备分组
+     */
+    @ApiOperation(value = "导入设备分组")
+    @SaCheckPermission("iot:deviceGroup:add")
+    @PostMapping("/group/importData")
+    public String importGroup(@RequestPart("file") MultipartFile file, @RequestParam("requestId") String requestId) {
+        return deviceServiceImpl.importGroup(file);
+    }
+
+    /**
+     * 获取导入模板
+     */
+    @ApiOperation("下载设备分组模板")
+    @PostMapping("/group/exportData")
+    public void exportGroupTemplate(HttpServletResponse response) {
+        ExcelUtil.exportExcel(new ArrayList<>(), "设备分组", DeviceGroupImportVo.class, response);
+    }
+
     /**
      * 修改设备分组
      */

+ 27 - 0
iot-module/iot-manager/src/main/java/cc/iotkit/manager/dto/vo/devicegroup/DeviceGroupImportVo.java

@@ -0,0 +1,27 @@
+package cc.iotkit.manager.dto.vo.devicegroup;
+
+import cc.iotkit.model.device.DeviceGroup;
+import com.alibaba.excel.annotation.ExcelProperty;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serializable;
+
+
+@Data
+@NoArgsConstructor
+@AutoMapper(target = DeviceGroup.class, reverseConvertGenerate = false)
+public class DeviceGroupImportVo implements Serializable {
+
+    private static final long serialVersionUID = -1L;
+
+    @ExcelProperty(value = "设备组id")
+    private String id;
+
+    @ExcelProperty(value = "设备组名称")
+    private String name;
+
+    @ExcelProperty(value = "分组说明")
+    private String remark;
+}

+ 98 - 0
iot-module/iot-manager/src/main/java/cc/iotkit/manager/listener/DeviceGroupImportListener.java

@@ -0,0 +1,98 @@
+package cc.iotkit.manager.listener;
+
+import cc.iotkit.common.excel.core.ExcelListener;
+import cc.iotkit.common.excel.core.ExcelResult;
+import cc.iotkit.common.exception.BizException;
+import cc.iotkit.common.satoken.utils.LoginHelper;
+import cc.iotkit.common.utils.SpringUtils;
+import cc.iotkit.manager.dto.bo.devicegroup.DeviceGroupBo;
+import cc.iotkit.manager.dto.vo.devicegroup.DeviceGroupImportVo;
+import cc.iotkit.manager.dto.vo.devicegroup.DeviceGroupVo;
+import cc.iotkit.manager.service.IDeviceManagerService;
+import cc.iotkit.model.device.DeviceGroup;
+import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.util.ObjectUtil;
+import com.alibaba.excel.context.AnalysisContext;
+import com.alibaba.excel.event.AnalysisEventListener;
+import lombok.extern.slf4j.Slf4j;
+
+import java.util.Collections;
+import java.util.List;
+
+@Slf4j
+public class DeviceGroupImportListener extends AnalysisEventListener<DeviceGroupImportVo> implements ExcelListener<DeviceGroupImportVo> {
+
+    private final Boolean isUpdateSupport;
+
+    private int successNum = 0;
+    private int failureNum = 0;
+
+    private final String userId;
+
+    private IDeviceManagerService deviceManagerService;
+
+    private final StringBuilder successMsg = new StringBuilder();
+    private final StringBuilder failureMsg = new StringBuilder();
+
+    public DeviceGroupImportListener(Boolean isUpdateSupport) {
+        this.isUpdateSupport = isUpdateSupport;
+        this.userId = String.valueOf(LoginHelper.getUserId());
+        this.deviceManagerService = SpringUtils.getBean(IDeviceManagerService.class);
+    }
+
+    @Override
+    public ExcelResult<DeviceGroupImportVo> getExcelResult() {
+
+        return new ExcelResult<>() {
+            @Override
+            public String getAnalysis() {
+                if (failureNum > 0) {
+                    failureMsg.insert(0, "很抱歉,导入失败!共 " + failureNum + " 条数据格式不正确,错误如下:");
+                    throw new BizException(failureMsg.toString());
+                } else {
+                    successMsg.insert(0, "恭喜您,数据已全部导入成功!共 " + successNum + " 条");
+                }
+                return successMsg.toString();
+            }
+
+            @Override
+            public List<DeviceGroupImportVo> getList() {
+                return Collections.emptyList();
+            }
+
+            @Override
+            public List<String> getErrorList() {
+                return Collections.emptyList();
+            }
+        };
+    }
+
+    @Override
+    public void invoke(DeviceGroupImportVo deviceGroupImportVo, AnalysisContext analysisContext) {
+        DeviceGroupVo deviceGroupVo = this.deviceManagerService.getDeviceGroup(deviceGroupImportVo.getId());
+        try {
+            if (ObjectUtil.isNull(deviceGroupVo)) {
+                // 新增
+                DeviceGroup deviceGroup = BeanUtil.toBean(deviceGroupImportVo, DeviceGroup.class);
+                deviceGroup.setUid(this.userId);
+                this.deviceManagerService.addGroup(deviceGroup);
+                successNum++;
+            } else if (Boolean.TRUE.equals(isUpdateSupport)) {
+                // 修改
+                DeviceGroupBo deviceGroupBo = BeanUtil.toBean(deviceGroupImportVo, DeviceGroupBo.class);
+                deviceGroupBo.setUid(this.userId);
+                this.deviceManagerService.updateGroup(deviceGroupBo);
+                successNum++;
+            }
+        } catch (Exception e) {
+            failureNum++;
+            String msg = "<br/>第" + failureNum + "条分组: " + deviceGroupImportVo.getName() + " 导入失败:";
+            failureMsg.append(msg).append(e.getMessage());
+        }
+    }
+
+    @Override
+    public void doAfterAllAnalysed(AnalysisContext analysisContext) {
+
+    }
+}

+ 5 - 0
iot-module/iot-manager/src/main/java/cc/iotkit/manager/service/IDeviceManagerService.java

@@ -18,6 +18,7 @@ import cc.iotkit.model.device.DeviceGroup;
 import cc.iotkit.model.device.DeviceInfo;
 import cc.iotkit.model.device.message.DeviceProperty;
 import org.springframework.web.context.request.async.DeferredResult;
+import org.springframework.web.multipart.MultipartFile;
 
 import java.util.List;
 
@@ -75,4 +76,8 @@ public interface IDeviceManagerService {
     DeviceConfigVo getConfig(String deviceId);
 
     boolean saveDevice(DeviceInfoBo data);
+
+    String importGroup(MultipartFile file);
+
+    DeviceGroupVo getDeviceGroup(String id);
 }

+ 22 - 0
iot-module/iot-manager/src/main/java/cc/iotkit/manager/service/impl/DeviceManagerServiceImpl.java

@@ -4,6 +4,8 @@ import cc.iotkit.common.api.PageRequest;
 import cc.iotkit.common.api.Paging;
 import cc.iotkit.common.constant.Constants;
 import cc.iotkit.common.enums.ErrCode;
+import cc.iotkit.common.excel.core.ExcelResult;
+import cc.iotkit.common.excel.utils.ExcelUtil;
 import cc.iotkit.common.exception.BizException;
 import cc.iotkit.common.satoken.utils.AuthUtil;
 import cc.iotkit.common.thing.ThingModelMessage;
@@ -19,9 +21,11 @@ import cc.iotkit.manager.dto.bo.device.DeviceTagAddBo;
 import cc.iotkit.manager.dto.bo.devicegroup.DeviceAddGroupBo;
 import cc.iotkit.manager.dto.bo.devicegroup.DeviceGroupBo;
 import cc.iotkit.manager.dto.vo.deviceconfig.DeviceConfigVo;
+import cc.iotkit.manager.dto.vo.devicegroup.DeviceGroupImportVo;
 import cc.iotkit.manager.dto.vo.devicegroup.DeviceGroupVo;
 import cc.iotkit.manager.dto.vo.deviceinfo.DeviceInfoVo;
 import cc.iotkit.manager.dto.vo.deviceinfo.ParentDeviceVo;
+import cc.iotkit.manager.listener.DeviceGroupImportListener;
 import cc.iotkit.manager.service.DataOwnerService;
 import cc.iotkit.manager.service.DeferredDataConsumer;
 import cc.iotkit.manager.service.DeviceCtrlService;
@@ -34,13 +38,16 @@ import cc.iotkit.model.product.Product;
 import cc.iotkit.mq.MqProducer;
 import cc.iotkit.temporal.IDevicePropertyData;
 import cc.iotkit.temporal.IThingModelMessageData;
+import lombok.SneakyThrows;
 import org.apache.commons.lang3.RandomStringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Qualifier;
 import org.springframework.context.annotation.Lazy;
 import org.springframework.stereotype.Service;
 import org.springframework.web.context.request.async.DeferredResult;
+import org.springframework.web.multipart.MultipartFile;
 
+import java.io.IOException;
 import java.util.List;
 import java.util.stream.Collectors;
 
@@ -423,4 +430,19 @@ public class DeviceManagerServiceImpl implements IDeviceManagerService {
         return deviceInfoData.save(di) != null;
     }
 
+
+    @SneakyThrows
+    @Override
+    public String importGroup(MultipartFile file) {
+        ExcelResult<DeviceGroupImportVo> result = ExcelUtil.importExcel(file.getInputStream(), DeviceGroupImportVo.class, new DeviceGroupImportListener(true));
+        return result.getAnalysis();
+    }
+
+    @Override
+    public DeviceGroupVo getDeviceGroup(String id) {
+        DeviceGroup deviceGroup = deviceGroupData.findById(id);
+        return MapstructUtils.convert(deviceGroup, DeviceGroupVo.class);
+    }
+
+
 }