yanderong
2026-06-22 ad15ad228abdce24eaaa03507e2218b01ec2eeca
feat: 可视化大屏统计
8个文件已添加
2个文件已修改
829 ■■■■■ 已修改文件
ManagementYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/specialTrain/TOrderStatisticsController.java 99 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ManagementYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/TOrderTaxiMapper.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ManagementYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/TOrderTaxiMapper.xml 367 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ManagementYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/response/TOrderStatisticsAnnualTrendVo.java 30 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ManagementYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/response/TOrderStatisticsCarVo.java 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ManagementYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/response/TOrderStatisticsCountVo.java 35 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ManagementYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/response/TOrderStatisticsPassengerVo.java 35 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ManagementYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/response/TOrderStatisticsTotalOrderVo.java 80 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ManagementYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/TOrderStatisticsService.java 51 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ManagementYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TOrderStatisticsServiceImpl.java 91 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ManagementYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/specialTrain/TOrderStatisticsController.java
New file
@@ -0,0 +1,99 @@
package com.stylefeng.guns.modular.system.controller.specialTrain;
import com.stylefeng.guns.core.base.controller.BaseController;
import com.stylefeng.guns.modular.system.response.*;
import com.stylefeng.guns.modular.system.service.TOrderStatisticsService;
import com.stylefeng.guns.modular.system.util.ResultUtil;
import lombok.AllArgsConstructor;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import java.util.List;
/**
 * 订单相关统计,可视化数据
 *
 * @author Lux
 * @version 1.0.0
 * @since 2026/6/22 11:30
 */
