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} - + +