فهرست منبع

新增订单统计接口

hjp 2 ماه پیش
والد
کامیت
f706d494a3

+ 39 - 0
src/main/java/com/sqx/common/utils/DateUtils.java

@@ -7,7 +7,9 @@ import org.joda.time.format.DateTimeFormat;
 import org.joda.time.format.DateTimeFormatter;
 
 import java.text.SimpleDateFormat;
+import java.util.ArrayList;
 import java.util.Date;
+import java.util.List;
 
 /**
  * 日期处理
@@ -73,6 +75,43 @@ public class DateUtils {
         return new Date[]{beginDate, endDate};
     }
 
+    /**
+     * 根据周数获取一周的日期集合
+     * @param week 周期  0本周,-1上周,-2上上周,1下周,2下下周
+     * @return
+     */
+    public static List<String> getWeekDays(int week) {
+        DateTime dateTime = new DateTime().plusWeeks(week);
+        LocalDate monday = new LocalDate(dateTime.withDayOfWeek(1)); // 周一
+        List<String> days = new ArrayList<>();
+        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
+
+        for (int i = 0; i < 7; i++) {
+            Date day = monday.plusDays(i).toDate();
+            days.add(sdf.format(day));
+        }
+
+        return days;
+    }
+
+    public static List<String> getLastYearWeekDays(){
+        // 当前时间 - 1 年
+        DateTime dateTime = new DateTime().minusYears(1);
+
+        // 找到那一周的周一
+        LocalDate monday = new LocalDate(dateTime.withDayOfWeek(1));
+
+        List<String> days = new ArrayList<>();
+        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
+
+        for (int i = 0; i < 7; i++) {
+            Date day = monday.plusDays(i).toDate();
+            days.add(sdf.format(day));
+        }
+
+        return days;
+    }
+
     /**
      * 对日期的【秒】进行加/减
      *

+ 1 - 0
src/main/java/com/sqx/config/ShiroConfig.java

@@ -77,6 +77,7 @@ public class ShiroConfig {
         filterMap.put("/app/car/**","anon");
         filterMap.put("/app/userRealnameInfo/**","anon");
         filterMap.put("/common/**","anon");
+        filterMap.put("/app/orderStatistics/**","anon");
         // FIXME: END 2025/5/14 0014
         //filterMap.put("/app/userinfo","anon");
         filterMap.put("/**", "oauth2");

+ 1 - 0
src/main/java/com/sqx/modules/file/AliFileUploadController.java

@@ -47,6 +47,7 @@ public class AliFileUploadController {
     @ApiOperation("文件上传")
     @ResponseBody
     public Result upload(@RequestParam("file") MultipartFile file){
+        log.info("文件类型:" + FileUploadUtils.getExtension(file));
         String value = commonRepository.findOne(234).getValue();
         if("1".equals(value)){
             // 创建OSSClient实例。

+ 44 - 0
src/main/java/com/sqx/modules/orders/controller/app/OrderStatisticsController.java

@@ -0,0 +1,44 @@
+package com.sqx.modules.orders.controller.app;
+
+import com.sqx.common.utils.Result;
+import com.sqx.modules.app.annotation.Login;
+import com.sqx.modules.orders.service.OrderStatisticsService;
+import com.sqx.modules.orders.service.OrdersService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestAttribute;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+
+@RestController
+@Api(value = "订单统计-用户端", tags = {"订单统计-用户端"})
+@RequestMapping("/app/orderStatistics")
+public class OrderStatisticsController {
+
+    @Resource
+    private OrderStatisticsService orderStatisticsService;
+
+    @Login
+    @GetMapping("/getStatistics")
+    @ApiOperation("获取统计数据")
+    private Result getStatistics(@RequestAttribute("userId")Long userId, String startTime, String endTime){
+        return Result.success().put("data",orderStatisticsService.getStatistics(userId,startTime,endTime));
+    }
+
+    @Login
+    @GetMapping("/getTrend")
+    @ApiOperation("获取统计数据")
+    private Result getTrendWeek(@RequestAttribute("userId")Long userId,String choose){
+        return Result.success().put("data",orderStatisticsService.getTrend(userId,choose));
+    }
+
+    @Login
+    @GetMapping("/getYoYandQoQ")
+    @ApiOperation("获取同比环比数据")
+    private Result getYoYandQoQ(@RequestAttribute("userId")Long userId,String choose){
+        return Result.success().put("data",orderStatisticsService.getYoYandQoQ(userId,choose));
+    }
+}

+ 23 - 0
src/main/java/com/sqx/modules/orders/dao/OrderStatisticsDao.java

@@ -0,0 +1,23 @@
+package com.sqx.modules.orders.dao;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.sqx.modules.orders.entity.Orders;
+import com.sqx.modules.orders.vo.OrderStatisticsVo;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+@Mapper
+public interface OrderStatisticsDao extends BaseMapper<Orders> {
+
+    OrderStatisticsVo getStatistics(@Param("driverUserId") Long driverUserId, @Param("startTime") String startTime, @Param("endTime") String endTime, @Param("getDate") Integer getDate);
+
+    List<OrderStatisticsVo> getTrendDay(@Param("driverUserId") Long driverUserId);
+
+    List<OrderStatisticsVo> getTrendWeek(@Param("driverUserId") Long driverUserId);
+
+    List<OrderStatisticsVo> getTrendMonth(@Param("driverUserId") Long driverUserId);
+
+    List<OrderStatisticsVo> getOrders(@Param("driverUserId") Long driverUserId, @Param("startTime") String startTime, @Param("endTime") String endTime);
+}

+ 17 - 0
src/main/java/com/sqx/modules/orders/service/OrderStatisticsService.java

@@ -0,0 +1,17 @@
+package com.sqx.modules.orders.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.sqx.modules.orders.entity.Orders;
+import com.sqx.modules.orders.vo.OrderStatisticsVo;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+public interface OrderStatisticsService extends IService<Orders> {
+
+    OrderStatisticsVo getStatistics(Long driverUserId, String startTime, String endTime);
+
+    List<OrderStatisticsVo> getTrend(Long driverUserId,String choose);
+
+    List<OrderStatisticsVo> getYoYandQoQ(Long driverUserId,String choose);
+}

+ 204 - 0
src/main/java/com/sqx/modules/orders/service/impl/OrderStatisticsServiceImpl.java

@@ -0,0 +1,204 @@
+package com.sqx.modules.orders.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.sqx.common.utils.DateUtils;
+import com.sqx.modules.orders.dao.OrderStatisticsDao;
+import com.sqx.modules.orders.dao.OrdersDao;
+import com.sqx.modules.orders.entity.Orders;
+import com.sqx.modules.orders.service.OrderStatisticsService;
+import com.sqx.modules.orders.vo.OrderStatisticsVo;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.ibatis.annotations.Param;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import java.time.LocalDate;
+import java.time.format.DateTimeFormatter;
+import java.util.*;
+import java.util.stream.Collectors;
+
+@Slf4j
+@Service
+public class OrderStatisticsServiceImpl extends ServiceImpl<OrdersDao, Orders> implements OrderStatisticsService {
+    @Resource
+    private OrderStatisticsDao orderStatisticsDao;
+
+    @Override
+    public OrderStatisticsVo getStatistics(Long driverUserId,String startTime, String endTime){
+        //getDate == 0 今天数据  getDate == 1 昨天数据 getDate == 2  根据时间范围查询
+        //**Symbol 0-升高  1-下降 2-没变
+        if (null == startTime || startTime == ""){
+            OrderStatisticsVo today = orderStatisticsDao.getStatistics(driverUserId,null,null, 0);
+            OrderStatisticsVo yesterday = orderStatisticsDao.getStatistics(driverUserId,null,null, 1);
+            if (today.getTotal() == 0 && yesterday.getTotal() != 0){
+                today.setTotalChange(100d);
+                today.setTotalChangeSymbol(1);
+                today.setMoney(0d);
+                today.setMoneyChange(100d);
+                today.setMoneyChangeSymbol(1);
+                today.setCompletionRate(0d);
+                today.setCompletionRateChange(0.0);
+                today.setCompletionRateChangeSymbol(1);
+                today.setAvg(0d);
+                today.setAvgChange(5d);
+                today.setAvgChangeSymbol(1);
+                return today;
+            }else if (today.getTotal() == 0 && yesterday.getTotal() == 0){
+                today.setTotalChange(0d);
+                today.setTotalChangeSymbol(2);
+                today.setMoney(0d);
+                today.setMoneyChange(0d);
+                today.setMoneyChangeSymbol(2);
+                today.setCompletionRate(0d);
+                today.setCompletionRateChange(0d);
+                today.setCompletionRateChangeSymbol(2);
+                today.setAvg(0d);
+                today.setAvgChange(0d);
+                today.setAvgChangeSymbol(2);
+                return today;
+            }else if (today.getTotal() != 0 && yesterday.getTotal() == 0){
+                today.setTotalChange(100d);
+                today.setTotalChangeSymbol(1);
+                today.setMoneyChange(today.getMoney());
+                today.setMoneyChangeSymbol(1);
+                today.setCompletionRateChange(today.getCompletionRate());
+                today.setCompletionRateChangeSymbol(1);
+                today.setAvgChange(today.getAvg());
+                today.setAvgChangeSymbol(1);
+                return today;
+            }else {
+                double totalChange = (today.getTotal() - yesterday.getTotal()) * 100 / yesterday.getTotal();
+                today.setTotalChange(Math.abs(totalChange));
+                today.setTotalChangeSymbol(totalChange > 0 ? 1 : (totalChange == 0 ? 2 : 0));
+                double moneyChange = (today.getMoney() - yesterday.getMoney()) * 100 / yesterday.getMoney();
+                today.setMoneyChange(Math.abs(moneyChange));
+                today.setMoneyChangeSymbol(moneyChange > 0 ? 1 : (moneyChange == 0 ? 2 : 0));
+                double completionRateChange = (today.getCompletionRate() - yesterday.getCompletionRate()) * 100 / yesterday.getCompletionRate();
+                today.setCompletionRateChange(Math.abs(completionRateChange));
+                today.setCompletionRateChangeSymbol(completionRateChange > 0 ? 1 : (completionRateChange == 0 ? 2 : 0));
+                double avg = today.getAvg() - yesterday.getAvg();
+                today.setAvgChange(Math.abs(avg));
+                today.setAvgChangeSymbol(avg > 0 ? 1 : (avg == 0 ? 2 : 0));
+                return today;
+            }
+        } else {
+            OrderStatisticsVo statistics = orderStatisticsDao.getStatistics(driverUserId, startTime, endTime, 2);
+            return statistics;
+        }
+    }
+
+    @Override
+    public List<OrderStatisticsVo> getTrend(@Param("driverUserId") Long driverUserId,String choose){
+        if (choose.equals("day")){
+            List<OrderStatisticsVo> trendDay = orderStatisticsDao.getTrendDay(driverUserId);
+            Map<String, OrderStatisticsVo> dataMap = trendDay.stream()
+                    .collect(Collectors.toMap(OrderStatisticsVo::getDay, stat -> stat));
+
+            List<OrderStatisticsVo> fullDay = new ArrayList<>();
+            for (int i = 0; i < 24; i++) {
+                String label = String.format("%02d:00", i);
+                OrderStatisticsVo stat = dataMap.getOrDefault(label, new OrderStatisticsVo());
+                stat.setDay(label);
+                stat.setTotal((null == stat.getTotal() || stat.getTotal() == 0) ? 0 : stat.getTotal());
+                stat.setMoney((null == stat.getMoney() || stat.getMoney() == 0 )? 0.0 : stat.getMoney());
+                fullDay.add(stat);
+            }
+            return fullDay;
+        }else if (choose.equals("week")){
+            List<OrderStatisticsVo> trendWeek = orderStatisticsDao.getTrendWeek(driverUserId);
+            String[] weekNames = {"周一", "周二", "周三", "周四", "周五", "周六", "周日"};
+            Map<String, OrderStatisticsVo> dataMap = trendWeek.stream()
+                    .collect(Collectors.toMap(OrderStatisticsVo::getDay, stat -> stat));
+
+            List<OrderStatisticsVo> fullWeek = new ArrayList<>();
+            for (int i = 0; i < 7; i++) {
+                String dayName = weekNames[i];
+                OrderStatisticsVo stat = dataMap.getOrDefault(dayName, new OrderStatisticsVo());
+                stat.setDay(dayName);
+                stat.setTotal((null == stat.getTotal() || stat.getTotal() == 0) ? 0 : stat.getTotal());
+                stat.setMoney((null == stat.getMoney() || stat.getMoney() == 0 )? 0.0 : stat.getMoney());
+                fullWeek.add(stat);
+            }
+            return fullWeek;
+        }else {
+            LocalDate start = LocalDate.now().withDayOfMonth(1);
+            LocalDate end = LocalDate.now(); // 或改为月末:withDayOfMonth(lengthOfMonth)
+
+            List<OrderStatisticsVo> trendMonth = orderStatisticsDao.getTrendMonth(driverUserId);
+
+            Map<String, OrderStatisticsVo> dataMap = trendMonth.stream()
+                    .collect(Collectors.toMap(OrderStatisticsVo::getDay, stat -> stat));
+
+            List<OrderStatisticsVo> result = new ArrayList<>();
+            for (LocalDate date = start; !date.isAfter(end); date = date.plusDays(1)) {
+                OrderStatisticsVo stat = dataMap.getOrDefault(date.format(DateTimeFormatter.ofPattern("YYYY-MM-dd")), new OrderStatisticsVo());
+                stat.setDay(date.format(DateTimeFormatter.ofPattern("YYYY-MM-dd")));
+                stat.setTotal((null == stat.getTotal() || stat.getTotal() == 0) ? 0 : stat.getTotal());
+                stat.setMoney((null == stat.getMoney() || stat.getMoney() == 0 )? 0.0 : stat.getMoney());
+                result.add(stat);
+            }
+            return result;
+        }
+    }
+
+    public List<OrderStatisticsVo> getYoYandQoQ(Long driverUserId,String choose){
+        //本周
+        List<String> thisWeek = DateUtils.getWeekDays(0);
+        List<OrderStatisticsVo> thisWeekOrders = orderStatisticsDao.getOrders(driverUserId, thisWeek.get(0), thisWeek.get(6));
+
+        if (choose.equals("t")){ //同比
+            //去年本周
+            List<String> lastYearWeekDays = DateUtils.getLastYearWeekDays();
+            List<OrderStatisticsVo> lastYearWeekOrders = orderStatisticsDao.getOrders(driverUserId, lastYearWeekDays.get(0), lastYearWeekDays.get(6));
+
+            String[] weekNames = {"周一", "周二", "周三", "周四", "周五", "周六", "周日"};
+            Map<String, OrderStatisticsVo> dataMap = thisWeekOrders.stream()
+                    .collect(Collectors.toMap(OrderStatisticsVo::getDay, stat -> stat));
+            Map<String, OrderStatisticsVo> lastYearDataMap = lastYearWeekOrders.stream()
+                    .collect(Collectors.toMap(OrderStatisticsVo::getDay, stat -> stat));
+            List<OrderStatisticsVo> tongWeek = new ArrayList<>();
+
+            for (int i = 0; i < 7; i++) {
+                String dayName = weekNames[i];
+                OrderStatisticsVo lastStat = lastYearDataMap.getOrDefault(lastYearWeekDays.get(i), new OrderStatisticsVo());
+                lastStat.setDay(dayName);
+                lastStat.setTotal((null == lastStat.getTotal() || lastStat.getTotal() == 0) ? 0 : lastStat.getTotal());
+
+                OrderStatisticsVo stat = dataMap.getOrDefault(thisWeek.get(i), new OrderStatisticsVo());
+                stat.setDay(dayName);
+                stat.setLastTotal(lastStat.getTotal());
+                stat.setTotal((null == stat.getTotal() || stat.getTotal() == 0) ? 0 : stat.getTotal());
+
+                tongWeek.add(stat);
+            }
+            return tongWeek;
+        }else if (choose.equals("h")){ //环比
+            //上周
+            List<String> lastWeek = DateUtils.getWeekDays(-1);
+            List<OrderStatisticsVo> lastWeekOrders = orderStatisticsDao.getOrders(driverUserId, lastWeek.get(0), lastWeek.get(6));
+
+            //环比 本周与上周比
+            String[] weekNames = {"周一", "周二", "周三", "周四", "周五", "周六", "周日"};
+            Map<String, OrderStatisticsVo> dataMap = thisWeekOrders.stream()
+                    .collect(Collectors.toMap(OrderStatisticsVo::getDay, stat -> stat));
+            Map<String, OrderStatisticsVo> lastDataMap = lastWeekOrders.stream()
+                    .collect(Collectors.toMap(OrderStatisticsVo::getDay, stat -> stat));
+            List<OrderStatisticsVo> huanWeek = new ArrayList<>();
+            for (int i = 0; i < 7; i++) {
+                String dayName = weekNames[i];
+                OrderStatisticsVo lastStat = lastDataMap.getOrDefault(lastWeek.get(i), new OrderStatisticsVo());
+                lastStat.setDay(dayName);
+                lastStat.setTotal((null == lastStat.getTotal() || lastStat.getTotal() == 0) ? 0 : lastStat.getTotal());
+
+                OrderStatisticsVo stat = dataMap.getOrDefault(thisWeek.get(i), new OrderStatisticsVo());
+                stat.setDay(dayName);
+                stat.setLastTotal(lastStat.getTotal());
+                stat.setTotal((null == stat.getTotal() || stat.getTotal() == 0) ? 0 : stat.getTotal());
+
+                huanWeek.add(stat);
+            }
+            return huanWeek;
+        }
+        return null;
+    }
+}

+ 74 - 0
src/main/java/com/sqx/modules/orders/vo/OrderStatisticsVo.java

@@ -0,0 +1,74 @@
+package com.sqx.modules.orders.vo;
+
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+@Data
+public class OrderStatisticsVo {
+
+    /**
+     * 订单总量
+     */
+    private Integer total;
+
+    /**
+     * 总收入
+     */
+    private Double money;
+
+    /**
+     * 完成率
+     */
+    private Double completionRate;
+
+    /**
+     * 平均评分
+     */
+    private Double avg;
+
+    /**
+     * 订单总量-较昨日
+     */
+    private Double totalChange;
+
+    /**
+     * Symbol 符号位 0下降,1上升
+     */
+    private Integer totalChangeSymbol;
+    /**
+     * 总收入-较昨日
+     */
+    private Double moneyChange;
+
+    /**
+     * Symbol 符号位 0下降,1上升
+     */
+    private Integer moneyChangeSymbol;
+    /**
+     * 完成率-较昨日
+     */
+    private Double completionRateChange;
+
+    /**
+     * Symbol 符号位 0下降,1上升
+     */
+    private Integer completionRateChangeSymbol;
+    /**
+     * 平均评分-较昨日
+     */
+    private Double avgChange;
+
+    /**
+     * Symbol 符号位 0下降,1上升
+     */
+    private Integer avgChangeSymbol;
+
+    /**
+     * 时间轴
+     */
+    private String day;
+
+    private Integer lastTotal;
+
+}

