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