Browse Source

定时任务统计数据优化

sunjiabei/feature-20250710132313-二期模块
lijianlin 4 weeks ago
parent
commit
89d6fb3805
  1. 19
      src/main/java/com/example/demo/mapper/StatisticsMapper.java
  2. 61
      src/main/java/com/example/demo/serviceImpl/StatisticsServiceImpl.java
  3. 2
      src/main/resources/application-dev.yml
  4. 2
      src/main/resources/application-prod.yml
  5. 2
      src/main/resources/application-test.yml
  6. 2
      src/main/resources/application.yml
  7. 184
      src/main/resources/mapper/StatisticsMapper.xml

19
src/main/java/com/example/demo/mapper/StatisticsMapper.java

@ -68,4 +68,23 @@ public interface StatisticsMapper {
@Param("startDate") Date startDate,
@Param("endDate") Date endDate);
// 一次查 所有地区 Part1余量
List<Statistics> listPart1All(@Param("today") LocalDate today);
// 一次查 所有地区 Part2余量外
List<Statistics> listPart2All(@Param("start") Date start,
@Param("end") Date end,
@Param("today") LocalDate today);
// 一次查 所有地区年度汇总
List<Statistics> listYearAll(@Param("yearStart") Date yearStart,
@Param("end") Date end,
@Param("today") LocalDate today);
// 新增或更新统计数据
void batchInsertPart1(@Param("list") List<Statistics> list);
void batchInsertPart2(@Param("list") List<Statistics> list);
void batchInsertYear(@Param("list") List<Statistics> list);
//批量查询所有地区近一周 Part2余量外
List<Statistics> listPart2RangeAll();
}

61
src/main/java/com/example/demo/serviceImpl/StatisticsServiceImpl.java

