Browse Source

上传表格

yq 2 years ago
parent
commit
8b27f3f03c

+ 6 - 0
service-iot/service-iot-biz/pom.xml

@@ -25,6 +25,12 @@
             <artifactId>pagehelper-spring-boot-starter</artifactId>
         </dependency>
 
+        <dependency>
+            <groupId>cn.afterturn</groupId>
+            <artifactId>easypoi-spring-boot-starter</artifactId>
+            <version>4.1.0</version>
+        </dependency>
+
 
     </dependencies>
 

+ 14 - 0
service-iot/service-iot-biz/src/main/java/com/usky/iot/controller/web/DmpDeviceInfoController.java

@@ -8,6 +8,7 @@ import com.usky.iot.service.DmpDeviceInfoService;
 import com.usky.iot.service.vo.DmpDeviceInfoRequest;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
 
 /**
  * 设备信息表
@@ -67,5 +68,18 @@ public class DmpDeviceInfoController {
         dmpDeviceInfoService.remove(id);
         return ApiResult.success();
     }
+
+    /**
+     * 批量导入
+     * @param multipartFiles
+     * @param productId
+     * @return
+     */
+    @PostMapping("/addByFile")
+    public ApiResult<Void> addByFile(@RequestParam(value = "file") MultipartFile multipartFiles,
+                                     @RequestParam("productId") Integer productId){
+        dmpDeviceInfoService.addByFile(productId,multipartFiles);
+        return ApiResult.success();
+    }
 }
 

+ 7 - 0
service-iot/service-iot-biz/src/main/java/com/usky/iot/domain/DmpDeviceInfo.java

@@ -2,6 +2,7 @@ package com.usky.iot.domain;
 
 import com.baomidou.mybatisplus.annotation.IdType;
 import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 
@@ -18,6 +19,7 @@ import java.time.LocalDateTime;
  */
 @Data
 @EqualsAndHashCode(callSuper = false)
+@TableName("dmp_device")
 public class DmpDeviceInfo implements Serializable {
 
     private static final long serialVersionUID = 1L;
@@ -111,4 +113,9 @@ public class DmpDeviceInfo implements Serializable {
      * 设备状态
      */
     private Integer deviceStatus;
+
+    /**
+     * 是否自动订阅
+     */
+    private Integer subscribeFlag;
 }

+ 8 - 3
service-iot/service-iot-biz/src/main/java/com/usky/iot/domain/DmpDeviceStatus.java

@@ -2,11 +2,12 @@ package com.usky.iot.domain;
 
 import com.baomidou.mybatisplus.annotation.IdType;
 import com.baomidou.mybatisplus.annotation.TableId;
-import java.time.LocalDateTime;
-import java.io.Serializable;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 
+import java.io.Serializable;
+import java.time.LocalDateTime;
+
 /**
  * <p>
  * 设备状态表
@@ -43,9 +44,13 @@ public class DmpDeviceStatus implements Serializable {
     private Integer productId;
 
     /**
-     * 设备状态;1:已注册,2:待激活,3:已激活,4:故障,5:告警,6:离线
+     * 设备状态;1:正常,2:故障,3:告警,4:离线
      */
     private Integer deviceStatus;
+    /**
+     * 业务状态1:已注册,2:待激活,3:已激活
+     */
+    private Integer serviceStatus;
 
     /**
      * 最后上线时间

+ 14 - 2
service-iot/service-iot-biz/src/main/java/com/usky/iot/domain/DmpProductInfo.java

@@ -3,11 +3,12 @@ package com.usky.iot.domain;
 import com.baomidou.mybatisplus.annotation.IdType;
 import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableId;
-import java.time.LocalDateTime;
-import java.io.Serializable;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 
+import java.io.Serializable;
+import java.time.LocalDateTime;
+
 /**
  * <p>
  * 产品信息表
@@ -139,4 +140,15 @@ public class DmpProductInfo implements Serializable {
      */
     @TableField(exist = false)
     private Integer deviceCount;
+    /**
+     * 在线设备
+     */
+    @TableField(exist = false)
+    private Integer deviceStatusCount;
+
+    /**
+     * 注册设备
+     */
+    @TableField(exist = false)
+    private Integer serviceStatusCount;
 }

+ 3 - 0
service-iot/service-iot-biz/src/main/java/com/usky/iot/service/DmpDeviceInfoService.java

@@ -4,6 +4,7 @@ import com.usky.common.core.bean.CommonPage;
 import com.usky.common.mybatis.core.CrudService;
 import com.usky.iot.domain.DmpDeviceInfo;
 import com.usky.iot.service.vo.DmpDeviceInfoRequest;
+import org.springframework.web.multipart.MultipartFile;
 
 import java.util.List;
 import java.util.Map;
