充值代理-周统计

This commit is contained in:
khalil
2025-07-18 16:48:09 +08:00
parent 04a8d4357a
commit 1ab8bd8be9
12 changed files with 265 additions and 0 deletions

View File

@@ -29,4 +29,6 @@ public interface RechargeUserMapper extends BaseMapper<RechargeUser> {
Integer countByManageUid(@Param("manageUid") Long manageUid); Integer countByManageUid(@Param("manageUid") Long manageUid);
List<RechargeUser> listByPartitionId(@Param("partitionId") Integer partitionId);
} }

View File

@@ -59,4 +59,11 @@
from recharge_user from recharge_user
where manage_uid = #{manageUid} where manage_uid = #{manageUid}
</select> </select>
<select id="listByPartitionId" resultType="com.accompany.payment.model.RechargeUser">
select * from recharge_user ru
inner join users u on ru.uid = u.uid
where u.partition_id = #{partitionId}
</select>
</mapper> </mapper>

View File

@@ -0,0 +1,24 @@
package com.accompany.business.dto;
import lombok.Data;
import java.math.BigDecimal;
@Data
public class WeekRechargeAgentPartitionStat {
private String date;
private String endDate;
private Integer partitionId;
private Integer rechargeUserCount;
private Integer activeRechargeUserCount;
private BigDecimal receiveTotalGuildUsd;
private BigDecimal transformTotalDiamond;
private BigDecimal transformTotalUsd;
private BigDecimal remainUsd;
}

View File

@@ -0,0 +1,24 @@
package com.accompany.business.model;
import lombok.Data;
import java.math.BigDecimal;
@Data
public class WeekRechargeUserPartitionStat {
private String date;
private String endDate;
private Integer partitionId;
private Long uid;
private Long erbanNo;
private BigDecimal receiveTotalGuildUsd;
private BigDecimal transformTotalDiamond;
private BigDecimal transformTotalUsd;
private BigDecimal remainUsd;
}

View File

@@ -42,4 +42,6 @@ public interface DiamondGiveHistoryMapper extends BaseMapper<DiamondGiveHistory>
BigDecimal getUserTotalReceiveGold(@Param("uid") Long uid); BigDecimal getUserTotalReceiveGold(@Param("uid") Long uid);
BigDecimal getUserLast60TotalReceiveGold(@Param("uid") Long uid); BigDecimal getUserLast60TotalReceiveGold(@Param("uid") Long uid);
List<DiamondGiveHistory> sumDiamondGroupByUid(@Param("partitionId") Integer partitionId, @Param("startTime") Date startDate, @Param("endTime") Date endTime);
} }

View File

@@ -0,0 +1,10 @@
package com.accompany.business.mybatismapper;
import com.accompany.business.dto.WeekRechargeAgentPartitionStat;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;
@Mapper
public interface WeekRechargeAgentPartitionStatMapper extends BaseMapper<WeekRechargeAgentPartitionStat> {
}

View File

@@ -32,4 +32,8 @@ public interface GuildUsdBillRecordMapper extends BaseMapper<GuildUsdBillRecord>
@Param("dateCycle") String dateCycle, @Param("uid") Long uid, @Param("hallId") Integer hallId, @Param("partitionId") Integer partitionId); @Param("dateCycle") String dateCycle, @Param("uid") Long uid, @Param("hallId") Integer hallId, @Param("partitionId") Integer partitionId);
Double sumRechargeUsd(@Param("receiveUid") Long receiveUid, @Param("cycleDate") String cycleDate, @Param("salaryOperateType") Integer salaryOperateType); Double sumRechargeUsd(@Param("receiveUid") Long receiveUid, @Param("cycleDate") String cycleDate, @Param("salaryOperateType") Integer salaryOperateType);
List<GuildUsdBillRecord> sumReceiveGuildUsdGroupByTargetUid(@Param("partitionId") Integer partitionId,
@Param("startTime") Date startTime,
@Param("endTime") Date endTime);
} }

View File

