浏览代码

feat:“增加订单分析月统计和年统计功能"

soobin 9 月之前
父节点
当前提交
28774871dc
共有 26 个文件被更改,包括 1928 次插入42 次删除
  1. 21 0
      src/main/java/com/szwl/controller/OrderStatisticsMonthController.java
  2. 21 0
      src/main/java/com/szwl/controller/OrderStatisticsYearController.java
  3. 90 8
      src/main/java/com/szwl/controller/ScheduledService.java
  4. 75 29
      src/main/java/com/szwl/controller/TOrderController.java
  5. 8 0
      src/main/java/com/szwl/feign/SzwlFeign.java
  6. 16 0
      src/main/java/com/szwl/mapper/OrderStatisticsMonthMapper.java
  7. 16 0
      src/main/java/com/szwl/mapper/OrderStatisticsYearMapper.java
  8. 3 0
      src/main/java/com/szwl/mapper/TCoinOrderMapper.java
  9. 2 0
      src/main/java/com/szwl/mapper/TOrderMapper.java
  10. 25 0
      src/main/java/com/szwl/mapper/xml/OrderStatisticsMonthMapper.xml
  11. 25 0
      src/main/java/com/szwl/mapper/xml/OrderStatisticsYearMapper.xml
  12. 37 0
      src/main/java/com/szwl/mapper/xml/TCoinOrderMapper.xml
  13. 36 0
      src/main/java/com/szwl/mapper/xml/TOrderMapper.xml
  14. 62 0
      src/main/java/com/szwl/model/entity/OrderStatisticsMonth.java
  15. 62 0
      src/main/java/com/szwl/model/entity/OrderStatisticsYear.java
  16. 50 0
      src/main/java/com/szwl/model/excel/StatisticsAdminTarget.java
  17. 54 0
      src/main/java/com/szwl/model/excel/StatisticsClientIdTarget.java
  18. 3 0
      src/main/java/com/szwl/model/query/OrderDaoChuParam.java
  19. 15 0
      src/main/java/com/szwl/model/query/StatisticsParam.java
  20. 16 0
      src/main/java/com/szwl/service/OrderStatisticsMonthService.java
  21. 16 0
      src/main/java/com/szwl/service/OrderStatisticsYearService.java
  22. 44 1
      src/main/java/com/szwl/service/TOrderService.java
  23. 298 4
      src/main/java/com/szwl/service/es/EsTOrderService.java
  24. 20 0
      src/main/java/com/szwl/service/impl/OrderStatisticsMonthServiceImpl.java
  25. 20 0
      src/main/java/com/szwl/service/impl/OrderStatisticsYearServiceImpl.java
  26. 893 0
      src/main/java/com/szwl/service/impl/TOrderServiceImpl.java

+ 21 - 0
src/main/java/com/szwl/controller/OrderStatisticsMonthController.java

@@ -0,0 +1,21 @@
+package com.szwl.controller;
+
+
+import org.springframework.web.bind.annotation.RequestMapping;
+
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * <p>
+ * order统计表(统计月份) 前端控制器
+ * </p>
+ *
+ * @author wuhs
+ * @since 2024-11-12
+ */
+@RestController
+@RequestMapping("/orderStatisticsMonth")
+public class OrderStatisticsMonthController {
+
+}
+

+ 21 - 0
src/main/java/com/szwl/controller/OrderStatisticsYearController.java

@@ -0,0 +1,21 @@
+package com.szwl.controller;
+
+
+import org.springframework.web.bind.annotation.RequestMapping;
+
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * <p>
+ * order统计表(统计年份) 前端控制器
+ * </p>
+ *
+ * @author wuhs
+ * @since 2024-11-08
+ */
+@RestController
+@RequestMapping("/orderStatisticsYear")
+public class OrderStatisticsYearController {
+
+}
+

+ 90 - 8
src/main/java/com/szwl/controller/ScheduledService.java

@@ -1,6 +1,6 @@
 package com.szwl.controller;
 package com.szwl.controller;
 
 
-import com.szwl.service.TDepartmentService;
+import com.szwl.model.query.StatisticsParam;
 import com.szwl.service.TOrderTaskService;
 import com.szwl.service.TOrderTaskService;
 import com.szwl.service.TShandeMchService;
 import com.szwl.service.TShandeMchService;
 import com.szwl.service.es.EsTCoinOrderService;
 import com.szwl.service.es.EsTCoinOrderService;
@@ -14,7 +14,8 @@ import org.springframework.stereotype.Component;
 import java.net.InetAddress;
 import java.net.InetAddress;
 import java.net.UnknownHostException;
 import java.net.UnknownHostException;
 import java.text.ParseException;
 import java.text.ParseException;
-import java.util.Calendar;
+import java.time.LocalDate;
+import java.time.format.DateTimeFormatter;
 
 
 
 
 @Configuration //1.主要用于标记配置类,兼备Component的效果。
 @Configuration //1.主要用于标记配置类,兼备Component的效果。
@@ -114,11 +115,92 @@ public class ScheduledService {
         }
         }
 
 
     }
     }
