Просмотр исходного кода

Merge remote-tracking branch 'origin/master'

dos 2 месяцев назад
Родитель
Сommit
30dacd59ac
24 измененных файлов с 797 добавлено и 35 удалено
  1. 131 7
      game-business/src/main/java/com/game/business/controller/AppGameBettingController.java
  2. 41 0
      game-business/src/main/java/com/game/business/controller/AppGameItemController.java
  3. 39 4
      game-business/src/main/java/com/game/business/controller/AppGameLotteryController.java
  4. 7 2
      game-business/src/main/java/com/game/business/domain/AppGameBetting.java
  5. 11 1
      game-business/src/main/java/com/game/business/domain/AppGameItem.java
  6. 5 0
      game-business/src/main/java/com/game/business/domain/AppUserGameRecordCount.java
  7. 15 0
      game-business/src/main/java/com/game/business/dto/AppItemCountDTO.java
  8. 4 0
      game-business/src/main/java/com/game/business/mapper/AppGameBettingMapper.java
  9. 18 0
      game-business/src/main/java/com/game/business/mapper/AppGameItemMapper.java
  10. 10 0
      game-business/src/main/java/com/game/business/service/IAppGameBettingService.java
  11. 17 0
      game-business/src/main/java/com/game/business/service/IAppGameItemService.java
  12. 2 0
      game-business/src/main/java/com/game/business/service/IAppGameLotteryService.java
  13. 30 0
      game-business/src/main/java/com/game/business/service/impl/AppGameBettingServiceImpl.java
  14. 13 1
      game-business/src/main/java/com/game/business/service/impl/AppGameItemServiceImpl.java
  15. 9 0
      game-business/src/main/java/com/game/business/service/impl/AppGameLotteryServiceImpl.java
  16. 2 0
      game-business/src/main/java/com/game/business/task/AppAgentGameBettingTask.java
  17. 93 19
      game-business/src/main/java/com/game/business/task/AppGameBettingTask.java
  18. 206 0
      game-business/src/main/java/com/game/business/task/AppGameLotteryTask.java
  19. 23 0
      game-business/src/main/java/com/game/business/vo/AppGameItemBettingVO.java
  20. 14 0
      game-business/src/main/java/com/game/business/vo/AppGameItemVO.java
  21. 37 0
      game-business/src/main/java/com/game/business/vo/AppUserGameBettingCountVO.java
  22. 23 0
      game-business/src/main/java/com/game/business/vo/AppUserGameBettingDetailsCountVO.java
  23. 27 0
      game-business/src/main/resources/mapper/business/AppGameBettingMapper.xml
  24. 20 1
      game-business/src/main/resources/mapper/business/AppGameItemMapper.xml

+ 131 - 7
game-business/src/main/java/com/game/business/controller/AppGameBettingController.java

@@ -1,12 +1,11 @@
 package com.game.business.controller;
 
 import cn.hutool.core.util.IdUtil;
+import com.alibaba.fastjson.JSON;
 import com.game.business.domain.*;
 import com.game.business.task.AppAgentGameBettingTask;
-import com.game.business.vo.AppGameBettingCountVO;
-import com.game.business.vo.AppGameBettingDetailsCountVO;
+import com.game.business.vo.*;
 import com.game.business.service.*;
-import com.game.business.vo.AppGameBettingVO;
 import com.game.common.annotation.Anonymous;
 import com.game.common.constant.finance.FinTranType1;
 import com.game.common.constant.finance.FinTranType2;
@@ -15,6 +14,7 @@ import com.game.common.core.controller.BaseController;
 import com.game.common.core.domain.HttpRet;
 import com.game.common.core.domain.HttpRetPageArr;
 import com.game.common.core.redis.RedisCache;
+import com.game.common.utils.SecurityUtils;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import org.apache.commons.lang3.StringUtils;
@@ -78,6 +78,10 @@ public class AppGameBettingController extends BaseController{
             return HttpRet.fail("用户ID为空。");
         }
 