@AllArgsConstructor
@Controller
@RequestMapping("/tOrderStatistics")
public class TOrderStatisticsController extends BaseController {
    private final TOrderStatisticsService orderStatisticsService;
    /**
     * 年度趋势统计
     */
    @ResponseBody
    @RequestMapping(value = "/annualTrend", method = RequestMethod.GET)
    public ResultUtil<List<TOrderStatisticsAnnualTrendVo>> annualTrend(String year) {
        List<TOrderStatisticsAnnualTrendVo> annualTrendList = orderStatisticsService.annualTrendStatistics(year);
        return ResultUtil.success(annualTrendList);
    }
    /**
     * 总体订单统计
     */
    @ResponseBody
    @RequestMapping(value = "/totalOrder", method = RequestMethod.GET)
    public ResultUtil<TOrderStatisticsTotalOrderVo> totalOrder(String startDate, String endDate) {
        TOrderStatisticsTotalOrderVo totalOrderVo = orderStatisticsService.totalOrderStatistics(startDate, endDate);
        return ResultUtil.success(totalOrderVo);
    }
    /**
     * 新增乘客统计
     */
    @ResponseBody
    @RequestMapping(value = "/newAddPassenger", method = RequestMethod.GET)
    public ResultUtil<List<TOrderStatisticsCountVo>> newAddPassenger(Integer type) {
        List<TOrderStatisticsCountVo> countVos = orderStatisticsService.newAddPassengerStatistics(type);
        return ResultUtil.success(countVos);
    }
    /**
     * 订单量统计
     */
    @ResponseBody
    @RequestMapping(value = "/orderCount", method = RequestMethod.GET)
    public ResultUtil<List<TOrderStatisticsCountVo>> orderCount(Integer type) {
        List<TOrderStatisticsCountVo> countVos = orderStatisticsService.orderCountStatistics(type);
        return ResultUtil.success(countVos);
    }
    /**
     * 当日各时段统计
     */
    @ResponseBody
    @RequestMapping(value = "/orderDayHourCount", method = RequestMethod.GET)
    public ResultUtil<List<TOrderStatisticsCountVo>> orderDayHourCount(Integer startHour, Integer endHour) {
        List<TOrderStatisticsCountVo> countVos = orderStatisticsService.orderDayHourCount(startHour, endHour);
        return ResultUtil.success(countVos);
    }
    /**
     * 司机接单排名统计
     */
    @ResponseBody
    @RequestMapping(value = "/driverCar", method = RequestMethod.GET)
    public ResultUtil<List<TOrderStatisticsCarVo>> driverCar(Integer type) {
        List<TOrderStatisticsCarVo> countVos = orderStatisticsService.driverCarStatistics(type);
        return ResultUtil.success(countVos);
    }
    /**
     * 司机接单排名统计
     */
    @ResponseBody
    @RequestMapping(value = "/passenger", method = RequestMethod.GET)
    public ResultUtil<List<TOrderStatisticsPassengerVo>> passenger(Integer type) {
        List<TOrderStatisticsPassengerVo> countVos = orderStatisticsService.passengerStatistics(type);
        return ResultUtil.success(countVos);
    }
}
ManagementYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/TOrderTaxiMapper.java
@@ -3,6 +3,7 @@
import com.baomidou.mybatisplus.plugins.Page;
import com.stylefeng.guns.modular.system.model.TOrderTaxi;
import com.baomidou.mybatisplus.mapper.BaseMapper;
import com.stylefeng.guns.modular.system.response.*;
import org.apache.ibatis.annotations.Param;
import java.util.List;
@@ -166,4 +167,19 @@
                                                     @Param("name") String name,
                                                     @Param("phone") String phone,
                                                      @Param("companyId") Integer companyId);
    List<TOrderStatisticsAnnualTrendVo> annualTrendStatistics(@Param("year") String year);
    TOrderStatisticsTotalOrderVo totalOrderStatistics(@Param("startDate") String startDate, @Param("endDate") String endDate);
    List<TOrderStatisticsCountVo> newAddPassengerStatistics(@Param("type") Integer type);
    List<TOrderStatisticsCountVo> orderCountStatistics(@Param("type") Integer type);
    List<TOrderStatisticsCountVo> orderDayHourCount(@Param("startHour") Integer startHour, @Param("endHour") Integer endHour);
    List<TOrderStatisticsCarVo> driverCarStatistics(@Param("type") Integer type);
    List<TOrderStatisticsPassengerVo> passengerStatistics(@Param("type") Integer type);
}
ManagementYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/TOrderTaxiMapper.xml
@@ -1213,4 +1213,371 @@
        ) as aa where aa.thankYouFee != 0 order by aa.insertTime desc
    </select>
    <select id="annualTrendStatistics" resultType="com.stylefeng.guns.modular.system.response.TOrderStatisticsAnnualTrendVo">
        -- 1、年度趋势(出租车、快车、跨城出行、顺风车)
        SELECT
            CONCAT(#{year}, '年', m.month, '月') AS yearMonth,
            m.month,
            IFNULL(SUM(t.payMoney), 0) AS totalMoney
        FROM (
                 SELECT 1 AS month
                 UNION ALL SELECT 2
                 UNION ALL SELECT 3
                 UNION ALL SELECT 4
                 UNION ALL SELECT 5
                 UNION ALL SELECT 6
                 UNION ALL SELECT 7
                 UNION ALL SELECT 8
                 UNION ALL SELECT 9
                 UNION ALL SELECT 10
                 UNION ALL SELECT 11
                 UNION ALL SELECT 12
             ) m
                 LEFT JOIN
             (
                 SELECT insertTime, payMoney
                 FROM t_order_taxi ot
                 WHERE
                     ot.state in(8,9) AND YEAR(ot.insertTime) = #{year}
                UNION ALL
                SELECT insertTime, payMoney
                FROM t_order_private_car opc
                WHERE
                    opc.state in(8,9) AND YEAR(opc.insertTime) = #{year}
                UNION ALL
                SELECT insertTime, payMoney
                FROM t_order_cross_city occ
                WHERE
                    occ.state in(8,9) AND YEAR(occ.insertTime) = #{year}
                UNION ALL
                SELECT addTime as insertTime, money as payMoney
                FROM app_order_ride aor
                WHERE
                    aor.state in(5) AND YEAR(aor.addTime) = #{year}
        ) t
        ON MONTH(t.insertTime) = m.month
        GROUP BY m.month
        ORDER BY m.month
    </select>
    <select id="totalOrderStatistics" resultType="com.stylefeng.guns.modular.system.response.TOrderStatisticsTotalOrderVo">
        -- 2、总体订单统计
        SELECT
            COUNT(*) AS totalNum, -- 总订单数量
            SUM(
                CASE WHEN (source &lt;&gt; 'ride' AND state IN (8,9)) OR (source = 'ride' AND state = 5)
                THEN 1 ELSE 0  END
            ) AS finishNum, -- 已完成订单数量(待评价/已完成)
            SUM(
                CASE WHEN (source &lt;&gt; 'ride' AND state IN (10,12)) OR (source = 'ride' AND state = 6)
                THEN 1 ELSE 0 END
            ) AS cancelNum, -- 取消订单数量
            SUM(
                CASE WHEN state = 1 THEN 1 ELSE 0 END
            ) AS unHandlerNum -- 未处理订单
        FROM (
            SELECT state, insertTime, 'taxi' AS source
            FROM t_order_taxi
            UNION ALL
            SELECT state, insertTime, 'private' AS source
            FROM t_order_private_car
            UNION ALL
            SELECT state, insertTime, 'cross' AS source
            FROM t_order_cross_city
            UNION ALL
            SELECT state, addTime AS insertTime, 'ride' AS source
            FROM app_order_ride
        ) t
        WHERE t.insertTime &gt;= #{startDate}
        AND t.insertTime &lt;= #{endDate}
    </select>
    <select id="newAddPassengerStatistics" resultType="com.stylefeng.guns.modular.system.response.TOrderStatisticsCountVo">
        <if test="null != type and 1 == type">
            -- 3、新增乘客数(日新增)
            SELECT
                DATE_FORMAT(d.dayDate,'%Y-%m-%d') AS dateStr,
                DATE_FORMAT(d.dayDate,'%d') AS dateNum,
                COUNT(u.id) AS totalCount
            FROM
            (
            SELECT CURDATE() dayDate
            UNION ALL SELECT DATE_SUB(CURDATE(),INTERVAL 1 DAY)
            UNION ALL SELECT DATE_SUB(CURDATE(),INTERVAL 2 DAY)
            UNION ALL SELECT DATE_SUB(CURDATE(),INTERVAL 3 DAY)
            UNION ALL SELECT DATE_SUB(CURDATE(),INTERVAL 4 DAY)
            UNION ALL SELECT DATE_SUB(CURDATE(),INTERVAL 5 DAY)
            UNION ALL SELECT DATE_SUB(CURDATE(),INTERVAL 6 DAY)
            UNION ALL SELECT DATE_SUB(CURDATE(),INTERVAL 7 DAY)
            UNION ALL SELECT DATE_SUB(CURDATE(),INTERVAL 8 DAY)
            UNION ALL SELECT DATE_SUB(CURDATE(),INTERVAL 9 DAY)
            UNION ALL SELECT DATE_SUB(CURDATE(),INTERVAL 10 DAY)
            UNION ALL SELECT DATE_SUB(CURDATE(),INTERVAL 11 DAY)
            UNION ALL SELECT DATE_SUB(CURDATE(),INTERVAL 12 DAY)
            UNION ALL SELECT DATE_SUB(CURDATE(),INTERVAL 13 DAY)
            UNION ALL SELECT DATE_SUB(CURDATE(),INTERVAL 14 DAY)
            UNION ALL SELECT DATE_SUB(CURDATE(),INTERVAL 15 DAY)
            UNION ALL SELECT DATE_SUB(CURDATE(),INTERVAL 16 DAY)
            UNION ALL SELECT DATE_SUB(CURDATE(),INTERVAL 17 DAY)
            UNION ALL SELECT DATE_SUB(CURDATE(),INTERVAL 18 DAY)
            UNION ALL SELECT DATE_SUB(CURDATE(),INTERVAL 19 DAY)
            UNION ALL SELECT DATE_SUB(CURDATE(),INTERVAL 20 DAY)
            UNION ALL SELECT DATE_SUB(CURDATE(),INTERVAL 21 DAY)
            UNION ALL SELECT DATE_SUB(CURDATE(),INTERVAL 22 DAY)
            UNION ALL SELECT DATE_SUB(CURDATE(),INTERVAL 23 DAY)
            UNION ALL SELECT DATE_SUB(CURDATE(),INTERVAL 24 DAY)
            UNION ALL SELECT DATE_SUB(CURDATE(),INTERVAL 25 DAY)
            UNION ALL SELECT DATE_SUB(CURDATE(),INTERVAL 26 DAY)
            UNION ALL SELECT DATE_SUB(CURDATE(),INTERVAL 27 DAY)
            UNION ALL SELECT DATE_SUB(CURDATE(),INTERVAL 28 DAY)
            UNION ALL SELECT DATE_SUB(CURDATE(),INTERVAL 29 DAY)
            ) d
            LEFT JOIN t_user u ON u.insertTime >= d.dayDate
            AND u.insertTime &lt; DATE_ADD(d.dayDate,INTERVAL 1 DAY)
            GROUP BY d.dayDate
            ORDER BY d.dayDate
        </if>
        <if test="null != type and 2 == type">
            -- 4、新增乘客数(月新增)
            SELECT
                CONCAT(YEAR(CURDATE()), '-', LPAD(m.month, 2, '0')) AS dateStr,
                m.month as dateNum,
                COUNT(u.id) AS totalCount
            FROM
            (
            SELECT 1 AS month
            UNION ALL SELECT 2
            UNION ALL SELECT 3
            UNION ALL SELECT 4
            UNION ALL SELECT 5
            UNION ALL SELECT 6
            UNION ALL SELECT 7
            UNION ALL SELECT 8
            UNION ALL SELECT 9
            UNION ALL SELECT 10
            UNION ALL SELECT 11
            UNION ALL SELECT 12
            ) m
            LEFT JOIN t_user u ON MONTH(u.insertTime) = m.month
            AND YEAR(u.insertTime) = YEAR(CURDATE())
            GROUP BY m.month
            ORDER BY m.month
        </if>
    </select>
    <select id="orderCountStatistics" resultType="com.stylefeng.guns.modular.system.response.TOrderStatisticsCountVo" >
        <if test="null != type and 1 == type">
            -- 5、订单量统计(日订单量)
            SELECT
                DATE_FORMAT(d.dayDate, '%Y-%m-%d') AS dateStr,
                COUNT(t.insertTime) AS totalCount,
                IFNULL(SUM(t.payMoney),0) AS totalMoney
            FROM
            (
            SELECT CURDATE() - INTERVAL 29 DAY AS dayDate
            UNION ALL SELECT CURDATE() - INTERVAL 28 DAY
            UNION ALL SELECT CURDATE() - INTERVAL 27 DAY
            UNION ALL SELECT CURDATE() - INTERVAL 26 DAY
            UNION ALL SELECT CURDATE() - INTERVAL 25 DAY
            UNION ALL SELECT CURDATE() - INTERVAL 24 DAY
            UNION ALL SELECT CURDATE() - INTERVAL 23 DAY
            UNION ALL SELECT CURDATE() - INTERVAL 22 DAY
            UNION ALL SELECT CURDATE() - INTERVAL 21 DAY
            UNION ALL SELECT CURDATE() - INTERVAL 20 DAY
            UNION ALL SELECT CURDATE() - INTERVAL 19 DAY
            UNION ALL SELECT CURDATE() - INTERVAL 18 DAY
            UNION ALL SELECT CURDATE() - INTERVAL 17 DAY
            UNION ALL SELECT CURDATE() - INTERVAL 16 DAY
            UNION ALL SELECT CURDATE() - INTERVAL 15 DAY
            UNION ALL SELECT CURDATE() - INTERVAL 14 DAY
            UNION ALL SELECT CURDATE() - INTERVAL 13 DAY
            UNION ALL SELECT CURDATE() - INTERVAL 12 DAY
            UNION ALL SELECT CURDATE() - INTERVAL 11 DAY
            UNION ALL SELECT CURDATE() - INTERVAL 10 DAY
            UNION ALL SELECT CURDATE() - INTERVAL 9 DAY
            UNION ALL SELECT CURDATE() - INTERVAL 8 DAY
            UNION ALL SELECT CURDATE() - INTERVAL 7 DAY
            UNION ALL SELECT CURDATE() - INTERVAL 6 DAY
            UNION ALL SELECT CURDATE() - INTERVAL 5 DAY
            UNION ALL SELECT CURDATE() - INTERVAL 4 DAY
            UNION ALL SELECT CURDATE() - INTERVAL 3 DAY
            UNION ALL SELECT CURDATE() - INTERVAL 2 DAY
            UNION ALL SELECT CURDATE() - INTERVAL 1 DAY
            UNION ALL SELECT CURDATE()
            ) d
            LEFT JOIN
            (
            SELECT insertTime,payMoney
            FROM t_order_taxi
            UNION ALL
            SELECT insertTime,payMoney
            FROM t_order_private_car
            UNION ALL
            SELECT insertTime,payMoney
            FROM t_order_cross_city
            UNION ALL
            SELECT addTime AS insertTime,money AS payMoney
            FROM app_order_ride
            ) t
            ON t.insertTime &gt;= d.dayDate
            AND t.insertTime &lt; DATE_ADD(d.dayDate, INTERVAL 1 DAY)
            GROUP BY d.dayDate
            ORDER BY d.dayDate
        </if>
        <if test="null != type and 2 == type">
            -- 6、订单量统计(月订单量)
            SELECT
                CONCAT(d.year, '-', LPAD(d.month, 2, '0')) AS dateStr,
                COUNT(t.insertTime) AS totalCount,
                IFNULL(SUM(t.payMoney),0) AS totalMoney
            FROM
            (
            SELECT YEAR(CURDATE() - INTERVAL 11 MONTH) AS year, MONTH(CURDATE() - INTERVAL 11 MONTH) AS month UNION ALL
            SELECT YEAR(CURDATE() - INTERVAL 10 MONTH), MONTH(CURDATE() - INTERVAL 10 MONTH) UNION ALL
            SELECT YEAR(CURDATE() - INTERVAL 9 MONTH),  MONTH(CURDATE() - INTERVAL 9 MONTH) UNION ALL
            SELECT YEAR(CURDATE() - INTERVAL 8 MONTH),  MONTH(CURDATE() - INTERVAL 8 MONTH) UNION ALL
            SELECT YEAR(CURDATE() - INTERVAL 7 MONTH),  MONTH(CURDATE() - INTERVAL 7 MONTH) UNION ALL
            SELECT YEAR(CURDATE() - INTERVAL 6 MONTH),  MONTH(CURDATE() - INTERVAL 6 MONTH) UNION ALL
            SELECT YEAR(CURDATE() - INTERVAL 5 MONTH),  MONTH(CURDATE() - INTERVAL 5 MONTH) UNION ALL
            SELECT YEAR(CURDATE() - INTERVAL 4 MONTH),  MONTH(CURDATE() - INTERVAL 4 MONTH) UNION ALL
            SELECT YEAR(CURDATE() - INTERVAL 3 MONTH),  MONTH(CURDATE() - INTERVAL 3 MONTH) UNION ALL
            SELECT YEAR(CURDATE() - INTERVAL 2 MONTH),  MONTH(CURDATE() - INTERVAL 2 MONTH) UNION ALL
            SELECT YEAR(CURDATE() - INTERVAL 1 MONTH),  MONTH(CURDATE() - INTERVAL 1 MONTH) UNION ALL
            SELECT YEAR(CURDATE()), MONTH(CURDATE())
            ) d
            LEFT JOIN
            (
            SELECT insertTime,payMoney
            FROM t_order_taxi
            UNION ALL
            SELECT insertTime,payMoney
            FROM t_order_private_car
            UNION ALL
            SELECT insertTime,payMoney
            FROM t_order_cross_city
            UNION ALL
            SELECT addTime AS insertTime,money AS payMoney
            FROM app_order_ride
            ) t
            ON YEAR(t.insertTime) = d.year
            AND MONTH(t.insertTime) = d.month
            GROUP BY d.year, d.month
            ORDER BY d.year, d.month
        </if>
    </select>
    <select id="orderDayHourCount" resultType="com.stylefeng.guns.modular.system.response.TOrderStatisticsCountVo">
        -- 6、统计当日各时段订单量
        SELECT
            LPAD(h.hour, 2, '0') AS dateStr,
            COUNT(t.insertTime) AS totalCount,
            IFNULL(SUM(t.payMoney),0) AS totalMoney
        FROM
        (
        SELECT 0 AS hour UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3
        UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7
        UNION ALL SELECT 8 UNION ALL SELECT 9 UNION ALL SELECT 10 UNION ALL SELECT 11
        UNION ALL SELECT 12 UNION ALL SELECT 13 UNION ALL SELECT 14 UNION ALL SELECT 15
        UNION ALL SELECT 16 UNION ALL SELECT 17 UNION ALL SELECT 18 UNION ALL SELECT 19
        UNION ALL SELECT 20 UNION ALL SELECT 21 UNION ALL SELECT 22 UNION ALL SELECT 23
        ) h
        LEFT JOIN
        (
        SELECT insertTime, payMoney
        FROM t_order_taxi
        WHERE insertTime &gt;= CURDATE()
        AND insertTime &lt; DATE_ADD(CURDATE(), INTERVAL 1 DAY)
        UNION ALL
        SELECT insertTime, payMoney
        FROM t_order_private_car
        WHERE insertTime &gt;= CURDATE()
        AND insertTime &lt; DATE_ADD(CURDATE(), INTERVAL 1 DAY)
        UNION ALL
        SELECT insertTime, payMoney
        FROM t_order_cross_city
        WHERE insertTime &gt;= CURDATE()
        AND insertTime &lt; DATE_ADD(CURDATE(), INTERVAL 1 DAY)
        UNION ALL
        SELECT addTime AS insertTime, money AS payMoney
        FROM app_order_ride
        WHERE  addTime &gt;= CURDATE()
        AND addTime &lt; DATE_ADD(CURDATE(), INTERVAL 1 DAY)
        ) t
        ON HOUR(t.insertTime) = h.hour
        GROUP BY h.hour
        ORDER BY h.hour
    </select>
    <select id="driverCarStatistics" resultType="com.stylefeng.guns.modular.system.response.TOrderStatisticsCarVo">
        -- 7、统计今日/本周/本月司机排名
        SELECT
            tc.carLicensePlate as carLicensePlate,
            COUNT(1) AS totalCount
        FROM (
            SELECT carId, insertTime FROM t_order_taxi
            UNION ALL
            SELECT carId, insertTime FROM t_order_private_car
            UNION ALL
            SELECT carId, insertTime FROM t_order_cross_city
        ) t LEFT JOIN t_car tc ON t.carId = tc.id
        WHERE
            t.carId IS NOT NULL
        <if test="null != type and 1 == type">
            AND t.insertTime &gt;= CURDATE()
            AND t.insertTime &lt; DATE_ADD(CURDATE(), INTERVAL 1 DAY)
        </if>
        <if test="null != type and 2 == type">
            AND t.insertTime &gt;= DATE_SUB(CURDATE(), INTERVAL WEEKDAY(CURDATE()) DAY)
            AND t.insertTime &lt;  DATE_ADD(DATE_SUB(CURDATE(), INTERVAL WEEKDAY(CURDATE()) DAY), INTERVAL 7 DAY)
        </if>
        <if test="null != type and 3 == type">
            t.insertTime &gt;= DATE_FORMAT(CURDATE(), '%Y-%m-01')
            AND t.insertTime &lt; DATE_ADD(DATE_FORMAT(CURDATE(), '%Y-%m-01'), INTERVAL 1 MONTH)
        </if>
        GROUP BY tc.carLicensePlate
        ORDER BY orderCount DESC
    </select>
    <select id="passengerStatistics" resultType="com.stylefeng.guns.modular.system.response.TOrderStatisticsPassengerVo">
        -- 8、今日乘客排名
        SELECT
            t.passengersPhone as passengersPhone,
            COUNT(1) AS orderCount as totalCount,
            SUM(
            CASE WHEN (source &lt;&gt; 'ride' AND state IN (8,9)) OR (source = 'ride' AND state = 5)
            THEN 1 ELSE 0  END
            ) AS finishCount
        FROM (
            SELECT passengersPhone, insertTime, state, 'taxi' AS source
            FROM t_order_taxi
            UNION ALL
            SELECT passengersPhone, insertTime, state, 'private' AS source
            FROM t_order_private_car
            UNION ALL
            SELECT passengersPhone, insertTime, state, 'cross' AS source
            FROM t_order_cross_city
            UNION ALL
            SELECT lxPhone AS passengersPhone, addTime as insertTime, state, 'ride' AS source
            FROM app_order_ride
        ) t
        WHERE
         t.passengersPhone IS NOT NULL
        <if test="null != type and 1 == type">
            AND t.insertTime &gt;= CURDATE()
            AND t.insertTime &lt; DATE_ADD(CURDATE(), INTERVAL 1 DAY)
        </if>
        <if test="null != type and 2 == type">
            AND t.insertTime &gt;= DATE_SUB(CURDATE(), INTERVAL WEEKDAY(CURDATE()) DAY)
            AND t.insertTime &lt; DATE_ADD(DATE_SUB(CURDATE(), INTERVAL WEEKDAY(CURDATE()) DAY), INTERVAL 7 DAY)
        </if>
        <if test="null != type and 3 == type">
            AND t.insertTime &gt;= DATE_FORMAT(CURDATE(), '%Y-%m-01')
            AND t.insertTime &lt; DATE_ADD(DATE_FORMAT(CURDATE(), '%Y-%m-01'), INTERVAL 1 MONTH)
        </if>
        GROUP BY t.passengersPhone
        ORDER BY orderCount DESC
    </select>
</mapper>
ManagementYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/response/TOrderStatisticsAnnualTrendVo.java
New file
@@ -0,0 +1,30 @@
package com.stylefeng.guns.modular.system.response;
import lombok.Data;
/**
 * 订单统计-年度趋势
 *
 * @author Lux
 * @version 1.0.0
 * @since 2026/6/22 11:42
 */
@Data
public class TOrderStatisticsAnnualTrendVo {
    /**
     * 年月
     */
    private String yearMonth;
    /**
     * 月份
     */
    private String month;
    /**
     * 订单金额(单位万)
     */
    private String totalMoney;
}
ManagementYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/response/TOrderStatisticsCarVo.java
New file
@@ -0,0 +1,25 @@
package com.stylefeng.guns.modular.system.response;
import lombok.Data;
/**
 * 按车辆统计实体
 *
 * @author Lux
 * @version 1.0.0
 * @since 2026/6/22 11:42
 */
@Data
public class TOrderStatisticsCarVo {
    /**
     * 车牌号
     */
    private String carLicensePlate;
    /**
     * 总数量
     */
    private Integer totalCount;
}
ManagementYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/response/TOrderStatisticsCountVo.java
New file
@@ -0,0 +1,35 @@
package com.stylefeng.guns.modular.system.response;
import lombok.Data;
/**
 * 统计数量实体
 *
 * @author Lux
 * @version 1.0.0
 * @since 2026/6/22 11:42
 */
@Data
public class TOrderStatisticsCountVo {
    /**
     * 时间格式
     */
    private String dateStr;
    /**
     * 时间数字
     */
    private String dateNum;
    /**
     * 总数量
     */
    private String totalCount;
    /**
     * 总金额
     */
    private String totalMoney;
}
ManagementYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/response/TOrderStatisticsPassengerVo.java
New file
@@ -0,0 +1,35 @@
package com.stylefeng.guns.modular.system.response;
import lombok.Data;
/**
 * 按车辆统计实体
 *
 * @author Lux
 * @version 1.0.0
 * @since 2026/6/22 11:42
 */
@Data
public class TOrderStatisticsPassengerVo {
    /**
     * 乘车人名称
     */
    private String passengerName;
    /**
     * 乘车人电话
     */
    private String passengersPhone;
    /**
     * 叫车次数
     */
    private Integer totalCount;
    /**
     * 完成订单数
     */
    private Integer finishCount;
}
ManagementYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/response/TOrderStatisticsTotalOrderVo.java
New file
@@ -0,0 +1,80 @@
package com.stylefeng.guns.modular.system.response;
import lombok.Data;
/**
 * 订单统计-总体订单
 *
 * @author Lux
 * @version 1.0.0
 * @since 2026/6/22 11:42
 */
@Data
public class TOrderStatisticsTotalOrderVo {
    /**
     * 总订单数量
     */
    private Integer totalNum;
    /**
     * 取消订单数量
     */
    private Integer cancelNum;
    /**
     * 取消订单百分比
     */
    private String cancelRate;
    /**
     * 完成订单数量
     */
    private Integer finishNum;
    /**
     * 完成订单百分比
     */
    private String finishRate;
    /**
     * 无效订单数量
     */
    private Integer invalidNum;
    /**
     * 无效订单百分比
     */
    private String invalidRate;
    /**
     * 未处理订单数量
     */
    private Integer unHandlerNum;
    /**
     * 未处理订单百分比
     */
    private String unHandlerRate;
    /**
     * 超时订单数量(没用)
     */
    private Integer timeOutNum;
    public TOrderStatisticsTotalOrderVo convert() {
        this.setInvalidNum(this.getTotalNum() - this.getCancelNum() - this.getFinishNum() - this.getUnHandlerNum());
        this.setCancelRate(rate(this.getCancelNum(), this.getTotalNum()));
        this.setFinishRate(rate(this.getFinishNum(), this.getTotalNum()));
        this.setInvalidRate(rate(this.getInvalidNum(), this.getTotalNum()));
        this.setUnHandlerRate(rate(this.getUnHandlerNum(), this.getTotalNum()));
        return this;
    }
    public String rate(Integer num, Integer totalNum) {
        // 计算百分比(保留两位小数)
        double cancelRate = (double) num / totalNum * 100;
        // 格式化输出,保留两位小数
        return String.format("%.2f%%\n", cancelRate);
    }
}
ManagementYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/TOrderStatisticsService.java
New file
@@ -0,0 +1,51 @@
package com.stylefeng.guns.modular.system.service;
import com.stylefeng.guns.modular.system.response.*;
import java.util.List;
/**
 * <p>
 *     订单统计-服务类
 * </p>
 * @author sky
 * @version 1.0.0
 * @since  2026/6/22 11:59
 */
public interface TOrderStatisticsService {
    /**
     * 年度趋势统计
     */
    List<TOrderStatisticsAnnualTrendVo> annualTrendStatistics(String year);
    /**
     * 总体订单
     */
    TOrderStatisticsTotalOrderVo totalOrderStatistics(String startDate, String endDate);
    /**
     * 新增乘客统计
     */
    List<TOrderStatisticsCountVo> newAddPassengerStatistics(Integer type);
    /**
     * 订单量统计
     */
    List<TOrderStatisticsCountVo> orderCountStatistics(Integer type);
    /**
     * 当日各时段统计
     */
    List<TOrderStatisticsCountVo> orderDayHourCount(Integer startHour, Integer endHour);
    /**
     * 司机接单排名
     */
    List<TOrderStatisticsCarVo> driverCarStatistics(Integer type);
    /**
     * 乘客排名
     */
    List<TOrderStatisticsPassengerVo> passengerStatistics(Integer type);
}
ManagementYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TOrderStatisticsServiceImpl.java
New file
@@ -0,0 +1,91 @@
package com.stylefeng.guns.modular.system.service.impl;
import com.aliyun.oss.ServiceException;
import com.stylefeng.guns.modular.system.dao.TOrderTaxiMapper;
import com.stylefeng.guns.modular.system.response.*;
import com.stylefeng.guns.modular.system.service.TOrderStatisticsService;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service;
import java.util.Collections;
import java.util.List;
import java.util.Optional;
/**
 *
 * <p>
 *     订单统计-服务类
 * </p>
 * @author Lux
 * @version 1.0.0
 * @since 2026/6/22 12:00
 */
@Slf4j
@Service
@AllArgsConstructor
public class TOrderStatisticsServiceImpl implements TOrderStatisticsService {
    private final TOrderTaxiMapper orderTaxiMapper;
    @Override
    public List<TOrderStatisticsAnnualTrendVo> annualTrendStatistics(String year) {
        Optional.ofNullable(year).filter(StringUtils::isNotEmpty).orElseThrow(() -> new ServiceException("年度趋势统计,请求参数年份不能为空"));
       return orderTaxiMapper.annualTrendStatistics(year);
    }
    /**
     * 总体订单
     */
    public TOrderStatisticsTotalOrderVo totalOrderStatistics(String startDate, String endDate) {
        if(StringUtils.isNotEmpty(startDate)) {
            startDate = startDate+" 00:00:00";
        }
        if(StringUtils.isNotEmpty(endDate)) {
            endDate = endDate+" 23:59:59";
        }
        TOrderStatisticsTotalOrderVo totalOrderVo = orderTaxiMapper.totalOrderStatistics(startDate, endDate);
        return Optional.ofNullable(totalOrderVo).map(TOrderStatisticsTotalOrderVo::convert).orElse(new TOrderStatisticsTotalOrderVo());
    }
    /**
     * 新增乘客统计
     * @param type 1 日新增,2月新增
     */
    public List<TOrderStatisticsCountVo> newAddPassengerStatistics(Integer type) {
        return orderTaxiMapper.newAddPassengerStatistics(type);
    }
    /**
     * 订单量统计
     * @param type 1 日订单量,2月订单量
     */
    public List<TOrderStatisticsCountVo> orderCountStatistics(Integer type) {
        return orderTaxiMapper.orderCountStatistics(type);
    }
    /**
     * 当日各时段统计
     */
    public List<TOrderStatisticsCountVo> orderDayHourCount(Integer startHour, Integer endHour) {
        return orderTaxiMapper.orderDayHourCount(startHour, endHour);
    }
    /**
     * 司机接单排名
     * @param type 1 今日,2本周,3本月
     */
    public List<TOrderStatisticsCarVo> driverCarStatistics(Integer type) {
        return orderTaxiMapper.driverCarStatistics(type);
    }
    /**
     * 乘客排名
     * @param type 1 今日,2本周,3本月
     */
    public List<TOrderStatisticsPassengerVo> passengerStatistics(Integer type) {
        return orderTaxiMapper.passengerStatistics(type);
    }
}