@ -44,9 +44,11 @@ public class StatisticsServiceImpl implements StatisticsService {
@Override
@Scheduled(cron = "0 10 * * * ?") // 每小时执行一次
public void runHourlyTaskPart1() {
Date today = new Date(); //取当天日期
for(String market : generalService.getMarket()){
saveStatisticsPart1(market,today);
LocalDate today = LocalDate.now(); //取当天日期
List<Statistics> list = statisticsMapper.listPart1All(today);
if (!list.isEmpty()) {
statisticsMapper.batchInsertPart1(list);
}
}
@ -56,10 +58,15 @@ public class StatisticsServiceImpl implements StatisticsService {
@Override
@Scheduled(cron = "0 10 * * * ?") // 每小时执行一次
public void runHourlyTaskPart2() {
Date today = new Date(); //取当天日期
for(String market : generalService.getMarket()){
saveStatisticsPart2(market,today);
LocalDate today = LocalDate.now();
Date start = Date.from(today.atStartOfDay(ZoneId.systemDefault()).toInstant());
Date end = Date.from(today.plusDays(1).atStartOfDay(ZoneId.systemDefault()).toInstant());
List<Statistics> list = statisticsMapper.listPart2All(start, end,today);
if (!list.isEmpty()) {
statisticsMapper.batchInsertPart2(list);
}
}
/*
每小时执行定时任务更新年度数据
@ -67,17 +74,13 @@ public class StatisticsServiceImpl implements StatisticsService {
@Override
@Scheduled(cron = "0 10 * * * ?") // 每小时执行一次
public void runHourlyTaskYear() {
Date today = new Date();
// 获取当前日期
LocalDate today1 = LocalDate.now();
// 获取当前年份的第一天
LocalDate firstDayOfYear = today1.withDayOfYear(1);
// 将年份的第一天日期转换为Date类型
Date yearlyStartDate=Date.from(firstDayOfYear.atStartOfDay(ZoneId.systemDefault()).toInstant());
for(String market : generalService.getMarket()){
saveStatisticsYear(market,yearlyStartDate,today);
LocalDate today = LocalDate.now();
LocalDate firstDay = today.withDayOfYear(1);
Date yearStart = Date.from(firstDay.atStartOfDay(ZoneId.systemDefault()).toInstant());
Date end = Date.from(today.plusDays(1).atStartOfDay(ZoneId.systemDefault()).toInstant());
List<Statistics> list = statisticsMapper.listYearAll(yearStart, end, today);
if (!list.isEmpty()) {
statisticsMapper.batchInsertYear(list);
}
}
@ -88,27 +91,9 @@ public class StatisticsServiceImpl implements StatisticsService {
@Override
@Scheduled(cron = "0 30 0 * * ?") // 修改为每天 00:30 执行
public void runDailyTaskPart2() {
Calendar cal = Calendar.getInstance();
cal.add(Calendar.DAY_OF_YEAR, -7); // 一周前
Date startDate = cal.getTime();
Date yesterday = generalService.getYesterday(); // 昨天
// 获取 Calendar 实例并设置为昨天的日期
Calendar calendar = Calendar.getInstance();
calendar.setTime(yesterday);
// 设置时间为昨天的23:5955
calendar.set(Calendar.HOUR_OF_DAY, 23);
calendar.set(Calendar.MINUTE, 59);
calendar.set(Calendar.SECOND, 55);
//把yesterday的结束时间设为结束时间
Date endDate= calendar.getTime();
//近一周的日期列表
List<Date> dateList =generalService.getAllDatesBetween(startDate, endDate);
for (Date date : dateList) {
for (String market : generalService.getMarket()) {
saveStatisticsPart2(market, date);
}
List<Statistics> list = statisticsMapper.listPart2RangeAll();
if (!list.isEmpty()) {
statisticsMapper.batchInsertPart2(list);
}
}

2
src/main/resources/application-dev.yml

@ -4,7 +4,7 @@ spring:
fail-on-unknown-properties: false
datasource:
mysql1:
jdbc-url: jdbc:mysql://18.143.76.3:3306/hwgoldc?serverTimezone=Asia/Shanghai&useSSL=false&useUnicode=true
jdbc-url: jdbc:mysql://18.143.76.3:3306/hwgoldc?serverTimezone=Asia/Shanghai&useSSL=false&useUnicode=true&allowMultiQueries=true&rewriteBatchedStatements=true
username: hwgoldc
password: zB48T55wCsHC8KPz
driver-class-name: com.mysql.cj.jdbc.Driver

2
src/main/resources/application-prod.yml

@ -4,7 +4,7 @@ spring:
fail-on-unknown-properties: false
datasource:
mysql1:
jdbc-url: jdbc:mysql://18.143.76.3:3306/hwgold?serverTimezone=Asia/Shanghai&useSSL=false&useUnicode=true
jdbc-url: jdbc:mysql://18.143.76.3:3306/hwgold?serverTimezone=Asia/Shanghai&useSSL=false&useUnicode=true&allowMultiQueries=true&rewriteBatchedStatements=true
username: hwgold
password: aDiw7MERSATdfGta
driver-class-name: com.mysql.cj.jdbc.Driver

2
src/main/resources/application-test.yml

@ -4,7 +4,7 @@ spring:
fail-on-unknown-properties: false
datasource:
mysql1:
jdbc-url: jdbc:mysql://18.143.76.3:3306/hwgoldc?serverTimezone=Asia/Shanghai&useSSL=false&useUnicode=true
jdbc-url: jdbc:mysql://18.143.76.3:3306/hwgoldc?serverTimezone=Asia/Shanghai&useSSL=false&useUnicode=true&allowMultiQueries=true&rewriteBatchedStatements=true
username: hwgoldc
password: zB48T55wCsHC8KPz
driver-class-name: com.mysql.cj.jdbc.Driver

2
src/main/resources/application.yml

@ -6,7 +6,7 @@ spring:
fail-on-unknown-properties: false
datasource:
mysql1:
jdbc-url: jdbc:mysql://18.143.76.3:3306/hwgoldc?serverTimezone=Asia/Shanghai&useSSL=false&useUnicode=true
jdbc-url: jdbc:mysql://18.143.76.3:3306/hwgoldc?serverTimezone=Asia/Shanghai&useSSL=false&useUnicode=true&allowMultiQueries=true&rewriteBatchedStatements=true
username: hwgoldc
password: zB48T55wCsHC8KPz
driver-class-name: com.mysql.cj.jdbc.Driver

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

@ -55,6 +55,87 @@
)
</insert>
<insert id="batchInsertPart1">
<foreach collection="list" item="s" separator=";">
INSERT INTO statistics (
market, current_datetime,
current_gold, daily_change,
current_permanent, current_free_june,
current_free_december, current_task
) VALUES (
#{s.market}, #{s.currentDatetime},
#{s.currentGold}, #{s.dailyChange},
#{s.currentPermanent}, #{s.currentFreeJune},
#{s.currentFreeDecember}, #{s.currentTask}
)
ON DUPLICATE KEY UPDATE
current_gold = VALUES(current_gold),
daily_change = VALUES(daily_change),
current_permanent = VALUES(current_permanent),
current_free_june = VALUES(current_free_june),
current_free_december = VALUES(current_free_december),
current_task = VALUES(current_task)
</foreach>
</insert>
<insert id="batchInsertPart2">
<foreach collection="list" item="s" separator=";">
INSERT INTO statistics (
market, current_datetime,
recharge, money,
consume_permanent, consume_free_june,
consume_free_december, consume_task,
refund_permanent, refund_free_june,
refund_free_december, refund_task,
recharge_num, first_recharge
) VALUES (
#{s.market}, #{s.currentDatetime},
#{s.recharge}, #{s.money},
#{s.consumePermanent}, #{s.consumeFreeJune},
#{s.consumeFreeDecember}, #{s.consumeTask},
#{s.refundPermanent}, #{s.refundFreeJune},
#{s.refundFreeDecember}, #{s.refundTask},
#{s.rechargeNum}, #{s.firstRecharge}
)
ON DUPLICATE KEY UPDATE
recharge = VALUES(recharge),
money = VALUES(money),
consume_permanent = VALUES(consume_permanent),
consume_free_june = VALUES(consume_free_june),
consume_free_december = VALUES(consume_free_december),
consume_task = VALUES(consume_task),
refund_permanent = VALUES(refund_permanent),
refund_free_june = VALUES(refund_free_june),
refund_free_december = VALUES(refund_free_december),
refund_task = VALUES(refund_task),
recharge_num = VALUES(recharge_num),
first_recharge = VALUES(first_recharge)
</foreach>
</insert>
<insert id="batchInsertYear">
<foreach collection="list" item="s" separator=";">
INSERT INTO statistics (
market, current_datetime,
yearly_recharge,
yearly_money,
yearly_consume,
yearly_refund,
yearly_recharge_num
) VALUES (
#{s.market}, #{s.currentDatetime},
#{s.yearlyRecharge},
#{s.yearlyMoney},
#{s.yearlyConsume},
#{s.yearlyRefund},
#{s.yearlyRechargeNum}
)
ON DUPLICATE KEY UPDATE
yearly_recharge = VALUES(yearly_recharge),
yearly_money = VALUES(yearly_money),
yearly_consume = VALUES(yearly_consume),
yearly_refund = VALUES(yearly_refund),
yearly_recharge_num = VALUES(yearly_recharge_num)
</foreach>
</insert>
<!--更新part2统计数据-->
<update id="updatePart2" parameterType="map">
UPDATE statistics
@ -185,6 +266,109 @@
</foreach>
AND current_datetime BETWEEN #{startDate} AND #{endDate}
</select>
<select id="listPart1All" resultType="com.example.demo.domain.entity.Statistics">
SELECT
market,
#{today} AS current_datetime,
COALESCE(SUM(current_permanent_gold),0) +
COALESCE(SUM(current_free_june),0) +
COALESCE(SUM(current_free_december),0) +
COALESCE(SUM(current_task_gold),0) AS current_gold,
COALESCE(SUM(current_permanent_gold),0) AS current_permanent,
COALESCE(SUM(current_free_june),0) AS current_free_june,
COALESCE(SUM(current_free_december),0) AS current_free_december,
COALESCE(SUM(current_task_gold),0) AS current_task,
-- 与昨天差值(从 statistics 表取)
(
COALESCE(SUM(u.current_permanent_gold),0) +
COALESCE(SUM(u.current_free_june),0) +
COALESCE(SUM(u.current_free_december),0) +
COALESCE(SUM(u.current_task_gold),0)
) - COALESCE(
(
SELECT s.current_gold
FROM statistics s
WHERE s.market = u.market
AND s.current_datetime = DATE_SUB(#{today}, INTERVAL 1 DAY)
LIMIT 1
), 0
) AS daily_change
FROM user u
GROUP BY market
</select>
<select id="listPart2All" resultType="com.example.demo.domain.entity.Statistics">
SELECT
u.market,
#{today} AS current_datetime,
COALESCE(SUM(CASE WHEN ugr.type=0 THEN ugr.permanent_gold+ugr.free_june+ugr.free_december+ugr.task_gold END),0) AS recharge,
COALESCE(SUM(CASE WHEN ugr.type=0 THEN ugr.permanent_gold END),0) AS money,
COALESCE(SUM(CASE WHEN ugr.type=1 THEN ugr.permanent_gold END),0) AS consume_permanent,
COALESCE(SUM(CASE WHEN ugr.type=1 THEN ugr.free_june END),0) AS consume_free_june,
COALESCE(SUM(CASE WHEN ugr.type=1 THEN ugr.free_december END),0) AS consume_free_december,
COALESCE(SUM(CASE WHEN ugr.type=1 THEN ugr.task_gold END),0) AS consume_task,
COALESCE(SUM(CASE WHEN ugr.type=2 THEN ugr.permanent_gold END),0) AS refund_permanent,
COALESCE(SUM(CASE WHEN ugr.type=2 THEN ugr.free_june END),0) AS refund_free_june,
COALESCE(SUM(CASE WHEN ugr.type=2 THEN ugr.free_december END),0) AS refund_free_december,
COALESCE(SUM(CASE WHEN ugr.type=2 THEN ugr.task_gold END),0) AS refund_task,
COUNT(DISTINCT CASE WHEN ugr.type=0 THEN ugr.jwcode END) AS recharge_num,
COUNT(DISTINCT CASE WHEN ugr.type=0
AND u.first_recharge BETWEEN #{start} AND #{end} THEN ugr.jwcode END) AS first_recharge
FROM user_gold_record ugr
JOIN user u ON ugr.jwcode = u.jwcode
WHERE ugr.audit_status IN (1,3)
AND ugr.flag = 1
AND ugr.create_time BETWEEN #{start} AND #{end}
GROUP BY u.market
</select>
<select id="listYearAll" resultType="com.example.demo.domain.entity.Statistics">
SELECT market,
COALESCE(SUM(recharge),0) AS yearly_recharge,
#{today} AS current_datetime,
COALESCE(SUM(money),0) AS yearly_money,
COALESCE(SUM(consume_permanent+consume_free_june+consume_free_december+consume_task),0) AS yearly_consume,
COALESCE(SUM(refund_permanent+refund_free_june+refund_free_december+refund_task),0) AS yearly_refund,
COALESCE(SUM(recharge_num),0) AS yearly_recharge_num
FROM statistics
WHERE current_datetime BETWEEN #{yearStart} AND #{end}
GROUP BY market
</select>
<select id="listPart2RangeAll" resultType="com.example.demo.domain.entity.Statistics">
SELECT
u.market,
DATE(ugr.create_time) AS current_datetime, -- 只保留日期
COALESCE(SUM(CASE WHEN ugr.type=0 THEN ugr.permanent_gold+ugr.free_june+ugr.free_december+ugr.task_gold END),0) AS recharge,
COALESCE(SUM(CASE WHEN ugr.type=0 THEN ugr.permanent_gold END),0) AS money,
COALESCE(SUM(CASE WHEN ugr.type=1 THEN ugr.permanent_gold END),0) AS consume_permanent,
COALESCE(SUM(CASE WHEN ugr.type=1 THEN ugr.free_june END),0) AS consume_free_june,
COALESCE(SUM(CASE WHEN ugr.type=1 THEN ugr.free_december END),0) AS consume_free_december,
COALESCE(SUM(CASE WHEN ugr.type=1 THEN ugr.task_gold END),0) AS consume_task,
COALESCE(SUM(CASE WHEN ugr.type=2 THEN ugr.permanent_gold END),0) AS refund_permanent,
COALESCE(SUM(CASE WHEN ugr.type=2 THEN ugr.free_june END),0) AS refund_free_june,
COALESCE(SUM(CASE WHEN ugr.type=2 THEN ugr.free_december END),0) AS refund_free_december,
COALESCE(SUM(CASE WHEN ugr.type=2 THEN ugr.task_gold END),0) AS refund_task,
COUNT(DISTINCT CASE WHEN ugr.type=0 THEN ugr.jwcode END) AS recharge_num,
COUNT(DISTINCT CASE WHEN ugr.type=0
AND u.first_recharge BETWEEN d.date_start AND d.date_end THEN ugr.jwcode END) AS first_recharge
FROM
-- 生成 7 天日期序列
(
SELECT DATE_SUB(CURDATE(), INTERVAL seq DAY) AS create_date,
DATE_SUB(CURDATE(), INTERVAL seq DAY) AS date_start,
DATE_ADD(DATE_SUB(CURDATE(), INTERVAL seq DAY), INTERVAL 1 DAY) AS date_end
FROM (
SELECT 0 AS seq UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL
SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6
) AS days
) d
JOIN user_gold_record ugr
ON ugr.create_time between d.date_start AND d.date_end
JOIN user u
ON ugr.jwcode = u.jwcode
WHERE ugr.audit_status IN (1,3)
AND ugr.flag = 1
GROUP BY u.market, d.create_date
</select>
</mapper>
Loading…
Cancel
Save