From 4c8535b9f263a3b398832b7a588abbdd5ebe38f4 Mon Sep 17 00:00:00 2001
From: rk <94314517@qq.com>
Date: 星期一, 29 六月 2026 13:51:50 +0800
Subject: [PATCH] 功能开发

---
 server/services/src/main/java/com/doumee/service/business/impl/ReportServiceImpl.java |  173 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 173 insertions(+), 0 deletions(-)

diff --git a/server/services/src/main/java/com/doumee/service/business/impl/ReportServiceImpl.java b/server/services/src/main/java/com/doumee/service/business/impl/ReportServiceImpl.java
index da298bd..8f85057 100644
--- a/server/services/src/main/java/com/doumee/service/business/impl/ReportServiceImpl.java
+++ b/server/services/src/main/java/com/doumee/service/business/impl/ReportServiceImpl.java
@@ -22,6 +22,8 @@
 import com.doumee.dao.business.model.MemberRides;
 import com.doumee.dao.business.model.MemberRidesTrack;
 import com.doumee.dao.business.vo.BikeIncomeStatVO;
+import com.doumee.dao.business.vo.BikeUsageStatVO;
+import com.doumee.dao.business.vo.DashboardVO;
 import com.doumee.dao.business.vo.IncomeDailyVO;
 import com.doumee.dao.business.vo.IncomeStatVO;
 import com.doumee.dao.business.vo.OperationCenterVO;
@@ -30,6 +32,7 @@
 import com.doumee.dao.business.vo.OrderRideTrackVO;
 import com.doumee.dao.business.vo.OrderRidesDetailVO;
 import com.doumee.dao.business.vo.OverviewStatVO;
+import com.doumee.dao.business.vo.PackageSourceStatVO;
 import com.doumee.dao.business.web.request.BikeIncomeQueryDTO;
 import com.doumee.dao.business.web.request.OperationOrderQueryDTO;
 import com.doumee.service.business.ReportService;
@@ -41,6 +44,7 @@
 
 import java.math.BigDecimal;
 import java.util.ArrayList;
+import java.util.Calendar;
 import java.util.Collections;
 import java.util.Comparator;
 import java.util.Date;
@@ -89,6 +93,9 @@
 
     /** 鐧惧垎姣斿熀鏁�(澧為暱鐜� = (鏈湡 - 瀵规瘮鏈�) / 瀵规瘮鏈� 脳 100) */
     private static final BigDecimal PERCENT_BASE = new BigDecimal("100");
+
+    /** 鏀粯鏂瑰紡:鎶栭煶鍒告牳閿�(濂楅閿�鍞潵婧愯瘑鍒敤) */
+    private static final int PAY_WAY_DOUYIN = 2;
 
     @Override
     public OverviewStatVO overview() {
@@ -617,4 +624,170 @@
         }
         return "鏈煡";
     }