@@ -41,4 +42,6 @@ public interface DmpDeviceInfoService extends CrudService<DmpDeviceInfo> {
      * @return
      */
     int deviceCountByProductId(Integer productId);
+
+    void addByFile(Integer productId, MultipartFile multipartFiles);
 }

+ 5 - 0
service-iot/service-iot-biz/src/main/java/com/usky/iot/service/DmpDeviceStatusService.java

@@ -3,6 +3,9 @@ package com.usky.iot.service;
 import com.usky.common.mybatis.core.CrudService;
 import com.usky.iot.domain.DmpDeviceStatus;
 
+import java.util.List;
+import java.util.Map;
+
 
 /**
  * <p>
@@ -14,4 +17,6 @@ import com.usky.iot.domain.DmpDeviceStatus;
  */
 public interface DmpDeviceStatusService extends CrudService<DmpDeviceStatus> {
 
+
+    List<Map<String,Object>> getCollectByProduct(List<Integer> productIds);
 }

+ 49 - 0
service-iot/service-iot-biz/src/main/java/com/usky/iot/service/impl/DmpDeviceInfoServiceImpl.java

@@ -1,19 +1,26 @@
 package com.usky.iot.service.impl;
 
+import cn.afterturn.easypoi.excel.ExcelImportUtil;
+import cn.afterturn.easypoi.excel.entity.ImportParams;
 import cn.hutool.core.collection.CollectionUtil;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
+import com.baomidou.mybatisplus.core.toolkit.StringUtils;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.usky.common.core.bean.CommonPage;
 import com.usky.common.core.exception.BusinessException;
+import com.usky.common.core.util.BeanMapperUtils;
 import com.usky.common.mybatis.core.AbstractCrudService;
 import com.usky.iot.domain.DmpDeviceInfo;
 import com.usky.iot.mapper.DmpDeviceInfoMapper;
 import com.usky.iot.service.DmpDeviceInfoService;
+import com.usky.iot.service.vo.DmpDeviceExportVO;
 import com.usky.iot.service.vo.DmpDeviceInfoRequest;
 import org.springframework.stereotype.Service;
+import org.springframework.web.multipart.MultipartFile;
 
 import java.util.List;
 import java.util.Map;
@@ -90,4 +97,46 @@ public class DmpDeviceInfoServiceImpl extends AbstractCrudService<DmpDeviceInfoM
                 .eq(DmpDeviceInfo::getDeleteFlag,0);
         return this.count(lambdaQuery);
     }
+
+    @Override
+    public void addByFile(Integer productId, MultipartFile multipartFiles) {
+        List<DmpDeviceInfo> deviceByFile = getDeviceByFile(productId, multipartFiles);
+        this.saveBatch(deviceByFile);
+    }
+
+
+    /**
+     * 获取表格数据
+     * @param multipartFile
+     * @return
+     */
+    public List<DmpDeviceInfo> getDeviceByFile(Integer productId,MultipartFile multipartFile){
+        ImportParams importParams = new ImportParams();
+        importParams.setHeadRows(1);
+        try {
+            List<DmpDeviceExportVO> dmpDeviceExportVOS = ExcelImportUtil.importExcel(
+                    multipartFile.getInputStream(),
+                    DmpDeviceExportVO.class,
+                    importParams
+            );
+            if (CollectionUtils.isEmpty(dmpDeviceExportVOS)){
+                throw new BusinessException("表格数据为空");
+            }
+            List<DmpDeviceInfo> deviceInfos = BeanMapperUtils.mapList(dmpDeviceExportVOS, DmpDeviceExportVO.class, DmpDeviceInfo.class);
+            long count = deviceInfos.stream()
+                    .peek(device -> device.setProductId(productId))
+                    .filter(device -> StringUtils.isNotBlank(device.getDeviceName()) ||
+                    StringUtils.isNotBlank(device.getDeviceName())
+                    || StringUtils.isNotBlank(device.getDeviceCode())
+                    || StringUtils.isNotBlank(device.getSimCode())
+                    || null != device.getSubscribeFlag()
+            ).count();
+            if (count > 0){
+                throw new BusinessException("表格字段不能为空");
+            }
+            return deviceInfos;
+        }catch (Exception e){
+            throw new BusinessException("解析表格异常,检查表格格式"+e.getMessage());
+        }
+    }
 }

+ 14 - 0
service-iot/service-iot-biz/src/main/java/com/usky/iot/service/impl/DmpDeviceStatusServiceImpl.java

@@ -1,11 +1,17 @@
 package com.usky.iot.service.impl;
 
+import cn.hutool.core.collection.CollectionUtil;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.usky.common.mybatis.core.AbstractCrudService;
 import com.usky.iot.domain.DmpDeviceStatus;
 import com.usky.iot.mapper.DmpDeviceStatusMapper;
 import com.usky.iot.service.DmpDeviceStatusService;
 import org.springframework.stereotype.Service;
 
