Browse Source

消费导出

yq 2 years ago
parent
commit
bb45159ed2

+ 10 - 0
src/main/java/com/usky/dxtop/controller/web/business/DishController.java

@@ -79,5 +79,15 @@ public class DishController {
         return ApiResult.success(dishService.update(updateWrapper));
     }
 
+    /**
+     * 导出
+     * @param dishRequest
+     * @return
+     */
+    @PostMapping("/export")
+    public ApiResult<String> export(@RequestBody DishRequest dishRequest){
+        return ApiResult.success(dishService.export(dishRequest));
+    }
+
 }
 

+ 2 - 0
src/main/java/com/usky/dxtop/service/DishService.java

@@ -45,4 +45,6 @@ public interface DishService extends IService<Dish> {
      */
     Boolean update(Dish dish);
 
+
+    String export(DishRequest dishRequest);
 }

+ 131 - 0
src/main/java/com/usky/dxtop/service/impl/DishServiceImpl.java

@@ -1,20 +1,44 @@
 package com.usky.dxtop.service.impl;
 
 
+import cn.afterturn.easypoi.excel.ExcelExportUtil;
+import cn.afterturn.easypoi.excel.entity.ExportParams;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 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.DateUtils;
+import com.usky.dxtop.common.utils.ExcelUtils;
+import com.usky.dxtop.common.utils.SecurityUtils;
 import com.usky.dxtop.mapper.DishMapper;
 import com.usky.dxtop.model.Dish;
+import com.usky.dxtop.model.SysFile;
+import com.usky.dxtop.model.SysUser;
 import com.usky.dxtop.service.DishService;
+import com.usky.dxtop.service.ISysAsyncTaskService;
+import com.usky.dxtop.service.SysFileService;
+import com.usky.dxtop.service.emun.AsyncResultType;
+import com.usky.dxtop.service.vo.DishExport;
 import com.usky.dxtop.service.vo.DishRequest;
+import ma.glasnost.orika.MapperFacade;
+import ma.glasnost.orika.MapperFactory;
+import ma.glasnost.orika.impl.DefaultMapperFactory;
+import org.apache.poi.ss.usermodel.Workbook;
+import org.springframework.aop.framework.AopContext;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.scheduling.annotation.Async;
 import org.springframework.stereotype.Service;
+import org.springframework.web.multipart.MultipartFile;
 
+import java.io.IOException;
+import java.util.ArrayList;
 import java.util.Date;
+import java.util.List;
 import java.util.Map;
