Bladeren bron

设备excel导入

xucaiqin 2 jaren geleden
bovenliggende
commit
25ff996024

+ 12 - 5
iot-module/iot-module-manage/iot-module-manage-biz/src/main/java/com/middle/platform/manage/biz/controller/IotDeviceController.java

@@ -1,20 +1,21 @@
 package com.middle.platform.manage.biz.controller;
 
+import com.middle.platform.common.exception.BusinessException;
 import com.middle.platform.common.utils.Result;
-import com.middle.platform.excel.core.util.ExcelUtils;
 import com.middle.platform.manage.biz.domain.req.DevicePage;
 import com.middle.platform.manage.biz.domain.req.IotDeviceFlag;
 import com.middle.platform.manage.biz.domain.req.IotDevicePara;
-import com.middle.platform.manage.biz.domain.vo.DeviceImportExcelVo;
 import com.middle.platform.manage.biz.service.IotDeviceService;
 import jakarta.validation.constraints.NotNull;
 import lombok.RequiredArgsConstructor;
+import org.apache.commons.io.FilenameUtils;
+import org.apache.commons.lang3.StringUtils;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.web.multipart.MultipartFile;
 
 import java.io.IOException;
-import java.util.List;
+import java.util.Objects;
 
 
 /**
@@ -81,8 +82,14 @@ public class IotDeviceController {
      */
     @PostMapping("/importData")
     public Result<Object> importData(@RequestParam("file") MultipartFile file) throws IOException {
-        List<DeviceImportExcelVo> list = ExcelUtils.read(file, DeviceImportExcelVo.class);
-        return Result.ok();
+        if (Objects.isNull(file)) {
+            throw new BusinessException("导入文件不能为空");
+        }
+        String last = FilenameUtils.getExtension(file.getOriginalFilename());
+        if (!(StringUtils.equals(last, "xls") || StringUtils.equals(last, "xlsx"))) {
+            throw new BusinessException("文件后缀需为xls或xlsx");
+        }
+        return Result.ok(true, iotDeviceService.importFile(file));
     }
 
     /**

+ 3 - 0
iot-module/iot-module-manage/iot-module-manage-biz/src/main/java/com/middle/platform/manage/biz/domain/req/IotDeviceFlag.java

@@ -1,5 +1,6 @@
 package com.middle.platform.manage.biz.domain.req;
 
+import jakarta.validation.constraints.NotNull;
 import lombok.Getter;
 import lombok.Setter;
 
@@ -10,6 +11,8 @@ import lombok.Setter;
 @Getter
 @Setter
 public class IotDeviceFlag {
+    @NotNull(message = "id不能为空")
     private Long id;
+    @NotNull(message = "状态不能为空")
     private Integer status;
 }

+ 13 - 13
iot-module/iot-module-manage/iot-module-manage-biz/src/main/java/com/middle/platform/manage/biz/domain/vo/DeviceImportExcelVo.java

@@ -1,9 +1,7 @@
 package com.middle.platform.manage.biz.domain.vo;
 
 import com.alibaba.excel.annotation.ExcelProperty;
-import com.middle.platform.excel.core.annotations.DictFormat;
-import com.middle.platform.excel.core.convert.DictConvert;
-import com.middle.platform.system.api.enums.DictType;
+import jakarta.validation.constraints.NotBlank;
 import lombok.AllArgsConstructor;
 import lombok.Builder;
 import lombok.Data;
@@ -19,25 +17,27 @@ import lombok.experimental.Accessors;
 @NoArgsConstructor
 @Accessors(chain = false) // 设置 chain = false,避免用户导入有问题
 public class DeviceImportExcelVo {
+    /**
+     * 产品id
+     */
+    private Long productId;
+
+    @ExcelProperty(value = "产品编码")
+    @NotBlank(message = "产品编码不能为空")
+    private String code;
 
     @ExcelProperty("设备名称")
+    @NotBlank(message = "设备名称不能为空")
     private String name;
 
-    @ExcelProperty("sn")
+    @ExcelProperty("SN")
+    @NotBlank(message = "SN不能为空")
     private String sn;
 
     @ExcelProperty("备注名称")
+    @NotBlank(message = "备注名称不能为空")
     private String subtitle;
 
     @ExcelProperty("备注")
     private String remark;
-
-    @ExcelProperty(value = "节点类型", converter = DictConvert.class)
-    @DictFormat(DictType.NODE_TYPE)
-    private Integer nodeType;
-
-    @ExcelProperty(value = "联网类型", converter = DictConvert.class)
-    @DictFormat(DictType.NETWORK_TYPE)
-    private Integer status;
-
 }

