diff --git a/ff-base/src/main/java/com/ff/base/utils/RandomGeneratorUtils.java b/ff-base/src/main/java/com/ff/base/utils/RandomGeneratorUtils.java index 4e4d32c..27cb271 100644 --- a/ff-base/src/main/java/com/ff/base/utils/RandomGeneratorUtils.java +++ b/ff-base/src/main/java/com/ff/base/utils/RandomGeneratorUtils.java @@ -29,4 +29,23 @@ public class RandomGeneratorUtils { return sb.toString(); } + /** + * 生成 5-8 之间的随机长度,只包含大写字母和数字 + * + * @return {@link String } + */ + public static String generateRandomAccountUpper() { + int length = 5 + RANDOM.nextInt(4); + StringBuilder sb = new StringBuilder(length); + for (int i = 0; i < length; i++) { + char randomChar = CHARACTERS.charAt(RANDOM.nextInt(CHARACTERS.length())); + // 转换为大写字母或保持数字 + if (Character.isLetter(randomChar)) { + sb.append(Character.toUpperCase(randomChar)); + } else { + sb.append(randomChar); // 保持数字 + } + } + return sb.toString(); + } } \ No newline at end of file diff --git a/ff-game/src/main/java/com/ff/api/controller/ApiMemberController.java b/ff-game/src/main/java/com/ff/api/controller/ApiMemberController.java index 2d42f5e..e82fc57 100644 --- a/ff-game/src/main/java/com/ff/api/controller/ApiMemberController.java +++ b/ff-game/src/main/java/com/ff/api/controller/ApiMemberController.java @@ -104,7 +104,7 @@ public class ApiMemberController extends BaseController { ApiException.notNull(gameSecretKey, ErrorCode.CURRENCY_NOT_EXIST.getCode()); - String gameAccount = StringUtils.addSuffix(memberService.getMemberGameAccount(), tenantSecretKey.getTenantSn()); + String gameAccount = StringUtils.addSuffix(memberService.getMemberGameAccount(memberCreateApiRequest.getPlatformCode()), tenantSecretKey.getTenantSn()); // 获取用户信息 diff --git a/ff-game/src/main/java/com/ff/api/request/MemberCreateApiRequest.java b/ff-game/src/main/java/com/ff/api/request/MemberCreateApiRequest.java index 6d2e461..249d3f7 100644 --- a/ff-game/src/main/java/com/ff/api/request/MemberCreateApiRequest.java +++ b/ff-game/src/main/java/com/ff/api/request/MemberCreateApiRequest.java @@ -22,7 +22,6 @@ public class MemberCreateApiRequest implements Serializable{ @NotBlank(message = "account不能为空") @Length(max = 64, message = "account长度不能超过64个字符") - @Pattern(regexp = "^[a-z0-9]+$", message = "account只能包含小写字母和数字") private String account; /** 平台编码 */ diff --git a/ff-game/src/main/java/com/ff/game/api/dg/client/DGClient.java b/ff-game/src/main/java/com/ff/game/api/dg/client/DGClient.java index c1e84b2..bc58304 100644 --- a/ff-game/src/main/java/com/ff/game/api/dg/client/DGClient.java +++ b/ff-game/src/main/java/com/ff/game/api/dg/client/DGClient.java @@ -45,14 +45,6 @@ public interface DGClient { @Post("/v2/api/login") DGLoginWithoutRedirectResponse loginWithoutRedirect(@JSONBody Map params, @Header Map header); - /** - * 获取游戏列表 - * - * @param params 参数 - * @return {@link JILIGamesDTO } - */ - @Post("/getGameList") - XKGamesDTO getGameList(@JSONBody Map params); /** * 按代理id进行交换转账 @@ -87,19 +79,28 @@ public interface DGClient { * 踢出队员 * * @param params 参数 - * @return {@link JILIKickMemberDTO } + * @return {@link DGResponse } */ - @Post("/kickMember") - XKKickMemberDTO kickMember(@JSONBody Map params); + @Post("/v2/api/offline") + DGResponse kickMember(@JSONBody Map params, @Header Map header); + + + @Post("/v2/api/offlineAll") + DGResponse kickMemberAll(@JSONBody Map params, @Header Map header); /** - * 踢出所有队员 + * 会员在线 * * @param params 参数 - * @return {@link JILIKickMemberAllDTO } + * @return {@link DGUserListResponseDTO } */ - @Get("/kickMemberAll") - XKKickMemberAllDTO kickMemberAll(@JSONBody Map params); + @Post(url ="/v2/api/online", + headers = { + "Content-type: application/x-www-form-urlencoded" + }) + DGUserListResponseDTO memberOnlines(@Header Map params); + + } diff --git a/ff-game/src/main/java/com/ff/game/api/dg/dto/DGBetRecordResponseDTO.java b/ff-game/src/main/java/com/ff/game/api/dg/dto/DGBetRecordResponseDTO.java index 4b7e534..b6d06fc 100644 --- a/ff-game/src/main/java/com/ff/game/api/dg/dto/DGBetRecordResponseDTO.java +++ b/ff-game/src/main/java/com/ff/game/api/dg/dto/DGBetRecordResponseDTO.java @@ -25,8 +25,8 @@ public class DGBetRecordResponseDTO { private String msg; /** 注单报告 */ - @JsonProperty("report") - private List report; + @JsonProperty("list") + private List list; /** * 注单报告类 diff --git a/ff-game/src/main/java/com/ff/game/api/dg/dto/DGUserListResponseDTO.java b/ff-game/src/main/java/com/ff/game/api/dg/dto/DGUserListResponseDTO.java new file mode 100644 index 0000000..fc5fcd0 --- /dev/null +++ b/ff-game/src/main/java/com/ff/game/api/dg/dto/DGUserListResponseDTO.java @@ -0,0 +1,70 @@ +package com.ff.game.api.dg.dto; + +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.Data; + +import java.util.List; + +/** + * 用户列表响应类 + * + * @author shi + * @date 2025/03/27 + */ +@Data +public class DGUserListResponseDTO { + + /** + * 响应的代码ID。 + */ + @JsonProperty("codeId") + private int codeId; + + /** + * 响应的消息。 + */ + @JsonProperty("msg") + private String msg; + /** 用户列表 */ + @JsonProperty("list") + private List list; + + /** + * 用户信息类 + */ + @Data + public static class UserDTO { + + /** 用户名 */ + @JsonProperty("username") + private String username; + + /** 昵称 */ + @JsonProperty("nickname") + private String nickname; + + /** 币种名称 */ + @JsonProperty("currencyName") + private String currencyName; + + /** 用户IP */ + @JsonProperty("ip") + private String ip; + + /** 用户设备 */ + @JsonProperty("device") + private String device; + + /** 登录时间 */ + @JsonProperty("login") + private String login; + + /** 会员ID */ + @JsonProperty("memberId") + private Long memberId; + + /** 用户余额 */ + @JsonProperty("balance") + private Double balance; + } +} \ No newline at end of file diff --git a/ff-game/src/main/java/com/ff/game/api/dg/service/impl/GamesDGServiceImpl.java b/ff-game/src/main/java/com/ff/game/api/dg/service/impl/GamesDGServiceImpl.java index 890a633..5d67e2d 100644 --- a/ff-game/src/main/java/com/ff/game/api/dg/service/impl/GamesDGServiceImpl.java +++ b/ff-game/src/main/java/com/ff/game/api/dg/service/impl/GamesDGServiceImpl.java @@ -280,7 +280,7 @@ public class GamesDGServiceImpl implements IGamesService { .build()); Member member = memberService.selectMemberByGameAccount(exchangeTransferMoneyRequestDTO.getAccount()); - String transactionId = GamePlatforms.DG.getCode() + IdUtils.simpleUUID(); + String transactionId = GamePlatforms.DG.getInfo() + IdUtils.simpleUUID(); List gameExchangeMonies = gameExchangeMoneyService.selectGameExchangeMoneyList( GameExchangeMoney.builder() .tenantKey(exchangeTransferMoneyRequestDTO.getTenantKey()) @@ -300,7 +300,7 @@ public class GamesDGServiceImpl implements IGamesService { .currencyCode(currencyDTO.getSystemCurrency()) .memberId(member.getId()) .transactionId(transactionId) - .platformCode(GamePlatforms.DG.getCode()) + .platformCode(GamePlatforms.DG.getInfo()) .build(); exchangeMoney.setCreateBy(Constants.SYSTEM); @@ -369,7 +369,6 @@ public class GamesDGServiceImpl implements IGamesService { Map key = this.getKey(betRecordByTimeDTO); DGBetRecordResponseDTO betRecordByTime = DGClient.getBetRecordByTime(key); - //判断是否获取成功 if (this.getIsSuccess(betRecordByTime.getCodeId())) { this.batchInsert(betRecordByTime,betRecordByTimeDTO); @@ -424,7 +423,35 @@ public class GamesDGServiceImpl implements IGamesService { */ @Override public Boolean kickMember(KickMemberRequestDTO kickMemberRequestDTO) { - return null; + log.info("GamesDGServiceImpl [kickMember] 请求参数 {}", kickMemberRequestDTO); + Map key = this.getKey(kickMemberRequestDTO); + DGUserListResponseDTO userListResponseDTO = DGClient.memberOnlines(key); + if (!this.getIsSuccess(userListResponseDTO.getCodeId())) { + throw new ApiException(ErrorCode.KICK_OUT_AILED.getCode()); + } + if (CollectionUtils.isEmpty(userListResponseDTO.getList())){ + return Boolean.TRUE; + } + DGUserListResponseDTO.UserDTO userDTO = userListResponseDTO.getList().stream() + .filter(user -> user.getUsername().equals(kickMemberRequestDTO.getAccount())) + .findFirst() + .orElse(null); + if (Objects.isNull(userDTO)){ + return Boolean.TRUE; + } + + + List memberIds = new ArrayList<>(); + memberIds.add(userDTO.getMemberId()); + Map params = new LinkedHashMap<>(); + params.put("list",memberIds); + DGResponse dgResponse = DGClient.kickMember(params, key); + //判断是否获取成功 + if (this.getIsSuccess(dgResponse.getCodeId())) { + return Boolean.TRUE; + } else { + throw new BaseException(dgResponse.getMsg()); + } } /** @@ -435,7 +462,29 @@ public class GamesDGServiceImpl implements IGamesService { */ @Override public Boolean kickMemberAll(KickMemberAllDTO kickMemberAllDTO) { - throw new ApiException(ErrorCode.PLATFORM_NOT_METHODS.getCode()); + log.info("GamesDGServiceImpl [kickMemberAll] 请求参数 {}", kickMemberAllDTO); + Map key = this.getKey(kickMemberAllDTO); + DGUserListResponseDTO userListResponseDTO = DGClient.memberOnlines(key); + if (!this.getIsSuccess(userListResponseDTO.getCodeId())) { + throw new ApiException(ErrorCode.KICK_OUT_AILED.getCode()); + } + + if (CollectionUtils.isEmpty(userListResponseDTO.getList())){ + return Boolean.TRUE; + } + + List memberIds = userListResponseDTO.getList().stream().map(DGUserListResponseDTO.UserDTO::getMemberId).collect(Collectors.toList()); + + + Map params = new LinkedHashMap<>(); + params.put("list",memberIds); + DGResponse dgResponse = DGClient.kickMember(params, key); + //判断是否获取成功 + if (this.getIsSuccess(dgResponse.getCodeId())) { + return Boolean.TRUE; + } else { + throw new BaseException(dgResponse.getMsg()); + } } /** @@ -470,7 +519,7 @@ public class GamesDGServiceImpl implements IGamesService { List gameBettingDetails = new ArrayList<>(); List wagersIds = new ArrayList<>(); //数据组装 - List report = dgBetRecordResponseDTO.getReport(); + List report = dgBetRecordResponseDTO.getList(); //数据转化 for (DGBetRecordResponseDTO.ReportDTO bean : report) { GameBettingDetails bettingDetails = this.dataBuild(GamesDataBuildDTO.builder().data(bean).build()); @@ -536,6 +585,7 @@ public class GamesDGServiceImpl implements IGamesService { payoffAmount = NumberUtil.sub(resultBean.getWinOrLoss(), resultBean.getBetPoints()).negate(); gameStatus = GameStatus.FAIL.getCode(); } + Game game = gameService.selectGameById(GAME_ID); //数据构造 @@ -546,9 +596,9 @@ public class GamesDGServiceImpl implements IGamesService { .memberId(member.getId()) .gameCode(String.valueOf(resultBean.getGameId())) .gameType(PlatformType.CARD_GAME.getCode()) - .platformCode(GamePlatforms.SA.getCode()) + .platformCode(GamePlatforms.DG.getInfo()) .gameId(GAME_ID) - .gameName(String.valueOf(resultBean.getGameId())) + .gameName(game.getGameName()) .gameStatus(gameStatus) .gameStatusType(resultBean.getGameType()) .gameCurrencyCode(currencyDTO.getCurrency()) @@ -556,6 +606,7 @@ public class GamesDGServiceImpl implements IGamesService { .wagersId(String.valueOf(resultBean.getId())) .wagersTime(resultBean.getBetTime().getTime()) .betAmount(resultBean.getBetPoints()) + .betContent(resultBean.getBetDetail()) .payoffTime(resultBean.getCalTime().getTime()) .payoffAmount(payoffAmount) .settlementTime(resultBean.getCalTime().getTime()) diff --git a/ff-game/src/main/java/com/ff/member/service/IMemberService.java b/ff-game/src/main/java/com/ff/member/service/IMemberService.java index 1edccad..c31748e 100644 --- a/ff-game/src/main/java/com/ff/member/service/IMemberService.java +++ b/ff-game/src/main/java/com/ff/member/service/IMemberService.java @@ -32,7 +32,7 @@ public interface IMemberService * * @return {@link String } */ - String getMemberGameAccount(); + String getMemberGameAccount(String platformCode); /** * 新增会员 diff --git a/ff-game/src/main/java/com/ff/member/service/impl/MemberServiceImpl.java b/ff-game/src/main/java/com/ff/member/service/impl/MemberServiceImpl.java index e20e6ef..91310dc 100644 --- a/ff-game/src/main/java/com/ff/member/service/impl/MemberServiceImpl.java +++ b/ff-game/src/main/java/com/ff/member/service/impl/MemberServiceImpl.java @@ -3,6 +3,8 @@ package com.ff.member.service.impl; import java.util.List; import cn.hutool.core.util.IdUtil; +import com.ff.base.enums.GamePlatforms; +import com.ff.base.enums.PlatformType; import com.ff.base.utils.DateUtils; import com.ff.base.utils.RandomGeneratorUtils; import org.springframework.beans.factory.annotation.Autowired; @@ -19,8 +21,7 @@ import org.springframework.util.ObjectUtils; * @date 2025-02-10 */ @Service -public class MemberServiceImpl implements IMemberService -{ +public class MemberServiceImpl implements IMemberService { @Autowired private MemberMapper memberMapper; @@ -31,8 +32,7 @@ public class MemberServiceImpl implements IMemberService * @return 会员 */ @Override - public Member selectMemberById(Long id) - { + public Member selectMemberById(Long id) { return memberMapper.selectMemberById(id); } @@ -43,8 +43,7 @@ public class MemberServiceImpl implements IMemberService * @return 会员 */ @Override - public List selectMemberList(Member member) - { + public List selectMemberList(Member member) { return memberMapper.selectMemberList(member); } @@ -54,12 +53,19 @@ public class MemberServiceImpl implements IMemberService * @return {@link String } */ @Override - public synchronized String getMemberGameAccount() { - - String gameAccount = RandomGeneratorUtils.generateRandomAccount(); - while (!ObjectUtils.isEmpty(memberMapper.selectMemberByGameAccount(gameAccount))){ - gameAccount = RandomGeneratorUtils.generateRandomAccount(); + public synchronized String getMemberGameAccount(String platformCode) { + String gameAccount = null; + if (GamePlatforms.DG.getInfo().equals(platformCode)) { + do { + gameAccount = RandomGeneratorUtils.generateRandomAccountUpper(); + } while (!ObjectUtils.isEmpty(memberMapper.selectMemberByGameAccount(gameAccount))); + } else { + do { + gameAccount = RandomGeneratorUtils.generateRandomAccount(); + } while (!ObjectUtils.isEmpty(memberMapper.selectMemberByGameAccount(gameAccount))); } + + return gameAccount; } @@ -70,8 +76,7 @@ public class MemberServiceImpl implements IMemberService * @return 结果 */ @Override - public int insertMember(Member member) - { + public int insertMember(Member member) { member.setId(IdUtil.getSnowflakeNextId()); member.setCreateTime(DateUtils.getNowDate()); return memberMapper.insertMember(member); @@ -84,8 +89,7 @@ public class MemberServiceImpl implements IMemberService * @return 结果 */ @Override - public int updateMember(Member member) - { + public int updateMember(Member member) { member.setUpdateTime(DateUtils.getNowDate()); return memberMapper.updateMember(member); } @@ -97,8 +101,7 @@ public class MemberServiceImpl implements IMemberService * @return 结果 */ @Override - public int deleteMemberByIds(Long[] ids) - { + public int deleteMemberByIds(Long[] ids) { return memberMapper.deleteMemberByIds(ids); } @@ -109,13 +112,11 @@ public class MemberServiceImpl implements IMemberService * @return 结果 */ @Override - public int deleteMemberById(Long id) - { + public int deleteMemberById(Long id) { return memberMapper.deleteMemberById(id); } - /** * 按游戏帐户选择成员 * @@ -137,6 +138,6 @@ public class MemberServiceImpl implements IMemberService */ @Override public Member selectMemberByAccount(String account, String currencyCode, String platformCode) { - return memberMapper.selectMemberByAccount(account,currencyCode,platformCode); + return memberMapper.selectMemberByAccount(account, currencyCode, platformCode); } }