+ 96 - 0
src/main/resources/mapper/orders/OrderStatisticsDao.xml

@@ -0,0 +1,96 @@
+<?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.sqx.modules.orders.dao.OrderStatisticsDao">
+
+    <select id="getStatistics" resultType="com.sqx.modules.orders.vo.OrderStatisticsVo">
+        SELECT
+            COUNT(*) AS total,
+            SUM(CASE WHEN status = 5 THEN drive_money ELSE 0 END) AS money,
+            ROUND( COUNT(CASE WHEN status = 5 THEN 1 END) * 1.0 / COUNT(*), 2 ) AS completionRate,
+            ROUND(AVG(CASE WHEN status = 5 THEN driver_score ELSE NULL END), 1 ) AS avg
+        FROM
+            orders
+        WHERE 1=1
+        AND driver_user_id = #{driverUserId}
+        <if test="getDate == 0">
+            AND DATE(create_time) = CURDATE();
+        </if>
+        <if test="getDate == 1">
+            AND DATE(create_time) = CURDATE();
+        </if>
+        <if test="startTime!=null and startTime!=''and endTime!=null and endTime!='' ">
+            and str_to_date(create_time, '%Y-%m-%d') between str_to_date(#{startTime}, '%Y-%m-%d') AND
+            str_to_date(#{endTime}, '%Y-%m-%d')
+        </if>
+    </select>
+
+    <select id="getTrendDay" resultType="com.sqx.modules.orders.vo.OrderStatisticsVo">
+        SELECT
+        CONCAT(LPAD(HOUR(create_time), 2, '0'), ':00') AS day,
+        COUNT(*) AS total,
+        SUM(CASE WHEN status = 5 THEN drive_money ELSE 0 END) AS money
+        FROM orders
+        WHERE
+        driver_user_id = #{driverUserId}
+        AND DATE(create_time) = CURDATE()
+        GROUP BY day
+        ORDER BY day;
+    </select>
+
+    <select id="getTrendWeek" resultType="com.sqx.modules.orders.vo.OrderStatisticsVo">
+        SELECT
+        ELT(WEEKDAY(create_time) + 1, '周一', '周二', '周三', '周四', '周五', '周六', '周日') AS day,
+        COUNT(*) AS total,
+        SUM(CASE WHEN status = 5 THEN drive_money ELSE 0 END) AS money
+        FROM orders
+        WHERE
+        create_time >= DATE_SUB(CURDATE(), INTERVAL WEEKDAY(CURDATE()) DAY)
+        AND create_time &lt; DATE_ADD(CURDATE(), INTERVAL 1 WEEK)
+        AND driver_user_id = #{driverUserId}
+        GROUP BY WEEKDAY(create_time)
+        ORDER BY WEEKDAY(create_time);
+    </select>
+
+    <select id="getTrendMonth" resultType="com.sqx.modules.orders.vo.OrderStatisticsVo">
+        SELECT
+        DATE(create_time) AS day,
+        COUNT(*) AS total,
+        SUM(CASE WHEN status = 5 THEN drive_money ELSE 0 END) AS money
+        FROM orders
+        WHERE
+        driver_user_id = #{driverUserId}
+        AND create_time >= DATE_FORMAT(CURDATE(), '%Y-%m-01')
+        AND create_time &lt; DATE_FORMAT(DATE_ADD(CURDATE(), INTERVAL 1 MONTH), '%Y-%m-01')
+        GROUP BY day
+        ORDER BY day;
+    </select>
+
+    <select id="getOrders" resultType="com.sqx.modules.orders.vo.OrderStatisticsVo">
+        <!--SELECT
+        ELT(WEEKDAY(create_time) + 1, '周一', '周二', '周三', '周四', '周五', '周六', '周日') AS day,
+        COUNT(*) AS total
+        FROM orders
+        WHERE
+        driver_user_id = #{driverUserId}
+        <if test="startTime != null and startTime != '' and endTime != null and endTime != ''">
+            AND DATE(create_time) BETWEEN STR_TO_DATE(#{startTime}, '%Y-%m-%d') AND STR_TO_DATE(#{endTime}, '%Y-%m-%d')
+        </if>
+        <if test="startTime == null or startTime == '' or endTime == null or endTime == ''">
+            AND create_time >= DATE_SUB(CURDATE(), INTERVAL WEEKDAY(CURDATE()) DAY)
+            AND create_time &lt; DATE_ADD(DATE_SUB(CURDATE(), INTERVAL WEEKDAY(CURDATE()) DAY), INTERVAL 7 DAY)
+        </if>
+        GROUP BY WEEKDAY(create_time)
+        ORDER BY WEEKDAY(create_time);-->
+        SELECT
+        DATE(create_time) AS day,
+        COUNT(*) AS total
+        FROM orders
+        WHERE driver_user_id = #{driverUserId}
+        <if test="startTime != null and startTime != '' and endTime != null and endTime != ''">
+            AND DATE(create_time) BETWEEN STR_TO_DATE(#{startTime}, '%Y-%m-%d') AND STR_TO_DATE(#{endTime}, '%Y-%m-%d')
+        </if>
+        GROUP BY DATE(create_time)
+        ORDER BY DATE(create_time);
+    </select>
+</mapper>