+import java.util.List;
+import java.util.Map;
+
 /**
  * <p>
  * 设备状态表 服务实现类
@@ -17,4 +23,12 @@ import org.springframework.stereotype.Service;
 @Service
 public class DmpDeviceStatusServiceImpl extends AbstractCrudService<DmpDeviceStatusMapper, DmpDeviceStatus> implements DmpDeviceStatusService {
 
+    @Override
+    public List<Map<String, Object>> getCollectByProduct(List<Integer> productIds) {
+        QueryWrapper<DmpDeviceStatus> query = Wrappers.query();
+        query.select("product_id as productId","count(device_status != 4 or null) as deviceCount","count(service_status = 3 or null) as serviceCount")
+                .in(CollectionUtil.isNotEmpty(productIds),"product_id",productIds)
+                .groupBy("product_id");
+        return this.listMaps(query);
+    }
 }

+ 20 - 2
service-iot/service-iot-biz/src/main/java/com/usky/iot/service/impl/DmpProductInfoServiceImpl.java

@@ -11,6 +11,7 @@ import com.usky.common.mybatis.core.AbstractCrudService;
 import com.usky.iot.domain.DmpProductInfo;
 import com.usky.iot.mapper.DmpProductInfoMapper;
 import com.usky.iot.service.DmpDeviceInfoService;
+import com.usky.iot.service.DmpDeviceStatusService;
 import com.usky.iot.service.DmpProductInfoService;
 import com.usky.iot.service.vo.DmpProductInfoRequest;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -37,6 +38,8 @@ public class DmpProductInfoServiceImpl extends AbstractCrudService<DmpProductInf
     @Autowired
     private DmpDeviceInfoService dmpDeviceInfoService;
 
+    @Autowired
+    private DmpDeviceStatusService dmpDeviceStatusService;
     @Override
     public boolean add(DmpProductInfo dmpProductInfo) {
         if (checkNameUnique(dmpProductInfo)){
@@ -72,8 +75,12 @@ public class DmpProductInfoServiceImpl extends AbstractCrudService<DmpProductInf
                 .eq(StringUtils.isNotBlank(piRequest.getProductName()),DmpProductInfo::getProductName,piRequest.getProductName())
                 .eq(DmpProductInfo::getDeleteFlag,0);
         List<DmpProductInfo> records = page.getRecords();
-        List<Map<String, Object>> maps = dmpDeviceInfoService.deviceCollect(records.stream().map(DmpProductInfo::getId).collect(Collectors.toList()));
-        records.forEach(s -> enhanceByDevice(s,maps));
+        List<Integer> productIds = records.stream().map(DmpProductInfo::getId).collect(Collectors.toList());
+        List<Map<String, Object>> maps = dmpDeviceInfoService.deviceCollect(productIds);
+        List<Map<String, Object>> collectByProduct = dmpDeviceStatusService.getCollectByProduct(productIds);
+        records.forEach(s -> {enhanceByDevice(s,maps);
+            enhanceByDeviceStatus(s,collectByProduct);
+        });
         page = this.page(page,lambdaQuery);
         return new CommonPage<>(page.getRecords(),page.getTotal(),page.getCurrent(),page.getSize());
     }
@@ -85,6 +92,17 @@ public class DmpProductInfoServiceImpl extends AbstractCrudService<DmpProductInf
                 .ifPresent(s -> dmpProductInfo.setDeviceCount(Integer.getInteger(s.get("count").toString())));
     }
 
+    public void enhanceByDeviceStatus(DmpProductInfo dmpProductInfo, List<Map<String,Object>> list){
+        list.stream()
+                .filter(s -> dmpProductInfo.getId().toString().equals(s.get("productId")))
+                .findAny()
+                .ifPresent(s -> {
+                    dmpProductInfo.setDeviceStatusCount(Integer.getInteger(s.get("deviceCount").toString()));
+                            dmpProductInfo.setServiceStatusCount(Integer.getInteger(s.get("serviceCount").toString()));
+                }
+                );
+    }
+
     @Override
     public boolean remove(Integer id) {
         int deviceCount = dmpDeviceInfoService.deviceCountByProductId(id);

+ 36 - 0
service-iot/service-iot-biz/src/main/java/com/usky/iot/service/vo/DmpDeviceExportVO.java

@@ -0,0 +1,36 @@
+package com.usky.iot.service.vo;
+
+import lombok.Data;
+
+@Data
+public class DmpDeviceExportVO {
+
+    /**
+     * 设备名称
+     */
+    private String deviceName;
+    /**
+     * 产品ID
+     */
+    private Integer productId;
+
+    /**
+     * 设备编号
+     */
+    private String deviceCode;
+    /**
+     * 物联网卡号
+     */
+    private String simCode;
+
+    /**
+     * 国际移动用户识别码
+     */
+    private String imsiCode;
+
+    /**
+     * 是否自动订阅
+     */
+    private Integer subscribeFlag;
+
+}