Browse Source

feat:“优化订单明细导出功能,采用多线程分页查询“

soobin 1 năm trước cách đây
mục cha
commit
63c6b39ff4

+ 253 - 63
src/main/java/com/szwl/controller/TOrderController.java

@@ -6,10 +6,16 @@ import cn.afterturn.easypoi.excel.entity.ExportParams;
 import cn.com.crbank.ommo.bean.ResultMessage;
 import cn.com.crbank.ommo.esclient.ElasticsearchRunner;
 import cn.hutool.core.bean.BeanUtil;
+import com.alibaba.excel.EasyExcel;
+import com.alibaba.excel.ExcelWriter;
+import com.alibaba.excel.util.ListUtils;
+import com.alibaba.excel.write.metadata.WriteSheet;
+import com.alibaba.excel.write.style.column.LongestMatchColumnWidthStyleStrategy;
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.szwl.common.aop.LogAnnotation;
@@ -20,11 +26,9 @@ import com.szwl.model.bean.*;
 import com.szwl.model.bo.JsonMessage;
 import com.szwl.model.bo.R;
 import com.szwl.model.bo.ResponseModel;
+import com.szwl.model.dto.OrderDto;
 import com.szwl.model.entity.*;
-import com.szwl.model.excel.CoinOrderTarget;
-import com.szwl.model.excel.OrderByAdminTarget;
-import com.szwl.model.excel.OrderByClientidTarget;
-import com.szwl.model.excel.OrderTarget;
+import com.szwl.model.excel.*;
 import com.szwl.model.query.*;
 import com.szwl.model.utils.DateUtils;
 import com.szwl.model.utils.FgObjectUtil;
@@ -32,7 +36,9 @@ import com.szwl.model.utils.JsonUtils;
 import com.szwl.service.*;
 import com.szwl.service.es.EsTEquipmentService;
 import com.szwl.service.es.EsTOrderService;
+import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
+import lombok.Data;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang.StringUtils;
 import org.apache.poi.ss.usermodel.Workbook;
@@ -58,6 +64,7 @@ import java.util.*;
  * @since 2022-06-14
  */
 @Slf4j
