diff --git a/accompany-base/accompany-payment/accompany-payment-service/src/main/java/com/accompany/payment/mapper/RechargeUserMapper.java b/accompany-base/accompany-payment/accompany-payment-service/src/main/java/com/accompany/payment/mapper/RechargeUserMapper.java index 75ef83b50..269431e6b 100644 --- a/accompany-base/accompany-payment/accompany-payment-service/src/main/java/com/accompany/payment/mapper/RechargeUserMapper.java +++ b/accompany-base/accompany-payment/accompany-payment-service/src/main/java/com/accompany/payment/mapper/RechargeUserMapper.java @@ -29,4 +29,6 @@ public interface RechargeUserMapper extends BaseMapper { Integer countByManageUid(@Param("manageUid") Long manageUid); + + List listByPartitionId(@Param("partitionId") Integer partitionId); } diff --git a/accompany-base/accompany-payment/accompany-payment-service/src/main/resources/mapper/RechargeUserMapper.xml b/accompany-base/accompany-payment/accompany-payment-service/src/main/resources/mapper/RechargeUserMapper.xml index 15e415398..0c8ba5c72 100644 --- a/accompany-base/accompany-payment/accompany-payment-service/src/main/resources/mapper/RechargeUserMapper.xml +++ b/accompany-base/accompany-payment/accompany-payment-service/src/main/resources/mapper/RechargeUserMapper.xml @@ -59,4 +59,11 @@ from recharge_user where manage_uid = #{manageUid} + + + \ No newline at end of file diff --git a/accompany-business/accompany-business-sdk/src/main/java/com/accompany/business/dto/WeekRechargeAgentPartitionStat.java b/accompany-business/accompany-business-sdk/src/main/java/com/accompany/business/dto/WeekRechargeAgentPartitionStat.java new file mode 100644 index 000000000..9599f51e3 --- /dev/null +++ b/accompany-business/accompany-business-sdk/src/main/java/com/accompany/business/dto/WeekRechargeAgentPartitionStat.java @@ -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; + +} diff --git a/accompany-business/accompany-business-sdk/src/main/java/com/accompany/business/model/WeekRechargeUserPartitionStat.java b/accompany-business/accompany-business-sdk/src/main/java/com/accompany/business/model/WeekRechargeUserPartitionStat.java new file mode 100644 index 000000000..80c1991ae --- /dev/null +++ b/accompany-business/accompany-business-sdk/src/main/java/com/accompany/business/model/WeekRechargeUserPartitionStat.java @@ -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; + +} diff --git a/accompany-business/accompany-business-service/src/main/java/com/accompany/business/mybatismapper/DiamondGiveHistoryMapper.java b/accompany-business/accompany-business-service/src/main/java/com/accompany/business/mybatismapper/DiamondGiveHistoryMapper.java index b8b62e2a6..0d75bf067 100644 --- a/accompany-business/accompany-business-service/src/main/java/com/accompany/business/mybatismapper/DiamondGiveHistoryMapper.java +++ b/accompany-business/accompany-business-service/src/main/java/com/accompany/business/mybatismapper/DiamondGiveHistoryMapper.java @@ -42,4 +42,6 @@ public interface DiamondGiveHistoryMapper extends BaseMapper BigDecimal getUserTotalReceiveGold(@Param("uid") Long uid); BigDecimal getUserLast60TotalReceiveGold(@Param("uid") Long uid); + + List sumDiamondGroupByUid(@Param("partitionId") Integer partitionId, @Param("startTime") Date startDate, @Param("endTime") Date endTime); } diff --git a/accompany-business/accompany-business-service/src/main/java/com/accompany/business/mybatismapper/WeekRechargeAgentPartitionStatMapper.java b/accompany-business/accompany-business-service/src/main/java/com/accompany/business/mybatismapper/WeekRechargeAgentPartitionStatMapper.java new file mode 100644 index 000000000..24530af65 --- /dev/null +++ b/accompany-business/accompany-business-service/src/main/java/com/accompany/business/mybatismapper/WeekRechargeAgentPartitionStatMapper.java @@ -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 { + +} diff --git a/accompany-business/accompany-business-service/src/main/java/com/accompany/business/mybatismapper/guild/GuildUsdBillRecordMapper.java b/accompany-business/accompany-business-service/src/main/java/com/accompany/business/mybatismapper/guild/GuildUsdBillRecordMapper.java index 4fd71029b..e703824fd 100644 --- a/accompany-business/accompany-business-service/src/main/java/com/accompany/business/mybatismapper/guild/GuildUsdBillRecordMapper.java +++ b/accompany-business/accompany-business-service/src/main/java/com/accompany/business/mybatismapper/guild/GuildUsdBillRecordMapper.java @@ -32,4 +32,8 @@ public interface GuildUsdBillRecordMapper extends BaseMapper @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 sumReceiveGuildUsdGroupByTargetUid(@Param("partitionId") Integer partitionId, + @Param("startTime") Date startTime, + @Param("endTime") Date endTime); } \ No newline at end of file diff --git a/accompany-business/accompany-business-service/src/main/java/com/accompany/business/service/WeekRechargeAgentPartitionStatService.java b/accompany-business/accompany-business-service/src/main/java/com/accompany/business/service/WeekRechargeAgentPartitionStatService.java new file mode 100644 index 000000000..66c028ceb --- /dev/null +++ b/accompany-business/accompany-business-service/src/main/java/com/accompany/business/service/WeekRechargeAgentPartitionStatService.java @@ -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 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 rechargeUserList = rechargeUserMapper.listByPartitionId(partitionId); + if (CollectionUtils.isEmpty(rechargeUserList)){ + log.error("[WeekRechargeAgentPartitionStat] partitionId {} rechargeUserList is empty", partitionId); + return; + } + + List uidList = rechargeUserList.stream().map(RechargeUser::getUid).distinct().toList(); + Map usersMap = usersService.getUsersMapByUids(uidList); + + List receiverGuildUsdList = guildUsdBillRecordMapper.sumReceiveGuildUsdGroupByTargetUid(partitionId, systemStartTime, systemEndTime); + Map guildUsdCountMap = CollectionUtils.isEmpty(receiverGuildUsdList)? Collections.emptyMap(): receiverGuildUsdList.stream() + .collect(Collectors.toMap(GuildUsdBillRecord::getTargetUid, GuildUsdBillRecord::getOperateUsd)); + + List diamondGiveHistoryList = diamondGiveHistoryMapper.sumDiamondGroupByUid(partitionId, systemStartTime, systemEndTime); + Map transformDiamondCountMap = CollectionUtils.isEmpty(diamondGiveHistoryList)? Collections.emptyMap(): diamondGiveHistoryList.stream() + .collect(Collectors.toMap(DiamondGiveHistory::getFromUid, DiamondGiveHistory::getRealDiamondNum)); + + List 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); + } + +} diff --git a/accompany-business/accompany-business-service/src/main/resources/accompany/sqlmappers/DiamondGiveHistoryMapper.xml b/accompany-business/accompany-business-service/src/main/resources/accompany/sqlmappers/DiamondGiveHistoryMapper.xml index 3d79bd2fa..4d4d8ca8a 100644 --- a/accompany-business/accompany-business-service/src/main/resources/accompany/sqlmappers/DiamondGiveHistoryMapper.xml +++ b/accompany-business/accompany-business-service/src/main/resources/accompany/sqlmappers/DiamondGiveHistoryMapper.xml @@ -182,4 +182,17 @@ where to_uid = #{uid} and create_time >= DATE_FORMAT(adddate(now(), -60), '%Y-%m-%d 00:00:00') + + \ No newline at end of file diff --git a/accompany-business/accompany-business-service/src/main/resources/accompany/sqlmappers/GuildUsdBillRecordMapper.xml b/accompany-business/accompany-business-service/src/main/resources/accompany/sqlmappers/GuildUsdBillRecordMapper.xml index 043ba9565..cd84cec2d 100644 --- a/accompany-business/accompany-business-service/src/main/resources/accompany/sqlmappers/GuildUsdBillRecordMapper.xml +++ b/accompany-business/accompany-business-service/src/main/resources/accompany/sqlmappers/GuildUsdBillRecordMapper.xml @@ -159,4 +159,15 @@ and `type` =#{salaryOperateType} + + + \ No newline at end of file diff --git a/accompany-business/accompany-business-service/src/main/resources/accompany/sqlmappers/WeekRechargeAgentPartitionStatMapper.xml b/accompany-business/accompany-business-service/src/main/resources/accompany/sqlmappers/WeekRechargeAgentPartitionStatMapper.xml new file mode 100644 index 000000000..3d81d6a11 --- /dev/null +++ b/accompany-business/accompany-business-service/src/main/resources/accompany/sqlmappers/WeekRechargeAgentPartitionStatMapper.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/accompany-scheduler/accompany-scheduler-service/src/main/java/com/accompany/scheduler/task/RechargeAgentWeekStatTask.java b/accompany-scheduler/accompany-scheduler-service/src/main/java/com/accompany/scheduler/task/RechargeAgentWeekStatTask.java new file mode 100644 index 000000000..d0e9a600e --- /dev/null +++ b/accompany-scheduler/accompany-scheduler-service/src/main/java/com/accompany/scheduler/task/RechargeAgentWeekStatTask.java @@ -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 partitionEnumList = List.of(PartitionEnum.ENGLISH2); + service.stat(partitionEnumList); + } + + @Scheduled(cron = "5 0 0 ? * MON", zone = "Asia/Riyadh") + public void statWeekAr() { + List partitionEnumList = List.of(PartitionEnum.ARAB, PartitionEnum.TURKEY); + service.stat(partitionEnumList); + } + +}