独联体-薪资操作限制

This commit is contained in:
2025-09-18 19:17:02 +08:00
parent 1b8fd5809f
commit 6030c9b2e0
6 changed files with 63 additions and 5 deletions

View File

@@ -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);
}
}
}

View File

@@ -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;

View File

@@ -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() {

View File

@@ -13,6 +13,8 @@ public class GuildUsdToRechargeUserLimitConfigDto {
private List<Integer> memberEnableDayOfMonth;
private List<Integer> ownerEnableDayOfMonth;
private Integer limitToRechargeNum;
private Integer limitWithdrawNum;
public GuildUsdToRechargeUserLimitConfigDto getByPartitionId(int partitionId) {
return partitionMap.getOrDefault(partitionId, this);

View File

@@ -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<Long, Integer> 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<Long, Integer> 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<Long, Integer> withdrawNum(String cycleDate, Integer partitionId) {
return redissonClient.getMap(guild_usd_withdraw_num.getKey(cycleDate, partitionId.toString()));
}
public RMap<Long, Integer> usdToRechargeNum(String cycleDate, Integer partitionId) {
return redissonClient.getMap(guild_usd_to_recharge_num.getKey(cycleDate, partitionId.toString()));
}
}

View File

@@ -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;
}