@@ -0,0 +1,131 @@
package com.accompany.business.service;
import com.accompany.business.dto.WeekRechargeAgentPartitionStat;
import com.accompany.business.model.DiamondGiveHistory;
import com.accompany.business.model.WeekRechargeUserPartitionStat;
import com.accompany.business.model.guild.GuildUsdBillRecord;
import com.accompany.business.mybatismapper.DiamondGiveHistoryMapper;
import com.accompany.business.mybatismapper.WeekRechargeAgentPartitionStatMapper;
import com.accompany.business.mybatismapper.guild.GuildUsdBillRecordMapper;
import com.accompany.business.service.user.UsersService;
import com.accompany.common.utils.DateTimeUtil;
import com.accompany.core.enumeration.PartitionEnum;
import com.accompany.core.model.Users;
import com.accompany.payment.mapper.RechargeUserMapper;
import com.accompany.payment.model.RechargeUser;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import javax.annotation.Resource;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.time.*;
import java.util.*;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.stream.Collectors;
@Slf4j
@Service
public class WeekRechargeAgentPartitionStatService {
@Autowired
private WeekRechargeAgentPartitionStatMapper mapper;
@Resource(name = "bizExecutor")
private ThreadPoolExecutor bizExecutor;
@Autowired
private GuildUsdBillRecordMapper guildUsdBillRecordMapper;
@Autowired
private DiamondGiveHistoryMapper diamondGiveHistoryMapper;
@Autowired
private RechargeUserMapper rechargeUserMapper;
@Autowired
private UsersService usersService;
private final BigDecimal usdRate = new BigDecimal("7000");
public void stat(List<PartitionEnum> partitionEnumList) {
for (PartitionEnum partitionEnum: partitionEnumList){
bizExecutor.execute(() -> {
ZonedDateTime monday = DateTimeUtil.getDateTimeByZoneId(partitionEnum.getZoneId()).with(DayOfWeek.MONDAY);
String lastWeekMonday = monday.minusWeeks(1L).format(DateTimeUtil.dateFormatter);
String lastWeekSunday = monday.minusDays(1L).format(DateTimeUtil.dateFormatter);
stat(partitionEnum.getId(), partitionEnum.getZoneId(), lastWeekMonday, lastWeekSunday, true);
});
}
}
public void stat(Integer partitionId, String zoneId, String monday, String sunday, boolean needSaveRecord) {
ZonedDateTime zonedStartTime = ZonedDateTime.of(LocalDate.parse(monday, DateTimeUtil.dateFormatter), LocalTime.MIN, ZoneId.of(zoneId));
Date systemStartTime = Date.from(zonedStartTime.withZoneSameLocal(ZoneId.systemDefault()).toInstant());
ZonedDateTime zonedEndTime = ZonedDateTime.of(LocalDate.parse(sunday, DateTimeUtil.dateFormatter), LocalTime.MAX, ZoneId.of(zoneId));
Date systemEndTime = Date.from(zonedEndTime.withZoneSameLocal(ZoneId.systemDefault()).toInstant());
String lastMonday = DateTimeUtil.convertDate(
DateTimeUtil.addDays(DateTimeUtil.convertStrToDate(monday, DateTimeUtil.DEFAULT_DATE_PATTERN), -7), DateTimeUtil.DEFAULT_DATE_PATTERN);
List<RechargeUser> rechargeUserList = rechargeUserMapper.listByPartitionId(partitionId);
if (CollectionUtils.isEmpty(rechargeUserList)){
log.error("[WeekRechargeAgentPartitionStat] partitionId {} rechargeUserList is empty", partitionId);
return;
}
List<Long> uidList = rechargeUserList.stream().map(RechargeUser::getUid).distinct().toList();
Map<Long, Users> usersMap = usersService.getUsersMapByUids(uidList);
List<GuildUsdBillRecord> receiverGuildUsdList = guildUsdBillRecordMapper.sumReceiveGuildUsdGroupByTargetUid(partitionId, systemStartTime, systemEndTime);
Map<Long, BigDecimal> guildUsdCountMap = CollectionUtils.isEmpty(receiverGuildUsdList)? Collections.emptyMap(): receiverGuildUsdList.stream()
.collect(Collectors.toMap(GuildUsdBillRecord::getTargetUid, GuildUsdBillRecord::getOperateUsd));
List<DiamondGiveHistory> diamondGiveHistoryList = diamondGiveHistoryMapper.sumDiamondGroupByUid(partitionId, systemStartTime, systemEndTime);
Map<Long, BigDecimal> transformDiamondCountMap = CollectionUtils.isEmpty(diamondGiveHistoryList)? Collections.emptyMap(): diamondGiveHistoryList.stream()
.collect(Collectors.toMap(DiamondGiveHistory::getFromUid, DiamondGiveHistory::getRealDiamondNum));
List<WeekRechargeUserPartitionStat> userStatDtoList = uidList.stream().map(uid->{
WeekRechargeUserPartitionStat statDto = new WeekRechargeUserPartitionStat();
statDto.setDate(monday);
statDto.setEndDate(sunday);
statDto.setPartitionId(partitionId);
statDto.setUid(uid);
Users u = usersMap.get(uid);
if (null != u){
statDto.setErbanNo(u.getErbanNo());
}
statDto.setReceiveTotalGuildUsd(guildUsdCountMap.getOrDefault(uid, BigDecimal.ZERO));
statDto.setTransformTotalDiamond(transformDiamondCountMap.getOrDefault(uid, BigDecimal.ZERO));
statDto.setTransformTotalUsd(!transformDiamondCountMap.containsKey(uid)? BigDecimal.ZERO:
transformDiamondCountMap.get(uid).divide(usdRate, 2, RoundingMode.HALF_UP));
statDto.setRemainUsd(statDto.getTransformTotalUsd().subtract(statDto.getReceiveTotalGuildUsd()));
return statDto;
}).toList();
WeekRechargeAgentPartitionStat stat = new WeekRechargeAgentPartitionStat();
stat.setDate(monday);
stat.setEndDate(sunday);
stat.setPartitionId(partitionId);
stat.setRechargeUserCount(userStatDtoList.size());
stat.setActiveRechargeUserCount((int) userStatDtoList.stream()
.filter(us->us.getReceiveTotalGuildUsd().compareTo(BigDecimal.ZERO) > 0
|| us.getTransformTotalUsd().compareTo(BigDecimal.ZERO) > 0).count());
stat.setReceiveTotalGuildUsd(userStatDtoList.stream().map(WeekRechargeUserPartitionStat::getReceiveTotalGuildUsd).reduce(BigDecimal::add).orElse(BigDecimal.ZERO));
stat.setTransformTotalDiamond(userStatDtoList.stream().map(WeekRechargeUserPartitionStat::getTransformTotalDiamond).reduce(BigDecimal::add).orElse(BigDecimal.ZERO));
stat.setTransformTotalUsd(userStatDtoList.stream().map(WeekRechargeUserPartitionStat::getTransformTotalUsd).reduce(BigDecimal::add).orElse(BigDecimal.ZERO));
stat.setRemainUsd(userStatDtoList.stream().map(WeekRechargeUserPartitionStat::getRemainUsd).reduce(BigDecimal::add).orElse(BigDecimal.ZERO));
if (!needSaveRecord){
return;
}
mapper.insert(stat);
}
}

