diff --git a/accompany-admin/accompany-admin-service/src/main/java/com/accompany/admin/service/UserCheckAdminService.java b/accompany-admin/accompany-admin-service/src/main/java/com/accompany/admin/service/UserCheckAdminService.java index 52fad38f7..3c23668d8 100644 --- a/accompany-admin/accompany-admin-service/src/main/java/com/accompany/admin/service/UserCheckAdminService.java +++ b/accompany-admin/accompany-admin-service/src/main/java/com/accompany/admin/service/UserCheckAdminService.java @@ -286,6 +286,8 @@ public class UserCheckAdminService { throw new AdminServiceException("用户钻石余额不为0,不能改变分区"); } else if (userPurse.getGuildUsd() > 0d){ throw new AdminServiceException("用户金币公会薪资不为0,不能改变分区"); + } else if (userPurse.getGameUsd() > 0d){ + throw new AdminServiceException("用户游戏薪资不为0,不能改变分区"); } FamilyClanDecorateVo clanVo = familyClanService.getFamilyClanDecorateVo(users.getUid(), users.getUid()); 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 89fcec745..efcda0019 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 @@ -978,6 +978,12 @@ public enum BusiStatus { GUILD_H5_INVITE_EMAIL_ALREADY_BOUND(33001, "该邮箱地址不是新的"), GUILD_H5_INVITE_JOIN_GUILD_NOT_EXIST(33002, "邀请人公会不存在"), + + GAME_USD_RECV_EXPIRE(20516, "RECEIVE EXPIRE"), + + GAME_USD_RECV_EXIST(20516, "HAS RECEIVE"), + + GAME_USD_CURRENT_DAY_RECEIVE_LIMIT(20516, "CURRENT DAY RECEIVE LIMIT"), ; private final int value; diff --git a/accompany-base/accompany-core/src/main/java/com/accompany/common/constant/Constant.java b/accompany-base/accompany-core/src/main/java/com/accompany/common/constant/Constant.java index 8b3100586..1beb4a298 100644 --- a/accompany-base/accompany-core/src/main/java/com/accompany/common/constant/Constant.java +++ b/accompany-base/accompany-core/src/main/java/com/accompany/common/constant/Constant.java @@ -1382,9 +1382,12 @@ public class Constant { public static final String GUILD_USD_TO_RECHARGE_USER_LIMIT_CONFIG = "guild_usd_to_recharge_user_limit_config"; + public static final String USER_SET_LIMIT_CONFIG = "user_set_limit_config"; public static final String OFFICIAL_GOLD_ROLE_LIMIT_CONFIG = "official_gold_role_limit_config"; + + public static final String GAME_USD_TO_RECHARGE_USER_LIMIT = "game_usd_to_recharge_user_limit"; } public static class WithDrawStatus { 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 844c75ffa..a6ee2adc1 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 @@ -58,6 +58,7 @@ public enum RedisKey { lock_user_diamond, // 钻石分布式锁 lock_user_crystal, // 水晶分布式锁 lock_user_guild_usd, // 公会usd分布式锁 + lock_user_game_usd, // 游戏usd分布式锁 lock_gift_message, // 消费送礼物消息锁 mq_gift_status, // 礼物消息的状态 mq_prize_status, // 中奖消息的状态 @@ -1465,6 +1466,8 @@ public enum RedisKey { lock_user_pack, //礼包锁 v5pay_lock, //v5pay支付锁 + + game_usd_recv_lock, //游戏薪资锁 ; public String getKey() { diff --git a/accompany-business/accompany-business-sdk/src/main/java/com/accompany/business/constant/guildgame/GameTimeUtil.java b/accompany-business/accompany-business-sdk/src/main/java/com/accompany/business/constant/guildgame/GameTimeUtil.java new file mode 100644 index 000000000..34b105979 --- /dev/null +++ b/accompany-business/accompany-business-sdk/src/main/java/com/accompany/business/constant/guildgame/GameTimeUtil.java @@ -0,0 +1,18 @@ +package com.accompany.business.constant.guildgame; + +import com.accompany.common.utils.DateTimeUtil; + +import java.time.ZonedDateTime; +import java.time.format.DateTimeFormatter; + +public class GameTimeUtil { + + public static String getCycleDate(ZonedDateTime zdt) { + return zdt.withDayOfMonth(1).withHour(0).withMinute(0).withSecond(0).withNano(0) + .format(DateTimeFormatter.ofPattern(DateTimeUtil.DEFAULT_DATE_PATTERN)); + } + + public static String getStatDate(ZonedDateTime zdt){ + return zdt.format(DateTimeFormatter.ofPattern(DateTimeUtil.DEFAULT_DATE_PATTERN)); + } +} diff --git a/accompany-business/accompany-business-sdk/src/main/java/com/accompany/business/constant/guildgame/GameUsdOperateTypeEnum.java b/accompany-business/accompany-business-sdk/src/main/java/com/accompany/business/constant/guildgame/GameUsdOperateTypeEnum.java new file mode 100644 index 000000000..b4546d0fc --- /dev/null +++ b/accompany-business/accompany-business-sdk/src/main/java/com/accompany/business/constant/guildgame/GameUsdOperateTypeEnum.java @@ -0,0 +1,74 @@ +package com.accompany.business.constant.guildgame; + +import com.accompany.business.constant.guild.GuildConstant; +import com.accompany.core.enumeration.BillObjTypeEnum; +import com.accompany.core.enumeration.CurrencyEnum; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; + +import java.math.BigDecimal; +import java.util.Set; + +@Getter +@AllArgsConstructor +@NoArgsConstructor +public enum GameUsdOperateTypeEnum { + + RECEIVE_USD(1, null, Set.of(GuildConstant.RoleType.OWNER, GuildConstant.RoleType.MANAGER, GuildConstant.RoleType.NORMAL), null, + false, null, CurrencyEnum.GAME_USD, null, + null, BillObjTypeEnum.GAME_RECE_USD_IN), + + USD_TO_PLATFORM(2, GuildConstant.UsdTab.PERSONAL, Set.of(GuildConstant.RoleType.OWNER, GuildConstant.RoleType.MANAGER, GuildConstant.RoleType.NORMAL), null, + true, CurrencyEnum.GAME_USD, CurrencyEnum.DIAMOND, new BigDecimal("31000"), + BillObjTypeEnum.GAME_USD_EXCHANGE_GOLD_OUT, BillObjTypeEnum.GAME_USD_EXCHANGE_GOLD_IN),//1:31000 + + USD_TO_RECHARGE_USER(3, GuildConstant.UsdTab.PERSONAL, Set.of(GuildConstant.RoleType.OWNER, GuildConstant.RoleType.MANAGER, GuildConstant.RoleType.NORMAL), null, + true, CurrencyEnum.GAME_USD, CurrencyEnum.DIAMOND, new BigDecimal("30000"), + BillObjTypeEnum.GAME_USD_TO_RECHARGE_USER_OUT, BillObjTypeEnum.GAME_USD_TO_RECHARGE_USER_IN),//1:1000 + + USD_TO_GUILD_OWNER(4, GuildConstant.UsdTab.AGENT, Set.of(GuildConstant.RoleType.MANAGER, GuildConstant.RoleType.NORMAL), null, + false, CurrencyEnum.GAME_USD, CurrencyEnum.GAME_USD, BigDecimal.ONE, + BillObjTypeEnum.GAME_USD_TO_GUILD_OWNER_OUT, BillObjTypeEnum.GAME_USD_TO_GUILD_OWNER_IN), + + //USD_WITHDRAW(5, GuildConstant.UsdTab.AGENT, Set.of(GuildConstant.RoleType.OWNER), null, + // false, CurrencyEnum.GAME_USD, null, null, + // BillObjTypeEnum.GAME_USD_TO_PLATFORM_OUT, null), + + //OWNER_USD_WITHDRAW(5, GuildConstant.UsdTab.AGENT, Set.of(GuildConstant.RoleType.OWNER), Set.of(1, 2, 3), + // false, CurrencyEnum.GAME_USD, null, null, + // BillObjTypeEnum.GAME_USD_TO_PLATFORM_OUT, null), + + OWNER_USD_WITHDRAW(5, GuildConstant.UsdTab.AGENT, Set.of(GuildConstant.RoleType.OWNER), null, + false, CurrencyEnum.GAME_USD, null, null, + BillObjTypeEnum.GAME_USD_TO_PLATFORM_OUT, null), + + USD_WITHDRAW_REJECT(7, null, null, null, + false, null, CurrencyEnum.GAME_USD, null, + null, BillObjTypeEnum.GAME_USD_TO_PLATFORM_IN), + + //MEMBER_USD_WITHDRAW(8, GuildConstant.UsdTab.AGENT, Set.of(GuildConstant.RoleType.MANAGER, GuildConstant.RoleType.NORMAL), Set.of(1, 2, 3), + // false, CurrencyEnum.GAME_USD, null, null, + // BillObjTypeEnum.GAME_USD_TO_PLATFORM_OUT, null), + + MEMBER_USD_WITHDRAW(8, GuildConstant.UsdTab.AGENT, Set.of(GuildConstant.RoleType.MANAGER, GuildConstant.RoleType.NORMAL), null, + false, CurrencyEnum.GAME_USD, null, null, + BillObjTypeEnum.GAME_USD_TO_PLATFORM_OUT, null), + + ; + + private int type; + private String tabKey; + private Set roleTypeSet; + private Set dayOfMonthSet; + private boolean canCustom; + private CurrencyEnum outputCurrency; + private CurrencyEnum inputCurrency; + private BigDecimal ratio; + private BillObjTypeEnum outBillObjType; + private BillObjTypeEnum inBillObjType; + + public boolean isCanCustom() { + return canCustom; + } +} diff --git a/accompany-business/accompany-business-sdk/src/main/java/com/accompany/business/constant/guildgame/GameWithdrawAccountFieldEnum.java b/accompany-business/accompany-business-sdk/src/main/java/com/accompany/business/constant/guildgame/GameWithdrawAccountFieldEnum.java new file mode 100644 index 000000000..8c311bdcc --- /dev/null +++ b/accompany-business/accompany-business-sdk/src/main/java/com/accompany/business/constant/guildgame/GameWithdrawAccountFieldEnum.java @@ -0,0 +1,30 @@ +package com.accompany.business.constant.guildgame; + +import com.accompany.common.constant.Constant; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Getter +@AllArgsConstructor +@NoArgsConstructor +public enum GameWithdrawAccountFieldEnum { + + COUNTRY("country", Constant.status.invalid), + ACCOUNT("account", Constant.status.valid), + BANK_ACCOUNT("bank_account", Constant.status.delete), + BANK_NAME("bank_name", Constant.status.delete), + SWIFT_CODE("swift_code", Constant.status.delete), + FULL_NAME("full_name", Constant.status.delete), + ADDRESS("address", Constant.status.delete), + + DOCUMENT_ID("document_id", Constant.status.delete), + ACCOUNT_TYPE("account_type", Constant.status.delete), + ACCOUNT_NO("account_no", Constant.status.delete), + ACCOUNT_NAME("account_name", Constant.status.delete), + ; + + private String fieldName; + private byte type; + +} diff --git a/accompany-business/accompany-business-sdk/src/main/java/com/accompany/business/constant/guildgame/GameWithdrawAccountTypeEnum.java b/accompany-business/accompany-business-sdk/src/main/java/com/accompany/business/constant/guildgame/GameWithdrawAccountTypeEnum.java new file mode 100644 index 000000000..bf9bece4f --- /dev/null +++ b/accompany-business/accompany-business-sdk/src/main/java/com/accompany/business/constant/guildgame/GameWithdrawAccountTypeEnum.java @@ -0,0 +1,68 @@ +package com.accompany.business.constant.guildgame; + +import com.accompany.business.constant.CountryEnum; +import com.accompany.core.enumeration.PartitionEnum; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; + +import java.util.List; + +@Getter +@AllArgsConstructor +@NoArgsConstructor +public enum GameWithdrawAccountTypeEnum { + + //PAYONNER("payonner", PartitionEnum.ARAB.getId() + PartitionEnum.TURKEY.getId(), List.of(CountryEnum.AE,CountryEnum.EG,CountryEnum.QA,CountryEnum.SA,CountryEnum.TR,CountryEnum.YE,CountryEnum.AZ, CountryEnum.CY,CountryEnum.Other), + // List.of(GuildWithdrawAccountFieldEnum.COUNTRY, GuildWithdrawAccountFieldEnum.ACCOUNT, GuildWithdrawAccountFieldEnum.FULL_NAME)), + VODAFONE("vodafone", PartitionEnum.ARAB.getId(), List.of(CountryEnum.EG), + List.of(GameWithdrawAccountFieldEnum.COUNTRY, GameWithdrawAccountFieldEnum.ACCOUNT)), + /*BANK("bank", PartitionEnum.ARAB.getId() + PartitionEnum.TURKEY.getId(), List.of(CountryEnum.AE,CountryEnum.QA,CountryEnum.SA,CountryEnum.TR,CountryEnum.YE, CountryEnum.AZ, CountryEnum.CY), + List.of(GuildWithdrawAccountFieldEnum.COUNTRY, GuildWithdrawAccountFieldEnum.BANK_ACCOUNT, GuildWithdrawAccountFieldEnum.BANK_NAME, + GuildWithdrawAccountFieldEnum.SWIFT_CODE, GuildWithdrawAccountFieldEnum.FULL_NAME, GuildWithdrawAccountFieldEnum.ADDRESS)), + USDT("usdt", PartitionEnum.ARAB.getId(), List.of(CountryEnum.AE,CountryEnum.EG,CountryEnum.QA,CountryEnum.SA,CountryEnum.TR,CountryEnum.YE,CountryEnum.Other), + List.of(GuildWithdrawAccountFieldEnum.COUNTRY, GuildWithdrawAccountFieldEnum.ACCOUNT)), + + BANK_TRANSFER_LIRA("Bank Transfer Lira", PartitionEnum.TURKEY.getId(), List.of(CountryEnum.TR,CountryEnum.Other), + List.of(GuildWithdrawAccountFieldEnum.COUNTRY, GuildWithdrawAccountFieldEnum.BANK_ACCOUNT, GuildWithdrawAccountFieldEnum.FULL_NAME)), + + CARD_USD("Card Usd", PartitionEnum.TURKEY.getId(), List.of(CountryEnum.TR,CountryEnum.Other), + List.of(GuildWithdrawAccountFieldEnum.COUNTRY, GuildWithdrawAccountFieldEnum.BANK_ACCOUNT, GuildWithdrawAccountFieldEnum.FULL_NAME)), + + BANK_EN2("bank", PartitionEnum.ENGLISH.getId(), List.of(CountryEnum.BD,CountryEnum.ID,CountryEnum.MY,CountryEnum.PH,CountryEnum.PK, CountryEnum.VN, CountryEnum.IN, CountryEnum.NG), + List.of(GuildWithdrawAccountFieldEnum.COUNTRY, GuildWithdrawAccountFieldEnum.BANK_ACCOUNT, GuildWithdrawAccountFieldEnum.BANK_NAME, + GuildWithdrawAccountFieldEnum.SWIFT_CODE, GuildWithdrawAccountFieldEnum.FULL_NAME, GuildWithdrawAccountFieldEnum.ADDRESS)), + + USDT_EN2("usdt", PartitionEnum.ENGLISH.getId(), List.of(CountryEnum.US, CountryEnum.CA, CountryEnum.GR, CountryEnum.NG), + List.of(GuildWithdrawAccountFieldEnum.COUNTRY, GuildWithdrawAccountFieldEnum.ACCOUNT, GuildWithdrawAccountFieldEnum.ACCOUNT_NAME)), + + PAYONNER_EN2("payonner", PartitionEnum.ENGLISH.getId(), List.of(CountryEnum.BD,CountryEnum.ID,CountryEnum.MY,CountryEnum.PH,CountryEnum.PK, CountryEnum.VN, CountryEnum.IN, CountryEnum.NG,CountryEnum.Other), + List.of(GuildWithdrawAccountFieldEnum.COUNTRY, GuildWithdrawAccountFieldEnum.ACCOUNT, GuildWithdrawAccountFieldEnum.FULL_NAME)), + + EPAY_EN2("epay", PartitionEnum.ENGLISH.getId(), List.of(CountryEnum.BD,CountryEnum.ID,CountryEnum.MY,CountryEnum.PH,CountryEnum.PK, CountryEnum.VN, CountryEnum.IN, CountryEnum.NG), + List.of(GuildWithdrawAccountFieldEnum.COUNTRY, GuildWithdrawAccountFieldEnum.BANK_ACCOUNT)), + + GCASH_EN2("gcash", PartitionEnum.ENGLISH.getId(), List.of(CountryEnum.PH), + List.of(GuildWithdrawAccountFieldEnum.COUNTRY, GuildWithdrawAccountFieldEnum.BANK_ACCOUNT, GuildWithdrawAccountFieldEnum.FULL_NAME)), + + DANA_EN2("DANA", PartitionEnum.ENGLISH.getId(), List.of(CountryEnum.ID), + List.of(GuildWithdrawAccountFieldEnum.COUNTRY, GuildWithdrawAccountFieldEnum.BANK_ACCOUNT, GuildWithdrawAccountFieldEnum.FULL_NAME)), + + EASYPAISA_EN2("easypaisa", PartitionEnum.ENGLISH.getId(), List.of(CountryEnum.PK), + List.of(GuildWithdrawAccountFieldEnum.COUNTRY, GuildWithdrawAccountFieldEnum.BANK_ACCOUNT, GuildWithdrawAccountFieldEnum.FULL_NAME)), + + PIX("pix", PartitionEnum.ENGLISH.getId(), List.of(CountryEnum.BR), + List.of(GuildWithdrawAccountFieldEnum.COUNTRY, GuildWithdrawAccountFieldEnum.DOCUMENT_ID, GuildWithdrawAccountFieldEnum.ACCOUNT_TYPE, + GuildWithdrawAccountFieldEnum.ACCOUNT_NO, GuildWithdrawAccountFieldEnum.ACCOUNT_NAME)), + + ZALO("zalo", PartitionEnum.ENGLISH.getId() + PartitionEnum.ENGLISH.getId(), List.of(CountryEnum.VN), + List.of(GuildWithdrawAccountFieldEnum.COUNTRY, GuildWithdrawAccountFieldEnum.ACCOUNT_NO, GuildWithdrawAccountFieldEnum.ACCOUNT_NAME)),*/ + + ; + + private String type; + private Integer partitionFlag; + private List country; + private List fieldList; + +} diff --git a/accompany-business/accompany-business-sdk/src/main/java/com/accompany/business/dto/guild/GameUsdToRechargeUserLimitConfigDto.java b/accompany-business/accompany-business-sdk/src/main/java/com/accompany/business/dto/guild/GameUsdToRechargeUserLimitConfigDto.java new file mode 100644 index 000000000..b581b4699 --- /dev/null +++ b/accompany-business/accompany-business-sdk/src/main/java/com/accompany/business/dto/guild/GameUsdToRechargeUserLimitConfigDto.java @@ -0,0 +1,23 @@ +package com.accompany.business.dto.guild; + +import lombok.Data; + +import java.math.BigDecimal; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +@Data +public class GameUsdToRechargeUserLimitConfigDto { + + private Map partitionMap = new HashMap<>(); + + private BigDecimal dayNumLimit; + private List memberEnableDayOfMonth; + private List ownerEnableDayOfMonth; + + public GameUsdToRechargeUserLimitConfigDto getByPartitionId(int partitionId) { + return partitionMap.getOrDefault(partitionId, this); + } + +} diff --git a/accompany-business/accompany-business-sdk/src/main/java/com/accompany/business/model/UserPurse.java b/accompany-business/accompany-business-sdk/src/main/java/com/accompany/business/model/UserPurse.java index 91b1db69e..ae0ff6218 100644 --- a/accompany-business/accompany-business-sdk/src/main/java/com/accompany/business/model/UserPurse.java +++ b/accompany-business/accompany-business-sdk/src/main/java/com/accompany/business/model/UserPurse.java @@ -28,6 +28,8 @@ public class UserPurse { private Double guildUsd; + private Double gameUsd; + private Boolean firstCharge; private Date updateTime; @@ -41,6 +43,8 @@ public class UserPurse { return diamonds; } else if (CurrencyEnum.GUILD_USD.equals(currency)) { return guildUsd; + } else if (CurrencyEnum.GAME_USD.equals(currency)) { + return gameUsd; } throw new ServiceException(BusiStatus.PARAMETERILLEGAL); } diff --git a/accompany-business/accompany-business-sdk/src/main/java/com/accompany/business/model/guildgame/GameDiamondSalary.java b/accompany-business/accompany-business-sdk/src/main/java/com/accompany/business/model/guildgame/GameDiamondSalary.java new file mode 100644 index 000000000..1c652ed36 --- /dev/null +++ b/accompany-business/accompany-business-sdk/src/main/java/com/accompany/business/model/guildgame/GameDiamondSalary.java @@ -0,0 +1,43 @@ +package com.accompany.business.model.guildgame; + +import lombok.Data; + +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.Date; + +/** + * 游戏工资表实体类 + * + * @author + * @since 2025-07-30 + */ +@Data +public class GameDiamondSalary implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 玩游戏次数 + */ + private Integer playGameNum; + private Integer partitionId; + /** + * 等级 + */ + private String level; + /** + * 钻石目标 + */ + private BigDecimal diamondNum; + /** + * 基础工资 + */ + private BigDecimal baseSalary; + /** + * 创建时间 + */ + private Date createTime; + + +} diff --git a/accompany-business/accompany-business-sdk/src/main/java/com/accompany/business/model/guildgame/GameDiamondStatDay.java b/accompany-business/accompany-business-sdk/src/main/java/com/accompany/business/model/guildgame/GameDiamondStatDay.java new file mode 100644 index 000000000..79c14a90c --- /dev/null +++ b/accompany-business/accompany-business-sdk/src/main/java/com/accompany/business/model/guildgame/GameDiamondStatDay.java @@ -0,0 +1,52 @@ +package com.accompany.business.model.guildgame; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import lombok.Data; + +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.Date; + +/** + * 公会钻石流水统计按天实体类 + * + * @author + * @since 2025-07-30 + */ +@Data +public class GameDiamondStatDay implements Serializable { + + private static final long serialVersionUID = 1L; + + @TableId(value = "id" , type = IdType.AUTO) + private Long id; + private String cycleDate; + private Integer partitionId; + /** + * 统计日期 + */ + private String statDate; + private Long guildMemberId; + private Long uid; + /** + * 所属厅id + */ + private Integer guildId; + /** + * 玩游戏次数 + */ + private Integer playGameNum; + private BigDecimal diamondNum; + /** + * 领取状态 + */ + private Byte receiveStatus; + /** + * 创建时间 + */ + private Date createTime; + private Date updateTime; + + +} diff --git a/accompany-business/accompany-business-sdk/src/main/java/com/accompany/business/model/guildgame/GameUsdBillRecord.java b/accompany-business/accompany-business-sdk/src/main/java/com/accompany/business/model/guildgame/GameUsdBillRecord.java new file mode 100644 index 000000000..6f379e117 --- /dev/null +++ b/accompany-business/accompany-business-sdk/src/main/java/com/accompany/business/model/guildgame/GameUsdBillRecord.java @@ -0,0 +1,46 @@ +package com.accompany.business.model.guildgame; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import lombok.Data; + +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.Date; + +/** + * 实体类 + * + * @author + * @since 2025-07-30 + */ +@Data +public class GameUsdBillRecord implements Serializable { + + private static final long serialVersionUID = 1L; + + @TableId(value = "id" , type = IdType.AUTO) + private Long id; + private String no; + private Integer type; + private Integer partitionId; + private Long guildMemberId; + private Integer guildId; + private Long uid; + private Long targetGuildMemberId; + private Long targetUid; + private String cycleDate; + private String statDate; + private BigDecimal beforeUsd; + private BigDecimal operateUsd; + private BigDecimal afterUsd; + private Byte currency; + private BigDecimal beforeCurrency; + private BigDecimal operateCurrency; + private BigDecimal afterCurrency; + private Date createTime; + private Long recordId; + private String remark; + + +} diff --git a/accompany-business/accompany-business-sdk/src/main/java/com/accompany/business/model/guildgame/GameUsdProd.java b/accompany-business/accompany-business-sdk/src/main/java/com/accompany/business/model/guildgame/GameUsdProd.java new file mode 100644 index 000000000..225dbefdb --- /dev/null +++ b/accompany-business/accompany-business-sdk/src/main/java/com/accompany/business/model/guildgame/GameUsdProd.java @@ -0,0 +1,39 @@ +package com.accompany.business.model.guildgame; + +import com.accompany.business.constant.guildgame.GameUsdOperateTypeEnum; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; +import java.math.BigDecimal; + +/** + * 实体类 + * + * @author + * @since 2025-07-30 + */ +@NoArgsConstructor +@AllArgsConstructor +@Data +public class GameUsdProd implements Serializable { + + private static final long serialVersionUID = 1L; + + private Integer type; + private BigDecimal gameUsdNum; + private Integer partitionId; + private BigDecimal currencyNum; + private BigDecimal extraCurrencyNum; + private Boolean enable; + + public GameUsdProd(GameUsdOperateTypeEnum typeEnum, BigDecimal gameUsdNum, Integer partitionId) { + this.partitionId = partitionId; + this.type = typeEnum.getType(); + this.gameUsdNum = gameUsdNum; + this.currencyNum = gameUsdNum.multiply(typeEnum.getRatio()); + this.extraCurrencyNum = BigDecimal.ZERO; + this.enable = true; + } +} diff --git a/accompany-business/accompany-business-sdk/src/main/java/com/accompany/business/model/guildgame/GameUsdWithdrawAccount.java b/accompany-business/accompany-business-sdk/src/main/java/com/accompany/business/model/guildgame/GameUsdWithdrawAccount.java new file mode 100644 index 000000000..3e2b8a426 --- /dev/null +++ b/accompany-business/accompany-business-sdk/src/main/java/com/accompany/business/model/guildgame/GameUsdWithdrawAccount.java @@ -0,0 +1,27 @@ +package com.accompany.business.model.guildgame; + +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +/** + * 实体类 + * + * @author + * @since 2025-07-30 + */ +@Data +public class GameUsdWithdrawAccount implements Serializable { + + private static final long serialVersionUID = 1L; + + private Long uid; + private String accountType; + private String accountCountry; + private Boolean enable; + private String accountFields; + private Date createTime; + + +} diff --git a/accompany-business/accompany-business-sdk/src/main/java/com/accompany/business/model/guildgame/GameUsdWithdrawAccountConfig.java b/accompany-business/accompany-business-sdk/src/main/java/com/accompany/business/model/guildgame/GameUsdWithdrawAccountConfig.java new file mode 100644 index 000000000..ec1eb4d39 --- /dev/null +++ b/accompany-business/accompany-business-sdk/src/main/java/com/accompany/business/model/guildgame/GameUsdWithdrawAccountConfig.java @@ -0,0 +1,32 @@ +package com.accompany.business.model.guildgame; + +import lombok.Data; + +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.Date; + +/** + * 实体类 + * + * @author + * @since 2025-07-30 + */ +@Data +public class GameUsdWithdrawAccountConfig implements Serializable { + + private static final long serialVersionUID = 1L; + + private String accountType; + private Integer partitionId; + private String country; + private String currency; + private BigDecimal usdRatio; + private BigDecimal feeRate; + private Boolean enable; + private Integer seq; + private Date updateTime; + private Integer adminId; + + +} diff --git a/accompany-business/accompany-business-sdk/src/main/java/com/accompany/business/model/guildgame/GameUsdWithdrawRecord.java b/accompany-business/accompany-business-sdk/src/main/java/com/accompany/business/model/guildgame/GameUsdWithdrawRecord.java new file mode 100644 index 000000000..91eca9f52 --- /dev/null +++ b/accompany-business/accompany-business-sdk/src/main/java/com/accompany/business/model/guildgame/GameUsdWithdrawRecord.java @@ -0,0 +1,42 @@ +package com.accompany.business.model.guildgame; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import lombok.Data; + +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.Date; + +/** + * 实体类 + * + * @author + * @since 2025-07-30 + */ +@Data +public class GameUsdWithdrawRecord implements Serializable { + + private static final long serialVersionUID = 1L; + + @TableId(value = "id" , type = IdType.AUTO) + private Long id; + private Integer partitionId; + private Integer guildId; + private Long uid; + private BigDecimal gameUsdNum; + private String remark; + private Byte status; + private Date createTime; + private Date updateTime; + private String operator; + private String accountType; + private String accountCountry; + private String accountInfos; + private String currency; + private BigDecimal currencyNum; + private BigDecimal withdrawRate; + private BigDecimal withdrawNum; + + +} diff --git a/accompany-business/accompany-business-sdk/src/main/java/com/accompany/business/vo/guildgame/GameUsdAccountCycleUsdStatVo.java b/accompany-business/accompany-business-sdk/src/main/java/com/accompany/business/vo/guildgame/GameUsdAccountCycleUsdStatVo.java new file mode 100644 index 000000000..31911e2e7 --- /dev/null +++ b/accompany-business/accompany-business-sdk/src/main/java/com/accompany/business/vo/guildgame/GameUsdAccountCycleUsdStatVo.java @@ -0,0 +1,27 @@ +package com.accompany.business.vo.guildgame; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.math.BigDecimal; + +@ApiModel +@Data +public class GameUsdAccountCycleUsdStatVo { + @ApiModelProperty("周期") + private String cycleDate; + @ApiModelProperty("总收入") + private BigDecimal totalIncome; + @ApiModelProperty("总支出") + private BigDecimal settledIncome; + @ApiModelProperty("剩余") + private BigDecimal remainingIncome; + + public GameUsdAccountCycleUsdStatVo(String cycleDate) { + this.cycleDate = cycleDate; + this.totalIncome = BigDecimal.ZERO; + this.settledIncome = BigDecimal.ZERO; + this.remainingIncome = BigDecimal.ZERO; + } +} diff --git a/accompany-business/accompany-business-sdk/src/main/java/com/accompany/business/vo/guildgame/GameUsdBillRecordVo.java b/accompany-business/accompany-business-sdk/src/main/java/com/accompany/business/vo/guildgame/GameUsdBillRecordVo.java new file mode 100644 index 000000000..086133618 --- /dev/null +++ b/accompany-business/accompany-business-sdk/src/main/java/com/accompany/business/vo/guildgame/GameUsdBillRecordVo.java @@ -0,0 +1,36 @@ +package com.accompany.business.vo.guildgame; + +import com.accompany.business.vo.SimpleUserVo; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.math.BigDecimal; + +@ApiModel +@Data +public class GameUsdBillRecordVo { + + @ApiModelProperty("单号") + private String no; + @ApiModelProperty("类型枚举") + private Integer type; + @ApiModelProperty("me") + private SimpleUserVo me; + @ApiModelProperty("对象,官方提现时为null") + private SimpleUserVo target; + + @ApiModelProperty("变化前") + private BigDecimal beforeUsdNum; + @ApiModelProperty("变化量") + private BigDecimal operateUsdNum; + @ApiModelProperty("变化后") + private BigDecimal afterUsdNum; + + @ApiModelProperty("时间") + private String createTime; + + @ApiModelProperty("提现状态") + private Byte status; + +} diff --git a/accompany-business/accompany-business-sdk/src/main/java/com/accompany/business/vo/guildgame/GameUsdOperateBillRecordVo.java b/accompany-business/accompany-business-sdk/src/main/java/com/accompany/business/vo/guildgame/GameUsdOperateBillRecordVo.java new file mode 100644 index 000000000..3819c678d --- /dev/null +++ b/accompany-business/accompany-business-sdk/src/main/java/com/accompany/business/vo/guildgame/GameUsdOperateBillRecordVo.java @@ -0,0 +1,28 @@ +package com.accompany.business.vo.guildgame; + +import com.accompany.business.vo.SimpleUserVo; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.math.BigDecimal; +import java.util.Date; + +@ApiModel +@Data +public class GameUsdOperateBillRecordVo { + + @ApiModelProperty("单号") + private String no; + @ApiModelProperty("自己") + private SimpleUserVo me; + @ApiModelProperty("对象,官方提现时为null") + private SimpleUserVo target; + @ApiModelProperty("数量") + private BigDecimal gameUsdNum; + @ApiModelProperty("货币") + private BigDecimal currencyNum; + @ApiModelProperty("时间") + private Date createTime; + +} diff --git a/accompany-business/accompany-business-sdk/src/main/java/com/accompany/business/vo/guildgame/GameUsdOperateTabVo.java b/accompany-business/accompany-business-sdk/src/main/java/com/accompany/business/vo/guildgame/GameUsdOperateTabVo.java new file mode 100644 index 000000000..0b1637885 --- /dev/null +++ b/accompany-business/accompany-business-sdk/src/main/java/com/accompany/business/vo/guildgame/GameUsdOperateTabVo.java @@ -0,0 +1,39 @@ +package com.accompany.business.vo.guildgame; + +import com.accompany.business.vo.SimpleUserVo; +import com.accompany.payment.vo.RechargeUserVo; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +@ApiModel +@Data +public class GameUsdOperateTabVo { + + @ApiModelProperty("公会成员编号") + private Long guildMemberId; + @ApiModelProperty("公会id") + private Integer guildId; + private Long uid; + + @ApiModelProperty("公会长") + private SimpleUserVo guildOwner; + + @ApiModelProperty("代储列表") + private List rechargeUserList; + + @ApiModelProperty("转赠代理限制tip") + private String rechargeUserLimitTip; + + @ApiModelProperty("usd余额") + private Double gameUsdNum; + + @ApiModelProperty("标签页") + private List typeTab; + + @ApiModelProperty("提现账户") + private List withdrawAccountList; + +} diff --git a/accompany-business/accompany-business-sdk/src/main/java/com/accompany/business/vo/guildgame/GameUsdProdChannelVo.java b/accompany-business/accompany-business-sdk/src/main/java/com/accompany/business/vo/guildgame/GameUsdProdChannelVo.java new file mode 100644 index 000000000..57dd0aa4a --- /dev/null +++ b/accompany-business/accompany-business-sdk/src/main/java/com/accompany/business/vo/guildgame/GameUsdProdChannelVo.java @@ -0,0 +1,26 @@ +package com.accompany.business.vo.guildgame; + +import com.accompany.business.model.guildgame.GameUsdProd; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.math.BigDecimal; +import java.util.List; + +@ApiModel +@Data +public class GameUsdProdChannelVo { + + @ApiModelProperty("功能标签") + private String tabKey; + @ApiModelProperty("类型,1=领取usd,2=usd兑换金币,3=usd代储结算,4=usd会长结算,5=usd平台结算") + private int type; + @ApiModelProperty("是否有自定义") + private boolean canCustom; + @ApiModelProperty("usd到货币比例") + private BigDecimal ratio; + @ApiModelProperty("挡位列表") + private List prodList; + +} diff --git a/accompany-business/accompany-business-sdk/src/main/java/com/accompany/business/vo/guildgame/GameUsdProdTabVo.java b/accompany-business/accompany-business-sdk/src/main/java/com/accompany/business/vo/guildgame/GameUsdProdTabVo.java new file mode 100644 index 000000000..97057f168 --- /dev/null +++ b/accompany-business/accompany-business-sdk/src/main/java/com/accompany/business/vo/guildgame/GameUsdProdTabVo.java @@ -0,0 +1,20 @@ +package com.accompany.business.vo.guildgame; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +@ApiModel +@Data +public class GameUsdProdTabVo { + + @ApiModelProperty("tab") + private String tabKey; + @ApiModelProperty("seq") + private Integer seq; + @ApiModelProperty("a") + private List channelList; + +} diff --git a/accompany-business/accompany-business-sdk/src/main/java/com/accompany/business/vo/guildgame/GameUsdRechargeUserRecordVo.java b/accompany-business/accompany-business-sdk/src/main/java/com/accompany/business/vo/guildgame/GameUsdRechargeUserRecordVo.java new file mode 100644 index 000000000..cbfb1a126 --- /dev/null +++ b/accompany-business/accompany-business-sdk/src/main/java/com/accompany/business/vo/guildgame/GameUsdRechargeUserRecordVo.java @@ -0,0 +1,26 @@ +package com.accompany.business.vo.guildgame; + +import com.accompany.business.vo.SimpleUserVo; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.math.BigDecimal; +import java.util.Date; + +@ApiModel +@Data +public class GameUsdRechargeUserRecordVo { + + @ApiModelProperty("对象,官方提现时为null") + private SimpleUserVo target; + + @ApiModelProperty("guildUsd变化量") + private BigDecimal gameUsdNum; + @ApiModelProperty("gold变化量") + private BigDecimal goldNum; + + @ApiModelProperty("时间") + private Date createTime; + +} diff --git a/accompany-business/accompany-business-sdk/src/main/java/com/accompany/business/vo/guildgame/GameUsdWithdrawAccountVo.java b/accompany-business/accompany-business-sdk/src/main/java/com/accompany/business/vo/guildgame/GameUsdWithdrawAccountVo.java new file mode 100644 index 000000000..f6f7c6dba --- /dev/null +++ b/accompany-business/accompany-business-sdk/src/main/java/com/accompany/business/vo/guildgame/GameUsdWithdrawAccountVo.java @@ -0,0 +1,39 @@ +package com.accompany.business.vo.guildgame; + +import com.alibaba.fastjson.JSONObject; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.math.BigDecimal; +import java.util.List; + +@ApiModel +@Data +public class GameUsdWithdrawAccountVo { + + private Long uid; + + @ApiModelProperty("类型") + private String type; + + @ApiModelProperty("国家") + private String country; + + @ApiModelProperty("国家选项") + private List countryOptionalList; + + @ApiModelProperty("字段对象") + private JSONObject fields; + + @Data + public static class Country { + private String value; + private String name; + private String currency; + private BigDecimal usdRatio; + private BigDecimal feeRate; + private Integer seq; + } + +} diff --git a/accompany-business/accompany-business-sdk/src/main/java/com/accompany/business/vo/guildgame/GuildGameDayDetailVo.java b/accompany-business/accompany-business-sdk/src/main/java/com/accompany/business/vo/guildgame/GuildGameDayDetailVo.java new file mode 100644 index 000000000..7771264a0 --- /dev/null +++ b/accompany-business/accompany-business-sdk/src/main/java/com/accompany/business/vo/guildgame/GuildGameDayDetailVo.java @@ -0,0 +1,29 @@ +package com.accompany.business.vo.guildgame; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Builder; +import lombok.Data; + +import java.math.BigDecimal; + +@Builder +@ApiModel +@Data +public class GuildGameDayDetailVo { + @ApiModelProperty("统计日期") + private String statDate; + + @ApiModelProperty("领取状态:0-未领取,1-已领取, 2-已过期, 4-当天不可领取") + private Byte receiveStatus; + + @ApiModelProperty("薪资") + private BigDecimal daySalary; + + @ApiModelProperty("游戏次数") + private Integer playGameNum; + + @ApiModelProperty("游戏名称") + private String gameName; +} + diff --git a/accompany-business/accompany-business-sdk/src/main/java/com/accompany/business/vo/guildgame/GuildGameDayVo.java b/accompany-business/accompany-business-sdk/src/main/java/com/accompany/business/vo/guildgame/GuildGameDayVo.java new file mode 100644 index 000000000..821a67bed --- /dev/null +++ b/accompany-business/accompany-business-sdk/src/main/java/com/accompany/business/vo/guildgame/GuildGameDayVo.java @@ -0,0 +1,22 @@ +package com.accompany.business.vo.guildgame; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.math.BigDecimal; +import java.util.List; + +@Data +public class GuildGameDayVo { + @ApiModelProperty("月份") + private String monthDate; + @ApiModelProperty("每日数据") + private List dayDetailList; + @ApiModelProperty("已领取薪资") + private BigDecimal receivedSalary; + @ApiModelProperty("总游戏次数") + private Integer totalPlayGameNum; + @ApiModelProperty("游戏名称") + private String gameName; + +} diff --git a/accompany-business/accompany-business-sdk/src/main/java/com/accompany/business/vo/guildgame/GuildGameSalaryVo.java b/accompany-business/accompany-business-sdk/src/main/java/com/accompany/business/vo/guildgame/GuildGameSalaryVo.java new file mode 100644 index 000000000..b873fd290 --- /dev/null +++ b/accompany-business/accompany-business-sdk/src/main/java/com/accompany/business/vo/guildgame/GuildGameSalaryVo.java @@ -0,0 +1,25 @@ +package com.accompany.business.vo.guildgame; + +import com.accompany.business.vo.SimpleUserVo; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.math.BigDecimal; + +@ApiModel +@Data +public class GuildGameSalaryVo extends SimpleUserVo { + /** + * 薪资 + */ + @ApiModelProperty("游戏薪资") + private BigDecimal gameSalary = BigDecimal.ZERO; + + @ApiModelProperty("用户公会关联ID") + private Long guildMemberId; + + @ApiModelProperty("游戏数据") + private GuildGameDayVo gameDayVo; + +} diff --git a/accompany-business/accompany-business-sdk/src/main/java/com/accompany/business/vo/guildgame/GuildMemberGameUsdWithdrawAccountVo.java b/accompany-business/accompany-business-sdk/src/main/java/com/accompany/business/vo/guildgame/GuildMemberGameUsdWithdrawAccountVo.java new file mode 100644 index 000000000..152e95545 --- /dev/null +++ b/accompany-business/accompany-business-sdk/src/main/java/com/accompany/business/vo/guildgame/GuildMemberGameUsdWithdrawAccountVo.java @@ -0,0 +1,26 @@ +package com.accompany.business.vo.guildgame; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.math.BigDecimal; + +@ApiModel +@Data +public class GuildMemberGameUsdWithdrawAccountVo { + + @ApiModelProperty("账户类型") + private String type; + @ApiModelProperty("名") + private String name; + @ApiModelProperty("货币") + private String currency; + @ApiModelProperty("汇率") + private BigDecimal usdRatio; + @ApiModelProperty("手续费") + private BigDecimal withdrawRate; + + @ApiModelProperty("是否已绑定") + private Boolean hasBound; +} diff --git a/accompany-business/accompany-business-service/src/main/java/com/accompany/business/mybatismapper/UserPurseMapper.java b/accompany-business/accompany-business-service/src/main/java/com/accompany/business/mybatismapper/UserPurseMapper.java index e40e0dd63..a0b2bbf42 100644 --- a/accompany-business/accompany-business-service/src/main/java/com/accompany/business/mybatismapper/UserPurseMapper.java +++ b/accompany-business/accompany-business-service/src/main/java/com/accompany/business/mybatismapper/UserPurseMapper.java @@ -42,4 +42,8 @@ public interface UserPurseMapper extends BaseMapper { UserPurse queryByUid(@Param("uid") Long uid); + int addGameUsd(@Param("uid") Long uid, @Param("gameUsd") Double gameUsd); + + int minusGameUsd(@Param("uid") Long uid, @Param("gameUsd") Double gameUsd); + } \ No newline at end of file diff --git a/accompany-business/accompany-business-service/src/main/java/com/accompany/business/mybatismapper/guildgame/GameDiamondSalaryMapper.java b/accompany-business/accompany-business-service/src/main/java/com/accompany/business/mybatismapper/guildgame/GameDiamondSalaryMapper.java new file mode 100644 index 000000000..b3d86422f --- /dev/null +++ b/accompany-business/accompany-business-service/src/main/java/com/accompany/business/mybatismapper/guildgame/GameDiamondSalaryMapper.java @@ -0,0 +1,14 @@ +package com.accompany.business.mybatismapper.guildgame; + +import com.accompany.business.model.guildgame.GameDiamondSalary; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + * 游戏工资表 Mapper 接口 + * + * @author + * @since 2025-07-30 + */ +public interface GameDiamondSalaryMapper extends BaseMapper { + +} diff --git a/accompany-business/accompany-business-service/src/main/java/com/accompany/business/mybatismapper/guildgame/GameDiamondStatDayMapper.java b/accompany-business/accompany-business-service/src/main/java/com/accompany/business/mybatismapper/guildgame/GameDiamondStatDayMapper.java new file mode 100644 index 000000000..19510e6e6 --- /dev/null +++ b/accompany-business/accompany-business-service/src/main/java/com/accompany/business/mybatismapper/guildgame/GameDiamondStatDayMapper.java @@ -0,0 +1,21 @@ +package com.accompany.business.mybatismapper.guildgame; + +import com.accompany.business.model.guildgame.GameDiamondStatDay; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Param; + +import java.math.BigDecimal; +import java.util.Date; + +/** + * 公会钻石流水统计按天 Mapper 接口 + * + * @author + * @since 2025-07-30 + */ +public interface GameDiamondStatDayMapper extends BaseMapper { + + Integer addGameDiamondStatDay(@Param("uid") Long uid, @Param("guildMemberId") Long guildMemberId, @Param("cycleDate") String cycleDate, + @Param("statDate") String statDate, @Param("partitionId") Integer partitionId,@Param("guildId") Integer guildId, + @Param("playGameNum") Integer playGameNum, @Param("diamondNum") BigDecimal diamondNum, @Param("time") Date time); +} diff --git a/accompany-business/accompany-business-service/src/main/java/com/accompany/business/mybatismapper/guildgame/GameUsdBillRecordMapper.java b/accompany-business/accompany-business-service/src/main/java/com/accompany/business/mybatismapper/guildgame/GameUsdBillRecordMapper.java new file mode 100644 index 000000000..dbc70a6c8 --- /dev/null +++ b/accompany-business/accompany-business-service/src/main/java/com/accompany/business/mybatismapper/guildgame/GameUsdBillRecordMapper.java @@ -0,0 +1,41 @@ +package com.accompany.business.mybatismapper.guildgame; + +import com.accompany.business.model.guildgame.GameUsdBillRecord; +import com.accompany.business.vo.guild.AnchorSalaryBillAdminVo; +import com.accompany.business.vo.guildgame.GameUsdAccountCycleUsdStatVo; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import org.apache.ibatis.annotations.Param; + +import java.util.Date; +import java.util.List; + +/** + * Mapper 接口 + * + * @author + * @since 2025-07-30 + */ +public interface GameUsdBillRecordMapper extends BaseMapper { + + List listRechargeUserOrderByUsdDesc(@Param("uidList") List rechargeUserUidList, @Param("cycleDate") String cycleDate, @Param("type") Integer type); + + Page listPage(@Param("ipage") Page ipage, @Param("partitionId") Integer partitionId, @Param("dateCycle") String dateCycle, + @Param("uid") Long uid, @Param("receiveUid") Long receiveUid, @Param("startTime") String startTime, + @Param("endTime") String endTime, @Param("salaryOperateType") Integer salaryOperateType, @Param("hallId") Long hallId); + + List getCycleUsdStatInCycleDateList(@Param("memberId") Long memberId, @Param("cycleDateList") List cycleDateList); + + Double sum(@Param("partitionId")Integer partitionId, @Param("uid") Long uid, @Param("receiveUid") Long receiveUid, @Param("startTime") String startTime, @Param("endTime") String endTime, + @Param("salaryOperateType") Integer salaryOperateType); + + + Page anchorSummary(@Param("page") Page page, + @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 sumReceiveGameUsdGroupByTargetUid(@Param("partitionId") Integer partitionId, + @Param("startTime") Date startTime, + @Param("endTime") Date endTime); +} diff --git a/accompany-business/accompany-business-service/src/main/java/com/accompany/business/mybatismapper/guildgame/GameUsdProdMapper.java b/accompany-business/accompany-business-service/src/main/java/com/accompany/business/mybatismapper/guildgame/GameUsdProdMapper.java new file mode 100644 index 000000000..1e9e95baa --- /dev/null +++ b/accompany-business/accompany-business-service/src/main/java/com/accompany/business/mybatismapper/guildgame/GameUsdProdMapper.java @@ -0,0 +1,14 @@ +package com.accompany.business.mybatismapper.guildgame; + +import com.accompany.business.model.guildgame.GameUsdProd; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + * Mapper 接口 + * + * @author + * @since 2025-07-30 + */ +public interface GameUsdProdMapper extends BaseMapper { + +} diff --git a/accompany-business/accompany-business-service/src/main/java/com/accompany/business/mybatismapper/guildgame/GameUsdWithdrawAccountConfigMapper.java b/accompany-business/accompany-business-service/src/main/java/com/accompany/business/mybatismapper/guildgame/GameUsdWithdrawAccountConfigMapper.java new file mode 100644 index 000000000..8a5307241 --- /dev/null +++ b/accompany-business/accompany-business-service/src/main/java/com/accompany/business/mybatismapper/guildgame/GameUsdWithdrawAccountConfigMapper.java @@ -0,0 +1,14 @@ +package com.accompany.business.mybatismapper.guildgame; + +import com.accompany.business.model.guildgame.GameUsdWithdrawAccountConfig; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + * Mapper 接口 + * + * @author + * @since 2025-07-30 + */ +public interface GameUsdWithdrawAccountConfigMapper extends BaseMapper { + +} diff --git a/accompany-business/accompany-business-service/src/main/java/com/accompany/business/mybatismapper/guildgame/GameUsdWithdrawAccountMapper.java b/accompany-business/accompany-business-service/src/main/java/com/accompany/business/mybatismapper/guildgame/GameUsdWithdrawAccountMapper.java new file mode 100644 index 000000000..8739adf81 --- /dev/null +++ b/accompany-business/accompany-business-service/src/main/java/com/accompany/business/mybatismapper/guildgame/GameUsdWithdrawAccountMapper.java @@ -0,0 +1,14 @@ +package com.accompany.business.mybatismapper.guildgame; + +import com.accompany.business.model.guildgame.GameUsdWithdrawAccount; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + * Mapper 接口 + * + * @author + * @since 2025-07-30 + */ +public interface GameUsdWithdrawAccountMapper extends BaseMapper { + +} diff --git a/accompany-business/accompany-business-service/src/main/java/com/accompany/business/mybatismapper/guildgame/GameUsdWithdrawRecordMapper.java b/accompany-business/accompany-business-service/src/main/java/com/accompany/business/mybatismapper/guildgame/GameUsdWithdrawRecordMapper.java new file mode 100644 index 000000000..8bf4af4b3 --- /dev/null +++ b/accompany-business/accompany-business-service/src/main/java/com/accompany/business/mybatismapper/guildgame/GameUsdWithdrawRecordMapper.java @@ -0,0 +1,14 @@ +package com.accompany.business.mybatismapper.guildgame; + +import com.accompany.business.model.guildgame.GameUsdWithdrawRecord; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + * Mapper 接口 + * + * @author + * @since 2025-07-30 + */ +public interface GameUsdWithdrawRecordMapper extends BaseMapper { + +} diff --git a/accompany-business/accompany-business-service/src/main/java/com/accompany/business/service/guildgame/GameDiamondSalaryService.java b/accompany-business/accompany-business-service/src/main/java/com/accompany/business/service/guildgame/GameDiamondSalaryService.java new file mode 100644 index 000000000..5967efae8 --- /dev/null +++ b/accompany-business/accompany-business-service/src/main/java/com/accompany/business/service/guildgame/GameDiamondSalaryService.java @@ -0,0 +1,47 @@ +package com.accompany.business.service.guildgame; + +import com.accompany.business.model.guildgame.GameDiamondSalary; +import com.accompany.business.mybatismapper.guildgame.GameDiamondSalaryMapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.stereotype.Service; +import org.springframework.util.CollectionUtils; + +import java.util.List; +import java.util.Map; +import java.util.TreeMap; + +/** + * 游戏工资表 服务实现类 + * + * @author + * @since 2025-07-30 + */ +@Service +public class GameDiamondSalaryService extends ServiceImpl { + + + public GameDiamondSalary calDiamondSalary(Integer playGameNum, Integer partitionId){ + TreeMap diamondSalaryMap = getDiamondSalaryMap(partitionId); + Map.Entry curDiamondLevel = diamondSalaryMap.headMap(playGameNum, true).lastEntry(); + return curDiamondLevel.getValue(); + } + + public TreeMap getDiamondSalaryMap(Integer partitionId) { + List salaryList = lambdaQuery() + .eq(GameDiamondSalary::getPartitionId, partitionId).list(); + return getMap(salaryList); + } + + public TreeMap getMap(List salaryList) { + TreeMap map = new TreeMap<>(); + + if (CollectionUtils.isEmpty(salaryList)){ + return map; + } + + for (GameDiamondSalary salary : salaryList) { + map.put(salary.getPlayGameNum(), salary); + } + return map; + } +} diff --git a/accompany-business/accompany-business-service/src/main/java/com/accompany/business/service/guildgame/GameDiamondStatDayService.java b/accompany-business/accompany-business-service/src/main/java/com/accompany/business/service/guildgame/GameDiamondStatDayService.java new file mode 100644 index 000000000..0b92df573 --- /dev/null +++ b/accompany-business/accompany-business-service/src/main/java/com/accompany/business/service/guildgame/GameDiamondStatDayService.java @@ -0,0 +1,27 @@ +package com.accompany.business.service.guildgame; + +import com.accompany.business.model.guildgame.GameDiamondStatDay; +import com.baomidou.mybatisplus.extension.service.IService; + +import java.math.BigDecimal; +import java.util.Date; +import java.util.List; + +/** + * 公会钻石流水统计按天 服务类 + * + * @author + * @since 2025-07-30 + */ +public interface GameDiamondStatDayService extends IService { + + + Integer addGameDiamondStatDay(Long uid, Long guildMemberId, Date dataDate, Integer partitionId, + Integer guildId, Integer playGameNum, BigDecimal diamondNum); + + List getGuildGameMonthList(Long guildMemberId, String cycleDate); + + List queryByGuildMemberIdAndCycleDate(Long guildMemberId, String cycleDate); + + GameDiamondStatDay queryByGuildMemberIdAndStatDate(Long guildMemberId, String cycleDate, String statDate); +} diff --git a/accompany-business/accompany-business-service/src/main/java/com/accompany/business/service/guildgame/GameUsdBillRecordService.java b/accompany-business/accompany-business-service/src/main/java/com/accompany/business/service/guildgame/GameUsdBillRecordService.java new file mode 100644 index 000000000..2b5254159 --- /dev/null +++ b/accompany-business/accompany-business-service/src/main/java/com/accompany/business/service/guildgame/GameUsdBillRecordService.java @@ -0,0 +1,373 @@ +package com.accompany.business.service.guildgame; + +import com.accompany.business.constant.guildgame.GameTimeUtil; +import com.accompany.business.constant.guildgame.GameUsdOperateTypeEnum; +import com.accompany.business.model.UserPurse; +import com.accompany.business.model.guildgame.GameUsdBillRecord; +import com.accompany.business.model.guildgame.GameUsdWithdrawRecord; +import com.accompany.business.mybatismapper.guildgame.GameUsdBillRecordMapper; +import com.accompany.business.param.BasePageParams; +import com.accompany.business.service.user.UsersService; +import com.accompany.business.util.CycleTimeUtil; +import com.accompany.business.vo.guild.AnchorSalaryBillAdminVo; +import com.accompany.business.vo.guildgame.GameUsdAccountCycleUsdStatVo; +import com.accompany.business.vo.guildgame.GameUsdBillRecordVo; +import com.accompany.business.vo.guildgame.GameUsdRechargeUserRecordVo; +import com.accompany.common.constant.Constant; +import com.accompany.common.status.BusiStatus; +import com.accompany.common.utils.DateTimeUtil; +import com.accompany.core.enumeration.CurrencyEnum; +import com.accompany.core.enumeration.PartitionEnum; +import com.accompany.core.exception.ServiceException; +import com.accompany.core.model.PartitionInfo; +import com.accompany.core.model.Users; +import com.accompany.core.service.partition.PartitionInfoService; +import com.accompany.payment.service.RechargeUserService; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.apache.commons.collections.CollectionUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.math.BigDecimal; +import java.time.ZonedDateTime; +import java.util.*; +import java.util.stream.Collectors; + +/** + * 服务类 + * + * @author + * @since 2025-07-30 + */ +@Service +public class GameUsdBillRecordService extends ServiceImpl { + + @Autowired + private UsersService usersService; + @Autowired + private PartitionInfoService partitionInfoService; + @Autowired + private RechargeUserService rechargeUserService; + @Autowired + private GameUsdWithdrawRecordService gameUsdWithdrawRecordService; + + public GameUsdBillRecord insert(String no, Integer partitionId, Long memberId, Integer guildId, Long uid, Long targetMemberId, Long targetUid, GameUsdOperateTypeEnum typeEnum, + UserPurse before, UserPurse after, BigDecimal gameUsdNum, BigDecimal currencyNum, Long recordId, String remark, Date statDate) { + GameUsdBillRecord record = new GameUsdBillRecord(); + record.setNo(no); + record.setType(typeEnum.getType()); + record.setGuildMemberId(memberId); + record.setGuildId(guildId); + record.setUid(uid); + record.setPartitionId(partitionId); + record.setTargetGuildMemberId(targetMemberId); + record.setTargetUid(targetUid); + + if (statDate != null) { + Users u = usersService.getNotNullUsersByUid(null != uid ? uid : targetUid); + PartitionEnum partitionEnum = PartitionEnum.getByPartitionId(u.getPartitionId()); + ZonedDateTime zdt = DateTimeUtil.convertWithZoneId(statDate, partitionEnum.getZoneId()); + record.setCycleDate(GameTimeUtil.getCycleDate(zdt)); + record.setStatDate(GameTimeUtil.getStatDate(zdt)); + } + + boolean usdIsOutput = CurrencyEnum.GAME_USD.equals(typeEnum.getOutputCurrency()); + + BigDecimal afterUsdNum = BigDecimal.valueOf((usdIsOutput ? before : after).getGameUsd()); + record.setAfterUsd(afterUsdNum); + + BigDecimal operateUsdNum = usdIsOutput ? gameUsdNum.negate() : gameUsdNum; + record.setOperateUsd(operateUsdNum); + + BigDecimal beforeUsdNum = afterUsdNum.subtract(operateUsdNum); + record.setBeforeUsd(beforeUsdNum); + + if (null != currencyNum) { + boolean currencyIsInput = typeEnum.getOutputCurrency().equals(CurrencyEnum.GAME_USD); + CurrencyEnum currency = currencyIsInput ? typeEnum.getInputCurrency() : typeEnum.getOutputCurrency(); + record.setCurrency(currency.getValue()); + + BigDecimal afterCurrency = BigDecimal.valueOf((currencyIsInput ? after : before).getNumByCurrency(currency)); + record.setAfterCurrency(afterCurrency); + + BigDecimal operateCurrency = currencyIsInput ? currencyNum : currencyNum.negate(); + record.setOperateCurrency(operateCurrency); + + BigDecimal beforeCurrency = afterCurrency.subtract(operateCurrency); + record.setBeforeCurrency(beforeCurrency); + } + + record.setCreateTime(new Date()); + record.setRecordId(recordId); + record.setRemark(remark); + + save(record); + + return record; + } + + + public GameUsdBillRecord queryOne(Long guildMemberId, Long uid, String cycleDate, String statDate, GameUsdOperateTypeEnum typeEnum) { + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(GameUsdBillRecord::getGuildMemberId, guildMemberId); + queryWrapper.eq(GameUsdBillRecord::getUid, uid) + .eq(GameUsdBillRecord::getType, typeEnum.getType()) + .eq(GameUsdBillRecord::getCycleDate, cycleDate) + .eq(GameUsdBillRecord::getStatDate, statDate); + return baseMapper.selectOne(queryWrapper, false); + } + + /** + * KEY 为 guildMemberId_statDate + * @param guildMemberId + * @param uid + * @param cycleDate + * @param typeEnum + * @return + */ + public Map queryStatDateMap(Long guildMemberId, Long uid, String cycleDate, GameUsdOperateTypeEnum typeEnum) { + + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(GameUsdBillRecord::getGuildMemberId, guildMemberId); + queryWrapper.eq(GameUsdBillRecord::getUid, uid) + .eq(GameUsdBillRecord::getType, typeEnum.getType()) + .eq(GameUsdBillRecord::getCycleDate, cycleDate); + + List gameUsdBillRecords = baseMapper.selectList(queryWrapper); + + if (CollectionUtils.isEmpty(gameUsdBillRecords)) { + return Collections.emptyMap(); + } + return gameUsdBillRecords.stream().collect(Collectors.toMap(x -> String.format("%s_%s", x.getGuildMemberId(), x.getStatDate()), + x -> x)); + } + + + public List listRechargeUserOrderByUsdDesc(List rechargeUserUidList, String zoneId){ + String cycleDate = CycleTimeUtil.getCurCycleDateByZoneId(zoneId); + return this.baseMapper.listRechargeUserOrderByUsdDesc(rechargeUserUidList, cycleDate, GameUsdOperateTypeEnum.USD_TO_RECHARGE_USER.getType()); + } + + public Page pageBillRecordByType(Long uid, Byte type, Integer page, Integer pageSize) { + Page voPage = new Page<>(page, pageSize); + + Page poPage = new Page<>(page, pageSize); + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper() + .eq(Constant.status.valid.equals(type), GameUsdBillRecord::getTargetUid, uid) + .in(Constant.status.valid.equals(type), GameUsdBillRecord::getType, + List.of(GameUsdOperateTypeEnum.RECEIVE_USD.getType(), GameUsdOperateTypeEnum.USD_TO_GUILD_OWNER.getType(), + GameUsdOperateTypeEnum.USD_WITHDRAW_REJECT.getType())) + .eq(Constant.status.invalid.equals(type), GameUsdBillRecord::getUid, uid) + .in(Constant.status.invalid.equals(type), GameUsdBillRecord::getType, + List.of(GameUsdOperateTypeEnum.USD_TO_PLATFORM.getType(), GameUsdOperateTypeEnum.USD_TO_GUILD_OWNER.getType(), + GameUsdOperateTypeEnum.USD_TO_RECHARGE_USER.getType(), GameUsdOperateTypeEnum.OWNER_USD_WITHDRAW.getType(), + GameUsdOperateTypeEnum.MEMBER_USD_WITHDRAW.getType())) + .orderByDesc(GameUsdBillRecord::getId); + this.page(poPage, queryWrapper); + + if (org.springframework.util.CollectionUtils.isEmpty(poPage.getRecords())){ + return voPage; + } + + List recordList = poPage.getRecords(); + Set uidSet = new HashSet<>(); + uidSet.add(uid); + for (GameUsdBillRecord record : recordList) { + Long targetUid = Constant.status.valid.equals(type)? record.getUid(): record.getTargetUid(); + if (null == targetUid){ + continue; + } + uidSet.add(targetUid); + } + + Map usersMap = usersService.getUsersMapByUids(new ArrayList<>(uidSet)); + Users user = usersMap.get(uid); + PartitionEnum partitionEnum = PartitionEnum.getByPartitionId(user.getPartitionId()); + + List recordIdList = recordList.stream().map(GameUsdBillRecord::getRecordId).distinct().collect(Collectors.toList()); + Map withdrawRecordMap = !org.springframework.util.CollectionUtils.isEmpty(recordIdList)? + gameUsdWithdrawRecordService.lambdaQuery().in(GameUsdWithdrawRecord::getId, recordIdList) + .list().stream().collect(Collectors.toMap(GameUsdWithdrawRecord::getId, GameUsdWithdrawRecord::getStatus)) + :Collections.emptyMap(); + + List voList = new ArrayList<>(); + for (GameUsdBillRecord record: recordList){ + GameUsdBillRecordVo vo = new GameUsdBillRecordVo(); + vo.setNo(record.getNo()); + vo.setType(record.getType()); + + Users me = usersMap.get(uid); + if (null != me){ + vo.setMe(usersService.getSimpleUserVo(me)); + } + + Long targetUid = Constant.status.valid.equals(type)? record.getUid(): record.getTargetUid(); + Users u = usersMap.get(targetUid); + if (null != u){ + vo.setTarget(usersService.getSimpleUserVo(u)); + } + + if (Constant.status.valid.equals(type) + && record.getType().equals(GameUsdOperateTypeEnum.USD_TO_GUILD_OWNER.getType())){ + vo.setBeforeUsdNum(record.getBeforeCurrency()); + vo.setOperateUsdNum(record.getOperateCurrency()); + vo.setAfterUsdNum(record.getAfterCurrency()); + } else { + vo.setBeforeUsdNum(record.getBeforeUsd()); + vo.setOperateUsdNum(record.getOperateUsd()); + vo.setAfterUsdNum(record.getAfterUsd()); + } + + ZonedDateTime zdt = DateTimeUtil.convertWithZoneId(record.getCreateTime(), partitionEnum.getZoneId()); + vo.setCreateTime(zdt.format(DateTimeUtil.datetimeFormatter)); + + if ((record.getType().equals(GameUsdOperateTypeEnum.OWNER_USD_WITHDRAW.getType()) + || record.getType().equals(GameUsdOperateTypeEnum.MEMBER_USD_WITHDRAW.getType())) + || record.getType().equals(GameUsdOperateTypeEnum.USD_WITHDRAW_REJECT.getType()) + && null != record.getRecordId()){ + vo.setStatus(withdrawRecordMap.getOrDefault(record.getRecordId(), Constant.status.delete)); + } + + voList.add(vo); + } + + voPage.setRecords(voList); + voPage.setCurrent(poPage.getCurrent()); + voPage.setSize(poPage.getSize()); + return voPage; + } + + public Page pageRechargeUserRecordByType(Long uid, Date startDate, Date endDate, Integer page, Integer pageSize) { + Users me = usersService.getNotNullUsersByUid(uid); + PartitionInfo partitionInfo = partitionInfoService.getById(me.getPartitionId()); + if (null == partitionInfo || !Constant.ClanMode.GUILD.equals(partitionInfo.getClanMode()) + || !rechargeUserService.isRechargeUser(uid)) { + throw new ServiceException(BusiStatus.FAMILY_PERMISSION_DENIED); + } + + Page voPage = new Page<>(page, pageSize); + + Page poPage = new Page<>(page, pageSize); + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper() + .eq(GameUsdBillRecord::getTargetUid, uid) + .eq(GameUsdBillRecord::getType, GameUsdOperateTypeEnum.USD_TO_RECHARGE_USER.getType()) + .gt(null != startDate, GameUsdBillRecord::getCreateTime, startDate) + .lt(null != endDate, GameUsdBillRecord::getCreateTime, endDate) + .orderByDesc(GameUsdBillRecord::getId); + this.page(poPage, queryWrapper); + + if (org.springframework.util.CollectionUtils.isEmpty(poPage.getRecords())){ + return voPage; + } + + List recordList = poPage.getRecords(); + List uidList = recordList.stream().map(GameUsdBillRecord::getUid).distinct().collect(Collectors.toList()); + + Map usersMap = usersService.getUsersMapByUids(uidList); + + List voList = new ArrayList<>(); + for (GameUsdBillRecord record: recordList){ + GameUsdRechargeUserRecordVo vo = new GameUsdRechargeUserRecordVo(); + + Users u = usersMap.get(record.getUid()); + if (null != u){ + vo.setTarget(usersService.getSimpleUserVo(u)); + } + + vo.setGameUsdNum(record.getOperateUsd()); + vo.setGoldNum(record.getOperateCurrency()); + + vo.setCreateTime(record.getCreateTime()); + voList.add(vo); + } + + voPage.setRecords(voList); + voPage.setCurrent(poPage.getCurrent()); + voPage.setSize(poPage.getSize()); + return voPage; + } + + public List getCycleUsdStatInCycleDateList(Long memberId, List cycleDateList) { + return baseMapper.getCycleUsdStatInCycleDateList(memberId, cycleDateList); + } + + public Page listPage(BasePageParams pageParams, Long uid, Long receiveUid, Integer salaryOperateType, Long hallId) { + Page ipage = new Page<>(pageParams.getPageNo(), pageParams.getPageSize()); + Page anchorSalaryBillPage = this.baseMapper.listPage(ipage, pageParams.getPartitionId(), pageParams.getDateCycle(), + uid, receiveUid, pageParams.getStartTime(), pageParams.getEndTime(), salaryOperateType,hallId); + List anchorSalaryBillVos = converAdminBillVo(anchorSalaryBillPage.getRecords()); + + Page page = new Page<>(); + page.setTotal(anchorSalaryBillPage.getTotal()); + page.setRecords(anchorSalaryBillVos); + fillUserInfo(page.getRecords()); + fillReceiveUserInfo(page.getRecords()); + return page; + } + + public Double sum(Integer partitionId, Long uid, Long receiveUid, String startTime, String endTime, Integer salaryOperateType) { + return baseMapper.sum(partitionId, uid, receiveUid, startTime, endTime, salaryOperateType); + } + + public Double sumRechargeUsd(Long receiveUid, String cycleDate, Integer salaryOperateType) { + return baseMapper.sumRechargeUsd(receiveUid, cycleDate, salaryOperateType); + } + + private void fillReceiveUserInfo(List anchorSalaryBillVos) { + List uids = anchorSalaryBillVos.stream().map(AnchorSalaryBillAdminVo::getReceiveUid).filter(Objects::nonNull).collect(Collectors.toList()); + if (org.springframework.util.CollectionUtils.isEmpty(uids)){ + return; + } + Map cacheByUid = usersService.getUsersMapByUids(uids); + for (AnchorSalaryBillAdminVo anchorSalaryBillVo : anchorSalaryBillVos) { + Users users = cacheByUid.get(anchorSalaryBillVo.getReceiveUid()); + if (users!=null){ + anchorSalaryBillVo.setReceiveErbano(users.getErbanNo()); + anchorSalaryBillVo.setReceiveNick(users.getNick()); + } + } + } + + private void fillUserInfo(List anchorSalaryBillVos) { + List uids = anchorSalaryBillVos.stream().map(AnchorSalaryBillAdminVo::getUid).collect(Collectors.toList()); + Map cacheByUid = usersService.getUsersMapByUids(uids); + Map partitionDescMap = partitionInfoService.listAll().stream().collect(Collectors.toMap(PartitionInfo::getId, PartitionInfo::getDesc)); + for (AnchorSalaryBillAdminVo anchorSalaryBillVo : anchorSalaryBillVos) { + Users users = cacheByUid.get(anchorSalaryBillVo.getUid()); + if (users!=null){ + anchorSalaryBillVo.setErbano(users.getErbanNo()); + anchorSalaryBillVo.setNick(users.getNick()); + anchorSalaryBillVo.setPartitionDesc(partitionDescMap.get(users.getPartitionId())); + } + } + } + + private List converAdminBillVo(List anchorSalaryBills) { + List anchorSalaryBillAdminVos = new ArrayList<>(); + for (GameUsdBillRecord anchorSalaryBill : anchorSalaryBills) { + AnchorSalaryBillAdminVo anchorSalaryBillAdminVo = new AnchorSalaryBillAdminVo(); + anchorSalaryBillAdminVo.setCreateTime(anchorSalaryBill.getCreateTime()); + anchorSalaryBillAdminVo.setCreateTimeStr(DateTimeUtil.convertWithZoneId(anchorSalaryBill.getCreateTime() + , PartitionEnum.getByPartitionId(anchorSalaryBill.getPartitionId()).getZoneId()).format(DateTimeUtil.datetimeFormatter)); + anchorSalaryBillAdminVo.setNo(anchorSalaryBill.getNo()); + anchorSalaryBillAdminVo.setTradeUsb(anchorSalaryBill.getOperateUsd().doubleValue()); + anchorSalaryBillAdminVo.setGold(null != anchorSalaryBill.getOperateCurrency()? anchorSalaryBill.getOperateCurrency().longValue(): 0L); + anchorSalaryBillAdminVo.setUid(anchorSalaryBill.getUid()); + anchorSalaryBillAdminVo.setReceiveUid(anchorSalaryBill.getTargetUid()); + anchorSalaryBillAdminVo.setBeforeUsb(anchorSalaryBill.getBeforeUsd().doubleValue()); + anchorSalaryBillAdminVo.setAfterUsb(anchorSalaryBill.getAfterUsd().doubleValue()); + anchorSalaryBillAdminVo.setAfterDiamond(null != anchorSalaryBill.getAfterCurrency()? anchorSalaryBill.getAfterCurrency().doubleValue(): 0d); + anchorSalaryBillAdminVo.setExDiamond(null != anchorSalaryBill.getOperateCurrency()? anchorSalaryBill.getOperateCurrency().doubleValue(): 0d); + anchorSalaryBillAdminVos.add(anchorSalaryBillAdminVo); + } + return anchorSalaryBillAdminVos; + } + + public Page anchorSummary(Page page, String dateCycle, Long uid, Integer hallId, Integer partitionId) { + return baseMapper.anchorSummary(page, dateCycle, uid, hallId, partitionId); + } + + +} diff --git a/accompany-business/accompany-business-service/src/main/java/com/accompany/business/service/guildgame/GameUsdOperateService.java b/accompany-business/accompany-business-service/src/main/java/com/accompany/business/service/guildgame/GameUsdOperateService.java new file mode 100644 index 000000000..bd13e26ba --- /dev/null +++ b/accompany-business/accompany-business-service/src/main/java/com/accompany/business/service/guildgame/GameUsdOperateService.java @@ -0,0 +1,293 @@ +package com.accompany.business.service.guildgame; + +import com.accompany.business.constant.guild.GuildConstant; +import com.accompany.business.constant.guildgame.GameUsdOperateTypeEnum; +import com.accompany.business.model.UserPurse; +import com.accompany.business.model.guild.GuildMember; +import com.accompany.business.model.guildgame.GameDiamondStatDay; +import com.accompany.business.model.guildgame.GameUsdBillRecord; +import com.accompany.business.model.guildgame.GameUsdProd; +import com.accompany.business.model.guildgame.GameUsdWithdrawRecord; +import com.accompany.business.service.SendSysMsgService; +import com.accompany.business.service.guild.GuildMemberService; +import com.accompany.business.service.purse.UserPurseService; +import com.accompany.business.service.record.BillRecordService; +import com.accompany.business.service.user.UsersService; +import com.accompany.business.vo.guildgame.GameUsdOperateBillRecordVo; +import com.accompany.business.vo.guildgame.GameUsdProdChannelVo; +import com.accompany.common.config.SystemConfig; +import com.accompany.common.constant.AppEnum; +import com.accompany.common.redis.RedisKey; +import com.accompany.common.result.BusiResult; +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.Users; +import com.accompany.core.util.I18NMessageSourceUtil; +import org.apache.commons.lang3.StringUtils; +import org.redisson.api.RLock; +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.LocalDate; +import java.time.ZoneId; +import java.time.ZonedDateTime; +import java.time.format.DateTimeFormatter; +import java.util.Arrays; +import java.util.Date; +import java.util.List; +import java.util.Optional; +import java.util.concurrent.TimeUnit; + +import static com.accompany.core.enumeration.BillObjTypeEnum.GAME_RECE_USD_IN; + +@Service +public class GameUsdOperateService { + + @Autowired + private GameDiamondStatDayService gameDiamondStatDayService; + @Autowired + private GuildMemberService guildMemberService; + @Autowired + private UsersService usersService; + @Autowired + private UserPurseService userPurseService; + @Autowired + private RedissonClient redissonClient; + @Autowired + private GameUsdBillRecordService gameUsdBillRecordService; + @Autowired + private EnvComponent envComponent; + @Autowired + private GameUsdToRechargeUserLimitService gameUsdToRechargeUserLimitService; + @Autowired + private BillRecordService billRecordService; + @Autowired + private GameUsdWithdrawBizService gameUsdWithdrawBizService; + @Autowired + private GameUsdProdService gameUsdProdService; + @Autowired + private SendSysMsgService sendSysMsgService; + + + public BusiResult receiveGameUsd(Long uid, Long guildMemberId, String statDate, Double usd) throws InterruptedException { + String lockKey = RedisKey.game_usd_recv_lock.getKey(guildMemberId.toString(), statDate); + boolean locked = false; + RLock lock = redissonClient.getLock(lockKey); + try { + locked = lock.tryLock(5, TimeUnit.SECONDS); + if (!locked) { + throw new ServiceException(BusiStatus.SERVERBUSY); + } + GuildMember guildMember = guildMemberService.getById(guildMemberId); + if (guildMember == null || !guildMember.getEnable() || !guildMember.getUid().equals(uid)) { + throw new ServiceException(BusiStatus.HALL_PERMISSION_DENIED); + } + + Users users = usersService.getUsersByUid(uid); + Integer partitionId = users.getPartitionId(); + + PartitionEnum partitionEnum = PartitionEnum.getByPartitionId(partitionId); + Date time = new Date(); + ZonedDateTime nowZonedDateTime = DateTimeUtil.convertWithZoneId(time, partitionEnum.getZoneId()); + if (nowZonedDateTime.format(DateTimeUtil.dateFormatter).equals(statDate)) { + throw new ServiceException(BusiStatus.GAME_USD_CURRENT_DAY_RECEIVE_LIMIT); + } + + ZonedDateTime thirtyDaysAgoInZone = nowZonedDateTime.minusDays(30); + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + + LocalDate localDate = LocalDate.parse(statDate, formatter); + ZonedDateTime statTimeInZone = localDate.atStartOfDay(ZoneId.of(partitionEnum.getZoneId())); + boolean expire = statTimeInZone.isBefore(thirtyDaysAgoInZone); + + if (expire) { + throw new ServiceException(BusiStatus.GAME_USD_RECV_EXPIRE); + } + + String cycleDate = statTimeInZone.withDayOfMonth(1).format(DateTimeUtil.dateFormatter); + GameDiamondStatDay gameDiamondStatDay = gameDiamondStatDayService.queryByGuildMemberIdAndStatDate(guildMemberId, cycleDate, statDate); + if (gameDiamondStatDay == null) { + throw new ServiceException(BusiStatus.INVALID_REQUEST); + } + + if (gameDiamondStatDay.getReceiveStatus() == 1) { + throw new ServiceException(BusiStatus.GAME_USD_RECV_EXIST); + } + gameDiamondStatDay.setReceiveStatus((byte)1); + gameDiamondStatDay.setUpdateTime(time); + gameDiamondStatDayService.updateById(gameDiamondStatDay); + UserPurse before = userPurseService.addGameUsd(uid, BigDecimal.valueOf(usd), GAME_RECE_USD_IN); + gameUsdBillRecordService.insert(UUIDUtil.get(), partitionId, guildMemberId, guildMember.getGuildId(), uid, + guildMemberId, uid, GameUsdOperateTypeEnum.RECEIVE_USD, before, before, BigDecimal.valueOf(usd), null, + gameDiamondStatDay.getId(), null, time); + } finally { + if (locked) { + lock.unlock(); + } + } + return BusiResult.success(); + } + + @Transactional(rollbackFor = Exception.class) + public GameUsdOperateBillRecordVo operateUsd(Long uid, Long targetUid, Integer type, BigDecimal gameUsdNum, String accountType) { + GuildMember guildMember = guildMemberService.getVaildGuildMemberByUid(uid); + if (null == guildMember) { + throw new ServiceException(BusiStatus.FAMILY_PERMISSION_DENIED); + } + + Optional typeEnumOptional = Arrays.stream(GameUsdOperateTypeEnum.values()).filter(operateType-> StringUtils.isNotBlank(operateType.getTabKey())) + .filter(operateType->operateType.getType() == type).findFirst(); + if (typeEnumOptional.isEmpty()){ + throw new ServiceException(BusiStatus.PARAMETERILLEGAL); + } + GameUsdOperateTypeEnum typeEnum = typeEnumOptional.get(); + if (!typeEnum.getRoleTypeSet().contains(guildMember.getRoleType())){ + throw new ServiceException(BusiStatus.FAMILY_PERMISSION_DENIED); + } + Users u = usersService.getNotNullUsersByUid(uid); + PartitionEnum partitionEnum = PartitionEnum.getByPartitionId(u.getPartitionId()); + if ((GameUsdOperateTypeEnum.OWNER_USD_WITHDRAW.equals(typeEnum) || GameUsdOperateTypeEnum.MEMBER_USD_WITHDRAW.equals(typeEnum)) + && !envComponent.getDevOrNativeEnv()){ + ZonedDateTime now = ZonedDateTime.now(ZoneId.of(partitionEnum.getZoneId())); + Integer dayOfMonth = now.getDayOfMonth(); + if (null!= typeEnum.getDayOfMonthSet() + && !typeEnum.getDayOfMonthSet().contains(dayOfMonth)){ + throw new ServiceException(BusiStatus.GUILD_USD_WITHDRAW_NOT_IN_TIME); + } + } + + GameUsdProdChannelVo channelVo = this.buildProdChannelByType(guildMember.getPartitionId(), typeEnum); + Optional prodOptional = channelVo.getProdList().stream().filter(prod->prod.getGameUsdNum().equals(gameUsdNum)).findFirst(); + if (prodOptional.isEmpty() && !typeEnum.isCanCustom()) { + throw new ServiceException(BusiStatus.PARAMETERILLEGAL); + } + + GameUsdProd prod = prodOptional.orElseGet(()->new GameUsdProd(typeEnum, gameUsdNum, guildMember.getPartitionId())); + UserPurse userPurse = userPurseService.queryUserPurse(uid); + BigDecimal ownGameUsdNum = BigDecimal.valueOf(userPurse.getGameUsd()); + if (prod.getGameUsdNum().compareTo(ownGameUsdNum) > 0) { + throw new ServiceException(BusiStatus.NOT_ENOUGH_GUILD_USD); + } + + //代储校验 + GuildMember targetMember = null; + if (GameUsdOperateTypeEnum.USD_TO_PLATFORM.equals(typeEnum)){ + targetMember = guildMember; + } else if (GameUsdOperateTypeEnum.USD_TO_GUILD_OWNER.equals(typeEnum)) { + if (null == targetUid){ + throw new ServiceException(BusiStatus.PARAMETERILLEGAL); + } + targetMember = guildMemberService.getVaildGuildMemberByUid(targetUid); + if (null == targetMember || !GuildConstant.RoleType.OWNER.equals(targetMember.getRoleType()) + || !guildMember.getGuildId().equals(targetMember.getGuildId())) { + throw new ServiceException(BusiStatus.PARAMETERILLEGAL); + } + } else if (GameUsdOperateTypeEnum.USD_TO_RECHARGE_USER.equals(typeEnum)) { + gameUsdToRechargeUserLimitService.valid(guildMember, targetUid, gameUsdNum); + } + + Long finalTargetUid = targetUid; + UserPurse before = userPurseService.subGameUsd(uid, gameUsdNum, typeEnum.getOutBillObjType(), BusiStatus.NOT_ENOUGH_GUILD_USD, + (up)-> billRecordService.insertGeneralBillRecord(uid, finalTargetUid, typeEnum.getOutBillObjType(), gameUsdNum.doubleValue(), up)); + + UserPurse after = null; + BigDecimal currencyNum = null; + if (null != typeEnum.getInputCurrency()){ + if (GameUsdOperateTypeEnum.USD_TO_PLATFORM.equals(typeEnum)){ + targetUid = uid; + } + currencyNum = prod.getCurrencyNum().add(prod.getExtraCurrencyNum()); + // todo + double currencyNumDouble = currencyNum.doubleValue(); + after = CurrencyEnum.GAME_USD.equals(typeEnum.getInputCurrency())? + userPurseService.addGameUsd(targetUid, currencyNumDouble, typeEnum.getInBillObjType(), + (up) -> billRecordService.insertGeneralBillRecord(up.getUid(), uid, typeEnum.getInBillObjType(), currencyNumDouble, up)): + userPurseService.addDiamond(targetUid, currencyNumDouble, typeEnum.getInBillObjType(), + (up) -> billRecordService.insertGeneralBillRecord(up.getUid(), uid, typeEnum.getInBillObjType(), currencyNumDouble, up)); + } + + Long recordId = null; + if (GameUsdOperateTypeEnum.OWNER_USD_WITHDRAW.equals(typeEnum) || GameUsdOperateTypeEnum.MEMBER_USD_WITHDRAW.equals(typeEnum)) { + GameUsdWithdrawRecord record = gameUsdWithdrawBizService.insertRecord(guildMember.getPartitionId(), guildMember.getGuildId(), guildMember.getUid(), gameUsdNum, accountType); + recordId = record.getId(); + } + + String objId = UUIDUtil.get(); + GameUsdBillRecord billRecord = gameUsdBillRecordService.insert(objId, guildMember.getPartitionId(), guildMember.getId(), guildMember.getGuildId(), uid, + null != targetMember? targetMember.getId(): null, targetUid, typeEnum, before, after, gameUsdNum, currencyNum, recordId, null, null); + + if (GameUsdOperateTypeEnum.USD_TO_GUILD_OWNER.equals(typeEnum) || GameUsdOperateTypeEnum.USD_TO_RECHARGE_USER.equals(typeEnum)) { + //小秘书 + String content = I18NMessageSourceUtil.getMessage(I18nAlertEnum.GUILD_USD_TO_RECHARGE_USER_TIP, new Object[]{u.getNick(), u.getErbanNo(), gameUsdNum.toPlainString()}, targetUid); + String skipUrl = String.format("%s://%s%s", envComponent.getDevOrNativeEnv()? "http": "https", AppEnum.getCurApp().getH5Domain(), + GameUsdOperateTypeEnum.USD_TO_GUILD_OWNER.equals(typeEnum)? + GuildConstant.SkipUrl.BILL_RECORD_URL: GuildConstant.SkipUrl.RECHARGE_USER_RECORD_URL); + sendSysMsgService.sendPersonTextMsgWithSkipUrl(SystemConfig.secretaryUid, targetUid, content, skipUrl); + } + + return buildBillRecordVo(billRecord); + } + + private GameUsdProdChannelVo buildProdChannelByType(Integer partitionId, GameUsdOperateTypeEnum typeEnum){ + GameUsdProdChannelVo prodPanel = new GameUsdProdChannelVo(); + prodPanel.setType(typeEnum.getType()); + prodPanel.setCanCustom(typeEnum.isCanCustom()); + prodPanel.setRatio(typeEnum.getRatio()); + + List prodList = gameUsdProdService.listVaildProdByType(partitionId, typeEnum.getType()); + prodPanel.setProdList(prodList); + + return prodPanel; + } + + private GameUsdOperateBillRecordVo buildBillRecordVo(GameUsdBillRecord billRecord) { + GameUsdOperateBillRecordVo vo = new GameUsdOperateBillRecordVo(); + vo.setNo(billRecord.getNo()); + vo.setMe(usersService.getSimpleUserByUid(billRecord.getUid())); + if (null != billRecord.getTargetUid()){ + vo.setTarget(usersService.getSimpleUserByUid(billRecord.getTargetUid())); + } + vo.setGameUsdNum(billRecord.getOperateUsd()); + vo.setCurrencyNum(billRecord.getOperateCurrency()); + vo.setCreateTime(billRecord.getCreateTime()); + return vo; + } + + public void settlementGold(Integer guildId, Long uid, BigDecimal goldNum) { + GuildMember guildMember = guildMemberService.getVaildGuildMemberByUid(uid); + if (null == guildMember || !GuildConstant.RoleType.OWNER.equals(guildMember.getRoleType()) + || !guildMember.getGuildId().equals(guildId)) { + throw new ServiceException(BusiStatus.FAMILY_PERMISSION_DENIED); + } + + userPurseService.addGold(uid, goldNum.doubleValue(), BillObjTypeEnum.GUILD_SETTLEMENT_GOLD_IN); + } + + public void withdrawReject(Integer guildId, Long uid, BigDecimal gameUsdNum) { + GuildMember guildMember = guildMemberService.lambdaQuery() + .eq(GuildMember::getUid, uid) + .eq(GuildMember::getGuildId, guildId) + .orderByDesc(GuildMember::getUpdateTime) + .last("limit 1") + .one(); + if (null == guildMember) { + throw new ServiceException(BusiStatus.FAMILY_PERMISSION_DENIED); + } + + UserPurse before = userPurseService.addGameUsd(uid, gameUsdNum, BillObjTypeEnum.GUILD_USD_TO_PLATFORM_IN); + + String objId = UUIDUtil.get(); + gameUsdBillRecordService.insert(objId, guildMember.getPartitionId(), null, guildId, null, guildMember.getId(), uid, GameUsdOperateTypeEnum.USD_WITHDRAW_REJECT, + null, before, gameUsdNum, null, null, null, null); + } +} diff --git a/accompany-business/accompany-business-service/src/main/java/com/accompany/business/service/guildgame/GameUsdProdService.java b/accompany-business/accompany-business-service/src/main/java/com/accompany/business/service/guildgame/GameUsdProdService.java new file mode 100644 index 000000000..9f6342081 --- /dev/null +++ b/accompany-business/accompany-business-service/src/main/java/com/accompany/business/service/guildgame/GameUsdProdService.java @@ -0,0 +1,38 @@ +package com.accompany.business.service.guildgame; + +import com.accompany.business.model.guildgame.GameUsdProd; +import com.accompany.business.mybatismapper.guildgame.GameUsdProdMapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +/** + * 服务实现类 + * + * @author + * @since 2025-07-30 + */ +@Service +public class GameUsdProdService extends ServiceImpl { + + + public List listVaildProdByType(Integer partitionId, Integer type) { + return lambdaQuery() + .eq(GameUsdProd::getPartitionId, partitionId) + .eq(GameUsdProd::getType, type) + .eq(GameUsdProd::getEnable, Boolean.TRUE) + .list(); + } + + public Map> mapVaildProdInTypes(Integer partitionId, List types) { + return lambdaQuery() + .eq(GameUsdProd::getPartitionId, partitionId) + .in(GameUsdProd::getType, types) + .eq(GameUsdProd::getEnable, Boolean.TRUE) + .list() + .stream().collect(Collectors.groupingBy(GameUsdProd::getType)); + } +} diff --git a/accompany-business/accompany-business-service/src/main/java/com/accompany/business/service/guildgame/GameUsdService.java b/accompany-business/accompany-business-service/src/main/java/com/accompany/business/service/guildgame/GameUsdService.java new file mode 100644 index 000000000..b6228c816 --- /dev/null +++ b/accompany-business/accompany-business-service/src/main/java/com/accompany/business/service/guildgame/GameUsdService.java @@ -0,0 +1,283 @@ +package com.accompany.business.service.guildgame; + +import com.accompany.business.constant.guildgame.GameUsdOperateTypeEnum; +import com.accompany.business.model.UserPurse; +import com.accompany.business.model.guild.Guild; +import com.accompany.business.model.guild.GuildMember; +import com.accompany.business.model.guildgame.GameDiamondSalary; +import com.accompany.business.model.guildgame.GameDiamondStatDay; +import com.accompany.business.model.guildgame.GameUsdBillRecord; +import com.accompany.business.model.guildgame.GameUsdProd; +import com.accompany.business.service.guild.GuildMemberService; +import com.accompany.business.service.guild.GuildService; +import com.accompany.business.service.purse.UserPurseService; +import com.accompany.business.service.user.UsersService; +import com.accompany.business.vo.SimpleUserVo; +import com.accompany.business.vo.guildgame.*; +import com.accompany.common.status.BusiStatus; +import com.accompany.common.utils.DateTimeUtil; +import com.accompany.common.utils.StringUtils; +import com.accompany.core.enumeration.PartitionEnum; +import com.accompany.core.exception.ServiceException; +import com.accompany.core.model.PartitionInfo; +import com.accompany.core.model.Users; +import com.accompany.core.service.partition.PartitionInfoService; +import com.accompany.payment.service.RechargeUserService; +import com.accompany.payment.vo.RechargeUserVo; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.collections.CollectionUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.math.BigDecimal; +import java.time.LocalDate; +import java.time.ZoneId; +import java.time.ZonedDateTime; +import java.time.format.DateTimeFormatter; +import java.util.*; +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.ThreadPoolExecutor; +import java.util.concurrent.TimeUnit; +import java.util.stream.Collectors; + + +@Slf4j +@Service +public class GameUsdService { + + @Autowired + private GameDiamondStatDayService gameDiamondStatDayService; + @Autowired + private GuildMemberService guildMemberService; + @Autowired + private UsersService usersService; + @Autowired + private UserPurseService userPurseService; + @Autowired + private GameDiamondSalaryService gameDiamondSalaryService; + @Autowired + private GameUsdWithdrawAccountService gameUsdWithdrawAccountService; + @Autowired + private GuildService guildService; + @Autowired + private GameUsdProdService guildUsdProdService; + @Autowired + private RechargeUserService rechargeUserService; + @Resource(name = "bizExecutor") + private ThreadPoolExecutor bizExecutor; + @Autowired + private GameUsdBillRecordService guildUsdBillRecordService; + @Autowired + private PartitionInfoService partitionInfoService; + @Autowired + private GameUsdToRechargeUserLimitService guildUsdToRechargeUserLimitService; + + public GuildGameSalaryVo getGameUsdInfo(Long uid, String monthDate) { + GuildMember guildMember = guildMemberService.getVaildGuildMemberByUid(uid); + if (guildMember == null) { + throw new ServiceException(BusiStatus.HALL_PERMISSION_DENIED); + } + Users users = usersService.getUsersByUid(uid); + if (users == null) { + throw new ServiceException(BusiStatus.USERNOTEXISTS); + } + Integer partitionId = users.getPartitionId(); + PartitionEnum partitionEnum = PartitionEnum.getByPartitionId(partitionId); + + ZonedDateTime nowZoneDateTime = DateTimeUtil.convertWithZoneId(new Date(), partitionEnum.getZoneId()); + + if (StringUtils.isEmpty(monthDate)) { + ZonedDateTime zonedDateTime = nowZoneDateTime.withDayOfMonth(1); + monthDate = zonedDateTime.format(DateTimeUtil.dateFormatter); + } else { + monthDate = String.format("%s-01", monthDate); + } + + GuildGameSalaryVo guildGameSalaryVo = new GuildGameSalaryVo(); + guildGameSalaryVo.fillUserInfo(users); + + UserPurse userPurse = userPurseService.queryUserPurse(uid); + guildGameSalaryVo.setGameSalary(BigDecimal.valueOf(userPurse.getGameUsd())); + guildGameSalaryVo.setGuildMemberId(guildMember.getId()); + + GuildGameDayVo guildGameDayVo = new GuildGameDayVo(); + guildGameSalaryVo.setGameDayVo(guildGameDayVo); + guildGameDayVo.setMonthDate(monthDate); + guildGameDayVo.setDayDetailList(this.getGameDayDetailList(guildMember.getId(), monthDate, partitionId, nowZoneDateTime)); + + guildGameDayVo.setReceivedSalary(guildGameDayVo.getDayDetailList().stream() + .filter(x -> x.getReceiveStatus() == 1) + .map(GuildGameDayDetailVo::getDaySalary) + .reduce(BigDecimal.ZERO, BigDecimal::add)); + guildGameDayVo.setTotalPlayGameNum(guildGameDayVo.getDayDetailList().stream() + .mapToInt(GuildGameDayDetailVo::getPlayGameNum) + .sum()); + + return guildGameSalaryVo; + } + + private List getGameDayDetailList(Long guildMemberId, String monthDate, Integer partitionId, ZonedDateTime nowZoneDateTime) { + List resultList = new ArrayList<>(); + List guildGameMonthList = gameDiamondStatDayService.getGuildGameMonthList(guildMemberId, monthDate); + if (CollectionUtils.isEmpty(guildGameMonthList)) { + return resultList; + } + TreeMap salaryMap = gameDiamondSalaryService.getDiamondSalaryMap(partitionId); + PartitionEnum partitionEnum = PartitionEnum.getByPartitionId(partitionId); + + ZonedDateTime thirtyDaysAgoInZone = nowZoneDateTime.minusDays(30); + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + + guildGameMonthList.forEach(gameDiamondStatDay -> { + GuildGameDayDetailVo guildGameDayDetailVo = GuildGameDayDetailVo.builder() + .statDate(gameDiamondStatDay.getStatDate()) + .playGameNum(gameDiamondStatDay.getPlayGameNum()) + .daySalary(salaryMap.headMap(gameDiamondStatDay.getPlayGameNum(), true).lastEntry().getValue().getBaseSalary()) + .build(); + + LocalDate localDate = LocalDate.parse(gameDiamondStatDay.getStatDate(), formatter); + ZonedDateTime statTimeInZone = localDate.atStartOfDay(ZoneId.of(partitionEnum.getZoneId())); + boolean expire = statTimeInZone.isBefore(thirtyDaysAgoInZone); + if (nowZoneDateTime.format(DateTimeUtil.dateFormatter).equalsIgnoreCase(gameDiamondStatDay.getStatDate())) { + guildGameDayDetailVo.setReceiveStatus((byte) 4); + } else { + guildGameDayDetailVo.setReceiveStatus(expire ? 2 : gameDiamondStatDay.getReceiveStatus()); + } + + resultList.add(guildGameDayDetailVo); + }); + return resultList; + } + + + public GameUsdOperateTabVo getUsdOperateTabVo(Long uid) { + GuildMember guildMember = guildMemberService.getVaildGuildMemberByUid(uid); + if (null == guildMember){ + throw new ServiceException(BusiStatus.FAMILY_PERMISSION_DENIED); + } + + Guild guild = guildService.getVaildGuildById(guildMember.getGuildId()); + if (null == guild){ + throw new ServiceException(BusiStatus.FAMILY_PERMISSION_DENIED); + } + + GameUsdOperateTabVo vo = new GameUsdOperateTabVo(); + vo.setGuildMemberId(guildMember.getId()); + vo.setGuildId(guild.getId()); + vo.setUid(uid); + + CountDownLatch cdl = new CountDownLatch(3); + + bizExecutor.execute(()->{ + try { + SimpleUserVo guildOwner = usersService.getSimpleUserByUid(guild.getOwnerUid()); + vo.setGuildOwner(guildOwner); + + UserPurse userPurse = userPurseService.queryUserPurse(uid); + vo.setGameUsdNum(userPurse.getGameUsd()); + + List withdrawAccount = gameUsdWithdrawAccountService.listUserAccountVo(uid); + vo.setWithdrawAccountList(withdrawAccount); + } catch (Exception e){ + log.error("[getUsdOperateTabVo] guildOwner和userPurse 获取异常", e); + } finally { + cdl.countDown(); + } + }); + + bizExecutor.execute(()->{ + try { + String limitTip = guildUsdToRechargeUserLimitService.getLimitTIp(guildMember); + vo.setRechargeUserLimitTip(limitTip); + + if (org.apache.commons.lang3.StringUtils.isNotBlank(limitTip)){ + return; + } + + List rechargeUserList = listRechargeUser(uid); + vo.setRechargeUserList(rechargeUserList); + } catch (Exception e){ + log.error("[getUsdOperateTabVo] rechargeUser 获取异常", e); + } finally { + cdl.countDown(); + } + }); + + bizExecutor.execute(()->{ + try { + List tabVoList = buildTabByRoleType(uid, guildMember.getPartitionId(), guildMember.getRoleType()); + vo.setTypeTab(tabVoList); + } catch (Exception e){ + log.error("[getUsdOperateTabVo] tabVoList 获取异常", e); + } finally { + cdl.countDown(); + } + }); + + try { + cdl.await(3, TimeUnit.SECONDS); + } catch (InterruptedException e) { + log.error("[getUsdOperateTabVo] await 超时"); + throw new RuntimeException(e); + } + + return vo; + } + + private List buildTabByRoleType(Long uid, Integer partitionId, Byte roleType) { + List typeEnums = Arrays.stream(GameUsdOperateTypeEnum.values()).filter(typeEnum-> Objects.nonNull(typeEnum.getTabKey())) + .filter(typeEnum-> typeEnum.getRoleTypeSet().contains(roleType)) + .collect(Collectors.toList()); + + Map> channelMap = buildProdChannelInTypes(partitionId, typeEnums); + + return channelMap.entrySet().stream().map(entry->{ + GameUsdProdTabVo tabVo = new GameUsdProdTabVo(); + tabVo.setTabKey(entry.getKey()); + tabVo.setChannelList(entry.getValue()); + return tabVo; + }).sorted(Comparator.comparing(GameUsdProdTabVo::getTabKey).reversed()) + .collect(Collectors.toList()); + } + + public Map> buildProdChannelInTypes(Integer partitionId, List typeEnums){ + List types = typeEnums.stream().map(GameUsdOperateTypeEnum::getType).collect(Collectors.toList()); + Map> prodMap = guildUsdProdService.mapVaildProdInTypes(partitionId, types); + + return typeEnums.stream().filter(typeEnum->prodMap.containsKey(typeEnum.getType())) + .map(typeEnum->{ + GameUsdProdChannelVo channelVo = new GameUsdProdChannelVo(); + channelVo.setTabKey(typeEnum.getTabKey()); + channelVo.setType(typeEnum.getType()); + channelVo.setCanCustom(typeEnum.isCanCustom()); + channelVo.setRatio(typeEnum.getRatio()); + channelVo.setProdList(prodMap.get(typeEnum.getType())); + return channelVo; + }).collect(Collectors.groupingBy(GameUsdProdChannelVo::getTabKey)); + } + + private List listRechargeUser(Long uid){ + Users u = usersService.getNotNullUsersByUid(uid); + PartitionInfo partitionInfo = partitionInfoService.getById(u.getPartitionId()); + if (null == partitionInfo){ + return Collections.emptyList(); + } + + List rechargeUserVoList = rechargeUserService.listByPartitionIdByGuildTab(u.getPartitionId()); + if (org.springframework.util.CollectionUtils.isEmpty(rechargeUserVoList)){ + return rechargeUserVoList; + } + + List uidList = rechargeUserVoList.stream().map(RechargeUserVo::getUid).collect(Collectors.toList()); + List recordList = guildUsdBillRecordService.listRechargeUserOrderByUsdDesc(uidList, partitionInfo.getZoneId()); + if (org.springframework.util.CollectionUtils.isEmpty(recordList)){ + return rechargeUserVoList; + } + + return rechargeUserVoList.stream().sorted(Comparator.comparing(RechargeUserVo::getStarLevelSeq).reversed()) + .collect(Collectors.toList()); + } + + +} diff --git a/accompany-business/accompany-business-service/src/main/java/com/accompany/business/service/guildgame/GameUsdToRechargeUserLimitService.java b/accompany-business/accompany-business-service/src/main/java/com/accompany/business/service/guildgame/GameUsdToRechargeUserLimitService.java new file mode 100644 index 000000000..383f276f3 --- /dev/null +++ b/accompany-business/accompany-business-service/src/main/java/com/accompany/business/service/guildgame/GameUsdToRechargeUserLimitService.java @@ -0,0 +1,114 @@ +package com.accompany.business.service.guildgame; + +import com.accompany.business.constant.guild.GuildConstant; +import com.accompany.business.constant.guildgame.GameUsdOperateTypeEnum; +import com.accompany.business.dto.guild.GameUsdToRechargeUserLimitConfigDto; +import com.accompany.business.model.guild.GuildMember; +import com.accompany.business.mybatismapper.guildgame.GameUsdBillRecordMapper; +import com.accompany.common.constant.Constant; +import com.accompany.common.status.BusiStatus; +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.service.SysConfService; +import com.accompany.core.util.I18NMessageSourceUtil; +import com.accompany.payment.service.RechargeUserService; +import com.alibaba.fastjson2.JSON; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.util.CollectionUtils; +import org.springframework.util.StringUtils; + +import java.math.BigDecimal; +import java.time.ZoneId; +import java.time.ZonedDateTime; +import java.util.Date; +import java.util.List; +import java.util.stream.Collectors; + +@Service +public class GameUsdToRechargeUserLimitService { + + @Autowired + private SysConfService sysConfService; + @Autowired + private RechargeUserService rechargeUserService; + @Autowired + private GameUsdBillRecordMapper guildUsdBillRecordMapper; + + public String getLimitTIp(GuildMember guildMember) { + GameUsdToRechargeUserLimitConfigDto configDto = getConfig().getByPartitionId(guildMember.getPartitionId()); + if (null == configDto){ + return null; + } + List enableDayOfMonth = GuildConstant.RoleType.OWNER.equals(guildMember.getRoleType())? + configDto.getOwnerEnableDayOfMonth(): + configDto.getMemberEnableDayOfMonth(); + if (CollectionUtils.isEmpty(enableDayOfMonth)){ + return null; + } + PartitionEnum partitionEnum = PartitionEnum.getByPartitionId(guildMember.getPartitionId()); + ZonedDateTime zdt = DateTimeUtil.getDateTimeByZoneId(partitionEnum.getZoneId()); + if (enableDayOfMonth.contains(zdt.getDayOfMonth())){ + return null; + } + String enableDayOfMonthStr = enableDayOfMonth.stream().sorted().map(String::valueOf).collect(Collectors.joining(",")); + 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, BigDecimal guildUsdNum) { + if (null == targetUid || !rechargeUserService.isRechargeUser(targetUid)){ + throw new ServiceException(BusiStatus.PARAMETERILLEGAL); + } + //todo numberEveryDayLimit + GameUsdToRechargeUserLimitConfigDto configDto = getConfig().getByPartitionId(guildMember.getPartitionId()); + if (null == configDto){ + return; + } + List enableDayOfMonth = GuildConstant.RoleType.OWNER.equals(guildMember.getRoleType())? + configDto.getOwnerEnableDayOfMonth(): + configDto.getMemberEnableDayOfMonth(); + if (CollectionUtils.isEmpty(enableDayOfMonth)){ + return; + } + PartitionEnum partitionEnum = PartitionEnum.getByPartitionId(guildMember.getPartitionId()); + ZonedDateTime zdt = DateTimeUtil.getDateTimeByZoneId(partitionEnum.getZoneId()); + if (!enableDayOfMonth.contains(zdt.getDayOfMonth())){ + String enableDayOfMonthStr = enableDayOfMonth.stream().sorted().map(String::valueOf).collect(Collectors.joining(",")); + String errorMsg = I18NMessageSourceUtil.getMessage(I18nAlertEnum.GUILD_USD_TO_RECHARGE_USER_DAY_OF_MONTH_LIMIT, new Object[]{enableDayOfMonthStr}, guildMember.getPartitionId()); + throw new ServiceException(errorMsg); + } + + if (null == configDto.getDayNumLimit() || BigDecimal.ZERO.compareTo(configDto.getDayNumLimit()) <= 0){ + return; + } + ZonedDateTime todayStartTime = zdt.withHour(0).withMinute(0).withSecond(0).withNano(0); + Date systemStartTime = DateTimeUtil.converLocalDateTimeToDate(todayStartTime.withZoneSameInstant(ZoneId.systemDefault()).toLocalDateTime()); + String systemStartTimeStr = DateTimeUtil.convertDateTime(systemStartTime); + + ZonedDateTime todayEndTime = zdt.withHour(23).withMinute(59).withSecond(59).withNano(999999999); + Date systemEndTime = DateTimeUtil.converLocalDateTimeToDate(todayEndTime.withZoneSameInstant(ZoneId.systemDefault()).toLocalDateTime()); + String systemEndTimeStr = DateTimeUtil.convertDateTime(systemEndTime); + + Double todayNum = guildUsdBillRecordMapper.sum(guildMember.getPartitionId(), guildMember.getUid(), null, + systemStartTimeStr, systemEndTimeStr, GameUsdOperateTypeEnum.USD_TO_RECHARGE_USER.getType()); + BigDecimal todayNumB = null == todayNum? BigDecimal.ZERO: BigDecimal.valueOf(todayNum); + BigDecimal judgeNum = todayNumB.add(guildUsdNum); + + if (judgeNum.compareTo(configDto.getDayNumLimit()) > 0){ + String errorMsg = I18NMessageSourceUtil.getMessage(I18nAlertEnum.GUILD_USD_TO_RECHARGE_USER_DAY_NUM_LIMIT, null, guildMember.getPartitionId()); + throw new ServiceException(errorMsg); + } + + } + + public GameUsdToRechargeUserLimitConfigDto getConfig(){ + String configStr = sysConfService.getSysConfValueById(Constant.SysConfId.GAME_USD_TO_RECHARGE_USER_LIMIT); + if (!StringUtils.hasText(configStr)){ + throw new ServiceException(BusiStatus.SERVERERROR); + } + return JSON.parseObject(configStr, GameUsdToRechargeUserLimitConfigDto.class); + } + +} diff --git a/accompany-business/accompany-business-service/src/main/java/com/accompany/business/service/guildgame/GameUsdWithdrawAccountConfigService.java b/accompany-business/accompany-business-service/src/main/java/com/accompany/business/service/guildgame/GameUsdWithdrawAccountConfigService.java new file mode 100644 index 000000000..3af70d79c --- /dev/null +++ b/accompany-business/accompany-business-service/src/main/java/com/accompany/business/service/guildgame/GameUsdWithdrawAccountConfigService.java @@ -0,0 +1,39 @@ +package com.accompany.business.service.guildgame; + +import com.accompany.business.model.guildgame.GameUsdWithdrawAccountConfig; +import com.accompany.business.mybatismapper.guildgame.GameUsdWithdrawAccountConfigMapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + * 服务实现类 + * + * @author + * @since 2025-07-30 + */ +@Service +public class GameUsdWithdrawAccountConfigService extends ServiceImpl { + + + public List listAccountConfig(List accountTypeList, + Integer partitionId){ + return lambdaQuery() + .in(GameUsdWithdrawAccountConfig::getAccountType, accountTypeList) + .eq(GameUsdWithdrawAccountConfig::getPartitionId, partitionId) + .eq(GameUsdWithdrawAccountConfig::getEnable, Boolean.TRUE) + .orderByAsc(GameUsdWithdrawAccountConfig::getSeq) + .list(); + } + + public GameUsdWithdrawAccountConfig getAccountConfig(String accountType, + Integer partitionId, + String country){ + return lambdaQuery() + .eq(GameUsdWithdrawAccountConfig::getAccountType, accountType) + .eq(GameUsdWithdrawAccountConfig::getPartitionId, partitionId) + .eq(GameUsdWithdrawAccountConfig::getCountry, country) + .one(); + } +} diff --git a/accompany-business/accompany-business-service/src/main/java/com/accompany/business/service/guildgame/GameUsdWithdrawAccountService.java b/accompany-business/accompany-business-service/src/main/java/com/accompany/business/service/guildgame/GameUsdWithdrawAccountService.java new file mode 100644 index 000000000..9f8a49d85 --- /dev/null +++ b/accompany-business/accompany-business-service/src/main/java/com/accompany/business/service/guildgame/GameUsdWithdrawAccountService.java @@ -0,0 +1,185 @@ +package com.accompany.business.service.guildgame; + +import com.accompany.business.constant.CountryEnum; +import com.accompany.business.constant.guildgame.GameWithdrawAccountFieldEnum; +import com.accompany.business.constant.guildgame.GameWithdrawAccountTypeEnum; +import com.accompany.business.model.guildgame.GameUsdWithdrawAccount; +import com.accompany.business.model.guildgame.GameUsdWithdrawAccountConfig; +import com.accompany.business.mybatismapper.guildgame.GameUsdWithdrawAccountMapper; +import com.accompany.business.service.user.UsersService; +import com.accompany.business.vo.guildgame.GameUsdWithdrawAccountVo; +import com.accompany.business.vo.guildgame.GuildMemberGameUsdWithdrawAccountVo; +import com.accompany.common.status.BusiStatus; +import com.accompany.core.exception.ServiceException; +import com.accompany.core.model.Users; +import com.accompany.core.util.PartitionUtil; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.util.CollectionUtils; + +import java.util.*; +import java.util.stream.Collectors; + +/** + * 服务实现类 + * + * @author + * @since 2025-07-30 + */ +@Service +public class GameUsdWithdrawAccountService extends ServiceImpl { + + + @Autowired + private UsersService usersService; + @Autowired + private GameUsdWithdrawAccountConfigService configService; + + public List listUserAccountVo(Long uid) { + Users u = usersService.getNotNullUsersByUid(uid); + + List accountTypeList = Arrays.stream(GameWithdrawAccountTypeEnum.values()) + .filter(accountType-> PartitionUtil.inPartition(accountType.getPartitionFlag(), u.getPartitionId())) + .map(GameWithdrawAccountTypeEnum::name) + .collect(Collectors.toList()); + + List accountConfigList = configService.listAccountConfig(accountTypeList, u.getPartitionId()); + if (CollectionUtils.isEmpty(accountConfigList)){ + return Collections.emptyList(); + } + + Map> accountConfigMap = accountConfigList.stream() + .collect(Collectors.groupingBy(GameUsdWithdrawAccountConfig::getAccountType)); + + Map accountMap = lambdaQuery() + .eq(GameUsdWithdrawAccount::getUid, uid) + .in(GameUsdWithdrawAccount::getAccountType, accountTypeList) + .eq(GameUsdWithdrawAccount::getEnable, Boolean.TRUE) + .list().stream().collect(Collectors.toMap(GameUsdWithdrawAccount::getAccountType, a -> a)); + + return accountConfigMap.keySet().stream() + .map(accountType -> { + + GameWithdrawAccountTypeEnum typeEnum = GameWithdrawAccountTypeEnum.valueOf(accountType); + + GuildMemberGameUsdWithdrawAccountVo vo = new GuildMemberGameUsdWithdrawAccountVo(); + vo.setType(accountType); + vo.setName(typeEnum.getType()); + + boolean hasBound = accountMap.containsKey(accountType); + vo.setHasBound(hasBound); + if (!hasBound) { + return vo; + } + + GameUsdWithdrawAccount account = accountMap.get(accountType); + + Optional configOptional = accountConfigMap.get(accountType) + .stream().filter(v -> v.getCountry().equals(account.getAccountCountry())).findFirst(); + if (configOptional.isEmpty()) { + return vo; + } + + GameUsdWithdrawAccountConfig config = configOptional.get(); + vo.setCurrency(config.getCurrency()); + vo.setUsdRatio(config.getUsdRatio()); + vo.setWithdrawRate(config.getFeeRate()); + return vo; + }).toList(); + } + + public GameUsdWithdrawAccountVo getAccountByType(Long uid, String type) { + Users u = usersService.getNotNullUsersByUid(uid); + + GameWithdrawAccountTypeEnum typeEnum = GameWithdrawAccountTypeEnum.valueOf(type); + + JSONObject accountFields = new JSONObject(); + for (GameWithdrawAccountFieldEnum fieldEnum : typeEnum.getFieldList()) { + accountFields.put(fieldEnum.getFieldName(), ""); + } + + GameUsdWithdrawAccountVo accountVo = new GameUsdWithdrawAccountVo(); + accountVo.setUid(uid); + accountVo.setType(typeEnum.name()); + + GameUsdWithdrawAccount account = lambdaQuery().eq(GameUsdWithdrawAccount::getUid, uid) + .eq(GameUsdWithdrawAccount::getAccountType, typeEnum.name()) + .eq(GameUsdWithdrawAccount::getEnable, Boolean.TRUE) + .one(); + if (null != account){ + accountVo.setCountry(account.getAccountCountry()); + + JSONObject userFields = JSONObject.parseObject(account.getAccountFields()); + accountFields.putAll(userFields); + } + + List countryConfigList = configService.listAccountConfig(List.of(typeEnum.name()), u.getPartitionId()); + + if (null != accountVo.getCountry() && countryConfigList.stream() + .noneMatch(config -> config.getCountry().equals(accountVo.getCountry()))){ + throw new ServiceException(BusiStatus.GUILD_USD_WITHDRAW_ACCOUNT_TYPE_ERROR); + } + + accountVo.setCountryOptionalList(countryConfigList.stream().map(config -> { + GameUsdWithdrawAccountVo.Country country = new GameUsdWithdrawAccountVo.Country(); + country.setValue(config.getCountry()); + + CountryEnum countryEnum = CountryEnum.valueOf(config.getCountry()); + country.setName(countryEnum.getName()); + + country.setCurrency(config.getCurrency()); + country.setUsdRatio(config.getUsdRatio()); + country.setFeeRate(config.getFeeRate()); + country.setSeq(config.getSeq()); + return country; + }).sorted(Comparator.comparing(GameUsdWithdrawAccountVo.Country::getSeq)) + .toList()); + + accountVo.setFields(accountFields); + + return accountVo; + } + + public void bound(GameUsdWithdrawAccountVo account) { + GameWithdrawAccountTypeEnum typeEnum = GameWithdrawAccountTypeEnum.valueOf(account.getType()); + + GameUsdWithdrawAccount db = lambdaQuery().eq(GameUsdWithdrawAccount::getUid, account.getUid()) + .eq(GameUsdWithdrawAccount::getAccountType, typeEnum.name()) + .one(); + if (null != db && db.getEnable()){ + throw new ServiceException(BusiStatus.PARAMERROR); + } + + if (null == db){ + db = new GameUsdWithdrawAccount(); + db.setUid(account.getUid()); + db.setAccountType(typeEnum.name()); + db.setAccountCountry(account.getFields().getString("country")); + db.setEnable(Boolean.TRUE); + db.setAccountFields(account.getFields().toJSONString()); + db.setCreateTime(new Date()); + save(db); + return; + } + + lambdaUpdate().set(GameUsdWithdrawAccount::getEnable, Boolean.TRUE) + .set(GameUsdWithdrawAccount::getAccountCountry, account.getFields().getString("country")) + .set(GameUsdWithdrawAccount::getAccountFields, account.getFields().toJSONString()) + .set(GameUsdWithdrawAccount::getCreateTime, new Date()) + .eq(GameUsdWithdrawAccount::getUid, db.getUid()) + .eq(GameUsdWithdrawAccount::getAccountType, typeEnum.name()) + .update(); + + } + + public void unbound(GameUsdWithdrawAccountVo account) { + GameWithdrawAccountTypeEnum typeEnum = GameWithdrawAccountTypeEnum.valueOf(account.getType()); + + lambdaUpdate().set(GameUsdWithdrawAccount::getEnable, Boolean.FALSE) + .eq(GameUsdWithdrawAccount::getUid, account.getUid()) + .eq(GameUsdWithdrawAccount::getAccountType, typeEnum.name()) + .update(); + } +} diff --git a/accompany-business/accompany-business-service/src/main/java/com/accompany/business/service/guildgame/GameUsdWithdrawBizService.java b/accompany-business/accompany-business-service/src/main/java/com/accompany/business/service/guildgame/GameUsdWithdrawBizService.java new file mode 100644 index 000000000..f9daa5e0e --- /dev/null +++ b/accompany-business/accompany-business-service/src/main/java/com/accompany/business/service/guildgame/GameUsdWithdrawBizService.java @@ -0,0 +1,42 @@ +package com.accompany.business.service.guildgame; + +import com.accompany.business.model.guildgame.GameUsdWithdrawAccount; +import com.accompany.business.model.guildgame.GameUsdWithdrawAccountConfig; +import com.accompany.business.model.guildgame.GameUsdWithdrawRecord; +import com.accompany.business.mybatismapper.guildgame.GameUsdWithdrawRecordMapper; +import com.accompany.common.status.BusiStatus; +import com.accompany.core.exception.ServiceException; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.math.BigDecimal; + +@Service +public class GameUsdWithdrawBizService extends ServiceImpl { + + @Autowired + private GameUsdWithdrawRecordService recordService; + @Autowired + private GameUsdWithdrawAccountConfigService accountConfigService; + @Autowired + private GameUsdWithdrawAccountService accountService; + + public GameUsdWithdrawRecord insertRecord(Integer partitionId, Integer guildId, Long uid, BigDecimal guildUsdNum, String accountType) { + GameUsdWithdrawAccount account = accountService.lambdaQuery() + .eq(GameUsdWithdrawAccount::getUid, uid) + .eq(GameUsdWithdrawAccount::getAccountType, accountType) + .eq(GameUsdWithdrawAccount::getEnable, Boolean.TRUE) + .one(); + if (null == account){ + throw new ServiceException(BusiStatus.PARAMERROR); + } + + GameUsdWithdrawAccountConfig config = accountConfigService.getAccountConfig(accountType, partitionId, account.getAccountCountry()); + if (null == config || !Boolean.TRUE.equals(config.getEnable())){ + throw new ServiceException(BusiStatus.GUILD_USD_WITHDRAW_ACCOUNT_TYPE_ERROR); + } + + return recordService.insertRecord(partitionId, guildId, uid, guildUsdNum, account); + } +} diff --git a/accompany-business/accompany-business-service/src/main/java/com/accompany/business/service/guildgame/GameUsdWithdrawRecordService.java b/accompany-business/accompany-business-service/src/main/java/com/accompany/business/service/guildgame/GameUsdWithdrawRecordService.java new file mode 100644 index 000000000..ad5687cef --- /dev/null +++ b/accompany-business/accompany-business-service/src/main/java/com/accompany/business/service/guildgame/GameUsdWithdrawRecordService.java @@ -0,0 +1,68 @@ +package com.accompany.business.service.guildgame; + +import com.accompany.business.model.guildgame.GameUsdWithdrawAccount; +import com.accompany.business.model.guildgame.GameUsdWithdrawAccountConfig; +import com.accompany.business.model.guildgame.GameUsdWithdrawRecord; +import com.accompany.business.mybatismapper.guildgame.GameUsdWithdrawRecordMapper; +import com.accompany.common.constant.Constant; +import com.accompany.common.status.BusiStatus; +import com.accompany.core.exception.ServiceException; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.math.BigDecimal; +import java.math.RoundingMode; +import java.util.Date; + +/** + * 服务实现类 + * + * @author + * @since 2025-07-30 + */ +@Service +public class GameUsdWithdrawRecordService extends ServiceImpl { + + + @Autowired + private GameUsdWithdrawAccountConfigService guildUsdWithdrawAccountConfigService; + + public GameUsdWithdrawRecord insertRecord(Integer partitionId, Integer guildId, Long uid, BigDecimal guildUsdNum, + GameUsdWithdrawAccount account) { + Date now = new Date(); + + GameUsdWithdrawAccountConfig fee = guildUsdWithdrawAccountConfigService.getAccountConfig(account.getAccountType(), partitionId, account.getAccountCountry()); + if (null == fee){ + throw new ServiceException(BusiStatus.SERVERBUSY); + } + + BigDecimal rate = BigDecimal.ONE.subtract(fee.getFeeRate()); + BigDecimal usdRate = fee.getUsdRatio(); + BigDecimal currencyNum = guildUsdNum.multiply(usdRate).setScale(2, RoundingMode.DOWN); + BigDecimal withdrawNum = guildUsdNum.multiply(rate).multiply(usdRate).setScale(2, RoundingMode.DOWN); + + GameUsdWithdrawRecord record = new GameUsdWithdrawRecord(); + record.setPartitionId(partitionId); + record.setGuildId(guildId); + record.setUid(uid); + record.setGameUsdNum(guildUsdNum); + record.setStatus(Constant.status.delete); + record.setCreateTime(now); + record.setUpdateTime(now); + record.setRemark(null); + record.setOperator(null); + + record.setAccountType(account.getAccountType()); + record.setAccountCountry(account.getAccountCountry()); + record.setAccountInfos(account.getAccountFields()); + record.setCurrency(fee.getCurrency()); + record.setCurrencyNum(currencyNum); + record.setWithdrawRate(fee.getFeeRate()); + record.setWithdrawNum(withdrawNum); + + save(record); + + return record; + } +} diff --git a/accompany-business/accompany-business-service/src/main/java/com/accompany/business/service/guildgame/impl/GameDiamondStatDayServiceImpl.java b/accompany-business/accompany-business-service/src/main/java/com/accompany/business/service/guildgame/impl/GameDiamondStatDayServiceImpl.java new file mode 100644 index 000000000..946eae189 --- /dev/null +++ b/accompany-business/accompany-business-service/src/main/java/com/accompany/business/service/guildgame/impl/GameDiamondStatDayServiceImpl.java @@ -0,0 +1,62 @@ +package com.accompany.business.service.guildgame.impl; + +import com.accompany.business.constant.guildgame.GameTimeUtil; +import com.accompany.business.model.guildgame.GameDiamondStatDay; +import com.accompany.business.mybatismapper.guildgame.GameDiamondStatDayMapper; +import com.accompany.business.service.guildgame.GameDiamondStatDayService; +import com.accompany.common.utils.DateTimeUtil; +import com.accompany.core.enumeration.PartitionEnum; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.stereotype.Service; + +import java.math.BigDecimal; +import java.time.ZonedDateTime; +import java.util.Date; +import java.util.List; + +/** + * 公会钻石流水统计按天 服务实现类 + * + * @author + * @since 2025-07-30 + */ +@Service +public class GameDiamondStatDayServiceImpl extends ServiceImpl implements GameDiamondStatDayService { + + + @Override + public Integer addGameDiamondStatDay(Long uid, Long guildMemberId, Date dataDate, Integer partitionId, + Integer guildId, Integer playGameNum, BigDecimal diamondNum) { + ZonedDateTime zonedDateTime = DateTimeUtil.convertWithZoneId(dataDate, PartitionEnum.getByPartitionId(partitionId).getZoneId()); + String statDate = GameTimeUtil.getStatDate(zonedDateTime); + String cycleDate = GameTimeUtil.getCycleDate(zonedDateTime);; + return baseMapper.addGameDiamondStatDay(uid, guildMemberId, cycleDate, statDate, partitionId, guildId, playGameNum, diamondNum, dataDate); + } + + @Override + public List getGuildGameMonthList(Long guildMemberId, String cycleDate) { + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(GameDiamondStatDay::getGuildMemberId, guildMemberId); + queryWrapper.eq(GameDiamondStatDay::getCycleDate, cycleDate); + return baseMapper.selectList(queryWrapper); + } + + @Override + public List queryByGuildMemberIdAndCycleDate(Long guildMemberId, String cycleDate) { + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(GameDiamondStatDay::getGuildMemberId, guildMemberId); + queryWrapper.eq(GameDiamondStatDay::getCycleDate, cycleDate); + queryWrapper.orderByDesc(GameDiamondStatDay::getStatDate); + return baseMapper.selectList(queryWrapper); + } + + @Override + public GameDiamondStatDay queryByGuildMemberIdAndStatDate(Long guildMemberId, String cycleDate, String statDate) { + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(GameDiamondStatDay::getGuildMemberId, guildMemberId); + queryWrapper.eq(GameDiamondStatDay::getCycleDate, cycleDate); + queryWrapper.eq(GameDiamondStatDay::getStatDate, statDate); + return baseMapper.selectOne(queryWrapper, false); + } +} diff --git a/accompany-business/accompany-business-service/src/main/java/com/accompany/business/service/purse/UserPurseService.java b/accompany-business/accompany-business-service/src/main/java/com/accompany/business/service/purse/UserPurseService.java index 5f812a189..b2bb1d937 100644 --- a/accompany-business/accompany-business-service/src/main/java/com/accompany/business/service/purse/UserPurseService.java +++ b/accompany-business/accompany-business-service/src/main/java/com/accompany/business/service/purse/UserPurseService.java @@ -100,6 +100,7 @@ public class UserPurseService extends ServiceImpl { userPurse.setCrystals(0D); userPurse.setGolds(0D); userPurse.setGuildUsd(0D); + userPurse.setGameUsd(0D); userPurse.setFirstCharge(true); userPurse.setUpdateTime(new Date()); save(userPurse); @@ -373,6 +374,74 @@ public class UserPurseService extends ServiceImpl { return after; } + + public UserPurse addGameUsd(Long uid, BigDecimal guildUsdNum, BillObjTypeEnum objTypeEnum) { + return SpringContextHolder.getBean(UserPurseService.class).addGameUsd(uid, guildUsdNum.doubleValue(), objTypeEnum, null); + } + + @Frozen + @Transactional(rollbackFor = Exception.class, transactionManager = "mybatisplusTransactionManager") + public UserPurse subGameUsd(Long uid, BigDecimal gameUsdNum, BillObjTypeEnum objTypeEnum, + BusiStatus busiStatus, Consumer billConsumer) { + if (BigDecimal.ZERO.compareTo(gameUsdNum) > 0) { + throw new ServiceException(BusiStatus.AMOUNT_PARAM_ERROR); + } + + String desc = objTypeEnum.getDesc(); + UserPurse after = withLock(uid, RedisKey.lock_user_game_usd, userPurse -> { + BigDecimal purseGameUsd = BigDecimal.valueOf(userPurse.getGameUsd()); + if (purseGameUsd.compareTo(gameUsdNum) < 0){ + throw new ServiceException(busiStatus); + } + log.info("subGameUsd 操作前,buss:{},userPurse:{}", desc, gson.toJson(userPurse)); + int ret = baseMapper.minusGameUsd(uid, gameUsdNum.doubleValue()); + boolean result = SqlHelper.retBool(ret); + if (!result){ + throw new ServiceException(BusiStatus.SERVERBUSY); + } + BigDecimal afterGameUsd = purseGameUsd.subtract(gameUsdNum); + userPurse.setGameUsd(afterGameUsd.doubleValue()); + userPurse.setUpdateTime(new Date()); + log.info("subGold 操作后,buss:{},userPurse:{}", desc, gson.toJson(userPurse)); + return userPurse; + }); + + if (null != billConsumer) { + billConsumer.accept(after); + } else { + billRecordService.insertGeneralBillRecord(uid, objTypeEnum, gameUsdNum.doubleValue(), after); + } + + return after; + } + + @Transactional(rollbackFor = Exception.class, transactionManager = "mybatisplusTransactionManager") + public UserPurse addGameUsd(Long uid, double gameUsdNum, BillObjTypeEnum billObjTypeEnum, Consumer billConsume) { + if (gameUsdNum < 0D) { + throw new ServiceException(BusiStatus.AMOUNT_PARAM_ERROR); + } + UserPurse after = withLock(uid, RedisKey.lock_user_game_usd, userPurse -> { + log.info("addGameUsd 操作前,buss:{},userPurse:{}", billObjTypeEnum.getDesc(), gson.toJson(userPurse)); + int ret = baseMapper.addGameUsd(uid, gameUsdNum); + boolean result = SqlHelper.retBool(ret); + if (!result){ + throw new ServiceException(BusiStatus.SERVERBUSY); + } + log.info("addGame 操作后,buss:{},userPurse:{}", billObjTypeEnum.getDesc(), gson.toJson(userPurse)); + userPurse.setGameUsd(DoubleUtil.add(userPurse.getGameUsd(), gameUsdNum)); + userPurse.setUpdateTime(new Date()); + return userPurse; + }); + + if (null != billConsume) { + billConsume.accept(after); + } else { + billRecordService.insertGeneralBillRecord(uid, billObjTypeEnum, gameUsdNum, after); + } + + return after; + } + @Frozen @Transactional(rollbackFor = Exception.class, transactionManager = "mybatisplusTransactionManager") public UserPurse excGoldToDiamond(Long uid, Double exchangeNum, Double convertNum, BusiStatus busiStatus) { diff --git a/accompany-business/accompany-business-service/src/main/resources/accompany/sqlmappers/GameDiamondSalaryMapper.xml b/accompany-business/accompany-business-service/src/main/resources/accompany/sqlmappers/GameDiamondSalaryMapper.xml new file mode 100644 index 000000000..d37c22136 --- /dev/null +++ b/accompany-business/accompany-business-service/src/main/resources/accompany/sqlmappers/GameDiamondSalaryMapper.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/accompany-business/accompany-business-service/src/main/resources/accompany/sqlmappers/GameDiamondStatDayMapper.xml b/accompany-business/accompany-business-service/src/main/resources/accompany/sqlmappers/GameDiamondStatDayMapper.xml new file mode 100644 index 000000000..7273d631e --- /dev/null +++ b/accompany-business/accompany-business-service/src/main/resources/accompany/sqlmappers/GameDiamondStatDayMapper.xml @@ -0,0 +1,14 @@ + + + + + INSERT INTO `game_diamond_stat_day` (`cycle_date`, `stat_date`, `guild_member_id`, `partition_id`, `uid`, + `guild_id`, `play_game_num`,`diamond_num`, `create_time`, `update_time`) + VALUES (#{cycleDate}, #{statDate}, #{guildMemberId}, #{partitionId}, #{uid}, #{guildId}, #{playGameNum}, #{diamondNum}, #{time}, + #{time}) ON DUPLICATE KEY + UPDATE + play_game_num = play_game_num + values (play_game_num), + diamond_num = diamond_num + values (diamond_num), + update_time = values (update_time) + + diff --git a/accompany-business/accompany-business-service/src/main/resources/accompany/sqlmappers/GameUsdBillRecordMapper.xml b/accompany-business/accompany-business-service/src/main/resources/accompany/sqlmappers/GameUsdBillRecordMapper.xml new file mode 100644 index 000000000..16e19ebc3 --- /dev/null +++ b/accompany-business/accompany-business-service/src/main/resources/accompany/sqlmappers/GameUsdBillRecordMapper.xml @@ -0,0 +1,146 @@ + + + + + + + + + + + + + + + + + + diff --git a/accompany-business/accompany-business-service/src/main/resources/accompany/sqlmappers/GameUsdProdMapper.xml b/accompany-business/accompany-business-service/src/main/resources/accompany/sqlmappers/GameUsdProdMapper.xml new file mode 100644 index 000000000..722fd7579 --- /dev/null +++ b/accompany-business/accompany-business-service/src/main/resources/accompany/sqlmappers/GameUsdProdMapper.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/accompany-business/accompany-business-service/src/main/resources/accompany/sqlmappers/GameUsdWithdrawAccountConfigMapper.xml b/accompany-business/accompany-business-service/src/main/resources/accompany/sqlmappers/GameUsdWithdrawAccountConfigMapper.xml new file mode 100644 index 000000000..d1b1e1167 --- /dev/null +++ b/accompany-business/accompany-business-service/src/main/resources/accompany/sqlmappers/GameUsdWithdrawAccountConfigMapper.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/accompany-business/accompany-business-service/src/main/resources/accompany/sqlmappers/GameUsdWithdrawAccountMapper.xml b/accompany-business/accompany-business-service/src/main/resources/accompany/sqlmappers/GameUsdWithdrawAccountMapper.xml new file mode 100644 index 000000000..af8c14ab8 --- /dev/null +++ b/accompany-business/accompany-business-service/src/main/resources/accompany/sqlmappers/GameUsdWithdrawAccountMapper.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/accompany-business/accompany-business-service/src/main/resources/accompany/sqlmappers/GameUsdWithdrawRecordMapper.xml b/accompany-business/accompany-business-service/src/main/resources/accompany/sqlmappers/GameUsdWithdrawRecordMapper.xml new file mode 100644 index 000000000..782206cce --- /dev/null +++ b/accompany-business/accompany-business-service/src/main/resources/accompany/sqlmappers/GameUsdWithdrawRecordMapper.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/accompany-business/accompany-business-service/src/main/resources/accompany/sqlmappers/UserPurseMapper.xml b/accompany-business/accompany-business-service/src/main/resources/accompany/sqlmappers/UserPurseMapper.xml index 90e071b5f..70442c2c6 100644 --- a/accompany-business/accompany-business-service/src/main/resources/accompany/sqlmappers/UserPurseMapper.xml +++ b/accompany-business/accompany-business-service/src/main/resources/accompany/sqlmappers/UserPurseMapper.xml @@ -83,4 +83,12 @@ group by u.partition_id + + update user_purse set game_usd = game_usd + #{gameUsd},update_time=now() where uid=#{uid} + + + + update user_purse set game_usd = game_usd - #{gameUsd},update_time=now() + where uid=#{uid} and game_usd >= #{gameUsd} + \ No newline at end of file diff --git a/accompany-business/accompany-business-web/src/main/java/com/accompany/business/controller/guild/GameUsdController.java b/accompany-business/accompany-business-web/src/main/java/com/accompany/business/controller/guild/GameUsdController.java new file mode 100644 index 000000000..bfe102149 --- /dev/null +++ b/accompany-business/accompany-business-web/src/main/java/com/accompany/business/controller/guild/GameUsdController.java @@ -0,0 +1,80 @@ +package com.accompany.business.controller.guild; + +import com.accompany.business.service.guildgame.GameUsdOperateService; +import com.accompany.business.service.guildgame.GameUsdService; +import com.accompany.business.vo.guildgame.GameUsdOperateBillRecordVo; +import com.accompany.business.vo.guildgame.GameUsdOperateTabVo; +import com.accompany.business.vo.guildgame.GuildGameSalaryVo; +import com.accompany.common.annotation.Authorization; +import com.accompany.common.result.BusiResult; +import com.accompany.common.status.BusiStatus; +import com.accompany.core.exception.ServiceException; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiImplicitParam; +import io.swagger.annotations.ApiImplicitParams; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.math.BigDecimal; + +import static com.accompany.common.constant.ApplicationConstant.PublicParameters.PUB_UID; + +@Api(tags = "游戏薪资", value = "游戏薪资") +@RequestMapping("/guildGameUsd") +@RestController +public class GameUsdController { + + @Autowired + private GameUsdService gameUsdService; + @Autowired + private GameUsdOperateService gameUsdOperateService; + @ApiImplicitParams({ + @ApiImplicitParam(name = "monthDate", value = "月份yyyy-MM", required = true, dataType = "String") + }) + @ApiOperation(value = "游戏薪资信息", httpMethod = "GET") + @GetMapping("/info") + public GuildGameSalaryVo getGameUsdInfo(@RequestHeader(PUB_UID) Long uid, String monthDate) { + + return gameUsdService.getGameUsdInfo(uid, monthDate); + } + + @Authorization() + @ApiOperation(value = "领取游戏薪资", httpMethod = "POST") + @ApiImplicitParams({ + @ApiImplicitParam(name = "statDate", value = "领取日期yyyy-MM-dd", required = true, dataType = "String"), + @ApiImplicitParam(name = "guildMemberId", value = "公会成员编号", required = true, dataType = "Long"), + @ApiImplicitParam(name = "usd", value = "领取薪资", required = true, dataType = "Double") + + }) + @PostMapping("/receive") + public BusiResult receiveGameUsd(@RequestHeader(PUB_UID) Long uid, Long guildMemberId, String statDate, Double usd) throws InterruptedException { + return gameUsdOperateService.receiveGameUsd(uid, guildMemberId, statDate, usd); + } + + + @ApiOperation("获取usd操作的功能标签tab") + @Authorization + @GetMapping("/getTab") + public BusiResult getUsdTab(@RequestHeader(PUB_UID) Long uid){ + GameUsdOperateTabVo vo = gameUsdService.getUsdOperateTabVo(uid); + return BusiResult.success(vo); + } + + @ApiOperation("usd操作") + @ApiImplicitParams({ + @ApiImplicitParam(name = "type", value = "操作类型", required = true), + @ApiImplicitParam(name = "targetUid", value = "对象uid"), + @ApiImplicitParam(name = "gameUsdNum", value = "公会usd数目", required = true), + }) + @Authorization + @PostMapping("/operate") + public BusiResult operateUsd(@RequestHeader(PUB_UID) Long uid, Integer type, Long targetUid, BigDecimal gameUsdNum, + String accountType) { + if (null == type || null == gameUsdNum || BigDecimal.ZERO.compareTo(gameUsdNum) >= 0){ + throw new ServiceException(BusiStatus.PARAMETERILLEGAL); + } + GameUsdOperateBillRecordVo billRecordVo = gameUsdOperateService.operateUsd(uid, targetUid, type, gameUsdNum.setScale(2), accountType); + return BusiResult.success(billRecordVo); + } +} diff --git a/accompany-business/accompany-business-web/src/main/java/com/accompany/business/controller/guild/GameUsdRecordController.java b/accompany-business/accompany-business-web/src/main/java/com/accompany/business/controller/guild/GameUsdRecordController.java new file mode 100644 index 000000000..ace80ec6e --- /dev/null +++ b/accompany-business/accompany-business-web/src/main/java/com/accompany/business/controller/guild/GameUsdRecordController.java @@ -0,0 +1,51 @@ +package com.accompany.business.controller.guild; + +import com.accompany.business.service.guildgame.GameUsdBillRecordService; +import com.accompany.business.vo.guildgame.GameUsdBillRecordVo; +import com.accompany.common.annotation.Authorization; +import com.accompany.common.constant.Constant; +import com.accompany.common.result.BusiResult; +import com.accompany.common.status.BusiStatus; +import com.accompany.core.base.UidContextHolder; +import com.accompany.core.exception.ServiceException; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiImplicitParam; +import io.swagger.annotations.ApiImplicitParams; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import java.util.List; + +@Api(tags = "游戏薪资-usd账单", value = "游戏薪资-usd账单") +@RequestMapping("/game/usd/bill") +@RestController +public class GameUsdRecordController { + + @Autowired + private GameUsdBillRecordService service; + + @ApiOperation("获取账单") + @ApiImplicitParams({ + @ApiImplicitParam(name = "type", value = "收入 1 or 支出 2", required = true), + @ApiImplicitParam(name = "page", value = "页码"), + @ApiImplicitParam(name = "pageSize", value = "页长"), + }) + @Authorization + @GetMapping("/page") + public BusiResult> page(Byte type, + @RequestParam(defaultValue = "1") Integer page, + @RequestParam(defaultValue = "10") Integer pageSize) { + if (null == type || (!Constant.status.valid.equals(type) && !Constant.status.invalid.equals(type))) { + throw new ServiceException(BusiStatus.PARAMERROR); + } + Long uid = UidContextHolder.get(); + Page pageInfo = service.pageBillRecordByType(uid, type, page, pageSize); + return BusiResult.success(pageInfo.getRecords()); + } + +} diff --git a/accompany-business/accompany-business-web/src/main/java/com/accompany/business/controller/guild/GameUsdWithdrawAccountController.java b/accompany-business/accompany-business-web/src/main/java/com/accompany/business/controller/guild/GameUsdWithdrawAccountController.java new file mode 100644 index 000000000..671391091 --- /dev/null +++ b/accompany-business/accompany-business-web/src/main/java/com/accompany/business/controller/guild/GameUsdWithdrawAccountController.java @@ -0,0 +1,68 @@ +package com.accompany.business.controller.guild; + +import com.accompany.business.service.guildgame.GameUsdWithdrawAccountService; +import com.accompany.business.vo.guildgame.GameUsdWithdrawAccountVo; +import com.accompany.common.annotation.Authorization; +import com.accompany.common.result.BusiResult; +import com.accompany.common.status.BusiStatus; +import com.accompany.core.base.UidContextHolder; +import com.accompany.core.exception.ServiceException; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.util.CollectionUtils; +import org.springframework.util.StringUtils; +import org.springframework.web.bind.annotation.*; + +@Api(tags = "游戏薪资-提现", value = "游戏薪资-提现") +@RequestMapping("/game/usd/withdrawAccount") +@RestController +public class GameUsdWithdrawAccountController { + + @Autowired + private GameUsdWithdrawAccountService accountService; + + @ApiOperation("根据类型获取") + @Authorization + @GetMapping("/get") + public BusiResult getAccount(String type){ + if (!StringUtils.hasText(type)){ + throw new ServiceException(BusiStatus.PARAMETERILLEGAL); + } + Long uid = UidContextHolder.get(); + GameUsdWithdrawAccountVo vo = accountService.getAccountByType(uid, type); + return BusiResult.success(vo); + } + + @ApiOperation("绑定") + @Authorization + @PostMapping("/bound") + public BusiResult bound(@RequestBody GameUsdWithdrawAccountVo account){ + if (null == account.getUid() || !StringUtils.hasText(account.getType()) + || CollectionUtils.isEmpty(account.getFields())){ + throw new ServiceException(BusiStatus.PARAMETERILLEGAL); + } + Long uid = UidContextHolder.get(); + if (!uid.equals(account.getUid())){ + throw new ServiceException(BusiStatus.PARAMETERILLEGAL); + } + accountService.bound(account); + return BusiResult.success(); + } + + @ApiOperation("解绑") + @Authorization + @PostMapping("/unbound") + public BusiResult unbound(@RequestBody GameUsdWithdrawAccountVo account){ + if (null == account.getUid() || !StringUtils.hasText(account.getType())){ + throw new ServiceException(BusiStatus.PARAMETERILLEGAL); + } + Long uid = UidContextHolder.get(); + if (!uid.equals(account.getUid())){ + throw new ServiceException(BusiStatus.PARAMETERILLEGAL); + } + accountService.unbound(account); + return BusiResult.success(); + } + +}