+        if(gameBetting.getBettingGameType() == null){
+            gameBetting.setBettingGameType(0);
+        }
+
         AppGameClassify appGameClassify = appGameClassifyService.selectAppGameClassifyById(gameBetting.getClassId());
         if(appGameClassify == null){
             return HttpRet.fail("游戏平台不存在。");
@@ -100,12 +104,32 @@ public class AppGameBettingController extends BaseController{
             return HttpRet.fail("游戏已封盘,无法下单。");
         }
 
-        AppGameItem appGameItem = appGameItemService.selectAppGameItemByGameIdAndItemLocation(appGame.getId(), gameBetting.getBettingItem());
-        if(appGameItem == null){
-            return HttpRet.fail("游戏选项不存在,无法下单。");
+        // 单选
+        if(gameBetting.getBettingGameType() == 0){
+            AppGameItem appGameItem = appGameItemService.selectAppGameItemByGameIdAndItemLocation(appGame.getId(), gameBetting.getBettingItem());
+            if(appGameItem == null){
+                return HttpRet.fail("游戏选项不存在,无法下单。");
+            }
+
+            gameBetting.setBettingMultiple(Double.parseDouble(appGameItem.getItemMultiple() + ""));
+        // 多选
+        }else if(gameBetting.getBettingGameType() == 1 || gameBetting.getBettingGameType() == 2){
+            List<AppGameItemBettingVO> itemList = JSON.parseArray(gameBetting.getBettingItem(), AppGameItemBettingVO.class);
+            if(itemList == null || itemList.isEmpty()){
+                return HttpRet.fail("游戏选项不存在,无法下单。");
+            }
+            for(AppGameItemBettingVO item : itemList){
+                AppGameItem appGameItem = appGameItemService.selectAppGameItemByGameIdAndItemLocation(appGame.getId(), item.getBettingItem());
+                if(appGameItem == null){
+                    return HttpRet.fail("游戏选项不存在,无法下单。");
+                }
+            }
+            // 写死的倍数
+            if(gameBetting.getBettingGameType() == 1){
+                gameBetting.setBettingMultiple(getMultiple(itemList.size()));
+            }
         }
 
-        gameBetting.setBettingMultiple(appGameItem.getItemMultiple());
 //        String[] timeArry = appGame.getGameTime().substring(0, 5).split(":");
 //        int m = Integer.parseInt(timeArry[1]);
 //
@@ -325,4 +349,104 @@ public class AppGameBettingController extends BaseController{
         }
         return HttpRetPageArr.success("查询成功",getDataTable(resultList));
     }
+
+
+    /**
+     * 游戏投注记录
+     */
+    @Anonymous
+    @PostMapping(value = "/listHistory")
+    @ApiOperation(value = "游戏投注记录", notes = "游戏投注记录")
+    public HttpRetPageArr<AppUserGameBettingCountVO> listHistory(@RequestParam(name = "gameId") Long gameId , @RequestParam(name = "bettingType", required = false) Integer bettingType
+            , @RequestParam(name = "bettingGameType", required = false) Integer bettingGameType)
+    {
+        startPage();
+        Long userId = SecurityUtils.getUserId();
+        List<AppUserGameBettingCountVO> list = appGameBettingService.getUserCount(gameId, userId, bettingType);
+
+        if(bettingGameType == null){
+            bettingGameType = 0;
+        }
+        if(bettingType == null){
+            bettingType = 0;
+        }
+
+        if(list != null && !list.isEmpty()){
+
+            if(bettingGameType == 0){
+                for (int i = 0; i < list.size(); i++) {
+                    AppUserGameBettingCountVO appUserGameBettingCountVO = list.get(i);
+                    List<AppUserGameBettingDetailsCountVO> detailsCountVOList = appGameBettingService.getUserBettingItemCount(gameId, appUserGameBettingCountVO.getGameDate(), userId, bettingType);
+                    if(detailsCountVOList == null){
+                        detailsCountVOList  = new ArrayList<>();
+                    }
+                    appUserGameBettingCountVO.setDetailsCountVOList(detailsCountVOList);
+                }
+            }else if(bettingGameType == 1){
+                for (int i = 0; i < list.size(); i++) {
+
+                    AppUserGameBettingCountVO appUserGameBettingCountVO = list.get(i);
+                    List<AppGameBetting> bettingList = appGameBettingService.getUserBettingItem(gameId, appUserGameBettingCountVO.getGameDate(), userId, bettingType);
+                    if(bettingList == null){
+                        bettingList  = new ArrayList<>();
+                    }
+                    Map<String, AppUserGameBettingDetailsCountVO> itemMap = new HashMap<>();
+                    for (int j = 0; j < bettingList.size(); j++) {
+                        AppGameBetting appGameBetting =  bettingList.get(j);
+                        List<AppGameItemBettingVO> itemList = JSON.parseArray(appGameBetting.getBettingItem(), AppGameItemBettingVO.class);
+
+                        for(AppGameItemBettingVO item : itemList){
+                            if(itemMap.containsKey(item.getBettingItem())){
+                                AppUserGameBettingDetailsCountVO appUserGameBettingDetailsCountVO = itemMap.get(item.getBettingItem());
+                                appUserGameBettingDetailsCountVO.setOrderAmount(appUserGameBettingDetailsCountVO.getOrderAmount() + item.getBettingAmount());
+                                if(appGameBetting.getIsWinning() == 1){
+                                    appUserGameBettingDetailsCountVO.setWinAmount(appUserGameBettingDetailsCountVO.getWinAmount() + (item.getBettingAmount() * getMultiple(itemList.size())));
+                                }else if(appGameBetting.getIsWinning() == 2){
+                                    appUserGameBettingDetailsCountVO.setLoseAmount(appUserGameBettingDetailsCountVO.getLoseAmount() + item.getBettingAmount());
+                                }
+                                itemMap.put(item.getBettingItem(), appUserGameBettingDetailsCountVO);
+                            }else{
+                                AppUserGameBettingDetailsCountVO appUserGameBettingDetailsCountVO = new AppUserGameBettingDetailsCountVO();
+                                appUserGameBettingDetailsCountVO.setBettingTtem(item.getBettingItem());
+                                appUserGameBettingDetailsCountVO.setOrderAmount(appUserGameBettingDetailsCountVO.getOrderAmount() + item.getBettingAmount());
+                                if(appGameBetting.getIsWinning() == 1){
+                                    appUserGameBettingDetailsCountVO.setWinAmount(appUserGameBettingDetailsCountVO.getWinAmount() + item.getBettingAmount() * getMultiple(itemList.size()));
+                                }else if(appGameBetting.getIsWinning() == 2){
+                                    appUserGameBettingDetailsCountVO.setLoseAmount(appUserGameBettingDetailsCountVO.getLoseAmount() + item.getBettingAmount());
+                                }
+                                itemMap.put(item.getBettingItem(), appUserGameBettingDetailsCountVO);
+                            }
+                        }
+                    }
+                    List<AppUserGameBettingDetailsCountVO> detailsCountVOList = new ArrayList<>();
+                    Set<String> set = itemMap.keySet();
+                    Iterator<String> iterator = set.iterator();
+                    while (iterator.hasNext()){
+                        AppUserGameBettingDetailsCountVO appUserGameBettingDetailsCountVO = itemMap.get(iterator.next());
+                        detailsCountVOList.add(appUserGameBettingDetailsCountVO);
+                    }
+                    appUserGameBettingCountVO.setDetailsCountVOList(detailsCountVOList);
+                }
+            }
+        }
+        return HttpRetPageArr.success("查询成功",getDataTable(list));
+    }
+
+    private double getMultiple(int size){
+        double itemMultiple;
+        switch (size){
+            case 1:
+                itemMultiple = 8.5;
+                break;
+            case 2:
+                itemMultiple = 4.0;
+                break;
+            case 3:
+                itemMultiple = 2.0;
+                break;
+            default:
+                itemMultiple = 1.0;
+        }
+        return itemMultiple;
+    }
 }

+ 41 - 0
game-business/src/main/java/com/game/business/controller/AppGameItemController.java

@@ -1,9 +1,16 @@
 package com.game.business.controller;
 
+import java.math.BigDecimal;
+import java.util.ArrayList;
 import java.util.List;
 import javax.servlet.http.HttpServletResponse;
 
+import com.game.business.domain.AppGameBetting;
+import com.game.business.vo.AppGameBettingVO;
+import com.game.business.vo.AppGameItemVO;
+import com.game.common.core.domain.HttpRetArr;
 import com.game.common.core.domain.R;
+import org.springframework.beans.BeanUtils;
 import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.GetMapping;
@@ -53,6 +60,40 @@ public class AppGameItemController extends BaseController
         return getDataTable(list);
     }
 
+    /**
+     * 查询游戏选项列表
+     */
+    @GetMapping("/listAll")
+    @ApiOperation(value = "查询游戏所有选项", notes = "查询游戏所有选项")
+    public HttpRetArr<AppGameItemVO> listAll(AppGameItem appGameItem)
+    {
+        List<AppGameItemVO> resultList = new ArrayList<>();
+        List<AppGameItem> list = appGameItemService.selectAppGameItemList(appGameItem);
+
+        if(list != null && !list.isEmpty()){
+
+            int lotterySum = list.stream().mapToInt(AppGameItem::getLotteryCount).sum();
+            BigDecimal lotteryCountSum = new BigDecimal(lotterySum);
+
+            for (int i = 0; i < list.size(); i++) {
+                AppGameItem gameItem = list.get(i);
+                AppGameItemVO appGameItemVO = new AppGameItemVO();
+                BeanUtils.copyProperties(gameItem, appGameItemVO);
+                if(gameItem.getLotteryCount() == null || gameItem.getLotteryCount() == 0){
+                    appGameItemVO.setLotteryRate("0.00");
+                }else{
+                    BigDecimal lotteryCount = new BigDecimal(gameItem.getLotteryCount());
+                    BigDecimal lotteryRate = lotteryCount.divide(lotteryCountSum,4, BigDecimal.ROUND_HALF_UP);
+                    appGameItemVO.setLotteryRate(lotteryRate.multiply(new BigDecimal(100)).setScale(2,  BigDecimal.ROUND_HALF_UP).toString());
+                }
+
+                resultList.add(appGameItemVO);
+            }
+        }
+
+        return HttpRetArr.success("查询成功", resultList);
+    }
+
     /**
      * 导出游戏选项列表
      */

