package cc.mrbird.febs.mall.service.impl; import cc.mrbird.febs.common.entity.FebsResponse; import cc.mrbird.febs.common.enumerates.*; import cc.mrbird.febs.common.exception.FebsException; import cc.mrbird.febs.common.utils.AppContants; import cc.mrbird.febs.common.utils.LoginUserUtil; import cc.mrbird.febs.common.utils.MallUtils; import cc.mrbird.febs.common.utils.ShareCodeUtil; import cc.mrbird.febs.mall.dto.*; import cc.mrbird.febs.mall.entity.*; import cc.mrbird.febs.mall.mapper.*; import cc.mrbird.febs.mall.service.GameService; import cc.mrbird.febs.mall.service.IApiMallMemberWalletService; import cc.mrbird.febs.mall.service.IMallMoneyFlowService; import cc.mrbird.febs.mall.vo.*; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.RandomUtil; import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.poi.ss.formula.functions.Choose; import org.springframework.stereotype.Service; import cc.mrbird.febs.websocket.WsSessionManager; import org.springframework.transaction.annotation.Transactional; import sun.net.www.content.image.png; import java.math.BigDecimal; import java.util.ArrayList; import java.util.Arrays; import java.util.Date; import java.util.List; import java.util.stream.Collectors; @Slf4j @Service @RequiredArgsConstructor public class GameServiceImpl extends ServiceImpl implements GameService { private final DataDictionaryCustomMapper dataDictionaryCustomMapper; private final MallMemberMapper mallMemberMapper; private final MallMemberWalletMapper mallMemberWalletMapper; private final GameRoomMapper gameRoomMapper; private final GameRoomChildMapper gameRoomChildMapper; private final GameGameMapper gameGameMapper; private final GameGameChildMapper gameGameChildMapper; private final IApiMallMemberWalletService memberWalletService; private final IMallMoneyFlowService mallMoneyFlowService; @Override public FebsResponse roomType() { ArrayList objects = new ArrayList<>(); List roomLists = GameRoomTypeEnum.ROOM_ONE.getRoomList(); if(CollUtil.isNotEmpty(roomLists)){ for(GameRoomTypeEnum gameRoomTypeEnum : roomLists){ RoomTypeVo roomTypeVo = new RoomTypeVo(); roomTypeVo.setRoomName(gameRoomTypeEnum.getRoomName()); roomTypeVo.setRoomType(gameRoomTypeEnum.getRoomType()); roomTypeVo.setRoomAmount(new BigDecimal(gameRoomTypeEnum.getRoomAmount())); roomTypeVo.setMinAmount(new BigDecimal(gameRoomTypeEnum.getMinAmount())); roomTypeVo.setMaxAmount(new BigDecimal(gameRoomTypeEnum.getMaxAmount())); String amounts = gameRoomTypeEnum.getAmounts(); // 使用split方法将字符串按照逗号分割成数组 String[] numbersArray = amounts.split(","); // 将数组转换成Stream List numbersList = Arrays.stream(numbersArray) // 使用map方法将每个字符串元素转换成BigDecimal .map(BigDecimal::new) // 收集到List中 .collect(Collectors.toList()); roomTypeVo.setAmounts(numbersList); objects.add(roomTypeVo); } } return new FebsResponse().success().data(objects); } @Override @Transactional(rollbackFor = Exception.class) public FebsResponse createRoom(ApiCreateRoomDto apiCreateRoomDto) { /** * 用户登录 * 判断是否是代理,只有代理才能创建房间 * 初始化一条主房间记录 * 初始化一条子房间记录 * 返回房间信息 */ Long memberId = LoginUserUtil.getLoginUser().getId(); //每局时间倒计时 Integer gameTime = apiCreateRoomDto.getGameTime(); if(1 > gameTime || 60 < gameTime){ throw new FebsException("请输入合适的数字"); } //代理身份才能创建房间 MallMember mallMember = mallMemberMapper.selectById(memberId); Integer partner = ObjectUtil.isEmpty(mallMember.getPartner()) ? 2 : mallMember.getPartner(); if(AppContants.MEMBER_PARTNER_NO == partner){ throw new FebsException("用户没有创建房间的权限!"); } Integer roomType = apiCreateRoomDto.getRoomType(); GameRoomTypeEnum room = GameRoomTypeEnum.ROOM_ONE.getRoom(roomType); if(ObjectUtil.isEmpty(room)){ throw new FebsException("请选择正确的房间类型!"); } //创建房间的最小金额 BigDecimal roomAmount = new BigDecimal(room.getRoomAmount()).setScale(2, BigDecimal.ROUND_DOWN); MallMemberWallet mallMemberWallet = mallMemberWalletMapper.selectWalletByMemberId(memberId); if(roomAmount.compareTo(mallMemberWallet.getBalance()) > 0){ throw new FebsException("金额不足,请充值!"); } //初始化一条主房间记录 GameRoom gameRoom = new GameRoom(); gameRoom.setRoomType(roomType); gameRoom.setState(GameRoom.STATE_READY); gameRoom.setOwnerMemberId(memberId); gameRoom.setGameTime(gameTime); gameRoomMapper.insert(gameRoom); boolean flag = false; String password = ShareCodeUtil.toSerialNumberCodeTwo(gameRoom.getId()); while (!flag){ QueryWrapper objectQueryWrapper = new QueryWrapper<>(); objectQueryWrapper.eq("password",password); List gameRooms = gameRoomMapper.selectList(objectQueryWrapper); if(CollUtil.isEmpty(gameRooms)){ flag = true; }else{ password = ShareCodeUtil.toSerialNumberCodeTwo(gameRoom.getId()); } } gameRoom.setPassword(password); gameRoomMapper.updateById(gameRoom); //初始化一条子房间记录 GameRoomChild gameRoomChild = new GameRoomChild(); gameRoomChild.setRoomId(gameRoom.getId()); gameRoomChild.setOwnerState(GameRoomChild.OWNER_TRUE); gameRoomChild.setMemberId(memberId); gameRoomChildMapper.insert(gameRoomChild); ApiCreateRoomVo apiCreateRoomVo = new ApiCreateRoomVo(); apiCreateRoomVo.setRoomType(roomType); apiCreateRoomVo.setRoomId(gameRoom.getId()); apiCreateRoomVo.setPassword(password); apiCreateRoomVo.setState(gameRoom.getState()); return new FebsResponse().success().data(apiCreateRoomVo); } @Override @Transactional(rollbackFor = Exception.class) public FebsResponse startGame(ApiStartGameDto startGameDto) { Long memberId = LoginUserUtil.getLoginUser().getId(); MallMember mallMember = mallMemberMapper.selectById(memberId); Long roomId = startGameDto.getRoomId(); QueryWrapper roomQueryWrapper = new QueryWrapper<>(); roomQueryWrapper.eq("owner_member_id",memberId); roomQueryWrapper.eq("id",roomId); GameRoom gameRoom = gameRoomMapper.selectOne(roomQueryWrapper); if(ObjectUtil.isEmpty(gameRoom)){ throw new FebsException("房间不存在"); } if(GameRoom.STATE_READY != gameRoom.getState()){ throw new FebsException("游戏已开始"); } Integer roomType = gameRoom.getRoomType(); GameRoomTypeEnum room = GameRoomTypeEnum.ROOM_ONE.getRoom(roomType); if(ObjectUtil.isEmpty(room)){ throw new FebsException("请选择正确的房间类型!"); } //创建房间的最小金额 BigDecimal roomAmount = new BigDecimal(room.getRoomAmount()).setScale(2, BigDecimal.ROUND_DOWN); MallMemberWallet mallMemberWallet = mallMemberWalletMapper.selectWalletByMemberId(memberId); if(roomAmount.compareTo(mallMemberWallet.getBalance()) > 0){ throw new FebsException("金额不足,请充值!"); } gameRoom.setState(GameRoom.STATE_ING); gameRoomMapper.updateById(gameRoom); GameGame gameGame = new GameGame(); gameGame.setMemberId(memberId); gameGame.setRoomId(roomId); gameGame.setState(GameGame.STATE_READY); gameGameMapper.insert(gameGame); /** * 给房间里面的所有人发送一个开始的信息 */ this.sendMsgByRoomId(roomId,"START:"+gameGame.getId()); ApiStartGameVo apiStartGameVo = new ApiStartGameVo(); apiStartGameVo.setRoomType(gameRoom.getRoomType()); apiStartGameVo.setRoomId(gameRoom.getId()); apiStartGameVo.setPassword(gameRoom.getPassword()); apiStartGameVo.setState(gameRoom.getState()); apiStartGameVo.setCreatedTime(gameGame.getCreatedTime()); return new FebsResponse().success().data(apiStartGameVo); } @Override public void sendMsgByRoomId(Long roomId,String msg) { QueryWrapper gameRoomChildQueryWrapper = new QueryWrapper<>(); gameRoomChildQueryWrapper.eq("room_id",roomId); List gameRoomChildrens = gameRoomChildMapper.selectList(gameRoomChildQueryWrapper); if(CollUtil.isEmpty(gameRoomChildrens)){ return; } List playerMemberIds = gameRoomChildrens.stream().map(GameRoomChild::getMemberId).collect(Collectors.toList()); this.sendMsgByMemberIds(playerMemberIds,msg); } @Override public void sendMsgByMemberIds(List memberIds,String msg) { QueryWrapper memberQueryWrapper = new QueryWrapper<>(); memberQueryWrapper.in("id",memberIds); List mallMembers = mallMemberMapper.selectList(memberQueryWrapper); if(CollUtil.isEmpty(mallMembers)){ return; } String inviteIdsString = mallMembers.stream() .map(MallMember::getInviteId) // 提取每个MallMember的inviteId .collect(Collectors.joining(",")); // 使用逗号连接所有inviteId WsSessionManager.sendMsgToMany(inviteIdsString,msg); } @Override public void sendMsgByMemberId(Long memberId,String msg) { MallMember mallMembers = mallMemberMapper.selectById(memberId); if(ObjectUtil.isEmpty(mallMembers)){ return; } WsSessionManager.sendMsgToOne(mallMembers.getInviteId(),msg); } @Override @Transactional(rollbackFor = Exception.class) public FebsResponse chooseNum(ApiChooseNumDto apiChooseNumDto) { /** * 判断这个房间投注人是否在房间中 * 判断游戏的状态是否是投注中 * 判断房间类型是否满足投注金额 * 判断游戏的投注金额是否足够 */ Long memberId = LoginUserUtil.getLoginUser().getId(); Long roomId = apiChooseNumDto.getRoomId(); Integer chooseNum = apiChooseNumDto.getChooseNum(); BigDecimal amount = apiChooseNumDto.getAmount(); Long gameId = apiChooseNumDto.getGameId(); GameRoom gameRoom = gameRoomMapper.selectById(roomId); if(ObjectUtil.isEmpty(gameRoom)){ throw new FebsException("房间不存在"); } if(GameRoom.STATE_DONE == gameRoom.getState()){ throw new FebsException("房主关闭了房间"); } if(GameRoom.STATE_READY == gameRoom.getState()){ throw new FebsException("请等待房主开始游戏"); } QueryWrapper gameRoomChildQueryWrapper = new QueryWrapper<>(); gameRoomChildQueryWrapper.eq("room_id",gameRoom.getId()); gameRoomChildQueryWrapper.eq("member_id",memberId); GameRoomChild gameRoomChildExist = gameRoomChildMapper.selectOne(gameRoomChildQueryWrapper); if(ObjectUtil.isEmpty(gameRoomChildExist)){ throw new FebsException("请重新进入房间"); } MallMemberWallet mallMemberWallet = mallMemberWalletMapper.selectWalletByMemberId(memberId); BigDecimal balance = mallMemberWallet.getBalance(); if(BigDecimal.ZERO.compareTo(balance) > 0){ throw new FebsException("余额不足"); } if(amount.compareTo(balance) > 0){ throw new FebsException("请减小金额"); } GameRoomTypeEnum room = GameRoomTypeEnum.ROOM_ONE.getRoom(gameRoom.getRoomType()); // 使用split方法将字符串按照逗号分割成数组 String[] numbersArray = room.getAmounts().split(","); // 将数组转换成Stream List numbersList = Arrays.stream(numbersArray) // 使用map方法将每个字符串元素转换成BigDecimal .map(BigDecimal::new) // 收集到List中 .collect(Collectors.toList()); boolean contains = numbersList.contains(amount); if(!contains){ throw new FebsException("请选择正确的金额"); } if(chooseNum < 1 || chooseNum > 6){ throw new FebsException("请选择正确的投注"); } GameGame gameGame = gameGameMapper.selectById(gameId); if(ObjectUtil.isEmpty(gameGame)){ throw new FebsException("请重新进入游戏"); } if(GameGame.STATE_READY != gameGame.getState()){ throw new FebsException("本轮已结束"); } /** * 开始投注 * 初始化一条投注子记录 * 更新游戏主记录 * 通知房主,更新页面。 * 减少用户的金额 * 初始化一条流水记录 */ memberWalletService.reduceBalance(amount,memberId); mallMoneyFlowService.addMoneyFlow( mallMemberWallet.getMemberId(), amount.negate(), GameFlowTypeEnum.PLAYER_PICK_NUM.getValue(), MallUtils.getOrderNum("TZ"), StrUtil.format( GameFlowTypeEnum.PLAYER_PICK_NUM.getDescrition(), gameRoom.getPassword(), GamePNGEnum.SHI_ZI.getPngName(chooseNum))); GameGameChild gameGameChild = new GameGameChild(); gameGameChild.setGameId(gameId); gameGameChild.setMemberId(memberId); gameGameChild.setAmount(amount); gameGameChild.setPickNum(chooseNum); gameGameChild.setState(GameGameChild.STATE_ING); gameGameChildMapper.insert(gameGameChild); if(1 == chooseNum){ BigDecimal add = gameGame.getPickOne().add(amount).setScale(2,BigDecimal.ROUND_DOWN); gameGame.setPickOne(add); } if(2 == chooseNum){ BigDecimal add = gameGame.getPickTwo().add(amount).setScale(2,BigDecimal.ROUND_DOWN); gameGame.setPickTwo(add); } if(3 == chooseNum){ BigDecimal add = gameGame.getPickThree().add(amount).setScale(2,BigDecimal.ROUND_DOWN); gameGame.setPickThree(add); } if(4 == chooseNum){ BigDecimal add = gameGame.getPickFour().add(amount).setScale(2,BigDecimal.ROUND_DOWN); gameGame.setPickFour(add); } if(5 == chooseNum){ BigDecimal add = gameGame.getPickFive().add(amount).setScale(2,BigDecimal.ROUND_DOWN); gameGame.setPickFive(add); } if(6 == chooseNum){ BigDecimal add = gameGame.getPickSix().add(amount).setScale(2,BigDecimal.ROUND_DOWN); gameGame.setPickSix(add); } gameGameMapper.updateById(gameGame); /** * 给房间里面的所有人发送一个开始的信息 */ this.sendMsgByRoomId(roomId,"TZ:"+gameGame.getId()); return new FebsResponse().success().message("操作成功"); } @Override @Transactional(rollbackFor = Exception.class) public FebsResponse gameIn(ApiGameDto apiGameDto) { Long memberId = LoginUserUtil.getLoginUser().getId(); /** * 验证唯一房间编码是否存在 * 验证当前是否已经加入过该房间 * 验证当前用户的钱是否足够进入该房间 * 获取房间状态信息、房间游戏信息 * 初始化房间子表的数据 */ String password = apiGameDto.getPassword(); QueryWrapper objectQueryWrapper = new QueryWrapper<>(); objectQueryWrapper.eq("password", password); GameRoom gameRoom = gameRoomMapper.selectOne(objectQueryWrapper); if(ObjectUtil.isEmpty(gameRoom)){ throw new FebsException("房间不存在"); } if(GameRoom.STATE_DONE == gameRoom.getState()){ throw new FebsException("房间已失效"); } ApiGamePlayerVo apiGamePlayerVo = new ApiGamePlayerVo(); QueryWrapper gameRoomChildQueryWrapper = new QueryWrapper<>(); gameRoomChildQueryWrapper.eq("room_id",gameRoom.getId()); gameRoomChildQueryWrapper.eq("member_id",memberId); GameRoomChild gameRoomChildExist = gameRoomChildMapper.selectOne(gameRoomChildQueryWrapper); MallMemberWallet mallMemberWallet = mallMemberWalletMapper.selectWalletByMemberId(memberId); BigDecimal balance = mallMemberWallet.getBalance(); GameRoomTypeEnum room = GameRoomTypeEnum.ROOM_ONE.getRoom(gameRoom.getRoomType()); if(ObjectUtil.isNotEmpty(gameRoomChildExist)){ Integer ownerState = gameRoomChildExist.getOwnerState(); if(GameRoomChild.OWNER_TRUE == ownerState){ BigDecimal roomAmount = new BigDecimal(room.getRoomAmount()).setScale(2,BigDecimal.ROUND_DOWN); if(roomAmount.compareTo(balance) > 0){ throw new FebsException("进入房间,需要"+roomAmount+",请先充值"); } }else{ BigDecimal minAmount = new BigDecimal(room.getMinAmount()).setScale(2,BigDecimal.ROUND_DOWN); if(minAmount.compareTo(balance) > 0){ throw new FebsException("继续游戏需要"+minAmount+",请先充值"); } } }else{ BigDecimal minAmount = new BigDecimal(room.getMinAmount()).setScale(2,BigDecimal.ROUND_DOWN); if(minAmount.compareTo(balance) > 0){ throw new FebsException("继续游戏需要"+minAmount+",请先充值"); } } if(ObjectUtil.isNotEmpty(gameRoomChildExist)){ apiGamePlayerVo.setPlayerType(gameRoomChildExist.getOwnerState()); }else{ GameRoomChild gameRoomChild = new GameRoomChild(); gameRoomChild.setRoomId(gameRoom.getId()); gameRoomChild.setMemberId(memberId); gameRoomChild.setOwnerState(GameRoomChild.OWNER_FALSE); gameRoomChildMapper.insert(gameRoomChild); apiGamePlayerVo.setPlayerType(gameRoomChild.getOwnerState()); } apiGamePlayerVo.setBalance(balance); apiGamePlayerVo.setRoomType(gameRoom.getRoomType()); apiGamePlayerVo.setRoomId(gameRoom.getId()); apiGamePlayerVo.setPassword(gameRoom.getPassword()); apiGamePlayerVo.setState(gameRoom.getState()); apiGamePlayerVo.setGameTime(gameRoom.getGameTime()); QueryWrapper gameGameQueryWrapper = new QueryWrapper<>(); gameGameQueryWrapper.eq("room_id",gameRoom.getId()); gameGameQueryWrapper.orderByDesc("CREATED_TIME"); gameGameQueryWrapper.last("limit 5"); List gameGames = gameGameMapper.selectList(gameGameQueryWrapper); List apiGameGameVos = new ArrayList<>(); if(CollUtil.isNotEmpty(gameGames)){ for(GameGame gameGame : gameGames){ ApiGameGameVo apiGameGameVo = new ApiGameGameVo(); apiGameGameVo.setFirstNum(ObjectUtil.isEmpty(gameGame.getFirstNum()) ? 0 : gameGame.getFirstNum()); apiGameGameVo.setSecondNum(ObjectUtil.isEmpty(gameGame.getSecondNum()) ? 0 : gameGame.getSecondNum()); apiGameGameVo.setState(gameGame.getState()); apiGameGameVo.setPerkTime(gameGame.getPerkTime()); if(GameGame.STATE_READY == gameGame.getState()){ apiGamePlayerVo.setGameId(gameGame.getId()); apiGamePlayerVo.setCreatedTime(gameGame.getCreatedTime()); } apiGameGameVos.add(apiGameGameVo); } } apiGamePlayerVo.setApiGameGameVos(apiGameGameVos); return new FebsResponse().success().data(apiGamePlayerVo); } @Override @Transactional(rollbackFor = Exception.class) public FebsResponse endGame(ApiEndGameDto endGameDto) { Long memberId = LoginUserUtil.getLoginUser().getId(); Long roomId = endGameDto.getRoomId(); Long gameId = endGameDto.getGameId(); /** * 只有房主才能结束本轮游戏 * 判断本轮游戏状态 * 结算 * 判断房主是否还够资金开启下一轮游戏 * 等待房主开始 */ GameRoom gameRoom = gameRoomMapper.selectById(roomId); if(ObjectUtil.isEmpty(gameRoom)){ throw new FebsException("房间不存在"); } QueryWrapper gameRoomChildQueryWrapper = new QueryWrapper<>(); gameRoomChildQueryWrapper.eq("room_id",roomId); gameRoomChildQueryWrapper.eq("member_id",memberId); gameRoomChildQueryWrapper.eq("owner_state",GameRoomChild.OWNER_TRUE); GameRoomChild gameRoomChildExist = gameRoomChildMapper.selectOne(gameRoomChildQueryWrapper); if(ObjectUtil.isEmpty(gameRoomChildExist)){ throw new FebsException("房间不存在"); } QueryWrapper gameGameQueryWrapper = new QueryWrapper<>(); gameGameQueryWrapper.eq("id",gameId); gameGameQueryWrapper.eq("room_id",roomId); gameGameQueryWrapper.eq("member_id",memberId); gameGameQueryWrapper.eq("state",GameGame.STATE_READY); GameGame gameGameExist = gameGameMapper.selectOne(gameGameQueryWrapper); if(ObjectUtil.isEmpty(gameGameExist)){ throw new FebsException("本轮游戏已结束"); } //将游戏房间更新为准备中 gameRoom.setState(GameRoom.STATE_READY); gameRoomMapper.updateById(gameRoom); //产生两个随机的1-6的数字 int firstNum = RandomUtil.randomInt(1, 7); int secondNum = RandomUtil.randomInt(1, 7); gameGameExist.setFirstNum(firstNum); gameGameExist.setSecondNum(secondNum); gameGameExist.setState(GameGame.STATE_DONE); gameGameExist.setPerkTime(new Date()); gameGameMapper.updateById(gameGameExist); //结算 todo 改成rabbitMq消息推送,注意游戏主表的状态变化 this.perkGameGameChild(gameId,firstNum,secondNum); this.sendMsgByRoomId(roomId,"DONE:"+gameId); ApiEndGameVo apiEndGameVo = new ApiEndGameVo(); apiEndGameVo.setRoomId(roomId); return new FebsResponse().success().data(apiEndGameVo); } @Override public BigDecimal perkGameGameChild(Long gameId,int firstNum,int secondNum) { BigDecimal totalPerk = BigDecimal.ZERO; /** * 获取本局游戏的全部参与人员 * 结算金额 */ QueryWrapper objectQueryWrapper = new QueryWrapper<>(); objectQueryWrapper.eq("game_id",gameId); objectQueryWrapper.eq("state",GameGameChild.STATE_ING); List gameGameChildrens = gameGameChildMapper.selectList(objectQueryWrapper); if(CollUtil.isEmpty(gameGameChildrens)){ return totalPerk; } for(GameGameChild gameChild : gameGameChildrens){ Long memberId = gameChild.getMemberId(); //投入金额 BigDecimal amount = gameChild.getAmount(); //投注号码 Integer pickNum = gameChild.getPickNum(); //中奖金额 BigDecimal perkAmount = BigDecimal.ZERO; if(pickNum == firstNum){ GamePNGEnum png = GamePNGEnum.SHI_ZI.getPng(firstNum); if(ObjectUtil.isNotEmpty(png)){ Integer pngTimes = png.getPngTimes(); perkAmount = perkAmount.add(amount.multiply(new BigDecimal(pngTimes)).setScale(2,BigDecimal.ROUND_DOWN)); } } if(pickNum == secondNum){ GamePNGEnum png = GamePNGEnum.SHI_ZI.getPng(secondNum); if(ObjectUtil.isNotEmpty(png)){ Integer pngTimes = png.getPngTimes(); perkAmount = perkAmount.add(amount.multiply(new BigDecimal(pngTimes)).setScale(2,BigDecimal.ROUND_DOWN)); } } if(BigDecimal.ZERO.compareTo(perkAmount) >= 0){//说明两个号码没中, gameChild.setPerkState(GameGameChild.PERK_STATE_NO); gameChild.setPerkAmount(amount.negate()); mallMoneyFlowService.addMoneyFlow( gameChild.getMemberId(), BigDecimal.ZERO, GameFlowTypeEnum.PLAYER_PERK.getValue(), MallUtils.getOrderNum("ZJ"), StrUtil.format( GameFlowTypeEnum.PLAYER_PERK.getDescrition(), GamePNGEnum.SHI_ZI.getPngName(firstNum), GamePNGEnum.SHI_ZI.getPngName(secondNum), GamePNGEnum.SHI_ZI.getPngName(pickNum) )); totalPerk = totalPerk.add(amount); }else{ gameChild.setPerkState(GameGameChild.PERK_STATE_YES); gameChild.setPerkAmount(perkAmount); BigDecimal memberTotalPerk = perkAmount.add(amount); memberWalletService.addBalance(memberTotalPerk,gameChild.getMemberId()); mallMoneyFlowService.addMoneyFlow( gameChild.getMemberId(), memberTotalPerk, GameFlowTypeEnum.PLAYER_PERK.getValue(), MallUtils.getOrderNum("ZJ"), StrUtil.format( GameFlowTypeEnum.PLAYER_PERK.getDescrition(), GamePNGEnum.SHI_ZI.getPngName(firstNum), GamePNGEnum.SHI_ZI.getPngName(secondNum), GamePNGEnum.SHI_ZI.getPngName(pickNum) )); totalPerk = totalPerk.subtract(perkAmount); } gameChild.setPerkNumOne(firstNum); gameChild.setPerkNumTwo(secondNum); gameChild.setState(GameGameChild.STATE_DONE); gameGameChildMapper.updateById(gameChild); } GameGame gameGame = gameGameMapper.selectById(gameId); Long memberId = gameGame.getMemberId(); memberWalletService.addBalance(totalPerk,memberId); mallMoneyFlowService.addMoneyFlow( memberId, totalPerk, GameFlowTypeEnum.OWNER_PERK.getValue(), MallUtils.getOrderNum("KJ"), StrUtil.format( GameFlowTypeEnum.OWNER_PERK.getDescrition(), GamePNGEnum.SHI_ZI.getPngName(firstNum), GamePNGEnum.SHI_ZI.getPngName(secondNum) )); gameGame.setState(GameGame.STATE_OVER); gameGameMapper.updateById(gameGame); return totalPerk; } @Override public FebsResponse nextGame(ApiNextGameDto apiNextGameDto) { Long memberId = LoginUserUtil.getLoginUser().getId(); /** * 验证唯一房间编码是否存在 * 验证当前是否已经加入过该房间 * 验证当前用户的钱是否足够进入该房间 * 获取房间状态信息、房间游戏信息 * 初始化房间子表的数据 */ Long gameId = apiNextGameDto.getGameId(); GameGame gameGameNow = gameGameMapper.selectById(gameId); if(ObjectUtil.isEmpty(gameGameNow)){ throw new FebsException("游戏等待中"); } GameRoom gameRoom = gameRoomMapper.selectById(gameGameNow.getRoomId()); if(ObjectUtil.isEmpty(gameRoom)){ throw new FebsException("房间不存在"); } if(GameRoom.STATE_DONE == gameRoom.getState()){ throw new FebsException("房间已失效"); } ApiNextGameVo apiGamePlayerVo = new ApiNextGameVo(); QueryWrapper gameRoomChildQueryWrapper = new QueryWrapper<>(); gameRoomChildQueryWrapper.eq("room_id",gameRoom.getId()); gameRoomChildQueryWrapper.eq("member_id",memberId); GameRoomChild gameRoomChildExist = gameRoomChildMapper.selectOne(gameRoomChildQueryWrapper); MallMemberWallet mallMemberWallet = mallMemberWalletMapper.selectWalletByMemberId(memberId); BigDecimal balance = mallMemberWallet.getBalance(); GameRoomTypeEnum room = GameRoomTypeEnum.ROOM_ONE.getRoom(gameRoom.getRoomType()); if(ObjectUtil.isNotEmpty(gameRoomChildExist)){ Integer ownerState = gameRoomChildExist.getOwnerState(); if(GameRoomChild.OWNER_TRUE == ownerState){ BigDecimal roomAmount = new BigDecimal(room.getRoomAmount()).setScale(2,BigDecimal.ROUND_DOWN); if(roomAmount.compareTo(balance) > 0){ throw new FebsException("进入房间,需要"+roomAmount+",请先充值"); } }else{ BigDecimal minAmount = new BigDecimal(room.getMinAmount()).setScale(2,BigDecimal.ROUND_DOWN); if(minAmount.compareTo(balance) > 0){ throw new FebsException("继续游戏需要"+minAmount+",请先充值"); } } }else{ BigDecimal minAmount = new BigDecimal(room.getMinAmount()).setScale(2,BigDecimal.ROUND_DOWN); if(minAmount.compareTo(balance) > 0){ throw new FebsException("继续游戏需要"+minAmount+",请先充值"); } } if(ObjectUtil.isNotEmpty(gameRoomChildExist)){ apiGamePlayerVo.setPlayerType(gameRoomChildExist.getOwnerState()); }else{ GameRoomChild gameRoomChild = new GameRoomChild(); gameRoomChild.setRoomId(gameRoom.getId()); gameRoomChild.setMemberId(memberId); gameRoomChild.setOwnerState(GameRoomChild.OWNER_FALSE); gameRoomChildMapper.insert(gameRoomChild); apiGamePlayerVo.setPlayerType(gameRoomChild.getOwnerState()); } apiGamePlayerVo.setBalance(balance); apiGamePlayerVo.setRoomType(gameRoom.getRoomType()); apiGamePlayerVo.setRoomId(gameRoom.getId()); apiGamePlayerVo.setPassword(gameRoom.getPassword()); apiGamePlayerVo.setState(gameRoom.getState()); apiGamePlayerVo.setGameTime(gameRoom.getGameTime()); QueryWrapper gameGameQueryWrapper = new QueryWrapper<>(); gameGameQueryWrapper.eq("room_id",gameRoom.getId()); gameGameQueryWrapper.orderByDesc("CREATED_TIME"); gameGameQueryWrapper.last("limit 5"); List gameGames = gameGameMapper.selectList(gameGameQueryWrapper); List apiGameGameVos = new ArrayList<>(); if(CollUtil.isNotEmpty(gameGames)){ for(GameGame gameGame : gameGames){ ApiGameGameVo apiGameGameVo = new ApiGameGameVo(); apiGameGameVo.setFirstNum(ObjectUtil.isEmpty(gameGame.getFirstNum()) ? 0 : gameGame.getFirstNum()); apiGameGameVo.setSecondNum(ObjectUtil.isEmpty(gameGame.getSecondNum()) ? 0 : gameGame.getSecondNum()); apiGameGameVo.setState(gameGame.getState()); apiGameGameVo.setPerkTime(gameGame.getPerkTime()); if(GameGame.STATE_READY == gameGame.getState()){ apiGamePlayerVo.setGameId(gameGame.getId()); apiGamePlayerVo.setCreatedTime(gameGame.getCreatedTime()); } apiGameGameVos.add(apiGameGameVo); } } apiGamePlayerVo.setApiGameGameVos(apiGameGameVos); return new FebsResponse().success().data(apiGamePlayerVo); } @Override public FebsResponse existGame(ApiExistGameDto apiExistGameDto) { Long memberId = LoginUserUtil.getLoginUser().getId(); Long roomId = apiExistGameDto.getRoomId(); /** * 删除房间子表的数据 */ MallMember mallMember = mallMemberMapper.selectById(memberId); QueryWrapper gameRoomChildQueryWrapper = new QueryWrapper<>(); gameRoomChildQueryWrapper.eq("room_id",roomId); gameRoomChildQueryWrapper.eq("member_id",memberId); GameRoomChild gameRoomChildExist = gameRoomChildMapper.selectOne(gameRoomChildQueryWrapper); if(ObjectUtil.isEmpty(gameRoomChildExist)){ throw new FebsException("房间不存在"); } Integer ownerState = gameRoomChildExist.getOwnerState(); //如果退出的是房主,那么游戏结束 if(GameRoomChild.OWNER_TRUE == ownerState){ GameRoom gameRoom = gameRoomMapper.selectById(roomId); if(ObjectUtil.isNotEmpty(gameRoom)){ gameRoom.setState(GameRoom.STATE_DONE); gameRoomMapper.updateById(gameRoom); this.sendMsgByRoomId(roomId,"OVER"); } } //断开websocket WsSessionManager.remove(mallMember.getInviteId()); return new FebsResponse().success(); } @Override public FebsResponse flashGame(ApiFlashGameDto apiFlashGameDto) { Long memberId = LoginUserUtil.getLoginUser().getId(); Long gameId = apiFlashGameDto.getGameId(); GameGame gameGame = gameGameMapper.selectById(gameId); if(ObjectUtil.isEmpty(gameGame)){ throw new FebsException("游戏已结束"); } ApiFlashGameVo apiFlashGameVo = new ApiFlashGameVo(); apiFlashGameVo.setRoomId(gameGame.getRoomId()); apiFlashGameVo.setFirstNum(gameGame.getFirstNum()); apiFlashGameVo.setSecondNum(gameGame.getSecondNum()); apiFlashGameVo.setState(gameGame.getState()); apiFlashGameVo.setPickOne(gameGame.getPickOne()); apiFlashGameVo.setPickTwo(gameGame.getPickTwo()); apiFlashGameVo.setPickThree(gameGame.getPickThree()); apiFlashGameVo.setPickFour(gameGame.getPickFour()); apiFlashGameVo.setPickFive(gameGame.getPickFive()); apiFlashGameVo.setPickSix(gameGame.getPickSix()); return new FebsResponse().success().data(apiFlashGameVo); } public static void main(String[] args) { System.out.println(ShareCodeUtil.toSerialNumberCodeTwo(1L)); List roomLists = GameRoomTypeEnum.ROOM_ONE.getRoomList(); for(GameRoomTypeEnum gameRoomTypeEnum : roomLists){ String amounts = gameRoomTypeEnum.getAmounts(); // 使用split方法将字符串按照逗号分割成数组 String[] numbersArray = amounts.split(","); // 将数组转换成Stream List numbersList = Arrays.stream(numbersArray) // 使用map方法将每个字符串元素转换成BigDecimal .map(BigDecimal::new) // 收集到List中 .collect(Collectors.toList()); numbersList.forEach(System.out::println); } } }