充值代理-周统计
This commit is contained in:
@@ -29,4 +29,6 @@ public interface RechargeUserMapper extends BaseMapper<RechargeUser> {
|
||||
|
||||
|
||||
Integer countByManageUid(@Param("manageUid") Long manageUid);
|
||||
|
||||
List<RechargeUser> listByPartitionId(@Param("partitionId") Integer partitionId);
|
||||
}
|
||||
|
@@ -59,4 +59,11 @@
|
||||
from recharge_user
|
||||
where manage_uid = #{manageUid}
|
||||
</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>
|
@@ -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;
|
||||
|
||||
}
|
@@ -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;
|
||||
|
||||
}
|
@@ -42,4 +42,6 @@ public interface DiamondGiveHistoryMapper extends BaseMapper<DiamondGiveHistory>
|
||||
|
||||
BigDecimal getUserTotalReceiveGold(@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);
|
||||
}
|
||||
|
@@ -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> {
|
||||
|
||||
}
|
@@ -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);
|
||||
|
||||
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);
|
||||
}
|
@@ -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);
|
||||
}
|
||||
|
||||
}
|
@@ -182,4 +182,17 @@
|
||||
where to_uid = #{uid} and create_time >= DATE_FORMAT(adddate(now(), -60), '%Y-%m-%d 00:00:00')
|
||||
</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 < #{endDate}
|
||||
and h.to_uid_manage =0
|
||||
and u.partition_id = #{partitionId}
|
||||
group by from_uid
|
||||
</select>
|
||||
|
||||
</mapper>
|
@@ -159,4 +159,15 @@
|
||||
and `type` =#{salaryOperateType}
|
||||
</if>
|
||||
</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>
|
@@ -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>
|
@@ -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);
|
||||
}
|
||||
|
||||
}
|
Reference in New Issue
Block a user