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<GameRoomMapper, GameRoom> 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<RoomTypeVo> objects = new ArrayList<>();
|
|
List<GameRoomTypeEnum> 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<BigDecimal> 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<GameRoom> objectQueryWrapper = new QueryWrapper<>();
|
objectQueryWrapper.eq("password",password);
|
List<GameRoom> 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<GameRoom> 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.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<GameRoomChild> gameRoomChildQueryWrapper = new QueryWrapper<>();
|
gameRoomChildQueryWrapper.eq("room_id",roomId);
|
List<GameRoomChild> gameRoomChildrens = gameRoomChildMapper.selectList(gameRoomChildQueryWrapper);
|
if(CollUtil.isEmpty(gameRoomChildrens)){
|
return;
|
}
|
List<Long> playerMemberIds = gameRoomChildrens.stream().map(GameRoomChild::getMemberId).collect(Collectors.toList());
|
this.sendMsgByMemberIds(playerMemberIds,msg);
|
}
|
|
@Override
|
public void sendMsgByMemberIds(List<Long> memberIds,String msg) {
|
QueryWrapper<MallMember> memberQueryWrapper = new QueryWrapper<>();
|
memberQueryWrapper.in("id",memberIds);
|
List<MallMember> 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<GameRoomChild> 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<BigDecimal> 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<GameRoom> 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<GameRoomChild> 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<GameGame> gameGameQueryWrapper = new QueryWrapper<>();
|
gameGameQueryWrapper.eq("room_id",gameRoom.getId());
|
gameGameQueryWrapper.orderByDesc("CREATED_TIME");
|
gameGameQueryWrapper.last("limit 5");
|
List<GameGame> gameGames = gameGameMapper.selectList(gameGameQueryWrapper);
|
List<ApiGameGameVo> 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<GameRoomChild> 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<GameGame> 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<GameGameChild> objectQueryWrapper = new QueryWrapper<>();
|
objectQueryWrapper.eq("game_id",gameId);
|
objectQueryWrapper.eq("state",GameGameChild.STATE_ING);
|
List<GameGameChild> 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<GameRoomChild> 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<GameGame> gameGameQueryWrapper = new QueryWrapper<>();
|
gameGameQueryWrapper.eq("room_id",gameRoom.getId());
|
gameGameQueryWrapper.orderByDesc("CREATED_TIME");
|
gameGameQueryWrapper.last("limit 5");
|
List<GameGame> gameGames = gameGameMapper.selectList(gameGameQueryWrapper);
|
List<ApiGameGameVo> 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<GameRoomChild> 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<GameRoomTypeEnum> roomLists = GameRoomTypeEnum.ROOM_ONE.getRoomList();
|
for(GameRoomTypeEnum gameRoomTypeEnum : roomLists){
|
String amounts = gameRoomTypeEnum.getAmounts();
|
// 使用split方法将字符串按照逗号分割成数组
|
String[] numbersArray = amounts.split(",");
|
|
// 将数组转换成Stream
|
List<BigDecimal> numbersList = Arrays.stream(numbersArray)
|
// 使用map方法将每个字符串元素转换成BigDecimal
|
.map(BigDecimal::new)
|
// 收集到List中
|
.collect(Collectors.toList());
|
numbersList.forEach(System.out::println);
|
}
|
}
|
}
|