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.*; 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 cc.mrbird.febs.websocket.WebSocketRes; 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 cn.hutool.json.JSONUtil; 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("请输入合适的数字:1~60"); } //代理身份才能创建房间 MallMember mallMember = mallMemberMapper.selectById(memberId); Integer partner = ObjectUtil.isEmpty(mallMember.getPartner()) ? 2 : mallMember.getPartner(); if(AppContants.MEMBER_PARTNER_NO == partner){ throw new FebsException("用户没有创建房间的权限!"); } QueryWrapper roomChildQueryWrapper = new QueryWrapper<>(); roomChildQueryWrapper.eq("member_id",memberId); roomChildQueryWrapper.eq("state",GameRoomChild.OWNER_TRUE); List roomChildExists = gameRoomChildMapper.selectList(roomChildQueryWrapper); if(CollUtil.isNotEmpty(roomChildExists)){ List roomIds = roomChildExists.stream().map(GameRoomChild::getRoomId).collect(Collectors.toList()); QueryWrapper roomQuery = new QueryWrapper<>(); roomQuery.in("id",roomIds); List gameRooms = gameRoomMapper.selectList(roomQuery); List collect = gameRooms.stream().filter(room -> room.getState() != GameRoom.STATE_DONE).collect(Collectors.toList()); if(CollUtil.isNotEmpty(collect)){ if(collect.size() > 0){ throw new FebsException("请退出房间,房间码:"+collect.get(0).getPassword()); } } } QueryWrapper gameRoomQuery = new QueryWrapper<>(); gameRoomQuery.eq("owner_member_id",memberId); gameRoomQuery.ne("state",GameRoom.STATE_DONE); List gameRoomsExists = gameRoomMapper.selectList(gameRoomQuery); if(CollUtil.isNotEmpty(gameRoomsExists)){ throw new FebsException("房间已创建!房间码为:"+gameRoomsExists.get(0).getPassword()); } 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.setRoomOwner(mallMember.getAccountLogin()); 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); gameRoomChild.setState(GameRoomChild.OWNER_TRUE); 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); /** * 给房间里面的所有人发送一个开始的信息 */ WebSocketRes webSocketRes = new WebSocketRes(); webSocketRes.setCode(200); webSocketRes.setMsg(gameGame.getId().toString()); this.sendMsgByRoomId(roomId, JSONUtil.parse(webSocketRes).toString()); ApiStartGameVo apiStartGameVo = new ApiStartGameVo(); apiStartGameVo.setRoomType(gameRoom.getRoomType()); apiStartGameVo.setRoomId(gameRoom.getId()); apiStartGameVo.setGameId(gameGame.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); gameRoomChildQueryWrapper.eq("state",GameRoomChild.OWNER_TRUE); 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); gameRoomChildQueryWrapper.eq("state",GameRoomChild.OWNER_TRUE); 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){ QueryWrapper objectQueryWrapper = new QueryWrapper<>(); objectQueryWrapper.eq("game_id",gameId); objectQueryWrapper.eq("pick_num",chooseNum); List gameGameChildren = gameGameChildMapper.selectList(objectQueryWrapper); BigDecimal tzAmount = BigDecimal.ZERO; if(CollUtil.isNotEmpty(gameGameChildren)){ tzAmount = gameGameChildren.stream() .map(GameGameChild::getAmount) // 映射amount到流中 .reduce(BigDecimal.ZERO, BigDecimal::add); } gameGame.setPickOne(tzAmount); } if(2 == chooseNum){ QueryWrapper objectQueryWrapper = new QueryWrapper<>(); objectQueryWrapper.eq("game_id",gameId); objectQueryWrapper.eq("pick_num",chooseNum); List gameGameChildren = gameGameChildMapper.selectList(objectQueryWrapper); BigDecimal tzAmount = BigDecimal.ZERO; if(CollUtil.isNotEmpty(gameGameChildren)){ tzAmount = gameGameChildren.stream() .map(GameGameChild::getAmount) // 映射amount到流中 .reduce(BigDecimal.ZERO, BigDecimal::add); } gameGame.setPickTwo(tzAmount); } if(3 == chooseNum){ QueryWrapper objectQueryWrapper = new QueryWrapper<>(); objectQueryWrapper.eq("game_id",gameId); objectQueryWrapper.eq("pick_num",chooseNum); List gameGameChildren = gameGameChildMapper.selectList(objectQueryWrapper); BigDecimal tzAmount = BigDecimal.ZERO; if(CollUtil.isNotEmpty(gameGameChildren)){ tzAmount = gameGameChildren.stream() .map(GameGameChild::getAmount) // 映射amount到流中 .reduce(BigDecimal.ZERO, BigDecimal::add); } gameGame.setPickThree(tzAmount); } if(4 == chooseNum){ QueryWrapper objectQueryWrapper = new QueryWrapper<>(); objectQueryWrapper.eq("game_id",gameId); objectQueryWrapper.eq("pick_num",chooseNum); List gameGameChildren = gameGameChildMapper.selectList(objectQueryWrapper); BigDecimal tzAmount = BigDecimal.ZERO; if(CollUtil.isNotEmpty(gameGameChildren)){ tzAmount = gameGameChildren.stream() .map(GameGameChild::getAmount) // 映射amount到流中 .reduce(BigDecimal.ZERO, BigDecimal::add); } gameGame.setPickFour(tzAmount); } if(5 == chooseNum){ QueryWrapper objectQueryWrapper = new QueryWrapper<>(); objectQueryWrapper.eq("game_id",gameId); objectQueryWrapper.eq("pick_num",chooseNum); List gameGameChildren = gameGameChildMapper.selectList(objectQueryWrapper); BigDecimal tzAmount = BigDecimal.ZERO; if(CollUtil.isNotEmpty(gameGameChildren)){ tzAmount = gameGameChildren.stream() .map(GameGameChild::getAmount) // 映射amount到流中 .reduce(BigDecimal.ZERO, BigDecimal::add); } gameGame.setPickFive(tzAmount); } if(6 == chooseNum){ QueryWrapper objectQueryWrapper = new QueryWrapper<>(); objectQueryWrapper.eq("game_id",gameId); objectQueryWrapper.eq("pick_num",chooseNum); List gameGameChildren = gameGameChildMapper.selectList(objectQueryWrapper); BigDecimal tzAmount = BigDecimal.ZERO; if(CollUtil.isNotEmpty(gameGameChildren)){ tzAmount = gameGameChildren.stream() .map(GameGameChild::getAmount) // 映射amount到流中 .reduce(BigDecimal.ZERO, BigDecimal::add); } gameGame.setPickSix(tzAmount); } gameGameMapper.updateById(gameGame); /** * 给房间里面的所有人发送一个开始的信息 */ WebSocketRes webSocketRes = new WebSocketRes(); webSocketRes.setCode(200); webSocketRes.setMsg(gameId.toString()); this.sendMsgByRoomId(roomId, JSONUtil.parse(webSocketRes).toString()); // 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(); log.info("加入房间:"+memberId); /** * 验证唯一房间编码是否存在 * 验证当前是否已经加入过该房间 * 验证当前用户的钱是否足够进入该房间 * 获取房间状态信息、房间游戏信息 * 初始化房间子表的数据 */ 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("房间已失效"); } QueryWrapper roomChildQueryWrapper = new QueryWrapper<>(); roomChildQueryWrapper.eq("member_id",memberId); roomChildQueryWrapper.eq("state",GameRoomChild.OWNER_TRUE); List roomChildExists = gameRoomChildMapper.selectList(roomChildQueryWrapper); if(CollUtil.isNotEmpty(roomChildExists)){ List roomIds = roomChildExists.stream().map(GameRoomChild::getRoomId).collect(Collectors.toList()); roomIds.remove(gameRoom.getId()); if(CollUtil.isNotEmpty(roomIds)){ QueryWrapper roomQuery = new QueryWrapper<>(); roomQuery.in("id",roomIds); List gameRooms = gameRoomMapper.selectList(roomQuery); List collect = gameRooms.stream().filter(room -> room.getState() != GameRoom.STATE_DONE).collect(Collectors.toList()); if(CollUtil.isNotEmpty(collect)){ if(collect.size() > 0){ throw new FebsException("请退出房间,房间码:"+collect.get(0).getPassword()); } } } } ApiGamePlayerVo apiGamePlayerVo = new ApiGamePlayerVo(); QueryWrapper gameRoomChildQueryWrapper = new QueryWrapper<>(); gameRoomChildQueryWrapper.eq("room_id",gameRoom.getId()); gameRoomChildQueryWrapper.eq("member_id",memberId); gameRoomChildQueryWrapper.eq("owner_state",GameRoomChild.OWNER_TRUE); 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)){ BigDecimal roomAmount = new BigDecimal(room.getRoomAmount()).setScale(2,BigDecimal.ROUND_DOWN); if(roomAmount.compareTo(balance) > 0){ throw new FebsException("进入房间,需要"+roomAmount+",请先充值"); } apiGamePlayerVo.setPlayerType(GameRoomChild.OWNER_TRUE); }else{ BigDecimal minAmount = new BigDecimal(room.getMinAmount()).setScale(2,BigDecimal.ROUND_DOWN); if(minAmount.compareTo(balance) > 0){ throw new FebsException("继续游戏需要"+minAmount+",请先充值"); } apiGamePlayerVo.setPlayerType(GameRoomChild.OWNER_FALSE); } QueryWrapper childQueryWrapper = new QueryWrapper<>(); childQueryWrapper.eq("room_id",gameRoom.getId()); childQueryWrapper.eq("member_id",memberId); GameRoomChild childQueryWrapperExist = gameRoomChildMapper.selectOne(childQueryWrapper); if(ObjectUtil.isNotEmpty(childQueryWrapperExist)){ childQueryWrapperExist.setState(GameRoomChild.OWNER_TRUE); gameRoomChildMapper.updateById(childQueryWrapperExist); }else{ GameRoomChild gameRoomChild = new GameRoomChild(); gameRoomChild.setRoomId(gameRoom.getId()); gameRoomChild.setMemberId(memberId); gameRoomChild.setOwnerState(GameRoomChild.OWNER_FALSE); gameRoomChild.setState(GameRoomChild.OWNER_TRUE); gameRoomChildMapper.insert(gameRoomChild); } apiGamePlayerVo.setBalance(balance); apiGamePlayerVo.setRoomType(gameRoom.getRoomType()); apiGamePlayerVo.setRoomId(gameRoom.getId()); apiGamePlayerVo.setPassword(gameRoom.getPassword()); apiGamePlayerVo.setState(gameRoom.getState()); apiGamePlayerVo.setGameTime(gameRoom.getGameTime()); Long ownerMemberId = gameRoom.getOwnerMemberId(); MallMember mallMember = mallMemberMapper.selectById(ownerMemberId); apiGamePlayerVo.setRoomOwner(mallMember.getAccountLogin()); 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); gameRoomChildQueryWrapper.eq("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); WebSocketRes webSocketRes = new WebSocketRes(); webSocketRes.setCode(200); webSocketRes.setMsg(gameId.toString()); this.sendMsgByRoomId(roomId, JSONUtil.parse(webSocketRes).toString()); // 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(), amount.negate(), 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); gameRoomChildQueryWrapper.eq("owner_state",GameRoomChild.OWNER_TRUE); 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)){ 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+",请先充值"); } } apiGamePlayerVo.setPlayerType(ObjectUtil.isNotEmpty(gameRoomChildExist) ? GameRoomChild.OWNER_TRUE : GameRoomChild.OWNER_FALSE); apiGamePlayerVo.setBalance(balance); apiGamePlayerVo.setRoomType(gameRoom.getRoomType()); apiGamePlayerVo.setRoomId(gameRoom.getId()); apiGamePlayerVo.setRoomOwner(gameRoom.getRoomOwner()); 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 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("房间不存在"); } gameRoomChildExist.setState(GameRoomChild.OWNER_FALSE); gameRoomChildMapper.updateById(gameRoomChildExist); 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); WebSocketRes webSocketRes = new WebSocketRes(); webSocketRes.setCode(200); webSocketRes.setMsg("OVER"); this.sendMsgByRoomId(roomId, JSONUtil.parse(webSocketRes).toString()); } QueryWrapper objectQueryWrapper = new QueryWrapper<>(); objectQueryWrapper.eq("room_id",roomId); objectQueryWrapper.eq("state",GameGame.STATE_READY); List gameGames = gameGameMapper.selectList(objectQueryWrapper); if(ObjectUtil.isNotEmpty(gameGames)){ for(GameGame game :gameGames){ ApiEndGameDto apiEndGameDto = new ApiEndGameDto(); apiEndGameDto.setRoomId(roomId); apiEndGameDto.setGameId(game.getId()); this.endGame(apiEndGameDto); } } QueryWrapper roomChildQueryWrapper = new QueryWrapper<>(); roomChildQueryWrapper.eq("room_id",roomId); List gameRoomChildren = gameRoomChildMapper.selectList(roomChildQueryWrapper); if(ObjectUtil.isNotEmpty(gameRoomChildren)){ for(GameRoomChild child : gameRoomChildren){ child.setState(GameRoomChild.OWNER_FALSE); gameRoomChildMapper.updateById(child); } } } //断开websocket WsSessionManager.removeAndClose(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()); QueryWrapper objectQueryWrapper1 = new QueryWrapper<>(); objectQueryWrapper1.eq("game_id",gameId); objectQueryWrapper1.eq("pick_num",1); List gameGameChildren1 = gameGameChildMapper.selectList(objectQueryWrapper1); BigDecimal tzAmount1 = BigDecimal.ZERO; if(CollUtil.isNotEmpty(gameGameChildren1)){ tzAmount1 = gameGameChildren1.stream() .map(GameGameChild::getAmount) // 映射amount到流中 .reduce(BigDecimal.ZERO, BigDecimal::add); } apiFlashGameVo.setPickOne(tzAmount1); QueryWrapper objectQueryWrapper2 = new QueryWrapper<>(); objectQueryWrapper2.eq("game_id",gameId); objectQueryWrapper2.eq("pick_num",2); List gameGameChildren2 = gameGameChildMapper.selectList(objectQueryWrapper2); BigDecimal tzAmount2 = BigDecimal.ZERO; if(CollUtil.isNotEmpty(gameGameChildren2)){ tzAmount2 = gameGameChildren2.stream() .map(GameGameChild::getAmount) // 映射amount到流中 .reduce(BigDecimal.ZERO, BigDecimal::add); } apiFlashGameVo.setPickTwo(tzAmount2); QueryWrapper objectQueryWrapper3 = new QueryWrapper<>(); objectQueryWrapper3.eq("game_id",gameId); objectQueryWrapper3.eq("pick_num",3); List gameGameChildren3 = gameGameChildMapper.selectList(objectQueryWrapper3); BigDecimal tzAmount3 = BigDecimal.ZERO; if(CollUtil.isNotEmpty(gameGameChildren3)){ tzAmount3 = gameGameChildren3.stream() .map(GameGameChild::getAmount) // 映射amount到流中 .reduce(BigDecimal.ZERO, BigDecimal::add); } apiFlashGameVo.setPickThree(tzAmount3); QueryWrapper objectQueryWrapper4 = new QueryWrapper<>(); objectQueryWrapper4.eq("game_id",gameId); objectQueryWrapper4.eq("pick_num",4); List gameGameChildren4 = gameGameChildMapper.selectList(objectQueryWrapper4); BigDecimal tzAmount4 = BigDecimal.ZERO; if(CollUtil.isNotEmpty(gameGameChildren4)){ tzAmount4 = gameGameChildren4.stream() .map(GameGameChild::getAmount) // 映射amount到流中 .reduce(BigDecimal.ZERO, BigDecimal::add); } apiFlashGameVo.setPickFour(tzAmount4); QueryWrapper objectQueryWrapper5 = new QueryWrapper<>(); objectQueryWrapper5.eq("game_id",gameId); objectQueryWrapper5.eq("pick_num",5); List gameGameChildren5 = gameGameChildMapper.selectList(objectQueryWrapper5); BigDecimal tzAmount5 = BigDecimal.ZERO; if(CollUtil.isNotEmpty(gameGameChildren5)){ tzAmount5 = gameGameChildren5.stream() .map(GameGameChild::getAmount) // 映射amount到流中 .reduce(BigDecimal.ZERO, BigDecimal::add); } apiFlashGameVo.setPickFive(tzAmount5); QueryWrapper objectQueryWrapper6 = new QueryWrapper<>(); objectQueryWrapper6.eq("game_id",gameId); objectQueryWrapper6.eq("pick_num",6); List gameGameChildren6 = gameGameChildMapper.selectList(objectQueryWrapper6); BigDecimal tzAmount6 = BigDecimal.ZERO; if(CollUtil.isNotEmpty(gameGameChildren6)){ tzAmount6 = gameGameChildren6.stream() .map(GameGameChild::getAmount) // 映射amount到流中 .reduce(BigDecimal.ZERO, BigDecimal::add); } apiFlashGameVo.setPickSix(tzAmount6); return new FebsResponse().success().data(apiFlashGameVo); } @Override public FebsResponse roomInfo(ApiRoomInfoDto apiRoomInfoDto) { Long memberId = LoginUserUtil.getLoginUser().getId(); Long roomId = apiRoomInfoDto.getRoomId(); GameRoom gameRoom = gameRoomMapper.selectById(roomId); if(ObjectUtil.isEmpty(gameRoom)){ throw new FebsException("房间不存在"); } if(GameRoom.STATE_DONE == gameRoom.getState()){ throw new FebsException("房间已失效"); } ApiRoomInfoVo apiRoomInfoVo = new ApiRoomInfoVo(); QueryWrapper gameRoomChildQueryWrapper = new QueryWrapper<>(); gameRoomChildQueryWrapper.eq("room_id",gameRoom.getId()); gameRoomChildQueryWrapper.eq("member_id",memberId); gameRoomChildQueryWrapper.eq("owner_state",GameRoomChild.OWNER_TRUE); 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)){ BigDecimal roomAmount = new BigDecimal(room.getRoomAmount()).setScale(2,BigDecimal.ROUND_DOWN); if(roomAmount.compareTo(balance) > 0){ throw new FebsException("进入房间,需要"+roomAmount+",请先充值"); } apiRoomInfoVo.setPlayerType(GameRoomChild.OWNER_TRUE); }else{ BigDecimal minAmount = new BigDecimal(room.getMinAmount()).setScale(2,BigDecimal.ROUND_DOWN); if(minAmount.compareTo(balance) > 0){ throw new FebsException("继续游戏需要"+minAmount+",请先充值"); } apiRoomInfoVo.setPlayerType(GameRoomChild.OWNER_FALSE); } QueryWrapper childQueryWrapper = new QueryWrapper<>(); childQueryWrapper.eq("room_id",gameRoom.getId()); childQueryWrapper.eq("member_id",memberId); GameRoomChild childQueryWrapperExist = gameRoomChildMapper.selectOne(childQueryWrapper); if(ObjectUtil.isNotEmpty(childQueryWrapperExist)){ childQueryWrapperExist.setState(GameRoomChild.OWNER_TRUE); gameRoomChildMapper.updateById(childQueryWrapperExist); } apiRoomInfoVo.setBalance(balance); apiRoomInfoVo.setRoomType(gameRoom.getRoomType()); apiRoomInfoVo.setRoomId(gameRoom.getId()); apiRoomInfoVo.setPassword(gameRoom.getPassword()); apiRoomInfoVo.setState(gameRoom.getState()); apiRoomInfoVo.setGameTime(gameRoom.getGameTime()); Long ownerMemberId = gameRoom.getOwnerMemberId(); MallMember mallMember = mallMemberMapper.selectById(ownerMemberId); apiRoomInfoVo.setRoomOwner(mallMember.getAccountLogin()); 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()){ apiRoomInfoVo.setGameId(gameGame.getId()); apiRoomInfoVo.setCreatedTime(gameGame.getCreatedTime()); } apiGameGameVos.add(apiGameGameVo); } } apiRoomInfoVo.setApiGameGameVos(apiGameGameVos); return new FebsResponse().success().data(apiRoomInfoVo); } 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); } } }