Explorar el Código

Merge remote-tracking branch 'origin/master'

kk hace 2 meses
padre
commit
d2a9493805
Se han modificado 29 ficheros con 544 adiciones y 91 borrados
  1. 6 2
      game-business/src/main/java/com/game/business/controller/AppAgentController.java
  2. 49 0
      game-business/src/main/java/com/game/business/controller/AppUserCountDividendController.java
  3. 40 10
      game-business/src/main/java/com/game/business/domain/AppUserCount.java
  4. 3 3
      game-business/src/main/java/com/game/business/domain/AppUserGameCount.java
  5. 2 2
      game-business/src/main/java/com/game/business/domain/AppUserGameRecordCount.java
  6. 5 5
      game-business/src/main/java/com/game/business/domain/AppUsersCharge.java
  7. 6 0
      game-business/src/main/java/com/game/business/mapper/AppUserAgentMapper.java
  8. 21 0
      game-business/src/main/java/com/game/business/mapper/AppUserCountMapper.java
  9. 4 0
      game-business/src/main/java/com/game/business/mapper/AppUserMapper.java
  10. 1 1
      game-business/src/main/java/com/game/business/service/IAppGameBettingService.java
  11. 2 0
      game-business/src/main/java/com/game/business/service/IAppUserAgentService.java
  12. 19 1
      game-business/src/main/java/com/game/business/service/IAppUserCountService.java
  13. 1 1
      game-business/src/main/java/com/game/business/service/IAppUserGameRecordCountService.java
  14. 8 0
      game-business/src/main/java/com/game/business/service/IAppUserService.java
  15. 4 1
      game-business/src/main/java/com/game/business/service/impl/AppGameBettingServiceImpl.java
  16. 9 1
      game-business/src/main/java/com/game/business/service/impl/AppUserAgentServiceImpl.java
  17. 121 42
      game-business/src/main/java/com/game/business/service/impl/AppUserCountServiceImpl.java
  18. 7 1
      game-business/src/main/java/com/game/business/service/impl/AppUserGameRecordCountServiceImpl.java
  19. 6 0
      game-business/src/main/java/com/game/business/service/impl/AppUserServiceImpl.java
  20. 1 1
      game-business/src/main/java/com/game/business/service/impl/AppUsersChargeServiceImpl.java
  21. 6 0
      game-business/src/main/java/com/game/business/task/AppAgentGameBettingTask.java
  22. 1 1
      game-business/src/main/java/com/game/business/task/AppGameBettingTask.java
  23. 1 1
      game-business/src/main/java/com/game/business/task/AppGameLotteryTask.java
  24. 95 16
      game-business/src/main/java/com/game/business/task/AppUserCountTask.java
  25. 9 0
      game-business/src/main/java/com/game/business/vo/AppAgentTeamVo.java
  26. 7 1
      game-business/src/main/java/com/game/business/vo/AppUserAgentJournalIndexVO.java
  27. 58 0
      game-business/src/main/resources/mapper/business/AppUserAgentMapper.xml
  28. 51 0
      game-common/src/main/java/com/game/common/utils/MoneyUtils.java
  29. 1 1
      pom.xml

+ 6 - 2
game-business/src/main/java/com/game/business/controller/AppAgentController.java

