Browse Source

文件导出

yq 2 years ago
parent
commit
149830bd82

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

@@ -31,6 +31,13 @@
             <version>4.1.0</version>
         </dependency>
 
+        <!-- excel工具 -->
+        <dependency>
+            <groupId>org.apache.poi</groupId>
+            <artifactId>poi-ooxml</artifactId>
+            <version>4.1.2</version>
+        </dependency>
+
 
     </dependencies>
 

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

@@ -10,6 +10,8 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.web.multipart.MultipartFile;
 
+import javax.servlet.http.HttpServletResponse;
+
 /**
  * 设备信息表
  *
@@ -51,7 +53,7 @@ public class DmpDeviceInfoController {
      * @param dmpDeviceInfoRequest
      * @return
      */
-    @GetMapping("/page")
+    @PostMapping("/page")
     public ApiResult<CommonPage<DmpDeviceInfo>> page(@RequestBody DmpDeviceInfoRequest dmpDeviceInfoRequest)
     {
         return ApiResult.success(dmpDeviceInfoService.page(dmpDeviceInfoRequest));
@@ -81,5 +83,16 @@ public class DmpDeviceInfoController {
         dmpDeviceInfoService.addByFile(productId,multipartFiles);
         return ApiResult.success();
     }
+
+    /**
+     * 导出
+     * @param dmpDeviceInfoRequest
+     * @param response
+     * @return
+     */
+    @PostMapping("/export")
+    public void export(@RequestBody DmpDeviceInfoRequest dmpDeviceInfoRequest, HttpServletResponse response){
+        dmpDeviceInfoService.export(dmpDeviceInfoRequest,response);
+    }
 }
 

+ 3 - 0
service-iot/service-iot-biz/src/main/java/com/usky/iot/controller/web/DmpProductInfoController.java

@@ -3,6 +3,8 @@ package com.usky.iot.controller.web;
 
 import com.usky.common.core.bean.ApiResult;
 import com.usky.common.core.bean.CommonPage;
+import com.usky.common.log.annotation.Log;
+import com.usky.common.log.enums.BusinessType;
 import com.usky.iot.domain.DmpProductInfo;
 import com.usky.iot.service.DmpProductInfoService;
 import com.usky.iot.service.vo.DmpProductInfoRequest;
