From 313f933ddd7c95bb328a47d8236a4e4be7b5e383 Mon Sep 17 00:00:00 2001 From: lijianlin Date: Tue, 15 Jul 2025 15:22:33 +0800 Subject: [PATCH] =?UTF-8?q?=E5=9B=BE=E8=A1=A8=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/example/demo/Util/CacheRefreshTask.java | 8 +- .../demo/controller/WorkbenchController.java | 4 +- .../com/example/demo/domain/vo/WorkbenchCard.java | 2 + .../demo/domain/vo/WorkbenchFullStatistics.java | 1 + .../com/example/demo/mapper/WorkBenchMapper.java | 5 ++ .../example/demo/service/PermissionService.java | 1 + .../com/example/demo/service/WorkbenchService.java | 4 +- .../demo/serviceImpl/WorkbenchServiceImpl.java | 89 +++++++++++++++------- src/main/resources/application.yml | 6 +- src/main/resources/mapper/AuditMapper.xml | 8 +- src/main/resources/mapper/StatisticsMapper.xml | 1 + src/main/resources/mapper/WorkBenchMapper.xml | 27 +++++++ 12 files changed, 117 insertions(+), 39 deletions(-) diff --git a/src/main/java/com/example/demo/Util/CacheRefreshTask.java b/src/main/java/com/example/demo/Util/CacheRefreshTask.java index e2f2f0d..d9e10f8 100644 --- a/src/main/java/com/example/demo/Util/CacheRefreshTask.java +++ b/src/main/java/com/example/demo/Util/CacheRefreshTask.java @@ -1,5 +1,6 @@ package com.example.demo.Util; +import com.example.demo.service.GeneralService; import com.example.demo.service.WorkbenchService; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -7,8 +8,12 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; +import java.util.List; + @Component public class CacheRefreshTask { + @Autowired + private GeneralService generalService; private static final Logger logger = LoggerFactory.getLogger(CacheRefreshTask.class); @@ -22,8 +27,9 @@ public class CacheRefreshTask { // 每小时执行一次(1分0秒) @Scheduled(cron = "0 1 * * * ?") public void refreshCache() { + List markets = generalService.getMarket(); try { - workbenchService.getCardCache(); // 内部会重新查询并写入缓存 + workbenchService.getCardCache(markets); // 内部会重新查询并写入缓存 logger.info("缓存刷新成功:" + new java.util.Date()); } catch (Exception e) { logger.error("缓存刷新失败:" + e.getMessage(), e); diff --git a/src/main/java/com/example/demo/controller/WorkbenchController.java b/src/main/java/com/example/demo/controller/WorkbenchController.java index dd21035..429a95f 100644 --- a/src/main/java/com/example/demo/controller/WorkbenchController.java +++ b/src/main/java/com/example/demo/controller/WorkbenchController.java @@ -43,7 +43,7 @@ public class WorkbenchController { */ @PostMapping("getCard") public ResponseEntity card1(@RequestBody WorkbenchCard workbench){ - WorkbenchCard result =workbenchService.getCardCache(); + WorkbenchCard result =workbenchService.getCardCache(workbench.getMarkets()); return ResponseEntity.ok(result); } /* @@ -62,7 +62,7 @@ public class WorkbenchController { statisticsService.runHourlyTaskPart1(); //更新余量数据 statisticsService.runHourlyTaskPart2(); //更新余量外数据 - WorkbenchCard result =workbenchService.getCard(); //获取卡片数据 + WorkbenchCard result =workbenchService.getCard(workbench.getMarkets()); //获取卡片数据 return ResponseEntity.ok(result); } } 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 7be77a1..3abc2cd 100644 --- a/src/main/java/com/example/demo/domain/vo/WorkbenchCard.java +++ b/src/main/java/com/example/demo/domain/vo/WorkbenchCard.java @@ -30,6 +30,8 @@ public class WorkbenchCard implements Serializable { private Date startDate; // 起始时间 @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Shanghai") private Date endDate; // 结束时间 + private Integer sumWow; // 总周同比(%) + private Integer sumDaily; // 总日环比(%) } diff --git a/src/main/java/com/example/demo/domain/vo/WorkbenchFullStatistics.java b/src/main/java/com/example/demo/domain/vo/WorkbenchFullStatistics.java index b635966..6b555b1 100644 --- a/src/main/java/com/example/demo/domain/vo/WorkbenchFullStatistics.java +++ b/src/main/java/com/example/demo/domain/vo/WorkbenchFullStatistics.java @@ -19,6 +19,7 @@ import java.io.Serializable; @NoArgsConstructor @AllArgsConstructor public class WorkbenchFullStatistics implements Serializable { + private String market; //地区 private Integer totalRecharge; //总充值 private Integer totalMoney; //总金额 private Integer totalConsumePermanent; //总消费-永久金币 diff --git a/src/main/java/com/example/demo/mapper/WorkBenchMapper.java b/src/main/java/com/example/demo/mapper/WorkBenchMapper.java index 95bc78a..f822a92 100644 --- a/src/main/java/com/example/demo/mapper/WorkBenchMapper.java +++ b/src/main/java/com/example/demo/mapper/WorkBenchMapper.java @@ -3,6 +3,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 org.apache.ibatis.annotations.Param; import java.util.Date; import java.util.List; @@ -36,4 +37,8 @@ public interface WorkBenchMapper { Integer countRechargeNum(String market, Date startDate, Date endDate); //给定时间范围内的该地区统计数据 WorkbenchFullStatistics getFullStatisticsByMarketAndDate(String market, Date startDate, Date endDate); + //给定时间范围内的该地区统计数据修改 + List getFullStatisticsByMarketAndDate1( @Param("markets") List markets, + @Param("startDate") Date startDate, + @Param("endDate") Date endDate); } diff --git a/src/main/java/com/example/demo/service/PermissionService.java b/src/main/java/com/example/demo/service/PermissionService.java index e306b28..4be277b 100644 --- a/src/main/java/com/example/demo/service/PermissionService.java +++ b/src/main/java/com/example/demo/service/PermissionService.java @@ -23,6 +23,7 @@ public interface PermissionService { Integer addpermission(Admin admin) throws Exception; List getRole(String token); Integer deleteAdmin(Integer id); + //权限编辑用户 Integer updateAdminRole(AdminRole adminRole); Integer upadatePermission(Admin admin) throws Exception; diff --git a/src/main/java/com/example/demo/service/WorkbenchService.java b/src/main/java/com/example/demo/service/WorkbenchService.java index c41e316..5a366c6 100644 --- a/src/main/java/com/example/demo/service/WorkbenchService.java +++ b/src/main/java/com/example/demo/service/WorkbenchService.java @@ -20,9 +20,9 @@ import java.util.Map; public interface WorkbenchService { //获取不同地区的工作台统计卡片 - WorkbenchCard getCard( ); + WorkbenchCard getCard(List markets ); //缓存卡片数据 - WorkbenchCard getCardCache(); + WorkbenchCard getCardCache( List markets); //获取卡片数据 WorkbenchMarketCard createWorkbenchMarketCard(String market, Statistics currentStatistics,Statistics ydayStatistics, Date currentDate); //获取不同地区的工作台柱状图数据(根据类型,起止时间,地区查询) diff --git a/src/main/java/com/example/demo/serviceImpl/WorkbenchServiceImpl.java b/src/main/java/com/example/demo/serviceImpl/WorkbenchServiceImpl.java index 3ad82e7..786784a 100644 --- a/src/main/java/com/example/demo/serviceImpl/WorkbenchServiceImpl.java +++ b/src/main/java/com/example/demo/serviceImpl/WorkbenchServiceImpl.java @@ -51,7 +51,8 @@ public class WorkbenchServiceImpl implements WorkbenchService { } private static final String CACHE_KEY = "workbench_card_cache"; @Override - public WorkbenchCard getCard( ) { + public WorkbenchCard getCard( List markets) { + Date date=new Date(); // 获取开始时间和结束时间(当天) LocalDateTime startOfDay = LocalDateTime.now().with(LocalTime.MIN); LocalDateTime endOfDay = startOfDay.plusDays(1).minusSeconds(1); @@ -62,7 +63,7 @@ public class WorkbenchServiceImpl implements WorkbenchService { // 获取当前年份的第一天 LocalDate firstDayOfYear = LocalDate.now().withDayOfYear(1); Date yearlyStartDate = Date.from(firstDayOfYear.atStartOfDay(ZoneId.systemDefault()).toInstant()); - List markets = generalService.getMarket(); + // markets = generalService.getMarket(); // 批量获取统计数据 List currentStatsList = statisticsMapper.selectByMarketsAndDate(markets, @@ -89,20 +90,27 @@ public class WorkbenchServiceImpl implements WorkbenchService { new Date())) .collect(Collectors.toList()); + Integer sumWow= calculateAllWeekOverWeek(date); + Integer sumDaily=calculateAllDayOverDay(date); - return new WorkbenchCard(marketCards, new ArrayList<>(), markets, new Date(), new Date()); + return new WorkbenchCard(marketCards, new ArrayList<>(), markets, new Date(), new Date(),sumWow,sumDaily); } @Override - public WorkbenchCard getCardCache() { + public WorkbenchCard getCardCache(List markets) { + markets = generalService.getMarket(); + //从缓存中获取工作台数据 WorkbenchCard cached = redisTemplate.opsForValue().get(CACHE_KEY); if (cached != null) { + //直接返回缓存数据 System.out.println("读取缓存数据: " + new Date()); return cached; } try { - WorkbenchCard freshData = getCard(); + //获取新的工作台数据 + WorkbenchCard freshData = getCard(markets); + //存入缓存,一小时后过期(与统计表更新时间对应) redisTemplate.opsForValue().set(CACHE_KEY, freshData, 1, java.util.concurrent.TimeUnit.HOURS); System.out.println("刷新缓存并存储新数据: " + new Date()); return freshData; @@ -159,9 +167,8 @@ public class WorkbenchServiceImpl implements WorkbenchService { card.setYearlyRechargeNum(currentStatistics.getYearlyRechargeNum()); // 周环比、日同比 card.setWow(calculateWeekOverWeek(market, currentDate)); - card.setSumWow(calculateAllWeekOverWeek(date)); card.setDaily(calculateDayOverDay(market, currentDate)); - card.setSumDaily(calculateAllDayOverDay(date)); + /* //更新时间 card.setUpdateTime(currentStatistics.getUpdateTime());*/ } @@ -170,22 +177,46 @@ public class WorkbenchServiceImpl implements WorkbenchService { @Override public WorkbenchCard getGraph( Date startDate, Date endDate, List markets) { - List marketGraphs = new ArrayList<>(); + if (markets == null || markets.isEmpty()) { + return new WorkbenchCard(new ArrayList<>(), new ArrayList<>(), markets, startDate, endDate,0,0); + } + // 单次批量查询 + List statsList = workBenchMapper.getFullStatisticsByMarketAndDate1(markets, startDate, endDate); + + // 构建 map: market -> statistics + Map statMap = statsList.stream() + .collect(Collectors.toMap(WorkbenchFullStatistics::getMarket, Function.identity())); + + // 构建最终结果 + List marketGraphs = new ArrayList<>(); for (String market : markets) { - 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")); - graphs.setSumConsume(sums.get("consume")); - marketGraphs.add(graphs); + WorkbenchFullStatistics stats = statMap.getOrDefault(market, new WorkbenchFullStatistics()); + + Map sums = new HashMap<>(); + sums.put("recharge", stats.getTotalRecharge() != null ? stats.getTotalRecharge() : 0); + sums.put("money", stats.getTotalMoney() != null ? stats.getTotalMoney() : 0); + sums.put("rFree", sums.get("recharge") - sums.get("money")); + sums.put("cPermanent", stats.getTotalConsumePermanent() != null ? stats.getTotalConsumePermanent() : 0); + sums.put("cFree", stats.getTotalConsumeFree() != null ? stats.getTotalConsumeFree() : 0); + sums.put("cTask", stats.getTotalConsumeTask() != null ? stats.getTotalConsumeTask() : 0); + sums.put("consume", sums.get("cPermanent") + sums.get("cFree") + sums.get("cTask")); + sums.put("refund", stats.getTotalRefund() != null ? stats.getTotalRefund() : 0); + sums.put("rechargeNum", stats.getTotalRechargeNum() != null ? stats.getTotalRechargeNum() : 0); + + WorkbenchMarketGraph graph = new WorkbenchMarketGraph(); + graph.setMarket(market); + graph.setSumRechargePermanent(sums.get("money")); + graph.setSumRechargeFree(sums.get("rFree")); + graph.setSumConsumePermanent(sums.get("cPermanent")); + graph.setSumConsumeFree(sums.get("cFree")); + graph.setSumConsumeTask(sums.get("cTask")); + graph.setSumConsume(sums.get("consume")); + + marketGraphs.add(graph); } - return new WorkbenchCard(new ArrayList<>(),marketGraphs,markets,startDate,endDate); + + return new WorkbenchCard(new ArrayList<>(), marketGraphs, markets, startDate, endDate,0,0); } /* @@ -196,18 +227,18 @@ public class WorkbenchServiceImpl implements WorkbenchService { 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) + 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("consume",(stats.getTotalConsumePermanent() != null ? stats.getTotalConsumePermanent() : 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("consume",(stats.getTotalConsumePermanent() != null ? stats.getTotalConsumePermanent() : 0)//获取全部消费统计数据 +(stats.getTotalConsumeFree() != null ? stats.getTotalConsumeFree() : 0) +(stats.getTotalConsumeTask() != null ? stats.getTotalConsumeTask() : 0)); - result.put("refund", stats.getTotalRefund() != null ? stats.getTotalRefund() : 0); - result.put("rechargeNum", stats.getTotalRechargeNum() != null ? stats.getTotalRechargeNum() : 0); + result.put("refund", stats.getTotalRefund() != null ? stats.getTotalRefund() : 0); //获取退款统计数据 + result.put("rechargeNum", stats.getTotalRechargeNum() != null ? stats.getTotalRechargeNum() : 0);//获取充值人数统计数据 return result; diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index ef7a018..c72f331 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -4,9 +4,9 @@ spring: fail-on-unknown-properties: false datasource: mysql1: - jdbc-url: jdbc:mysql://18.143.76.3:3306/hwgoldc?serverTimezone=Asia/Shanghai - username: hwgoldc - password: zB48T55wCsHC8KPz + jdbc-url: jdbc:mysql://18.143.76.3:3306/hwgold?serverTimezone=Asia/Shanghai + username: hwgold + password: aDiw7MERSATdfGta driver-class-name: com.mysql.cj.jdbc.Driver hikari: pool-name: mysql1HikariCP diff --git a/src/main/resources/mapper/AuditMapper.xml b/src/main/resources/mapper/AuditMapper.xml index 0708cc3..7ecd7d1 100644 --- a/src/main/resources/mapper/AuditMapper.xml +++ b/src/main/resources/mapper/AuditMapper.xml @@ -36,7 +36,9 @@ @@ -76,6 +78,7 @@ AND ugr.audit_status = #{rechargeAudit.auditStatus} AND ugr.type = 0 + and ugr.flag=1 @@ -120,6 +123,7 @@ AND ugr.audit_status = #{refundAudit.auditStatus} AND ugr.type = 2 + and ugr.flag=1 @@ -134,7 +138,7 @@ diff --git a/src/main/resources/mapper/StatisticsMapper.xml b/src/main/resources/mapper/StatisticsMapper.xml index 9192a94..aaec2f0 100644 --- a/src/main/resources/mapper/StatisticsMapper.xml +++ b/src/main/resources/mapper/StatisticsMapper.xml @@ -112,6 +112,7 @@ #{status} + and ugr.flag=1 AND ugr.create_time BETWEEN #{startTime} AND #{endTime} diff --git a/src/main/resources/mapper/WorkBenchMapper.xml b/src/main/resources/mapper/WorkBenchMapper.xml index 3230f2a..bbd075e 100644 --- a/src/main/resources/mapper/WorkBenchMapper.xml +++ b/src/main/resources/mapper/WorkBenchMapper.xml @@ -54,6 +54,7 @@ AND ugr.pay_time BETWEEN #{startDate} and #{endDate} AND ugr.audit_status IN (1,3) + and ugr.flag=1 @@ -103,9 +104,35 @@ WHERE u.market = #{market} AND ugr.pay_time BETWEEN #{startDate} AND #{endDate} AND ugr.audit_status IN (1, 3) + and ugr.flag=1 ) AS totalRechargeNum FROM statistics s WHERE s.market = #{market} AND s.current_datetime BETWEEN #{startDate} AND #{endDate}; +