Browse Source

报表导出修改

yq 3 years ago
parent
commit
454783c465

+ 6 - 0
pom.xml

@@ -264,6 +264,12 @@
                 </exclusion>
             </exclusions>
         </dependency>
+        <dependency>
+            <groupId>org.springframework</groupId>
+            <artifactId>spring-test</artifactId>
+            <version>5.1.6.RELEASE</version>
+            <scope>compile</scope>
+        </dependency>
     </dependencies>
 
     <build>

+ 11 - 12
src/main/java/com/usky/dxtop/common/utils/ExcelUtils.java

@@ -1,10 +1,12 @@
 package com.usky.dxtop.common.utils;
 
 import org.apache.poi.ss.usermodel.Workbook;
+import org.springframework.mock.web.MockMultipartFile;
+import org.springframework.web.multipart.MultipartFile;
 
-import javax.servlet.http.HttpServletResponse;
-import java.io.IOException;
-import java.net.URLEncoder;
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.InputStream;
 
 /**
  * @author yq
@@ -12,15 +14,12 @@ import java.net.URLEncoder;
  */
 public class ExcelUtils {
 
-    public static void downLoadExcel(String fileName, HttpServletResponse response, Workbook workbook) {
-        try {
-            response.setCharacterEncoding("UTF-8");
-            response.setHeader("content-Type", "application/vnd.ms-excel");
-            response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8"));
-            workbook.write(response.getOutputStream());
-        } catch (IOException e) {
-            //throw new NormalException(e.getMessage());
-        }
+    public static MultipartFile downLoadExcel(Workbook workbook,String fileName) throws Exception{
+        ByteArrayOutputStream bos=new ByteArrayOutputStream();
+        workbook.write(bos);
+        byte[] barray=bos.toByteArray();
+        InputStream is=new ByteArrayInputStream(barray);
+        return new MockMultipartFile(fileName,fileName,fileName,is);
     }
 
 }

+ 7 - 7
src/main/java/com/usky/dxtop/controller/web/OrderController.java

@@ -10,6 +10,7 @@ import com.usky.dxtop.model.Order;
 import com.usky.dxtop.service.OrderService;
 import com.usky.dxtop.service.emun.OrderStatus;
 import com.usky.dxtop.service.vo.OrderRequest;
+import org.aspectj.weaver.loadtime.Aj;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
 
@@ -106,8 +107,8 @@ public class OrderController extends BaseController {
     }
 
     @PostMapping("/exportDetail")
-    public void exportDetail(@RequestBody OrderRequest orderRequest, HttpServletResponse response){
-        orderService.exportDetail(orderRequest,response);
+    public AjaxResult exportDetail(@RequestBody OrderRequest orderRequest){
+        return AjaxResult.success(orderService.exportDetail(orderRequest));
     }
 
     /**
@@ -136,11 +137,10 @@ public class OrderController extends BaseController {
      * @return
      */
     @GetMapping("/reportExport")
-    public void reportExport(@RequestParam(required = false) Date startTime,
-                                   @RequestParam(required = false) Date endTime,
-                                   @RequestParam Integer type,
-                                     HttpServletResponse response){
-        orderService.reportExport(startTime,endTime,type,response);
+    public AjaxResult reportExport(@RequestParam(required = false) Date startTime,
+                           @RequestParam(required = false) Date endTime,
+                           @RequestParam Integer type){
+        return AjaxResult.success(orderService.reportExport(startTime, endTime, type));
     }
 
     /**

+ 3 - 2
src/main/java/com/usky/dxtop/controller/web/TopChannelController.java

@@ -12,6 +12,7 @@ import com.usky.dxtop.controller.BaseController;
 import com.usky.dxtop.model.TopChannel;
 import com.usky.dxtop.service.TopChannelService;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
 
 /**
@@ -35,7 +36,7 @@ public class TopChannelController extends BaseController {
      */
     @RepeatSubmit
     @PostMapping
-    public AjaxResult add(@RequestBody TopChannel topChannel){
+    public AjaxResult add(@Validated @RequestBody TopChannel topChannel){
         if (UserConstants.NOT_UNIQUE.equals(topChannelService.checkNameUnique(topChannel)))
         {
             return AjaxResult.error("新增渠道信息'" + topChannel.getName() + "'失败,渠道信息已存在");
@@ -49,7 +50,7 @@ public class TopChannelController extends BaseController {
      * 修改
      */
     @PutMapping
-    public AjaxResult edit(@RequestBody TopChannel topChannel)
+    public AjaxResult edit(@Validated @RequestBody TopChannel topChannel)
     {
         if (UserConstants.NOT_UNIQUE.equals(topChannelService.checkNameUnique(topChannel)))
         {

+ 1 - 1
src/main/java/com/usky/dxtop/controller/web/TopRadioController.java

@@ -46,7 +46,7 @@ public class TopRadioController extends BaseController {
      * 修改
      */
     @PutMapping
-    public AjaxResult edit(@RequestBody TopRadio topRadio)
+    public AjaxResult edit(@Validated @RequestBody TopRadio topRadio)
     {
         if (UserConstants.NOT_UNIQUE.equals(topRadioService.checkIdentityUnique(topRadio)))
         {

+ 1 - 2
src/main/java/com/usky/dxtop/model/SysAsyncTask.java

@@ -12,7 +12,7 @@ import java.util.Date;
  */
 @Data
 public class SysAsyncTask extends BaseEntity {
-    @TableId(type = IdType.ASSIGN_ID)
+    @TableId(type = IdType.AUTO)
     //任务id
     private Long id;
     //
@@ -23,7 +23,6 @@ public class SysAsyncTask extends BaseEntity {
     private Boolean isSuccess;
     //文件类型(text或者文件)
     private String resultType;
-    private String resultKey;
     //内容batchno或者是结果
     private String result;
 }

+ 6 - 1
src/main/java/com/usky/dxtop/model/TopChannel.java

@@ -7,8 +7,9 @@ import lombok.Data;
 import lombok.EqualsAndHashCode;
 import lombok.experimental.Accessors;
 
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.Size;
 import java.io.Serializable;
-import java.time.LocalDateTime;
 
 /**
  * <p>
@@ -28,8 +29,12 @@ public class TopChannel extends BaseEntity implements Serializable {
     @TableId(value = "id", type = IdType.AUTO)
     private Long id;
 
+    @NotBlank(message = "参数名称不能为空")
+    @Size(min = 0, max = 20, message = "参数名称不能超过20个字符")
     private String name;
 
+    @NotBlank(message = "参数名称不能为空")
+    @Size(min = 0, max = 20, message = "参数名称不能超过20个字符")
     private String aliasName;
 
     private boolean delFlag;

+ 4 - 0
src/main/java/com/usky/dxtop/model/TopRadio.java

@@ -5,6 +5,8 @@ import lombok.Data;
 import lombok.EqualsAndHashCode;
 import lombok.experimental.Accessors;
 
+import javax.validation.constraints.DecimalMax;
+import javax.validation.constraints.DecimalMin;
 import javax.validation.constraints.NotBlank;
 import javax.validation.constraints.Size;
 import java.io.Serializable;
@@ -37,6 +39,8 @@ public class TopRadio extends BaseEntity implements Serializable {
     /**
      * 到账比例
      */
+    @DecimalMin(value = "0",message = "到账比例必须大于0")
+    @DecimalMax(value = "1" ,message = "到账比例必须小于或等于1")
     private Double proportion;
 
     private boolean delFlag;

+ 2 - 3
src/main/java/com/usky/dxtop/service/OrderService.java

@@ -6,7 +6,6 @@ import com.usky.dxtop.model.Order;
 import com.usky.dxtop.service.vo.OrderReport;
 import com.usky.dxtop.service.vo.OrderRequest;
 
-import javax.servlet.http.HttpServletResponse;
 import java.util.Date;
 import java.util.List;
 import java.util.Map;
@@ -90,7 +89,7 @@ public interface OrderService extends IService<Order> {
      * @param orderRequest
      * @return
      */
-    void exportDetail(OrderRequest orderRequest, HttpServletResponse response);
+    String exportDetail(OrderRequest orderRequest);
 
     /**
      * 订单报表
@@ -110,7 +109,7 @@ public interface OrderService extends IService<Order> {
      * @param type
      * @return
      */
-    void reportExport(Date startTime,Date endTime,Integer type,HttpServletResponse response);
+    String reportExport(Date startTime,Date endTime,Integer type);
 
     /**
      * 调用统一支付api(app充值)

+ 100 - 12
src/main/java/com/usky/dxtop/service/impl/OrderServiceImpl.java

@@ -10,6 +10,7 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.usky.dxtop.common.core.domain.model.LoginUser;
 import com.usky.dxtop.common.core.page.CommonPage;
 import com.usky.dxtop.common.exception.CustomException;
 import com.usky.dxtop.common.utils.*;
@@ -20,6 +21,7 @@ import com.usky.dxtop.model.*;
 import com.usky.dxtop.service.*;
 import com.usky.dxtop.service.api.TopApi;
 import com.usky.dxtop.service.config.rabbitmq.charge.ChargeConsumeConfig;
+import com.usky.dxtop.service.emun.AsyncResultType;
 import com.usky.dxtop.service.emun.OrderPayType;
 import com.usky.dxtop.service.emun.OrderSceneCode;
 import com.usky.dxtop.service.emun.OrderStatus;
@@ -34,14 +36,16 @@ import ma.glasnost.orika.impl.DefaultMapperFactory;
 import org.apache.poi.ss.usermodel.Workbook;
 import org.springframework.amqp.rabbit.connection.CorrelationData;
 import org.springframework.amqp.rabbit.core.RabbitTemplate;
+import org.springframework.aop.framework.AopContext;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.scheduling.annotation.Async;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.util.FastByteArrayOutputStream;
+import org.springframework.web.multipart.MultipartFile;
 
 import javax.imageio.ImageIO;
-import javax.servlet.http.HttpServletResponse;
 import java.awt.image.BufferedImage;
 import java.io.IOException;
 import java.math.BigDecimal;
@@ -85,6 +89,10 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
 
     @Autowired
     private StaffService staffService;
+    @Autowired
+    private ISysAsyncTaskService sysAsyncTaskService;
+    @Autowired
+    private SysFileService sysFileService;
 
     @Transactional(rollbackFor = Exception.class)
     @Override
@@ -292,8 +300,22 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
         this.updateById(order);
     }
 
+
     @Override
-    public void exportDetail(OrderRequest orderRequest,HttpServletResponse response) {
+    public String exportDetail(OrderRequest orderRequest) {
+        LoginUser loginUser = SecurityUtils.getLoginUser();
+        SysUser user = loginUser.getUser();
+        Long taskId = sysAsyncTaskService.getId(user.getUserName(), AsyncResultType.FILE.name());
+        if (null == taskId) {
+            throw new CustomException("获取次数太多了请稍后获取");
+        }
+        ((OrderServiceImpl) AopContext.currentProxy()).syncOrder(taskId,orderRequest);
+        return String.valueOf(taskId);
+
+    }
+
+    @Async
+    public void syncOrder(Long taskId,OrderRequest orderRequest){
         Workbook workbook = null;
         try {
             ExportParams params = new ExportParams(null, "订单详情");
@@ -306,13 +328,14 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
                     },null);
             if (null != workbook) {
                 String fileName = String.format("%s.xls", "订单详情");
-                ExcelUtils.downLoadExcel(fileName,response,workbook);
+                MultipartFile multipartFile = ExcelUtils.downLoadExcel(workbook, fileName);
+                uploadOrderFile(multipartFile,taskId);
             } else {
-                throw new CustomException("表格数据为空");
+                sysAsyncTaskService.sendResult(taskId, false, "订单表格数据为空", AsyncResultType.TEXT);
             }
         } catch (Exception e) {
             log.error("导出文件失败", e);
-            throw new CustomException("导出文件失败");
+            sysAsyncTaskService.sendResult(taskId, false, "导出订单文件失败", AsyncResultType.TEXT);
         } finally {
             if (workbook != null) {
                 try {
@@ -324,6 +347,31 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
         }
     }
 
+    public void uploadOrderFile(MultipartFile multipartFile, Long taskId){
+        List<MultipartFile> list = new ArrayList<>();
+        list.add(multipartFile);
+        String batchNo = sysFileService.generateBatchNo();
+        SysFile sysFile = new SysFile();
+        sysFile.setBatchNo(batchNo);
+        sysFile.setFiles(list);
+        sysFile.setUploadType(SysFileServiceImpl.FILE);
+        sysFile.setBusinessType("订单报表导出");
+        sysFile.setExpriceAt(DateUtils.addDays(new Date(), 3));
+        List<SysFile> sysFileList = sysFileService.addFile(sysFile);
+        long count = sysFileList.stream().filter(sysFileDTO -> !sysFileDTO.getSuccess()).count();
+        if (count > 0) {
+            sysAsyncTaskService.sendResult(taskId, false, "上传文件失败", AsyncResultType.TEXT);
+            return;
+        }
+        List<String> idList = sysFileList.stream().map(sf -> sf.getId().toString()).collect(Collectors.toList());
+        boolean active = sysFileService.active(batchNo,idList);
+        if (active) {
+            sysAsyncTaskService.sendResult(taskId, true, batchNo, AsyncResultType.FILE);
+        } else {
+            sysAsyncTaskService.sendResult(taskId, false, "上传文件失败", AsyncResultType.TEXT);
+        }
+    }
+
     public OrderExport orderChangeOrderExport(Order order){
         MapperFactory factory = new DefaultMapperFactory.Builder().build();
         factory.classMap(Order.class, OrderExport.class)
@@ -363,8 +411,9 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
                 "sum(if(pay_type = '2', money, 0)) as wxMoney",
                 "sum(if(pay_type = '3', money, 0)) as zfbMoney")
                 .between(null != startTime && null != endTime,"create_time",startTime,endTime)
+                .eq("order_flag",OrderStatus.COMPLETE.getCode())
                 .groupBy("reportDate")
-                .orderByAsc("reportDate");
+                .orderByDesc("reportDate");
         IPage<Map<String, Object>> mapIPage = baseMapper.selectMapsPage(page, queryWrapper);
         String jsonStr = JSON.toJSONString(mapIPage.getRecords());
         List<OrderReport> orderReports = JSON.parseArray(jsonStr, OrderReport.class);
@@ -372,24 +421,36 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
     }
 
     @Override
-    public void reportExport(Date startTime, Date endTime, Integer type, HttpServletResponse response) {
+    public String reportExport(Date startTime, Date endTime, Integer type) {
+        LoginUser loginUser = SecurityUtils.getLoginUser();
+        SysUser user = loginUser.getUser();
+        Long taskId = sysAsyncTaskService.getId(user.getUserName(), AsyncResultType.FILE.name());
+        if (null == taskId) {
+            throw new CustomException("获取次数太多了请稍后获取");
+        }
+        ((OrderServiceImpl) AopContext.currentProxy()).syncOrderBusiness(taskId,startTime,endTime,type);
+        return String.valueOf(taskId);
+    }
+    @Async
+    public void syncOrderBusiness(Long taskId,Date startTime, Date endTime, Integer type){
         Workbook workbook = null;
         try {
-            ExportParams params = new ExportParams(null, "订单统计");
+            ExportParams params = new ExportParams(null, "订单报表");
             workbook = ExcelExportUtil.exportBigExcel(params, OrderReport.class,
                     (o, i) -> {
                         CommonPage<OrderReport> list = this.orderReportList(i,30,startTime,endTime,type);
                         return new ArrayList<>(list.getRecords());
                     },null);
             if (null != workbook) {
-                String fileName = String.format("%s.xls", "订单统计");
-                ExcelUtils.downLoadExcel(fileName,response,workbook);
+                String fileName = String.format("%s.xls", "订单报表");
+                MultipartFile multipartFile = ExcelUtils.downLoadExcel(workbook, fileName);
+                uploadOrderBusinessFile(multipartFile,taskId);
             } else {
-                throw new CustomException("表格数据为空");
+                sysAsyncTaskService.sendResult(taskId, false, "订单表格数据为空", AsyncResultType.TEXT);
             }
         } catch (Exception e) {
             log.error("导出文件失败", e);
-            throw new CustomException("导出文件失败");
+            sysAsyncTaskService.sendResult(taskId, false, "导出订单文件失败", AsyncResultType.TEXT);
         } finally {
             if (workbook != null) {
                 try {
@@ -400,6 +461,33 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
             }
         }
     }
+
+    public void uploadOrderBusinessFile(MultipartFile multipartFile, Long taskId){
+        List<MultipartFile> list = new ArrayList<>();
+        list.add(multipartFile);
+        String batchNo = sysFileService.generateBatchNo();
+        SysFile sysFile = new SysFile();
+        sysFile.setBatchNo(batchNo);
+        sysFile.setFiles(list);
+        sysFile.setUploadType(SysFileServiceImpl.FILE);
+        sysFile.setBusinessType("订单");
+        sysFile.setExpriceAt(DateUtils.addDays(new Date(), 3));
+        List<SysFile> sysFileList = sysFileService.addFile(sysFile);
+        long count = sysFileList.stream().filter(sysFileDTO -> !sysFileDTO.getSuccess()).count();
+        if (count > 0) {
+            sysAsyncTaskService.sendResult(taskId, false, "上传文件失败", AsyncResultType.TEXT);
+            return;
+        }
+        List<String> idList = sysFileList.stream().map(sf -> sf.getId().toString()).collect(Collectors.toList());
+        boolean active = sysFileService.active(batchNo,idList);
+        if (active) {
+            sysAsyncTaskService.sendResult(taskId, true, batchNo, AsyncResultType.FILE);
+        } else {
+            sysAsyncTaskService.sendResult(taskId, false, "上传文件失败", AsyncResultType.TEXT);
+        }
+    }
+
+
     @Transactional(rollbackFor = Exception.class)
     @Override
     public String callUnifiedPay(Order order) {

+ 0 - 1
src/main/java/com/usky/dxtop/service/impl/StaffRadioServiceImpl.java

@@ -30,7 +30,6 @@ public class StaffRadioServiceImpl extends ServiceImpl<StaffRadioMapper, StaffRa
                 .forEach(staffRadio -> {
                     LambdaUpdateWrapper<StaffRadio> updateWrapper = Wrappers.lambdaUpdate();
                     updateWrapper.eq(StaffRadio::getStaffId, staffRadio.getStaffId())
-                            .eq(StaffRadio::getRadioId, staffRadio.getRadioId())
                             .set(StaffRadio::isDelFlag,staffRadio.isDelFlag());
                     this.saveOrUpdate(staffRadio,updateWrapper);
                 });

+ 1 - 4
src/main/java/com/usky/dxtop/service/impl/SysAsyncTaskServiceImpl.java

@@ -18,7 +18,6 @@ import org.springframework.stereotype.Service;
 
 import java.util.Calendar;
 import java.util.Date;
-import java.util.Objects;
 
 /**
  * @author fanzhiqiang
@@ -43,6 +42,7 @@ public class SysAsyncTaskServiceImpl extends ServiceImpl<SysAsyncTaskMapper, Sys
         sysAsyncTask.setStartTime(new Date());
         sysAsyncTask.setCreateBy(SecurityUtils.getUsername());
         sysAsyncTask.setFuncType(funcType);
+        sysAsyncTask.setResultType(funcType);
         save(sysAsyncTask);
         return sysAsyncTask.getId();
     }
@@ -68,9 +68,6 @@ public class SysAsyncTaskServiceImpl extends ServiceImpl<SysAsyncTaskMapper, Sys
         sysAsyncTask.setIsSuccess(isSuccess);
         sysAsyncTask.setResult(result);
         sysAsyncTask.setResultType(resultType.name());
-        if (Objects.equals(AsyncResultType.FILE, resultType)) {
-            sysAsyncTask.setResultKey(result);
-        }
         sysAsyncTask.setEndTime(new Date());
         this.updateById(sysAsyncTask);
     }

+ 2 - 2
src/main/java/com/usky/dxtop/service/impl/SysFileServiceImpl.java

@@ -39,9 +39,9 @@ import static java.util.stream.Collectors.toList;
 @Service
 public class SysFileServiceImpl extends ServiceImpl<SysFileMapper, SysFile> implements SysFileService {
 
-    private static final String FILE = "file";
+    public static final String FILE = "file";
 
-    private static final String URL = "url";
+    public static final String URL = "url";
 
     private static final String FILE_PATH = "https://wx.ewoogi.com/dxfile/";
 

+ 1 - 0
src/main/resources/mapper/SysJobMapper.xml

@@ -41,6 +41,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 				AND invoke_target like concat('%', #{invokeTarget}, '%')
 			</if>
 		</where>
+		order by job_id desc
 	</select>
 	
 	<select id="selectJobAll" resultMap="SysJobResult">