瀏覽代碼

订单统计

liu_lake 4 月之前
父節點
當前提交
726d875203

+ 4 - 0
db/db-merchant/src/main/java/pay/platform/domain/PayOrder.java

@@ -58,6 +58,10 @@ public class PayOrder {
     private String channelId;
     @Column(value = "channel_name")
     private String channelName;
+    @Column(value = "merchant_name")
+    private String merchantName;
+    @Column(value = "agent_name")
+    private String agentName;
 
     /**
      * 平台订单号

+ 16 - 0
web/admin-api/src/main/java/pay/platform/api/system/controller/PayOrderController.java

@@ -11,6 +11,7 @@ import pay.platform.api.system.model.query.PayOrderQuery;
 import pay.platform.api.system.model.vo.HomeVO;
 import pay.platform.api.system.model.vo.PayOrderVO;
 import pay.platform.api.system.servcie.PayOrderService;
+import pay.platform.api.system.servcie.PayOrderTotalService;
 import pay.platform.core.common.Result;
 import pay.platform.core.common.domain.BasePage;
 import pay.platform.domain.PayOrder;
@@ -31,6 +32,8 @@ public class PayOrderController {
 
     @Autowired
     private PayOrderService PayOrderService;
+    @Autowired
+    private PayOrderTotalService payOrderTotalService;
 
     /**
      * 添加 订单
@@ -144,6 +147,19 @@ public class PayOrderController {
         return Result.OK(PayOrderService.getById(id));
     }
 
+    /**
+     * 订单统计
+     *
+     * @param query
+     * @return
+     */
+    @GetMapping("/orderTotal")
+    @Operation(summary = "订单统计")
+    public Result<List<HomeVO>> orderTotal(@ParameterObject PayOrderQuery query) {
+        var payOrder = payOrderTotalService.orderTotal(query);
+        return Result.OK(payOrder);
+    }
+
 
     /**
      * 分页查询订单

+ 2 - 2
web/admin-api/src/main/java/pay/platform/api/system/model/query/PayOrderQuery.java

@@ -45,13 +45,13 @@ public class PayOrderQuery extends BasePageQuery {
      * 代理用户ID
      */
     @Schema(description = "代理用户ID")
-    private Long agentId;
+    private String agentId;
 
     /**
      * 商户用户ID
      */
     @Schema(description = "商户用户ID")
-    private Long merchantId;
+    private String merchantId;
 
     /**
      * 金额

+ 23 - 10
web/admin-api/src/main/java/pay/platform/api/system/model/vo/HomeVO.java

@@ -1,6 +1,5 @@
 package pay.platform.api.system.model.vo;
 
-import lombok.AllArgsConstructor;
 import lombok.Builder;
 import lombok.Data;
 import lombok.NoArgsConstructor;
@@ -14,22 +13,36 @@ import lombok.NoArgsConstructor;
 @Data
 @Builder
 @NoArgsConstructor
-@AllArgsConstructor
 public class HomeVO {
 
-    private TotalVO today;
-    private TotalVO yesterday;
-    private TotalVO lastWeek;
-    private TotalVO lastMonth;
+    private String merchantName;
+    private TotalVO today = new TotalVO();
+    private TotalVO yesterday = new TotalVO();
+    private TotalVO lastWeek = new TotalVO();
+    private TotalVO lastMonth = new TotalVO();
+
+
+    public HomeVO(String merchantName, TotalVO today, TotalVO yesterday, TotalVO lastWeek, TotalVO lastMonth) {
+        this.merchantName = merchantName;
+        this.today = today;
+        this.yesterday = yesterday;
+        this.lastWeek = lastWeek;
+        this.lastMonth = lastMonth;
+    }
 
     @Data
-    @AllArgsConstructor
     @NoArgsConstructor
     @Builder
     public static class TotalVO {
 
-        private QuantityVO quantity;
-        private AmountVO amount;
-        private EarningsVO earnings;
+        private QuantityVO quantity = new QuantityVO();
+        private AmountVO amount = new AmountVO();
+        private EarningsVO earnings = new EarningsVO();
+
+        public TotalVO(QuantityVO quantity, AmountVO amount, EarningsVO earnings) {
+            this.quantity = quantity;
+            this.amount = amount;
+            this.earnings = earnings;
+        }
     }
 }

+ 27 - 0
web/admin-api/src/main/java/pay/platform/api/system/servcie/PayOrderTotalService.java

@@ -0,0 +1,27 @@
+package pay.platform.api.system.servcie;
+
+
+import com.mybatisflex.core.service.IService;
+import pay.platform.api.system.model.query.PayOrderQuery;
+import pay.platform.api.system.model.vo.HomeVO;
+import pay.platform.domain.PayOrder;
+
+import java.util.List;
+
+/**
+ * 通道管理 服务层。
+ *
+ * @author mybatis-flex-helper automatic generation
+ * @since 1.0
+ */
+public interface PayOrderTotalService extends IService<PayOrder> {
+
+
+    /**
+     * 订单统计
+     *
+     * @param payOrderRequest
+     * @return
+     */
+    List<HomeVO> orderTotal(PayOrderQuery payOrderRequest);
+}

+ 136 - 0
web/admin-api/src/main/java/pay/platform/api/system/servcie/impl/PayOrderTotalServiceImpl.java

@@ -0,0 +1,136 @@
+package pay.platform.api.system.servcie.impl;
+
+
+import com.mybatisflex.core.query.QueryColumn;
+import com.mybatisflex.core.query.QueryMethods;
+import com.mybatisflex.core.query.QueryWrapper;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.stereotype.Service;
+import org.springframework.util.CollectionUtils;
+import pay.platform.api.system.model.query.PayOrderQuery;
+import pay.platform.api.system.model.vo.AmountVO;
+import pay.platform.api.system.model.vo.EarningsVO;
+import pay.platform.api.system.model.vo.HomeVO;
+import pay.platform.api.system.model.vo.HomeVO.TotalVO;
+import pay.platform.api.system.model.vo.QuantityVO;
+import pay.platform.api.system.servcie.PayOrderTotalService;
+import pay.platform.core.common.domain.BaseService;
+import pay.platform.domain.PayOrder;
+import pay.platform.domain.table.PayAgentTableDef;
+import pay.platform.domain.table.PayOrderTableDef;
+import pay.platform.mapper.PayOrderMapper;
+
+import java.text.DecimalFormat;
+import java.util.Calendar;
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+ * 通道管理 服务层实现。
+ *
+ * @author mybatis-flex-helper automatic generation
+ * @since 1.0
+ */
+@Service
+public class PayOrderTotalServiceImpl extends BaseService<PayOrderMapper, PayOrder> implements PayOrderTotalService {
+
+
+    public QueryWrapper getQueryWrapper(PayOrderQuery payOrderRequest, Calendar calendar, int period, QueryColumn queryColumn) {
+        //当天支付
+        QueryWrapper queryWrapper = QueryWrapper.create().from(PayOrderTableDef.PAY_ORDER).where("1 = 1")
+                .select(PayOrderTableDef.PAY_ORDER.STATUS, PayAgentTableDef.PAY_AGENT.USER_NAME.as("merchantName"), PayOrderTableDef.PAY_ORDER.AGENT_ID, QueryMethods.sum(PayOrderTableDef.PAY_ORDER.AMOUNT).as("amount"),
+                        QueryMethods.sum(PayOrderTableDef.PAY_ORDER.PLATFORM_RATE_AMOUNT).as("platformRateAmount"),
+                        QueryMethods.count(PayOrderTableDef.PAY_ORDER.STATUS).as("day")
+                ).leftJoin(PayAgentTableDef.PAY_AGENT).on(queryWrapper1 -> queryWrapper1.and(PayAgentTableDef.PAY_AGENT.ID.eq(PayOrderTableDef.PAY_ORDER.AGENT_ID)))
+                .and(PayOrderTableDef.PAY_ORDER.YEAR.eq(calendar.get(Calendar.YEAR)))
+                .and(PayOrderTableDef.PAY_ORDER.AGENT_ID.eq(payOrderRequest.getAgentId(), StringUtils.isNotBlank(payOrderRequest.getAgentId())))
+                .and(queryColumn.eq(calendar.get(period)))
+                .groupBy(PayOrderTableDef.PAY_ORDER.STATUS, PayOrderTableDef.PAY_ORDER.AGENT_ID, PayAgentTableDef.PAY_AGENT.USER_NAME);
+        return queryWrapper;
+    }
+
+    @Override
+    public List<HomeVO> orderTotal(PayOrderQuery payOrderRequest) {
+        Calendar calendar = Calendar.getInstance();
+        //当天支付
+        var today = getResult(getQueryWrapper(payOrderRequest, calendar, Calendar.DAY_OF_YEAR, PayOrderTableDef.PAY_ORDER.DAY));
+        var todayMap = today.stream().collect(Collectors.groupingBy(Result::merchantId));
+
+        //前一天支付
+        calendar = Calendar.getInstance();
+        calendar.set(Calendar.DAY_OF_YEAR, calendar.get(Calendar.DAY_OF_YEAR) - 1);
+        var yesterday = getResult(getQueryWrapper(payOrderRequest, calendar, Calendar.DAY_OF_YEAR, PayOrderTableDef.PAY_ORDER.DAY));
+        var yesterdayMap = yesterday.stream().collect(Collectors.groupingBy(Result::merchantId));
+
+
+        //周支付
+        calendar = Calendar.getInstance();
+        var lastWeek = getResult(getQueryWrapper(payOrderRequest, calendar, Calendar.WEEK_OF_YEAR, PayOrderTableDef.PAY_ORDER.WEEK));
+        var lastWeekMap = lastWeek.stream().collect(Collectors.groupingBy(Result::merchantId));
+
+
+        //月支付
+        calendar = Calendar.getInstance();
+        calendar.set(Calendar.MONTH, calendar.get(Calendar.MONTH) + 1);
+        var lastMonth = getResult(getQueryWrapper(payOrderRequest, calendar, Calendar.MONTH, PayOrderTableDef.PAY_ORDER.MONTH));
+        var lastMonthMap = lastMonth.stream().collect(Collectors.groupingBy(Result::merchantId));
+
+        return lastMonthMap.entrySet().stream().map(item -> {
+            HomeVO homeVO = new HomeVO();
+            var merchantToday = todayMap.get(item.getKey());
+            if (!CollectionUtils.isEmpty(merchantToday)) {
+                var result = merchantToday.get(0);
+                homeVO.setToday(new TotalVO(new QuantityVO(result.payCount(), result.paySuccessCount()), new AmountVO(result.payAmount(), result.paySuccessAmount()), new EarningsVO(result.dayFee(), result.dayFee())));
+            }
+            var merchantYesterday = yesterdayMap.get(item.getKey());
+            if (!CollectionUtils.isEmpty(merchantYesterday)) {
+                var result = merchantYesterday.get(0);
+                homeVO.setYesterday(new TotalVO(new QuantityVO(result.payCount(), result.paySuccessCount()), new AmountVO(result.payAmount(), result.paySuccessAmount()), new EarningsVO(result.dayFee(), result.dayFee())));
+            }
+            var merchantLastWeek = lastWeekMap.get(item.getKey());
+            if (!CollectionUtils.isEmpty(merchantLastWeek)) {
+                var result = merchantLastWeek.get(0);
+                homeVO.setLastWeek(new TotalVO(new QuantityVO(result.payCount(), result.paySuccessCount()), new AmountVO(result.payAmount(), result.paySuccessAmount()), new EarningsVO(result.dayFee(), result.dayFee())));
+            }
+            var merchantLastMonth = lastMonthMap.get(item.getKey());
+            if (!CollectionUtils.isEmpty(merchantLastMonth)) {
+                var result = merchantLastMonth.get(0);
+                homeVO.setMerchantName(result.merchantName());
+                homeVO.setLastMonth(new TotalVO(new QuantityVO(result.payCount(), result.paySuccessCount()), new AmountVO(result.payAmount(), result.paySuccessAmount()), new EarningsVO(result.dayFee(), result.dayFee())));
+
+            }
+            return homeVO;
+        }).collect(Collectors.toList());
+
+    }
+
+    private List<Result> getResult(QueryWrapper queryWrapper) {
+        var payOrderList = mapper.selectListByQuery(queryWrapper);
+
+        var merchantOrders = payOrderList.stream().collect(Collectors.groupingBy(PayOrder::getAgentId));
+        return merchantOrders.entrySet().stream().map(merchantOrder -> {
+            var payOrders = merchantOrder.getValue();
+            //统计当天支付订单总数
+            var payCount = payOrders.stream().collect(Collectors.summarizingDouble(PayOrder::getDay)).getSum();
+            //统计当天成功支付订单总数
+            var paySuccessCount = payOrders.stream().filter(item -> item.getStatus() == 1).collect(Collectors.summarizingDouble(PayOrder::getDay)).getSum();
+            //统计支付金额
+            var payAmount = payOrders.stream().collect(Collectors.summarizingDouble(payOrder -> payOrder.getAmount().doubleValue())).getSum();
+            var paySuccessAmount = payOrders.stream().filter(item -> item.getStatus() == 1).collect(Collectors.summarizingDouble(payOrder -> payOrder.getAmount().doubleValue())).getSum();
+            DecimalFormat decimalFormat = new DecimalFormat("0.00");
+            payAmount = Double.parseDouble(decimalFormat.format(payAmount));
+            paySuccessAmount = Double.parseDouble(decimalFormat.format(paySuccessAmount));
+            //统计当天成功支付订单平台费率金额
+            var dayFee = payOrders.stream().filter(item -> item.getStatus() == 1).collect(Collectors.summarizingDouble(payOrder -> payOrder.getPlatformRateAmount().doubleValue())).getSum();
+            dayFee = Double.parseDouble(decimalFormat.format(dayFee));
+            return new Result(merchantOrder.getKey(), payOrders.getFirst().getMerchantName(), payCount, paySuccessCount, payAmount, paySuccessAmount, dayFee);
+
+        }).collect(Collectors.toList());
+    }
+
+    private record Result(String merchantId, String merchantName, double payCount, double paySuccessCount,
+                          double payAmount,
+                          double paySuccessAmount,
+                          double dayFee) {
+    }
+}

+ 12 - 74
web/agent-api/src/main/java/pay/platform/api/system/controller/PayOrderController.java

@@ -1,23 +1,19 @@
 package pay.platform.api.system.controller;
 
-import com.mybatisflex.core.query.QueryWrapper;
 import io.swagger.v3.oas.annotations.Operation;
-import io.swagger.v3.oas.annotations.Parameter;
-import io.swagger.v3.oas.annotations.Parameters;
 import io.swagger.v3.oas.annotations.tags.Tag;
 import org.springdoc.core.annotations.ParameterObject;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.web.bind.annotation.*;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
 import pay.platform.api.system.model.query.PayOrderQuery;
+import pay.platform.api.system.model.vo.HomeVO;
 import pay.platform.api.system.model.vo.PayOrderVO;
 import pay.platform.api.system.servcie.PayOrderService;
 import pay.platform.core.common.Result;
 import pay.platform.core.common.domain.BasePage;
-import pay.platform.core.security.util.SecurityUtil;
-import pay.platform.domain.PayOrder;
-import pay.platform.domain.table.PayOrderTableDef;
 
-import java.io.Serializable;
 import java.util.List;
 
 /**
@@ -34,75 +30,17 @@ public class PayOrderController {
     @Autowired
     private PayOrderService PayOrderService;
 
-    /**
-     * 添加 订单
-     *
-     * @param PayOrder 订单
-     * @return Result<{ @ code true } 添加成功 , { @ code false } 添加失败
-     */
-    @PostMapping("/save")
-    @Operation(summary = "添加订单")
-    public Result<Boolean> save(@RequestBody PayOrder PayOrder) {
-        PayOrder.setAgentId(SecurityUtil.getCurrentUser().getUserid());
-        return Result.OK(PayOrderService.save(PayOrder));
-    }
-
-
-    /**
-     * 根据主键删除订单
-     *
-     * @param id 主键
-     * @return Result<{ @ code true } 删除成功 , { @ code false } 删除失败
-     */
-    @DeleteMapping("/remove/{id}")
-    @Operation(summary = "根据主键删除订单")
-    @Parameters(value = {
-            @Parameter(name = "id", description = "id", required = true)
-    })
-    public Result<Boolean> remove(@PathVariable Serializable id) {
-        return Result.OK(PayOrderService.removeById(id));
-    }
-
-
-    /**
-     * 根据主键更新订单
-     *
-     * @param PayOrder 订单
-     * @return Result<{ @ code true } 更新成功 , { @ code false } 更新失败
-     */
-    @PutMapping("/update")
-    @Operation(summary = "根据主键更新订单")
-    public Result<Boolean> update(@RequestBody PayOrder PayOrder) {
-        return Result.OK(PayOrderService.updateById(PayOrder));
-    }
-
-
-    /**
-     * 查询所有订单
-     *
-     * @return Result<所有数据
-     */
-    @GetMapping("/list")
-    @Operation(summary = "查询所有订单")
-    public Result<List<PayOrder>> list() {
-        QueryWrapper queryWrapper = new QueryWrapper().eq(String.valueOf(PayOrderTableDef.PAY_ORDER.AGENT_ID), SecurityUtil.getCurrentUser().getUserid());
-        return Result.OK(PayOrderService.list(queryWrapper));
-    }
-
 
     /**
-     * 根据订单主键获取详细信息。
-     *
-     * @param id PayOrder主键
-     * @return Result<订单详情
+     * 订单统计
+     * @param query
+     * @return
      */
-    @GetMapping("/getInfo/{id}")
-    @Operation(summary = "根据订单主键获取详细信息")
-    @Parameters(value = {
-            @Parameter(name = "id", description = "id", required = true)
-    })
-    public Result<PayOrder> getInfo(@PathVariable Serializable id) {
-        return Result.OK(PayOrderService.getById(id));
+    @GetMapping("/orderTotal")
+    @Operation(summary = "订单统计")
+    public Result<List<HomeVO>> orderTotal(@ParameterObject PayOrderQuery query) {
+        var payOrder = PayOrderService.orderTotal(query);
+        return Result.OK(payOrder);
     }
 
 

+ 2 - 2
web/agent-api/src/main/java/pay/platform/api/system/model/request/PayOrderRequest.java

@@ -45,13 +45,13 @@ public class PayOrderRequest {
      * 代理用户ID
      */
     @Schema(description = "代理用户ID")
-    private Long agentId;
+    private String agentId;
 
     /**
      * 商户用户ID
      */
     @Schema(description = "商户用户ID")
-    private Long merchantId;
+    private String merchantId;
 
     /**
      * 金额

+ 18 - 0
web/agent-api/src/main/java/pay/platform/api/system/model/vo/AmountVO.java

@@ -0,0 +1,18 @@
+package pay.platform.api.system.model.vo;
+
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ *
+ **/
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+@Builder
+public class AmountVO {
+    private double total;
+    private double valid;
+}

+ 18 - 0
web/agent-api/src/main/java/pay/platform/api/system/model/vo/EarningsVO.java

@@ -0,0 +1,18 @@
+package pay.platform.api.system.model.vo;
+
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ *
+ **/
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+@Builder
+public class EarningsVO {
+    private double total;
+    private double valid;
+}

+ 47 - 0
web/agent-api/src/main/java/pay/platform/api/system/model/vo/HomeVO.java

@@ -0,0 +1,47 @@
+package pay.platform.api.system.model.vo;
+
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ * 通道管理 实体类。
+ *
+ * @author mybatis-flex-helper automatic generation
+ * @since 1.0
+ */
+@Data
+@Builder
+@NoArgsConstructor
+public class HomeVO {
+    private String merchantName;
+    private TotalVO today = new TotalVO();
+    private TotalVO yesterday = new TotalVO();
+    private TotalVO lastWeek = new TotalVO();
+    private TotalVO lastMonth = new TotalVO();
+
+
+    public HomeVO(String merchantName, TotalVO today, TotalVO yesterday, TotalVO lastWeek, TotalVO lastMonth) {
+        this.merchantName = merchantName;
+        this.today = today;
+        this.yesterday = yesterday;
+        this.lastWeek = lastWeek;
+        this.lastMonth = lastMonth;
+    }
+
+    @Data
+    @NoArgsConstructor
+    @Builder
+    public static class TotalVO {
+
+        private QuantityVO quantity = new QuantityVO();
+        private AmountVO amount = new AmountVO();
+        private EarningsVO earnings = new EarningsVO();
+
+        public TotalVO(QuantityVO quantity, AmountVO amount, EarningsVO earnings) {
+            this.quantity = quantity;
+            this.amount = amount;
+            this.earnings = earnings;
+        }
+    }
+}

+ 18 - 0
web/agent-api/src/main/java/pay/platform/api/system/model/vo/QuantityVO.java

@@ -0,0 +1,18 @@
+package pay.platform.api.system.model.vo;
+
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ *
+ **/
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+@Builder
+public class QuantityVO {
+    private double total;
+    private double valid;
+}

+ 12 - 0
web/agent-api/src/main/java/pay/platform/api/system/servcie/PayOrderService.java

@@ -3,10 +3,13 @@ package pay.platform.api.system.servcie;
 
 import com.mybatisflex.core.service.IService;
 import pay.platform.api.system.model.query.PayOrderQuery;
+import pay.platform.api.system.model.vo.HomeVO;
 import pay.platform.api.system.model.vo.PayOrderVO;
 import pay.platform.core.common.domain.BasePage;
 import pay.platform.domain.PayOrder;
 
+import java.util.List;
+
 /**
  * 通道管理 服务层。
  *
@@ -15,4 +18,13 @@ import pay.platform.domain.PayOrder;
  */
 public interface PayOrderService extends IService<PayOrder> {
     BasePage<PayOrderVO> queryPage(PayOrderQuery query);
+
+
+    /**
+     * 订单统计
+     *
+     * @param payOrderRequest
+     * @return
+     */
+    List<HomeVO> orderTotal(PayOrderQuery payOrderRequest);
 }

+ 110 - 1
web/agent-api/src/main/java/pay/platform/api/system/servcie/impl/PayOrderServiceImpl.java

@@ -3,20 +3,29 @@ package pay.platform.api.system.servcie.impl;
 
 import cn.hutool.core.bean.BeanUtil;
 import com.mybatisflex.core.paginate.Page;
+import com.mybatisflex.core.query.QueryColumn;
+import com.mybatisflex.core.query.QueryMethods;
 import com.mybatisflex.core.query.QueryWrapper;
 import com.mybatisflex.core.util.StringUtil;
+import org.apache.commons.lang3.StringUtils;
 import org.springframework.stereotype.Service;
+import org.springframework.util.CollectionUtils;
 import pay.platform.api.system.model.query.PayOrderQuery;
-import pay.platform.api.system.model.vo.PayOrderVO;
+import pay.platform.api.system.model.vo.*;
+import pay.platform.api.system.model.vo.HomeVO.TotalVO;
 import pay.platform.api.system.servcie.PayOrderService;
 import pay.platform.core.common.domain.BasePage;
 import pay.platform.core.common.domain.BaseService;
 import pay.platform.core.security.util.SecurityUtil;
 import pay.platform.domain.PayOrder;
+import pay.platform.domain.table.PayMerchantTableDef;
 import pay.platform.domain.table.PayOrderTableDef;
 import pay.platform.mapper.PayOrderMapper;
 
+import java.text.DecimalFormat;
+import java.util.Calendar;
 import java.util.List;
+import java.util.stream.Collectors;
 
 /**
  * 通道管理 服务层实现。
@@ -39,4 +48,104 @@ public class PayOrderServiceImpl extends BaseService<PayOrderMapper, PayOrder> i
         List<PayOrderVO> vos = BeanUtil.copyToList(page.getRecords(), PayOrderVO.class);
         return new BasePage<>(page.getPageNumber(), page.getPageSize(), page.getTotalRow(), vos);
     }
+
+
+    public QueryWrapper getQueryWrapper(PayOrderQuery payOrderRequest, Calendar calendar, int period, QueryColumn queryColumn) {
+        //当天支付
+        QueryWrapper queryWrapper = QueryWrapper.create().from(PayOrderTableDef.PAY_ORDER).where("1 = 1")
+                .select(PayOrderTableDef.PAY_ORDER.STATUS, PayMerchantTableDef.PAY_MERCHANT.USER_NAME.as("merchantName"), PayOrderTableDef.PAY_ORDER.MERCHANT_ID, QueryMethods.sum(PayOrderTableDef.PAY_ORDER.AMOUNT).as("amount"),
+                        QueryMethods.sum(PayOrderTableDef.PAY_ORDER.PLATFORM_RATE_AMOUNT).as("platformRateAmount"),
+                        QueryMethods.count(PayOrderTableDef.PAY_ORDER.STATUS).as("day")
+                ).leftJoin(PayMerchantTableDef.PAY_MERCHANT).on(queryWrapper1 -> queryWrapper1.and(PayMerchantTableDef.PAY_MERCHANT.ID.eq(PayOrderTableDef.PAY_ORDER.MERCHANT_ID)))
+                .and(PayOrderTableDef.PAY_ORDER.YEAR.eq(calendar.get(Calendar.YEAR)))
+                .and(PayOrderTableDef.PAY_ORDER.MERCHANT_ID.eq(payOrderRequest.getMerchantId(), StringUtils.isNotBlank(payOrderRequest.getMerchantId())))
+                .and(queryColumn.eq(calendar.get(period)))
+                .groupBy(PayOrderTableDef.PAY_ORDER.STATUS, PayOrderTableDef.PAY_ORDER.MERCHANT_ID, PayMerchantTableDef.PAY_MERCHANT.USER_NAME);
+        return queryWrapper;
+    }
+
+    @Override
+    public List<HomeVO> orderTotal(PayOrderQuery payOrderRequest) {
+        Calendar calendar = Calendar.getInstance();
+        //当天支付
+        var today = getResult(getQueryWrapper(payOrderRequest, calendar, Calendar.DAY_OF_YEAR, PayOrderTableDef.PAY_ORDER.DAY));
+        var todayMap = today.stream().collect(Collectors.groupingBy(Result::merchantId));
+
+        //前一天支付
+        calendar = Calendar.getInstance();
+        calendar.set(Calendar.DAY_OF_YEAR, calendar.get(Calendar.DAY_OF_YEAR) - 1);
+        var yesterday = getResult(getQueryWrapper(payOrderRequest, calendar, Calendar.DAY_OF_YEAR, PayOrderTableDef.PAY_ORDER.DAY));
+        var yesterdayMap = yesterday.stream().collect(Collectors.groupingBy(Result::merchantId));
+
+
+        //周支付
+        calendar = Calendar.getInstance();
+        var lastWeek = getResult(getQueryWrapper(payOrderRequest, calendar, Calendar.WEEK_OF_YEAR, PayOrderTableDef.PAY_ORDER.WEEK));
+        var lastWeekMap = lastWeek.stream().collect(Collectors.groupingBy(Result::merchantId));
+
+
+        //月支付
+        calendar = Calendar.getInstance();
+        calendar.set(Calendar.MONTH, calendar.get(Calendar.MONTH) + 1);
+        var lastMonth = getResult(getQueryWrapper(payOrderRequest, calendar, Calendar.MONTH, PayOrderTableDef.PAY_ORDER.MONTH));
+        var lastMonthMap = lastMonth.stream().collect(Collectors.groupingBy(Result::merchantId));
+
+        return lastMonthMap.entrySet().stream().map(item -> {
+            HomeVO homeVO = new HomeVO();
+            var merchantToday = todayMap.get(item.getKey());
+            if (!CollectionUtils.isEmpty(merchantToday)) {
+                var result = merchantToday.get(0);
+                homeVO.setToday(new TotalVO(new QuantityVO(result.payCount(), result.paySuccessCount()), new AmountVO(result.payAmount(), result.paySuccessAmount()), new EarningsVO(result.dayFee(), result.dayFee())));
+            }
+            var merchantYesterday = yesterdayMap.get(item.getKey());
+            if (!CollectionUtils.isEmpty(merchantYesterday)) {
+                var result = merchantYesterday.get(0);
+                homeVO.setYesterday(new TotalVO(new QuantityVO(result.payCount(), result.paySuccessCount()), new AmountVO(result.payAmount(), result.paySuccessAmount()), new EarningsVO(result.dayFee(), result.dayFee())));
+            }
+            var merchantLastWeek = lastWeekMap.get(item.getKey());
+            if (!CollectionUtils.isEmpty(merchantLastWeek)) {
+                var result = merchantLastWeek.get(0);
+                homeVO.setLastWeek(new TotalVO(new QuantityVO(result.payCount(), result.paySuccessCount()), new AmountVO(result.payAmount(), result.paySuccessAmount()), new EarningsVO(result.dayFee(), result.dayFee())));
+            }
+            var merchantLastMonth = lastMonthMap.get(item.getKey());
+            if (!CollectionUtils.isEmpty(merchantLastMonth)) {
+                var result = merchantLastMonth.get(0);
+                homeVO.setMerchantName(result.merchantName());
+                homeVO.setLastMonth(new TotalVO(new QuantityVO(result.payCount(), result.paySuccessCount()), new AmountVO(result.payAmount(), result.paySuccessAmount()), new EarningsVO(result.dayFee(), result.dayFee())));
+
+            }
+            return homeVO;
+        }).collect(Collectors.toList());
+
+    }
+
+    private List<Result> getResult(QueryWrapper queryWrapper) {
+        var payOrderList = mapper.selectListByQuery(queryWrapper);
+
+        var merchantOrders = payOrderList.stream().collect(Collectors.groupingBy(PayOrder::getMerchantId));
+        return merchantOrders.entrySet().stream().map(merchantOrder -> {
+            var payOrders = merchantOrder.getValue();
+            //统计当天支付订单总数
+            var payCount = payOrders.stream().collect(Collectors.summarizingDouble(PayOrder::getDay)).getSum();
+            //统计当天成功支付订单总数
+            var paySuccessCount = payOrders.stream().filter(item -> item.getStatus() == 1).collect(Collectors.summarizingDouble(PayOrder::getDay)).getSum();
+            //统计支付金额
+            var payAmount = payOrders.stream().collect(Collectors.summarizingDouble(payOrder -> payOrder.getAmount().doubleValue())).getSum();
+            var paySuccessAmount = payOrders.stream().filter(item -> item.getStatus() == 1).collect(Collectors.summarizingDouble(payOrder -> payOrder.getAmount().doubleValue())).getSum();
+            DecimalFormat decimalFormat = new DecimalFormat("0.00");
+            payAmount = Double.parseDouble(decimalFormat.format(payAmount));
+            paySuccessAmount = Double.parseDouble(decimalFormat.format(paySuccessAmount));
+            //统计当天成功支付订单平台费率金额
+            var dayFee = payOrders.stream().filter(item -> item.getStatus() == 1).collect(Collectors.summarizingDouble(payOrder -> payOrder.getPlatformRateAmount().doubleValue())).getSum();
+            dayFee = Double.parseDouble(decimalFormat.format(dayFee));
+            return new Result(merchantOrder.getKey(), payOrders.getFirst().getMerchantName(), payCount, paySuccessCount, payAmount, paySuccessAmount, dayFee);
+
+        }).collect(Collectors.toList());
+    }
+
+    private record Result(String merchantId, String merchantName, double payCount, double paySuccessCount,
+                          double payAmount,
+                          double paySuccessAmount,
+                          double dayFee) {
+    }
 }