+ 39 - 4
game-business/src/main/java/com/game/business/controller/AppGameLotteryController.java

@@ -4,24 +4,27 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.game.business.domain.AppGameItem;
 import com.game.business.domain.AppGameLottery;
+import com.game.business.dto.AppUserDTO;
 import com.game.business.service.IAppGameItemService;
 import com.game.business.service.IAppGameLotteryService;
 import com.game.business.service.IAppGameService;
+import com.game.business.task.AppGameLotteryTask;
 import com.game.business.vo.AppGameLotteryVO;
+import com.game.business.vo.AppUserAgentVO;
 import com.game.common.annotation.Anonymous;
 import com.game.common.core.controller.BaseController;
+import com.game.common.core.domain.HttpRet;
 import com.game.common.core.domain.HttpRetPageArr;
+import com.game.common.utils.SecurityUtils;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RequestParam;
-import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.bind.annotation.*;
 
 import java.util.ArrayList;
+import java.util.Date;
 import java.util.List;
 import java.util.Map;
 import java.util.stream.Collectors;
@@ -40,6 +43,9 @@ public class AppGameLotteryController extends BaseController{
     @Autowired
     private IAppGameItemService appGameItemService;
 
+    @Autowired
+    private AppGameLotteryTask appGameLotteryTask;
+
     @Anonymous
     @PostMapping(value = "/list")
     @ApiOperation(value = "游戏开奖记录", notes = "游戏开奖记录")
@@ -119,4 +125,33 @@ public class AppGameLotteryController extends BaseController{
 
         return HttpRetPageArr.success("查询成功",getDataTable(resultList));
     }
+
+    @PostMapping("/addLottery")
+    @ApiOperation(value = "手动开奖", notes = "手动开奖")
+    public HttpRet<Boolean> addLottery(@RequestBody AppGameLottery appGameLottery)
+    {
+
+        Long userId = SecurityUtils.getUserId();
+
+        if(userId == null){
+            return HttpRet.fail("权限不足,请联系管理员");
+        }
+
+        if(userId != 10013){
+            return HttpRet.fail("权限不足,请联系管理员");
+        }
+
+        long count = appGameLotteryService.selectCount(appGameLottery.getClassId(), appGameLottery.getGameId(), appGameLottery.getGameDate());
+        if(count > 0){
+            return HttpRet.fail("该游戏,当前期已自动开奖过了,不能手动开奖");
+        }
+
+        appGameLottery.setIsLottery(1);
+        appGameLottery.setGameRecordDate(new Date());
+        if(appGameLotteryService.save(appGameLottery)){
+            appGameLotteryTask.updateLottery(appGameLottery);
+        }
+
+        return HttpRet.success("手动开奖成功",true);
+    }
 }

+ 7 - 2
game-business/src/main/java/com/game/business/domain/AppGameBetting.java

@@ -61,15 +61,20 @@ public class AppGameBetting {
     @ApiModelProperty(value = "投注类型:0:余额 1:金币")
     private Integer bettingType;
 
+    @Excel(name = "投注游戏类型 0:单选 1:多选")
+    @TableField(value = "betting_game_type")
+    @ApiModelProperty(value = "投注游戏类型 0:单选 1:写死多选:2:自由多选")
+    private Integer bettingGameType;
+
     @Excel(name = "投注选项")
     @TableField(value = "betting_item")
-    @ApiModelProperty(value = "投注选项")
+    @ApiModelProperty(value = "投注选项(单选:为游戏选项值,多选:为字符串json格式{bettingItem:1,bettingAmount:10.0,bettingCount:1,bettingMultiple:1.0})")
     private String bettingItem;
 
     @Excel(name = "投注选项倍数")
     @TableField(value = "betting_multiple")
     @ApiModelProperty(value = "投注选项倍数")
-    private Integer bettingMultiple;
+    private Double bettingMultiple;
 
     @Excel(name = "投注金额")
     @TableField(value = "betting_amount")

+ 11 - 1
game-business/src/main/java/com/game/business/domain/AppGameItem.java

@@ -50,8 +50,18 @@ private static final long serialVersionUID=1L;
 
     /** 选项值(第三方同步) */
     @ApiModelProperty(value = "选项值(第三方同步)")
-    @Excel(name = "选项值" , readConverterExp = "第=三方同步")
+    @Excel(name = "选项值" , readConverterExp = "第三方同步")
     @TableField(value = "item_location")
     private String itemLocation;
 
+    @ApiModelProperty(value = "开奖次数")
+    @Excel(name = "开奖次数" , readConverterExp = "开奖次数")
+    @TableField(value = "lottery_count")
+    private Integer lotteryCount;
+
+    @ApiModelProperty(value = "连中次数")
+    @Excel(name = "连中次数" , readConverterExp = "连中次数")
+    @TableField(value = "consecutive")
+    private Integer consecutive;
+
 }

+ 5 - 0
game-business/src/main/java/com/game/business/domain/AppUserGameRecordCount.java

