Browse Source

图表优化

huangqizheng/feature-20250717200321-优化导出
lijianlin 1 month ago
parent
commit
313f933ddd
  1. 8
      src/main/java/com/example/demo/Util/CacheRefreshTask.java
  2. 4
      src/main/java/com/example/demo/controller/WorkbenchController.java
  3. 2
      src/main/java/com/example/demo/domain/vo/WorkbenchCard.java
  4. 1
      src/main/java/com/example/demo/domain/vo/WorkbenchFullStatistics.java
  5. 5
      src/main/java/com/example/demo/mapper/WorkBenchMapper.java
  6. 1
      src/main/java/com/example/demo/service/PermissionService.java
  7. 4
      src/main/java/com/example/demo/service/WorkbenchService.java
  8. 89
      src/main/java/com/example/demo/serviceImpl/WorkbenchServiceImpl.java
  9. 6
      src/main/resources/application.yml
  10. 8
      src/main/resources/mapper/AuditMapper.xml
  11. 1
      src/main/resources/mapper/StatisticsMapper.xml
  12. 27
      src/main/resources/mapper/WorkBenchMapper.xml

8
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<String> markets = generalService.getMarket();
try {
workbenchService.getCardCache(); // 内部会重新查询并写入缓存
workbenchService.getCardCache(markets); // 内部会重新查询并写入缓存
logger.info("缓存刷新成功:" + new java.util.Date());
} catch (Exception e) {
logger.error("缓存刷新失败:" + e.getMessage(), e);

4
src/main/java/com/example/demo/controller/WorkbenchController.java

@ -43,7 +43,7 @@ public class WorkbenchController {
*/
@PostMapping("getCard")
public ResponseEntity<WorkbenchCard> 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);
}
}

2
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; // 总日环比%
}

1
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; //总消费-永久金币

5
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<WorkbenchFullStatistics> getFullStatisticsByMarketAndDate1( @Param("markets") List<String> markets,
@Param("startDate") Date startDate,
@Param("endDate") Date endDate);
}

1
src/main/java/com/example/demo/service/PermissionService.java

@ -23,6 +23,7 @@ public interface PermissionService {
Integer addpermission(Admin admin) throws Exception;
List<Role> getRole(String token);
Integer deleteAdmin(Integer id);
//权限编辑用户
Integer updateAdminRole(AdminRole adminRole);
Integer upadatePermission(Admin admin) throws Exception;

4
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<String> markets );
//缓存卡片数据
WorkbenchCard getCardCache();
WorkbenchCard getCardCache( List<String> markets);
//获取卡片数据
WorkbenchMarketCard createWorkbenchMarketCard(String market, Statistics currentStatistics,Statistics ydayStatistics, Date currentDate);
//获取不同地区的工作台柱状图数据根据类型起止时间地区查询

89
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<String> 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<String> markets = generalService.getMarket();
// markets = generalService.getMarket();
// 批量获取统计数据
List<Statistics> 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<String> 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<String> markets) {
List<WorkbenchMarketGraph> marketGraphs = new ArrayList<>();
if (markets == null || markets.isEmpty()) {
return new WorkbenchCard(new ArrayList<>(), new ArrayList<>(), markets, startDate, endDate,0,0);
}
// 单次批量查询
List<WorkbenchFullStatistics> statsList = workBenchMapper.getFullStatisticsByMarketAndDate1(markets, startDate, endDate);
// 构建 map: market -> statistics
Map<String, WorkbenchFullStatistics> statMap = statsList.stream()
.collect(Collectors.toMap(WorkbenchFullStatistics::getMarket, Function.identity()));
// 构建最终结果
List<WorkbenchMarketGraph> marketGraphs = new ArrayList<>();
for (String market : markets) {
Map<String, Integer> 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<String, Integer> 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<String, Integer> calculateAllSum(String market, Date startDate, Date endDate) {
WorkbenchFullStatistics stats = workBenchMapper.getFullStatisticsByMarketAndDate(market, startDate, endDate);
Map<String, Integer> 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;

6
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

8
src/main/resources/mapper/AuditMapper.xml

@ -36,7 +36,9 @@
<!--根据订单号查未审核订单-->
<select id="selectOrderByOrderCode" resultType="com.example.demo.domain.entity.UserGoldRecord">
select * from user_gold_record where order_code = #{orderCode} and audit_status = 0
select * from user_gold_record
where order_code = #{orderCode} and audit_status = 0
and flag=1
ORDER BY create_time DESC
limit 1
</select>
@ -76,6 +78,7 @@
AND ugr.audit_status = #{rechargeAudit.auditStatus}
</if>
AND ugr.type = 0
and ugr.flag=1
</where>
<choose>
<when test="rechargeAudit.sortField != null and rechargeAudit.sortField.length > 0 or rechargeAudit.sortOrder != null and rechargeAudit.sortOrder.length > 0">
@ -120,6 +123,7 @@
AND ugr.audit_status = #{refundAudit.auditStatus}
</if>
AND ugr.type = 2
and ugr.flag=1
</where>
<choose>
@ -134,7 +138,7 @@
<!--根据订单号查订单-->
<select id="selectAllOrderByOrderCode" resultType="com.example.demo.domain.entity.UserGoldRecord">
select * from user_gold_record where order_code = #{orderCode}
select * from user_gold_record where order_code = #{orderCode} and ugr.flag=1
ORDER BY create_time DESC
limit 1
</select>

1
src/main/resources/mapper/StatisticsMapper.xml

@ -112,6 +112,7 @@
<foreach item="status" collection="auditStatusList" open="(" separator="," close=")">
#{status}
</foreach>
and ugr.flag=1
AND ugr.create_time BETWEEN #{startTime} AND #{endTime}
</select>
<!-- 计算该天充值人数-->

27
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
</select>
<!--给定时间范围内的该地区消费永久金币数-->
@ -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};
</select>
<select id="getFullStatisticsByMarketAndDate1"
resultType="com.example.demo.domain.vo.WorkbenchFullStatistics">
SELECT
s.market,
SUM(s.recharge) AS totalRecharge,
SUM(s.money) AS totalMoney,
SUM(s.consume_permanent) AS totalConsumePermanent,
SUM(s.consume_free_june + s.consume_free_december) AS totalConsumeFree,
SUM(s.consume_task) AS totalConsumeTask,
SUM(s.refund_permanent + s.refund_free_june + s.refund_free_december + s.refund_task) AS totalRefund,
(
SELECT COUNT(DISTINCT ugr.jwcode)
FROM user_gold_record ugr
INNER JOIN user u ON ugr.jwcode = u.jwcode
WHERE u.market = s.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 IN
<foreach item="market" collection="markets" open="(" separator="," close=")">#{market}</foreach>
AND s.current_datetime BETWEEN #{startDate} AND #{endDate}
GROUP BY s.market;
</select>
</mapper>
Loading…
Cancel
Save