Browse Source

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

soobin 9 tháng trước cách đây
mục cha
commit
28774871dc
26 tập tin đã thay đổi với 1928 bổ sung42 xóa
  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;
 
-import com.szwl.service.TDepartmentService;
+import com.szwl.model.query.StatisticsParam;
 import com.szwl.service.TOrderTaskService;
 import com.szwl.service.TShandeMchService;
 import com.szwl.service.es.EsTCoinOrderService;
@@ -14,7 +14,8 @@ import org.springframework.stereotype.Component;
 import java.net.InetAddress;
 import java.net.UnknownHostException;
 import java.text.ParseException;
-import java.util.Calendar;
+import java.time.LocalDate;
+import java.time.format.DateTimeFormatter;
 
 
 @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.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
-import com.szwl.common.aop.LogAnnotation;
 import com.szwl.constant.ResponseCodesEnum;
 import com.szwl.exception.BizException;
 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.dto.OrderDto;
 import com.szwl.model.entity.*;
-import com.szwl.model.excel.CoinOrderTarget;
-import com.szwl.model.excel.OrderByAdminTarget;
-import com.szwl.model.excel.OrderByClientidTarget;
-import com.szwl.model.excel.OrderTarget;
+import com.szwl.model.excel.*;
 import com.szwl.model.query.OrderStatisticsDTO;
 import com.szwl.model.query.StatisticsParam;
 import com.szwl.model.query.TOrderParam;
