lucky24-定时任务-隔天统计前天记录数据

This commit is contained in:
khalil
2024-11-18 21:13:13 +08:00
parent ed6159a50e
commit f6d62430f4
10 changed files with 156 additions and 78 deletions

View File

@@ -3,12 +3,12 @@ package com.accompany.admin.service.lucky;
import cn.hippo4j.common.toolkit.CollectionUtil;
import com.accompany.admin.service.system.SysConfAdminService;
import com.accompany.admin.vo.Lucky24ConfigAdminVo;
import com.accompany.business.mybatismapper.lucky.Lucky24RecordMapper;
import com.accompany.business.vo.luckybag.Lucky24PersonalStatVo;
import com.accompany.business.vo.luckybag.Lucky24PlatformStatVo;
import com.accompany.business.model.luckybag.Lucky24PersonalStat;
import com.accompany.business.model.luckybag.Lucky24PlatformStat;
import com.accompany.business.dto.lucky.Lucky24GiftConfig;
import com.accompany.business.model.lucky.Lucky24Pool;
import com.accompany.business.mybatismapper.lucky.Lucky24PoolMapper;
import com.accompany.business.mybatismapper.lucky.Lucky24StatMapper;
import com.accompany.business.service.gift.Lucky24GiftSendService;
import com.accompany.business.service.lucky.Lucky24PoolService;
import com.accompany.business.service.lucky.Lucky24StockService;
@@ -46,8 +46,6 @@ public class Lucky24PoolAdminService {
@Autowired
private Lucky24StockService stockService;
@Autowired
private Lucky24RecordMapper recordMapper;
@Autowired
private UsersService usersService;
@Autowired
private SysConfAdminService sysConfAdminService;
@@ -55,6 +53,8 @@ public class Lucky24PoolAdminService {
private PartitionInfoService partitionInfoService;
@Autowired
private Lucky24PoolService poolService;
@Autowired
private Lucky24StatMapper statMapper;
public List<Lucky24Pool> listPoolByType(Integer type) {
return mapper.selectList(Wrappers.<Lucky24Pool>lambdaQuery().eq(Lucky24Pool::getType, type).orderByDesc(Lucky24Pool::getExpect));
@@ -149,7 +149,7 @@ public class Lucky24PoolAdminService {
sysConfAdminService.saveOrUpdate(sysConf);
}
public List<Lucky24PlatformStatVo> listPlatform(Integer partitionId, String startDate, String endDate) {
public List<Lucky24PlatformStat> listPlatform(Integer partitionId, String startDate, String endDate) {
PartitionInfo partitionInfo = partitionInfoService.getById(partitionId);
Date startTime = DateTimeUtil.getBeginTimeOfDay(DateTimeUtil.convertStrToDate(startDate, DateTimeUtil.DEFAULT_DATE_PATTERN));
ZonedDateTime zonedStartTime = startTime.toInstant().atZone(ZoneId.of(partitionInfo.getZoneId()));
@@ -159,17 +159,17 @@ public class Lucky24PoolAdminService {
Date endTime = DateTimeUtil.getEndTimeOfDay(DateTimeUtil.convertStrToDate(endDate, DateTimeUtil.DEFAULT_DATE_PATTERN));
ZonedDateTime zonedEndTime = endTime.toInstant().atZone(ZoneId.of(partitionInfo.getZoneId()));
Date systemEndTime = Date.from(zonedEndTime.withZoneSameLocal(ZoneId.systemDefault()).toInstant());
List<Lucky24PlatformStatVo> list = recordMapper.listPlatform(partitionId, systemStartTime, systemEndTime, zoneIdHour);
for (Lucky24PlatformStatVo vo: list) {
List<Lucky24PlatformStat> list = statMapper.listPlatform(partitionId, systemStartTime, systemEndTime, zoneIdHour);
for (Lucky24PlatformStat vo: list) {
vo.setStock(stockService.addStock(partitionId, BigDecimal.ZERO));
}
return list;
}
public Page<Lucky24PersonalStatVo> pagePersonal(Integer partitionId, Long erbanNo,
String startDate, String endDate,
int pageNo, int pageSize) {
Page<Lucky24PersonalStatVo> page = new Page<>(pageNo, pageSize);
public Page<Lucky24PersonalStat> pagePersonal(Integer partitionId, Long erbanNo,
String startDate, String endDate,
int pageNo, int pageSize) {
Page<Lucky24PersonalStat> page = new Page<>(pageNo, pageSize);
Long uid = null;
if (null != erbanNo){
@@ -189,7 +189,7 @@ public class Lucky24PoolAdminService {
Date endTime = DateTimeUtil.getEndTimeOfDay(DateTimeUtil.convertStrToDate(endDate, DateTimeUtil.DEFAULT_DATE_PATTERN));
ZonedDateTime zonedEndTime = endTime.toInstant().atZone(ZoneId.of(partitionInfo.getZoneId()));
Date systemEndTime = Date.from(zonedEndTime.withZoneSameLocal(ZoneId.systemDefault()).toInstant());
recordMapper.pagePersonal(page, partitionId, uid, systemStartTime, systemEndTime, zoneIdHour);
statMapper.pagePersonal(page, partitionId, uid, systemStartTime, systemEndTime, zoneIdHour);
return page;
}

View File

@@ -1,8 +1,8 @@
package com.accompany.admin.controller.lucky;
import com.accompany.admin.service.lucky.Lucky24PoolAdminService;
import com.accompany.business.vo.luckybag.Lucky24PersonalStatVo;
import com.accompany.business.vo.luckybag.Lucky24PlatformStatVo;
import com.accompany.business.model.luckybag.Lucky24PersonalStat;
import com.accompany.business.model.luckybag.Lucky24PlatformStat;
import com.accompany.common.result.BusiResult;
import com.accompany.common.result.PageResult;
import com.accompany.common.status.BusiStatus;
@@ -35,11 +35,11 @@ public class Lucky24RecordAdminController {
@ApiImplicitParam(value = "endDate", name = "结束日期", required = true),
})
@GetMapping("/platform")
public BusiResult<List<Lucky24PlatformStatVo>> platform(Integer partitionId, String startDate, String endDate) {
public BusiResult<List<Lucky24PlatformStat>> platform(Integer partitionId, String startDate, String endDate) {
if (null == partitionId || !StringUtils.hasText(startDate) || !StringUtils.hasText(endDate)) {
throw new ServiceException(BusiStatus.PARAMERROR);
}
List<Lucky24PlatformStatVo> platformStatList = service.listPlatform(partitionId, startDate, endDate);
List<Lucky24PlatformStat> platformStatList = service.listPlatform(partitionId, startDate, endDate);
return BusiResult.success(platformStatList);
}
@@ -53,13 +53,13 @@ public class Lucky24RecordAdminController {
@ApiImplicitParam(value = "pageSize", name = "页长", required = true),
})
@GetMapping("/personal")
public BusiResult<PageResult<Lucky24PersonalStatVo>> personal(Integer partitionId, Long erbanNo,
String startDate, String endDate,
int pageNo, int pageSize) {
public BusiResult<PageResult<Lucky24PersonalStat>> personal(Integer partitionId, Long erbanNo,
String startDate, String endDate,
int pageNo, int pageSize) {
if (null == partitionId || !StringUtils.hasText(startDate) || !StringUtils.hasText(endDate)) {
throw new ServiceException(BusiStatus.PARAMERROR);
}
Page<Lucky24PersonalStatVo> page = service.pagePersonal(partitionId, erbanNo, startDate, endDate, pageNo, pageSize);
Page<Lucky24PersonalStat> page = service.pagePersonal(partitionId, erbanNo, startDate, endDate, pageNo, pageSize);
return BusiResult.success(new PageResult<>(page));
}

View File

@@ -1,4 +1,4 @@
package com.accompany.business.vo.luckybag;
package com.accompany.business.model.luckybag;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
@@ -8,10 +8,12 @@ import java.math.BigDecimal;
@Data
@ApiModel
public class Lucky24PersonalStatVo {
public class Lucky24PersonalStat {
@ApiModelProperty("日期")
private String date;
@ApiModelProperty("分区id")
private Integer partitionId;
@ApiModelProperty("uid")
private Long uid;
@ApiModelProperty("erbanNO")

View File

@@ -1,4 +1,4 @@
package com.accompany.business.vo.luckybag;
package com.accompany.business.model.luckybag;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
@@ -8,10 +8,12 @@ import java.math.BigDecimal;
@Data
@ApiModel
public class Lucky24PlatformStatVo {
public class Lucky24PlatformStat {
@ApiModelProperty("日期")
private String date;
@ApiModelProperty("分区id")
private Integer partitionId;
@ApiModelProperty("送礼金币总额")
private Long totalInput;
@ApiModelProperty("送礼返币总额")

View File

@@ -1,8 +1,8 @@
package com.accompany.business.mybatismapper.lucky;
import com.accompany.business.model.lucky.Lucky24Record;
import com.accompany.business.vo.luckybag.Lucky24PersonalStatVo;
import com.accompany.business.vo.luckybag.Lucky24PlatformStatVo;
import com.accompany.business.model.luckybag.Lucky24PersonalStat;
import com.accompany.business.model.luckybag.Lucky24PlatformStat;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.apache.ibatis.annotations.Param;
@@ -12,12 +12,4 @@ import java.util.List;
public interface Lucky24RecordMapper extends BaseMapper<Lucky24Record> {
List<Lucky24PlatformStatVo> listPlatform(@Param("partitionId") Integer partitionId, @Param("startTime") Date startTime, @Param("endTime") Date endTime,
@Param("zoneIdHour") long zoneIdHour);
Page<Lucky24PersonalStatVo> pagePersonal(Page<Lucky24PersonalStatVo> page,
@Param("partitionId") Integer partitionId, @Param("uid") Long uid,
@Param("startTime") Date startTime, @Param("endTime") Date endTime,
@Param("zoneIdHour") long zoneIdHour);
}

View File

@@ -0,0 +1,30 @@
package com.accompany.business.mybatismapper.lucky;
import com.accompany.business.model.luckybag.Lucky24PersonalStat;
import com.accompany.business.model.luckybag.Lucky24PlatformStat;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.apache.ibatis.annotations.Param;
import java.util.Date;
import java.util.List;
public interface Lucky24StatMapper {
int savePlatform(@Param("list") List<Lucky24PlatformStat> list);
int savePersonal(@Param("list") List<Lucky24PersonalStat> list);
List<Lucky24PlatformStat> listPlatform(@Param("partitionId") Integer partitionId, @Param("startTime") Date startTime, @Param("endTime") Date endTime,
@Param("zoneIdHour") long zoneIdHour);
List<Lucky24PersonalStat> listPersonal(@Param("partitionId") Integer partitionId,
@Param("startTime") Date startTime, @Param("endTime") Date endTime,
@Param("zoneIdHour") long zoneIdHour);
Page<Lucky24PersonalStat> pagePersonal(Page<Lucky24PersonalStat> page,
@Param("partitionId") Integer partitionId, @Param("uid") Long uid,
@Param("startTime") Date startTime, @Param("endTime") Date endTime,
@Param("zoneIdHour") long zoneIdHour);
}

View File

@@ -3,8 +3,11 @@ package com.accompany.business.service.lucky;
import com.accompany.business.model.Gift;
import com.accompany.business.model.lucky.Lucky24Record;
import com.accompany.business.mybatismapper.lucky.Lucky24RecordMapper;
import com.accompany.business.vo.luckybag.Lucky24PlatformStatVo;
import com.accompany.business.model.luckybag.Lucky24PersonalStat;
import com.accompany.business.model.luckybag.Lucky24PlatformStat;
import com.accompany.business.mybatismapper.lucky.Lucky24StatMapper;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections.CollectionUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;
@@ -18,6 +21,8 @@ public class Lucky24RecordService {
@Autowired
private Lucky24RecordMapper mapper;
@Autowired
private Lucky24StatMapper statMapper;
@Async
public void saveRecord(long senderUid, int partitionId, Gift gift, int giftNum, long receiverUid, int poolId,
@@ -38,7 +43,15 @@ public class Lucky24RecordService {
mapper.insert(record);
}
public void statDate(Integer partitionId, String dateStr, Date startTime, Date endTime, long zoneIdHour) {
List<Lucky24PlatformStatVo> list = mapper.listPlatform(partitionId, startTime, endTime, zoneIdHour);
public void statDate(Integer partitionId, Date startTime, Date endTime, long zoneIdHour) {
List<Lucky24PlatformStat> platformList = statMapper.listPlatform(partitionId, startTime, endTime, zoneIdHour);
if (!CollectionUtils.isEmpty(platformList)) {
statMapper.savePlatform(platformList);
}
List<Lucky24PersonalStat> personalList = statMapper.listPersonal(partitionId, startTime, endTime, zoneIdHour);
if (!CollectionUtils.isEmpty(personalList)) {
statMapper.savePersonal(personalList);
}
}
}

View File

@@ -2,40 +2,4 @@
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="com.accompany.business.mybatismapper.lucky.Lucky24RecordMapper">
<select id="listPlatform" resultType="com.accompany.business.vo.luckybag.Lucky24PlatformStatVo">
select date(date_add(r.create_time, INTERVAL #{zoneIdHour} HOUR)) `date`,
sum(gift_num * gift_gold_price) `totalInput`,
sum(win_gold_num) `totalOutput`,
sum(win_gold_num) / sum(gift_num * gift_gold_price) `productionRatio`,
count(*) `num`, count(distinct r.uid) `count`,
count((case when win_gold_num > 0 then r.uid else null end)) `winNum`,
count(distinct (case when win_gold_num > 0 then r.uid else null end)) `winCount`,
ifnull(count((case when win_gold_num > 0 then r.uid else null end)) / count(*),0) `winRate`
from lucky_24_record r
where r.create_time between #{startTime} and #{endTime}
and r.partition_id = #{partitionId}
group by `date`
</select>
<select id="pagePersonal" resultType="com.accompany.business.vo.luckybag.Lucky24PersonalStatVo">
select date(date_add(r.create_time, INTERVAL #{zoneIdHour} HOUR)) `date`,
r.uid, u.erban_no `erbanNo`,
sum(gift_num * gift_gold_price) `totalInput`,
sum(win_gold_num) `totalOutput`,
sum(gift_num * gift_gold_price) - sum(win_gold_num) `production`,
sum(win_gold_num) / sum(gift_num * gift_gold_price) `productionRatio`,
sum(gift_num * gift_gold_price) / count(*) `avgInput`,
count(*) `num`,
count((case when win_gold_num > 0 then r.uid else null end)) `winNum`,
ifnull(count((case when win_gold_num > 0 then r.uid else null end)) / count(*),0) `winRate`
from lucky_24_record r
where r.create_time between #{startTime} and #{endTime}
and r.partition_id = #{partitionId}
<if test="null != uid">
and r.uid = #{uid}
</if>
group by `date`, r.uid
order by `date`, `totalInput`
</select>
</mapper>

View File

@@ -0,0 +1,78 @@
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="com.accompany.business.mybatismapper.lucky.Lucky24StatMapper">
<insert id="savePlatform">
<foreach collection="list" item="item" separator=";">
insert into lucky_24_record_platform_stat VALUES(#{item.date}, #{item.partitionId}, #{item.totalInput}, #{item.totalOutput}, #{item.productionRatio},
#{item.num}, #{item.count}, #{item.winNum})
ON DUPLICATE KEY UPDATE total_input = #{item.totalInput}, total_output = #{item.totalOutpur}, production_ratio = #{item.productionRatio},
num = #{item.num}, `count` = #{item.count}, win_num = #{item.winNum}
</foreach>
</insert>
<insert id="savePersonal">
<foreach collection="list" item="item" separator=";">
insert into lucky_24_record_personal_stat VALUES(#{item.date}, #{item.partitionId}, #{item.uid}, #{item.totalInput}, #{item.totalOutput}, #{item.productionRatio},
#{item.num}, #{item.count}, #{item.winNum})
ON DUPLICATE KEY UPDATE total_input = #{item.totalInput}, total_output = #{item.totalOutpur}, production_ratio = #{item.productionRatio},
num = #{item.num}, `count` = #{item.count}, win_num = #{item.winNum}
</foreach>
</insert>
<select id="listPlatform" resultType="com.accompany.business.model.luckybag.Lucky24PlatformStat">
select date(date_add(r.create_time, INTERVAL #{zoneIdHour} HOUR)) `date`,
#{partitionId} `partition_id`,
sum(gift_num * gift_gold_price) `totalInput`,
sum(win_gold_num) `totalOutput`,
sum(win_gold_num) / sum(gift_num * gift_gold_price) `productionRatio`,
count(*) `num`, count(distinct r.uid) `count`,
count((case when win_gold_num > 0 then r.uid else null end)) `winNum`,
count(distinct (case when win_gold_num > 0 then r.uid else null end)) `winCount`,
ifnull(count((case when win_gold_num > 0 then r.uid else null end)) / count(*),0) `winRate`
from lucky_24_record r
where r.create_time between #{startTime} and #{endTime}
and r.partition_id = #{partitionId}
group by `date`
</select>
<select id="listPersonal" resultType="com.accompany.business.model.luckybag.Lucky24PersonalStat">
select date(date_add(r.create_time, INTERVAL #{zoneIdHour} HOUR)) `date`,
#{partitionId} `partition_id`,
r.uid,
sum(gift_num * gift_gold_price) `totalInput`,
sum(win_gold_num) `totalOutput`,
sum(gift_num * gift_gold_price) - sum(win_gold_num) `production`,
sum(win_gold_num) / sum(gift_num * gift_gold_price) `productionRatio`,
sum(gift_num * gift_gold_price) / count(*) `avgInput`,
count(*) `num`,
count((case when win_gold_num > 0 then r.uid else null end)) `winNum`,
ifnull(count((case when win_gold_num > 0 then r.uid else null end)) / count(*),0) `winRate`
from lucky_24_record r
where r.create_time between #{startTime} and #{endTime}
and r.partition_id = #{partitionId}
group by `date`, r.uid
</select>
<select id="pagePersonal" resultType="com.accompany.business.model.luckybag.Lucky24PersonalStat">
select date(date_add(r.create_time, INTERVAL #{zoneIdHour} HOUR)) `date`,
#{partitionId} `partition_id`,
r.uid, u.erban_no `erbanNo`,
sum(gift_num * gift_gold_price) `totalInput`,
sum(win_gold_num) `totalOutput`,
sum(gift_num * gift_gold_price) - sum(win_gold_num) `production`,
sum(win_gold_num) / sum(gift_num * gift_gold_price) `productionRatio`,
sum(gift_num * gift_gold_price) / count(*) `avgInput`,
count(*) `num`,
count((case when win_gold_num > 0 then r.uid else null end)) `winNum`,
ifnull(count((case when win_gold_num > 0 then r.uid else null end)) / count(*),0) `winRate`
from lucky_24_record r
where r.create_time between #{startTime} and #{endTime}
and r.partition_id = #{partitionId}
<if test="null != uid">
and r.uid = #{uid}
</if>
group by `date`, r.uid
order by `date`, `totalInput`
</select>
</mapper>

View File

@@ -13,7 +13,6 @@ import javax.annotation.Resource;
import java.time.Duration;
import java.time.ZoneId;
import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Date;
import java.util.List;
import java.util.concurrent.ThreadPoolExecutor;
@@ -40,8 +39,6 @@ public class Lucky24Task {
continue;
}
bizExecutor.execute(() -> {
String dateStr = zdt.format(DateTimeFormatter.ofPattern(DateTimeUtil.DEFAULT_DATE_PATTERN));
// 获取当天的第一秒
ZonedDateTime startOfDay = zdt.withHour(0)
.withMinute(0)
@@ -58,7 +55,7 @@ public class Lucky24Task {
.withNano(999999999);
Date endTime = DateTimeUtil.converLocalDateTimeToDate(endOfDay.withZoneSameInstant(ZoneId.systemDefault()).toLocalDateTime());
service.statDate(partitionInfo.getId(), dateStr, startTime, endTime, zoneIdHour);
service.statDate(partitionInfo.getId(), startTime, endTime, zoneIdHour);
});
}
}