-//    //每天凌晨统计/核对杉德支付的金额表
-//    @Scheduled(cron = "30 05 0 * * ?")
-//    public void shandejiesuan(){
-//        tShandeMchService.jiesuan();
-//    }
-//
+
+    // 凌晨一点,同步过去一天的月统计
+    @Scheduled(cron = "30 10 1 * * ?")
+    public void synMonthStatistics() {
+        // 参数
+        StatisticsParam param = new StatisticsParam();
+        // 获取昨天的时间
+        LocalDate yesterday = LocalDate.now().minusDays(1);
+
+        // 创建DateTimeFormatter对象,用于格式化成 "yyyy-MM"
+        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM");
+
+        // 格式化并输出昨天的日期
+        String statisticsDate = yesterday.format(formatter);
+        param.setStartDate(statisticsDate + "-01 00:00:00");
+        param.setEndDate(statisticsDate + "-31 23:59:59");
+        // 按月统计
+        param.setDateType("0");
+        try {
+            if(isDo()) {
+                // 同步国内,按商户统计
+                param.setIfForeign("0");
+                param.setPacketType("0");
+                esTOrderService.getSummaryStatistics(param);
+                // 同步国内,按设备统计
+                param.setPacketType("1");
+                esTOrderService.getSummaryStatistics(param);
+                // 同步国外,按商户统计
+                param.setIfForeign("1");
+                param.setPacketType("0");
+                esTOrderService.getSummaryStatistics(param);
+                // 同步国外,按设备统计
+                param.setPacketType("1");
+                esTOrderService.getSummaryStatistics(param);
+
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+
+    }
+
+    // 每天0点,同步年统计
+    @Scheduled(cron = "30 10 0 * * ?")
+    public void synYearStatistics() {
+        // 参数
+        StatisticsParam param = new StatisticsParam();
+        // 获取昨天的时间
+        LocalDate yesterday = LocalDate.now().minusDays(1);
+        String year = yesterday.format(DateTimeFormatter.ofPattern("yyyy"));
+        param.setStartDate(year + "-01-01 00:00:00");
+        param.setEndDate(year + "-12-31 23:59:59");
+        param.setDateType("1");
+        try {
+            if(isDo()) {
+                // 同步国内,按商户统计
+                param.setIfForeign("0");
+                param.setPacketType("0");
+                esTOrderService.getSummaryStatistics(param);
+                // 同步国内,按设备统计
+                param.setPacketType("1");
+                esTOrderService.getSummaryStatistics(param);
+                // 同步国外,按商户统计
+                param.setIfForeign("1");
+                param.setPacketType("0");
+                esTOrderService.getSummaryStatistics(param);
+                // 同步国外,按设备统计
+                param.setPacketType("1");
+                esTOrderService.getSummaryStatistics(param);
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+
+
+    private Boolean isDo() {
+        try {
+            String hostAddress = InetAddress.getLocalHost().getHostAddress();
+            // 弹性112.74.63.148服务器的私网ip
+            return hostAddress.equals("10.0.0.153");
+        } catch (UnknownHostException e) {
+            e.printStackTrace();
+        }
+        return false;
+    }
+
 
 
 }
 }

+ 75 - 29
src/main/java/com/szwl/controller/TOrderController.java

@@ -12,7 +12,6 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
-import com.szwl.common.aop.LogAnnotation;
 import com.szwl.constant.ResponseCodesEnum;
 import com.szwl.constant.ResponseCodesEnum;
 import com.szwl.exception.BizException;
 import com.szwl.exception.BizException;
 import com.szwl.feign.SzwlFeign;
 import com.szwl.feign.SzwlFeign;
@@ -24,10 +23,7 @@ import com.szwl.model.bo.ResponseModel;
 import com.szwl.model.bo.UserDetailBO;
 import com.szwl.model.bo.UserDetailBO;
 import com.szwl.model.dto.OrderDto;
 import com.szwl.model.dto.OrderDto;
 import com.szwl.model.entity.*;
 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.OrderStatisticsDTO;
 import com.szwl.model.query.OrderStatisticsDTO;
 import com.szwl.model.query.StatisticsParam;
 import com.szwl.model.query.StatisticsParam;
 import com.szwl.model.query.TOrderParam;
 import com.szwl.model.query.TOrderParam;
@@ -658,7 +654,6 @@ public class TOrderController {
 
 
         //  判断是否为外国
         //  判断是否为外国
         log.info("param:{}", param);
         log.info("param:{}", param);
-//        String adminId = param.getAdminId();
         TAdmin admin = R.getDataIfSuccess(szwlFeign.getAdmin(adminId));
         TAdmin admin = R.getDataIfSuccess(szwlFeign.getAdmin(adminId));
         if (admin.getType() < 2) {
         if (admin.getType() < 2) {
             // 如果是超管或公司人员
             // 如果是超管或公司人员
@@ -1022,6 +1017,14 @@ public class TOrderController {
         return R.ok(sellChartColumn);
         return R.ok(sellChartColumn);
     }
     }
 
 
+    @ApiOperation("订单汇总统计")
+    @PostMapping("/orderSummaryStatistics")
+    public ResponseModel<?> orderSummaryStatistics(@RequestBody StatisticsParam param) {
+        // 同步汇总数据到数据库
+        Page<OrderDaoChuDTO> page = esTOrderService.getSummaryStatistics(param);
+        return R.ok(page);
+    }
+
     @ApiOperation(value = "查询国内线上订单")
     @ApiOperation(value = "查询国内线上订单")
     @RequestMapping(value = "/findOrder", method = RequestMethod.GET, produces = "application/json;charset=UTF-8")
     @RequestMapping(value = "/findOrder", method = RequestMethod.GET, produces = "application/json;charset=UTF-8")
     @ResponseBody
     @ResponseBody
@@ -1219,16 +1222,8 @@ public class TOrderController {
                     if (area != null) {
                     if (area != null) {
                         orderDaoChuDTO.setAddress(area.getFullName());
                         orderDaoChuDTO.setAddress(area.getFullName());
                     }
                     }
-                    List<TEquipment> equipmentList = R.getDataIfSuccess(szwlFeign.listEquipment(adminId1));
-                    if (equipmentList != null && equipmentList.size() > 0) {
-                        orderDaoChuDTO.setEquipmentTotal(String.valueOf(equipmentList.size()));
-                    }
-                    //商户为单位
-                    ResponseModel<TAdmin> feignAdmin = szwlFeign.getAdmin(String.valueOf(admin.getParentId()));
-                    TAdmin parent = feignAdmin.getData();
-                    if (parent != null && parent.getId() != null) {
-                        orderDaoChuDTO.setLastUsername(parent.getUsername());
-                    }
+                    String equipmentTotal = R.getDataIfSuccess(szwlFeign.getEquipmentTotal(adminId1));
+                    orderDaoChuDTO.setEquipmentTotal(equipmentTotal);
                 } else {
                 } else {
                     //设备为单位
                     //设备为单位
                     ResponseModel<TEquipment> equipmentByClientId = szwlFeign.findEquipmentByClientId(String.valueOf(orderDaoChuDTO.getClientId()));
                     ResponseModel<TEquipment> equipmentByClientId = szwlFeign.findEquipmentByClientId(String.valueOf(orderDaoChuDTO.getClientId()));
@@ -1251,7 +1246,7 @@ public class TOrderController {
 
 
     @ApiOperation(value = "订单数据导出-导出")
     @ApiOperation(value = "订单数据导出-导出")
     @RequestMapping(value = "/onlineExport", method = RequestMethod.GET)
     @RequestMapping(value = "/onlineExport", method = RequestMethod.GET)
-    @LogAnnotation(module = "模块名称:订单", operator = "操作参数:导出订单数据")
+//    @LogAnnotation(module = "模块名称:订单", operator = "操作参数:导出订单数据")
     public Object onlineExport(HttpServletResponse response, String type, String clientId,
     public Object onlineExport(HttpServletResponse response, String type, String clientId,
                                String ifForeign, String userName, String startDate,
                                String ifForeign, String userName, String startDate,
                                String companyType, Long adminId,
                                String companyType, Long adminId,
@@ -1301,8 +1296,7 @@ public class TOrderController {
             }
             }
             for (OrderDaoChuDTO orderDaoChuDTO : orderDaoChuDTOList) {
             for (OrderDaoChuDTO orderDaoChuDTO : orderDaoChuDTOList) {
                 String adminId1 = orderDaoChuDTO.getAdminId().toString();
                 String adminId1 = orderDaoChuDTO.getAdminId().toString();
-                ResponseModel<TAdmin> admin1 = szwlFeign.getAdmin(adminId1);
-                TAdmin admin = admin1.getData();
+                TAdmin admin = R.getDataIfSuccess(szwlFeign.getAdminVo(adminId1));
                 if (admin == null) {
                 if (admin == null) {
                     continue;
                     continue;
                 }
                 }
@@ -1314,16 +1308,8 @@ public class TOrderController {
                     if (area != null) {
                     if (area != null) {
                         orderDaoChuDTO.setAddress(area.getFullName());
                         orderDaoChuDTO.setAddress(area.getFullName());
                     }
                     }
-                    List<TEquipment> equipmentList = R.getDataIfSuccess(szwlFeign.listEquipment(adminId1));
-                    if (equipmentList != null && !equipmentList.isEmpty()) {
-                        orderDaoChuDTO.setEquipmentTotal(String.valueOf(equipmentList.size()));
-                    }
-                    //商户为单位
-                    ResponseModel<TAdmin> feignAdmin = szwlFeign.getAdmin(String.valueOf(admin.getParentId()));
-                    TAdmin parent = feignAdmin.getData();
-                    if (parent != null && parent.getId() != null) {
-                        orderDaoChuDTO.setLastUsername(parent.getUsername());
-                    }
+                    String equipmentTotal = R.getDataIfSuccess(szwlFeign.getEquipmentTotal(adminId1));
+                    orderDaoChuDTO.setEquipmentTotal(equipmentTotal);
                 } else {
                 } else {
                     //设备为单位
                     //设备为单位
                     ResponseModel<TEquipment> equipmentByClientId = szwlFeign.findEquipmentByClientId(String.valueOf(orderDaoChuDTO.getClientId()));
                     ResponseModel<TEquipment> equipmentByClientId = szwlFeign.findEquipmentByClientId(String.valueOf(orderDaoChuDTO.getClientId()));
@@ -1866,5 +1852,65 @@ public class TOrderController {
         orderService.updateById(order);
         orderService.updateById(order);
         return R.ok("修改成功");
         return R.ok("修改成功");
     }
     }
+
+    @ApiOperation("订单分析")
+    @PostMapping("/orderAnalysis")
+    public ResponseModel<?> orderAnalysis(@RequestBody StatisticsParam param) {
+        Page<OrderDaoChuDTO> page;
+        if (StringUtils.isNotEmpty(param.getUsername())) {
+            TAdmin admin = R.getDataIfSuccess(szwlFeign.getAdminByUsername(param.getUsername()));
+            if (admin == null) {
+                return R.fail(ResponseCodesEnum.A0001, "商户不存在");
+            }
+            param.setAdminId(String.valueOf(admin.getId()));
+        }
+
+        // 如果是查月、年,就查统计数据表,如果是查今日昨日本周,就直接查订单数据表
+        if (StringUtils.isNotEmpty(param.getDateType()) && param.getDateType().equals("1")) {
+            // 按年统计
+            page = orderService.summaryStatisticsYear(param);
+        } else if(param.getDateType().equals("0")) {
+            // 按月统计
+            page = orderService.summaryStatisticsMonth(param);
+        } else {
+            // 按日、周统计
+            page = orderService.summaryStatistics(param);
+        }
+        return R.ok(page);
+    }
+
+    @ApiOperation("订单分析导出")
+    @PostMapping("/orderAnalysisExport")
+    public void orderAnalysisExport(HttpServletResponse response, @RequestBody StatisticsParam param) {
+
+        try {
+            // 如果是查月、年,就查统计数据表,如果是查今日昨日本周,就直接查订单数据表
+            if (StringUtils.isNotEmpty(param.getDateType()) && param.getDateType().equals("1")) {
+                // 按年统计
+                if (StringUtils.isNotEmpty(param.getPacketType()) && param.getPacketType().equals("0")) {
+                    orderService.statisticsYearExport(response, StatisticsAdminTarget.class, param);
+                } else {
+                    orderService.statisticsYearExport(response, StatisticsClientIdTarget.class, param);
+                }
+            } else if(param.getDateType().equals("0")) {
+                // 按月统计
+                if (StringUtils.isNotEmpty(param.getPacketType()) && param.getPacketType().equals("0")) {
+                    orderService.statisticsMonthExport(response, StatisticsAdminTarget.class, param);
+                } else {
+                    orderService.statisticsMonthExport(response, StatisticsClientIdTarget.class, param);
+                }
+            } else {
+                // 按日、周统计
+                if (StringUtils.isNotEmpty(param.getPacketType()) && param.getPacketType().equals("0")) {
+                    orderService.statisticsDayWeekExport(response, StatisticsAdminTarget.class, param);
+                } else {
+                    orderService.statisticsDayWeekExport(response, StatisticsClientIdTarget.class, param);
+                }
+
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
 }
 }
 
 

+ 8 - 0
src/main/java/com/szwl/feign/SzwlFeign.java

@@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.szwl.feign.bean.TAdminParam;
 import com.szwl.feign.bean.TAdminParam;
 import com.szwl.model.bo.ResponseModel;
 import com.szwl.model.bo.ResponseModel;
 import com.szwl.model.entity.*;
 import com.szwl.model.entity.*;
+import io.swagger.annotations.ApiOperation;
 import org.springframework.cloud.openfeign.FeignClient;
 import org.springframework.cloud.openfeign.FeignClient;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.PostMapping;
@@ -88,4 +89,11 @@ public interface SzwlFeign {
      */
      */
     @GetMapping("/tAdmin/validateApiKey")
     @GetMapping("/tAdmin/validateApiKey")
     ResponseModel<TAdmin> validateApiKey(@RequestParam String apiKey, @RequestParam Long adminId);
     ResponseModel<TAdmin> validateApiKey(@RequestParam String apiKey, @RequestParam Long adminId);
+
+    @GetMapping("/tAdmin/getAdminVo")
+    ResponseModel<TAdmin> getAdminVo(@RequestParam String adminId);
+
+    @ApiOperation("获取设备总数")
+    @GetMapping("/tEquipment/getEquipmentTotal")
+    ResponseModel<String> getEquipmentTotal(@RequestParam String adminId);
 }
 }

+ 16 - 0
src/main/java/com/szwl/mapper/OrderStatisticsMonthMapper.java

@@ -0,0 +1,16 @@
+package com.szwl.mapper;
+
+import com.szwl.model.entity.OrderStatisticsMonth;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ * <p>
+ * order统计表(统计月份) Mapper 接口
+ * </p>
+ *
+ * @author wuhs
+ * @since 2024-11-12
+ */
+public interface OrderStatisticsMonthMapper extends BaseMapper<OrderStatisticsMonth> {
+
+}

+ 16 - 0
src/main/java/com/szwl/mapper/OrderStatisticsYearMapper.java

@@ -0,0 +1,16 @@
+package com.szwl.mapper;
+
+import com.szwl.model.entity.OrderStatisticsYear;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ * <p>
+ * order统计表(统计年份) Mapper 接口
+ * </p>
+ *
+ * @author wuhs
+ * @since 2024-11-08
+ */
+public interface OrderStatisticsYearMapper extends BaseMapper<OrderStatisticsYear> {
+
+}

+ 3 - 0
src/main/java/com/szwl/mapper/TCoinOrderMapper.java

@@ -5,6 +5,7 @@ import com.szwl.model.entity.TCoinOrder;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.szwl.model.query.OrderDaoChuParam;
 import com.szwl.model.query.OrderDaoChuParam;
 import com.szwl.model.query.OrderStatisticsDTO;
 import com.szwl.model.query.OrderStatisticsDTO;
+import com.szwl.model.query.StatisticsParam;
 
 
 import java.util.Date;
 import java.util.Date;
 import java.util.List;
 import java.util.List;
@@ -22,4 +23,6 @@ public interface TCoinOrderMapper extends BaseMapper<TCoinOrder> {
     List<OrderDaoChuDTO> getOrderDaoCu(OrderDaoChuParam daoChuParam);
     List<OrderDaoChuDTO> getOrderDaoCu(OrderDaoChuParam daoChuParam);
 
 
     List<OrderStatisticsDTO> findTotalByTime(String clientId, Date startTime, Date endTime);
     List<OrderStatisticsDTO> findTotalByTime(String clientId, Date startTime, Date endTime);
+
+    List<OrderDaoChuDTO> summaryStatistics(StatisticsParam param);
 }
 }

+ 2 - 0
src/main/java/com/szwl/mapper/TOrderMapper.java

@@ -33,4 +33,6 @@ public interface TOrderMapper extends BaseMapper<TOrder> {
     public List<OrderDaoChuDTO> getOrderDaoCu(OrderDaoChuParam daoChuParam);
     public List<OrderDaoChuDTO> getOrderDaoCu(OrderDaoChuParam daoChuParam);
 
 
     List<OrderStatisticsDTO> findByTime(String clientId, Date startTime, Date endTime, Integer unit);
     List<OrderStatisticsDTO> findByTime(String clientId, Date startTime, Date endTime, Integer unit);
+
+    List<OrderDaoChuDTO> summaryStatistics(StatisticsParam param);
 }
 }

+ 25 - 0
src/main/java/com/szwl/mapper/xml/OrderStatisticsMonthMapper.xml

@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.szwl.mapper.OrderStatisticsMonthMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.szwl.model.entity.OrderStatisticsMonth">
+        <id column="id" property="id" />
+        <result column="admin_id" property="adminId" />
+        <result column="equipment_id" property="equipmentId" />
+        <result column="client_id" property="clientId" />
+        <result column="statistics_date" property="statisticsDate" />
+        <result column="sale_num" property="saleNum" />
+        <result column="order_num" property="orderNum" />
+        <result column="sale_price" property="salePrice" />
+        <result column="company_type" property="companyType" />
+        <result column="if_foreign" property="ifForeign" />
+        <result column="type" property="type" />
+    </resultMap>
+
+    <!-- 通用查询结果列 -->
+    <sql id="Base_Column_List">
+        id, admin_id, equipment_id, client_id, statistics_date, sale_num, order_num, sale_price, company_type, if_foreign, type
+    </sql>
+
+</mapper>

+ 25 - 0
src/main/java/com/szwl/mapper/xml/OrderStatisticsYearMapper.xml

@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.szwl.mapper.OrderStatisticsYearMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.szwl.model.entity.OrderStatisticsYear">
+        <id column="id" property="id" />
+        <result column="admin_id" property="adminId" />
+        <result column="equipment_id" property="equipmentId" />
+        <result column="client_id" property="clientId" />
+        <result column="statistics_date" property="statisticsDate" />
+        <result column="sale_num" property="saleNum" />
+        <result column="order_num" property="orderNum" />
+        <result column="sale_price" property="salePrice" />
+        <result column="company_type" property="companyType" />
+        <result column="if_foreign" property="ifForeign" />
+        <result column="type" property="type" />
+    </resultMap>
+
+    <!-- 通用查询结果列 -->
+    <sql id="Base_Column_List">
+        id, admin_id, equipment_id, client_id, statistics_date, sale_num, order_num, sale_price, company_type, if_foreign, type
+    </sql>
+
+</mapper>

+ 37 - 0
src/main/java/com/szwl/mapper/xml/TCoinOrderMapper.xml

@@ -105,4 +105,41 @@
         <![CDATA[ AND create_date <= STR_TO_DATE(CONCAT(#{endTime},' 23:59:59'),'%Y/%m/%d %H:%i:%s') ]]>
         <![CDATA[ AND create_date <= STR_TO_DATE(CONCAT(#{endTime},' 23:59:59'),'%Y/%m/%d %H:%i:%s') ]]>
         group by sTime
         group by sTime
     </select>
     </select>
+    <select id="summaryStatistics" resultType="com.szwl.model.bean.OrderDaoChuDTO" parameterType="com.szwl.model.query.StatisticsParam">
+        select
+        sum(price) AS priceTotal, admin_id AS adminId, client_id AS clientId
+        from  t_coin_order  where 1=1
+        <if test="clientId != null and clientId !=''">
+            and client_id = #{clientId}
+        </if>
+        <if test="adminId != null and adminId !=''">
+            and admin_id = #{adminId}
+        </if>
+        <if test="adminIds != null and !adminIds.isEmpty()">
+            and admin_id in
+            <foreach item="item" index="index" collection="adminIds" open="(" close=")" separator=",">
+                #{item}
+            </foreach>
+        </if>
+        <choose>
+            <when test="companyType != null and companyType !='' and companyType.equals(&quot;0&quot;)">
+                AND (company_type IS NULL OR company_type = '0')
+            </when>
+            <when test="companyType != null and companyType !='' and companyType.equals(&quot;1&quot;)">
+                AND company_type = '1'
+            </when>
+        </choose>
+        and status = 1
+        and create_date >= STR_TO_DATE(CONCAT(#{startDate},' 00:00:00'),'%Y-%m-%d %H:%i:%s')
+        <![CDATA[ and create_date <= STR_TO_DATE(CONCAT(#{endDate},' 23:59:59'),'%Y-%m-%d %H:%i:%s') ]]>
+        <if test="packetType != null and packetType !='' and packetType==0">
+            group by adminId
+        </if>
+        <if test="packetType != null and packetType !='' and packetType==1">
+            group by clientId
+        </if>
+        order by priceTotal desc
+        limit #{current} , #{size}
+    </select>
+
 </mapper>
 </mapper>

+ 36 - 0
src/main/java/com/szwl/mapper/xml/TOrderMapper.xml

@@ -407,5 +407,41 @@
         GROUP BY sTime
         GROUP BY sTime
         ORDER BY sTime
         ORDER BY sTime
     </select>
     </select>
+    <select id="summaryStatistics" resultType="com.szwl.model.bean.OrderDaoChuDTO" parameterType="com.szwl.model.query.StatisticsParam">
+        select
+        sum(price) AS priceTotal, admin_id AS adminId, client_id AS clientId
+        from  t_order  where 1=1
+        <if test="clientId != null and clientId !=''">
+            and client_id = #{clientId}
+        </if>
+        <if test="adminId != null and adminId !=''">
+            and admin_id = #{adminId}
+        </if>
+        <if test="adminIds != null and !adminIds.isEmpty()">
+            and admin_id in
+            <foreach item="item" index="index" collection="adminIds" open="(" close=")" separator=",">
+                #{item}
+            </foreach>
+        </if>
+        <choose>
+            <when test="companyType != null and companyType !='' and companyType.equals(&quot;0&quot;)">
+                AND (company_type IS NULL OR company_type = '0')
+            </when>
+            <when test="companyType != null and companyType !='' and companyType.equals(&quot;1&quot;)">
+                AND company_type = '1'
+            </when>
+        </choose>
+        and status = 1
+        and create_date >= STR_TO_DATE(CONCAT(#{startDate},' 00:00:00'),'%Y-%m-%d %H:%i:%s')
+        <![CDATA[ and create_date <= STR_TO_DATE(CONCAT(#{endDate},' 23:59:59'),'%Y-%m-%d %H:%i:%s') ]]>
+        <if test="packetType != null and packetType !='' and packetType==0">
+            group by adminId
+        </if>
+        <if test="packetType != null and packetType !='' and packetType==1">
+            group by clientId
+        </if>
+        order by priceTotal desc
+        limit #{current} , #{size}
+    </select>
 
 
 </mapper>
 </mapper>

+ 62 - 0
src/main/java/com/szwl/model/entity/OrderStatisticsMonth.java

@@ -0,0 +1,62 @@
+package com.szwl.model.entity;
+
+import java.math.BigDecimal;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import java.io.Serializable;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * <p>
+ * order统计表(统计月份)
+ * </p>
+ *
+ * @author wuhs
+ * @since 2024-11-12
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@ApiModel(value="OrderStatisticsMonth对象", description="order统计表(统计月份)")
+public class OrderStatisticsMonth implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty(value = "ID")
+    @TableId(value = "id", type = IdType.ASSIGN_ID)
+    private String id;
+
+    @ApiModelProperty(value = "商家id")
+    private Long adminId;
+
+    @ApiModelProperty(value = "设备id")
+    private Long equipmentId;
+
+    @ApiModelProperty(value = "设备编号")
+    private String clientId;
+
+    @ApiModelProperty(value = "统计月份")
+    private String statisticsDate;
+
+    @ApiModelProperty(value = "商品数")
+    private Integer saleNum;
+
+    @ApiModelProperty(value = "订单数")
+    private Integer orderNum;
+
+    @ApiModelProperty(value = "销售额")
+    private BigDecimal salePrice;
+
+    @ApiModelProperty(value = "公司平台,0:申泽,1:七云")
+    private String companyType;
+
+    @ApiModelProperty(value = "是否国外,0:国内,1:国外")
+    private String ifForeign;
+
+    @ApiModelProperty(value = "统计类型,0:按商户,1:按设备")
+    private String type;
+
+
+}

+ 62 - 0
src/main/java/com/szwl/model/entity/OrderStatisticsYear.java

@@ -0,0 +1,62 @@
+package com.szwl.model.entity;
+
+import java.math.BigDecimal;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import java.io.Serializable;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * <p>
+ * order统计表(统计年份)
+ * </p>
+ *
+ * @author wuhs
+ * @since 2024-11-08
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@ApiModel(value="OrderStatisticsYear对象", description="order统计表(统计年份)")
+public class OrderStatisticsYear implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty(value = "ID")
+    @TableId(value = "id", type = IdType.ASSIGN_ID)
+    private String id;
+
+    @ApiModelProperty(value = "商家id")
+    private Long adminId;
+
+    @ApiModelProperty(value = "设备id")
+    private Long equipmentId;
+
+    @ApiModelProperty(value = "设备编号")
+    private String clientId;
+
+    @ApiModelProperty(value = "统计日期")
+    private String statisticsDate;
+
+    @ApiModelProperty(value = "商品数")
+    private Integer saleNum;
+
+    @ApiModelProperty(value = "订单数")
+    private Integer orderNum;
+
+    @ApiModelProperty(value = "销售额")
+    private BigDecimal salePrice;
+
+    @ApiModelProperty(value = "公司平台,0:申泽,1:七云")
+    private String companyType;
+
+    @ApiModelProperty(value = "是否国外,0:国内,1:国外")
+    private String ifForeign;
+
+    @ApiModelProperty(value = "统计类型,0:按商户,1:按设备")
+    private String type;
+
+
+}

+ 50 - 0
src/main/java/com/szwl/model/excel/StatisticsAdminTarget.java

@@ -0,0 +1,50 @@
+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 = 14)
+@HeadRowHeight(20)
+@ContentFontStyle(fontHeightInPoints = 12)
+public class StatisticsAdminTarget {
+
+    @ColumnWidth(30)
+    @ExcelProperty("账号")
+    private String username;
+
+    @ColumnWidth(30)
+    @ExcelProperty("商家")
+    private String name;
+
+    @ColumnWidth(30)
+    @ExcelProperty("电话")
+    private String phone;
+
+    @ColumnWidth(30)
+    @ExcelProperty("地址")
+    private String address;
+
+    @ColumnWidth(30)
+    @ExcelProperty("机器总数")
+    private String equipmentTotal;
+
+    @ColumnWidth(30)
+    @ExcelProperty("销售量")
+    private Integer salesVolume;
+
+    @ColumnWidth(30)
+    @ExcelProperty("销售总金额")
+    private BigDecimal priceTotal;
+
+}

+ 54 - 0
src/main/java/com/szwl/model/excel/StatisticsClientIdTarget.java

@@ -0,0 +1,54 @@
+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 = 14)
+@HeadRowHeight(20)
+@ContentFontStyle(fontHeightInPoints = 12)
+public class StatisticsClientIdTarget {
+
+    @ColumnWidth(25)
+    @ExcelProperty("账号")
+    private String username;
+
+    @ColumnWidth(30)
+    @ExcelProperty("商家")
+    private String name;
+
+    @ColumnWidth(30)
+    @ExcelProperty("电话")
+    private String phone;
+
+    @ColumnWidth(25)
+    @ExcelProperty("地址")
+    private String address;
+
+    @ColumnWidth(30)
+    @ExcelProperty("设备编号")
+    private String clientId;
+
+    @ColumnWidth(20)
+    @ExcelProperty("机型")
+    private String equipmentType;
+
+    @ColumnWidth(25)
+    @ExcelProperty("销售量")
+    private Integer salesVolume;
+
+    @ColumnWidth(30)
+    @ExcelProperty("销售总金额")
+    private BigDecimal priceTotal;
+
+}

+ 3 - 0
src/main/java/com/szwl/model/query/OrderDaoChuParam.java

@@ -37,4 +37,7 @@ public class OrderDaoChuParam {
     @ApiModelProperty(value = "设备类型,0:棉花糖,1,爆米花")
     @ApiModelProperty(value = "设备类型,0:棉花糖,1,爆米花")
     private String machineType;
     private String machineType;
 
 
+    @ApiModelProperty("下级账户")
+    private List<Long> adminList;
+
 }
 }

+ 15 - 0
src/main/java/com/szwl/model/query/StatisticsParam.java

@@ -73,4 +73,19 @@ public class StatisticsParam {
 
 
     @ApiModelProperty(value = "设备类型,0:棉花糖,1,爆米花")
     @ApiModelProperty(value = "设备类型,0:棉花糖,1,爆米花")
     private String machineType;
     private String machineType;
+
+    @ApiModelProperty(value = "类型,0:超管,1,公司人员")
+    private Integer type;
+
+    @ApiModelProperty("分组类型, 0:按商户分组, 1:按设备分组")
+    private String packetType;
+
+    @ApiModelProperty("日期统计类型, 0:按月统计, 1:按年统计, 2:按日、周统计")
+    private String dateType;
+
+    @ApiModelProperty("页数")
+    private int current = 1;
+
+    @ApiModelProperty("每页多少条数据,默认10条")
+    private int size = 10;
 }
 }

+ 16 - 0
src/main/java/com/szwl/service/OrderStatisticsMonthService.java

@@ -0,0 +1,16 @@
+package com.szwl.service;
+
+import com.szwl.model.entity.OrderStatisticsMonth;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * <p>
+ * order统计表(统计月份) 服务类
+ * </p>
+ *
+ * @author wuhs
+ * @since 2024-11-12
+ */
+public interface OrderStatisticsMonthService extends IService<OrderStatisticsMonth> {
+
+}

+ 16 - 0
src/main/java/com/szwl/service/OrderStatisticsYearService.java

@@ -0,0 +1,16 @@
+package com.szwl.service;
+
+import com.szwl.model.entity.OrderStatisticsYear;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * <p>
+ * order统计表(统计年份) 服务类
+ * </p>
+ *
+ * @author wuhs
+ * @since 2024-11-08
+ */
+public interface OrderStatisticsYearService extends IService<OrderStatisticsYear> {
+
+}

+ 44 - 1
src/main/java/com/szwl/service/TOrderService.java

@@ -1,11 +1,12 @@
 package com.szwl.service;
 package com.szwl.service;
 
 
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.IService;
 import com.szwl.model.bean.ChartColumn;
 import com.szwl.model.bean.ChartColumn;
 import com.szwl.model.bean.OrderDaoChuDTO;
 import com.szwl.model.bean.OrderDaoChuDTO;
 import com.szwl.model.dto.OrderDto;
 import com.szwl.model.dto.OrderDto;
 import com.szwl.model.entity.TAdmin;
 import com.szwl.model.entity.TAdmin;
 import com.szwl.model.entity.TOrder;
 import com.szwl.model.entity.TOrder;
-import com.baomidou.mybatisplus.extension.service.IService;
 import com.szwl.model.excel.NewOrderTarget;
 import com.szwl.model.excel.NewOrderTarget;
 import com.szwl.model.excel.OrderTarget;
 import com.szwl.model.excel.OrderTarget;
 import com.szwl.model.query.OrderStatisticsDTO;
 import com.szwl.model.query.OrderStatisticsDTO;
@@ -49,4 +50,46 @@ public interface TOrderService extends IService<TOrder> {
      * @param response
      * @param response
      */
      */
     void dataExport(OrderDto orderDto, Date begin, Date end, HttpServletResponse response) throws IOException;
     void dataExport(OrderDto orderDto, Date begin, Date end, HttpServletResponse response) throws IOException;
+
+    /**
+     * 订单汇总统计,按月
+     * @param param
+     * @return
+     */
+    Page<OrderDaoChuDTO> summaryStatisticsMonth(StatisticsParam param);
+
+    /**
+     * 订单汇总统计,按年
+     * @param param
+     * @return
+     */
+    Page<OrderDaoChuDTO> summaryStatisticsYear(StatisticsParam param);
+
+    /**
+     * 订单汇总统计,按日、周
+     * @param param
+     * @return
+     */
+    Page<OrderDaoChuDTO> summaryStatistics(StatisticsParam param);
+
+    /**
+     * 导出年汇总统计
+     * @param response
+     * @param param
+     */
+    <T> void statisticsYearExport(HttpServletResponse response, Class<T> clazz, StatisticsParam param) throws IOException;
+
+    /**
+     * 导出月汇总统计
+     * @param response
+     * @param param
+     */
+    <T> void statisticsMonthExport(HttpServletResponse response, Class<T> clazz, StatisticsParam param) throws IOException;
+
+    /**
+     * 导出日、周汇总统计
+     * @param response
+     * @param param
+     */
+    <T> void statisticsDayWeekExport(HttpServletResponse response, Class<T> clazz, StatisticsParam param) throws IOException;
 }
 }

+ 298 - 4
src/main/java/com/szwl/service/es/EsTOrderService.java

@@ -2,19 +2,25 @@ package com.szwl.service.es;
 
 
 import cn.com.crbank.ommo.esclient.EsBaseService;
 import cn.com.crbank.ommo.esclient.EsBaseService;
 import cn.com.crbank.ommo.exception.MyException;
 import cn.com.crbank.ommo.exception.MyException;
+import cn.hutool.core.util.RandomUtil;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.szwl.feign.SzwlFeign;
 import com.szwl.model.bean.ChartBean;
 import com.szwl.model.bean.ChartBean;
 import com.szwl.model.bean.ChartColumn;
 import com.szwl.model.bean.ChartColumn;
+import com.szwl.model.bean.OrderDaoChuDTO;
 import com.szwl.model.bo.ChartType;
 import com.szwl.model.bo.ChartType;
-import com.szwl.model.entity.TOrder;
+import com.szwl.model.bo.R;
+import com.szwl.model.entity.*;
 import com.szwl.model.query.StatisticsParam;
 import com.szwl.model.query.StatisticsParam;
 import com.szwl.model.query.TCoinOrderParam;
 import com.szwl.model.query.TCoinOrderParam;
 import com.szwl.model.query.TEquipmentParam;
 import com.szwl.model.query.TEquipmentParam;
 import com.szwl.model.query.TOrderParam;
 import com.szwl.model.query.TOrderParam;
 import com.szwl.model.utils.DateUtils;
 import com.szwl.model.utils.DateUtils;
+import com.szwl.service.OrderStatisticsMonthService;
+import com.szwl.service.OrderStatisticsYearService;
 import com.szwl.service.TOrderService;
 import com.szwl.service.TOrderService;
 import lombok.extern.slf4j.Slf4j;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.collections4.CollectionUtils;
 import org.apache.commons.collections4.CollectionUtils;
@@ -25,12 +31,13 @@ import org.elasticsearch.client.RequestOptions;
 import org.elasticsearch.client.indices.GetIndexRequest;
 import org.elasticsearch.client.indices.GetIndexRequest;
 import org.elasticsearch.index.query.BoolQueryBuilder;
 import org.elasticsearch.index.query.BoolQueryBuilder;
 import org.elasticsearch.index.query.QueryBuilders;
 import org.elasticsearch.index.query.QueryBuilders;
-import org.elasticsearch.search.aggregations.Aggregation;
-import org.elasticsearch.search.aggregations.AggregationBuilder;
-import org.elasticsearch.search.aggregations.AggregationBuilders;
+import org.elasticsearch.search.aggregations.*;
 import org.elasticsearch.search.aggregations.bucket.histogram.DateHistogramInterval;
 import org.elasticsearch.search.aggregations.bucket.histogram.DateHistogramInterval;
 import org.elasticsearch.search.aggregations.bucket.histogram.Histogram;
 import org.elasticsearch.search.aggregations.bucket.histogram.Histogram;
+import org.elasticsearch.search.aggregations.bucket.terms.Terms;
+import org.elasticsearch.search.aggregations.bucket.terms.TermsAggregationBuilder;
 import org.elasticsearch.search.aggregations.metrics.ParsedSum;
 import org.elasticsearch.search.aggregations.metrics.ParsedSum;
+import org.elasticsearch.search.aggregations.metrics.Sum;
 import org.elasticsearch.search.aggregations.metrics.SumAggregationBuilder;
 import org.elasticsearch.search.aggregations.metrics.SumAggregationBuilder;
 import org.elasticsearch.search.builder.SearchSourceBuilder;
 import org.elasticsearch.search.builder.SearchSourceBuilder;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -57,6 +64,15 @@ public class EsTOrderService extends EsBaseService<TOrder, TOrderParam> {
     @Autowired
     @Autowired
     EsTCoinOrderService esTCoinOrderService;
     EsTCoinOrderService esTCoinOrderService;
 
 
+    @Autowired
+    SzwlFeign szwlFeign;
+
+    @Autowired
+    OrderStatisticsMonthService orderStatisticsMonthService;
+
+    @Autowired
+    OrderStatisticsYearService orderStatisticsYearService;
+
     @Override
     @Override
     public String getTableName() {
     public String getTableName() {
         return "es_t_order";
         return "es_t_order";
@@ -595,4 +611,282 @@ public class EsTOrderService extends EsBaseService<TOrder, TOrderParam> {
 //            }
 //            }
 //        }
 //        }
     }
     }
+
+
+    /**
+     * 同步汇总统计到数据库
+     * @param param 参数
+     * @return
+     */
+    public Page<OrderDaoChuDTO> getSummaryStatistics(StatisticsParam param) {
+        Page<OrderDaoChuDTO> page = new Page<>(param.getCurrent(), param.getSize(), true);
+        String statisticsDate;
+        if (StringUtils.isNotEmpty(param.getDateType()) && param.getDateType().equals("1")) {
+            // 按年统计
+            statisticsDate = param.getStartDate().substring(0, 4);
+        } else {
+            statisticsDate = param.getStartDate().substring(0, 7);
+        }
+        try {
+            // 仅为名称,用以获取返回结果
+            String aggregationResultName = "aggregationResult";
+            // 按商户或者按设备分组查询
+            String field = "adminId";
+            // 仅为名称,用以获取返回结果
+            String aggNameSalePrice = "salePrice";
+            // 仅为名称,用以获取返回结果
+            String aggNameTotal = "total";
+            // 仅为名称,用以获取返回结果
+            String aggNameSaleNum = "saleNum";
+
+            // 创建布尔查询
+            BoolQueryBuilder boolQuery = QueryBuilders.boolQuery()
+                    .must(QueryBuilders.rangeQuery("payDate")
+                            .from(param.getStartDate())
+                            .to(param.getEndDate())
+                            .format("yyyy-MM-dd HH:mm:ss"))
+                    .must(QueryBuilders.termQuery("status", 1));
+            if(StringUtils.isNotEmpty(param.getPacketType()) && param.getPacketType().equals("1")) {
+                // 按设备分组
+                field = "clientId.keyword";
+            }
+            int size = param.getCurrent() * param.getSize();
+            // 创建聚合:按 clientId 进行分组
+            TermsAggregationBuilder aggregation = AggregationBuilders
+                    .terms(aggregationResultName)
+                    .field(field)
+                    .size(size)
+                    .order(BucketOrder.aggregation(aggNameSalePrice,false))
+                    .subAggregation(AggregationBuilders.sum(aggNameSalePrice).field("price"))
+                    .subAggregation(AggregationBuilders.sum(aggNameSaleNum).field("productNumber"));
+
+            // 创建总数聚合
+            SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder()
+                    .query(boolQuery)
+                    .aggregation(aggregation)
+                    .size(0);
+
+            //  cardinality 聚合
+            searchSourceBuilder.aggregation(AggregationBuilders.cardinality(aggNameTotal).field(field));
+
+            // 获取表名
+            String tableName = getTableName();
+            if(StringUtils.isNotEmpty(param.getIfForeign()) && param.getIfForeign().equals("1")) {
+                tableName = esTCoinOrderService.getTableName();
+            }
+
+            // 创建请求
+            SearchRequest searchRequest = new SearchRequest(tableName).source(searchSourceBuilder);
+            log.debug("sourceBuilder:{}", searchSourceBuilder);
+
+            // 执行查询
+            SearchResponse searchResponse = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
+
+            // 解析结果
+            Aggregations aggregations = searchResponse.getAggregations();
+            Terms aggregationResult = aggregations.get(aggregationResultName);
+            // 修改集合
+            List<OrderStatisticsYear> updateYearList = new ArrayList<>();
+            List<OrderStatisticsMonth> updateMonthList = new ArrayList<>();
+            // 插入集合
+            List<OrderStatisticsYear> insertYearList = new ArrayList<>();
+            List<OrderStatisticsMonth> insertMonthList = new ArrayList<>();
+            for (Terms.Bucket bucket : aggregationResult.getBuckets()) {
+                String key = bucket.getKeyAsString();
+                Sum salesSum = bucket.getAggregations().get(aggNameSalePrice);
+                double priceTotal = salesSum.getValue();
+                long docCount = bucket.getDocCount();
+                Sum saleNumSum = bucket.getAggregations().get(aggNameSaleNum);
+                int saleNum = (int)saleNumSum.getValue();
+                if (priceTotal == 0) {
+                    continue;
+                }
+                if (StringUtils.isNotEmpty(param.getDateType()) && param.getDateType().equals("1")) {
+                    // 按年统计
+
+                    OrderStatisticsYear orderStatistics = new OrderStatisticsYear();
+                    orderStatistics.setId(RandomUtil.randomNumbers(32));
+                    orderStatistics.setIfForeign(param.getIfForeign());
+                    orderStatistics.setType(param.getPacketType());
+                    if (StringUtils.isNotEmpty(param.getPacketType()) && param.getPacketType().equals("1")) {
+                        TEquipment equipment = R.getDataIfSuccess(szwlFeign.findEquipmentByClientId(key));
+                        if (equipment == null) {
+                            continue;
+                        }
+                        TAdmin admin = R.getDataIfSuccess(szwlFeign.getAdminVo(String.valueOf(equipment.getAdminId())));
+                        if (admin == null) {
+                            continue;
+                        }
+                        // 先查询是否已有数据
+                        LambdaQueryWrapper<OrderStatisticsYear> query = Wrappers.lambdaQuery();
+                        query.eq(OrderStatisticsYear::getAdminId, equipment.getAdminId());
+                        query.eq(OrderStatisticsYear::getEquipmentId, equipment.getId());
+                        query.eq(OrderStatisticsYear::getStatisticsDate, statisticsDate);
+                        query.eq(OrderStatisticsYear::getType, param.getPacketType());
+                        query.eq(OrderStatisticsYear::getIfForeign, param.getIfForeign());
+                        OrderStatisticsYear statisticsYear = orderStatisticsYearService.getOne(query);
+                        if(statisticsYear != null){
+                            // 金额是否有变化,有就更新,没有就不更新
+                            BigDecimal newSalePrice = new BigDecimal(priceTotal).setScale(2, RoundingMode.HALF_UP);
+                            if (!statisticsYear.getSalePrice().equals(newSalePrice)) {
+                                continue;
+                            }
+                            // 更新数据
+                            statisticsYear.setSaleNum(saleNum);
+                            statisticsYear.setSalePrice(newSalePrice);
+                            statisticsYear.setOrderNum(Long.valueOf(docCount).intValue());
+                            updateYearList.add(statisticsYear);
+                            continue;
+                        }
+                        // 没有的话就插入数据
+                        orderStatistics.setSalePrice(new BigDecimal(priceTotal).setScale(2, RoundingMode.HALF_UP));
+                        orderStatistics.setAdminId(admin.getId());
+                        orderStatistics.setEquipmentId(equipment.getId());
+                        orderStatistics.setClientId(key);
+                        orderStatistics.setSaleNum(saleNum);
+                        orderStatistics.setOrderNum(Long.valueOf(docCount).intValue());
+                        orderStatistics.setCompanyType(admin.getCompanyType());
+                        orderStatistics.setStatisticsDate(statisticsDate);
+                        insertYearList.add(orderStatistics);
+                    } else {
+                        // 按商户分组
+                        TAdmin admin = R.getDataIfSuccess(szwlFeign.getAdminVo(key));
+                        if (admin == null) {
+                            continue;
+                        }
+                        // 先查询是否已有数据
+                        LambdaQueryWrapper<OrderStatisticsYear> query = Wrappers.lambdaQuery();
+                        query.eq(OrderStatisticsYear::getAdminId, admin.getId());
+                        query.eq(OrderStatisticsYear::getStatisticsDate, statisticsDate);
+                        query.eq(OrderStatisticsYear::getType, param.getPacketType());
+                        query.eq(OrderStatisticsYear::getIfForeign, param.getIfForeign());
+                        OrderStatisticsYear statisticsYear = orderStatisticsYearService.getOne(query);
+                        if(statisticsYear != null){
+                            // 金额是否有变化,有就更新,没有就不更新
+                            BigDecimal newSalePrice = new BigDecimal(priceTotal).setScale(2, RoundingMode.HALF_UP);
+                            if (!statisticsYear.getSalePrice().equals(newSalePrice)) {
+                                continue;
+                            }
+                            // 更新数据
+                            statisticsYear.setSaleNum(saleNum);
+                            statisticsYear.setSalePrice(new BigDecimal(priceTotal).setScale(2, RoundingMode.HALF_UP));
+                            statisticsYear.setOrderNum(Long.valueOf(docCount).intValue());
+                            updateYearList.add(statisticsYear);
+                            continue;
+                        }
+                        orderStatistics.setSalePrice(new BigDecimal(priceTotal).setScale(2, RoundingMode.HALF_UP));
+                        orderStatistics.setAdminId(admin.getId());
+                        orderStatistics.setSaleNum(saleNum);
+                        orderStatistics.setOrderNum(Long.valueOf(docCount).intValue());
+                        orderStatistics.setCompanyType(admin.getCompanyType());
+                        orderStatistics.setStatisticsDate(statisticsDate);
+                        insertYearList.add(orderStatistics);
+
+                    }
+                } else {
+                    OrderStatisticsMonth orderStatistics = new OrderStatisticsMonth();
+                    orderStatistics.setId(RandomUtil.randomNumbers(32));
+                    orderStatistics.setIfForeign(param.getIfForeign());
+                    orderStatistics.setType(param.getPacketType());
+                    if (StringUtils.isNotEmpty(param.getPacketType()) && param.getPacketType().equals("1")) {
+                        TEquipment equipment = R.getDataIfSuccess(szwlFeign.findEquipmentByClientId(key));
+                        if (equipment == null) {
+                            continue;
+                        }
+                        TAdmin admin = R.getDataIfSuccess(szwlFeign.getAdminVo(String.valueOf(equipment.getAdminId())));
+                        if (admin == null) {
+                            continue;
+                        }
+                        // 先查询是否已有数据
+                        LambdaQueryWrapper<OrderStatisticsMonth> query = Wrappers.lambdaQuery();
+                        query.eq(OrderStatisticsMonth::getAdminId, equipment.getAdminId());
+                        query.eq(OrderStatisticsMonth::getEquipmentId, equipment.getId());
+                        query.eq(OrderStatisticsMonth::getStatisticsDate, statisticsDate);
+                        query.eq(OrderStatisticsMonth::getType, param.getPacketType());
+                        query.eq(OrderStatisticsMonth::getIfForeign, param.getIfForeign());
+                        OrderStatisticsMonth statisticsMonth = orderStatisticsMonthService.getOne(query);
+                        if(statisticsMonth != null){
+                            // 金额是否有变化,有就更新,没有就不更新
+                            BigDecimal newSalePrice = new BigDecimal(priceTotal).setScale(2, RoundingMode.HALF_UP);
+                            if (!statisticsMonth.getSalePrice().equals(newSalePrice)) {
+                                continue;
+                            }
+                            // 更新数据
+                            statisticsMonth.setSaleNum(saleNum);
+                            statisticsMonth.setSalePrice(new BigDecimal(priceTotal).setScale(2, RoundingMode.HALF_UP));
+                            statisticsMonth.setOrderNum(Long.valueOf(docCount).intValue());
+                            updateMonthList.add(statisticsMonth);
+                            continue;
+                        }
+
+                        orderStatistics.setSalePrice(new BigDecimal(priceTotal).setScale(2, RoundingMode.HALF_UP));
+                        orderStatistics.setAdminId(admin.getId());
+                        orderStatistics.setEquipmentId(equipment.getId());
+                        orderStatistics.setClientId(key);
+                        orderStatistics.setSaleNum(saleNum);
+                        orderStatistics.setOrderNum(Long.valueOf(docCount).intValue());
+                        orderStatistics.setCompanyType(admin.getCompanyType());
+                        orderStatistics.setStatisticsDate(statisticsDate);
+                        insertMonthList.add(orderStatistics);
+                    } else {
+                        // 按商户分组
+                        TAdmin admin = R.getDataIfSuccess(szwlFeign.getAdminVo(key));
+                        if (admin == null) {
+                            continue;
+                        }
+                        // 先查询是否已有数据
+                        LambdaQueryWrapper<OrderStatisticsMonth> query = Wrappers.lambdaQuery();
+                        query.eq(OrderStatisticsMonth::getAdminId, admin.getId());
+                        query.eq(OrderStatisticsMonth::getStatisticsDate, statisticsDate);
+                        query.eq(OrderStatisticsMonth::getType, param.getPacketType());
+                        query.eq(OrderStatisticsMonth::getIfForeign, param.getIfForeign());
+                        OrderStatisticsMonth statisticsMonth = orderStatisticsMonthService.getOne(query);
+                        if(statisticsMonth != null){
+                            // 金额是否有变化,有就更新,没有就不更新
+                            BigDecimal newSalePrice = new BigDecimal(priceTotal).setScale(2, RoundingMode.HALF_UP);
+                            if (!statisticsMonth.getSalePrice().equals(newSalePrice)) {
+                                continue;
+                            }
+                            // 更新数据
+                            statisticsMonth.setSaleNum(saleNum);
+                            statisticsMonth.setSalePrice(new BigDecimal(priceTotal).setScale(2, RoundingMode.HALF_UP));
+                            statisticsMonth.setOrderNum(Long.valueOf(docCount).intValue());
+                            updateMonthList.add(statisticsMonth);
+                            continue;
+                        }
+                        orderStatistics.setSalePrice(new BigDecimal(priceTotal).setScale(2, RoundingMode.HALF_UP));
+                        orderStatistics.setAdminId(admin.getId());
+                        orderStatistics.setSaleNum(saleNum);
+                        orderStatistics.setOrderNum(Long.valueOf(docCount).intValue());
+                        orderStatistics.setCompanyType(admin.getCompanyType());
+                        orderStatistics.setStatisticsDate(statisticsDate);
+                        insertMonthList.add(orderStatistics);
+                    }
+                }
+
+
+            }
+
+            // 如果修改集合不为空,就批量修改
+            if (!updateYearList.isEmpty()) {
+                orderStatisticsYearService.updateBatchById(updateYearList);
+            }
+            if (!updateMonthList.isEmpty()) {
+                orderStatisticsMonthService.updateBatchById(updateMonthList);
+            }
+            // 如果插入集合不为空,就批量插入
+            if (!insertYearList.isEmpty()) {
+                orderStatisticsYearService.saveBatch(insertYearList);
+            }
+            // 如果插入集合不为空,就批量插入
+            if (!insertMonthList.isEmpty()) {
+                orderStatisticsMonthService.saveBatch(insertMonthList);
+            }
+            return page;
+        } catch (Exception e) {
+            log.error(getTableName() + " es根据条件 聚合查询 报错:{}", e);
+            throw new MyException(getTableName() + " es根据条件 聚合查询 报错:" + e.getMessage());
+        }
+    }
+
 }
 }

+ 20 - 0
src/main/java/com/szwl/service/impl/OrderStatisticsMonthServiceImpl.java

@@ -0,0 +1,20 @@
+package com.szwl.service.impl;
+
+import com.szwl.model.entity.OrderStatisticsMonth;
+import com.szwl.mapper.OrderStatisticsMonthMapper;
+import com.szwl.service.OrderStatisticsMonthService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ * order统计表(统计月份) 服务实现类
+ * </p>
+ *
+ * @author wuhs
+ * @since 2024-11-12
+ */
+@Service
+public class OrderStatisticsMonthServiceImpl extends ServiceImpl<OrderStatisticsMonthMapper, OrderStatisticsMonth> implements OrderStatisticsMonthService {
+
+}

+ 20 - 0
src/main/java/com/szwl/service/impl/OrderStatisticsYearServiceImpl.java

@@ -0,0 +1,20 @@
+package com.szwl.service.impl;
+
+import com.szwl.model.entity.OrderStatisticsYear;
+import com.szwl.mapper.OrderStatisticsYearMapper;
+import com.szwl.service.OrderStatisticsYearService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ * order统计表(统计年份) 服务实现类
+ * </p>
+ *
+ * @author wuhs
+ * @since 2024-11-08
+ */
+@Service
+public class OrderStatisticsYearServiceImpl extends ServiceImpl<OrderStatisticsYearMapper, OrderStatisticsYear> implements OrderStatisticsYearService {
+
+}

+ 893 - 0
src/main/java/com/szwl/service/impl/TOrderServiceImpl.java

@@ -7,25 +7,32 @@ import com.alibaba.excel.write.metadata.WriteSheet;
 import com.alibaba.excel.write.style.column.LongestMatchColumnWidthStyleStrategy;
 import com.alibaba.excel.write.style.column.LongestMatchColumnWidthStyleStrategy;
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSON;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.szwl.exception.MyException;
 import com.szwl.exception.MyException;
 import com.szwl.feign.SzwlFeign;
 import com.szwl.feign.SzwlFeign;
+import com.szwl.mapper.TCoinOrderMapper;
 import com.szwl.mapper.TOrderMapper;
 import com.szwl.mapper.TOrderMapper;
 import com.szwl.model.bean.ChartBean;
 import com.szwl.model.bean.ChartBean;
 import com.szwl.model.bean.ChartColumn;
 import com.szwl.model.bean.ChartColumn;
 import com.szwl.model.bean.OrderDaoChuDTO;
 import com.szwl.model.bean.OrderDaoChuDTO;
 import com.szwl.model.bo.ChartType;
 import com.szwl.model.bo.ChartType;
 import com.szwl.model.bo.R;
 import com.szwl.model.bo.R;
+import com.szwl.model.bo.ResponseModel;
 import com.szwl.model.dto.OrderDto;
 import com.szwl.model.dto.OrderDto;
 import com.szwl.model.entity.*;
 import com.szwl.model.entity.*;
 import com.szwl.model.excel.NewOrderTarget;
 import com.szwl.model.excel.NewOrderTarget;
 import com.szwl.model.excel.OrderTarget;
 import com.szwl.model.excel.OrderTarget;
+import com.szwl.model.excel.StatisticsAdminTarget;
+import com.szwl.model.excel.StatisticsClientIdTarget;
 import com.szwl.model.query.OrderDaoChuParam;
 import com.szwl.model.query.OrderDaoChuParam;
 import com.szwl.model.query.OrderStatisticsDTO;
 import com.szwl.model.query.OrderStatisticsDTO;
 import com.szwl.model.query.StatisticsParam;
 import com.szwl.model.query.StatisticsParam;
 import com.szwl.model.utils.DateUtils;
 import com.szwl.model.utils.DateUtils;
+import com.szwl.service.OrderStatisticsMonthService;
+import com.szwl.service.OrderStatisticsYearService;
 import com.szwl.service.RefundSendRecordService;
 import com.szwl.service.RefundSendRecordService;
 import com.szwl.service.TOrderService;
 import com.szwl.service.TOrderService;
 import com.szwl.util.YunPianSms;
 import com.szwl.util.YunPianSms;
@@ -60,6 +67,15 @@ public class TOrderServiceImpl extends ServiceImpl<TOrderMapper, TOrder> impleme
     TOrderMapper tOrderMapper;
     TOrderMapper tOrderMapper;
 
 
     @Autowired
     @Autowired
+    private TCoinOrderMapper tCoinOrderMapper;
+
+    @Autowired
+    OrderStatisticsMonthService orderStatisticsMonthService;
+
+    @Autowired
+    OrderStatisticsYearService orderStatisticsYearService;
+
+    @Autowired
     SzwlFeign szwlFeign;
     SzwlFeign szwlFeign;
 
 
     @Autowired
     @Autowired
@@ -586,6 +602,883 @@ public class TOrderServiceImpl extends ServiceImpl<TOrderMapper, TOrder> impleme
         executorService.shutdown();
         executorService.shutdown();
     }
     }
 
 
+    @Override
+    public Page<OrderDaoChuDTO> summaryStatisticsMonth(StatisticsParam param) {
+        Page<OrderDaoChuDTO> result = new Page<>(param.getCurrent(), param.getSize(), true);
+        // 如果类型是公司人员,就查下级管理的账户,如果是超管,查全部,默认查全部
+        List<Long> adminIds = new ArrayList<>();
+        if (param.getType() == 1) {
+            // 查询下级账户
+            adminIds = R.getDataIfSuccess(szwlFeign.getAdminIdList(param.getAdminId()));
+            if (adminIds.isEmpty()) {
+                return result;
+            }
+            param.setAdminIds(adminIds);
+        }
+        LambdaQueryWrapper<OrderStatisticsMonth> query = Wrappers.lambdaQuery();
+        query.eq(OrderStatisticsMonth::getStatisticsDate, param.getStartDate());
+        query.eq(OrderStatisticsMonth::getType, param.getPacketType());
+        if (StringUtils.isNotEmpty(param.getCompanyType())) {
+            query.eq(OrderStatisticsMonth::getCompanyType, param.getCompanyType());
+        }
+        if (StringUtils.isNotEmpty(param.getClientId())) {
+            // 如果type等于1,就查询设备所属商家是否是旗下管理的
+            if (param.getType() == 1) {
+                TEquipment equipment = R.getDataIfSuccess(szwlFeign.findEquipmentByClientId(param.getClientId()));
+                if (equipment == null) {
+                    return result;
+                }
+                if (adminIds.contains(equipment.getAdminId())) {
+                    query.eq(OrderStatisticsMonth::getAdminId, equipment.getAdminId());
+                    adminIds.clear();
+                } else {
+                    return result;
+                }
+            } else {
+                query.eq(OrderStatisticsMonth::getClientId, param.getClientId());
+            }
+        }
+        if (StringUtils.isNotEmpty(param.getUsername())) {
+            TAdmin admin = R.getDataIfSuccess(szwlFeign.getAdminByUsername(param.getUsername()));
+            if (admin == null) {
+                return result;
+            }
+            if (param.getType() == 1) {
+                if (adminIds.contains(admin.getId())) {
+                    query.eq(OrderStatisticsMonth::getAdminId, admin.getId());
+                    adminIds.clear();
+                } else {
+                    return result;
+                }
+            } else if (param.getType() == 0) {
+                query.eq(OrderStatisticsMonth::getAdminId, admin.getId());
+            }
+        }
+        if (param.getAdminIds()!= null && !param.getAdminIds().isEmpty()) {
+            query.in(OrderStatisticsMonth::getAdminId, param.getAdminIds());
+        }
+        if (StringUtils.isNotEmpty(param.getIfForeign())) {
+            query.eq(OrderStatisticsMonth::getIfForeign, param.getIfForeign());
+        }
+        query.orderByDesc(OrderStatisticsMonth::getSalePrice);
+        Page<OrderStatisticsMonth> page = new Page<>(param.getCurrent(), param.getSize(), true);
+        IPage<OrderStatisticsMonth> iPage = orderStatisticsMonthService.page(page, query);
+        List<OrderStatisticsMonth> list = iPage.getRecords();
+        ArrayList<OrderDaoChuDTO> orderDaoChuDTO = new ArrayList<>();
+        for (OrderStatisticsMonth orderStatistics : list) {
+            OrderDaoChuDTO orderDaoChu = new OrderDaoChuDTO();
+            TAdmin admin = R.getDataIfSuccess(szwlFeign.getAdminVo(String.valueOf(orderStatistics.getAdminId())));
+            if (StringUtils.isNotEmpty(param.getPacketType()) && param.getPacketType().equals("0")) {
+                // 按商户分组
+                String equipmentTotal = R.getDataIfSuccess(szwlFeign.getEquipmentTotal(String.valueOf(orderStatistics.getAdminId())));
+                orderDaoChu.setEquipmentTotal(equipmentTotal);
+            } else {
+                // 按设备分组
+                TEquipment equipment = R.getDataIfSuccess(szwlFeign.findById(String.valueOf(orderStatistics.getEquipmentId())));
+                orderDaoChu.setAddress(equipment.getFullName());
+                orderDaoChu.setClientId(equipment.getClientId());
+                orderDaoChu.setEquipmentType(equipment.getEquimentType());
+            }
+            orderDaoChu.setUsername(admin.getUsername());
+            orderDaoChu.setName(admin.getName());
+            orderDaoChu.setPhone(admin.getPhone());
+            orderDaoChu.setAdminId(orderStatistics.getAdminId());
+            orderDaoChu.setPriceTotal(orderStatistics.getSalePrice());
+            orderDaoChuDTO.add(orderDaoChu);
+        }
+        result.setRecords(orderDaoChuDTO);
+        result.setTotal(iPage.getTotal());
+        return result;
+    }
+
+    @Override
+    public Page<OrderDaoChuDTO> summaryStatisticsYear(StatisticsParam param) {
+        Page<OrderDaoChuDTO> result = new Page<>(param.getCurrent(), param.getSize(), true);
+        // 如果类型是公司人员,就查下级管理的账户,如果是超管,查全部,默认查全部
+        List<Long> adminIds = new ArrayList<>();
+        if (param.getType() == 1) {
+            // 查询下级账户
+            adminIds = R.getDataIfSuccess(szwlFeign.getAdminIdList(param.getAdminId()));
+            if (adminIds.isEmpty()) {
+                return result;
+            }
+            param.setAdminIds(adminIds);
+        }
+        LambdaQueryWrapper<OrderStatisticsYear> query = Wrappers.lambdaQuery();
+        query.eq(OrderStatisticsYear::getStatisticsDate, param.getStartDate());
+        query.eq(OrderStatisticsYear::getType, param.getPacketType());
+        if (StringUtils.isNotEmpty(param.getCompanyType())) {
+            query.eq(OrderStatisticsYear::getCompanyType, param.getCompanyType());
+        }
+        if (StringUtils.isNotEmpty(param.getClientId())) {
+            // 如果type等于1,就查询设备所属商家是否是旗下管理的
+            if (param.getType() == 1) {
+                TEquipment equipment = R.getDataIfSuccess(szwlFeign.findEquipmentByClientId(param.getClientId()));
+                if (equipment == null) {
+                    return result;
+                }
+                if (adminIds.contains(equipment.getAdminId())) {
+                    query.eq(OrderStatisticsYear::getAdminId, equipment.getAdminId());
+                    adminIds.clear();
+                } else {
+                    return result;
+                }
+            } else {
+                query.eq(OrderStatisticsYear::getClientId, param.getClientId());
+            }
+        }
+        if (StringUtils.isNotEmpty(param.getUsername())) {
+            TAdmin admin = R.getDataIfSuccess(szwlFeign.getAdminByUsername(param.getUsername()));
+            if (admin == null) {
+                return result;
+            }
+            if (param.getType() == 1) {
+                if (adminIds.contains(admin.getId())) {
+                    query.eq(OrderStatisticsYear::getAdminId, admin.getId());
+                    adminIds.clear();
+                } else {
+                    return result;
+                }
+            } else if (param.getType() == 0) {
+                query.eq(OrderStatisticsYear::getAdminId, admin.getId());
+            }
+        }
+        if (param.getAdminIds()!= null && !param.getAdminIds().isEmpty()) {
+            query.in(OrderStatisticsYear::getAdminId, param.getAdminIds());
+        }
+        if (StringUtils.isNotEmpty(param.getIfForeign())) {
+            query.eq(OrderStatisticsYear::getIfForeign, param.getIfForeign());
+        }
+        query.orderByDesc(OrderStatisticsYear::getSalePrice);
+        Page<OrderStatisticsYear> page = new Page<>(param.getCurrent(), param.getSize(), true);
+        IPage<OrderStatisticsYear> iPage = orderStatisticsYearService.page(page, query);
+        List<OrderStatisticsYear> list = iPage.getRecords();
+        ArrayList<OrderDaoChuDTO> orderDaoChuDTO = new ArrayList<>();
+        for (OrderStatisticsYear orderStatisticsYear : list) {
+            OrderDaoChuDTO orderDaoChu = new OrderDaoChuDTO();
+            TAdmin admin = R.getDataIfSuccess(szwlFeign.getAdminVo(String.valueOf(orderStatisticsYear.getAdminId())));
+            if (StringUtils.isNotEmpty(param.getPacketType()) && param.getPacketType().equals("0")) {
+                // 按商户分组
+                String equipmentTotal = R.getDataIfSuccess(szwlFeign.getEquipmentTotal(String.valueOf(orderStatisticsYear.getAdminId())));
+                orderDaoChu.setEquipmentTotal(equipmentTotal);
+            } else {
+                // 按设备分组
+                TEquipment equipment = R.getDataIfSuccess(szwlFeign.findById(String.valueOf(orderStatisticsYear.getEquipmentId())));
+                orderDaoChu.setAddress(equipment.getFullName());
+                orderDaoChu.setClientId(equipment.getClientId());
+                orderDaoChu.setEquipmentType(equipment.getEquimentType());
+            }
+            orderDaoChu.setUsername(admin.getUsername());
+            orderDaoChu.setName(admin.getName());
+            orderDaoChu.setPhone(admin.getPhone());
+            orderDaoChu.setAdminId(orderStatisticsYear.getAdminId());
+            orderDaoChu.setPriceTotal(orderStatisticsYear.getSalePrice());
+            orderDaoChuDTO.add(orderDaoChu);
+        }
+        result.setRecords(orderDaoChuDTO);
+        result.setTotal(iPage.getTotal());
+        return result;
+    }
+
+    @Override
+    public Page<OrderDaoChuDTO> summaryStatistics(StatisticsParam param) {
+        Page<OrderDaoChuDTO> result = new Page<>(param.getCurrent(), param.getSize(), true);
+        // 如果类型是公司人员,就查下级管理的账户,如果是超管,查全部,默认查全部
+        List<Long> adminIds = new ArrayList<>();
+        if (param.getType() == 1) {
+            // 查询下级账户
+            adminIds = R.getDataIfSuccess(szwlFeign.getAdminIdList(param.getAdminId()));
+            if (adminIds.isEmpty()) {
+                return result;
+            }
+            param.setAdminIds(adminIds);
+        }
+        List<OrderDaoChuDTO> orderDaoChuDTOList;
+        if (StringUtils.isNotEmpty(param.getStartDate()) && StringUtils.isNotEmpty(param.getEndDate())) {
+            if (param.getIfForeign().equals("0")) {
+                // 查国内,即线上订单
+                LambdaQueryWrapper<TOrder> queryWrapper = new LambdaQueryWrapper<>();
+                if (StringUtils.isNotEmpty(param.getClientId())) {
+                    // 如果type等于1,就查询设备所属商家是否是旗下管理的
+                    if (param.getType() == 1) {
+                        TEquipment equipment = R.getDataIfSuccess(szwlFeign.findEquipmentByClientId(param.getClientId()));
+                        if (equipment == null) {
+                            return result;
+                        }
+                        if (adminIds.contains(equipment.getAdminId())) {
+                            queryWrapper.eq(TOrder::getAdminId, equipment.getAdminId());
+                            adminIds.clear();
+                        } else {
+                            return result;
+                        }
+                    } else {
+                        queryWrapper.eq(TOrder::getClientId, param.getClientId());
+                    }
+                }
+                // 条件:adminId,如果type等于1,就查询账号是否是旗下管理的
+                if (StringUtils.isNotEmpty(param.getUsername())) {
+                    TAdmin admin = R.getDataIfSuccess(szwlFeign.getAdminByUsername(param.getUsername()));
+                    if (admin == null) {
+                        return result;
+                    }
+                    if (param.getType() == 1) {
+                        if (param.getAdminIds().contains(admin.getId())) {
+                            queryWrapper.eq(TOrder::getAdminId, admin.getId());
+                            param.setAdminId(String.valueOf(admin.getId()));
+                            param.setAdminIds(null);
+                        } else {
+                            return result;
+                        }
+                    } else if (param.getType() == 0) {
+                        queryWrapper.eq(TOrder::getAdminId, admin.getId());
+                        param.setAdminId(String.valueOf(admin.getId()));
+                    }
+                }
+                // 条件:adminList
+                if (param.getAdminIds() != null && !param.getAdminIds().isEmpty()) {
+                    queryWrapper.in(TOrder::getAdminId, param.getAdminIds());
+                }
+                // 条件:companyType
+                if (StringUtils.isNotBlank(param.getCompanyType())) {
+                    if ("0".equals(param.getCompanyType())) {
+                        queryWrapper.and(i -> i.isNull(TOrder::getCompanyType).or().eq(TOrder::getCompanyType, "0"));
+                    } else if ("1".equals(param.getCompanyType())) {
+                        queryWrapper.eq(TOrder::getCompanyType, "1");
+                    }
+                }
+                // 条件:时间范围
+                queryWrapper.between(TOrder::getCreateDate, param.getStartDate(), param.getEndDate());
+                // 条件:支付状态
+                queryWrapper.eq(TOrder::getStatus, 1);
+                // 条件:type == 2 or type == 1
+                if ("2".equals(param.getPacketType())) {
+                    queryWrapper.groupBy(TOrder::getAdminId);
+                } else if ("1".equals(param.getPacketType())) {
+                    queryWrapper.groupBy(TOrder::getClientId);
+                }
+                Page<TOrder> tOrderPage = new Page<>(param.getCurrent(), param.getSize(), true);
+                IPage<TOrder> iPage = tOrderMapper.selectPage(tOrderPage, queryWrapper);
+                result.setTotal(iPage.getTotal());
+                param.setCurrent(param.getCurrent() - 1);
+                orderDaoChuDTOList = tOrderMapper.summaryStatistics(param);
+            } else {
+                // 查国外,即线下订单
+                LambdaQueryWrapper<TCoinOrder> queryWrapper = new LambdaQueryWrapper<>();
+                if (StringUtils.isNotEmpty(param.getClientId())) {
+                    // 如果type等于1,就查询设备所属商家是否是旗下管理的
+                    if (param.getType() == 1) {
+                        TEquipment equipment = R.getDataIfSuccess(szwlFeign.findEquipmentByClientId(param.getClientId()));
+                        if (equipment == null) {
+                            return result;
+                        }
+                        if (adminIds.contains(equipment.getAdminId())) {
+                            queryWrapper.eq(TCoinOrder::getAdminId, equipment.getAdminId());
+                            adminIds.clear();
+                        } else {
+                            return result;
+                        }
+                    } else {
+                        queryWrapper.eq(TCoinOrder::getClientId, param.getClientId());
+                    }
+                }
+                // 条件:adminId,如果type等于1,就查询账号是否是旗下管理的
+                if (StringUtils.isNotEmpty(param.getUsername())) {
+                    TAdmin admin = R.getDataIfSuccess(szwlFeign.getAdminByUsername(param.getUsername()));
+                    if (admin == null) {
+                        return result;
+                    }
+                    if (param.getType() == 1) {
+                        if (param.getAdminIds().contains(admin.getId())) {
+                            queryWrapper.eq(TCoinOrder::getAdminId, admin.getId());
+                            param.setAdminId(String.valueOf(admin.getId()));
+                            param.setAdminIds(null);
+                        } else {
+                            return result;
+                        }
+                    } else if (param.getType() == 0) {
+                        queryWrapper.eq(TCoinOrder::getAdminId, admin.getId());
+                        param.setAdminId(String.valueOf(admin.getId()));
+                    }
+                }
+                // 条件:adminList
+                if (param.getAdminIds() != null && !param.getAdminIds().isEmpty()) {
+                    queryWrapper.in(TCoinOrder::getAdminId, param.getAdminIds());
+                }
+                // 条件:companyType
+                if (StringUtils.isNotBlank(param.getCompanyType())) {
+                    if ("0".equals(param.getCompanyType())) {
+                        queryWrapper.and(i -> i.isNull(TCoinOrder::getCompanyType).or().eq(TCoinOrder::getCompanyType, "0"));
+                    } else if ("1".equals(param.getCompanyType())) {
+                        queryWrapper.eq(TCoinOrder::getCompanyType, "1");
+                    }
+                }
+                // 条件:时间范围
+                queryWrapper.between(TCoinOrder::getCreateDate, param.getStartDate(), param.getEndDate());
+                // 条件:支付状态
+                queryWrapper.eq(TCoinOrder::getStatus, 1);
+                // 条件:type == 2 or type == 1
+                if ("2".equals(param.getPacketType())) {
+                    queryWrapper.groupBy(TCoinOrder::getAdminId);
+                } else if ("1".equals(param.getPacketType())) {
+                    queryWrapper.groupBy(TCoinOrder::getClientId);
+                }
+                Page<TCoinOrder> tOrderPage = new Page<>(param.getCurrent(), param.getSize(), true);
+                IPage<TCoinOrder> iPage = tCoinOrderMapper.selectPage(tOrderPage, queryWrapper);
+                result.setTotal(iPage.getTotal());
+                param.setCurrent(param.getCurrent() - 1);
+                orderDaoChuDTOList = tCoinOrderMapper.summaryStatistics(param);
+            }
+            for (OrderDaoChuDTO orderDaoChuDTO : orderDaoChuDTOList) {
+                String adminId1 = orderDaoChuDTO.getAdminId().toString();
+                TAdmin admin = R.getDataIfSuccess(szwlFeign.getAdminVo(adminId1));
+                if (admin == null) {
+                    continue;
+                }
+                orderDaoChuDTO.setPhone(admin.getPhone());
+                orderDaoChuDTO.setUsername(admin.getUsername());
+                orderDaoChuDTO.setName(admin.getName());
+                if (!StringUtils.isEmpty(param.getPacketType()) && param.getPacketType().equals("0")) {
+                    //商户为单位
+                    String equipmentTotal = R.getDataIfSuccess(szwlFeign.getEquipmentTotal(adminId1));
+                    orderDaoChuDTO.setEquipmentTotal(equipmentTotal);
+                } else {
+                    //设备为单位
+                    ResponseModel<TEquipment> equipmentByClientId = szwlFeign.findEquipmentByClientId(String.valueOf(orderDaoChuDTO.getClientId()));
+                    TEquipment equipment = equipmentByClientId.getData();
+                    if (equipment != null && equipment.getId() != null) {
+                        if (StringUtils.isNotEmpty(equipment.getFullName())) {
+                            orderDaoChuDTO.setAddress(equipment.getFullName());
+                        }
+                        orderDaoChuDTO.setEquipmentType(equipment.getEquimentType());
+                        orderDaoChuDTO.setCreateDate(equipment.getCreateDate());
+
+                    }
+                }
+            }
+            result.setRecords(orderDaoChuDTOList);
+        }
+
+        return result;
+    }
+
+    @Override
+    public <T> void statisticsYearExport(HttpServletResponse response, Class<T> clazz, StatisticsParam param) throws IOException {
+        // 如果类型是公司人员,就查下级管理的账户,如果是超管,查全部,默认查全部
+        List<Long> adminIds = new ArrayList<>();
+        if (param.getType() == 1) {
+            // 查询下级账户
+            adminIds = R.getDataIfSuccess(szwlFeign.getAdminIdList(param.getAdminId()));
+            if (adminIds.isEmpty()) {
+                return;
+            }
+            param.setAdminIds(adminIds);
+        }
+        LambdaQueryWrapper<OrderStatisticsYear> query = Wrappers.lambdaQuery();
+        query.eq(OrderStatisticsYear::getStatisticsDate, param.getStartDate());
+        query.eq(OrderStatisticsYear::getType, param.getPacketType());
+        if (StringUtils.isNotEmpty(param.getCompanyType())) {
+            query.eq(OrderStatisticsYear::getCompanyType, param.getCompanyType());
+        }
+        if (StringUtils.isNotEmpty(param.getClientId())) {
+            // 如果type等于1,就查询设备所属商家是否是旗下管理的
+            if (param.getType() == 1) {
+                TEquipment equipment = R.getDataIfSuccess(szwlFeign.findEquipmentByClientId(param.getClientId()));
+                if (equipment == null) {
+                    return;
+                }
+                if (adminIds.contains(equipment.getAdminId())) {
+                    query.eq(OrderStatisticsYear::getAdminId, equipment.getAdminId());
+                    adminIds.clear();
+                } else {
+                    return;
+                }
+            } else {
+                query.eq(OrderStatisticsYear::getClientId, param.getClientId());
+            }
+        }
+        // 条件:adminId,如果type等于1,就查询账号是否是旗下管理的
+        if (StringUtils.isNotEmpty(param.getUsername())) {
+            TAdmin admin = R.getDataIfSuccess(szwlFeign.getAdminByUsername(param.getUsername()));
+            if (admin == null) {
+                return;
+            }
+            if (param.getType() == 1) {
+                if (adminIds.contains(admin.getId())) {
+                    query.eq(OrderStatisticsYear::getAdminId, admin.getId());
+                    adminIds.clear();
+                } else {
+                    return;
+                }
+            } else if (param.getType() == 0) {
+                query.eq(OrderStatisticsYear::getAdminId, admin.getId());
+            }
+        }
+        if (param.getAdminIds()!= null && !param.getAdminIds().isEmpty()) {
+            query.in(OrderStatisticsYear::getAdminId, param.getAdminIds());
+        }
+        if (StringUtils.isNotEmpty(param.getIfForeign())) {
+            query.eq(OrderStatisticsYear::getIfForeign, param.getIfForeign());
+        }
+        query.orderByDesc(OrderStatisticsYear::getSalePrice);
+        // 这里注意 有同学反应使用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");
+        // 每页大小
+        int pageNo = param.getCurrent();
+
+        // 使用 EasyExcel 的流式写入模式
+        try (ExcelWriter excelWriter = EasyExcel.write(response.getOutputStream(), clazz).build()) {
+            WriteSheet writeSheet = EasyExcel.writerSheet("数据").build();
+
+            while (true) {
+                // 分页获取数据
+                param.setCurrent(pageNo);
+                Page<OrderStatisticsYear> orderPage = new Page<>(pageNo, param.getSize());
+                Page<OrderStatisticsYear> pageList = orderStatisticsYearService.page(orderPage, query);
+                List<OrderStatisticsYear> dataList = pageList.getRecords();
+                if (dataList.isEmpty()) {
+                    break;
+                }
+                // 封装数据
+                if (param.getPacketType().equals("0")) {
+                    List<StatisticsAdminTarget> adminTargetList = exportStatisticsYearByAdmin(dataList);
+                    // 写入数据到 Excel
+                    excelWriter.write(adminTargetList, writeSheet);
+                } else {
+                    List<StatisticsClientIdTarget> clientIdTargetList = exportStatisticsYearByClientId(dataList);
+                    excelWriter.write(clientIdTargetList, writeSheet);
+                }
+                pageNo++;
+            }
+        }
+    }
+
+    @Override
+    public <T> void statisticsMonthExport(HttpServletResponse response, Class<T> clazz, StatisticsParam param) throws IOException {
+        // 如果类型是公司人员,就查下级管理的账户,如果是超管,查全部,默认查全部
+        List<Long> adminIds = new ArrayList<>();
+        if (param.getType() == 1) {
+            // 查询下级账户
+            adminIds = R.getDataIfSuccess(szwlFeign.getAdminIdList(param.getAdminId()));
+            if (adminIds.isEmpty()) {
+                return;
+            }
+            param.setAdminIds(adminIds);
+        }
+        LambdaQueryWrapper<OrderStatisticsMonth> query = Wrappers.lambdaQuery();
+        query.eq(OrderStatisticsMonth::getStatisticsDate, param.getStartDate());
+        query.eq(OrderStatisticsMonth::getType, param.getPacketType());
+        if (StringUtils.isNotEmpty(param.getCompanyType())) {
+            query.eq(OrderStatisticsMonth::getCompanyType, param.getCompanyType());
+        }
+        if (StringUtils.isNotEmpty(param.getClientId())) {
+            // 如果type等于1,就查询设备所属商家是否是旗下管理的
+            if (param.getType() == 1) {
+                TEquipment equipment = R.getDataIfSuccess(szwlFeign.findEquipmentByClientId(param.getClientId()));
+                if (equipment == null) {
+                    return;
+                }
+                if (adminIds.contains(equipment.getAdminId())) {
+                    query.eq(OrderStatisticsMonth::getAdminId, equipment.getAdminId());
+                    adminIds.clear();
+                } else {
+                    return;
+                }
+            } else {
+                query.eq(OrderStatisticsMonth::getClientId, param.getClientId());
+            }
+        }
+        // 条件:adminId,如果type等于1,就查询账号是否是旗下管理的
+        if (StringUtils.isNotEmpty(param.getUsername())) {
+            TAdmin admin = R.getDataIfSuccess(szwlFeign.getAdminByUsername(param.getUsername()));
+            if (admin == null) {
+                return;
+            }
+            if (param.getType() == 1) {
+                if (adminIds.contains(admin.getId())) {
+                    query.eq(OrderStatisticsMonth::getAdminId, admin.getId());
+                    adminIds.clear();
+                } else {
+                    return;
+                }
+            } else if (param.getType() == 0) {
+                query.eq(OrderStatisticsMonth::getAdminId, admin.getId());
+            }
+        }
+        if (param.getAdminIds()!= null && !param.getAdminIds().isEmpty()) {
+            query.in(OrderStatisticsMonth::getAdminId, param.getAdminIds());
+        }
+        if (StringUtils.isNotEmpty(param.getIfForeign())) {
+            query.eq(OrderStatisticsMonth::getIfForeign, param.getIfForeign());
+        }
+        query.orderByDesc(OrderStatisticsMonth::getSalePrice);
+        // 这里注意 有同学反应使用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");
+        // 每页大小
+        int pageNo = param.getCurrent();
+
+        // 使用 EasyExcel 的流式写入模式
+        try (ExcelWriter excelWriter = EasyExcel.write(response.getOutputStream(), clazz).build()) {
+            WriteSheet writeSheet = EasyExcel.writerSheet("数据").build();
+
+            while (true) {
+                // 分页获取数据
+                param.setCurrent(pageNo);
+                Page<OrderStatisticsMonth> orderPage = new Page<>(pageNo, param.getSize());
+                Page<OrderStatisticsMonth> pageList = orderStatisticsMonthService.page(orderPage, query);
+                List<OrderStatisticsMonth> dataList = pageList.getRecords();
+                if (dataList.isEmpty()) {
+                    break;
+                }
+                // 封装数据
+                if (param.getPacketType().equals("0")) {
+                    List<StatisticsAdminTarget> adminTargetList = exportStatisticsMonthByAdmin(dataList);
+                    // 写入数据到 Excel
+                    excelWriter.write(adminTargetList, writeSheet);
+                } else {
+                    List<StatisticsClientIdTarget> clientIdTargetList = exportStatisticsMonthByClientId(dataList);
+                    excelWriter.write(clientIdTargetList, writeSheet);
+                }
+                pageNo++;
+            }
+        }
+    }
+
+    @Override
+    public <T> void statisticsDayWeekExport(HttpServletResponse response, Class<T> clazz, StatisticsParam param) throws IOException {
+        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");
+
+        // 每页大小
+        int pageNo = param.getCurrent();
+        // 如果类型是公司人员,就查下级管理的账户,如果是超管,查全部,默认查全部
+        if (param.getType() == 1) {
+            // 查询下级账户
+            String adminId = param.getAdminId();
+            List<Long> adminIds = R.getDataIfSuccess(szwlFeign.getAdminIdList(adminId));
+            if (adminIds.isEmpty()) {
+                return;
+            }
+            param.setAdminIds(adminIds);
+        }
+
+        // 使用 EasyExcel 的流式写入模式
+        try (ExcelWriter excelWriter = EasyExcel.write(response.getOutputStream(), clazz).build()) {
+            WriteSheet writeSheet = EasyExcel.writerSheet("数据").build();
+
+            while (true) {
+                // 分页获取数据
+                List<OrderDaoChuDTO> dataList = getPageData(pageNo, param);
+                if (dataList.isEmpty()) {
+                    break;
+                }
+                // 封装数据
+                if (param.getPacketType().equals("0")) {
+                    List<StatisticsAdminTarget> adminTargetList = exportStatisticsByAdmin(dataList);
+                    // 写入数据到 Excel
+                    excelWriter.write(adminTargetList, writeSheet);
+                } else {
+                    List<StatisticsClientIdTarget> clientIdTargetList = exportStatisticsByClientId(dataList);
+                    excelWriter.write(clientIdTargetList, writeSheet);
+                }
+                pageNo++;
+            }
+        }
+    }
+
+    private List<StatisticsClientIdTarget> exportStatisticsByClientId(List<OrderDaoChuDTO> dataList) {
+        List<StatisticsClientIdTarget> clientIdTargetList = new ArrayList<>();
+        for (OrderDaoChuDTO orderDaoChuDTO : dataList) {
+            StatisticsClientIdTarget target = new StatisticsClientIdTarget();
+            target.setUsername(orderDaoChuDTO.getUsername());
+            target.setName(orderDaoChuDTO.getName());
+            target.setPhone(orderDaoChuDTO.getPhone());
+            target.setAddress(orderDaoChuDTO.getAddress());
+            target.setClientId(orderDaoChuDTO.getClientId());
+            target.setEquipmentType(orderDaoChuDTO.getEquipmentType());
+            target.setPriceTotal(orderDaoChuDTO.getPriceTotal());
+            clientIdTargetList.add(target);
+        }
+        return clientIdTargetList;
+    }
+
+
+    /**
+     * 封装
+     * @param dataList
+     * @return
+     */
+    private List<StatisticsAdminTarget> exportStatisticsByAdmin(List<OrderDaoChuDTO> dataList) {
+        List<StatisticsAdminTarget> adminTargetList = new ArrayList<>();
+        for (OrderDaoChuDTO orderDaoChuDTO : dataList) {
+            StatisticsAdminTarget target = new StatisticsAdminTarget();
+            target.setUsername(orderDaoChuDTO.getUsername());
+            target.setName(orderDaoChuDTO.getName());
+            target.setPhone(orderDaoChuDTO.getPhone());
+            target.setEquipmentTotal(orderDaoChuDTO.getEquipmentTotal());
+            target.setPriceTotal(orderDaoChuDTO.getPriceTotal());
+            adminTargetList.add(target);
+        }
+        return adminTargetList;
+    }
+
+    /**
+     * 分页查询
+     * @param pageNo
+     * @param param
+     * @return
+     */
+    private List<OrderDaoChuDTO> getPageData(int pageNo, StatisticsParam param) {
+        List<OrderDaoChuDTO> orderDaoChuDTOList = new ArrayList<>();
+        if (StringUtils.isNotEmpty(param.getStartDate()) && StringUtils.isNotEmpty(param.getEndDate())) {
+            if (param.getIfForeign().equals("0")) {
+                // 查国内,即线上订单
+                LambdaQueryWrapper<TOrder> queryWrapper = new LambdaQueryWrapper<>();
+                if (StringUtils.isNotEmpty(param.getClientId())) {
+                    // 如果type等于1,就查询设备所属商家是否是旗下管理的
+                    if (param.getType() == 1) {
+                        TEquipment equipment = R.getDataIfSuccess(szwlFeign.findEquipmentByClientId(param.getClientId()));
+                        if (equipment == null) {
+                            return orderDaoChuDTOList;
+                        }
+                        if (param.getAdminIds().contains(equipment.getAdminId())) {
+                            queryWrapper.eq(TOrder::getAdminId, equipment.getAdminId());
+                            param.setAdminIds(null);
+                        } else {
+                            return orderDaoChuDTOList;
+                        }
+                    } else {
+                        queryWrapper.eq(TOrder::getClientId, param.getClientId());
+                    }
+                }
+                // 条件:adminId,如果type等于1,就查询账号是否是旗下管理的
+                if (StringUtils.isNotEmpty(param.getUsername())) {
+                    TAdmin admin = R.getDataIfSuccess(szwlFeign.getAdminByUsername(param.getUsername()));
+                    if (admin == null) {
+                        return orderDaoChuDTOList;
+                    }
+                    if (param.getType() == 1) {
+                        if (param.getAdminIds().contains(admin.getId())) {
+                            queryWrapper.eq(TOrder::getAdminId, admin.getId());
+                            param.setAdminId(String.valueOf(admin.getId()));
+                            param.setAdminIds(null);
+                        } else {
+                            return orderDaoChuDTOList;
+                        }
+                    } else if (param.getType() == 0) {
+                        queryWrapper.eq(TOrder::getAdminId, admin.getId());
+                        param.setAdminId(String.valueOf(admin.getId()));
+                    }
+                }
+                // 条件:adminList
+                if (param.getAdminIds() != null && !param.getAdminIds().isEmpty()) {
+                    queryWrapper.in(TOrder::getAdminId, param.getAdminIds());
+                    param.setAdminId(null);
+                }
+                // 条件:companyType
+                if (StringUtils.isNotBlank(param.getCompanyType())) {
+                    if ("0".equals(param.getCompanyType())) {
+                        queryWrapper.and(i -> i.isNull(TOrder::getCompanyType).or().eq(TOrder::getCompanyType, "0"));
+                    } else if ("1".equals(param.getCompanyType())) {
+                        queryWrapper.eq(TOrder::getCompanyType, "1");
+                    }
+                }
+                // 条件:时间范围
+                queryWrapper.between(TOrder::getCreateDate, param.getStartDate(), param.getEndDate());
+                // 条件:支付状态
+                queryWrapper.eq(TOrder::getStatus, 1);
+                // 条件:type == 2 or type == 1
+                if ("2".equals(param.getPacketType())) {
+                    queryWrapper.groupBy(TOrder::getAdminId);
+                } else if ("1".equals(param.getPacketType())) {
+                    queryWrapper.groupBy(TOrder::getClientId);
+                }
+                param.setCurrent((pageNo - 1) * param.getSize());
+                orderDaoChuDTOList = tOrderMapper.summaryStatistics(param);
+            } else {
+                // 查国外,即线下订单
+                LambdaQueryWrapper<TCoinOrder> queryWrapper = new LambdaQueryWrapper<>();
+                if (StringUtils.isNotEmpty(param.getClientId())) {
+                    // 如果type等于1,就查询设备所属商家是否是旗下管理的
+                    if (param.getType() == 1) {
+                        TEquipment equipment = R.getDataIfSuccess(szwlFeign.findEquipmentByClientId(param.getClientId()));
+                        if (equipment == null) {
+                            return orderDaoChuDTOList;
+                        }
+                        if (param.getAdminIds().contains(equipment.getAdminId())) {
+                            queryWrapper.eq(TCoinOrder::getAdminId, equipment.getAdminId());
+                            param.setAdminIds(null);
+                        } else {
+                            return orderDaoChuDTOList;
+                        }
+                    } else {
+                        queryWrapper.eq(TCoinOrder::getClientId, param.getClientId());
+                    }
+                }
+                // 条件:adminId,如果type等于1,就查询账号是否是旗下管理的
+                if (StringUtils.isNotEmpty(param.getUsername())) {
+                    TAdmin admin = R.getDataIfSuccess(szwlFeign.getAdminByUsername(param.getUsername()));
+                    if (admin == null) {
+                        return orderDaoChuDTOList;
+                    }
+                    if (param.getType() == 1) {
+                        if (param.getAdminIds().contains(admin.getId())) {
+                            queryWrapper.eq(TCoinOrder::getAdminId, admin.getId());
+                            param.setAdminId(String.valueOf(admin.getId()));
+                            param.setAdminIds(null);
+                        } else {
+                            return orderDaoChuDTOList;
+                        }
+                    } else if (param.getType() == 0) {
+                        queryWrapper.eq(TCoinOrder::getAdminId, admin.getId());
+                        param.setAdminId(String.valueOf(admin.getId()));
+                    }
+                }
+                // 条件:adminList
+                if (param.getAdminIds() != null && !param.getAdminIds().isEmpty()) {
+                    queryWrapper.in(TCoinOrder::getAdminId, param.getAdminIds());
+                    param.setAdminId(null);
+                }
+                // 条件:companyType
+                if (StringUtils.isNotBlank(param.getCompanyType())) {
+                    if ("0".equals(param.getCompanyType())) {
+                        queryWrapper.and(i -> i.isNull(TCoinOrder::getCompanyType).or().eq(TCoinOrder::getCompanyType, "0"));
+                    } else if ("1".equals(param.getCompanyType())) {
+                        queryWrapper.eq(TCoinOrder::getCompanyType, "1");
+                    }
+                }
+                // 条件:时间范围
+                queryWrapper.between(TCoinOrder::getCreateDate, param.getStartDate(), param.getEndDate());
+                // 条件:支付状态
+                queryWrapper.eq(TCoinOrder::getStatus, 1);
+                // 条件:type == 2 or type == 1
+                if ("2".equals(param.getPacketType())) {
+                    queryWrapper.groupBy(TCoinOrder::getAdminId);
+                } else if ("1".equals(param.getPacketType())) {
+                    queryWrapper.groupBy(TCoinOrder::getClientId);
+                }
+                param.setCurrent((pageNo - 1) * param.getSize());
+                orderDaoChuDTOList = tCoinOrderMapper.summaryStatistics(param);
+            }
+            for (OrderDaoChuDTO orderDaoChuDTO : orderDaoChuDTOList) {
+                String adminId1 = orderDaoChuDTO.getAdminId().toString();
+                TAdmin admin = R.getDataIfSuccess(szwlFeign.getAdminVo(adminId1));
+                if (admin == null) {
+                    continue;
+                }
+                orderDaoChuDTO.setPhone(admin.getPhone());
+                orderDaoChuDTO.setUsername(admin.getUsername());
+                orderDaoChuDTO.setName(admin.getName());
+                if (!StringUtils.isEmpty(param.getPacketType()) && param.getPacketType().equals("0")) {
+                    //商户为单位
+                    String equipmentTotal = R.getDataIfSuccess(szwlFeign.getEquipmentTotal(adminId1));
+                    orderDaoChuDTO.setEquipmentTotal(equipmentTotal);
+                } else {
+                    //设备为单位
+                    ResponseModel<TEquipment> equipmentByClientId = szwlFeign.findEquipmentByClientId(String.valueOf(orderDaoChuDTO.getClientId()));
+                    TEquipment equipment = equipmentByClientId.getData();
+                    if (equipment != null && equipment.getId() != null) {
+                        if (StringUtils.isNotEmpty(equipment.getFullName())) {
+                            orderDaoChuDTO.setAddress(equipment.getFullName());
+                        }
+                        orderDaoChuDTO.setEquipmentType(equipment.getEquimentType());
+                        orderDaoChuDTO.setCreateDate(equipment.getCreateDate());
+
+                    }
+                }
+            }
+        }
+        return orderDaoChuDTOList;
+    }
+
+
+    private List<StatisticsClientIdTarget> exportStatisticsYearByClientId(List<OrderStatisticsYear> list) {
+        List<StatisticsClientIdTarget> clientIdTargetList = new ArrayList<>();
+        for (OrderStatisticsYear orderStatisticsYear : list) {
+            StatisticsClientIdTarget target = new StatisticsClientIdTarget();
+            TAdmin admin = R.getDataIfSuccess(szwlFeign.getAdminVo(String.valueOf(orderStatisticsYear.getAdminId())));
+            // 按设备分组
+            TEquipment equipment = R.getDataIfSuccess(szwlFeign.findById(String.valueOf(orderStatisticsYear.getEquipmentId())));
+            target.setUsername(admin.getUsername());
+            target.setName(admin.getName());
+            target.setPhone(admin.getPhone());
+            target.setAddress(equipment.getFullName());
+            target.setClientId(equipment.getClientId());
+            target.setEquipmentType(equipment.getEquimentType());
+            target.setSalesVolume(orderStatisticsYear.getSaleNum());
+            target.setPriceTotal(orderStatisticsYear.getSalePrice());
+            clientIdTargetList.add(target);
+        }
+        return clientIdTargetList;
+    }
+
+    private List<StatisticsClientIdTarget> exportStatisticsMonthByClientId(List<OrderStatisticsMonth> list) {
+        List<StatisticsClientIdTarget> clientIdTargetList = new ArrayList<>();
+        for (OrderStatisticsMonth orderStatisticsMonth : list) {
+            StatisticsClientIdTarget target = new StatisticsClientIdTarget();
+            TAdmin admin = R.getDataIfSuccess(szwlFeign.getAdminVo(String.valueOf(orderStatisticsMonth.getAdminId())));
+            // 按设备分组
+            TEquipment equipment = R.getDataIfSuccess(szwlFeign.findById(String.valueOf(orderStatisticsMonth.getEquipmentId())));
+            target.setUsername(admin.getUsername());
+            target.setName(admin.getName());
+            target.setPhone(admin.getPhone());
+            target.setAddress(equipment.getFullName());
+            target.setClientId(equipment.getClientId());
+            target.setEquipmentType(equipment.getEquimentType());
+            target.setSalesVolume(orderStatisticsMonth.getSaleNum());
+            target.setPriceTotal(orderStatisticsMonth.getSalePrice());
+            clientIdTargetList.add(target);
+        }
+        return clientIdTargetList;
+    }
+
+    private List<StatisticsAdminTarget> exportStatisticsYearByAdmin(List<OrderStatisticsYear> list) {
+        List<StatisticsAdminTarget> adminTargetList = new ArrayList<>();
+        for (OrderStatisticsYear orderStatisticsYear : list) {
+            StatisticsAdminTarget target = new StatisticsAdminTarget();
+            TAdmin admin = R.getDataIfSuccess(szwlFeign.getAdminVo(String.valueOf(orderStatisticsYear.getAdminId())));
+            // 按商户分组
+            String equipmentTotal = R.getDataIfSuccess(szwlFeign.getEquipmentTotal(String.valueOf(orderStatisticsYear.getAdminId())));
+            target.setUsername(admin.getUsername());
+            target.setName(admin.getName());
+            target.setPhone(admin.getPhone());
+            target.setEquipmentTotal(equipmentTotal);
+            target.setSalesVolume(orderStatisticsYear.getSaleNum());
+            target.setPriceTotal(orderStatisticsYear.getSalePrice());
+            adminTargetList.add(target);
+        }
+        return adminTargetList;
+    }
+
+    private List<StatisticsAdminTarget> exportStatisticsMonthByAdmin(List<OrderStatisticsMonth> list) {
+        List<StatisticsAdminTarget> adminTargetList = new ArrayList<>();
+        for (OrderStatisticsMonth orderStatisticsMonth : list) {
+            StatisticsAdminTarget target = new StatisticsAdminTarget();
+            TAdmin admin = R.getDataIfSuccess(szwlFeign.getAdminVo(String.valueOf(orderStatisticsMonth.getAdminId())));
+            // 按商户分组
+            String equipmentTotal = R.getDataIfSuccess(szwlFeign.getEquipmentTotal(String.valueOf(orderStatisticsMonth.getAdminId())));
+            target.setUsername(admin.getUsername());
+            target.setName(admin.getName());
+            target.setPhone(admin.getPhone());
+            target.setEquipmentTotal(equipmentTotal);
+            target.setSalesVolume(orderStatisticsMonth.getSaleNum());
+            target.setPriceTotal(orderStatisticsMonth.getSalePrice());
+            adminTargetList.add(target);
+        }
+        return adminTargetList;
+    }
+
+
     private String getSzMessage(String sn, String price, String payTime, String equipmentName, String clientId, String customerPhone) {
     private String getSzMessage(String sn, String price, String payTime, String equipmentName, String clientId, String customerPhone) {
         String message = "";
         String message = "";
         if (StringUtils.isNotEmpty(customerPhone) && customerPhone.length() > 3) {
         if (StringUtils.isNotEmpty(customerPhone) && customerPhone.length() > 3) {