@@ -658,7 +654,6 @@ public class TOrderController {
 
         //  判断是否为外国
         log.info("param:{}", param);
-//        String adminId = param.getAdminId();
         TAdmin admin = R.getDataIfSuccess(szwlFeign.getAdmin(adminId));
         if (admin.getType() < 2) {
             // 如果是超管或公司人员
@@ -1022,6 +1017,14 @@ public class TOrderController {
         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 = "查询国内线上订单")
     @RequestMapping(value = "/findOrder", method = RequestMethod.GET, produces = "application/json;charset=UTF-8")
     @ResponseBody
@@ -1219,16 +1222,8 @@ public class TOrderController {
                     if (area != null) {
                         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 {
                     //设备为单位
                     ResponseModel<TEquipment> equipmentByClientId = szwlFeign.findEquipmentByClientId(String.valueOf(orderDaoChuDTO.getClientId()));
@@ -1251,7 +1246,7 @@ public class TOrderController {
 
     @ApiOperation(value = "订单数据导出-导出")
     @RequestMapping(value = "/onlineExport", method = RequestMethod.GET)
-    @LogAnnotation(module = "模块名称:订单", operator = "操作参数:导出订单数据")
+//    @LogAnnotation(module = "模块名称:订单", operator = "操作参数:导出订单数据")
     public Object onlineExport(HttpServletResponse response, String type, String clientId,
                                String ifForeign, String userName, String startDate,
                                String companyType, Long adminId,
@@ -1301,8 +1296,7 @@ public class TOrderController {
             }
             for (OrderDaoChuDTO orderDaoChuDTO : orderDaoChuDTOList) {
                 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) {
                     continue;
                 }
@@ -1314,16 +1308,8 @@ public class TOrderController {
                     if (area != null) {
                         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 {
                     //设备为单位
                     ResponseModel<TEquipment> equipmentByClientId = szwlFeign.findEquipmentByClientId(String.valueOf(orderDaoChuDTO.getClientId()));
@@ -1866,5 +1852,65 @@ public class TOrderController {
         orderService.updateById(order);
         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.model.bo.ResponseModel;
 import com.szwl.model.entity.*;
+import io.swagger.annotations.ApiOperation;
 import org.springframework.cloud.openfeign.FeignClient;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.PostMapping;
@@ -88,4 +89,11 @@ public interface SzwlFeign {
      */
     @GetMapping("/tAdmin/validateApiKey")
     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.szwl.model.query.OrderDaoChuParam;
 import com.szwl.model.query.OrderStatisticsDTO;
+import com.szwl.model.query.StatisticsParam;
 
 import java.util.Date;
 import java.util.List;
@@ -22,4 +23,6 @@ public interface TCoinOrderMapper extends BaseMapper<TCoinOrder> {
     List<OrderDaoChuDTO> getOrderDaoCu(OrderDaoChuParam daoChuParam);
 
     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);
 
     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') ]]>
         group by sTime
     </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>

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

@@ -407,5 +407,41 @@
         GROUP BY sTime
         ORDER BY sTime
     </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>

+ 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,爆米花")
     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,爆米花")
     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;
 
+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.OrderDaoChuDTO;
 import com.szwl.model.dto.OrderDto;
 import com.szwl.model.entity.TAdmin;
 import com.szwl.model.entity.TOrder;
-import com.baomidou.mybatisplus.extension.service.IService;
 import com.szwl.model.excel.NewOrderTarget;
 import com.szwl.model.excel.OrderTarget;
 import com.szwl.model.query.OrderStatisticsDTO;
@@ -49,4 +50,46 @@ public interface TOrderService extends IService<TOrder> {
      * @param response
      */
     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.exception.MyException;
+import cn.hutool.core.util.RandomUtil;
 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.extension.plugins.pagination.Page;
+import com.szwl.feign.SzwlFeign;
 import com.szwl.model.bean.ChartBean;
 import com.szwl.model.bean.ChartColumn;
+import com.szwl.model.bean.OrderDaoChuDTO;
 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.TCoinOrderParam;
 import com.szwl.model.query.TEquipmentParam;
 import com.szwl.model.query.TOrderParam;
 import com.szwl.model.utils.DateUtils;
+import com.szwl.service.OrderStatisticsMonthService;
+import com.szwl.service.OrderStatisticsYearService;
 import com.szwl.service.TOrderService;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.collections4.CollectionUtils;
@@ -25,12 +31,13 @@ import org.elasticsearch.client.RequestOptions;
 import org.elasticsearch.client.indices.GetIndexRequest;
 import org.elasticsearch.index.query.BoolQueryBuilder;
 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.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.Sum;
 import org.elasticsearch.search.aggregations.metrics.SumAggregationBuilder;
 import org.elasticsearch.search.builder.SearchSourceBuilder;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -57,6 +64,15 @@ public class EsTOrderService extends EsBaseService<TOrder, TOrderParam> {
     @Autowired
     EsTCoinOrderService esTCoinOrderService;
 
+    @Autowired
+    SzwlFeign szwlFeign;
+
+    @Autowired
+    OrderStatisticsMonthService orderStatisticsMonthService;
+
+    @Autowired
+    OrderStatisticsYearService orderStatisticsYearService;
+
     @Override
     public String getTableName() {
         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.fastjson.JSON;
 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.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.szwl.exception.MyException;
 import com.szwl.feign.SzwlFeign;
+import com.szwl.mapper.TCoinOrderMapper;
 import com.szwl.mapper.TOrderMapper;
 import com.szwl.model.bean.ChartBean;
 import com.szwl.model.bean.ChartColumn;
 import com.szwl.model.bean.OrderDaoChuDTO;
 import com.szwl.model.bo.ChartType;
 import com.szwl.model.bo.R;
+import com.szwl.model.bo.ResponseModel;
 import com.szwl.model.dto.OrderDto;
 import com.szwl.model.entity.*;
 import com.szwl.model.excel.NewOrderTarget;
 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.OrderStatisticsDTO;
 import com.szwl.model.query.StatisticsParam;
 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.TOrderService;
 import com.szwl.util.YunPianSms;
@@ -60,6 +67,15 @@ public class TOrderServiceImpl extends ServiceImpl<TOrderMapper, TOrder> impleme
     TOrderMapper tOrderMapper;
 
     @Autowired
+    private TCoinOrderMapper tCoinOrderMapper;
+
+    @Autowired
+    OrderStatisticsMonthService orderStatisticsMonthService;
+
+    @Autowired
+    OrderStatisticsYearService orderStatisticsYearService;
+
+    @Autowired
     SzwlFeign szwlFeign;
 
     @Autowired
@@ -586,6 +602,883 @@ public class TOrderServiceImpl extends ServiceImpl<TOrderMapper, TOrder> impleme
         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) {
         String message = "";
         if (StringUtils.isNotEmpty(customerPhone) && customerPhone.length() > 3) {