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 <> 'ride' AND state IN (8,9)) OR (source = 'ride' AND state = 5)
+ THEN 1 ELSE 0 END
+ ) AS finishNum, -- 已完成订单数量(待评价/已完成)
+ SUM(
+ CASE WHEN (source <> '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 >= #{startDate}
+ AND t.insertTime <= #{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 < 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 >= d.dayDate
+ AND t.insertTime < 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 >= CURDATE()
+ AND insertTime < DATE_ADD(CURDATE(), INTERVAL 1 DAY)
+ UNION ALL
+ SELECT insertTime, payMoney
+ FROM t_order_private_car
+ WHERE insertTime >= CURDATE()
+ AND insertTime < DATE_ADD(CURDATE(), INTERVAL 1 DAY)
+ UNION ALL
+ SELECT insertTime, payMoney
+ FROM t_order_cross_city
+ WHERE insertTime >= CURDATE()
+ AND insertTime < DATE_ADD(CURDATE(), INTERVAL 1 DAY)
+ UNION ALL
+ SELECT addTime AS insertTime, money AS payMoney
+ FROM app_order_ride
+ WHERE addTime >= CURDATE()
+ AND addTime < 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 >= CURDATE()
+ AND t.insertTime < DATE_ADD(CURDATE(), INTERVAL 1 DAY)
+ </if>
+ <if test="null != type and 2 == type">
+ AND t.insertTime >= DATE_SUB(CURDATE(), INTERVAL WEEKDAY(CURDATE()) DAY)
+ AND t.insertTime < DATE_ADD(DATE_SUB(CURDATE(), INTERVAL WEEKDAY(CURDATE()) DAY), INTERVAL 7 DAY)
+ </if>
+ <if test="null != type and 3 == type">
+ t.insertTime >= DATE_FORMAT(CURDATE(), '%Y-%m-01')
+ AND t.insertTime < 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 <> '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 >= CURDATE()
+ AND t.insertTime < DATE_ADD(CURDATE(), INTERVAL 1 DAY)
+ </if>
+ <if test="null != type and 2 == type">
+ AND t.insertTime >= DATE_SUB(CURDATE(), INTERVAL WEEKDAY(CURDATE()) DAY)
+ AND t.insertTime < DATE_ADD(DATE_SUB(CURDATE(), INTERVAL WEEKDAY(CURDATE()) DAY), INTERVAL 7 DAY)
+ </if>
+ <if test="null != type and 3 == type">
+ AND t.insertTime >= DATE_FORMAT(CURDATE(), '%Y-%m-01')
+ AND t.insertTime < 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