From ad15ad228abdce24eaaa03507e2218b01ec2eeca Mon Sep 17 00:00:00 2001
From: yanderong <307678080@qq.com>
Date: 星期一, 22 六月 2026 23:15:49 +0800
Subject: [PATCH] feat: 可视化大屏统计

---
 ManagementYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/response/TOrderStatisticsAnnualTrendVo.java             |   30 ++
 ManagementYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/response/TOrderStatisticsCountVo.java                   |   35 ++
 ManagementYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/TOrderTaxiMapper.xml                        |  367 ++++++++++++++++++++++++++
 ManagementYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/TOrderStatisticsService.java                    |   51 +++
 ManagementYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/response/TOrderStatisticsTotalOrderVo.java              |   80 +++++
 ManagementYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/TOrderTaxiMapper.java                               |   16 +
 ManagementYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/specialTrain/TOrderStatisticsController.java |   99 +++++++
 ManagementYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/response/TOrderStatisticsPassengerVo.java               |   35 ++
 ManagementYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/response/TOrderStatisticsCarVo.java                     |   25 +
 ManagementYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TOrderStatisticsServiceImpl.java           |   91 ++++++
 10 files changed, 829 insertions(+), 0 deletions(-)

diff --git a/ManagementYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/specialTrain/TOrderStatisticsController.java b/ManagementYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/specialTrain/TOrderStatisticsController.java
new file mode 100644
index 0000000..d114366
--- /dev/null
+++ b/ManagementYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/specialTrain/TOrderStatisticsController.java
@@ -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);
+    }
+
+}
diff --git a/ManagementYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/TOrderTaxiMapper.java b/ManagementYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/TOrderTaxiMapper.java
index ebd36d4..ee63b30 100644
--- a/ManagementYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/TOrderTaxiMapper.java
+++ b/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);
 }
diff --git a/ManagementYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/TOrderTaxiMapper.xml b/ManagementYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/TOrderTaxiMapper.xml
index 20250be..bcdbd1c 100644
--- a/ManagementYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/TOrderTaxiMapper.xml
+++ b/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>
diff --git a/ManagementYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/response/TOrderStatisticsAnnualTrendVo.java b/ManagementYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/response/TOrderStatisticsAnnualTrendVo.java
new file mode 100644
index 0000000..dea7093
--- /dev/null
+++ b/ManagementYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/response/TOrderStatisticsAnnualTrendVo.java
@@ -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;
+
+}
diff --git a/ManagementYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/response/TOrderStatisticsCarVo.java b/ManagementYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/response/TOrderStatisticsCarVo.java
new file mode 100644
index 0000000..3975796
--- /dev/null
+++ b/ManagementYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/response/TOrderStatisticsCarVo.java
@@ -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;
+
+}
diff --git a/ManagementYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/response/TOrderStatisticsCountVo.java b/ManagementYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/response/TOrderStatisticsCountVo.java
new file mode 100644
index 0000000..2b1ad61
--- /dev/null
+++ b/ManagementYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/response/TOrderStatisticsCountVo.java
@@ -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;
+
+}
diff --git a/ManagementYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/response/TOrderStatisticsPassengerVo.java b/ManagementYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/response/TOrderStatisticsPassengerVo.java
new file mode 100644
index 0000000..12c233b
--- /dev/null
+++ b/ManagementYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/response/TOrderStatisticsPassengerVo.java
@@ -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;
+
+}
diff --git a/ManagementYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/response/TOrderStatisticsTotalOrderVo.java b/ManagementYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/response/TOrderStatisticsTotalOrderVo.java
new file mode 100644
index 0000000..edee9f8
--- /dev/null
+++ b/ManagementYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/response/TOrderStatisticsTotalOrderVo.java
@@ -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);
+    }
+}
diff --git a/ManagementYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/TOrderStatisticsService.java b/ManagementYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/TOrderStatisticsService.java
new file mode 100644
index 0000000..0a030c3
--- /dev/null
+++ b/ManagementYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/TOrderStatisticsService.java
@@ -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);
+}
diff --git a/ManagementYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TOrderStatisticsServiceImpl.java b/ManagementYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TOrderStatisticsServiceImpl.java
new file mode 100644
index 0000000..0e1bcc3
--- /dev/null
+++ b/ManagementYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TOrderStatisticsServiceImpl.java
@@ -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);
+    }
+}

--
Gitblit v1.7.1