diff --git a/pom.xml b/pom.xml
index 8672366..feb0b53 100644
--- a/pom.xml
+++ b/pom.xml
@@ -57,6 +57,10 @@
org.springframework.boot
+ spring-boot-starter-aop
+
+
+ org.springframework.boot
spring-boot-starter-validation
diff --git a/src/main/java/com/example/demo/Util/ExecutionTimeAspect.java b/src/main/java/com/example/demo/Util/ExecutionTimeAspect.java
new file mode 100644
index 0000000..201ee1b
--- /dev/null
+++ b/src/main/java/com/example/demo/Util/ExecutionTimeAspect.java
@@ -0,0 +1,29 @@
+package com.example.demo.Util;
+
+import org.aspectj.lang.ProceedingJoinPoint;
+import org.aspectj.lang.annotation.Around;
+import org.aspectj.lang.annotation.Aspect;
+import org.springframework.stereotype.Component;
+
+/**
+ * @program: gold-java
+ * @ClassName ExecutionTimeAspect
+ * @description:
+ * @author: Ethan
+ * @create: 2025−07-03 10:50
+ * @Version 1.0
+ **/
+
+@Aspect
+@Component
+public class ExecutionTimeAspect {
+
+ @Around("execution(* com.example.demo.serviceImpl.WorkbenchServiceImpl.*(..))")
+ public Object logExecutionTime(ProceedingJoinPoint joinPoint) throws Throwable {
+ long start = System.currentTimeMillis();
+ Object proceed = joinPoint.proceed();
+ long executionTime = System.currentTimeMillis() - start;
+ System.out.println("执行时间 " + joinPoint.getSignature() + ": " + executionTime + " ms");
+ return proceed;
+ }
+}
diff --git a/src/main/java/com/example/demo/domain/vo/WorkbenchCard.java b/src/main/java/com/example/demo/domain/vo/WorkbenchCard.java
index 8453b45..0b03299 100644
--- a/src/main/java/com/example/demo/domain/vo/WorkbenchCard.java
+++ b/src/main/java/com/example/demo/domain/vo/WorkbenchCard.java
@@ -24,6 +24,7 @@ import java.util.List;
public class WorkbenchCard implements Serializable {
private String token; //用户token
private List marketCards; // 地区卡片数据
+ private List marketGraphs; // 地区图表数据
private List markets; // 地区列表
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Shanghai")
private Date startDate; // 起始时间
diff --git a/src/main/java/com/example/demo/domain/vo/WorkbenchFullStatistics.java b/src/main/java/com/example/demo/domain/vo/WorkbenchFullStatistics.java
new file mode 100644
index 0000000..0eefc96
--- /dev/null
+++ b/src/main/java/com/example/demo/domain/vo/WorkbenchFullStatistics.java
@@ -0,0 +1,29 @@
+package com.example.demo.domain.vo;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serializable;
+
+/**
+ * @program: gold-java
+ * @ClassName WorkbenchFullStatistics
+ * @description:
+ * @author: Ethan
+ * @create: 2025−07-03 13:46
+ * @Version 1.0
+ **/
+
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+public class WorkbenchFullStatistics implements Serializable {
+ private Integer totalRecharge; //总充值
+ private Integer totalMoney; //总金额
+ private Integer totalConsumePermanent; //总消费-永久金币
+ private Integer totalConsumeFree; //总消费-免费金币
+ private Integer totalConsumeTask; //总消费-任务金币
+ private Integer totalRefund; //总退款
+ private Integer totalRechargeNum; //总充值人数
+}
diff --git a/src/main/java/com/example/demo/domain/vo/WorkbenchMarketGraph.java b/src/main/java/com/example/demo/domain/vo/WorkbenchMarketGraph.java
new file mode 100644
index 0000000..f2a15b4
--- /dev/null
+++ b/src/main/java/com/example/demo/domain/vo/WorkbenchMarketGraph.java
@@ -0,0 +1,29 @@
+package com.example.demo.domain.vo;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serializable;
+
+/**
+ * @program: gold-java
+ * @ClassName WorkbenchMarketGraph
+ * @description:
+ * @author: Ethan
+ * @create: 2025−07-03 10:16
+ * @Version 1.0
+ **/
+
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+public class WorkbenchMarketGraph implements Serializable {
+ private String market;//地区
+ //图表
+ private Integer SumRechargePermanent; //合计充值永久金币
+ private Integer SumRechargeFree; //合计充值免费金币
+ private Integer SumConsumePermanent; //合计消费永久金币
+ private Integer SumConsumeFree; //合计消费免费金币
+ private Integer SumConsumeTask; //合计消费任务金币
+}
diff --git a/src/main/java/com/example/demo/mapper/WorkBenchMapper.java b/src/main/java/com/example/demo/mapper/WorkBenchMapper.java
index 6dd220a..95bc78a 100644
--- a/src/main/java/com/example/demo/mapper/WorkBenchMapper.java
+++ b/src/main/java/com/example/demo/mapper/WorkBenchMapper.java
@@ -1,6 +1,7 @@
package com.example.demo.mapper;
import com.example.demo.domain.vo.WorkbenchCard;
+import com.example.demo.domain.vo.WorkbenchFullStatistics;
import org.apache.ibatis.annotations.Mapper;
import java.util.Date;
@@ -33,4 +34,6 @@ public interface WorkBenchMapper {
Integer sumRefund(String market,Date startDate, Date endDate);
//给定时间范围内的该地区充值人头数(根据精网号去重,老数据有多人共用一个精网号的问题)
Integer countRechargeNum(String market, Date startDate, Date endDate);
+ //给定时间范围内的该地区统计数据
+ WorkbenchFullStatistics getFullStatisticsByMarketAndDate(String market, Date startDate, Date endDate);
}
diff --git a/src/main/java/com/example/demo/service/WorkbenchService.java b/src/main/java/com/example/demo/service/WorkbenchService.java
index 0207e5c..70b26f0 100644
--- a/src/main/java/com/example/demo/service/WorkbenchService.java
+++ b/src/main/java/com/example/demo/service/WorkbenchService.java
@@ -6,6 +6,7 @@ import com.example.demo.domain.vo.WorkbenchMarketCard;
import java.util.Date;
import java.util.List;
+import java.util.Map;
/**
* @program: gold-java
@@ -25,7 +26,7 @@ public interface WorkbenchService {
//获取不同地区的工作台柱状图数据(根据类型,起止时间,地区查询)
WorkbenchCard getGraph(String token, Date startDate, Date endDate, List markets);
//根据类型获取年初至今的统计数据
- Integer calculateSum(String market, String type, Date startDate,Date endDate);
+ Map calculateAllSum(String market, Date startDate, Date endDate);
//获取该日期该市场的日同比
Integer calculateDayOverDay(String market,Date date);
//获取该日期该市场的周环比
diff --git a/src/main/java/com/example/demo/serviceImpl/WorkbenchServiceImpl.java b/src/main/java/com/example/demo/serviceImpl/WorkbenchServiceImpl.java
index 35c8833..dc0270b 100644
--- a/src/main/java/com/example/demo/serviceImpl/WorkbenchServiceImpl.java
+++ b/src/main/java/com/example/demo/serviceImpl/WorkbenchServiceImpl.java
@@ -2,7 +2,9 @@ package com.example.demo.serviceImpl;
import com.example.demo.domain.entity.Statistics;
import com.example.demo.domain.vo.WorkbenchCard;
+import com.example.demo.domain.vo.WorkbenchFullStatistics;
import com.example.demo.domain.vo.WorkbenchMarketCard;
+import com.example.demo.domain.vo.WorkbenchMarketGraph;
import com.example.demo.mapper.StatisticsMapper;
import com.example.demo.mapper.WorkBenchMapper;
import com.example.demo.service.GeneralService;
@@ -16,10 +18,7 @@ import java.time.DayOfWeek;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.ZoneId;
-import java.util.ArrayList;
-import java.util.Calendar;
-import java.util.Date;
-import java.util.List;
+import java.util.*;
import java.util.stream.Collectors;
/**
@@ -73,7 +72,7 @@ public class WorkbenchServiceImpl implements WorkbenchService {
// 收集并行流结果为列表
.collect(Collectors.toList());
- return new WorkbenchCard(token, marketCards, markets, date, date);
+ return new WorkbenchCard(token, marketCards,new ArrayList<>(), markets, date, date);
/* List marketCards = new ArrayList<>();
// 遍历每个 marketCard 并填充数据
for (String market : markets) {
@@ -143,6 +142,9 @@ public class WorkbenchServiceImpl implements WorkbenchService {
WorkbenchMarketCard card = new WorkbenchMarketCard();
card.setMarket(market);
if (statistics != null) {
+ // 一次性获取全年统计数据(从年初到今天)
+ Map yearlyStats = calculateAllSum(market, yearlyStartDate, date);
+
// 卡片一:当前金币相关
card.setCurrentPermanent(statistics.getCurrentPermanent());//余量-永久金币
card.setCurrentFreeJune(statistics.getCurrentFreeJune()); //余量-免费六月金币
@@ -154,8 +156,8 @@ public class WorkbenchServiceImpl implements WorkbenchService {
// 卡片二:充值相关
card.setRecharge(statistics.getRecharge()); //充值-当日充值
card.setMoney(statistics.getMoney()); //充值-当日金额(永久)
- card.setYearlyRecharge(calculateSum(market, "recharge",yearlyStartDate ,date));//充值-全年累计充值
- card.setYearlyMoney(calculateSum(market, "money",yearlyStartDate ,date)); //充值-全年累计金额(永久)
+ card.setYearlyRecharge(yearlyStats.getOrDefault("recharge", 0)); // 充值-全年累计充值
+ card.setYearlyMoney(yearlyStats.getOrDefault("money", 0)); // 充值-全年累计金额(永久)//充值-全年累计金额(永久)
// 卡片三:消费与退款
card.setConsumePermanent(statistics.getConsumePermanent());//消费-永久金币
card.setConsumeFreeJune(statistics.getConsumeFreeJune());//消费-免费六月金币
@@ -170,13 +172,14 @@ public class WorkbenchServiceImpl implements WorkbenchService {
//当日总退款
int totalRefund = card.getRefundPermanent() + card.getRefundFreeJune() + card.getRefundFreeDecember() + card.getRefundTask();
card.setDailyReduce(totalConsume - totalRefund);//当日总消耗
- card.setYearlyConsume(calculateSum(market, "consume", yearlyStartDate,date));//年累计消费
- card.setYearlyRefund(calculateSum(market, "refund",yearlyStartDate ,date));//年累计退款
+ card.setYearlyConsume(yearlyStats.getOrDefault("consume", 0)); // 年累计消费
+ card.setYearlyRefund(yearlyStats.getOrDefault("refund", 0)); // 年累计退款
+
card.setYearlyReduce(card.getYearlyConsume() - card.getYearlyRefund());//年累计消耗
// 卡片四:人头数相关
card.setRechargeNum(statistics.getRechargeNum());
card.setFirstRecharge(statistics.getFirstRecharge());
- card.setYearlyRechargeNum(calculateSum(market,"rechargeNum",yearlyStartDate,date));
+ card.setYearlyRechargeNum(yearlyStats.getOrDefault("rechargeNum", 0));
// 周环比、日同比
@@ -188,52 +191,41 @@ public class WorkbenchServiceImpl implements WorkbenchService {
@Override
public WorkbenchCard getGraph(String token, Date startDate, Date endDate, List markets) {
- List marketCards = new ArrayList<>();
+ List marketGraphs = new ArrayList<>();
for (String market : markets) {
- WorkbenchMarketCard cards = new WorkbenchMarketCard();
- cards.setMarket(market);
- cards.setSumRechargePermanent(calculateSum(market, "money",startDate,endDate));
- cards.setSumRechargeFree(calculateSum(market, "rFree",startDate,endDate));
- cards.setSumConsumePermanent(calculateSum(market, "cPermanent",startDate,endDate));
- cards.setSumConsumeFree(calculateSum(market, "cFree",startDate,endDate));
- cards.setSumConsumeTask(calculateSum(market, "cTask",startDate,endDate));
- marketCards.add( cards);
+ Map sums = calculateAllSum(market, startDate, endDate);
+
+ WorkbenchMarketGraph graphs = new WorkbenchMarketGraph();
+ graphs.setMarket(market);
+ graphs.setSumRechargePermanent(sums.get("money"));
+ graphs.setSumRechargeFree(sums.get("rFree"));
+ graphs.setSumConsumePermanent(sums.get("cPermanent"));
+ graphs.setSumConsumeFree(sums.get("cFree"));
+ graphs.setSumConsumeTask(sums.get("cTask"));
+ marketGraphs.add(graphs);
}
- return new WorkbenchCard(token, marketCards,markets,startDate,endDate);
+ return new WorkbenchCard(token, new ArrayList<>(),marketGraphs,markets,startDate,endDate);
}
/*
根据类型获取统计数据
*/
@Override
- public Integer calculateSum(String market, String type, Date startDate,Date endDate) {
+ public Map calculateAllSum(String market, Date startDate, Date endDate) {
+ WorkbenchFullStatistics stats = workBenchMapper.getFullStatisticsByMarketAndDate(market, startDate, endDate);
+ Map result = new HashMap<>();
+ result.put("recharge", stats.getTotalRecharge() != null ? stats.getTotalRecharge() : 0);
+ result.put("money", stats.getTotalMoney() != null ? stats.getTotalMoney() : 0);
+ result.put("rFree", (stats.getTotalRecharge() != null ? stats.getTotalRecharge() : 0)
+ - (stats.getTotalMoney() != null ? stats.getTotalMoney() : 0));
+ result.put("cPermanent", stats.getTotalConsumePermanent() != null ? stats.getTotalConsumePermanent() : 0);
+ result.put("cFree", stats.getTotalConsumeFree() != null ? stats.getTotalConsumeFree() : 0);
+ result.put("cTask", stats.getTotalConsumeTask() != null ? stats.getTotalConsumeTask() : 0);
+ result.put("refund", stats.getTotalRefund() != null ? stats.getTotalRefund() : 0);
+ result.put("rechargeNum", stats.getTotalRechargeNum() != null ? stats.getTotalRechargeNum() : 0);
+ return result;
- //判断类型
- switch
- (type) {
- case "recharge": //获取累计充值
- return workBenchMapper.sumRecharge(market, startDate,endDate);
- case "money": //获取累计金额(永久)
- return workBenchMapper.sumMoney(market,startDate,endDate);
- case "rFree": //获取累计充值(免费)
- return workBenchMapper.sumRecharge(market,startDate,endDate)-
- workBenchMapper.sumMoney(market,startDate,endDate);
- case "consume": //获取累计消费
- return workBenchMapper.sumConsume(market,startDate,endDate);
- case "cPermanent": //获取累计消费-永久
- return workBenchMapper.sumCPermanent(market,startDate,endDate);
- case "cFree": //获取累计消费- 免费
- return workBenchMapper.sumCFree(market,startDate,endDate);
- case "cTask": //获取累计消费- 任务
- return workBenchMapper.sumCTask(market,startDate,endDate);
- case "refund": //获取累计退款
- return workBenchMapper.sumRefund(market,startDate,endDate);
- case "rechargeNum": //获取累计充值人数
- return workBenchMapper.countRechargeNum(market,startDate,endDate);
- default:
- return 0;
- }
}
/*
diff --git a/src/main/resources/mapper/WorkBenchMapper.xml b/src/main/resources/mapper/WorkBenchMapper.xml
index a0df89c..b40242f 100644
--- a/src/main/resources/mapper/WorkBenchMapper.xml
+++ b/src/main/resources/mapper/WorkBenchMapper.xml
@@ -87,5 +87,26 @@
AND current_datetime BETWEEN
#{startDate} and #{endDate}
-
+
+