+@Api(value = "/tOrder", tags = {"订单管理"})
 @RestController
 @RequestMapping("/tOrder")
 public class TOrderController {
@@ -1357,7 +1364,6 @@ public class TOrderController {
                               String startDate, String endDate, String companyType, String machineType,
                               long current, long size) throws ParseException {
         current = 1L;
-//        size = 1000L;
         size = 5000L;
         SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
         Date begin = null;
@@ -1554,64 +1560,6 @@ public class TOrderController {
 
         //1,线下
         if (type.equals("1")) {
-//            LambdaQueryWrapper<TCoinOrder> query = Wrappers.lambdaQuery();
-//            if (StringUtils.isNotEmpty(userName) && !userName.equals("admin")) {
-//                ResponseModel<TAdmin> adminByUsername = szwlFeign.getAdminByUsername(userName);
-//                TAdmin data = adminByUsername.getData();
-//                if (data == null || data.getId() == null) {
-//                    return R.fail(ResponseCodesEnum.A0001, "找不到商家");
-//                }
-//                query.eq(TCoinOrder::getAdminId, data.getId());
-//            } else if (StringUtils.isEmpty(userName)) {
-//                //adminType="all"时,代表查全部下级  子账户没有这个权限  公司人员默认查所有人
-//                if (StringUtils.isNotEmpty(adminType)) {
-//                    if (admin.getIsAdmined() && admin.getType() > 1) {
-//                        if (admin.getType() > 1) {
-//                            if (adminType.equals("all")) {
-//                                //查找所有下级
-//                                List<Long> admidIdList = R.getDataIfSuccess(szwlFeign.getAdminIdList(adminId));
-//                                query.in(TCoinOrder::getAdminId, admidIdList);
-//                            }
-//                        }
-//                    } else {
-//                        if (admin.getType() > 1) {
-//                            //登录账户为子账户 不查下级 只查对应机器的订单
-//                            TAdminEquipment adminEquipment = R.getDataIfSuccess(szwlFeign.getClientIdList(String.valueOf(admin.getParentId())));
-//                            if (adminEquipment.getType().equals("0")) {
-//                                //全部机器
-//                                TAdmin upAdmin = R.getDataIfSuccess(szwlFeign.getAdmin(String.valueOf(admin.getParentId())));
-//                                query.eq(TCoinOrder::getAdminId, upAdmin.getId());
-//                            } else {
-//                                String equipmentIds = adminEquipment.getEquipmentIds();
-//                                List<String> equipmentIdList = JSON.parseArray(equipmentIds, String.class);
-//                                query.in(TCoinOrder::getClientId, equipmentIdList);
-//                            }
-//                        }
-//                    }
-//
-//                } else {
-//                    //判断当前账号状态 公司还是商家
-//                    if (admin.getType() > 1) {
-//                        //商家 判断是否子账户
-//                        if (admin.getIsAdmined()) {
-//                            //商家自己
-//                            query.eq(TCoinOrder::getAdminId, adminId);
-//                        } else {
-//                            //商家 子账户
-//                            //登录账户为子账户 不查下级 只查对应机器的订单
-//                            TAdminEquipment adminEquipment = R.getDataIfSuccess(szwlFeign.getClientIdList(String.valueOf(admin.getParentId())));
-//                            if (adminEquipment.getType().equals("0")) {
-//                                //全部机器
-//                                TAdmin upAdmin = R.getDataIfSuccess(szwlFeign.getAdmin(String.valueOf(admin.getParentId())));
-//                                query.eq(TCoinOrder::getAdminId, upAdmin.getId());
-//                            } else {
-//                                String equipmentIds = adminEquipment.getEquipmentIds();
-//                                List<String> equipmentIdList = JSON.parseArray(equipmentIds, String.class);
-//                                query.in(TCoinOrder::getClientId, equipmentIdList);
-//                            }
-//                        }
-//                    }
-//                }
             LambdaQueryWrapper<TCoinOrder> query = Wrappers.lambdaQuery();
             if (!userName.equals("admin")) {
                 // 如果为账户
@@ -1746,6 +1694,248 @@ public class TOrderController {
         return R.ok("同步es成功");
     }
 
+    @ApiOperation("订单明细导出")
+    @PostMapping("/newOrderExport")
+    public void newOrderExport(HttpServletResponse response, @RequestBody OrderDto orderDto) {
+        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+        Date begin = null;
+        Date end = null;
+        try {
+            begin = simpleDateFormat.parse(orderDto.getStartDate());
+            end = simpleDateFormat.parse(orderDto.getEndDate());
+        } catch (ParseException e) {
+            e.printStackTrace();
+        }
+        long time = end.getTime() - begin.getTime();
+        if (time > 183 * 24 * 60 * 60 * 1000L) {
+            log.error("导出订单明细时间范围不能超过半年");
+            return;
+        }
+        //类型
+        //0,线上
+        if (orderDto.getType().equals("0")) {
+            try {
+                orderService.dataExport(orderDto, begin, end, response);
+            } catch (Exception e) {
+                e.printStackTrace();
+            }
+//            LambdaQueryWrapper<TOrder> query = Wrappers.lambdaQuery();
+//            if (!orderDto.getUserName().equals("admin")) {
+//                if (StringUtils.isNotEmpty(orderDto.getUserName())) {
+//                    TAdmin data = R.getDataIfSuccess(szwlFeign.getAdminByUsername(orderDto.getUserName()));
+//                    if (data == null || data.getId() == null) {
+//                        return;
+//                    }
+//                    if (data.getIsAdmined()) {
+//                        query.eq(TOrder::getAdminId, data.getId());
+//                    } else {
+//                        if (data.getParentId() != 1) {
+//                            query.eq(TOrder::getAdminId, data.getParentId());
+//                            //查找子账户所管理的机器
+//                            TAdminEquipment adminEquipment = R.getDataIfSuccess(szwlFeign.getClientIdList(orderDto.getAdminId()));
+//                            if (!adminEquipment.getType().equals("0")) {
+//                                List<String> list = R.getDataIfSuccess(szwlFeign.getClientIds(orderDto.getAdminId()));
+//                                if (list == null || list.size() == 0) {
+//                                    return;
+//                                }
+//                                query.in(TOrder::getClientId, list);
+//                            }
+//                        }
+//                    }
+//                } else {
+//                    //adminType="all"时,代表查全部下级  子账户没有这个权限  公司人员默认查所有人
+//                    if (StringUtils.isNotEmpty(orderDto.getAdminType())) {
+//                        if (admin.getIsAdmined() && admin.getType() > 1) {
+//                            if (admin.getType() > 1) {
+//                                if (orderDto.getAdminType().equals("all")) {
+//                                    //查找所有下级
+//                                    List<Long> admidIdList = R.getDataIfSuccess(szwlFeign.getAdminIdList(orderDto.getAdminId()));
+//                                    query.in(TOrder::getAdminId, admidIdList);
+//                                }
+//                            }
+//                        } else {
+//                            if (admin.getType() > 1) {
+//                                //登录账户为子账户 不查下级 只查对应机器的订单
+//                                TAdminEquipment adminEquipment = R.getDataIfSuccess(szwlFeign.getClientIdList(String.valueOf(admin.getParentId())));
+//                                if (adminEquipment.getType().equals("0")) {
+//                                    //全部机器
+//                                    TAdmin upAdmin = R.getDataIfSuccess(szwlFeign.getAdmin(String.valueOf(admin.getParentId())));
+//                                    query.eq(TOrder::getAdminId, upAdmin.getId());
+//                                } else {
+//                                    String equipmentIds = adminEquipment.getEquipmentIds();
+//                                    List<String> equipmentIdList = JSON.parseArray(equipmentIds, String.class);
+//                                    query.in(TOrder::getClientId, equipmentIdList);
+//                                }
+//                            }
+//                        }
+//                    } else {
+//                        //判断当前账号状态 公司还是商家
+//                        if (admin.getType() > 1) {
+//                            //商家 判断是否子账户
+//                            if (admin.getIsAdmined()) {
+//                                //商家自己
+//                                query.eq(TOrder::getAdminId, orderDto.getAdminId());
+//                            } else {
+//                                //商家 子账户
+//                                //登录账户为子账户 不查下级 只查对应机器的订单
+//                                TAdminEquipment adminEquipment = R.getDataIfSuccess(szwlFeign.getClientIdList(String.valueOf(admin.getParentId())));
+//                                if (adminEquipment.getType().equals("0")) {
+//                                    //全部机器
+//                                    TAdmin upAdmin = R.getDataIfSuccess(szwlFeign.getAdmin(String.valueOf(admin.getParentId())));
+//                                    query.eq(TOrder::getAdminId, upAdmin.getId());
+//                                } else {
+//                                    String equipmentIds = adminEquipment.getEquipmentIds();
+//                                    List<String> equipmentIdList = JSON.parseArray(equipmentIds, String.class);
+//                                    query.in(TOrder::getClientId, equipmentIdList);
+//                                }
+//                            }
+//                        }
+//                    }
+//                }
+//            }
+//            if (StringUtils.isNotEmpty(orderDto.getPayType())) {
+//                query.eq(TOrder::getFrpCode, orderDto.getPayType());
+//            }
+//            if (StringUtils.isNotEmpty(orderDto.getClientId())) {
+//                TEquipment equipment = R.getDataIfSuccess(szwlFeign.findEquipmentByClientId(orderDto.getClientId()));
+//                //判断机器是否属于这个登陆账号
+//                if (admin.getType() > 1) {
+//                    //商家
+//                    if (equipment.getAdminId().toString().equals(admin.getId().toString())) {
+//                        query.eq(TOrder::getEquipmentId, equipment.getId());
+//                    }
+//                } else {
+//                    query.eq(TOrder::getEquipmentId, equipment.getId());
+//                }
+//            }
+//            if (StringUtils.isNotEmpty(orderDto.getEquipmentId())) {
+//                query.eq(TOrder::getEquipmentId, orderDto.getEquipmentId());
+//            }
+//            if (StringUtils.isNotEmpty(orderDto.getStatus())) {
+//                query.eq(TOrder::getStatus, orderDto.getStatus());
+//            }
+//            if (StringUtils.isNotEmpty(orderDto.getDateType())) {
+//                if (orderDto.getDateType().equals("0")) {
+//                    //创建时间
+//                    if (begin != null && end != null) {
+//                        query.gt(TOrder::getCreateDate, begin);
+//                        query.lt(TOrder::getCreateDate, end);
+//                    }
+//                }
+//                if (orderDto.getDateType().equals("1")) {
+//                    //退款时间
+//                    if (begin != null && end != null) {
+//                        query.gt(TOrder::getRefundDate, begin);
+//                        query.lt(TOrder::getRefundDate, end);
+//                    }
+//                }
+//            }
+//            // 公司平台
+//            // 申泽平台管理员
+//            String companyType = orderDto.getCompanyType();
+//            if (admin.getId() == 2738) {
+//                companyType = "0";
+//            }
+//            // 七云平台管理员
+//            if (admin.getId() == 2739) {
+//                companyType = "1";
+//            }
+//            if (StringUtils.isNotEmpty(companyType)) {
+//                if (companyType.equals("0")) {
+//                    String finalCompanyType = companyType;
+//                    query.nested(q -> q.isNull(TOrder::getCompanyType).or()
+//                            .eq(TOrder::getCompanyType, finalCompanyType));
+//                } else {
+//                    query.eq(TOrder::getCompanyType, companyType);
+//                }
+//            }
+//            String machineType = orderDto.getMachineType();
+//            if (StringUtils.isNotEmpty(machineType)) {
+//                if (machineType.equals("0")) {
+//                    query.nested(q -> q.isNull(TOrder::getMachineType).or()
+//                            .eq(TOrder::getMachineType, machineType));
+//                } else {
+//                    query.eq(TOrder::getMachineType, machineType);
+//                }
+//            }
+//
+//            // 查询总数
+//            total = orderService.count(query);
+//            // 总页数
+//            int totalPages = (total + pageSize - 1) / pageSize;
+//            // 这里注意 有同学反应使用swagger 会导致各种问题,请直接用浏览器或者用postman
+//            response.setContentType("application/octet-stream; charset=UTF-8");
+//            response.setCharacterEncoding("utf-8");
+//            // 这里URLEncoder.encode可以防止中文乱码
+//            String fileName = URLEncoder.encode("订单记录-" + System.currentTimeMillis(), "UTF-8").replaceAll("\\+", "%20");
+//            response.setHeader("Content-disposition", "attachment;filename=" + fileName + ".xlsx");
+//            // 创建ExcelWriter对象
+//            ExcelWriter excelWriter = EasyExcel.write(response.getOutputStream(), NewOrderTarget.class).registerWriteHandler(new LongestMatchColumnWidthStyleStrategy()).build();
+//            // 创建 Sheet 对象
+//            WriteSheet writeSheet = EasyExcel.writerSheet(0, "订单").build();
+//            // 创建 CountDownLatch 对象
+//            CountDownLatch countDownLatch = new CountDownLatch(totalPages);
+//            // 创建线程池
+//            ExecutorService executorService = Executors.newFixedThreadPool(10);
+//            // 循环写入数据
+//            for (int i = 1; i <= totalPages; i++) {
+//                int page = i;
+//                executorService.submit(() -> {
+//                    try {
+//                        Page<TOrder> orderPage = new Page<>(page, pageSize);
+//                        Page<TOrder> pageList = orderService.page(orderPage, query);
+//                        List<TOrder> list = pageList.getRecords();
+//                        // 写入数据
+//                        List<NewOrderTarget> orderTargetList = orderService.exportOrderData(admin, list);
+//                        synchronized (excelWriter) {
+//                            excelWriter.write(orderTargetList, writeSheet);
+//                        }
+//                    } catch (Exception e) {
+//                        // 异常处理
+//                        e.printStackTrace();
+//                    } finally {
+//                        // 计数器减一
+//                        countDownLatch.countDown();
+//                    }
+//                });
+//            }
+//            // 等待所有线程执行完毕
+//            try {
+//                countDownLatch.await();
+//            } catch (InterruptedException e) {
+//                e.printStackTrace();
+//            }
+//            while (hasNextPage) {
+//                Page<TOrder> orderPage = new Page<>(pageNum, pageSize);
+//                Page<TOrder> page = orderService.page(orderPage, query);
+//                List<TOrder> list = page.getRecords();
+//                if (CollectionUtils.isEmpty(list)) {
+//                    hasNextPage = false;
+//                    break;
+//                }
+//                // 写入数据
+//                List<NewOrderTarget> orderTargetList = orderService.exportOrderData(admin, list);
+//                excelWriter.write(orderTargetList, EasyExcel.writerSheet("订单").build());
+//                // 更新起始位置
+//                pageNum++;
+//            }
+            // 关闭 ExcelWriter 对象
+//            excelWriter.finish();
+//
+//            // 关闭线程池
+//            executorService.shutdown();
+        }
+
+        //1,线下
+        if (orderDto.getType().equals("1")) {
+            try {
+                coinOrderService.dataExport(orderDto, begin, end, response);
+            } catch (Exception e) {
+                e.printStackTrace();
+            }
+        }
+    }
+
     @ApiOperation(value = "线上通过时间分组")
     @RequestMapping(value = "/getStatisticsByClientId", method = RequestMethod.GET, produces = "application/json;charset=UTF-8")
     @ResponseBody

+ 47 - 0
src/main/java/com/szwl/model/dto/OrderDto.java

@@ -0,0 +1,47 @@
+package com.szwl.model.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+@Data
+public class OrderDto {
+
+    @ApiModelProperty(value = "设备主键")
+    private String equipmentId;
+
+    @ApiModelProperty(value = "用户主键")
+    private String adminId;
+
+    @ApiModelProperty(value = "用户权限类型")
+    private String adminType;
+
+    @ApiModelProperty(value = "用户国内外类型")
+    private String type;
+
+    @ApiModelProperty(value = "订单状态")
+    private String status;
+
+    @ApiModelProperty(value = "用户名")
+    private String userName;
+
+    @ApiModelProperty(value = "支付类型")
+    private String payType;
+
+    @ApiModelProperty(value = "设备编号")
+    private String clientId;
+
+    @ApiModelProperty(value = "时间类型")
+    private String dateType;
+
+    @ApiModelProperty(value = "开始时间")
+    private String startDate;
+
+    @ApiModelProperty(value = "结束时间")
+    private String endDate;
+
+    @ApiModelProperty(value = "公司类型")
+    private String companyType;
+
+    @ApiModelProperty(value = "设备类型")
+    private String machineType;
+}

+ 86 - 0
src/main/java/com/szwl/model/excel/NewCoinOrderTarget.java

@@ -0,0 +1,86 @@
+package com.szwl.model.excel;
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.alibaba.excel.annotation.write.style.ColumnWidth;
+import com.alibaba.excel.annotation.write.style.ContentFontStyle;
+import com.alibaba.excel.annotation.write.style.HeadFontStyle;
+import com.alibaba.excel.annotation.write.style.HeadRowHeight;
+import lombok.EqualsAndHashCode;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+@Getter
+@Setter
+@EqualsAndHashCode
+@HeadFontStyle(fontHeightInPoints = 15)
+@HeadRowHeight(20)
+@ContentFontStyle(fontHeightInPoints = 13)
+public class NewCoinOrderTarget {
+
+
+    /**
+     * 订单编号
+     */
+    @ExcelProperty("Order number")
+    private String sn;
+
+    /**
+     * 商品名称
+     */
+    @ColumnWidth(20)
+    @ExcelProperty("Trade name")
+    private String productName;
+
+    /**
+     * 所属商家
+     */
+    @ColumnWidth(15)
+    @ExcelProperty("Affiliated merchant")
+    private String name;
+
+    /**
+     * 设备唯一码
+     */
+    @ColumnWidth(35)
+    @ExcelProperty("Machine code")
+    private String clientId;
+
+    /**
+     * 设备名称
+     */
+    @ColumnWidth(30)
+    @ExcelProperty("Machine name")
+    private String machineName;
+
+    /**
+     * 价格
+     */
+    @ColumnWidth(20)
+    @ExcelProperty("Order amount")
+    private BigDecimal price;
+
+    /**
+     * 支付方式
+     */
+    @ExcelProperty("Payment method")
+    private String frp_code;
+
+    /**
+     * 支付时间
+     */
+    @ColumnWidth(22)
+    @ExcelProperty("Payment time")
+    private Date payDate;
+
+    /**
+     * 状态
+     */
+    @ColumnWidth(20)
+    @ExcelProperty("Payment status")
+    private String status;
+
+
+}

+ 63 - 0
src/main/java/com/szwl/model/excel/NewOrderTarget.java

@@ -0,0 +1,63 @@
+package com.szwl.model.excel;
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.alibaba.excel.annotation.write.style.ColumnWidth;
+import com.alibaba.excel.annotation.write.style.ContentFontStyle;
+import com.alibaba.excel.annotation.write.style.HeadFontStyle;
+import com.alibaba.excel.annotation.write.style.HeadRowHeight;
+import lombok.EqualsAndHashCode;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.math.BigDecimal;
+
+@Getter
+@Setter
+@EqualsAndHashCode
+@HeadFontStyle(fontHeightInPoints = 15)
+@HeadRowHeight(20)
+@ContentFontStyle(fontHeightInPoints = 13)
+public class NewOrderTarget {
+
+    @ExcelProperty("订单编号")
+    private String sn;
+
+    @ColumnWidth(30)
+    @ExcelProperty("商品名称")
+    private String productName;
+
+    @ColumnWidth(15)
+    @ExcelProperty("价格")
+    private BigDecimal price;
+
+    @ColumnWidth(30)
+    @ExcelProperty("设备唯一码")
+    private String clientId;
+
+    @ColumnWidth(20)
+    @ExcelProperty("所属商家")
+    private String name;
+
+    @ColumnWidth(20)
+    @ExcelProperty("支付时间")
+    private String payDate;
+
+    @ColumnWidth(20)
+    @ExcelProperty("退款时间")
+    private String refundDate;
+
+    @ExcelProperty("状态")
+    private String status;
+
+    @ExcelProperty("支付方式")
+    private String frp_code;
+
+    @ExcelProperty("一级分账比例")
+    private String agencyProportion;
+
+    @ExcelProperty("二级分账比例")
+    private String merchantProportion;
+
+    @ExcelProperty("三级分账比例")
+    private String personageProportion;
+}

+ 12 - 0
src/main/java/com/szwl/service/TCoinOrderService.java

@@ -1,12 +1,15 @@
 package com.szwl.service;
 
 import com.szwl.model.bean.OrderDaoChuDTO;
+import com.szwl.model.dto.OrderDto;
 import com.szwl.model.entity.TAdmin;
 import com.szwl.model.entity.TCoinOrder;
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.szwl.model.excel.CoinOrderTarget;
 import com.szwl.model.query.OrderStatisticsDTO;
 
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
 import java.util.Date;
 import java.util.List;
 
@@ -25,4 +28,13 @@ public interface TCoinOrderService extends IService<TCoinOrder> {
     List<CoinOrderTarget> findByCoinOrder(TAdmin admin, List<TCoinOrder> list);
 
     List<OrderDaoChuDTO> orderDaoChu(String begin, String end, Long adminId, String clientId, String type, String companyType, long current, long size);
+
+    /**
+     * 导出国外订单
+     * @param orderDto
+     * @param begin
+     * @param end
+     * @param response
+     */
+    void dataExport(OrderDto orderDto, Date begin, Date end, HttpServletResponse response) throws IOException;
 }

+ 15 - 0
src/main/java/com/szwl/service/TOrderService.java

@@ -2,13 +2,17 @@ package com.szwl.service;
 
 import com.szwl.model.bean.ChartColumn;
 import com.szwl.model.bean.OrderDaoChuDTO;
+import com.szwl.model.dto.OrderDto;
 import com.szwl.model.entity.TAdmin;
 import com.szwl.model.entity.TOrder;
 import com.baomidou.mybatisplus.extension.service.IService;
+import com.szwl.model.excel.NewOrderTarget;
 import com.szwl.model.excel.OrderTarget;
 import com.szwl.model.query.OrderStatisticsDTO;
 import com.szwl.model.query.StatisticsParam;
 
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
 import java.text.ParseException;
 import java.util.Date;
 import java.util.List;
@@ -34,4 +38,15 @@ public interface TOrderService extends IService<TOrder> {
     List<OrderStatisticsDTO> findByTime(String clientId, Date startTime, Date endTime, Integer unit);
 
     String setMessage(Long id, String customerPhone);
+
+    List<NewOrderTarget> exportOrderData(TAdmin admin, List<TOrder> list);
+
+    /**
+     * 导出国内订单
+     * @param orderDto
+     * @param begin
+     * @param end
+     * @param response
+     */
+    void dataExport(OrderDto orderDto, Date begin, Date end, HttpServletResponse response) throws IOException;
 }

+ 255 - 6
src/main/java/com/szwl/service/impl/TCoinOrderServiceImpl.java

@@ -1,24 +1,44 @@
 package com.szwl.service.impl;
 
+import com.alibaba.excel.EasyExcel;
+import com.alibaba.excel.ExcelWriter;
+import com.alibaba.excel.write.metadata.WriteSheet;
+import com.alibaba.excel.write.style.column.LongestMatchColumnWidthStyleStrategy;
+import com.alibaba.fastjson.JSON;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.szwl.constant.ResponseCodesEnum;
 import com.szwl.feign.SzwlFeign;
 import com.szwl.model.bean.OrderDaoChuDTO;
 import com.szwl.model.bo.R;
-import com.szwl.model.entity.TAdmin;
-import com.szwl.model.entity.TCoinOrder;
+import com.szwl.model.bo.ResponseModel;
+import com.szwl.model.dto.OrderDto;
+import com.szwl.model.entity.*;
 import com.szwl.mapper.TCoinOrderMapper;
-import com.szwl.model.entity.TEquipment;
 import com.szwl.model.excel.CoinOrderTarget;
+import com.szwl.model.excel.NewCoinOrderTarget;
+import com.szwl.model.excel.NewOrderTarget;
 import com.szwl.model.query.OrderDaoChuParam;
 import com.szwl.model.query.OrderStatisticsDTO;
 import com.szwl.service.TCoinOrderService;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.redis.core.StringRedisTemplate;
+import org.springframework.data.redis.core.ValueOperations;
 import org.springframework.stereotype.Service;
 
 import javax.annotation.Resource;
-import java.util.ArrayList;
-import java.util.Date;
-import java.util.List;
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+import java.io.UnsupportedEncodingException;
+import java.net.URLEncoder;
+import java.util.*;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
 
 /**
  * <p>
@@ -28,6 +48,7 @@ import java.util.List;
  * @author wuhs
  * @since 2023-08-29
  */
+@Slf4j
 @Service
 public class TCoinOrderServiceImpl extends ServiceImpl<TCoinOrderMapper, TCoinOrder> implements TCoinOrderService {
     @Resource
@@ -87,6 +108,234 @@ public class TCoinOrderServiceImpl extends ServiceImpl<TCoinOrderMapper, TCoinOr
     }
 
     @Override
+    public void dataExport(OrderDto orderDto, Date begin, Date end, HttpServletResponse response) throws IOException {
+        TAdmin admin = R.getDataIfSuccess(szwlFeign.getAdmin(orderDto.getAdminId()));
+        LambdaQueryWrapper<TCoinOrder> query = Wrappers.lambdaQuery();
+        if (!orderDto.getUserName().equals("admin")) {
+            // 如果为账户
+            String userName = orderDto.getUserName();
+            if (admin.getType() > 2) {
+                userName = null;
+            }
+            if (StringUtils.isNotEmpty(userName)) {
+                TAdmin data = R.getDataIfSuccess(szwlFeign.getAdminByUsername(userName));
+                if (data == null || data.getId() == null) {
+                    log.error("用户名不存在:{}", userName);
+                    return;
+                }
+                query.eq(TCoinOrder::getAdminId, data.getId());
+            } else {
+                //adminType="all"时,代表查全部下级  子账户没有这个权限  公司人员默认查所有人
+                String adminId = orderDto.getAdminId();
+                String adminType = orderDto.getAdminType();
+                if (StringUtils.isNotEmpty(adminType)) {
+                    if (admin.getIsAdmined() && admin.getType() > 1) {
+                        if (admin.getType() > 1) {
+                            if (adminType.equals("all")) {
+                                //查找所有下级
+                                List<Long> admidIdList = R.getDataIfSuccess(szwlFeign.getAdminIdList(adminId));
+                                query.in(TCoinOrder::getAdminId, admidIdList);
+                            }
+                        }
+                    } else {
+                        if (admin.getType() > 1) {
+                            //登录账户为子账户 不查下级 只查对应机器的订单
+                            TAdminEquipment adminEquipment = R.getDataIfSuccess(szwlFeign.getClientIdList(String.valueOf(admin.getParentId())));
+                            if (adminEquipment.getType().equals("0")) {
+                                //全部机器
+                                TAdmin upAdmin = R.getDataIfSuccess(szwlFeign.getAdmin(String.valueOf(admin.getParentId())));
+                                query.eq(TCoinOrder::getAdminId, upAdmin.getId());
+                            } else {
+                                String equipmentIds = adminEquipment.getEquipmentIds();
+                                List<String> equipmentIdList = JSON.parseArray(equipmentIds, String.class);
+                                query.in(TCoinOrder::getClientId, equipmentIdList);
+                            }
+                        }
+                    }
+
+                } else {
+                    //判断当前账号状态 公司还是商家
+                    if (admin.getType() > 1) {
+                        //商家 判断是否子账户
+                        if (!admin.getIsAdmined()) {
+                            //商家自己
+//                        query.eq(TCoinOrder::getAdminId,adminId);
+//                            } else {
+                            //商家 子账户
+                            //登录账户为子账户 不查下级 只查对应机器的订单
+                            TAdminEquipment adminEquipment = R.getDataIfSuccess(szwlFeign.getClientIdList(String.valueOf(adminId)));
+                            if (adminEquipment != null) {
+                                if (adminEquipment.getType().equals("0")) {
+                                    //全部机器
+                                    TAdmin upAdmin = R.getDataIfSuccess(szwlFeign.getAdmin(String.valueOf(admin.getParentId())));
+                                    query.eq(TCoinOrder::getAdminId, upAdmin.getId());
+                                } else {
+                                    String equipmentIds = adminEquipment.getEquipmentIds();
+//                                    List<String> equipmentIdList = JSON.parseArray(equipmentIds, String.class);
+                                    List<String> equipmentIdList = Arrays.asList(equipmentIds.split(","));
+                                    query.in(TCoinOrder::getEquipmentId, equipmentIdList);
+                                }
+                                query.eq(TCoinOrder::getAdminId, admin.getParentId());
+                            }
+                        }
+                    }
+                }
+            }
+        }
+
+        if (StringUtils.isNotEmpty(orderDto.getPayType())) {
+            query.eq(TCoinOrder::getPayType, orderDto.getPayType());
+        }
+
+        if (StringUtils.isNotEmpty(orderDto.getClientId())) {
+            TEquipment equipment = R.getDataIfSuccess(szwlFeign.findEquipmentByClientId(orderDto.getClientId()));
+            //判断机器是否属于这个登陆账号
+            if (admin.getType() > 1) {
+                //商家
+                if (equipment.getAdminId().toString().equals(admin.getId().toString())) {
+                    query.eq(TCoinOrder::getEquipmentId, equipment.getId());
+                }
+            } else {
+                query.eq(TCoinOrder::getEquipmentId, equipment.getId());
+            }
+        }
+
+        if (StringUtils.isNotEmpty(orderDto.getEquipmentId())) {
+            query.eq(TCoinOrder::getEquipmentId, orderDto.getEquipmentId());
+        }
+
+        if (begin != null && end != null) {
+            query.gt(TCoinOrder::getPayDate, begin);
+            query.lt(TCoinOrder::getPayDate, end);
+        }
+        // 公司平台
+        // 申泽平台管理员
+        String companyType = orderDto.getCompanyType();
+        if (admin.getId() == 2738) {
+            companyType = "0";
+        }
+        // 七云平台管理员
+        if (admin.getId() == 2739) {
+            companyType = "1";
+        }
+        if (StringUtils.isNotEmpty(companyType)) {
+            if (companyType.equals("0")) {
+                String finalCompanyType = companyType;
+                query.nested(q -> q.isNull(TCoinOrder::getCompanyType).or()
+                        .eq(TCoinOrder::getCompanyType, finalCompanyType));
+            } else {
+                query.eq(TCoinOrder::getCompanyType, companyType);
+            }
+        }
+        String machineType = orderDto.getMachineType();
+        if (StringUtils.isNotEmpty(machineType)) {
+            if (machineType.equals("0")) {
+                query.nested(q -> q.isNull(TCoinOrder::getMachineType).or()
+                        .eq(TCoinOrder::getMachineType, machineType));
+            } else {
+                query.eq(TCoinOrder::getMachineType, machineType);
+            }
+        }
+        // 查询总数
+        int pageSize = 1000;
+        int total = count(query);
+        // 总页数
+        int totalPages = (total + pageSize - 1) / pageSize;
+        // 这里注意 有同学反应使用swagger 会导致各种问题,请直接用浏览器或者用postman
+        response.setContentType("application/octet-stream; charset=UTF-8");
+        response.setCharacterEncoding("utf-8");
+        // 这里URLEncoder.encode可以防止中文乱码
+        String fileName = URLEncoder.encode("Order Record-" + System.currentTimeMillis(), "UTF-8").replaceAll("\\+", "%20");
+        response.setHeader("Content-disposition", "attachment;filename=" + fileName + ".xlsx");
+        // 创建ExcelWriter对象
+        ExcelWriter excelWriter = EasyExcel.write(response.getOutputStream(), NewCoinOrderTarget.class).registerWriteHandler(new LongestMatchColumnWidthStyleStrategy()).build();
+        // 创建 Sheet 对象
+        WriteSheet writeSheet = EasyExcel.writerSheet(0, "Order").build();
+        // 创建 CountDownLatch 对象
+        CountDownLatch countDownLatch = new CountDownLatch(totalPages);
+        // 创建线程池
+        ExecutorService executorService = Executors.newFixedThreadPool(10);
+        // 循环写入数据
+        for (int i = 1; i <= totalPages; i++) {
+            int page = i;
+            executorService.submit(() -> {
+                try {
+                    Page<TCoinOrder> orderPage = new Page<>(page, pageSize);
+                    Page<TCoinOrder> pageList = page(orderPage, query);
+                    List<TCoinOrder> list = pageList.getRecords();
+                    // 写入数据
+                    List<NewCoinOrderTarget> coinOrderTargetList = exportCoinOrderData(admin, list);
+                    synchronized (excelWriter) {
+                        excelWriter.write(coinOrderTargetList, writeSheet);
+                    }
+                } catch (Exception e) {
+                    // 异常处理
+                    e.printStackTrace();
+                } finally {
+                    // 计数器减一
+                    countDownLatch.countDown();
+                }
+            });
+        }
+        // 等待所有线程执行完毕
+        try {
+            countDownLatch.await();
+        } catch (InterruptedException e) {
+            e.printStackTrace();
+        }
+        // 关闭 ExcelWriter 对象
+        excelWriter.finish();
+
+        // 关闭线程池
+        executorService.shutdown();
+    }
+
+    private List<NewCoinOrderTarget> exportCoinOrderData(TAdmin admin, List<TCoinOrder> coinOrders) {
+        ArrayList<NewCoinOrderTarget> list = new ArrayList<>();
+        Map<String, String> nameMap = new HashMap<>();
+        for (TCoinOrder coinOrder : coinOrders) {
+            NewCoinOrderTarget coinOrderTarget = new NewCoinOrderTarget();
+            coinOrderTarget.setSn(coinOrder.getSn());
+            coinOrderTarget.setProductName(coinOrder.getProductName());
+            coinOrderTarget.setClientId(coinOrder.getClientId());
+            String name = "";
+            name = nameMap.get(coinOrder.getClientId());
+            if (coinOrder.getEquipmentId() != null && StringUtils.isEmpty(name)) {
+                TEquipment equipment = R.getDataIfSuccess(szwlFeign.findById(String.valueOf(coinOrder.getEquipmentId())));
+                if (StringUtils.isNotEmpty(equipment.getName())) {
+                    name = equipment.getName();
+                } else {
+                    name = "No set name";
+                }
+                nameMap.put(coinOrder.getClientId(), name);
+            }
+            coinOrderTarget.setMachineName(name);
+            coinOrderTarget.setName(admin.getUsername());
+            coinOrderTarget.setPrice(coinOrder.getPrice());
+            coinOrderTarget.setPayDate(coinOrder.getCreateDate());
+            coinOrderTarget.setStatus("Payment success");
+            if (coinOrder.getPayType() == 0) {
+                coinOrderTarget.setFrp_code("No-Pay");
+            } else if (coinOrder.getPayType() == 1) {
+                coinOrderTarget.setFrp_code("Coin");
+            } else if (coinOrder.getPayType() == 2) {
+                coinOrderTarget.setFrp_code("Notes");
+            } else if (coinOrder.getPayType() == 3) {
+                coinOrderTarget.setFrp_code("Coin + Notes");
+            } else if (coinOrder.getPayType() == 4) {
+                coinOrderTarget.setFrp_code("Credit card");
+            } else if (coinOrder.getPayType() == 5) {
+                coinOrderTarget.setFrp_code("E-PAYMENT");
+            } else {
+                coinOrderTarget.setFrp_code("Other");
+            }
+            list.add(coinOrderTarget);
+        }
+        log.info("nameMap:{}", nameMap);
+        return list;
+    }
+
+    @Override
     public List<OrderStatisticsDTO> findTotalByTime(String clientId, Date date1, Date date2) {
         return tCoinOrderMapper.findTotalByTime( clientId,  date1,  date2);
     }

+ 281 - 1
src/main/java/com/szwl/service/impl/TOrderServiceImpl.java

@@ -1,6 +1,13 @@
 package com.szwl.service.impl;
 
-import com.alibaba.fastjson.JSONObject;
+import com.alibaba.excel.EasyExcel;
+import com.alibaba.excel.ExcelWriter;
+import com.alibaba.excel.write.metadata.WriteSheet;
+import com.alibaba.excel.write.style.column.LongestMatchColumnWidthStyleStrategy;
+import com.alibaba.fastjson.JSON;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.szwl.constant.ConfigConsts;
 import com.szwl.exception.MyException;
 import com.szwl.feign.SzwlFeign;
@@ -9,10 +16,13 @@ import com.szwl.model.bean.ChartColumn;
 import com.szwl.model.bean.OrderDaoChuDTO;
 import com.szwl.model.bo.ChartType;
 import com.szwl.model.bo.R;
+import com.szwl.model.dto.OrderDto;
 import com.szwl.model.entity.TAdmin;
+import com.szwl.model.entity.TAdminEquipment;
 import com.szwl.model.entity.TEquipment;
 import com.szwl.model.entity.TOrder;
 import com.szwl.mapper.TOrderMapper;
+import com.szwl.model.excel.NewOrderTarget;
 import com.szwl.model.excel.OrderTarget;
 import com.szwl.model.query.OrderDaoChuParam;
 import com.szwl.model.query.OrderStatisticsDTO;
@@ -27,11 +37,17 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
 import javax.annotation.Resource;
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+import java.net.URLEncoder;
 import java.text.ParseException;
 import java.text.SimpleDateFormat;
 import java.util.ArrayList;
 import java.util.Date;
 import java.util.List;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
 
 /**
  * <p>
@@ -273,6 +289,270 @@ public class TOrderServiceImpl extends ServiceImpl<TOrderMapper, TOrder> impleme
         return ConfigConsts.SUCCESS;
     }
 
+    @Override
+    public List<NewOrderTarget> exportOrderData(TAdmin admin, List<TOrder> list) {
+        List<NewOrderTarget> orderTargets = new ArrayList<>();
+        for (TOrder order : list) {
+            if(!order.getProductName().equals("优惠码")){
+                NewOrderTarget orderTarget = new NewOrderTarget();
+                orderTarget.setSn(order.getSn());
+                orderTarget.setProductName(order.getProductName());
+                if(order.getRefundAmount() != null) {
+                    orderTarget.setPrice(order.getPrice().subtract(order.getRefundAmount()).setScale(2));
+                } else {
+                    orderTarget.setPrice(order.getPrice());
+                }
+                orderTarget.setClientId(order.getClientId());
+                orderTarget.setName(admin.getUsername());
+                // 格式化时间
+                if(order.getPayDate()!=null) {
+                    String formatPayDate = DateUtils.formatDate(order.getPayDate(), DateUtils.PATTERN_yyyy_MM_dd_HH_mm_ss);
+                    orderTarget.setPayDate(formatPayDate);
+                }
+                if(order.getRefundDate()!=null) {
+                    String formatRefundDate = DateUtils.formatDate(order.getRefundDate(), DateUtils.PATTERN_yyyy_MM_dd_HH_mm_ss);
+                    orderTarget.setRefundDate(formatRefundDate);
+                }
+                Integer status = order.getStatus();
+                if (status == 0) {
+                    orderTarget.setStatus("未支付");
+                } else if (status == 1) {
+                    orderTarget.setStatus("已支付");
+                } else if (status == 3) {
+                    orderTarget.setStatus("已退款");
+                } else {
+                    orderTarget.setStatus(String.valueOf(status));
+                }
+
+                if (order.getAgencyProportion()!=null) {
+                    orderTarget.setAgencyProportion(String.valueOf(order.getAgencyProportion()));
+                }
+                if (order.getMerchantProportion()!=null) {
+                    orderTarget.setMerchantProportion(String.valueOf(order.getMerchantProportion()));
+                }
+                if (order.getPersonageProportion()!=null) {
+                    orderTarget.setPersonageProportion(String.valueOf(order.getPersonageProportion()));
+                }
+
+                if ("WEIXIN_NATIVE".equals(order.getFrpCode())) {
+                    orderTarget.setFrp_code("微信主扫支付");
+                } else if("ALIPAY_NATIVE".equals(order.getFrpCode())){
+                    orderTarget.setFrp_code("支付宝主扫支付");
+                }else if("WEIXIN_CARD".equals(order.getFrpCode())){
+                    orderTarget.setFrp_code("微信被扫支付");
+                }else if("ALIPAY_CARD".equals(order.getFrpCode())){
+                    orderTarget.setFrp_code("支付宝被扫支付");
+                }else {
+                    orderTarget.setFrp_code(order.getFrpCode());
+                }
+
+
+                if(StringUtils.isEmpty(orderTarget.getFrp_code())){
+                    orderTarget.setFrp_code(order.getFrpCode());
+                }
+                orderTargets.add(orderTarget);
+            }
+        }
+        return orderTargets;
+    }
+
+    @Override
+    public void dataExport(OrderDto orderDto, Date begin, Date end, HttpServletResponse response) throws IOException {
+        //判断当前账号状态
+        TAdmin admin = R.getDataIfSuccess(szwlFeign.getAdmin(orderDto.getAdminId()));
+        LambdaQueryWrapper<TOrder> query = Wrappers.lambdaQuery();
+        if (!orderDto.getUserName().equals("admin")) {
+            if (StringUtils.isNotEmpty(orderDto.getUserName())) {
+                TAdmin data = R.getDataIfSuccess(szwlFeign.getAdminByUsername(orderDto.getUserName()));
+                if (data == null || data.getId() == null) {
+                    return;
+                }
+                if (data.getIsAdmined()) {
+                    query.eq(TOrder::getAdminId, data.getId());
+                } else {
+                    if (data.getParentId() != 1) {
+                        query.eq(TOrder::getAdminId, data.getParentId());
+                        //查找子账户所管理的机器
+                        TAdminEquipment adminEquipment = R.getDataIfSuccess(szwlFeign.getClientIdList(orderDto.getAdminId()));
+                        if (!adminEquipment.getType().equals("0")) {
+                            List<String> list = R.getDataIfSuccess(szwlFeign.getClientIds(orderDto.getAdminId()));
+                            if (list == null || list.size() == 0) {
+                                return;
+                            }
+                            query.in(TOrder::getClientId, list);
+                        }
+                    }
+                }
+            } else {
+                //adminType="all"时,代表查全部下级  子账户没有这个权限  公司人员默认查所有人
+                if (StringUtils.isNotEmpty(orderDto.getAdminType())) {
+                    if (admin.getIsAdmined() && admin.getType() > 1) {
+                        if (admin.getType() > 1) {
+                            if (orderDto.getAdminType().equals("all")) {
+                                //查找所有下级
+                                List<Long> admidIdList = R.getDataIfSuccess(szwlFeign.getAdminIdList(orderDto.getAdminId()));
+                                query.in(TOrder::getAdminId, admidIdList);
+                            }
+                        }
+                    } else {
+                        if (admin.getType() > 1) {
+                            //登录账户为子账户 不查下级 只查对应机器的订单
+                            TAdminEquipment adminEquipment = R.getDataIfSuccess(szwlFeign.getClientIdList(String.valueOf(admin.getParentId())));
+                            if (adminEquipment.getType().equals("0")) {
+                                //全部机器
+                                TAdmin upAdmin = R.getDataIfSuccess(szwlFeign.getAdmin(String.valueOf(admin.getParentId())));
+                                query.eq(TOrder::getAdminId, upAdmin.getId());
+                            } else {
+                                String equipmentIds = adminEquipment.getEquipmentIds();
+                                List<String> equipmentIdList = JSON.parseArray(equipmentIds, String.class);
+                                query.in(TOrder::getClientId, equipmentIdList);
+                            }
+                        }
+                    }
+                } else {
+                    //判断当前账号状态 公司还是商家
+                    if (admin.getType() > 1) {
+                        //商家 判断是否子账户
+                        if (admin.getIsAdmined()) {
+                            //商家自己
+                            query.eq(TOrder::getAdminId, orderDto.getAdminId());
+                        } else {
+                            //商家 子账户
+                            //登录账户为子账户 不查下级 只查对应机器的订单
+                            TAdminEquipment adminEquipment = R.getDataIfSuccess(szwlFeign.getClientIdList(String.valueOf(admin.getParentId())));
+                            if (adminEquipment.getType().equals("0")) {
+                                //全部机器
+                                TAdmin upAdmin = R.getDataIfSuccess(szwlFeign.getAdmin(String.valueOf(admin.getParentId())));
+                                query.eq(TOrder::getAdminId, upAdmin.getId());
+                            } else {
+                                String equipmentIds = adminEquipment.getEquipmentIds();
+                                List<String> equipmentIdList = JSON.parseArray(equipmentIds, String.class);
+                                query.in(TOrder::getClientId, equipmentIdList);
+                            }
+                        }
+                    }
+                }
+            }
+        }
+        if (StringUtils.isNotEmpty(orderDto.getPayType())) {
+            query.eq(TOrder::getFrpCode, orderDto.getPayType());
+        }
+        if (StringUtils.isNotEmpty(orderDto.getClientId())) {
+            TEquipment equipment = R.getDataIfSuccess(szwlFeign.findEquipmentByClientId(orderDto.getClientId()));
+            //判断机器是否属于这个登陆账号
+            if (admin.getType() > 1) {
+                //商家
+                if (equipment.getAdminId().toString().equals(admin.getId().toString())) {
+                    query.eq(TOrder::getEquipmentId, equipment.getId());
+                }
+            } else {
+                query.eq(TOrder::getEquipmentId, equipment.getId());
+            }
+        }
+        if (StringUtils.isNotEmpty(orderDto.getEquipmentId())) {
+            query.eq(TOrder::getEquipmentId, orderDto.getEquipmentId());
+        }
+        if (StringUtils.isNotEmpty(orderDto.getStatus())) {
+            query.eq(TOrder::getStatus, orderDto.getStatus());
+        }
+        if (StringUtils.isNotEmpty(orderDto.getDateType())) {
+            if (orderDto.getDateType().equals("0")) {
+                //创建时间
+                if (begin != null && end != null) {
+                    query.gt(TOrder::getCreateDate, begin);
+                    query.lt(TOrder::getCreateDate, end);
+                }
+            }
+            if (orderDto.getDateType().equals("1")) {
+                //退款时间
+                if (begin != null && end != null) {
+                    query.gt(TOrder::getRefundDate, begin);
+                    query.lt(TOrder::getRefundDate, end);
+                }
+            }
+        }
+        // 公司平台
+        // 申泽平台管理员
+        String companyType = orderDto.getCompanyType();
+        if (admin.getId() == 2738) {
+            companyType = "0";
+        }
+        // 七云平台管理员
+        if (admin.getId() == 2739) {
+            companyType = "1";
+        }
+        if (StringUtils.isNotEmpty(companyType)) {
+            if (companyType.equals("0")) {
+                String finalCompanyType = companyType;
+                query.nested(q -> q.isNull(TOrder::getCompanyType).or()
+                        .eq(TOrder::getCompanyType, finalCompanyType));
+            } else {
+                query.eq(TOrder::getCompanyType, companyType);
+            }
+        }
+        String machineType = orderDto.getMachineType();
+        if (StringUtils.isNotEmpty(machineType)) {
+            if (machineType.equals("0")) {
+                query.nested(q -> q.isNull(TOrder::getMachineType).or()
+                        .eq(TOrder::getMachineType, machineType));
+            } else {
+                query.eq(TOrder::getMachineType, machineType);
+            }
+        }
+        // 查询总数
+        int pageSize = 1000;
+        int total = count(query);
+        // 总页数
+        int totalPages = (total + pageSize - 1) / pageSize;
+        // 这里注意 有同学反应使用swagger 会导致各种问题,请直接用浏览器或者用postman
+        response.setContentType("application/octet-stream; charset=UTF-8");
+        response.setCharacterEncoding("utf-8");
+        // 这里URLEncoder.encode可以防止中文乱码
+        String fileName = URLEncoder.encode("订单记录-" + System.currentTimeMillis(), "UTF-8").replaceAll("\\+", "%20");
+        response.setHeader("Content-disposition", "attachment;filename=" + fileName + ".xlsx");
+        // 创建ExcelWriter对象
+        ExcelWriter excelWriter = EasyExcel.write(response.getOutputStream(), NewOrderTarget.class).registerWriteHandler(new LongestMatchColumnWidthStyleStrategy()).build();
+        // 创建 Sheet 对象
+        WriteSheet writeSheet = EasyExcel.writerSheet(0, "订单").build();
+        // 创建 CountDownLatch 对象
+        CountDownLatch countDownLatch = new CountDownLatch(totalPages);
+        // 创建线程池
+        ExecutorService executorService = Executors.newFixedThreadPool(10);
+        // 循环写入数据
+        for (int i = 1; i <= totalPages; i++) {
+            int page = i;
+            executorService.submit(() -> {
+                try {
+                    Page<TOrder> orderPage = new Page<>(page, pageSize);
+                    Page<TOrder> pageList = page(orderPage, query);
+                    List<TOrder> list = pageList.getRecords();
+                    // 写入数据
+                    List<NewOrderTarget> orderTargetList = exportOrderData(admin, list);
+                    synchronized (excelWriter) {
+                        excelWriter.write(orderTargetList, writeSheet);
+                    }
+                } catch (Exception e) {
+                    // 异常处理
+                    e.printStackTrace();
+                } finally {
+                    // 计数器减一
+                    countDownLatch.countDown();
+                }
+            });
+        }
+        // 等待所有线程执行完毕
+        try {
+            countDownLatch.await();
+        } catch (InterruptedException e) {
+            e.printStackTrace();
+        }
+        // 关闭 ExcelWriter 对象
+        excelWriter.finish();
+
+        // 关闭线程池
+        executorService.shutdown();
+    }
+
     private String getSzMessage(String sn, String price, String payTime,String equipmentName,String clientId,String customerPhone) {
         String message = "";
         if(StringUtils.isNotEmpty(customerPhone)&&customerPhone.length()>3){