+ 31 - 0
iot-module/iot-module-manage/iot-module-manage-biz/src/main/java/com/middle/platform/manage/biz/domain/vo/ProductDeviceDto.java

@@ -0,0 +1,31 @@
+package com.middle.platform.manage.biz.domain.vo;
+
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * 产品 设备
+ *
+ * @author xucaiqin
+ * @date 2023-12-19 13:43:38
+ */
+@Getter
+@Setter
+public class ProductDeviceDto {
+    /**
+     * 设备id
+     */
+    private Long id;
+
+
+    /**
+     * 设备sn码
+     */
+    private String sn;
+
+
+    /**
+     * 产品编码
+     */
+    private String code;
+}

+ 4 - 3
iot-module/iot-module-manage/iot-module-manage-biz/src/main/java/com/middle/platform/manage/biz/mapper/IotDeviceMapper.java

@@ -3,9 +3,7 @@ package com.middle.platform.manage.biz.mapper;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.middle.platform.manage.biz.domain.req.DevicePage;
 import com.middle.platform.manage.biz.domain.req.TypeStatisticsReq;
-import com.middle.platform.manage.biz.domain.vo.IotDeviceDetailVo;
-import com.middle.platform.manage.biz.domain.vo.IotDeviceVo;
-import com.middle.platform.manage.biz.domain.vo.TypeStatisticsVo;
+import com.middle.platform.manage.biz.domain.vo.*;
 import com.middle.platform.manage.biz.entity.IotDevice;
 import org.apache.ibatis.annotations.Mapper;
 import org.apache.ibatis.annotations.Param;
@@ -50,4 +48,7 @@ public interface IotDeviceMapper extends BaseMapper<IotDevice> {
      * @return
      */
     IotDeviceDetailVo detail(@Param("id") Long id);
+
+    ProductDeviceDto query(@Param("id") Long id);
+
 }

+ 72 - 3
iot-module/iot-module-manage/iot-module-manage-biz/src/main/java/com/middle/platform/manage/biz/service/IotDeviceService.java

@@ -1,29 +1,43 @@
 package com.middle.platform.manage.biz.service;
 
+import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.util.IdUtil;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.github.pagehelper.PageHelper;
 import com.github.pagehelper.PageInfo;
 import com.middle.platform.common.constant.Global;
 import com.middle.platform.common.exception.BusinessException;
-import com.middle.platform.pagehelper.core.PageRes;
+import com.middle.platform.excel.core.util.ExcelUtils;
 import com.middle.platform.manage.biz.domain.req.DevicePage;
 import com.middle.platform.manage.biz.domain.req.IotDeviceFlag;
 import com.middle.platform.manage.biz.domain.req.IotDevicePara;
+import com.middle.platform.manage.biz.domain.vo.DeviceImportExcelVo;
 import com.middle.platform.manage.biz.domain.vo.IotDeviceDetailVo;
 import com.middle.platform.manage.biz.domain.vo.IotDeviceVo;
+import com.middle.platform.manage.biz.domain.vo.ProductDeviceDto;
 import com.middle.platform.manage.biz.entity.IotDevice;
+import com.middle.platform.manage.biz.entity.IotProduct;
 import com.middle.platform.manage.biz.mapper.IotDeviceMapper;
+import com.middle.platform.manage.biz.mapper.IotProductMapper;
+import com.middle.platform.pagehelper.core.PageRes;
+import com.middle.platform.redis.constant.CacheConstant;
+import com.middle.platform.redis.service.CacheService;
 import com.middle.platform.system.api.enums.DictType;
 import com.middle.platform.system.api.feign.DictApi;
 import com.middle.platform.system.api.feign.UserApi;
+import jakarta.validation.ConstraintViolation;
+import jakarta.validation.Validation;
 import lombok.RequiredArgsConstructor;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.web.multipart.MultipartFile;
 
+import java.io.IOException;
 import java.time.LocalDateTime;
 import java.util.List;
 import java.util.Objects;
 import java.util.Optional;