View File

@@ -182,4 +182,17 @@
where to_uid = #{uid} and create_time &gt;= DATE_FORMAT(adddate(now(), -60), '%Y-%m-%d 00:00:00') where to_uid = #{uid} and create_time &gt;= DATE_FORMAT(adddate(now(), -60), '%Y-%m-%d 00:00:00')
</select> </select>
<select id="sumDiamondGroupByUid" resultType="com.accompany.business.model.DiamondGiveHistory">
select
from_uid fromUid,
sum(real_diamond_num) `real_diamond_num`
from diamond_give_history h
inner join users u on h.from_uid = u.uid
where h.create_time >= #{startDate}
and h.create_time &lt; #{endDate}
and h.to_uid_manage =0
and u.partition_id = #{partitionId}
group by from_uid
</select>
</mapper> </mapper>

View File

@@ -159,4 +159,15 @@
and `type` =#{salaryOperateType} and `type` =#{salaryOperateType}
</if> </if>
</select> </select>
<select id="sumReceiveGuildUsdGroupByTargetUid"
resultType="com.accompany.business.model.guild.GuildUsdBillRecord">
select partitionId, target_uid, sum(operate_usd) operate_usd
from guild_usd_bill_record r
where r.create_time between #{startTime} and #{endTime}
and r.partition_id = #{partitionId}
and r.`type` = 3
group by partitionId, target_uid
</select>
</mapper> </mapper>

View File

@@ -0,0 +1,5 @@
<?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.WeekRechargeAgentPartitionStatMapper">
</mapper>

View File

@@ -0,0 +1,32 @@
package com.accompany.scheduler.task;
import com.accompany.business.service.WeekRechargeAgentPartitionStatService;
import com.accompany.core.enumeration.PartitionEnum;
import com.accompany.scheduler.base.BaseTask;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import java.util.List;
@Component
@Slf4j
public class RechargeAgentWeekStatTask extends BaseTask {
@Autowired
private WeekRechargeAgentPartitionStatService service;
@Scheduled(cron = "5 0 0 ? * MON")
public void statWeekEn() {
List<PartitionEnum> partitionEnumList = List.of(PartitionEnum.ENGLISH2);
service.stat(partitionEnumList);
}
@Scheduled(cron = "5 0 0 ? * MON", zone = "Asia/Riyadh")
public void statWeekAr() {
List<PartitionEnum> partitionEnumList = List.of(PartitionEnum.ARAB, PartitionEnum.TURKEY);
service.stat(partitionEnumList);
}
}