+import java.util.stream.Collectors;
 
 /**
  * <p>
@@ -27,6 +51,11 @@ import java.util.Map;
 @Service
 public class DishServiceImpl extends ServiceImpl<DishMapper, Dish> implements DishService {
 
+    @Autowired
+    private ISysAsyncTaskService sysAsyncTaskService;
+
+    @Autowired
+    private SysFileService sysFileService;
     @Override
     public CommonPage<Dish> page(DishRequest dishRequest) {
         IPage<Dish> page = new Page<>(dishRequest.getCurrent(), dishRequest.getSize());
@@ -54,5 +83,107 @@ public class DishServiceImpl extends ServiceImpl<DishMapper, Dish> implements Di
         return this.updateById(dish);
     }
 
+    @Override
+    public String export(DishRequest dishRequest) {
+        LoginUser loginUser = SecurityUtils.getLoginUser();
+        SysUser user = loginUser.getUser();
+        Long taskId = sysAsyncTaskService.getId(user.getUserName(), "消费记录");
+        if (null == taskId) {
+            throw new CustomException("获取次数太多了请稍后获取");
+        }
+        ((DishServiceImpl) AopContext.currentProxy()).syncDish(taskId,dishRequest);
+        return String.valueOf(taskId);
+    }
+
+
+    @Async
+    public void syncDish(Long taskId, DishRequest dishRequest){
+        Workbook workbook = null;
+        try {
+            ExportParams params = new ExportParams(null, "消费记录");
+            workbook = ExcelExportUtil.exportBigExcel(params, DishExport.class,
+                    (o, i) -> {
+                        dishRequest.setCurrent(i);
+                        dishRequest.setSize(30);
+                        CommonPage<Dish> page = this.page(dishRequest);
+                        return page.getRecords().stream().map(this::getDishExport).collect(Collectors.toList());
+                    },null);
+            if (null != workbook) {
+                String fileName = String.format("%s.xls", "消费记录报表");
+                MultipartFile multipartFile = ExcelUtils.downLoadExcel(workbook, fileName);
+                uploadOrderFile(multipartFile,taskId);
+            } else {
+                sysAsyncTaskService.sendResult(taskId, false, "表格数据为空", AsyncResultType.TEXT);
+            }
+        } catch (Exception e) {
+            log.error("导出文件失败", e);
+            sysAsyncTaskService.sendResult(taskId, false, "导出订单文件失败", AsyncResultType.TEXT);
+        } finally {
+            if (workbook != null) {
+                try {
+                    workbook.close();
+                } catch (IOException e) {
+                    log.error("===export spec=== 关闭workbook失败", e);
+                }
+            }
+        }
+    }
+
+    public DishExport getDishExport(Dish dish){
+        MapperFactory factory = new DefaultMapperFactory.Builder().build();
+        factory.classMap(Dish.class, DishExport.class)
+                .exclude("type")
+                .exclude("account")
+                .exclude("part")
+                .byDefault().register();
+        MapperFacade mapper = factory.getMapperFacade();
+        DishExport dishExport = mapper.map(dish, DishExport.class);
+        if (dish.getType() == 1){
+            dishExport.setType("消费");
+        }else{
+            dishExport.setType("消费撤单");
+        }
+        if (dish.getAccount() == 0){
+            dishExport.setAccount("主账户");
+        }else {
+            dishExport.setAccount("补贴账户");
+        }
+        if (dish.getPart() == 1){
+            dishExport.setPart("早餐");
+        }else if (dish.getPart() == 2){
+            dishExport.setPart("午餐");
+        }else if (dish.getPart() == 3){
+            dishExport.setPart("晚餐");
+        }else if (dish.getPart() == 4){
+            dishExport.setPart("夜宵");
+        }
+        return dishExport;
+    }
+
+    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);
+        }
+    }
+
 
 }

+ 102 - 0
src/main/java/com/usky/dxtop/service/vo/DishExport.java

@@ -0,0 +1,102 @@
+package com.usky.dxtop.service.vo;
+
+import cn.afterturn.easypoi.excel.annotation.Excel;
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+@Data
+public class DishExport {
+
+
+    /**
+     * 序列号
+     */
+    @Excel(name = "序列号", height = 6, width = 20)
+    private Long seq;
+    /**
+     * 创建时间
+     */
+    @Excel(name = "创建时间", height = 6, width = 20,format = "yyyy-MM-dd HH:mm:ss")
+    private Date createTime;
+    /**
+     * 卡id
+     */
+    @Excel(name = "卡id", height = 6, width = 20)
+    private String card;
+    /**
+     * 卡编号
+     */
+    @Excel(name = "卡编号", height = 6, width = 20)
+    private String cardNo;
+    /**
+     *1 消费 1001 消费撤单
+     */
+    @Excel(name = "消费类型", height = 6, width = 20)
+    private String type;
+    /**
+     *终端id
+     */
+    @Excel(name = "终端id", height = 6, width = 20)
+    private Integer term;
+    /**
+     * 餐厅id
+     */
+    @Excel(name = "餐厅id", height = 6, width = 20)
+    private Integer shop;
+    /**
+     * 终端名称
+     */
+    @Excel(name = "终端名称", height = 6, width = 20)
+    private String termName;
+    /**
+     * 餐厅名称
+     */
+    @Excel(name = "餐厅名称", height = 6, width = 20)
+    private String shopName;
+    /**
+     *金额
+     */
+    @Excel(name = "金额", height = 6, width = 20)
+    private BigDecimal amt;
+    /**
+     * 卡余额
+     */
+    @Excel(name = "卡余额", height = 6, width = 20)
+    private BigDecimal balance;
+    /**
+     * 0主账号1补贴账户
+     */
+    @Excel(name = "账户类型", height = 6, width = 20)
+    private String account;
+    /**
+     * 1 早餐 2 午餐 3 晚餐 4 夜宵
+     */
+    @Excel(name = "餐别", height = 6, width = 20)
+    private String part;
+    /**
+     * 用户姓名
+     */
+    @Excel(name = "用户姓名", height = 6, width = 20)
+    private String name;
+    /**
+     * 用户唯一识别号
+     */
+    @Excel(name = "用户唯一识别号", height = 6, width = 20)
+    private String mob;
+    /**
+     * 商品信息
+     */
+    private String details;
+    /**
+     * 支付信息
+     */
+    private String payments;
+    /**
+     * 用户手机号
+     */
+    @Excel(name = "用户手机号", height = 6, width = 20)
+    private String userPhone;
+
+}