|
|
|
@@ -17,11 +17,13 @@ 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;
|
|
|
|
|
import com.accompany.core.enumeration.CurrencyEnum;
|
|
|
|
|
import com.accompany.core.enumeration.I18nAlertEnum;
|
|
|
|
|
import com.accompany.core.enumeration.PartitionEnum;
|
|
|
|
|
import com.accompany.core.exception.ServiceException;
|
|
|
|
|
import com.accompany.core.model.PartitionInfo;
|
|
|
|
|
import com.accompany.core.model.Users;
|
|
|
|
@@ -29,16 +31,24 @@ import com.accompany.core.service.partition.PartitionInfoService;
|
|
|
|
|
import com.accompany.core.util.I18NMessageSourceUtil;
|
|
|
|
|
import com.accompany.payment.service.RechargeUserService;
|
|
|
|
|
import org.apache.commons.lang3.StringUtils;
|
|
|
|
|
import org.redisson.api.RBucket;
|
|
|
|
|
import org.redisson.api.RedissonClient;
|
|
|
|
|
import org.redisson.client.codec.IntegerCodec;
|
|
|
|
|
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.Optional;
|
|
|
|
|
|
|
|
|
|
import static com.accompany.common.redis.RedisKey.gusd_withdraw_limit;
|
|
|
|
|
|
|
|
|
|
@Service
|
|
|
|
|
public class GuildUsdOperateService {
|
|
|
|
|
|
|
|
|
@@ -64,6 +74,8 @@ public class GuildUsdOperateService {
|
|
|
|
|
private PartitionInfoService partitionInfoService;
|
|
|
|
|
@Autowired
|
|
|
|
|
private EnvComponent envComponent;
|
|
|
|
|
@Autowired
|
|
|
|
|
private RedissonClient redissonClient;
|
|
|
|
|
|
|
|
|
|
public void withdrawDiamond(Long uid, BigDecimal guildUsdNum) {
|
|
|
|
|
GuildMemberDiamondWithdrawVo vo = guildUsdChannelService.getDiamondWithDrawVo(uid);
|
|
|
|
@@ -105,16 +117,26 @@ public class GuildUsdOperateService {
|
|
|
|
|
if (!typeEnum.getRoleTypeSet().contains(guildMember.getRoleType())){
|
|
|
|
|
throw new ServiceException(BusiStatus.FAMILY_PERMISSION_DENIED);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
Users u = usersService.getNotNullUsersByUid(uid);
|
|
|
|
|
PartitionInfo partitionInfo = partitionInfoService.getById(u.getPartitionId());
|
|
|
|
|
RBucket<Integer> guildUsdWithdrawLimit = null;
|
|
|
|
|
if (GuildUsdOperateTypeEnum.USD_WITHDRAW.equals(typeEnum)){
|
|
|
|
|
Users u = usersService.getNotNullUsersByUid(uid);
|
|
|
|
|
PartitionInfo partitionInfo = partitionInfoService.getById(u.getPartitionId());
|
|
|
|
|
|
|
|
|
|
Integer dayOfMonth = ZonedDateTime.now(ZoneId.of(partitionInfo.getZoneId())).getDayOfMonth();
|
|
|
|
|
if (null!= GuildUsdOperateTypeEnum.USD_WITHDRAW.getDayOfMonthSet()
|
|
|
|
|
&& !GuildUsdOperateTypeEnum.USD_WITHDRAW.getDayOfMonthSet().contains(dayOfMonth)){
|
|
|
|
|
throw new ServiceException(BusiStatus.GUILD_USD_WITHDRAW_NOT_IN_TIME);
|
|
|
|
|
ZonedDateTime now = ZonedDateTime.now(ZoneId.of(partitionInfo.getZoneId()));
|
|
|
|
|
if (PartitionEnum.ENGLISH2.getId() == partitionInfo.getId()) {
|
|
|
|
|
ZonedDateTime weekBegin = DateTimeUtil.getWeekBegin(now);
|
|
|
|
|
String format = weekBegin.format(DateTimeUtil.yyyyMMdd);
|
|
|
|
|
guildUsdWithdrawLimit = redissonClient.getBucket(gusd_withdraw_limit.getKey(uid.toString(), format), IntegerCodec.INSTANCE);
|
|
|
|
|
if (guildUsdWithdrawLimit.isExists()) {
|
|
|
|
|
throw new ServiceException(BusiStatus.GUILD_USD_WITHDRAW_LIMIT_TIME);
|
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
Integer dayOfMonth = now.getDayOfMonth();
|
|
|
|
|
if (null!= GuildUsdOperateTypeEnum.USD_WITHDRAW.getDayOfMonthSet()
|
|
|
|
|
&& !GuildUsdOperateTypeEnum.USD_WITHDRAW.getDayOfMonthSet().contains(dayOfMonth)){
|
|
|
|
|
throw new ServiceException(BusiStatus.GUILD_USD_WITHDRAW_NOT_IN_TIME);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
GuildUsdProdChannelVo channelVo = guildUsdChannelService.buildProdChannelByType(guildMember.getPartitionId(), typeEnum);
|
|
|
|
@@ -181,14 +203,15 @@ public class GuildUsdOperateService {
|
|
|
|
|
|
|
|
|
|
if (GuildUsdOperateTypeEnum.USD_TO_GUILD_OWNER.equals(typeEnum) || GuildUsdOperateTypeEnum.USD_TO_RECHARGE_USER.equals(typeEnum)) {
|
|
|
|
|
//小秘书
|
|
|
|
|
Users u = usersService.getNotNullUsersByUid(uid);
|
|
|
|
|
String content = I18NMessageSourceUtil.getMessage(I18nAlertEnum.GUILD_USD_TO_RECHARGE_USER_TIP, new Object[]{u.getNick(), u.getErbanNo(), guildUsdNum.toPlainString()}, targetUid);
|
|
|
|
|
String skipUrl = String.format("%s://%s%s", envComponent.getDevOrNativeEnv()? "http": "https", AppEnum.getCurApp().getH5Domain(),
|
|
|
|
|
GuildUsdOperateTypeEnum.USD_TO_GUILD_OWNER.equals(typeEnum)?
|
|
|
|
|
GuildConstant.SkipUrl.BILL_RECORD_URL: GuildConstant.SkipUrl.RECHARGE_USER_RECORD_URL);
|
|
|
|
|
sendSysMsgService.sendPersonTextMsgWithSkipUrl(SystemConfig.secretaryUid, targetUid, content, skipUrl);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (PartitionEnum.ENGLISH2.getId() == partitionInfo.getId() && guildUsdWithdrawLimit != null) {
|
|
|
|
|
guildUsdWithdrawLimit.set(1, Duration.ofDays(1));
|
|
|
|
|
}
|
|
|
|
|
return buildBillRecordVo(billRecord);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|