+import java.util.Set;
 
 /**
  * @author xucaiqin
@@ -33,6 +47,8 @@ import java.util.Optional;
 @RequiredArgsConstructor
 public class IotDeviceService {
     private final IotDeviceMapper iotDeviceMapper;
+    private final IotProductMapper iotProductMapper;
+    private final CacheService cacheService;
     private final DictApi dictApi;
     private final UserApi userApi;
 
@@ -94,12 +110,15 @@ public class IotDeviceService {
      * @return
      */
     public Object enable(IotDeviceFlag iotDeviceFlag) {
-        IotDevice iotDevice = iotDeviceMapper.selectById(iotDeviceFlag.getId());
-        if (Objects.isNull(iotDevice)) {
+        ProductDeviceDto productDeviceDto = iotDeviceMapper.query(iotDeviceFlag.getId());
+        if (Objects.isNull(productDeviceDto)) {
             throw new BusinessException("设备不存在");
         }
+        IotDevice iotDevice = new IotDevice();
+        iotDevice.setId(iotDeviceFlag.getId());
         iotDevice.setEnableFlag(iotDeviceFlag.getStatus());
         iotDeviceMapper.updateById(iotDevice);
+        cacheService.delKey(String.format(CacheConstant.PRODUCT_CACHE, productDeviceDto.getCode(), productDeviceDto.getSn()));
         return true;
     }
 
@@ -134,4 +153,54 @@ public class IotDeviceService {
     public Object count(Long productId) {
         return iotDeviceMapper.count(productId);
     }
+
+    /**
+     * 导入excel数据
+     *
+     * @param file
+     * @return
+     * @throws IOException
+     */
+    @Transactional(rollbackFor = Exception.class)
+    public String importFile(MultipartFile file) throws IOException {
+        List<DeviceImportExcelVo> list = ExcelUtils.read(file, DeviceImportExcelVo.class);
+        if (CollUtil.isEmpty(list)) {
+            return "导入0条";
+        }
+        //数据字段校验
+        for (DeviceImportExcelVo deviceImportExcelVo : list) {
+            Set<ConstraintViolation<DeviceImportExcelVo>> validate = Validation.buildDefaultValidatorFactory().getValidator().validate(deviceImportExcelVo);
+            if (CollUtil.isNotEmpty(validate)) {
+                for (ConstraintViolation<DeviceImportExcelVo> next : validate) {
+                    throw new BusinessException(deviceImportExcelVo.getSn() + ":" + next.getMessage());
+                }
+            }
+        }
+        //产品编码转换
+        for (DeviceImportExcelVo deviceImportExcelVo : list) {
+            IotProduct iotProduct = iotProductMapper.selectOne(new LambdaQueryWrapper<IotProduct>()
+                    .eq(IotProduct::getCode, deviceImportExcelVo.getCode())
+                    .eq(IotProduct::getDelFlag, Global.UN_DEL).last("limit 1"));
+            if (Objects.isNull(iotProduct)) {
+                throw new BusinessException(deviceImportExcelVo.getCode() + "产品不存在");
+            }
+            deviceImportExcelVo.setProductId(iotProduct.getId());
+        }
+        //入库
+        IotDevice iotDevice;
+        for (DeviceImportExcelVo deviceImportExcelVo : list) {
+            iotDevice = new IotDevice();
+            iotDevice.setProductId(deviceImportExcelVo.getProductId());
+            iotDevice.setName(deviceImportExcelVo.getName());
+            iotDevice.setSn(deviceImportExcelVo.getSn());
+            iotDevice.setGuid(IdUtil.fastSimpleUUID());
+            iotDevice.setSubtitle(deviceImportExcelVo.getSubtitle());
+            iotDevice.setOnlineTime(null);
+            iotDevice.setStatus(0);
+            iotDevice.setEnableFlag(1);
+            iotDevice.setRemark(deviceImportExcelVo.getRemark());
+            iotDeviceMapper.insert(iotDevice);
+        }
+        return "导入成功";
+    }
 }

+ 15 - 0
iot-module/iot-module-manage/iot-module-manage-biz/src/main/resources/mapper/IotDeviceMapper.xml

@@ -159,4 +159,19 @@
       where id.id = #{id,jdbcType=BIGINT}
         and id.del_flag = 0
   </select>
+
+    <select id="query" resultType="com.middle.platform.manage.biz.domain.vo.ProductDeviceDto">
+        select id.id,
+               id.sn,
+               ip.code
+        from iot_device id
+                 inner join iot_product ip on id.product_id = ip.id and ip.del_flag = 0
+        <where>
+            <if test="id != null">
+                and id.id = #{id,jdbcType=BIGINT}
+            </if>
+            and id.del_flag = 0
+        </where>
+    </select>
+
 </mapper>