diff --git a/accompany-admin/accompany-admin-service/src/main/java/com/accompany/admin/service/guild/GuildUsdWithdrawRecordAdminService.java b/accompany-admin/accompany-admin-service/src/main/java/com/accompany/admin/service/guild/GuildUsdWithdrawRecordAdminService.java index eabdff488..9babebeee 100644 --- a/accompany-admin/accompany-admin-service/src/main/java/com/accompany/admin/service/guild/GuildUsdWithdrawRecordAdminService.java +++ b/accompany-admin/accompany-admin-service/src/main/java/com/accompany/admin/service/guild/GuildUsdWithdrawRecordAdminService.java @@ -3,7 +3,6 @@ package com.accompany.admin.service.guild; import com.accompany.business.constant.CountryEnum; import com.accompany.business.constant.guild.GuildConstant; import com.accompany.business.constant.guild.GuildWithdrawAccountTypeEnum; -import com.accompany.business.model.guild.GuildMember; import com.accompany.business.model.guild.GuildUsdWithdrawRecord; import com.accompany.business.param.BasePageParams; import com.accompany.business.service.SendSysMsgService; @@ -12,7 +11,9 @@ import com.accompany.business.service.guild.GuildUsdOperateService; import com.accompany.business.service.guild.GuildUsdWithdrawRecordService; import com.accompany.business.vo.guild.AgencyWithdrawExamineVo; import com.accompany.common.constant.Constant; +import com.accompany.common.utils.DateTimeUtil; import com.accompany.core.enumeration.I18nAlertEnum; +import com.accompany.core.enumeration.PartitionEnum; import com.accompany.core.model.AccountBlock; import com.accompany.core.model.PartitionInfo; import com.accompany.core.service.partition.PartitionInfoService; @@ -23,6 +24,8 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.util.CollectionUtils; +import java.time.DayOfWeek; +import java.time.ZonedDateTime; import java.util.Date; import java.util.List; import java.util.Map; @@ -129,6 +132,10 @@ public class GuildUsdWithdrawRecordAdminService { sendSysMsgService.sendPersonTextMsg(record.getUid(), content); guildUsdOperateService.withdrawReject(record.getGuildId(), record.getUid(), record.getGuildUsdNum()); + Date createTime = record.getCreateTime(); + ZonedDateTime zonedDateTime = DateTimeUtil.convertWithZoneId(createTime, PartitionEnum.getByPartitionId(record.getPartitionId()).getZoneId()); + String cycleDate = zonedDateTime.with(DayOfWeek.MONDAY).format(DateTimeUtil.dateFormatter); + guildUsdOperateService.withdrawNum(cycleDate, record.getPartitionId()).addAndGet(record.getUid(), -1); } } } diff --git a/accompany-base/accompany-common/src/main/java/com/accompany/common/status/BusiStatus.java b/accompany-base/accompany-common/src/main/java/com/accompany/common/status/BusiStatus.java index 399aed038..f429f7b1d 100644 --- a/accompany-base/accompany-common/src/main/java/com/accompany/common/status/BusiStatus.java +++ b/accompany-base/accompany-common/src/main/java/com/accompany/common/status/BusiStatus.java @@ -988,6 +988,7 @@ public enum BusiStatus { RECHARGE_REGION_GIVE_LIMIT(500,"你暂时还未开启该区域业务"), RECHARGE_REGION_SALARY_LIMIT(500,"该代理暂不代理该区域业务"), ROOM_DAY_DIAMOND_REWARD_DATE_CHECK(500, "TODAY NOT ALLOW RECEIVE"), + GUILD_USD_OPT_LIMIT(500, "该交易类型已达到本周交易次数上限"), ; private final int value; diff --git a/accompany-base/accompany-core/src/main/java/com/accompany/common/redis/RedisKey.java b/accompany-base/accompany-core/src/main/java/com/accompany/common/redis/RedisKey.java index ce744cd03..5f9cc923a 100644 --- a/accompany-base/accompany-core/src/main/java/com/accompany/common/redis/RedisKey.java +++ b/accompany-base/accompany-core/src/main/java/com/accompany/common/redis/RedisKey.java @@ -1467,6 +1467,9 @@ public enum RedisKey { lock_user_pack, //礼包锁 v5pay_lock, //v5pay支付锁 + + guild_usd_withdraw_num, //公会薪资提现次数 + guild_usd_to_recharge_num,//公会薪资转代理次数 ; public String getKey() { diff --git a/accompany-business/accompany-business-sdk/src/main/java/com/accompany/business/dto/guild/GuildUsdToRechargeUserLimitConfigDto.java b/accompany-business/accompany-business-sdk/src/main/java/com/accompany/business/dto/guild/GuildUsdToRechargeUserLimitConfigDto.java index 52468d06e..efe89f1bc 100644 --- a/accompany-business/accompany-business-sdk/src/main/java/com/accompany/business/dto/guild/GuildUsdToRechargeUserLimitConfigDto.java +++ b/accompany-business/accompany-business-sdk/src/main/java/com/accompany/business/dto/guild/GuildUsdToRechargeUserLimitConfigDto.java @@ -13,6 +13,8 @@ public class GuildUsdToRechargeUserLimitConfigDto { private List memberEnableDayOfMonth; private List ownerEnableDayOfMonth; + private Integer limitToRechargeNum; + private Integer limitWithdrawNum; public GuildUsdToRechargeUserLimitConfigDto getByPartitionId(int partitionId) { return partitionMap.getOrDefault(partitionId, this); diff --git a/accompany-business/accompany-business-service/src/main/java/com/accompany/business/service/guild/GuildUsdOperateService.java b/accompany-business/accompany-business-service/src/main/java/com/accompany/business/service/guild/GuildUsdOperateService.java index c2f2c1d00..b158cf1df 100644 --- a/accompany-business/accompany-business-service/src/main/java/com/accompany/business/service/guild/GuildUsdOperateService.java +++ b/accompany-business/accompany-business-service/src/main/java/com/accompany/business/service/guild/GuildUsdOperateService.java @@ -2,6 +2,7 @@ package com.accompany.business.service.guild; import com.accompany.business.constant.guild.GuildConstant; import com.accompany.business.constant.guild.GuildUsdOperateTypeEnum; +import com.accompany.business.dto.guild.GuildUsdToRechargeUserLimitConfigDto; import com.accompany.business.model.UserPurse; import com.accompany.business.model.guild.GuildMember; import com.accompany.business.model.guild.GuildUsdBillRecord; @@ -17,6 +18,7 @@ import com.accompany.business.vo.guild.GuildUsdProdChannelVo; import com.accompany.common.config.SystemConfig; import com.accompany.common.constant.AppEnum; import com.accompany.common.status.BusiStatus; +import com.accompany.common.utils.DateTimeUtil; import com.accompany.common.utils.EnvComponent; import com.accompany.common.utils.UUIDUtil; import com.accompany.core.enumeration.BillObjTypeEnum; @@ -33,18 +35,26 @@ import com.accompany.core.util.I18NMessageSourceUtil; import com.accompany.payment.service.RechargeUserService; import org.apache.commons.collections.CollectionUtils; import org.apache.commons.lang3.StringUtils; +import org.redisson.api.RBucket; +import org.redisson.api.RMap; +import org.redisson.api.RedissonClient; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.math.BigDecimal; +import java.time.DayOfWeek; +import java.time.Duration; import java.time.ZoneId; import java.time.ZonedDateTime; import java.util.Arrays; +import java.util.Date; import java.util.List; import java.util.Optional; import static com.accompany.common.constant.Constant.ClanMode.GUILD_POLICY2; +import static com.accompany.common.redis.RedisKey.guild_usd_to_recharge_num; +import static com.accompany.common.redis.RedisKey.guild_usd_withdraw_num; import static com.accompany.common.constant.Constant.GLOBAL_CODE; @Service @@ -73,6 +83,8 @@ public class GuildUsdOperateService { @Autowired private EnvComponent envComponent; @Autowired + private RedissonClient redissonClient; + @Autowired private RechargeUserService rechargeUserService; @Autowired private RegionInfoService regionInfoService; @@ -173,6 +185,8 @@ public class GuildUsdOperateService { //代储校验 GuildMember targetMember = null; + Date now = new Date(); + GuildUsdToRechargeUserLimitConfigDto config = guildUsdToRechargeUserLimitService.getConfig(); if (GuildUsdOperateTypeEnum.USD_TO_PLATFORM.equals(typeEnum)){ targetMember = guildMember; } else if (GuildUsdOperateTypeEnum.USD_TO_GUILD_OWNER.equals(typeEnum)) { @@ -185,7 +199,32 @@ public class GuildUsdOperateService { throw new ServiceException(BusiStatus.PARAMETERILLEGAL); } } else if (GuildUsdOperateTypeEnum.USD_TO_RECHARGE_USER.equals(typeEnum)) { - guildUsdToRechargeUserLimitService.valid(guildMember, targetUid); + guildUsdToRechargeUserLimitService.valid(guildMember, targetUid, config); + Integer limitToRechargeNum = config.getLimitToRechargeNum(); + if (limitToRechargeNum != null) { + ZonedDateTime zonedDateTime = DateTimeUtil.convertWithZoneId(now, partitionInfo.getZoneId()); + String cycleDate = zonedDateTime.with(DayOfWeek.MONDAY).format(DateTimeUtil.dateFormatter); + RMap usdToRechargeMap = usdToRechargeNum(cycleDate, partitionInfo.getId()); + Integer toRechargeNum = usdToRechargeMap.get(uid); + if (toRechargeNum != null && toRechargeNum > limitToRechargeNum) { + throw new ServiceException(BusiStatus.GUILD_USD_OPT_LIMIT); + } + usdToRechargeMap.addAndGet(uid, 1); + usdToRechargeMap.expire(Duration.ofDays(7)); + } + } else if (GuildUsdOperateTypeEnum.MEMBER_USD_WITHDRAW.equals(typeEnum) || GuildUsdOperateTypeEnum.OWNER_USD_WITHDRAW.equals(typeEnum)) { + Integer limitWithdrawNum = config.getLimitWithdrawNum(); + if (limitWithdrawNum != null) { + ZonedDateTime zonedDateTime = DateTimeUtil.convertWithZoneId(now, partitionInfo.getZoneId()); + String cycleDate = zonedDateTime.with(DayOfWeek.MONDAY).format(DateTimeUtil.dateFormatter); + RMap withdrawNumMap = withdrawNum(cycleDate, partitionInfo.getId()); + Integer withdrawNum = withdrawNumMap.addAndGet(uid, 1); + if (withdrawNum > limitWithdrawNum) { + throw new ServiceException(BusiStatus.GUILD_USD_OPT_LIMIT); + } + withdrawNumMap.addAndGet(uid, 1); + withdrawNumMap.expire(Duration.ofDays(7)); + } } Long finalTargetUid = targetUid; @@ -270,4 +309,12 @@ public class GuildUsdOperateService { guildUsdBillRecordService.insert(objId, guildMember.getPartitionId(), null, guildId, null, guildMember.getId(), uid, GuildUsdOperateTypeEnum.USD_WITHDRAW_REJECT, null, before, guildUsdNum, null, null, null); } + + public RMap withdrawNum(String cycleDate, Integer partitionId) { + return redissonClient.getMap(guild_usd_withdraw_num.getKey(cycleDate, partitionId.toString())); + } + + public RMap usdToRechargeNum(String cycleDate, Integer partitionId) { + return redissonClient.getMap(guild_usd_to_recharge_num.getKey(cycleDate, partitionId.toString())); + } } diff --git a/accompany-business/accompany-business-service/src/main/java/com/accompany/business/service/guild/GuildUsdToRechargeUserLimitService.java b/accompany-business/accompany-business-service/src/main/java/com/accompany/business/service/guild/GuildUsdToRechargeUserLimitService.java index 0c826646b..dfcdb5d96 100644 --- a/accompany-business/accompany-business-service/src/main/java/com/accompany/business/service/guild/GuildUsdToRechargeUserLimitService.java +++ b/accompany-business/accompany-business-service/src/main/java/com/accompany/business/service/guild/GuildUsdToRechargeUserLimitService.java @@ -9,7 +9,6 @@ import com.accompany.common.utils.DateTimeUtil; import com.accompany.core.enumeration.I18nAlertEnum; import com.accompany.core.enumeration.PartitionEnum; import com.accompany.core.exception.ServiceException; -import com.accompany.core.model.Users; import com.accompany.core.service.SysConfService; import com.accompany.core.util.I18NMessageSourceUtil; import com.accompany.payment.service.RechargeUserService; @@ -51,11 +50,10 @@ public class GuildUsdToRechargeUserLimitService { return I18NMessageSourceUtil.getMessage(I18nAlertEnum.GUILD_USD_TO_RECHARGE_USER_DAY_OF_MONTH_LIMIT, new Object[]{enableDayOfMonthStr}, guildMember.getPartitionId()); } - public void valid(GuildMember guildMember, Long targetUid) { + public void valid(GuildMember guildMember, Long targetUid, GuildUsdToRechargeUserLimitConfigDto configDto) { if (null == targetUid || !rechargeUserService.isRechargeUser(targetUid)){ throw new ServiceException(BusiStatus.PARAMETERILLEGAL); } - GuildUsdToRechargeUserLimitConfigDto configDto = getConfig().getByPartitionId(guildMember.getPartitionId()); if (null == configDto){ return; }