Răsfoiți Sursa

#MOD 异步导出

谭斌 2 ani în urmă
părinte
comite
26a8cbe623

+ 6 - 1
sys-api-service/pom.xml

@@ -71,7 +71,12 @@
             <artifactId>xy-oss</artifactId>
             <version>1.0</version>
         </dependency>
+        <dependency>
+            <groupId>com.xy</groupId>
+            <artifactId>xy-excel</artifactId>
+            <version>1.0</version>
+        </dependency>
 
 
     </dependencies>
-</project>
+</project>

+ 1 - 1
sys-api-service/src/main/java/com/xy/entity/FileExport.java

@@ -30,7 +30,7 @@ public class FileExport implements Serializable {
     private static final long serialVersionUID = 1L;
 
     @ApiModelProperty(value = "主键")
-    @TableId(value = "id", type = IdType.ASSIGN_ID)
+    @TableId(value = "id", type = IdType.INPUT)
     private Long id;
 
     @ApiModelProperty(value = "文件名称")

+ 67 - 4
sys-api-service/src/main/java/com/xy/service/FileExportServiceImpl.java

@@ -1,22 +1,29 @@
 package com.xy.service;
 
 import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.util.StrUtil;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.github.yitter.idgen.YitIdHelper;
 import com.xy.dto.FileExportDto;
 import com.xy.entity.FileExport;
+import com.xy.enums.FileExportStatus;
+import com.xy.enums.FileExportType;
 import com.xy.mapper.FileExportMapper;
-import com.xy.utils.Emptys;
-import com.xy.utils.MybatisPlusQuery;
-import com.xy.utils.PageBean;
-import com.xy.utils.R;
+import com.xy.util.ExcelUtils;
+import com.xy.util.FileUtils;
+import com.xy.utils.*;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
+import lombok.Cleanup;
 import lombok.RequiredArgsConstructor;
 import org.springframework.stereotype.Service;
 import org.springframework.validation.annotation.Validated;
 
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.OutputStream;
 import java.util.List;
 
 import static com.xy.utils.Beans.copy;
@@ -37,6 +44,8 @@ import static com.xy.utils.PlusBeans.toPageBean;
 @Api(tags = "文件导出")
 public class FileExportServiceImpl extends ServiceImpl<FileExportMapper, FileExport> implements FileExportService {
 
+    private final FileUtils fileUtils;
+
     @Override
     @ApiOperation("对象查询")
     public R<FileExportDto.Vo> obj(FileExportDto.Vo vo) {
@@ -80,4 +89,58 @@ public class FileExportServiceImpl extends ServiceImpl<FileExportMapper, FileExp
         updateById(updateInfo);
         return R.ok();
     }
+
+    @Override
+    @ApiOperation("更新文件导出状态")
+    public R<Boolean> updateExportStatus(Long id, String exportStatus) {
+        FileExport update = new FileExport().setId(id).setExportStatus(exportStatus);
+        return R.ok(this.updateById(update));
+    }
+
+    @Override
+    @ApiOperation("更新文件导出状态")
+    public R<Boolean> updateExportStatus(Long id, String exportStatus, String fileUrl) {
+        FileExport update = new FileExport().setId(id).setExportStatus(exportStatus).setFileUrl(fileUrl);
+        return R.ok(this.updateById(update));
+    }
+
+
+    /**
+     * @param sheetName Excel sheet 名
+     * @param head      Excel head 头
+     * @param data      数据列表
+     * @param <T>
+     */
+    public <T> void exportExcelAsync(String sheetName, Class<T> head, List<T> data) {
+        //新增导出记录
+        long id = YitIdHelper.nextId();
+        String fileName = fileUtils.getFileName(id);
+        String pathName = fileUtils.getPathName(fileName);
+        try {
+            FileExportDto.Save fileExport = new FileExportDto.Save().setId(id)
+                    .setExportStatus(FileExportStatus.EXPORT_ING.getCode())
+                    .setFileType(FileExportType.DEVICE_INFO.getCode()).setFileName(fileName);
+            this.save(fileExport);
+            @Cleanup OutputStream out = new FileOutputStream(pathName);
+            //本地生成文件
+            ExcelUtils.writeOutputStream(out, sheetName, head, data);
+            this.updateExportStatus(id, FileExportStatus.EXPORT_LOCAL_SUCESS.getCode());
+
+            FileInputStream fis = new FileInputStream(pathName);
+            //对象存储云端上传
+            String cloudUrl = AliOssUtil.upload(fis, ExcelUtils.EXCEL_PREFIX + fileName);
+            if (StrUtil.isEmpty(cloudUrl)) {
+                this.updateExportStatus(id, FileExportStatus.EXPORT_FAILED.getCode());
+                return;
+            }
+            //更新状态与文件地址
+            this.updateExportStatus(id, FileExportStatus.EXPORT_CLOUD_SUCESS.getCode(), cloudUrl);
+            //删除本地文件
+            fileUtils.deleteFile(pathName);
+
+        } catch (Exception e) {
+            this.updateExportStatus(id, FileExportStatus.EXPORT_FAILED.getCode());
+        }
+    }
+
 }

+ 22 - 0
sys-api/src/main/java/com/xy/dto/ExcelDTO.java

@@ -0,0 +1,22 @@
+package com.xy.dto;
+
+import lombok.Data;
+import lombok.experimental.Accessors;
+
+import java.util.List;
+
+/**
+ * <p>
+ * excel文件导出
+ * </p>
+ *
+ * @author 谭斌
+ * @since 2023-03-04
+ */
+@Data
+@Accessors(chain = true)
+public class ExcelDTO<T> {
+    private String sheetName;
+    private Class<T> head;
+    private List<T> data;
+}

+ 66 - 3
sys-api/src/main/java/com/xy/dto/FileExportDto.java

@@ -18,12 +18,14 @@ import java.time.LocalDateTime;
  */
 public class FileExportDto {
 
+
     @Data
     @Accessors(chain = true)
     public static class SelectList extends Vo {
 
     }
 
+
     @Data
     @Accessors(chain = true)
     public static class Page extends Vo {
@@ -35,14 +37,76 @@ public class FileExportDto {
 
     @Data
     @Accessors(chain = true)
-    public static class Save extends Vo {
+    public static class Save {
+        @ApiModelProperty(value = "主键")
+        private Long id;
+
+        @ApiModelProperty(value = "文件名称")
+        private String fileName;
+
+        @ApiModelProperty(value = "文件类型(字典)")
+        private String fileType;
+
+        @ApiModelProperty(value = "导出状态(字典)")
+        private String exportStatus;
+
+
+        @ApiModelProperty(value = "文件地址")
+        private String fileUrl;
+
+        @ApiModelProperty(value = "商户ID")
+        private Long mercId;
+
+        @ApiModelProperty(value = "商户名称")
+        private String mercName;
+
+        @ApiModelProperty(value = "导出失败错误信息")
+        private String errorInfo;
+
 
     }
 
     @Data
     @Accessors(chain = true)
-    public static class Update extends Vo {
+    public static class Update {
+        @ApiModelProperty(value = "主键")
+        private Long id;
 
+        @ApiModelProperty(value = "文件名称")
+        private String fileName;
+
+        @ApiModelProperty(value = "文件类型(字典)")
+        private String fileType;
+
+        @ApiModelProperty(value = "导出状态(字典)")
+        private String exportStatus;
+
+        @ApiModelProperty(value = "导出成功时间")
+        @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+        private LocalDateTime exportSuccessTime;
+
+        @ApiModelProperty(value = "文件地址")
+        private String fileUrl;
+
+        @ApiModelProperty(value = "商户ID")
+        private Long mercId;
+
+        @ApiModelProperty(value = "商户名称")
+        private String mercName;
+
+        @ApiModelProperty(value = "导出失败错误信息")
+        private String errorInfo;
+
+        @ApiModelProperty(value = "创建人")
+        private Long createUser;
+
+        @ApiModelProperty(value = "创建时间")
+        @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+        private LocalDateTime createTime;
+
+        @ApiModelProperty(value = "更新时间")
+        @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+        private LocalDateTime updateTime;
     }
 
     @Data
@@ -88,7 +152,6 @@ public class FileExportDto {
         @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
         private LocalDateTime updateTime;
 
-
     }
 
 }

+ 2 - 1
sys-api/src/main/java/com/xy/enums/FileExportStatus.java

@@ -18,7 +18,8 @@ public enum FileExportStatus {
 
     EXPORT_ING("1", "正在导出"),
     EXPORT_FAILED("2", "导出失败"),
-    EXPORT_SUCESS("3", "导出成功");
+    EXPORT_LOCAL_SUCESS("3", "本地生成成功"),
+    EXPORT_CLOUD_SUCESS("4", "云端上传成功");
 
     /**
      * 编码值

+ 47 - 0
sys-api/src/main/java/com/xy/enums/FileExportType.java

@@ -0,0 +1,47 @@
+package com.xy.enums;
+
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+import lombok.ToString;
+
+/**
+ * 文件导出类型
+ *
+ * @author 谭斌
+ */
+@Getter
+@ToString
+@AllArgsConstructor
+public enum FileExportType {
+
+
+    DEVICE_INFO("1", "设备信息");
+
+    /**
+     * 编码值
+     */
+    private String code;
+
+    /**
+     * 描述
+     */
+    private String description;
+
+
+    /**
+     * 通过code获取enum
+     *
+     * @param code
+     * @return
+     */
+    public static FileExportType getEnumByCode(String code) {
+        FileExportType[] values = values();
+        for (FileExportType value : values) {
+            if (value.getCode().equals(code)) {
+                return value;
+            }
+        }
+        return null;
+    }
+}

+ 14 - 5
sys-api/src/main/java/com/xy/service/FileExportService.java

@@ -5,8 +5,10 @@ import com.xy.dto.FileExportDto;
 import com.xy.utils.PageBean;
 import com.xy.utils.R;
 import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestParam;
 
 import java.util.List;
 
@@ -23,18 +25,25 @@ public interface FileExportService {
 
 
     @PostMapping("obj")
-    public R<FileExportDto.Vo> obj(@RequestBody FileExportDto.Vo vo);
+    R<FileExportDto.Vo> obj(@RequestBody FileExportDto.Vo vo);
 
     @PostMapping("list")
-    public R<List<FileExportDto.Vo>> list(@RequestBody FileExportDto.SelectList selectList);
+    R<List<FileExportDto.Vo>> list(@RequestBody FileExportDto.SelectList selectList);
 
     @PostMapping("page")
-    public R<PageBean<FileExportDto.Vo>> page(@RequestBody FileExportDto.Page page);
+    R<PageBean<FileExportDto.Vo>> page(@RequestBody FileExportDto.Page page);
 
     @PostMapping("save")
-    public R<FileExportDto.Vo> save(@RequestBody @Validated FileExportDto.Save save);
+    R<FileExportDto.Vo> save(@RequestBody @Validated FileExportDto.Save save);
 
     @PostMapping("update")
-    public R update(@RequestBody @Validated FileExportDto.Update update);
+    R update(@RequestBody @Validated FileExportDto.Update update);
 
+    @GetMapping("updateExportStatus")
+    R<Boolean> updateExportStatus(@RequestParam("id") Long id, @RequestParam("exportStatus") String exportStatus);
+
+    @GetMapping("updateExportStatusUrl")
+    R<Boolean> updateExportStatus(@RequestParam("id") Long id, @RequestParam("exportStatus") String exportStatus, @RequestParam("fileUrl") String fileUrl);
+
+ 
 }