@@ -51,6 +53,7 @@ public class DmpProductInfoController {
      * @param dmpProductInfoRequest
      * @return
      */
+    @Log(title = "分页", businessType = BusinessType.OTHER)
     @PostMapping("/page")
     public ApiResult<CommonPage<DmpProductInfo>> page(@RequestBody DmpProductInfoRequest dmpProductInfoRequest)
     {

+ 1 - 1
service-iot/service-iot-biz/src/main/java/com/usky/iot/controller/web/DmpSoftwareUpgradeController.java

@@ -42,7 +42,7 @@ public class DmpSoftwareUpgradeController {
      * @param dmpSoftwareUpgradeRequest
      * @return
      */
-    @GetMapping("/page")
+    @PostMapping("/page")
     public ApiResult<CommonPage<DmpSoftwareUpgrade>> page(@RequestBody DmpSoftwareUpgradeRequest dmpSoftwareUpgradeRequest)
     {
         return ApiResult.success(dmpSoftwareUpgradeService.page(dmpSoftwareUpgradeRequest));

+ 6 - 3
service-iot/service-iot-biz/src/main/java/com/usky/iot/domain/DmpDeviceInfo.java

@@ -1,13 +1,14 @@
 package com.usky.iot.domain;
 
 import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableName;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 
 import java.io.Serializable;
-import java.time.LocalDateTime;
+import java.util.Date;
 
 /**
  * <p>
@@ -88,7 +89,7 @@ public class DmpDeviceInfo implements Serializable {
     /**
      * 创建时间
      */
-    private LocalDateTime createdTime;
+    private Date createdTime;
 
     /**
      * 更新人
@@ -98,7 +99,7 @@ public class DmpDeviceInfo implements Serializable {
     /**
      * 更新时间
      */
-    private LocalDateTime updatedTime;
+    private Date updatedTime;
 
     /**
      * 租户号
@@ -108,10 +109,12 @@ public class DmpDeviceInfo implements Serializable {
     /**
      * 产品名称
      */
+    @TableField(exist = false)
     private String productName;
     /**
      * 设备状态
      */
+    @TableField(exist = false)
     private Integer deviceStatus;
 
     /**

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

@@ -8,7 +8,7 @@ import lombok.EqualsAndHashCode;
 
 import java.io.Serializable;
 import java.math.BigDecimal;
-import java.time.LocalDateTime;
+import java.util.Date;
 import java.util.List;
 
 /**
@@ -119,7 +119,7 @@ public class DmpProductAttribute implements Serializable {
     /**
      * 创建时间
      */
-    private LocalDateTime createdTime;
+    private Date createdTime;
 
     /**
      * 更新人
@@ -129,7 +129,7 @@ public class DmpProductAttribute implements Serializable {
     /**
      * 更新时间
      */
-    private LocalDateTime updatedTime;
+    private Date updatedTime;
 
     /**
      * 租户号

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

@@ -8,7 +8,7 @@ import lombok.Data;
 import lombok.EqualsAndHashCode;
 
 import java.io.Serializable;
-import java.time.LocalDateTime;
+import java.util.Date;
 
 /**
  * <p>
@@ -119,7 +119,7 @@ public class DmpProductInfo implements Serializable {
     /**
      * 创建时间
      */
-    private LocalDateTime createdTime;
+    private Date createdTime;
 
     /**
      * 更新人
@@ -129,7 +129,7 @@ public class DmpProductInfo implements Serializable {
     /**
      * 更新时间
      */
-    private LocalDateTime updatedTime;
+    private Date updatedTime;
 
     /**
      * 租户号

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

@@ -6,6 +6,7 @@ import com.usky.iot.domain.DmpDeviceInfo;
 import com.usky.iot.service.vo.DmpDeviceInfoRequest;
 import org.springframework.web.multipart.MultipartFile;
 
+import javax.servlet.http.HttpServletResponse;
 import java.util.List;
 import java.util.Map;
 
@@ -44,4 +45,10 @@ public interface DmpDeviceInfoService extends CrudService<DmpDeviceInfo> {
     int deviceCountByProductId(Integer productId);
 
     void addByFile(Integer productId, MultipartFile multipartFiles);
+
+    /**
+     * 导出
+     * @param dmpDeviceInfoRequest
+     */
+    void export(DmpDeviceInfoRequest dmpDeviceInfoRequest, HttpServletResponse response);
 }

+ 68 - 4
service-iot/service-iot-biz/src/main/java/com/usky/iot/service/impl/DmpDeviceInfoServiceImpl.java

@@ -1,6 +1,9 @@
 package com.usky.iot.service.impl;
 
+
+import cn.afterturn.easypoi.excel.ExcelExportUtil;
 import cn.afterturn.easypoi.excel.ExcelImportUtil;
+import cn.afterturn.easypoi.excel.entity.ExportParams;
 import cn.afterturn.easypoi.excel.entity.ImportParams;
 import cn.hutool.core.collection.CollectionUtil;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
@@ -13,19 +16,23 @@ 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.core.util.UUIDUtils;
 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.DmpDeviceExcelVO;
 import com.usky.iot.service.vo.DmpDeviceExportVO;
 import com.usky.iot.service.vo.DmpDeviceInfoRequest;
+import org.apache.poi.ss.usermodel.Workbook;
 import org.springframework.stereotype.Service;
 import org.springframework.web.multipart.MultipartFile;
 
-import java.util.List;
-import java.util.Map;
-import java.util.Objects;
-import java.util.Optional;
+import javax.servlet.ServletOutputStream;
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+import java.net.URLEncoder;
+import java.util.*;
 
 /**
  * <p>
@@ -40,6 +47,7 @@ public class DmpDeviceInfoServiceImpl extends AbstractCrudService<DmpDeviceInfoM
 
     @Override
     public boolean add(DmpDeviceInfo dmpDeviceInfo) {
+        dmpDeviceInfo.setDeviceId(UUIDUtils.uuid());
         if (checkNameUnique(dmpDeviceInfo)){
             throw new BusinessException("新增设备信息'" + dmpDeviceInfo.getDeviceName() + "'失败,设备信息已存在");
         }
@@ -48,6 +56,7 @@ public class DmpDeviceInfoServiceImpl extends AbstractCrudService<DmpDeviceInfoM
 
     @Override
     public void update(DmpDeviceInfo dmpDeviceInfo) {
+        dmpDeviceInfo.setUpdatedTime(new Date());
         if (checkNameUnique(dmpDeviceInfo)){
             throw new BusinessException("修改设备信息'" + dmpDeviceInfo.getDeviceName() + "'失败,设备信息已存在");
         }
@@ -104,6 +113,61 @@ public class DmpDeviceInfoServiceImpl extends AbstractCrudService<DmpDeviceInfoM
         this.saveBatch(deviceByFile);
     }
 
+    @Override
+    public void export(DmpDeviceInfoRequest dmpDeviceInfoRequest, HttpServletResponse response) {
+        Workbook workbook = null;
+        try {
+            ExportParams params = new ExportParams(null, "设备列表");
+            workbook = ExcelExportUtil.exportBigExcel(params, DmpDeviceExcelVO.class,
+                    (o, i) -> {
+                        dmpDeviceInfoRequest.setCurrent(i);
+                        dmpDeviceInfoRequest.setSize(30);
+                        CommonPage<DmpDeviceInfo> list = this.page(dmpDeviceInfoRequest);
+                        return new ArrayList<>(BeanMapperUtils.mapList(list.getRecords(),DmpDeviceInfo.class,DmpDeviceExcelVO.class));
+                    },null);
+            if (null != workbook) {
+                exportExcel(workbook,response);
+            } else {
+                throw new BusinessException("表格数据为空");
+            }
+        } catch (Exception e) {
+            log.error("导出文件失败", e);
+            throw new BusinessException("导出文件失败"+e.getMessage());
+        } finally {
+            if (workbook != null) {
+                try {
+                    workbook.close();
+                } catch (IOException e) {
+                    log.error("===export spec=== 关闭workbook失败", e);
+                }
+            }
+        }
+    }
+
+    public void exportExcel(Workbook workbook, HttpServletResponse response){
+        //定义一个流,用作流式输出
+        ServletOutputStream outputStream = null;
+        try {
+            //使用流的形式传输
+            response.setHeader("content-type", "application/octet-stream");
+            //防止中文乱码
+            response.setHeader("content-disposition", "attachment;filename=" + URLEncoder.encode("设备信息.xls", "UTF-8"));
+            outputStream = response.getOutputStream();
+            workbook.write(outputStream);
+        } catch (IOException e) {
+            e.printStackTrace();
+        } finally {
+            if(null!=outputStream){
+                try {
+                    //关闭流
+                    outputStream.close();
+                } catch (IOException e) {
+                    e.printStackTrace();
+                }
+            }
+        }
+    }
+
 
     /**
      * 获取表格数据

+ 2 - 0
service-iot/service-iot-biz/src/main/java/com/usky/iot/service/impl/DmpProductAttributeServiceImpl.java

@@ -19,6 +19,7 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
+import java.util.Date;
 import java.util.List;
 import java.util.Objects;
 import java.util.Optional;
@@ -53,6 +54,7 @@ public class DmpProductAttributeServiceImpl extends AbstractCrudService<DmpProdu
     @Transactional(rollbackFor = Exception.class)
     @Override
     public void update(DmpProductAttribute dmpProductAttribute) {
+        dmpProductAttribute.setUpdatedTime(new Date());
         if (checkNameUnique(dmpProductAttribute)){
             throw new BusinessException("新增产品属性信息'" + dmpProductAttribute.getAttributeName() + "'失败,产品信息已存在");
         }

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

@@ -17,10 +17,7 @@ import com.usky.iot.service.vo.DmpProductInfoRequest;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
-import java.util.List;
-import java.util.Map;
-import java.util.Objects;
-import java.util.Optional;
+import java.util.*;
 import java.util.stream.Collectors;
 
 /**
@@ -50,6 +47,7 @@ public class DmpProductInfoServiceImpl extends AbstractCrudService<DmpProductInf
 
     @Override
     public void update(DmpProductInfo dmpProductInfo) {
+        dmpProductInfo.setUpdatedTime(new Date());
         if (checkNameUnique(dmpProductInfo)){
             throw new BusinessException("修改产品信息'" + dmpProductInfo.getProductName() + "'失败,产品信息已存在");
         }

+ 113 - 0
service-iot/service-iot-biz/src/main/java/com/usky/iot/service/vo/DmpDeviceExcelVO.java

@@ -0,0 +1,113 @@
+package com.usky.iot.service.vo;
+
+import cn.afterturn.easypoi.excel.annotation.Excel;
+import lombok.Data;
+
+import java.util.Date;
+
+@Data
+public class DmpDeviceExcelVO {
+
+    /**
+     * 主键id
+     */
+    @Excel(name = "id", height = 6, width = 20)
+    private Integer id;
+
+    /**
+     * 设备ID;设备注册时系统自动生成一个唯一编号
+     */
+    @Excel(name = "设备id", height = 6, width = 20)
+    private String deviceId;
+
+    /**
+     * 设备编号
+     */
+    @Excel(name = "设备编号", height = 6, width = 20)
+    private String deviceCode;
+
+    /**
+     * 设备名称
+     */
+    @Excel(name = "设备名称", height = 6, width = 20)
+    private String deviceName;
+
+    /**
+     * 设备类型
+     */
+    @Excel(name = "设备类型", height = 6, width = 20)
+    private Integer deviceType;
+
+    /**
+     * 产品ID
+     */
+    @Excel(name = "产品ID", height = 6, width = 20)
+    private Integer productId;
+
+    /**
+     * 物联网卡号
+     */
+    @Excel(name = "物联网卡号", height = 6, width = 20)
+    private String simCode;
+
+    /**
+     * 国际移动用户识别码
+     */
+    @Excel(name = "国际移动用户识别码", height = 6, width = 20)
+    private String imsiCode;
+
+    /**
+     * 节点类型
+     */
+    @Excel(name = "节点类型", height = 6, width = 20)
+    private Integer nodeType;
+
+    /**
+     * 分组id
+     */
+    @Excel(name = "分组id", height = 6, width = 20)
+    private Integer groupId;
+
+
+    /**
+     * 创建人
+     */
+    @Excel(name = "创建人", height = 6, width = 20)
+    private String createdBy;
+
+    /**
+     * 创建时间
+     */
+    @Excel(name = "创建时间", height = 6, width = 20)
+    private Date createdTime;
+
+    /**
+     * 更新人
+     */
+    @Excel(name = "更新人", height = 6, width = 20)
+    private String updatedBy;
+
+    /**
+     * 更新时间
+     */
+    @Excel(name = "更新时间", height = 6, width = 20)
+    private Date updatedTime;
+
+
+    /**
+     * 产品名称
+     */
+    @Excel(name = "产品名称", height = 6, width = 20)
+    private String productName;
+    /**
+     * 设备状态
+     */
+    @Excel(name = "设备状态", height = 6, width = 20)
+    private Integer deviceStatus;
+
+    /**
+     * 是否自动订阅
+     */
+    @Excel(name = "是否自动订阅", height = 6, width = 20)
+    private Integer subscribeFlag;
+}

+ 7 - 3
service-iot/service-iot-biz/src/main/resources/mapper/iot/DmpDeviceInfoMapper.xml

@@ -23,10 +23,10 @@
     </resultMap>
     <select id="page" resultType="com.usky.iot.domain.DmpDeviceInfo">
         select ddi.*,dpi.product_name as productName, dds.device_status as deviceStatus
-        from dmp_product_info dpi
-        inner join dmp_device_info ddi
+        from dmp_product dpi
+        inner join dmp_device ddi
         on dpi.id = ddi.product_id
-        inner join dmp_device_status dds
+        left join dmp_device_status dds
         on dpi.id  = dds.product_id
         <where>
             <if test="ar.startTime != null and ar.endTime != null">
@@ -45,7 +45,11 @@
             <if test="ar.deviceStatus != null">
                 and dds.device_status = #{ar.deviceStatus}
             </if>
+            <if test="1 == 1">
+                and ddi.delete_flag = 0
+            </if>
         </where>
+        order by ddi.id desc
     </select>
 
 </mapper>