+
+    @Override
+    public IncomeStatVO incomeStat30() {
+        // 杩�30澶�(鍚粖澶╁叡30澶�),澶嶇敤 incomeStat 鏃㈡湁瀹炵幇涓庡彛寰�
+        BikeIncomeQueryDTO query = new BikeIncomeQueryDTO();
+        query.setDateType(3);
+        return incomeStat(query);
+    }
+
+    @Override
+    public BikeUsageStatVO bikeUsageStat() {
+        // status:0 绌洪棽 / 1 浣跨敤涓�;绂佺敤(3)涓嶈鍏�;type:0 鑷杞� / 1 鐢靛姩杞�
+        BikeUsageStatVO vo = new BikeUsageStatVO();
+        vo.setBikeIdle(countBikeByStatus(Constants.ZERO, Constants.ZERO));
+        vo.setBikeInUse(countBikeByStatus(Constants.ZERO, Constants.ONE));
+        vo.setEleBikeIdle(countBikeByStatus(Constants.ONE, Constants.ZERO));
+        vo.setEleBikeInUse(countBikeByStatus(Constants.ONE, Constants.ONE));
+        return vo;
+    }
+
+    /**
+     * 鎸夎溅杈嗙被鍨� + 鐘舵�佺粺璁℃湭鍒犻櫎杞﹁締鏁伴噺銆�
+     *
+     * @param type   杞﹁締绫诲瀷 0 鑷杞� / 1 鐢靛姩杞�
+     * @param status 杞﹁締鐘舵�� 0 绌洪棽 / 1 浣跨敤涓�
+     * @return 婊¤冻鏉′欢鐨勮溅杈嗘暟
+     */
+    private long countBikeByStatus(Integer type, Integer status) {
+        return bikesMapper.selectCount(
+                new QueryWrapper<Bikes>().lambda()
+                        .eq(Bikes::getType, type)
+                        .eq(Bikes::getStatus, status)
+                        .eq(Bikes::getIsdeleted, Constants.ZERO));
+    }
+
+    @Override
+    public PackageSourceStatVO packageSourceStat() {
+        // 鏈湀/鏈勾璧锋(pay_date 钀藉湪鍖洪棿鍐�);goodsorder type=1 濂楅鍗¤喘涔� + payStatus=1 宸叉敮浠�
+        Calendar cal = Calendar.getInstance();
+        Date monthStart = DateUtil.getStartOfDay(getFirstMs(cal, Calendar.MONTH));
+        Date monthEnd = DateUtil.getEndOfDay(new Date());
+        Date yearStart = DateUtil.getStartOfDay(getFirstMs(cal, Calendar.YEAR));
+        Date yearEnd = DateUtil.getEndOfDay(new Date());
+
+        PackageSourceStatVO vo = new PackageSourceStatVO();
+        vo.setMonth(countPackageSource(monthStart, monthEnd));
+        vo.setYear(countPackageSource(yearStart, yearEnd));
+        return vo;
+    }
+
+    /**
+     * 缁熻鎸囧畾鏃舵鍐呭椁愰攢鍞潵婧愭暟閲忋��
+     * <p>鎶栭煶鍏戞崲 = payWay 2,灏忕▼搴忚喘涔� = payWay 0(寰俊)銆�
+     *
+     * @param start 璧峰鏃堕棿(鍚�)
+     * @param end   缁撴潫鏃堕棿(鍚�)
+     * @return 鎶栭煶/灏忕▼搴忓椁愭暟閲�
+     */
+    private PackageSourceStatVO.PeriodCount countPackageSource(Date start, Date end) {
+        List<Goodsorder> orders = goodsorderMapper.selectList(
+                new QueryWrapper<Goodsorder>().lambda()
+                        .select(Goodsorder::getPayWay)
+                        .eq(Goodsorder::getType, Constants.ONE)
+                        .eq(Goodsorder::getPayStatus, Constants.ONE)
+                        .eq(Goodsorder::getIsdeleted, Constants.ZERO)
+                        .ge(Goodsorder::getPayDate, start)
+                        .le(Goodsorder::getPayDate, end));
+        long douyin = 0L;
+        long mini = 0L;
+        for (Goodsorder o : orders) {
+            if (o.getPayWay() == null) {
+                continue;
+            }
+            if (o.getPayWay() == PAY_WAY_DOUYIN) {
+                douyin++;
+            } else if (o.getPayWay() == Constants.ZERO) {
+                mini++;
+            }
+        }
+        PackageSourceStatVO.PeriodCount pc = new PackageSourceStatVO.PeriodCount();
+        pc.setDouyinCount(douyin);
+        pc.setMiniCount(mini);
+        return pc;
+    }
+
+    @Override
+    public DashboardVO dashboard() {
+        DashboardVO vo = new DashboardVO();
+
+        // 鍚勬椂娈佃捣姝�:鏈湀/鏄ㄦ棩/浠婃棩
+        Date now = new Date();
+        Calendar cal = Calendar.getInstance();
+        Date monthStart = DateUtil.getStartOfDay(getFirstMs(cal, Calendar.MONTH));
+        Date monthEnd = DateUtil.getEndOfDay(now);
+        Date yesterdayStart = DateUtil.getStartOfDay(DateUtil.increaseDay(now, -1));
+        Date yesterdayEnd = DateUtil.getEndOfDay(DateUtil.increaseDay(now, -1));
+        Date todayStart = DateUtil.getStartOfDay(now);
+        Date todayEnd = DateUtil.getEndOfDay(now);
+
+        // 鏀剁泭(鍙e緞鍚� incomeStat:type=0 鎶奸噾 + status=4 宸茬粨绠� 鐨� closeMoney),澶嶇敤 sumClosedMoney
+        vo.setMonthIncome(sumClosedMoney(monthStart, monthEnd));
+        vo.setYesterdayIncome(sumClosedMoney(yesterdayStart, yesterdayEnd));
+        vo.setTodayIncome(sumClosedMoney(todayStart, todayEnd));
+
+        // 璁㈠崟鏁�:宸叉敮浠�(payStatus=1)璁㈠崟璁℃暟
+        vo.setMonthOrderCount(countPaidOrders(monthStart, monthEnd));
+        vo.setYesterdayOrderCount(countPaidOrders(yesterdayStart, yesterdayEnd));
+        vo.setTodayOrderCount(countPaidOrders(todayStart, todayEnd));
+
+        // 杞﹁締:浠呰繑鍥炴湭鍒犻櫎鎬绘暟
+        vo.setTotalBikeCount((long) bikesMapper.selectCount(
+                new QueryWrapper<Bikes>().lambda().eq(Bikes::getIsdeleted, Constants.ZERO)));
+
+        // 瀹㈡埛鏁�:鎬讳細鍛�=鏈垹闄ゅ叏閮�;浠婃棩/鏄ㄦ棩鏂板鎸� create_date 钀藉湪瀵瑰簲鍖洪棿(涓� overview 鍙e緞涓�鑷�)
+        vo.setTotalMemberCount((long) memberMapper.selectCount(
+                new QueryWrapper<Member>().lambda().eq(Member::getIsdeleted, Constants.ZERO)));
+        vo.setYesterdayNewMember((long) memberMapper.selectCount(
+                new QueryWrapper<Member>().lambda()
+                        .eq(Member::getIsdeleted, Constants.ZERO)
+                        .ge(Member::getCreateDate, yesterdayStart)
+                        .le(Member::getCreateDate, yesterdayEnd)));
+        vo.setTodayNewMember((long) memberMapper.selectCount(
+                new QueryWrapper<Member>().lambda()
+                        .eq(Member::getIsdeleted, Constants.ZERO)
+                        .ge(Member::getCreateDate, todayStart)));
+        return vo;
+    }
+
+    /**
+     * 缁熻鎸囧畾鏃舵鍐呭凡鏀粯璁㈠崟鏁伴噺(payStatus=1)銆�
+     *
+     * @param start 璧峰鏃堕棿(鍚�)
+     * @param end   缁撴潫鏃堕棿(鍚�)
+     * @return 宸叉敮浠樿鍗曟暟
+     */
+    private long countPaidOrders(Date start, Date end) {
+        return goodsorderMapper.selectCount(
+                new QueryWrapper<Goodsorder>().lambda()
+                        .eq(Goodsorder::getPayStatus, Constants.ONE)
+                        .eq(Goodsorder::getIsdeleted, Constants.ZERO)
+                        .ge(Goodsorder::getPayDate, start)
+                        .le(Goodsorder::getPayDate, end));
+    }
+
+    /**
+     * 鍙栨湰鏈�/鏈勾绗竴澶╃殑鏃堕棿鍘熷��(鏃跺垎绉掑綊闆跺墠鐨勬绉�),鐢ㄤ簬鏋勯�犲尯闂磋捣濮嬨��
+     * <p>鐢� Calendar 鎶娿�屽綋鏈�1鏃� 00:00:00.000銆嶆垨銆屽綋骞�1鏈�1鏃� 00:00:00.000銆嶅彇鍑恒��
+     *
+     * @param cal   鏃ュ巻(浼氳淇敼)
+     * @param field Calendar.MONTH 鏈湀绗竴澶� / Calendar.YEAR 鏈勾绗竴澶�
+     * @return 鍖洪棿璧峰鏃堕棿
+     */
+    private Date getFirstMs(Calendar cal, int field) {
+        cal.setTime(new Date());
+        if (field == Calendar.MONTH) {
+            cal.set(Calendar.DAY_OF_MONTH, 1);
+        } else {
+            cal.set(Calendar.MONTH, Calendar.JANUARY);
+            cal.set(Calendar.DAY_OF_MONTH, 1);
+        }
+        cal.set(Calendar.HOUR_OF_DAY, 0);
+        cal.set(Calendar.MINUTE, 0);
+        cal.set(Calendar.SECOND, 0);
+        cal.set(Calendar.MILLISECOND, 0);
+        return cal.getTime();
+    }
 }

--
Gitblit v1.9.3