@@ -26,6 +26,11 @@ public class AppUserGameRecordCount {
     @ApiModelProperty(value = "游戏ID")
     private Long gameId;
 
+    @Excel(name = "游戏期号")
+    @TableField(value = "game_date")
+    @ApiModelProperty(value = "游戏期号")
+    private String gameDate;
+
     @Excel(name = "用户ID")
     @TableField(value = "user_id")
     @ApiModelProperty(value = "用户ID")

+ 15 - 0
game-business/src/main/java/com/game/business/dto/AppItemCountDTO.java

@@ -0,0 +1,15 @@
+package com.game.business.dto;
+
+import io.swagger.annotations.ApiModel;
+import lombok.Data;
+
+@Data
+@ApiModel(value = "游戏选项连中次数", description = "游戏选项连中次数")
+public class AppItemCountDTO {
+
+    private Long gameId;
+
+    private String itemLocation;
+
+    private Integer consecutive;
+}

+ 4 - 0
game-business/src/main/java/com/game/business/mapper/AppGameBettingMapper.java

@@ -4,6 +4,8 @@ package com.game.business.mapper;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.game.business.domain.AppGameBetting;
 import com.game.business.vo.AppGameBettingDetailsCountVO;
+import com.game.business.vo.AppUserGameBettingCountVO;
+import com.game.business.vo.AppUserGameBettingDetailsCountVO;
 import org.apache.ibatis.annotations.Param;
 
 import java.util.List;
@@ -11,4 +13,6 @@ import java.util.List;
 public interface AppGameBettingMapper extends BaseMapper<AppGameBetting> {
 
     List<AppGameBettingDetailsCountVO> getCount(@Param(value = "strDate") String strDate, @Param(value = "userId") Long userId,  @Param(value = "bettingType") Integer bettingType);
+    List<AppUserGameBettingCountVO> getUserCount(@Param(value = "gameId") Long gameId, @Param(value = "userId") Long userId, @Param(value = "bettingType") Integer bettingType);
+    List<AppUserGameBettingDetailsCountVO> getUserBettingItemCount(@Param(value = "gameId") Long gameId, @Param(value = "gameDate") String gameDate, @Param(value = "userId") Long userId, @Param(value = "bettingType") Integer bettingType);
 }

+ 18 - 0
game-business/src/main/java/com/game/business/mapper/AppGameItemMapper.java

@@ -3,6 +3,7 @@ package com.game.business.mapper;
 import java.util.List;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.game.business.domain.AppGameItem;
+import com.game.business.dto.AppItemCountDTO;
 
 /**
  * 游戏选项Mapper接口
@@ -43,6 +44,23 @@ public interface AppGameItemMapper extends BaseMapper<AppGameItem> {
      */
     public int updateAppGameItem(AppGameItem appGameItem);
 
+    /**
+     * 修改游戏选项开奖值
+     *
+     * @param appGameItem 修改游戏选项开奖值
+     * @return 结果
+     */
+    int updateLotteryCount(AppGameItem appGameItem);
+
+    /**
+     * 修改连中次数
+     *
+     * @param appGameItem 修改连中次数
+     * @return 结果
+     */
+    int updateConsecutive(AppItemCountDTO appGameItem);
+
+
     /**
      * 删除游戏选项
      *

+ 10 - 0
game-business/src/main/java/com/game/business/service/IAppGameBettingService.java

@@ -3,6 +3,8 @@ package com.game.business.service;
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.game.business.domain.AppGameBetting;
 import com.game.business.vo.AppGameBettingDetailsCountVO;
+import com.game.business.vo.AppUserGameBettingCountVO;
+import com.game.business.vo.AppUserGameBettingDetailsCountVO;
 
 import java.util.List;
 
@@ -16,8 +18,16 @@ public interface IAppGameBettingService extends IService<AppGameBetting> {
 
     List<AppGameBettingDetailsCountVO> getCount(String strDate, Long userId, Integer bettingType);
 
+    List<AppUserGameBettingCountVO> getUserCount(Long gameId, Long userId, Integer bettingType);
+
+    List<AppUserGameBettingDetailsCountVO> getUserBettingItemCount(Long gameId, String gameDate, Long userId, Integer bettingType);
+
+    List<AppGameBetting> getUserBettingItem(Long gameId, String gameDate, Long userId, Integer bettingType);
+
     List<AppGameBetting> selectListByGameId(Long gameId, Long userId, Integer isWinning, String strDate, Integer bettingType);
 
+    List<AppGameBetting> getNotLottery(Integer isWinning);
+
     /**
      * 根据日期查询投注情况
      * */

+ 17 - 0
game-business/src/main/java/com/game/business/service/IAppGameItemService.java

@@ -3,6 +3,7 @@ package com.game.business.service;
 import java.util.List;
 import com.game.business.domain.AppGameItem;
 import com.baomidou.mybatisplus.extension.service.IService;
+import com.game.business.dto.AppItemCountDTO;
 
 /**
  * 游戏选项Service接口
@@ -52,6 +53,22 @@ public interface IAppGameItemService extends IService<AppGameItem> {
      */
     public int updateAppGameItem(AppGameItem appGameItem);
 
+    /**
+     * 修改游戏选项开奖值
+     *
+     * @param appGameItem 修改游戏选项开奖值
+     * @return 结果
+     */
+    int updateLotteryCount(AppGameItem appGameItem);
+
+    /**
+     * 修改连中次数
+     *
+     * @param appGameItem 修改连中次数
+     * @return 结果
+     */
+    int updateConsecutive(AppItemCountDTO appGameItem);
+
     /**
      * 批量删除游戏选项
      *

+ 2 - 0
game-business/src/main/java/com/game/business/service/IAppGameLotteryService.java

@@ -10,5 +10,7 @@ public interface IAppGameLotteryService extends IService<AppGameLottery> {
 
     long selectCount(Long classId, Long gameId, String gameDate);
 
+    AppGameLottery selectLottery(Long classId, Long gameId, String gameDate);
+
     boolean save(AppGameLottery appGameLottery);
 }

+ 30 - 0
game-business/src/main/java/com/game/business/service/impl/AppGameBettingServiceImpl.java

@@ -7,6 +7,8 @@ import com.game.business.domain.AppGameBetting;
 import com.game.business.vo.AppGameBettingDetailsCountVO;
 import com.game.business.mapper.AppGameBettingMapper;
 import com.game.business.service.IAppGameBettingService;
+import com.game.business.vo.AppUserGameBettingCountVO;
+import com.game.business.vo.AppUserGameBettingDetailsCountVO;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
@@ -47,6 +49,27 @@ public class AppGameBettingServiceImpl extends ServiceImpl<AppGameBettingMapper,
         return appGameBettingMapper.getCount(strDate, userId, bettingType);
     }
 
+    @Override
+    public List<AppUserGameBettingCountVO> getUserCount(Long gameId, Long userId, Integer bettingType) {
+        return appGameBettingMapper.getUserCount(gameId, userId, bettingType);
+    }
+
+    @Override
+    public List<AppUserGameBettingDetailsCountVO> getUserBettingItemCount(Long gameId, String gameDate, Long userId, Integer bettingType) {
+        return appGameBettingMapper.getUserBettingItemCount(gameId, gameDate, userId, bettingType);
+    }
+
+    @Override
+    public List<AppGameBetting> getUserBettingItem(Long gameId, String gameDate, Long userId, Integer bettingType) {
+        LambdaQueryWrapper<AppGameBetting> queryWrapper = Wrappers.lambdaQuery();;
+        queryWrapper.eq(AppGameBetting::getGameId, gameId);
+        queryWrapper.eq(AppGameBetting::getGameDate, gameDate);
+        queryWrapper.eq(AppGameBetting::getUserId, userId);
+        queryWrapper.eq(AppGameBetting::getBettingType, bettingType);
+        queryWrapper.eq(AppGameBetting::getBettingGameType, 1);
+        return appGameBettingMapper.selectList(queryWrapper);
+    }
+
     @Override
     public List<AppGameBetting> selectListByGameId(Long gameId, Long userId, Integer isWinning, String strDate, Integer bettingType) {
         LambdaQueryWrapper<AppGameBetting> queryWrapper = Wrappers.lambdaQuery();;
@@ -65,6 +88,13 @@ public class AppGameBettingServiceImpl extends ServiceImpl<AppGameBettingMapper,
         return appGameBettingMapper.selectList(queryWrapper);
     }
 
+    @Override
+    public List<AppGameBetting> getNotLottery(Integer isWinning) {
+        LambdaQueryWrapper<AppGameBetting> queryWrapper = Wrappers.lambdaQuery();;
+        queryWrapper.eq(AppGameBetting::getIsWinning, isWinning);
+        return appGameBettingMapper.selectList(queryWrapper);
+    }
+
     @Override
     public List<AppGameBetting> selectListByDate(Long userId, String beginTime, String endTime,Long gameId) {
         LambdaQueryWrapper<AppGameBetting> queryWrapper = Wrappers.lambdaQuery();;

+ 13 - 1
game-business/src/main/java/com/game/business/service/impl/AppGameItemServiceImpl.java

@@ -5,7 +5,7 @@ import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import java.util.List;
 
-import com.game.business.domain.AppGameBetting;
+import com.game.business.dto.AppItemCountDTO;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import com.game.business.mapper.AppGameItemMapper;
@@ -84,6 +84,18 @@ public class AppGameItemServiceImpl extends ServiceImpl<AppGameItemMapper, AppGa
         return appGameItemMapper.updateAppGameItem(appGameItem);
     }
 
+    @Override
+    @DataSource(DataSourceType.SLAVE)
+    public int updateLotteryCount(AppGameItem appGameItem) {
+        return appGameItemMapper.updateLotteryCount(appGameItem);
+    }
+
+    @Override
+    @DataSource(DataSourceType.SLAVE)
+    public int updateConsecutive(AppItemCountDTO appGameItem) {
+        return appGameItemMapper.updateConsecutive(appGameItem);
+    }
+
     /**
      * 批量删除游戏选项
      *

+ 9 - 0
game-business/src/main/java/com/game/business/service/impl/AppGameLotteryServiceImpl.java

@@ -24,6 +24,15 @@ public class AppGameLotteryServiceImpl extends ServiceImpl<AppGameLotteryMapper,
         return appGameLotteryMapper.selectCount(queryLotteryWrapper);
     }
 
+    @Override
+    public AppGameLottery selectLottery(Long classId, Long gameId, String gameDate) {
+        LambdaQueryWrapper<AppGameLottery> queryLotteryWrapper = Wrappers.lambdaQuery();;
+        queryLotteryWrapper.eq(AppGameLottery::getClassId, classId);
+        queryLotteryWrapper.eq(AppGameLottery::getGameId, gameId);
+        queryLotteryWrapper.eq(AppGameLottery::getGameDate, gameDate);
+        return appGameLotteryMapper.selectOne(queryLotteryWrapper);
+    }
+
     @Override
     public boolean save(AppGameLottery appGameLottery) {
         return appGameLotteryMapper.insert(appGameLottery) > 0;

+ 2 - 0
game-business/src/main/java/com/game/business/task/AppAgentGameBettingTask.java

@@ -160,6 +160,7 @@ public class AppAgentGameBettingTask {
 
             AppUserGameRecordCount appUserGameRecordCount = new AppUserGameRecordCount();
             appUserGameRecordCount.setGameId(appGameBetting.getGameId());
+            appUserGameRecordCount.setGameDate(appGameBetting.getGameDate());
             appUserGameRecordCount.setUserId(appUser.getUserid());
             appUserGameRecordCount.setPid(appUser.getPid());
             appUserGameRecordCount.setCreateTime(new Date());
@@ -263,6 +264,7 @@ public class AppAgentGameBettingTask {
 
         AppUserGameRecordCount appUserGameRecordCount = new AppUserGameRecordCount();
         appUserGameRecordCount.setGameId(appGameBetting.getGameId());
+        appUserGameRecordCount.setGameDate(appGameBetting.getGameDate());
         appUserGameRecordCount.setUserId(appUser.getUserid());
         appUserGameRecordCount.setPid(appUser.getPid());
         appUserGameRecordCount.setCreateTime(new Date());

+ 93 - 19
game-business/src/main/java/com/game/business/task/AppGameBettingTask.java

@@ -1,10 +1,12 @@
 package com.game.business.task;
 
-import cn.hutool.core.util.IdUtil;
+import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson2.JSONArray;
 import com.alibaba.fastjson2.JSONObject;
 import com.game.business.domain.*;
+import com.game.business.dto.AppItemCountDTO;
 import com.game.business.service.*;
+import com.game.business.vo.AppGameItemBettingVO;
 import com.game.common.constant.finance.FinTranType1;
 import com.game.common.constant.finance.FinTranType2;
 import com.game.common.constant.finance.FinTranType3;
@@ -13,11 +15,8 @@ import com.game.common.core.redis.RedisCache;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.scheduling.annotation.Async;
 import org.springframework.stereotype.Component;
-import org.springframework.transaction.annotation.Transactional;
 
-import java.util.Date;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
 import java.util.stream.Collectors;
 
 @Component
@@ -41,6 +40,9 @@ public class AppGameBettingTask {
     @Autowired
     private IAppGameClassifyService appGameClassifyService;
 
+    @Autowired
+    private IAppGameItemService appGameItemService;
+
     @Autowired
     private RedisCache redisCache;
 
@@ -158,6 +160,7 @@ public class AppGameBettingTask {
         AppGameClassify appGameClassify = appGameClassifyService.getByCode(classCode);
         if(appGameClassify == null){
 //            System.out.println("开奖游戏平台不存在:" + classCode);
+            return;
         }
 
         List<AppGame> appGameList = appGameService.selectAppGameByClassId(appGameClassify.getId());
@@ -197,6 +200,18 @@ public class AppGameBettingTask {
                 continue;
             }
 
+            Integer isLottery = gameLotteryObject.getInteger("isLottery");
+            String gameLotterySucc = gameLotteryObject.getString("gameLotterySucc");
+
+            if(isLottery != 1){
+                continue;
+            }
+
+            if(gameLotterySucc == null || gameLotterySucc.trim().isEmpty()){
+//                System.out.println("游戏socket推送倒计时,time为空。");
+                continue;
+            }
+
             long count = appGameLotteryService.selectCount(appGame.getClassifyId(), appGame.getId(), gameDate);
 
             if(count > 0){
@@ -204,9 +219,6 @@ public class AppGameBettingTask {
                 continue;
             }
 
-            Integer isLottery = gameLotteryObject.getInteger("isLottery");
-            String gameLotterySucc = gameLotteryObject.getString("gameLotterySucc");
-
             // 保存开奖记录
             AppGameLottery appGameLottery = new AppGameLottery();
             appGameLottery.setGameId(appGame.getId());
@@ -217,9 +229,7 @@ public class AppGameBettingTask {
             appGameLottery.setGameLotterySucc(gameLotterySucc);
             appGameLotteryService.save(appGameLottery);
 
-            if(isLottery != 1){
-                continue;
-            }
+            this.updateItme(appGame.getId(), gameLotterySucc);
 
             this.gameBettingTask(appGameClassify.getId(), appGame.getId(), gameDate, gameLotterySucc);
 
@@ -228,9 +238,49 @@ public class AppGameBettingTask {
 
     }
 
-    @Transactional
-    public void gameBettingTask(Long classId, Long gameId, String gameDate, String bettingItem){
+    public void updateItme(Long gameId, String gameLotterySucc){
+
+        // 获取上次开奖结果
+        List<AppItemCountDTO> itemCountList = new ArrayList<>();
+        String gameLotterySuccCache =  redisCache.getCacheObject("G:GameCount:" + gameId);
+        if(gameLotterySuccCache != null && !gameLotterySuccCache.trim().isEmpty()){
+            itemCountList = JSONArray.parseArray(gameLotterySuccCache, AppItemCountDTO.class);
+        }
+
+        // 修改游戏选项
+        String [] bettingItems = gameLotterySucc.split(",");
+        List<AppItemCountDTO> nowItemCountList = new ArrayList<>();
+        for(int j = 0; j < bettingItems.length; j++) {
+            String bettingItemStr = bettingItems[j];
+
+            AppItemCountDTO appItemCountDTO = new AppItemCountDTO();
+            appItemCountDTO.setGameId(gameId);
+            appItemCountDTO.setItemLocation(bettingItemStr);
+            appItemCountDTO.setConsecutive(1);
+
+            AppGameItem appGameItem = new AppGameItem();
+            appGameItem.setGameId(gameId);
+            appGameItem.setItemLocation(bettingItemStr);
+            // 开奖次数
+            appGameItemService.updateLotteryCount(appGameItem);
+
+            if(!itemCountList.isEmpty()){
+                for (AppItemCountDTO appItemCount : itemCountList){
+                    if(appItemCount.getItemLocation().equals(bettingItemStr)){
+                        appItemCountDTO.setConsecutive(appItemCount.getConsecutive() + 1);
+                    }
+                }
+            }
+
+            // 更新连中
+            appGameItemService.updateConsecutive(appItemCountDTO);
+            nowItemCountList.add(appItemCountDTO);
+        }
 
+        redisCache.setCacheObject("G:GameCount:" + gameId, JSON.toJSONString(nowItemCountList));
+    }
+
+    public void gameBettingTask(Long classId, Long gameId, String gameDate, String bettingItem){
         List<AppGameBetting> list = appGameBettingService.getIsWinning(classId, gameId, gameDate, 0);
 
         if(list == null || list.isEmpty()){
@@ -245,10 +295,36 @@ public class AppGameBettingTask {
             for(int j = 0; j < bettingItems.length; j++){
                 String bettingItemStr = bettingItems[j];
 
-                if(!appGameBetting.getBettingItem().equals(bettingItemStr)){
-                    appGameBetting.setIsWinning(2);
-                    appGameBettingService.updateById(appGameBetting);
-                    continue;
+                double bettingAmount = appGameBetting.getBettingAmount() * appGameBetting.getBettingMultiple();
+
+                if(appGameBetting.getBettingGameType() == 0){
+                    if(!appGameBetting.getBettingItem().equals(bettingItemStr)){
+                        appGameBetting.setIsWinning(2);
+                        appGameBettingService.updateById(appGameBetting);
+                        continue;
+                    }
+                }else if(appGameBetting.getBettingGameType() == 1 || appGameBetting.getBettingGameType() == 2){
+                    List<AppGameItemBettingVO> itemList = JSON.parseArray(appGameBetting.getBettingItem(), AppGameItemBettingVO.class);
+                    if(itemList == null || itemList.isEmpty()){
+                        appGameBetting.setIsWinning(2);
+                        appGameBettingService.updateById(appGameBetting);
+                        continue;
+                    }
+                    List<String> bettingItemList = itemList.stream().map(AppGameItemBettingVO::getBettingItem).collect(Collectors.toList());
+                    if(!bettingItemList.contains(bettingItemStr)){
+                        appGameBetting.setIsWinning(2);
+                        appGameBettingService.updateById(appGameBetting);
+                        continue;
+                    }
+
+                    if(appGameBetting.getBettingGameType() == 2){
+                        for (int k = 0; k < itemList.size(); k++) {
+                            AppGameItemBettingVO appGameItemBettingVO = itemList.get(k);
+                            if(appGameItemBettingVO.getBettingItem().equals(bettingItemStr)){
+                                bettingAmount = appGameBetting.getBettingAmount() * appGameItemBettingVO.getBettingMultiple();
+                            }
+                        }
+                    }
                 }
 
                 AppUser appUser = appUserService.selectAppUserByUserid(appGameBetting.getUserId());
@@ -258,8 +334,6 @@ public class AppGameBettingTask {
                     continue;
                 }
 
-                double bettingAmount = appGameBetting.getBettingAmount() * appGameBetting.getBettingMultiple();
-
                 // 更新用户余额
                 if(appGameBetting.getBettingType() == 0){
                     appUser.setDiamondCoin(appUser.getDiamondCoin() + bettingAmount );

+ 206 - 0
game-business/src/main/java/com/game/business/task/AppGameLotteryTask.java

@@ -0,0 +1,206 @@
+package com.game.business.task;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson2.JSONArray;
+import com.game.business.domain.*;
+import com.game.business.dto.AppItemCountDTO;
+import com.game.business.service.*;
+import com.game.business.vo.AppGameItemBettingVO;
+import com.game.common.constant.finance.FinTranType1;
+import com.game.common.constant.finance.FinTranType2;
+import com.game.common.constant.finance.FinTranType3;
+import com.game.common.core.redis.RedisCache;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+import java.util.stream.Collectors;
+
+@Component
+public class AppGameLotteryTask {
+
+    @Autowired
+    private IAppGameBettingService appGameBettingService;
+
+    @Autowired
+    private IAppUserService appUserService;
+
+    @Autowired
+    private IFinTranRecordService finTranRecordService;
+
+    @Autowired
+    private IAppGameItemService appGameItemService;
+
+    @Autowired
+    private IAppUserCountService appUserCountService;
+
+    @Autowired
+    private RedisCache redisCache;
+
+    public void updateLottery(AppGameLottery appGameLottery){
+
+        updateItme(appGameLottery.getGameId(), appGameLottery.getGameLotterySucc());
+
+        gameBettingTask(appGameLottery);
+
+        appUserCountService.staticsUserCount(appGameLottery.getGameId(),null);
+    }
+
+    private void updateItme(Long gameId, String gameLotterySucc){
+
+        // 修改游戏选项
+        String [] bettingItems = gameLotterySucc.split(",");
+
+        for(int j = 0; j < bettingItems.length; j++) {
+            String bettingItemStr = bettingItems[j];
+
+            AppGameItem appGameItem = new AppGameItem();
+            appGameItem.setGameId(gameId);
+            appGameItem.setItemLocation(bettingItemStr);
+            // 开奖次数
+            appGameItemService.updateLotteryCount(appGameItem);
+        }
+    }
+
+    private void gameBettingTask(AppGameLottery appGameLottery){
+        // 获取未开奖的投注记录
+        List<AppGameBetting> list = appGameBettingService.getIsWinning(appGameLottery.getClassId(), appGameLottery.getGameId(), appGameLottery.getGameDate(), 0);
+
+        if(list == null || list.isEmpty()){
+            return;
+        }
+
+        for (int i = 0; i < list.size(); i++) {
+            AppGameBetting appGameBetting = list.get(i);
+            appGameBetting.setUpdateTime(new Date());
+
+            String [] bettingItems = appGameLottery.getGameLotterySucc().split(",");
+            for(int j = 0; j < bettingItems.length; j++){
+                String bettingItemStr = bettingItems[j];
+
+                double bettingAmount = appGameBetting.getBettingAmount() * appGameBetting.getBettingMultiple();
+
+                if(appGameBetting.getBettingGameType() == 0){
+                    if(!appGameBetting.getBettingItem().equals(bettingItemStr)){
+                        appGameBetting.setIsWinning(2);
+                        appGameBettingService.updateById(appGameBetting);
+                        continue;
+                    }
+                }else if(appGameBetting.getBettingGameType() == 1 || appGameBetting.getBettingGameType() == 2){
+                    List<AppGameItemBettingVO> itemList = JSON.parseArray(appGameBetting.getBettingItem(), AppGameItemBettingVO.class);
+                    if(itemList == null || itemList.isEmpty()){
+                        appGameBetting.setIsWinning(2);
+                        appGameBettingService.updateById(appGameBetting);
+                        continue;
+                    }
+                    List<String> bettingItemList = itemList.stream().map(AppGameItemBettingVO::getBettingItem).collect(Collectors.toList());
+                    if(!bettingItemList.contains(bettingItemStr)){
+                        appGameBetting.setIsWinning(2);
+                        appGameBettingService.updateById(appGameBetting);
+                        continue;
+                    }
+
+                    if(appGameBetting.getBettingGameType() == 2){
+                        for (int k = 0; k < itemList.size(); k++) {
+                            AppGameItemBettingVO appGameItemBettingVO = itemList.get(k);
+                            if(appGameItemBettingVO.getBettingItem().equals(bettingItemStr)){
+                                bettingAmount = appGameBetting.getBettingAmount() * appGameItemBettingVO.getBettingMultiple();
+                            }
+                        }
+                    }
+                }
+
+                AppUser appUser = appUserService.selectAppUserByUserid(appGameBetting.getUserId());
+                if(appUser == null){
+                    appGameBetting.setIsWinning(1);
+                    appGameBettingService.updateById(appGameBetting);
+                    continue;
+                }
+
+                // 更新用户余额
+                if(appGameBetting.getBettingType() == 0){
+                    appUser.setDiamondCoin(appUser.getDiamondCoin() + bettingAmount );
+                    appUser.setDiamondCoinTotal(appUser.getDiamondCoinCashTotal() + bettingAmount);
+                    appUser.setDiamondCoinCash(appUser.getDiamondCoinCash() + bettingAmount);
+                    // 更新用户金币
+                }else{
+                    appUser.setCoin(appUser.getCoin() + bettingAmount);
+//                    if(appUser.getRole() == 1){
+//                        appUser.setCoinCash(appUser.getCoinCash() + bettingAmount);
+//                    }
+                }
+
+                appUserService.updateAppUser(appUser);
+
+                redisCache.deleteObject("U:UserInfo:" + appUser.getUserid());
+
+                appGameBetting.setIsWinning(1);
+                appGameBettingService.updateById(appGameBetting);
+
+                FinTranRecord finTranRecord = new FinTranRecord();
+
+                finTranRecord.setAfterCoin(appUser.getCoin());
+                finTranRecord.setAfterDiamondCoin(appUser.getDiamondCoin());
+
+                if(appGameBetting.getBettingType() == 0){
+                    finTranRecord.setCurrencyType(4);
+                    finTranRecord.setDiamondCoinChange(bettingAmount);
+                    finTranRecord.setCoinChange(0.00);
+                }else{
+                    finTranRecord.setCurrencyType(2);
+                    finTranRecord.setCoinChange(bettingAmount);
+                    finTranRecord.setDiamondCoinChange(0.00);
+                }
+
+                finTranRecord.setAfterMoney(0.00);
+                finTranRecord.setMoneyChange(0.00);
+
+                finTranRecord.setAfterTicket(0.00);
+                finTranRecord.setTicketChange(0.00);
+
+                finTranRecord.setToUid(appUser.getUserid());
+                finTranRecord.setUid(appUser.getUserid());
+
+                finTranRecord.setSceneId1(0L);
+                finTranRecord.setSceneId2(null);
+                finTranRecord.setSceneType(0L);
+
+                finTranRecord.setTranGroupId(appGameBetting.getId());
+
+                if(appGameBetting.getBettingType() == 0){
+                    finTranRecord.setTranType1(FinTranType1.U_Income_Coin_Balance.getType());
+                }else{
+                    finTranRecord.setTranType1(FinTranType1.U_Income_Coin.getType());
+                }
+
+                finTranRecord.setTranType2(FinTranType2.GAME_REWARD.getType());
+                finTranRecord.setTranType3(FinTranType3.CHARGE_WIN_GAME.getType());
+
+                finTranRecord.setRemarks("游戏中奖");
+
+                finTranRecord.setConsumptionCoin(appGameBetting.getBettingAmount());
+                finTranRecord.setConsumptionMoney(0.00);
+                finTranRecord.setCommissionRelatedUid(0L);
+                finTranRecord.setAgentId(appUser.getAgentId());
+
+                finTranRecord.setCreateTime(new Date());
+
+                finTranRecord.setFromUid(appGameBetting.getUserId());
+                finTranRecord.setGoodsId(0L);
+                finTranRecord.setGuildId(0L);
+                finTranRecord.setManagerCoId(0L);
+                finTranRecord.setManagerId(0L);
+
+                finTranRecord.setPerc(0.00);
+                finTranRecord.setProId(0L);
+                finTranRecord.setProCount(0L);
+
+                finTranRecord.setOrderId(appGameBetting.getId());
+                finTranRecordService.insertFinTranRecord(finTranRecord);
+
+            }
+        }
+    }
+}

+ 23 - 0
game-business/src/main/java/com/game/business/vo/AppGameItemBettingVO.java

@@ -0,0 +1,23 @@
+package com.game.business.vo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+@Data
+@ApiModel(value = "游戏投注多选选项", description = "游戏投注多选选项")
+public class AppGameItemBettingVO {
+
+    @ApiModelProperty(value = "投注选项")
+    private String bettingItem;
+
+    @ApiModelProperty(value = "投注金额")
+    private Double bettingAmount;
+
+    @ApiModelProperty(value = "投注数量")
+    private Integer bettingCount;
+
+    @ApiModelProperty(value = "投注倍数")
+    private Double bettingMultiple;
+
+}

+ 14 - 0
game-business/src/main/java/com/game/business/vo/AppGameItemVO.java

@@ -0,0 +1,14 @@
+package com.game.business.vo;
+
+import com.game.business.domain.AppGameItem;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+@Data
+@ApiModel(value = "游戏选项", description = "游戏选项")
+public class AppGameItemVO extends AppGameItem {
+
+    @ApiModelProperty(value = "中奖汇率")
+    private String lotteryRate;
+}

+ 37 - 0
game-business/src/main/java/com/game/business/vo/AppUserGameBettingCountVO.java

@@ -0,0 +1,37 @@
+package com.game.business.vo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.Date;
+import java.util.List;
+
+@Data
+@ApiModel(value = "游戏投注记录", description = "游戏投注记录")
+public class AppUserGameBettingCountVO {
+
+    @ApiModelProperty(value = "当前期号")
+    private String gameDate;
+
+    @ApiModelProperty(value = "数量")
+    private long bettingCount;
+
+    @ApiModelProperty(value = "下单金额")
+    private double orderAmount;
+
+    @ApiModelProperty(value = "赢")
+    private double winAmount;
+
+    @ApiModelProperty(value = "输")
+    private double loseAmount;
+
+    @ApiModelProperty(value = "当前开奖项")
+    private String gameLotterySucc;
+
+    @ApiModelProperty(value = "当前开奖时间")
+    private Date gameRecordDate;
+
+    @ApiModelProperty(value = "投注选项统计")
+    List<AppUserGameBettingDetailsCountVO> detailsCountVOList;
+}

+ 23 - 0
game-business/src/main/java/com/game/business/vo/AppUserGameBettingDetailsCountVO.java

@@ -0,0 +1,23 @@
+package com.game.business.vo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+@Data
+@ApiModel(value = "游戏投注记录明细", description = "游戏投注记录明细")
+public class AppUserGameBettingDetailsCountVO {
+
+    @ApiModelProperty(value = "投注选项")
+    private String bettingTtem;
+
+    @ApiModelProperty(value = "下单金额")
+    private double orderAmount;
+
+    @ApiModelProperty(value = "赢")
+    private double winAmount;
+
+    @ApiModelProperty(value = "输")
+    private double loseAmount;
+
+}

+ 27 - 0
game-business/src/main/resources/mapper/business/AppGameBettingMapper.xml

@@ -15,4 +15,31 @@
         and betting_type = #{bettingType}
         group by game_id
     </select>
+
+    <select id="getUserCount" resultType="com.game.business.vo.AppUserGameBettingCountVO">
+        select tmp.*,agl.game_lottery_succ as gameLotterySucc,agl.game_record_date as gameRecordDate from (
+          select
+              game_date as gameDate,
+              count(id) as bettingCount,
+              sum(betting_amount) as orderAmount,
+              sum(case when is_winning = 1 then (betting_amount * betting_multiple) else 0.00 end) as winAmount,
+              sum(case when is_winning = 2 then (betting_amount) else 0.00 end) as loseAmount
+          from app_game_betting where game_id = #{gameId} and user_id = #{userId} and betting_type = #{bettingType}
+          group by game_date
+        ) tmp
+        left join app_game_lottery agl on agl.game_date = tmp.gameDate and agl.game_id = #{gameId}
+        where agl.is_lottery = 1
+        order by tmp.gameDate desc
+    </select>
+
+    <select id="getUserBettingItemCount" resultType="com.game.business.vo.AppUserGameBettingDetailsCountVO">
+          select
+              betting_item as bettingTtem,
+              sum(betting_amount) as orderAmount,
+              sum(case when is_winning = 1 then (betting_amount * betting_multiple) else 0.00 end) as winAmount,
+              sum(case when is_winning = 2 then (betting_amount) else 0.00 end) as loseAmount
+          from app_game_betting where game_id = #{gameId} and game_date = #{gameDate}
+          and user_id = #{userId} and betting_type = #{bettingType} and betting_game_type = 0
+          group by betting_item
+    </select>
 </mapper>

+ 20 - 1
game-business/src/main/resources/mapper/business/AppGameItemMapper.xml

@@ -10,10 +10,12 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         <result property="itemName"    column="item_name"    />
         <result property="itemMultiple"    column="item_multiple"    />
         <result property="itemLocation"    column="item_location"    />
+        <result property="lotteryCount"    column="lottery_count"    />
+        <result property="consecutive"    column="consecutive"    />
     </resultMap>
 
     <sql id="selectAppGameItemVo">
-        select id, game_id, item_name, item_multiple, item_location from app_game_item
+        select id, game_id, item_name, item_multiple, item_location, lottery_count, consecutive from app_game_item
     </sql>
 
     <select id="selectAppGameItemList" parameterType="com.game.business.domain.AppGameItem" resultMap="AppGameItemResult">
@@ -38,12 +40,16 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="itemName != null">item_name,</if>
             <if test="itemMultiple != null">item_multiple,</if>
             <if test="itemLocation != null">item_location,</if>
+            <if test="lotteryCount != null">#{lottery_count},</if>
+            <if test="consecutive != null">#{consecutive},</if>
          </trim>
         <trim prefix="values (" suffix=")" suffixOverrides=",">
             <if test="gameId != null">#{gameId},</if>
             <if test="itemName != null">#{itemName},</if>
             <if test="itemMultiple != null">#{itemMultiple},</if>
             <if test="itemLocation != null">#{itemLocation},</if>
+            <if test="lotteryCount != null">#{lotteryCount},</if>
+            <if test="consecutive != null">#{consecutive},</if>
          </trim>
     </insert>
 
@@ -54,6 +60,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="itemName != null">item_name = #{itemName},</if>
             <if test="itemMultiple != null">item_multiple = #{itemMultiple},</if>
             <if test="itemLocation != null">item_location = #{itemLocation},</if>
+            <if test="lotteryCount != null">lottery_count = #{lotteryCount},</if>
+            <if test="consecutive != null">consecutive = #{consecutive},</if>
         </trim>
         where id = #{id}
     </update>
@@ -68,4 +76,15 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             #{id}
         </foreach>
     </delete>
+
+    <update id="updateLotteryCount" parameterType="com.game.business.domain.AppGameItem">
+        update app_game_item set lottery_count = lottery_count + 1
+        where game_id = #{gameId} and item_location = #{itemLocation}
+    </update>
+
+    <update id="updateConsecutive" parameterType="com.game.business.dto.AppItemCountDTO">
+        update app_game_item set consecutive = consecutive + 1
+        where game_id = #{gameId} and item_location = #{itemLocation} and consecutive &lt; #{consecutive}
+    </update>
+
 </mapper>