@@ -73,9 +73,9 @@ public class AppAgentController extends BaseController {
         Date beginDate = DateUtil.beginOfMonth(nowDate);
         Date endDate = DateUtil.endOfMonth(nowDate);
 
-        List<AppUserCount> appUserCountList = appUserCountService.getAppUserCount(userId,DateUtil.format(beginDate,formatP),DateUtil.format(endDate,formatP));
+        List<AppUserCount> appUserCountList = appUserCountService.getAppUserCountNew(userId,DateUtil.format(beginDate,formatP),DateUtil.format(endDate,formatP));
 
-        if(null != appUserCountList){
+        if(null == appUserCountList){
             appUserCountList = new ArrayList<>();
         }
         //佣金
@@ -84,6 +84,10 @@ public class AppAgentController extends BaseController {
         vo.setTeamUser(appUserAgentService.countAgent(userId,null,null));
         //团队充值
         vo.setTeamRecharge(appUserCountList.stream().mapToDouble(e->e.getRechargeAmount()).sum());
+        //团队充值赠送金额
+        vo.setRechargeGive(appUserCountList.stream().mapToDouble(e->e.getRechargeGive()).sum());
+        //团队充值手续费
+        vo.setRechargeCommission(appUserCountList.stream().mapToDouble(e->e.getRechargeCommission()).sum());
         //团队投注
         vo.setTeamBetting(appUserAgentService.sumBetting(DateUtil.format(beginDate,"yyyy-MM-dd").concat(" 00:00:00")
                 ,DateUtil.format(endDate,"yyyy-MM-dd").concat(" 23:59:59"),userId));

+ 49 - 0
game-business/src/main/java/com/game/business/controller/AppUserCountDividendController.java

@@ -23,6 +23,7 @@ import com.game.common.core.domain.HttpRet;
 import com.game.common.core.domain.HttpRetPageArr;
 import com.game.common.core.domain.R;
 import com.game.common.core.redis.RedisCache;
+import com.game.common.utils.MoneyUtils;
 import com.game.common.utils.SecurityUtils;
 import com.game.common.utils.StringUtils;
 import org.springframework.security.access.prepost.PreAuthorize;
@@ -88,10 +89,12 @@ public class AppUserCountDividendController extends BaseController
     @PostMapping("/send")
     @ApiOperation(value = "发放分红", notes = "发放分红")
 //    @Transactional
+
     public HttpRet<Boolean> send(AppUserDividendSendDto dto)
     {
         String userId = dto.getUserId();
         String dateNo = dto.getDateNum();
+        Long curUserId = SecurityUtils.getUserId();
         if(null == userId && StringUtils.isBlank(dateNo)){
             return HttpRet.fail("发放失败,参数为空");
         }
@@ -107,6 +110,13 @@ public class AppUserCountDividendController extends BaseController
         if(null == dividendList || dividendList.size() < 1){
             return HttpRet.fail("发放失败,不存在或已发放");
         }
+        AppUser curUser = appUserService.selectAppUserByUserid(curUserId);
+        if(curUser.getDiamondCoin() < dividendList.stream().mapToDouble(e->e.getDiamondCoin()).sum()){
+            return HttpRet.fail("发放失败,余额不足");
+        }
+        if(curUser.getCoin() < dividendList.stream().mapToDouble(e->e.getCoin()).sum()){
+            return HttpRet.fail("发放失败,金币不足");
+        }
         //开始发放
         List<Long> ids = dividendList.stream().map(AppUserCountDividend::getUserId).collect(Collectors.toList());
         List<AppUser> userList = appUserService.selectListByIds(ids);
@@ -116,8 +126,28 @@ public class AppUserCountDividendController extends BaseController
                 List<FinTranRecord> tranRecordList = new ArrayList<>();
                 AppUser appUser = userMap.get(String.valueOf(e.getUserId()));
                 AppUser updateAppUser = new AppUser();
+                AppUser curUpdateAppUser = new AppUser();//当前用户
                 updateAppUser.setUserid(appUser.getUserid());
                 if(null != e.getDiamondCoin() && e.getDiamondCoin()>0){
+                    //扣减发放用户
+                    curUser.setDiamondCoinCash(curUser.getDiamondCoinCash() - MoneyUtils.consumeCash(curUser.getDiamondCoin(),curUser.getDiamondCoinCash(),e.getDiamondCoin()));
+                    curUser.setDiamondCoin(curUser.getDiamondCoin() - e.getDiamondCoin());
+                    curUser.setDiamondCoinTotal(curUser.getDiamondCoinTotal() - e.getDiamondCoin());
+                    curUpdateAppUser.setUserid(curUser.getUserid());
+                    curUpdateAppUser.setDiamondCoinCash(curUser.getDiamondCoinCash());
+                    curUpdateAppUser.setDiamondCoin(curUser.getDiamondCoin());
+                    curUpdateAppUser.setDiamondCoinTotal(curUser.getDiamondCoinTotal());
+                    //发放用户扣减流水
+                    FinTranAddedInfo curAddedInfo = FinTranAddedInfo.createTranInfo(appUser.getUserid(), 0, 0, AppSceneType.Scene_None, "");
+                    FinTranRecord curTran = FinTranRecord.initFinTranRecordSomeParams(curAddedInfo, FinTranType3.AGENT_DIVIDED, FinTranType1.U_Outcome_Balance, curUser);
+                    curTran.setDiamondCoinChange(e.getDiamondCoin() * -1);
+                    curTran.setAfterDiamondCoin(curUser.getDiamondCoin());
+                    curTran.setCurrencyType(TranCurrencyType.Balance.getType());
+                    curTran.setRemarks(e.getDateNo() + " 发放团队分红奖励");
+                    curTran.setFromUid(curUserId);
+                    tranRecordList.add(curTran);
+
+                    //受益用户
                     updateAppUser.setDiamondCoin(appUser.getDiamondCoin() + e.getDiamondCoin());
                     updateAppUser.setDiamondCoinTotal(appUser.getDiamondCoinTotal() + e.getDiamondCoin());
                     updateAppUser.setDiamondCoinCash(appUser.getDiamondCoinCash() + e.getDiamondCoin());
@@ -128,9 +158,26 @@ public class AppUserCountDividendController extends BaseController
                     tran.setAfterDiamondCoin(appUser.getDiamondCoin() + e.getDiamondCoin());
                     tran.setCurrencyType(TranCurrencyType.Balance.getType());
                     tran.setRemarks(e.getDateNo() + " 团队周分红奖励");
+                    tran.setFromUid(curUserId);
                     tranRecordList.add(tran);
                 }
                 if(null != e.getCoin() && e.getCoin()>0){
+                    //扣减发放用户
+                    curUser.setCoinCash(curUser.getCoinCash() - MoneyUtils.consumeCash(curUser.getCoin(),curUser.getCoinCash(),e.getCoin()));
+                    curUser.setCoin(curUser.getCoin() - e.getCoin());
+                    curUpdateAppUser.setUserid(curUser.getUserid());
+                    curUpdateAppUser.setCoinCash(curUser.getCoinCash());
+                    curUpdateAppUser.setCoin(curUser.getCoin());
+                    //发放用户扣减流水
+                    FinTranAddedInfo curAddedInfo = FinTranAddedInfo.createTranInfo(appUser.getUserid(), 0, 0, AppSceneType.Scene_None, "");
+                    FinTranRecord curTran = FinTranRecord.initFinTranRecordSomeParams(curAddedInfo, FinTranType3.AGENT_DIVIDED, FinTranType1.U_Outcome_Coin, curUser);
+                    curTran.setDiamondCoinChange(e.getDiamondCoin() * -1);
+                    curTran.setAfterCoin(curUser.getCoin());
+                    curTran.setCurrencyType(TranCurrencyType.Coin.getType());
+                    curTran.setRemarks(e.getDateNo() + " 发放团队分红奖励");
+                    curTran.setFromUid(curUserId);
+                    tranRecordList.add(curTran);
+
                     updateAppUser.setCoin(appUser.getDiamondCoin() + e.getDiamondCoin());
                     //流水 余额
                     FinTranAddedInfo addedInfo = FinTranAddedInfo.createTranInfo(appUser.getUserid(), 0, 0, AppSceneType.Scene_None, "");
@@ -139,9 +186,11 @@ public class AppUserCountDividendController extends BaseController
                     tran.setAfterDiamondCoin(appUser.getDiamondCoin() + e.getDiamondCoin());
                     tran.setCurrencyType(TranCurrencyType.Coin.getType());
                     tran.setRemarks(e.getDateNo() + " 团队周分红奖励");
+                    tran.setFromUid(curUserId);
                     tranRecordList.add(tran);
                 }
                 appUserService.updateAppUser(updateAppUser);
+                appUserService.updateAppUser(curUpdateAppUser);
                 //清除用户缓存
                 redisCache.deleteObject("U:UserInfo:".concat(String.valueOf(appUser.getUserid())));
                 if(tranRecordList.size() > 0){

+ 40 - 10
game-business/src/main/java/com/game/business/domain/AppUserCount.java

@@ -8,6 +8,7 @@ import com.game.common.annotation.Excel;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
+import java.util.Date;
 
 
 @Data
@@ -35,53 +36,82 @@ public class AppUserCount {
     @ApiModelProperty(value = "上级用户ID")
     private Long agentUserId;
 
+    @Excel(name = "团队顶级用户ID")
+    @TableField(value = "super_user_id")
+    @ApiModelProperty(value = "团队顶级用户ID")
+    private Long superUserId;
+
     @Excel(name = "充值金额")
     @TableField(value = "recharge_amount")
     @ApiModelProperty(value = "充值金额")
-    private double rechargeAmount;
+    private Double rechargeAmount;
 
     @Excel(name = "充值手续费")
     @TableField(value = "recharge_commission")
     @ApiModelProperty(value = "充值手续费")
-    private double rechargeCommission;
+    private Double rechargeCommission;
 
     @Excel(name = "充值赠送(余额)")
     @TableField(value = "recharge_give")
     @ApiModelProperty(value = "充值赠送(余额)")
-    private double rechargeGive;
+    private Double rechargeGive;
 
     @Excel(name = "提现金额")
     @TableField(value = "withdrawal_amount")
     @ApiModelProperty(value = "提现金额")
-    private double withdrawalAmount;
+    private Double withdrawalAmount;
 
     @Excel(name = "提现手续费")
     @TableField(value = "withdrawal_commission")
     @ApiModelProperty(value = "提现手续费")
-    private double withdrawalCommission;
+    private Double withdrawalCommission;
 
     @Excel(name = "直播消费金额 (金币)")
     @TableField(value = "live_use_amount")
     @ApiModelProperty(value = "直播消费金额 (金币)")
-    private double liveUseAmount;
+    private Double liveUseAmount;
 
     @Excel(name = "直播佣金")
     @TableField(value = "live_commission")
     @ApiModelProperty(value = "直播佣金")
-    private double liveCommission;
+    private Double liveCommission;
+
+    @Excel(name = "游戏-下注金额")
+    @TableField(value = "game_betting")
+    @ApiModelProperty(value = "游戏-下注金额")
+    private Double gameBetting;
 
     @Excel(name = "游戏-赢")
     @TableField(value = "game_win_amount")
     @ApiModelProperty(value = "游戏-赢")
-    private double gameWinAmount;
+    private Double gameWinAmount;
 
     @Excel(name = "游戏-输")
     @TableField(value = "game_lose_amount")
     @ApiModelProperty(value = "游戏-赢")
-    private double gameLoseAmount;
+    private Double gameLoseAmount;
 
     @Excel(name = "游戏佣金")
     @TableField(value = "game_commission")
     @ApiModelProperty(value = "游戏佣金")
-    private double gameCommission;
+    private Double gameCommission;
+
+    @Excel(name = "创建时间")
+    @TableField(value = "create_time")
+    @ApiModelProperty(value = "创建时间")
+    private Date createTime;
+
+    @Excel(name = "更新时间")
+    @TableField(value = "update_time")
+    @ApiModelProperty(value = "更新时间 (用于游戏增量统计)")
+    private Date updateTime;
+
+    @Excel(name = "最后一次更新时间")
+    @TableField(value = "count_time")
+    @ApiModelProperty(value = "最后一次更新时间(用于直播、充值、提现增量统计)")
+    private Date countTime;
+
+    //是否全量更新
+    @TableField(exist = false)
+    private boolean isUpdate = false;
 }

+ 3 - 3
game-business/src/main/java/com/game/business/domain/AppUserGameCount.java

@@ -37,15 +37,15 @@ public class AppUserGameCount {
     @Excel(name = "游戏-赢")
     @TableField(value = "game_win_amount")
     @ApiModelProperty(value = "游戏-赢")
-    private double gameWinAmount;
+    private Double gameWinAmount;
 
     @Excel(name = "游戏-输")
     @TableField(value = "game_lose_amount")
     @ApiModelProperty(value = "游戏-赢")
-    private double gameLoseAmount;
+    private Double gameLoseAmount;
 
     @Excel(name = "游戏佣金")
     @TableField(value = "game_commission")
     @ApiModelProperty(value = "游戏佣金")
-    private double gameCommission;
+    private Double gameCommission;
 }

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

@@ -49,12 +49,12 @@ public class AppUserGameRecordCount {
     @Excel(name = "佣金")
     @TableField(value = "commission")
     @ApiModelProperty(value = "佣金")
-    private double commission;
+    private Double commission;
 
     @Excel(name = "游戏分佣费率")
     @TableField(value = "game_rate")
     @ApiModelProperty(value = "游戏分佣费率")
-    private double gameRate;
+    private Double gameRate;
 
     @Excel(name = "游戏分佣费率")
     @TableField(value = "create_time")

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

@@ -79,11 +79,11 @@ private static final long serialVersionUID=1L;
 
     @ApiModelProperty(value = "平台服务费")
     @TableField(value = "platform_service")
-    private double platformService;
+    private Double platformService;
 
     @ApiModelProperty(value = "平台服务费率")
     @TableField(value = "platform_service_rate")
-    private double platformServiceRate;
+    private Double platformServiceRate;
 
     /** 1是会员(星探)充值 */
     @ApiModelProperty(value = "1是会员(星探)充值")
@@ -188,8 +188,8 @@ private static final long serialVersionUID=1L;
     private String tradeNo;
 
     /** 支付类型 1:支付宝app 2:微信app 3:ios-内购 4:手动充值 5:微信 h5支付 */
-    @ApiModelProperty(value = "支付类型 1:支付宝app 2:微信app 3:ios-内购 4:手动充值 5:微信 h5支付")
-    @Excel(name = "支付类型 1:支付宝app 2:微信app 3:ios-内购 4:手动充值 5:微信 h5支付")
+    @ApiModelProperty(value = "支付类型 1:支付宝app 2:微信app 3:ios-内购 4:手动充值 5:微信 h5支付 6: 余额兑换 7: 金币兑换")
+    @Excel(name = "支付类型 1:支付宝app 2:微信app 3:ios-内购 4:手动充值 5:微信 h5支付 6: 余额兑换 7: 金币兑换")
     @TableField(value = "type")
     private Long type;
 
@@ -201,6 +201,6 @@ private static final long serialVersionUID=1L;
 
     @JsonIgnore
     @TableField(exist = false)
-    private double todaySum;
+    private Double todaySum;
 
 }

+ 6 - 0
game-business/src/main/java/com/game/business/mapper/AppUserAgentMapper.java

@@ -74,6 +74,12 @@ public interface AppUserAgentMapper extends BaseMapper<AppUserAgent> {
      */
     public List<AppAgentTeamVo> teamList(@Param("teamDto") AppAgentTeamDto teamDto);
 
+    /**
+     * 查询团队列表(新)
+     *
+     */
+    public List<AppAgentTeamVo> teamListNew(@Param("teamDto") AppAgentTeamDto teamDto);
+
     /**
      * 查询所有下级团队列表(递归)
      *

+ 21 - 0
game-business/src/main/java/com/game/business/mapper/AppUserCountMapper.java

@@ -2,6 +2,27 @@ package com.game.business.mapper;
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.game.business.domain.AppUserCount;
+import org.apache.ibatis.annotations.Param;
+import org.apache.ibatis.annotations.Select;
+
+import java.util.List;
 
 public interface AppUserCountMapper extends BaseMapper<AppUserCount> {
+
+    @Select(" <script>" +
+            "select a.* from app_user_count as a INNER JOIN" +
+            " (WITH RECURSIVE useragent AS" +
+            " (" +
+            " SELECT *" +
+            " FROM app_user_agent" +
+            " WHERE pid = #{pid}" +
+            " UNION ALL" +
+            " SELECT o.*" +
+            " FROM app_user_agent o" +
+            " JOIN useragent s ON o.pid = s.user_id" +
+            " )" +
+            " SELECT user_id FROM useragent ) as b on a.user_id = b.user_id where a.str_date between #{beginTime} and #{endTime}" +
+            " </script>")
+    public List<AppUserCount> selectTeamUserCount(@Param("pid") Long pid,@Param("beginTime") String beginTime,@Param("endTime") String endTime);
+
 }

+ 4 - 0
game-business/src/main/java/com/game/business/mapper/AppUserMapper.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.AppUser;
+import org.apache.ibatis.annotations.Select;
 
 /**
  * app用户Mapper接口
@@ -60,4 +61,7 @@ public interface AppUserMapper extends BaseMapper<AppUser> {
     public int deleteAppUserByUserids(Long[] userids);
 
     Long nextId();
+
+    @Select("select * from app_user where pid = 0 and and agent_flag = 1")
+    public List<AppUser> selectTeamUserList();
 }

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

@@ -31,5 +31,5 @@ public interface IAppGameBettingService extends IService<AppGameBetting> {
     /**
      * 根据日期查询投注情况
      * */
-    List<AppGameBetting> selectListByDate( Long userId, String beginTime, String endTime,Long gameId);
+    List<AppGameBetting> selectListByDate( Long userId, String beginTime, String endTime,Long gameId,String gameDate);
 }

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

@@ -95,4 +95,6 @@ public interface IAppUserAgentService extends IService<AppUserAgent> {
      * 递归查询所有下级代理
      * */
     public List<AppUserAgent> selectAllAgentList(Long pid,Long userId);
+
+    public AppUserAgent selectInfo(Long userId);
 }

+ 19 - 1
game-business/src/main/java/com/game/business/service/IAppUserCountService.java

@@ -1,17 +1,35 @@
 package com.game.business.service;
 
 import com.baomidou.mybatisplus.extension.service.IService;
+import com.game.business.domain.AppGameBetting;
+import com.game.business.domain.AppGameCommission;
 import com.game.business.domain.AppUserCount;
 
 import java.util.List;
+import java.util.Date;
 
 public interface IAppUserCountService extends IService<AppUserCount> {
 
 
+    /**
+     * 查询下级代理(直属下级)
+     * */
     public List<AppUserCount> getAppUserCount(long userId,String beginTime,String endTIme);
 
+
+    /**
+     * 查询下级代理(整条线)
+     * */
+    public List<AppUserCount> getAppUserCountNew(long userId,String beginTime,String endTIme);
+
     public void createAppUserCount(AppUserCount appUserCount);
 
-    public void staticsUserCount(Long gameId,String dateTime);
+    public void staticsUserCount(Long gameId,String dateTime,String gameDate);
+
+    public Date selectLastUpdateDate();
+
+    public Date selectLastDate();
+
+    public void staticsUserBetting(AppGameBetting appGameBetting,List<AppGameCommission> gameRateList);
 
 }

+ 1 - 1
game-business/src/main/java/com/game/business/service/IAppUserGameRecordCountService.java

@@ -10,6 +10,6 @@ public interface IAppUserGameRecordCountService extends IService<AppUserGameReco
     /**
      * 根据日期查询用户当日统计情况
      * */
-    public List<AppUserGameRecordCount> selectByDate(Long userId, String startDate, String endDate);
+    public List<AppUserGameRecordCount> selectByDate(Long userId, String startDate, String endDate,Long gameId,String gameDate);
 
 }

+ 8 - 0
game-business/src/main/java/com/game/business/service/IAppUserService.java

@@ -27,6 +27,14 @@ public interface IAppUserService extends IService<AppUser> {
      */
     public List<AppUser> selectAppUserList(AppUser appUser);
 
+    /**
+     * 查询总代理用户
+     *
+     * @param appUser app用户
+     * @return app用户集合
+     */
+    public List<AppUser> selectTeamUserList();
+
     /**
      * 新增app用户
      *

+ 4 - 1
game-business/src/main/java/com/game/business/service/impl/AppGameBettingServiceImpl.java

@@ -96,7 +96,7 @@ public class AppGameBettingServiceImpl extends ServiceImpl<AppGameBettingMapper,
     }
 
     @Override
-    public List<AppGameBetting> selectListByDate(Long userId, String beginTime, String endTime,Long gameId) {
+    public List<AppGameBetting> selectListByDate(Long userId, String beginTime, String endTime,Long gameId,String gameDate) {
         LambdaQueryWrapper<AppGameBetting> queryWrapper = Wrappers.lambdaQuery();;
         queryWrapper.ne(AppGameBetting::getIsWinning,0);//查询已开奖
         queryWrapper.eq(AppGameBetting::getBettingType,0);
@@ -112,6 +112,9 @@ public class AppGameBettingServiceImpl extends ServiceImpl<AppGameBettingMapper,
         if(StringUtils.isNotBlank(endTime)){
             queryWrapper.le(AppGameBetting::getUpdateTime,endTime);
         }
+        if(StringUtils.isNotBlank(gameDate)){
+            queryWrapper.like(AppGameBetting::getGameDate,gameDate);
+        }
         return appGameBettingMapper.selectList(queryWrapper);
     }
 }

+ 9 - 1
game-business/src/main/java/com/game/business/service/impl/AppUserAgentServiceImpl.java

@@ -192,7 +192,7 @@ public class AppUserAgentServiceImpl extends ServiceImpl<AppUserAgentMapper, App
         if(null == teamDto.getPid()) {
             teamDto.setPid(SecurityUtils.getUserId());
         }
-        List<AppAgentTeamVo> list = appUserAgentMapper.teamList(teamDto);
+        List<AppAgentTeamVo> list = appUserAgentMapper.teamListNew(teamDto);
         if(null != list && list.size() > 0){
             List<Long> ids = list.stream().map(e->{return e.getUserId();}).collect(Collectors.toList());
             //查询游戏分红比例
@@ -248,4 +248,12 @@ public class AppUserAgentServiceImpl extends ServiceImpl<AppUserAgentMapper, App
         return appUserAgentMapper.selectAllAgentList(pid,userId);
     }
 
+    @Override
+    public AppUserAgent selectInfo(Long userId) {
+        LambdaQueryWrapper<AppUserAgent> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.eq(AppUserAgent::getUserId,userId);
+        queryWrapper.eq(AppUserAgent::getAuditStatus,1);
+        return appUserAgentMapper.selectOne(queryWrapper);
+    }
+
 }

+ 121 - 42
game-business/src/main/java/com/game/business/service/impl/AppUserCountServiceImpl.java

@@ -2,6 +2,7 @@ package com.game.business.service.impl;
 
 import cn.hutool.core.date.DateUtil;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.game.business.domain.*;
 import com.game.business.mapper.AppUserCountMapper;
@@ -14,10 +15,12 @@ import com.game.common.utils.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.scheduling.annotation.Async;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
 
 import java.util.*;
 import java.util.function.Function;
 import java.util.stream.Collectors;
+import java.util.Date;
 
 @Service
 public class AppUserCountServiceImpl extends ServiceImpl<AppUserCountMapper, AppUserCount> implements IAppUserCountService {
@@ -54,8 +57,14 @@ public class AppUserCountServiceImpl extends ServiceImpl<AppUserCountMapper, App
         return appUserCountMapper.selectList(queryWrapper);
     }
 
+    @Override
+    public List<AppUserCount> getAppUserCountNew(long userId, String beginTime, String endTIme) {
+        return appUserCountMapper.selectTeamUserCount(userId,beginTime,endTIme);
+    }
+
     @Override
 //    @Async
+    @Transactional
     public void createAppUserCount(AppUserCount appUserCount) {
         //查询当前用户当日是否已经生成记录
         LambdaQueryWrapper<AppUserCount> queryWrapper = new LambdaQueryWrapper<>();
@@ -64,72 +73,86 @@ public class AppUserCountServiceImpl extends ServiceImpl<AppUserCountMapper, App
         AppUserCount userCount = appUserCountMapper.selectOne(queryWrapper);
         int res = 0;
         if(userCount==null) {
+            appUserCount.setCreateTime(new Date());
+            appUserCount.setUpdateTime(new Date());
             res = appUserCountMapper.insert(appUserCount);
         }else{
             appUserCount.setId(userCount.getId());
+            /*if(null == appUserCount.getUpdateTime()) {
+                appUserCount.setUpdateTime(new Date());
+            }*/
+            if(!appUserCount.isUpdate()) {
+                //非全量更新
+                if (appUserCount.getRechargeAmount() != null) {
+                    appUserCount.setRechargeAmount(userCount.getRechargeAmount() + appUserCount.getRechargeAmount());
+                }
+                if (appUserCount.getRechargeCommission() != null) {
+                    appUserCount.setRechargeCommission(userCount.getRechargeCommission() + appUserCount.getRechargeCommission());
+                }
+                if (appUserCount.getRechargeGive() != null) {
+                    appUserCount.setRechargeGive(userCount.getRechargeGive() + appUserCount.getRechargeGive());
+                }
+                if (appUserCount.getWithdrawalCommission() != null) {
+                    appUserCount.setWithdrawalAmount(userCount.getWithdrawalAmount() + appUserCount.getWithdrawalAmount());
+                }
+                if (appUserCount.getWithdrawalCommission() != null) {
+                    appUserCount.setWithdrawalCommission(userCount.getWithdrawalCommission() + appUserCount.getWithdrawalCommission());
+                }
+                if (appUserCount.getLiveUseAmount() != null) {
+                    appUserCount.setLiveUseAmount(userCount.getLiveUseAmount() + appUserCount.getLiveUseAmount());
+                }
+                if (appUserCount.getLiveCommission() != null) {
+                    appUserCount.setLiveCommission(userCount.getLiveCommission() + appUserCount.getLiveCommission());
+                }
+                if (appUserCount.getGameWinAmount() != null) {
+                    appUserCount.setGameWinAmount(userCount.getGameWinAmount() + appUserCount.getGameWinAmount());
+                }
+                if (appUserCount.getGameLoseAmount() != null) {
+                    appUserCount.setGameLoseAmount(userCount.getGameLoseAmount() + appUserCount.getGameLoseAmount());
+                }
+                if (appUserCount.getGameCommission() != null) {
+                    appUserCount.setGameCommission(userCount.getGameCommission() + appUserCount.getGameCommission());
+                }
+            }
             res = appUserCountMapper.updateById(appUserCount);
         }
     }
 
     @Override
-    public void staticsUserCount(Long gameId,String dateTime) {
+    public void staticsUserCount(Long gameId,String dateTime,String gameDate) {
         Date curDate = DateUtils.getNowDate();
         if (StringUtils.isNotBlank(dateTime)) {
             curDate = DateUtil.parse(dateTime, "yyyy-MM-dd");
         } else {
             dateTime = DateUtils.parseDateToStr("yyyy-MM-dd", curDate);
         }
-        AppUser queryUser = new AppUser();
-        queryUser.setAgentFlag(1);
-        List<AppUser> list = appUserService.selectAppUserList(queryUser);//查询所有代理用户
-        List<AppUsersCharge> appUsersChargeList = appUsersChargeService.getChargeList(null, dateTime.concat(" 00:00:00"), dateTime.concat(" 23:59:59"));
-        List<AppUsersCashrecord> appUsersCashrecords = appUsersCashrecordService.getUserCashList(null, dateTime.concat(" 00:00:00"), dateTime.concat(" 23:59:59"));
-        List<FinTranRecord> finTranRecordList = finTranRecordService.getUserRecordList(null, dateTime.concat(" 00:00:00"), dateTime.concat(" 23:59:59"));
-        List<AppUserLiveDividedRecord> liveDividedRecordList = appUserLiveDividedRecordService.selectByDate(null, dateTime.concat(" 00:00:00"), dateTime.concat(" 23:59:59"));
-        List<AppUserGameRecordCount> gameRecordCountList = appUserGameRecordCountService.selectByDate(null, dateTime.concat(" 00:00:00"), dateTime.concat(" 23:59:59"));
-        List<AppGameBetting> gameBettingList = appGameBettingService.selectListByDate(null, dateTime.concat(" 00:00:00"), dateTime.concat(" 23:59:59"),null);
-        if (null != list && list.size() > 0) {
+
+        /*Date lastDate = this.selectLastUpdateDate();
+        String lastDateStr = DateUtil.format(lastDate,"yyyy-MM-dd HH:mm:ss");
+        if(!dateTime.equals(DateUtil.format(lastDate,"yyyy-MM-dd"))){
+            lastDateStr = DateUtil.format(curDate, "yyyy-MM-dd").concat(" 00:00:00");
+        }
+        String endTimeStr = DateUtil.format(curDate,"yyyy-MM-dd HH:mm:ss");*/
+        List<AppGameBetting> gameBettingList = appGameBettingService.selectListByDate(null, null, null,gameId,gameDate);
+        if (null != gameBettingList && gameBettingList.size() > 0) {
             String finalDateTime = dateTime;
-            list.forEach(appUser -> {
+            Date finalCurDate = curDate;
+            List<Long> userIds = gameBettingList.stream().map(AppGameBetting::getUserId).distinct().collect(Collectors.toList());
+            userIds.forEach(userId -> {
                 AppUserCount appUserCount = new AppUserCount();
-                appUserCount.setUserId(appUser.getUserid());
+                appUserCount.setUserId(userId);
                 appUserCount.setStrDate(finalDateTime);
-                appUserCount.setAgentUserId(appUser.getPid());
-                //充值总额
-                appUserCount.setRechargeAmount(appUsersChargeList.stream().filter(e -> e.getUid().equals(appUser.getUserid())).mapToDouble(e -> e.getMoney().doubleValue()).sum());
-                //提现金额
-                appUserCount.setWithdrawalAmount(appUsersCashrecords.stream().filter(e -> e.getUid().equals(appUser.getUserid())).mapToDouble(e -> e.getMoney().doubleValue()).sum());
-                //充值服务费/手续费
-                appUserCount.setRechargeCommission(appUsersChargeList.stream().filter(e -> e.getUid().equals(appUser.getUserid())).mapToDouble(e -> e.getPlatformService()).sum());
-                //充值赠送余额
-                appUserCount.setRechargeGive(finTranRecordList.stream().filter(e -> {
-                    return e.getUid().equals(appUser.getUserid()) &&
-                            e.getTranType1().intValue() == FinTranType1.U_Income_Coin_Balance.getType() &&
-                            e.getTranType3().intValue() == FinTranType3.CHARGE_IN_REWARD.getType();
-                }).mapToDouble(e->e.getCoinChange()).sum());
-                //提现服务费/手续费
-                appUserCount.setWithdrawalCommission(appUsersCashrecords.stream().filter(e -> e.getUid().equals(appUser.getUserid())).mapToDouble(e -> e.getService().doubleValue()).sum());
-                //直播消费金额
-                Map<String, KeyValue> type1Keys = Arrays.stream(FinTranType1.getKeyValues(1)).collect(Collectors.toMap(e -> e.a, Function.identity(), (k1, k2) -> k2)); //支出交易类型
-                Map<String, KeyValue> type3Keys = Arrays.stream(FinTranType3.getKeyValues(1)).collect(Collectors.toMap(e -> e.a, Function.identity(), (k1, k2) -> k2)); //支出交易类型
-                appUserCount.setLiveUseAmount(finTranRecordList.stream().filter(e -> {
-                    return e.getUid().equals(appUser.getUserid()) &&
-                            null != type1Keys.get(String.valueOf(e.getTranType1().intValue())) &&
-                            null != type3Keys.get(String.valueOf(e.getTranType3().intValue()));
-                }).mapToDouble(e -> dealMoney(e.getCoinChange())).sum());
-                //直播佣金
-                appUserCount.setLiveCommission(liveDividedRecordList.stream().filter(e -> e.getUserId().equals(appUser.getUserid())).mapToDouble(e -> e.getMoney().doubleValue()).sum());
-                //游戏佣金
-                appUserCount.setGameCommission(gameRecordCountList.stream().filter(e -> e.getUserId().equals(appUser.getUserid())).mapToDouble(e -> e.getCommission()).sum());
+                appUserCount.setAgentUserId(userId);
+                appUserCount.setUpdateTime(finalCurDate);
                 //游戏输
                 appUserCount.setGameLoseAmount(gameBettingList.stream().filter(
-                        e -> e.getUserId().equals(appUser.getUserid()) && e.getIsWinning().intValue() == 2
+                        e -> e.getUserId().equals(userId) && e.getIsWinning().intValue() == 2
                 ).mapToDouble(e ->
                         e.getBettingAmount()
                 ).sum());
                 //游戏赢
                 appUserCount.setGameWinAmount(gameBettingList.stream().filter(
-                        e -> e.getUserId().equals(appUser.getUserid()) && e.getIsWinning().intValue() == 1
+                        e -> e.getUserId().equals(userId) && e.getIsWinning().intValue() == 1
                 ).mapToDouble(e ->
                         e.getBettingAmount() * e.getBettingMultiple()
                 ).sum());
@@ -138,6 +161,62 @@ public class AppUserCountServiceImpl extends ServiceImpl<AppUserCountMapper, App
         }
     }
 
+    @Override
+    public Date selectLastUpdateDate() {
+        LambdaQueryWrapper<AppUserCount> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.orderByDesc(AppUserCount::getUpdateTime);
+        queryWrapper.last("limit 1");
+        AppUserCount appUserCount = appUserCountMapper.selectOne(queryWrapper);
+        if(null == appUserCount || null == appUserCount.getUpdateTime()) {
+            return DateUtil.beginOfDay(DateUtils.getNowDate());
+        }
+        return DateUtil.offsetMillisecond(appUserCount.getUpdateTime(), 1);  //往前加1毫秒用于增量更新
+    }
+
+    /**
+     * 查询最后更新时间
+     * */
+    @Override
+    public Date selectLastDate() {
+       LambdaQueryWrapper<AppUserCount> queryWrapper = new LambdaQueryWrapper<>();
+       queryWrapper.orderByDesc(AppUserCount::getUpdateTime);
+       queryWrapper.last("limit 1");
+       AppUserCount appUserCount = appUserCountMapper.selectOne(queryWrapper);
+       if(null == appUserCount || null == appUserCount.getCountTime()) {
+           return DateUtil.beginOfDay(DateUtils.getNowDate());
+       }
+       return DateUtil.offsetMillisecond(appUserCount.getCountTime(), 1);  //往前加1毫秒用于增量更新
+    }
+
+    @Override
+    public void staticsUserBetting(AppGameBetting appGameBetting,List<AppGameCommission> gameRateList) {
+        Date curDate = DateUtils.getNowDate();
+        String dateTime = DateUtils.parseDateToStr("yyyy-MM-dd", curDate);
+
+        List<AppUserGameRecordCount> gameRecordCountList = appUserGameRecordCountService.selectByDate(null, null, null,appGameBetting.getGameId(),appGameBetting.getGameDate());
+        if (null != gameRateList && gameRateList.size() > 0) {
+            List<Long> userIds = gameRateList.stream().map(AppGameCommission::getUserId).collect(Collectors.toList());
+            userIds.add(appGameBetting.getUserId());
+            userIds = userIds.stream().distinct().collect(Collectors.toList());
+            String finalDateTime = dateTime;
+            Date finalCurDate = curDate;
+            userIds.forEach(userId -> {
+                AppUserCount appUserCount = new AppUserCount();
+                appUserCount.setUserId(userId);
+                appUserCount.setStrDate(finalDateTime);
+                appUserCount.setAgentUserId(userId);
+                appUserCount.setUpdateTime(finalCurDate);
+                //游戏佣金 更新所有用户
+                appUserCount.setGameCommission(gameRecordCountList.stream().filter(e -> e.getUserId().equals(userId)).mapToDouble(e -> e.getCommission()).sum());
+                //游戏下注金额 更新当前下注用户
+                if(userId.equals(appGameBetting.getUserId())) {
+                    appUserCount.setGameBetting(appGameBetting.getBettingAmount());
+                }
+                this.createAppUserCount(appUserCount);
+            });
+        }
+    }
+
     /**
      * 金额为负数则转为正数
      * */

+ 7 - 1
game-business/src/main/java/com/game/business/service/impl/AppUserGameRecordCountServiceImpl.java

@@ -21,7 +21,7 @@ public class AppUserGameRecordCountServiceImpl extends ServiceImpl<AppUserGameRe
     private AppUserGameRecordCountMapper appUserGameRecordCountMapper;
 
     @Override
-    public List<AppUserGameRecordCount> selectByDate(Long userId, String startDate, String endDate) {
+    public List<AppUserGameRecordCount> selectByDate(Long userId, String startDate, String endDate,Long gameId,String gameDate) {
         LambdaQueryWrapper<AppUserGameRecordCount> queryWrapper = new LambdaQueryWrapper<>();
         if(null != userId){
             queryWrapper.eq(AppUserGameRecordCount::getUserId, userId);
@@ -32,6 +32,12 @@ public class AppUserGameRecordCountServiceImpl extends ServiceImpl<AppUserGameRe
         if(StringUtils.isNotBlank(endDate)){
             queryWrapper.le(AppUserGameRecordCount::getCreateTime, endDate);
         }
+        if(null != gameId){
+            queryWrapper.eq(AppUserGameRecordCount::getGameId, gameId);
+        }
+        if(StringUtils.isNotBlank(gameDate)){
+            queryWrapper.like(AppUserGameRecordCount::getGameDate, gameDate);
+        }
         return appUserGameRecordCountMapper.selectList(queryWrapper);
     }
 

+ 6 - 0
game-business/src/main/java/com/game/business/service/impl/AppUserServiceImpl.java

@@ -53,6 +53,12 @@ public class AppUserServiceImpl extends ServiceImpl<AppUserMapper, AppUser> impl
         return appUserMapper.selectAppUserList(appUser);
     }
 
+    @Override
+    @DataSource(DataSourceType.SLAVE)
+    public List<AppUser> selectTeamUserList() {
+        return appUserMapper.selectTeamUserList();
+    }
+
     /**
      * 新增app用户
      *

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

@@ -109,7 +109,7 @@ public class AppUsersChargeServiceImpl extends ServiceImpl<AppUsersChargeMapper,
         queryWrapper.between(AppUsersCharge::getAddtime,beginTime,endTime);
         queryWrapper.eq(AppUsersCharge::getIsDelete,0);
         queryWrapper.eq(AppUsersCharge::getStatus,"1");
-        queryWrapper.notIn(AppUsersCharge::getType,new Integer[]{4,6,7});
+        queryWrapper.notIn(AppUsersCharge::getType,new Integer[]{6,7});
         return appUsersChargeMapper.selectList(queryWrapper);
     }
 }

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

@@ -41,6 +41,9 @@ public class AppAgentGameBettingTask {
     @Autowired
     private RedisCache redisCache;
 
+    @Autowired
+    private IAppUserCountService appUserCountService;
+
     @Async("asyncExecutor")
     public void agentGameBettingTask(AppGameBetting appGameBetting) {
 
@@ -65,6 +68,9 @@ public class AppAgentGameBettingTask {
 
         commissionHandler(gameRateList, appGameBetting);
 
+        //统计游戏下注、返佣情况
+        appUserCountService.staticsUserBetting(appGameBetting,gameRateList);
+
     }
 
     private void getGameRate(Long gameId, Long pid, Long userId, List<AppGameCommission> gameRateList){

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

@@ -233,7 +233,7 @@ public class AppGameBettingTask {
 
             this.gameBettingTask(appGameClassify.getId(), appGame.getId(), gameDate, gameLotterySucc);
 
-            appUserCountService.staticsUserCount(appGame.getId(),null);
+            appUserCountService.staticsUserCount(appGame.getId(),null,appGame.getGameDate());
         }
 
     }

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

@@ -45,7 +45,7 @@ public class AppGameLotteryTask {
 
         gameBettingTask(appGameLottery);
 
-        appUserCountService.staticsUserCount(appGameLottery.getGameId(),null);
+        appUserCountService.staticsUserCount(appGameLottery.getGameId(),null,appGameLottery.getGameDate());
     }
 
     private void updateItme(Long gameId, String gameLotterySucc){

+ 95 - 16
game-business/src/main/java/com/game/business/task/AppUserCountTask.java

@@ -2,6 +2,7 @@ package com.game.business.task;
 
 import cn.hutool.core.date.DateUtil;
 import com.alibaba.fastjson.JSONObject;
+import com.baomidou.dynamic.datasource.annotation.DSTransactional;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.game.business.domain.*;
 import com.game.business.service.*;
@@ -75,8 +76,8 @@ public class AppUserCountTask {
             List<AppUsersCashrecord> appUsersCashrecords = appUsersCashrecordService.getUserCashList(null, dateTime.concat(" 00:00:00"), dateTime.concat(" 23:59:59"));
             List<FinTranRecord> finTranRecordList = finTranRecordService.getUserRecordList(null, dateTime.concat(" 00:00:00"), dateTime.concat(" 23:59:59"));
             List<AppUserLiveDividedRecord> liveDividedRecordList = appUserLiveDividedRecordService.selectByDate(null, dateTime.concat(" 00:00:00"), dateTime.concat(" 23:59:59"));
-            List<AppUserGameRecordCount> gameRecordCountList = appUserGameRecordCountService.selectByDate(null, dateTime.concat(" 00:00:00"), dateTime.concat(" 23:59:59"));
-            List<AppGameBetting> gameBettingList = appGameBettingService.selectListByDate(null, dateTime.concat(" 00:00:00"), dateTime.concat(" 23:59:59"),null);
+            List<AppUserGameRecordCount> gameRecordCountList = appUserGameRecordCountService.selectByDate(null, dateTime.concat(" 00:00:00"), dateTime.concat(" 23:59:59"),null,null);
+            List<AppGameBetting> gameBettingList = appGameBettingService.selectListByDate(null, dateTime.concat(" 00:00:00"), dateTime.concat(" 23:59:59"),null,null);
             if (null != list && list.size() > 0) {
                 List<AppUserCount> appUserCountList = new ArrayList<>();
                 String finalDateTime = dateTime;
@@ -85,6 +86,7 @@ public class AppUserCountTask {
                     appUserCount.setUserId(appUser.getUserid());
                     appUserCount.setStrDate(finalDateTime);
                     appUserCount.setAgentUserId(appUser.getPid());
+                    appUserCount.setUpdate(true);//全量更新
                     //充值总额
                     appUserCount.setRechargeAmount(appUsersChargeList.stream().filter(e -> e.getUid().equals(appUser.getUserid())).mapToDouble(e -> e.getMoney().doubleValue()).sum());
                     //提现金额
@@ -92,11 +94,14 @@ public class AppUserCountTask {
                     //充值服务费/手续费
                     appUserCount.setRechargeCommission(appUsersChargeList.stream().filter(e -> e.getUid().equals(appUser.getUserid())).mapToDouble(e -> e.getPlatformService()).sum());
                     //充值赠送余额
-                    appUserCount.setRechargeGive(finTranRecordList.stream().filter(e -> {
+                    /*appUserCount.setRechargeGive(finTranRecordList.stream().filter(e -> {
                         return e.getUid().equals(appUser.getUserid()) &&
                                 e.getTranType1().intValue() == FinTranType1.U_Income_Coin_Balance.getType() &&
                                 e.getTranType3().intValue() == FinTranType3.CHARGE_IN_REWARD.getType();
-                    }).mapToDouble(e->e.getCoinChange()).sum());
+                    }).mapToDouble(e->e.getCoinChange()).sum());      */
+                    appUserCount.setRechargeGive(appUsersChargeList.stream().filter(e -> {
+                        return e.getUid().equals(appUser.getUserid());
+                    }).mapToDouble(e->null==e.getCoinGive()?0:e.getCoinGive().doubleValue()).sum());
                     //提现服务费/手续费
                     appUserCount.setWithdrawalCommission(appUsersCashrecords.stream().filter(e -> e.getUid().equals(appUser.getUserid())).mapToDouble(e -> e.getService().doubleValue()).sum());
                     //直播消费金额
@@ -109,6 +114,8 @@ public class AppUserCountTask {
                     }).mapToDouble(e -> dealMoney(e.getCoinChange())).sum());
                     //直播佣金
                     appUserCount.setLiveCommission(liveDividedRecordList.stream().filter(e -> e.getUserId().equals(appUser.getUserid())).mapToDouble(e -> e.getMoney().doubleValue()).sum());
+                    //游戏下注金额
+                    appUserCount.setGameBetting(gameBettingList.stream().filter(e->e.getUserId().equals(appUser.getUserid())).mapToDouble(AppGameBetting::getBettingAmount).sum());
                     //游戏佣金
                     appUserCount.setGameCommission(gameRecordCountList.stream().filter(e -> e.getUserId().equals(appUser.getUserid())).mapToDouble(e -> e.getCommission()).sum());
                     //游戏输
@@ -162,10 +169,79 @@ public class AppUserCountTask {
 
     }
 
+    /**
+     * 统计用户直播/充值 (增量更新 1分钟)
+     * */
+    public void statisticsLive(){
+        log.info("开始增量更新用户每日直播、佣金");
+        try {
+            Long userId = null;
+            Date curDate = new Date();
+            String dateTime = DateUtil.format(curDate, "yyyy-MM-dd");
+            Date lastDate = appUserCountService.selectLastDate();
+            String lastDateStr = DateUtil.format(lastDate,"yyyy-MM-dd HH:mm:ss");
+            if(!dateTime.equals(DateUtil.format(lastDate,"yyyy-MM-dd"))){
+                lastDateStr = DateUtil.format(curDate, "yyyy-MM-dd").concat(" 00:00:00");
+            }
+            String endTimeStr = DateUtil.format(curDate,"yyyy-MM-dd HH:mm:ss");
+            AppUser queryUser = new AppUser();
+            queryUser.setAgentFlag(1);
+            List<AppUser> list = appUserService.selectAppUserList(queryUser);//查询所有代理用户
+            List<AppUsersCharge> appUsersChargeList = appUsersChargeService.getChargeList(userId, lastDateStr, endTimeStr);
+            List<AppUsersCashrecord> appUsersCashrecords = appUsersCashrecordService.getUserCashList(userId, lastDateStr, endTimeStr);
+            List<FinTranRecord> finTranRecordList = finTranRecordService.getUserRecordList(null!=userId?String.valueOf(userId):null, lastDateStr, endTimeStr);
+            List<AppUserLiveDividedRecord> liveDividedRecordList = appUserLiveDividedRecordService.selectByDate(userId, lastDateStr, endTimeStr);
+            if (null != list && list.size() > 0) {
+                List<AppUserCount> appUserCountList = new ArrayList<>();
+                String finalDateTime = dateTime;
+                list.forEach(appUser -> {
+                    AppUserCount appUserCount = new AppUserCount();
+                    appUserCount.setUserId(appUser.getUserid());
+                    appUserCount.setStrDate(finalDateTime);
+                    appUserCount.setAgentUserId(appUser.getPid());
+                    appUserCount.setCountTime(curDate);
+                    //充值总额
+                    appUserCount.setRechargeAmount(appUsersChargeList.stream().filter(e -> e.getUid().equals(appUser.getUserid())).mapToDouble(e -> e.getMoney().doubleValue()).sum());
+                    //提现金额
+                    appUserCount.setWithdrawalAmount(appUsersCashrecords.stream().filter(e -> e.getUid().equals(appUser.getUserid())).mapToDouble(e -> e.getMoney().doubleValue()).sum());
+                    //充值服务费/手续费
+                    appUserCount.setRechargeCommission(appUsersChargeList.stream().filter(e -> e.getUid().equals(appUser.getUserid())).mapToDouble(e -> e.getPlatformService()).sum());
+                    //充值赠送余额
+                    /*appUserCount.setRechargeGive(finTranRecordList.stream().filter(e -> {
+                        return e.getUid().equals(appUser.getUserid()) &&
+                                e.getTranType1().intValue() == FinTranType1.U_Income_Coin_Balance.getType() &&
+                                e.getTranType3().intValue() == FinTranType3.CHARGE_IN_REWARD.getType();
+                    }).mapToDouble(e->e.getCoinChange()).sum());*/
+                    appUserCount.setRechargeGive(appUsersChargeList.stream().filter(e -> {
+                        return e.getUid().equals(appUser.getUserid());
+                    }).mapToDouble(e->null==e.getCoinGive()?0:e.getCoinGive().doubleValue()).sum());
+                    //提现服务费/手续费
+                    appUserCount.setWithdrawalCommission(appUsersCashrecords.stream().filter(e -> e.getUid().equals(appUser.getUserid())).mapToDouble(e -> e.getService().doubleValue()).sum());
+                    //直播消费金额
+                    Map<String, KeyValue> type1Keys = Arrays.stream(FinTranType1.getKeyValues(1)).collect(Collectors.toMap(e -> e.a, Function.identity(), (k1, k2) -> k2)); //支出交易类型
+                    Map<String, KeyValue> type3Keys = Arrays.stream(FinTranType3.getKeyValues(1)).collect(Collectors.toMap(e -> e.a, Function.identity(), (k1, k2) -> k2)); //支出交易类型
+                    appUserCount.setLiveUseAmount(finTranRecordList.stream().filter(e -> {
+                        return e.getUid().equals(appUser.getUserid()) &&
+                                null != type1Keys.get(String.valueOf(e.getTranType1().intValue())) &&
+                                null != type3Keys.get(String.valueOf(e.getTranType3().intValue()));
+                    }).mapToDouble(e -> dealMoney(e.getCoinChange())).sum());
+                    //直播佣金
+                    appUserCount.setLiveCommission(liveDividedRecordList.stream().filter(e -> e.getUserId().equals(appUser.getUserid())).mapToDouble(e -> e.getMoney().doubleValue()).sum());
+                    appUserCountService.createAppUserCount(appUserCount);
+                });
+            }
+        }catch (Exception e){
+            log.info("增量更新用户每日直播、佣金统计异常:{}",e.getMessage());
+        }
+        log.info("增量更新用户每日直播、佣金统计完成");
+
+    }
+
     /**
      * 计算分红
      * @param dateTime 格式yyyy-MM-dd
      * */
+    @DSTransactional
     public void calculateDividends(String dateTime){
         try {
             log.info("开始每周代理分红");
@@ -177,18 +253,20 @@ public class AppUserCountTask {
             }
             Date beginTime = DateUtil.beginOfWeek(curDate);
             Date endTime = DateUtil.endOfWeek(curDate);
-            //查询所有代理用户
-            AppUser queryUser = new AppUser();
+            //查询所有代理用户
+            /*AppUser queryUser = new AppUser();
             queryUser.setAgentFlag(1);
-            List<AppUser> list = appUserService.selectAppUserList(queryUser);
+            List<AppUser> list = appUserService.selectAppUserList(queryUser);*/
+            List<AppUser> list = appUserService.selectTeamUserList();
             if (null != list && list.size() > 0) {
                 list.forEach(appUser -> {
                     //查询用户所有下级本周盈亏
-                    LambdaQueryWrapper<AppUserCount> queryWrapper = new LambdaQueryWrapper<>();
+                    /*LambdaQueryWrapper<AppUserCount> queryWrapper = new LambdaQueryWrapper<>();
                     queryWrapper.ge(AppUserCount::getStrDate, beginTime);
                     queryWrapper.le(AppUserCount::getStrDate, endTime);
                     queryWrapper.eq(AppUserCount::getAgentUserId, appUser.getUserid());
-                    List<AppUserCount> appUserCountList = appUserCountService.list(queryWrapper);
+                    List<AppUserCount> appUserCountList = appUserCountService.list(queryWrapper);*/
+                    List<AppUserCount> appUserCountList = appUserCountService.getAppUserCountNew(appUser.getUserid(),DateUtil.format(beginTime,"yyyy-MM-dd"),DateUtil.format(endTime,"yyyy-MM-dd"));
                     if (null != appUserCountList && appUserCountList.size() > 0) {
                         //游戏输钱
                         double loseAmount = appUserCountList.stream().mapToDouble(e -> e.getGameLoseAmount()).sum();
@@ -209,13 +287,14 @@ public class AppUserCountTask {
                         if (money > 0) {
                             //金额大于0 满足分红
 
-                            //查询用户所有下级
-                            LambdaQueryWrapper<AppUserAgent> userAgentLambdaQueryWrapper = new LambdaQueryWrapper<>();
-                            userAgentLambdaQueryWrapper.eq(AppUserAgent::getPid, appUser.getUserid());
-                            userAgentLambdaQueryWrapper.eq(AppUserAgent::getAuditStatus, 1);
-                            List<AppUserAgent> appUserAgentList = appUserAgentService.list(userAgentLambdaQueryWrapper);
-                            if (null != appUserAgentList && appUserAgentList.size() > 0) {
-                                appUserAgentList.forEach(userAgent -> {
+                            if (null != appUserCountList && appUserCountList.size() > 0) {
+                                appUserCountList.forEach(userCount -> {
+                                    //查询用户代理信息
+                                    AppUserAgent userAgent = appUserAgentService.selectInfo(userCount.getUserId());
+                                    if(null == userAgent) {
+                                        log.info("用户{},不是代理或者代理信息为空,停止分红",userCount.getUserId());
+                                        return;
+                                    }
                                     if (userAgent.getDividendGuaranteeRate() <= 0.00) {
                                         log.info("用户{},团队亏损{},或未设置分红比例,停止分红", userAgent.getUserId(), money);
                                         return;

+ 9 - 0
game-business/src/main/java/com/game/business/vo/AppAgentTeamVo.java

@@ -43,6 +43,15 @@ public class AppAgentTeamVo {
     @ApiModelProperty(value = "盈亏")
     private double gameAmount;
 
+    @ApiModelProperty(value = "充值金额")
+    private double rechargeAmount;
+
+    @ApiModelProperty(value = "充值手续费")
+    private double rechargeCommission;
+
+    @ApiModelProperty(value = "充值赠送金额")
+    private double rechargeGive;
+
     /** 直播分成比例 */
     @ApiModelProperty(value = "直播分成比例")
     private Long liveRate;

+ 7 - 1
game-business/src/main/java/com/game/business/vo/AppUserAgentJournalIndexVO.java

@@ -12,7 +12,7 @@ public class AppUserAgentJournalIndexVO {
     @ApiModelProperty(value = "我的佣金")
     private double myCommission = 0;
 
-    @ApiModelProperty(value = "团队充值")
+    @ApiModelProperty(value = "团队充值(扣除手续费后的金额)")
     private double teamRecharge = 0;
 
     @ApiModelProperty(value = "团队投注")
@@ -27,6 +27,12 @@ public class AppUserAgentJournalIndexVO {
     @ApiModelProperty(value = "团队投注 输")
     private double teamLose = 0;
 
+    @ApiModelProperty(value = "团队充值赠送金额(余额)")
+    private double rechargeGive = 0;
+
+    @ApiModelProperty(value = "团队充值手续费")
+    private double rechargeCommission = 0;
+
     @ApiModelProperty(value = "团队人数")
     private int teamUser = 0;
 

+ 58 - 0
game-business/src/main/resources/mapper/business/AppUserAgentMapper.xml

@@ -139,6 +139,33 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
                     and <![CDATA[ e.str_date <= #{teamDto.endTime} ]]>
                 </if>
             ) as gameAmount,
+            (
+            select IFNULL(sum(g.recharge_amount),0) from app_user_count as g where g.user_id = a.user_id
+            <if test="teamDto.beginTime != null and teamDto.beginTime != ''">
+                and <![CDATA[ g.str_date >= #{teamDto.beginTime} ]]>
+            </if>
+            <if test="teamDto.endTime != null and teamDto.endTime != ''">
+                and <![CDATA[ g.str_date <= #{teamDto.endTime} ]]>
+            </if>
+            ) as rechargeAmount,
+            (
+            select IFNULL(sum(g.recharge_commission),0) from app_user_count as h where h.user_id = a.user_id
+            <if test="teamDto.beginTime != null and teamDto.beginTime != ''">
+                and <![CDATA[ h.str_date >= #{teamDto.beginTime} ]]>
+            </if>
+            <if test="teamDto.endTime != null and teamDto.endTime != ''">
+                and <![CDATA[ h.str_date <= #{teamDto.endTime} ]]>
+            </if>
+            ) as rechargeCommission,
+            (
+            select IFNULL(sum(g.recharge_give),0) from app_user_count as i where i.user_id = a.user_id
+            <if test="teamDto.beginTime != null and teamDto.beginTime != ''">
+                and <![CDATA[ i.str_date >= #{teamDto.beginTime} ]]>
+            </if>
+            <if test="teamDto.endTime != null and teamDto.endTime != ''">
+                and <![CDATA[ i.str_date <= #{teamDto.endTime} ]]>
+            </if>
+            ) as rechargeGive,
             a.live_rate as liveRate,
             a.dividend_guarantee_rate as dividendGuaranteeRate
         from app_user_agent as a left join mugozbg_live.app_user as c on a.user_id = c.userid where (a.pid = #{teamDto.pid} or a.user_id = #{teamDto.pid})
@@ -149,6 +176,37 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
              and c.username = #{teamDto.nickName}
         </if>
     </select>
+    <select id="teamListNew" resultType="com.game.business.vo.AppAgentTeamVo">
+        select
+            a.user_id as userId,
+            c.username as nickName,
+            c.coin as coin,
+            c.diamond_coin as diamondCoin,
+            a.pid as pid,
+            IFNULL(sum(b.game_betting),0) as bettingAmount,
+            IFNULL(sum(b.game_commission),0) as gameCommission,
+            IFNULL(sum(b.live_commission),0) as liveCommission,
+            IFNULL(sum(b.game_win_amount - b.game_lose_amount),0) as gameAmount,
+            IFNULL(sum(b.recharge_amount),0) as rechargeAmount,
+            IFNULL(sum(b.recharge_commission),0) as rechargeCommission,
+            IFNULL(sum(b.recharge_give),0) as rechargeGive,
+            a.live_rate as liveRate,
+            a.dividend_guarantee_rate as dividendGuaranteeRate
+        from app_user_agent as a inner join app_user_count as b on a.user_id = b.user_id left join mugozbg_live.app_user as c on a.user_id = c.userid where (a.pid = #{teamDto.pid} or a.user_id = #{teamDto.pid})
+        <if test="teamDto.userId != null ">
+             and a.user_id = #{teamDto.userId}
+        </if>
+        <if test="teamDto.nickName != null and teamDto.nickName != ''">
+             and c.username = #{teamDto.nickName}
+        </if>
+        <if test="teamDto.beginTime != null and teamDto.beginTime != ''">
+            and <![CDATA[ b.str_date >= #{teamDto.beginTime} ]]>
+        </if>
+        <if test="teamDto.endTime != null and teamDto.endTime != ''">
+            and <![CDATA[ b.str_date <= #{teamDto.endTime} ]]>
+        </if>
+        group by a.user_id order by a.user_id
+    </select>
 
     <select id="selectAllAgentList" resultMap="AppUserAgentResult">
         WITH RECURSIVE useragent AS

+ 51 - 0
game-common/src/main/java/com/game/common/utils/MoneyUtils.java

@@ -0,0 +1,51 @@
+package com.game.common.utils;
+
+
+import cn.hutool.core.util.NumberUtil;
+
+public class MoneyUtils {
+
+    /**
+     * 金额转换  (正数转负数,负数转正数)
+     * @param coin
+     * @return
+     */
+    public static double getConsumeCoin(double coin) {
+        return NumberUtil.mul(coin, -1);
+    }
+
+    /**
+     * 百分数 转换成 小数  保留两位小数
+     *
+     * @param perc
+     * @return
+     */
+    public static double parsePerc2(double perc) {
+        return NumberUtil.div(perc, 100, 2);
+    }
+    
+    public static double parsePerc4(double perc) {
+        return NumberUtil.div(perc, 100, 4);
+    }
+
+    /**
+     * 计算需要扣除多少提现金额
+     * */
+    public static double consumeCash(double coin,double coinCash,double consumeUserCoin) {
+        if(coinCash < 1){
+            return 0;
+        }
+        boolean flag = false;
+        if(consumeUserCoin < 0){
+            consumeUserCoin = consumeUserCoin * -1; //转为为正数
+            flag = true;
+        }
+        if(coin - coinCash == 0){
+            return consumeUserCoin;
+        }else if(coinCash < consumeUserCoin){
+            return coinCash; //提现余额不足抵扣 则全扣除
+        }
+        double res = consumeUserCoin - (coinCash - coin);
+        return flag?res*-1:res;
+    }
+}

+ 1 - 1
pom.xml

@@ -19,7 +19,7 @@
         <java.version>1.8</java.version>
         <maven-jar-plugin.version>3.1.1</maven-jar-plugin.version>
         <spring-framework.version>5.3.33</spring-framework.version>
-        <druid.version>1.2.20</druid.version>
+        <druid.version>1.2.23</druid.version>
         <bitwalker.version>1.21</bitwalker.version>
         <swagger.version>3.0.0</swagger.version>
         <kaptcha.version>2.3.3</kaptcha.version>