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

Merge remote-tracking branch 'origin/master'

kk 1 месяц назад
Родитель
Сommit
677f3dbc26
16 измененных файлов с 523 добавлено и 146 удалено
  1. 94 27
      game-business/src/main/java/com/game/business/controller/AppAgentController.java
  2. 3 1
      game-business/src/main/java/com/game/business/controller/AppUserAgentController.java
  3. 52 0
      game-business/src/main/java/com/game/business/domain/AppUserAgent.java
  4. 5 0
      game-business/src/main/java/com/game/business/domain/AppUserCount.java
  5. 1 1
      game-business/src/main/java/com/game/business/mapper/AppUserAgentMapper.java
  6. 2 2
      game-business/src/main/java/com/game/business/service/IAppUserAgentService.java
  7. 8 0
      game-business/src/main/java/com/game/business/service/IAppUserCountService.java
  8. 59 7
      game-business/src/main/java/com/game/business/service/impl/AppUserAgentServiceImpl.java
  9. 3 2
      game-business/src/main/java/com/game/business/service/impl/AppUserCountDividendServiceImpl.java
  10. 82 30
      game-business/src/main/java/com/game/business/service/impl/AppUserCountServiceImpl.java
  11. 1 0
      game-business/src/main/java/com/game/business/task/AppAgentGameBettingTask.java
  12. 171 75
      game-business/src/main/java/com/game/business/task/AppUserCountTask.java
  13. 14 1
      game-business/src/main/resources/mapper/business/AppUserAgentMapper.xml
  14. 5 0
      game-common/src/main/java/com/game/common/constant/CacheConstants.java
  15. 8 0
      game-common/src/main/java/com/game/common/core/controller/BaseController.java
  16. 15 0
      game-common/src/main/java/com/game/common/utils/PageUtils.java

+ 94 - 27
game-business/src/main/java/com/game/business/controller/AppAgentController.java

@@ -34,6 +34,7 @@ import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 
 import java.math.BigDecimal;
+import java.math.RoundingMode;
 import java.util.*;
 import java.util.function.Function;
 import java.util.stream.Collectors;
@@ -66,6 +67,7 @@ public class AppAgentController extends BaseController {
     @ApiOperation(value = "用户代理统计", notes = "用户代理统计")
     public HttpRet<AppUserAgentJournalIndexVO> index(@RequestBody AgentIndexDTO agentIndexDto)
     {
+        Date now = DateUtil.date();
         Long userId = SecurityUtils.getUserId();
         if(null != agentIndexDto.getUserId()){
             userId = agentIndexDto.getUserId();
@@ -76,55 +78,100 @@ public class AppAgentController extends BaseController {
             topUserId = appUserAgent.getTopId();
         }
         AppUserAgentJournalIndexVO vo = new AppUserAgentJournalIndexVO();
-        Date nowDate = DateUtil.date();
+        Date curDate = DateUtil.date();
         if(agentIndexDto.getType() == 1){
-            nowDate = DateUtil.offsetMonth(nowDate,-1); //上个月
+            curDate = DateUtil.offsetMonth(curDate,-1); //上个月
         }
         String formatP = "yyyy-MM-dd";
-        Date beginDate = DateUtil.beginOfMonth(nowDate);
-        Date endDate = DateUtil.endOfMonth(nowDate);
-
-        List<AppUserCount> appUserCountList = appUserCountService.getAppUserCountNew(userId,DateUtil.format(beginDate,formatP),DateUtil.format(endDate,formatP));
-
+        Date beginDate = DateUtil.beginOfMonth(curDate);
+        Date endDate = DateUtil.endOfMonth(curDate);
+        Date weekBegin = DateUtil.beginOfWeek(now);
+        Date weekend = DateUtil.endOfWeek(now);
+        List<AppUserCount> appUserCountList = appUserCountService.getAppUserCountNew(userId,DateUtil.format(weekBegin,formatP),DateUtil.format(weekend,formatP));
+        AppUserAgent queryAppUserAgent = new AppUserAgent();
+        queryAppUserAgent.setPid(userId);
+        //查询用户下级代理
+        List<AppUserAgent> appUserAgentList = appUserAgentService.selectAllAgentList(userId,null,null,null);
         if(null == appUserCountList){
             appUserCountList = new ArrayList<>();
         }
+        //处理下级代理树形列表
+        AppUserAgent teamUser = AppUserAgent.buildTree(appUserAgentList,userId,appUserCountList);
         //佣金
         double money = 0;
-        if(null != redisCache.getCacheMapValue(CacheConstants.USER_AGENT_TEAM_PHASE,String.valueOf(topUserId))){
-            money = redisCache.getCacheMapValue(CacheConstants.USER_AGENT_TEAM_PHASE,String.valueOf(topUserId));
+        if(null != appUserCountList && appUserCountList.size() > 0){
+//            List<AppUserCount> finalAppUserCountList = appUserCountList;
+            /*money = appUserAgentList.stream().mapToDouble(appUserAgent1 -> {
+                return finalAppUserCountList.stream().mapToDouble(e->{
+                    return (e.getGameLoseAmount() - e.getGameWinAmount() - e.getGameCommission() - e.getRechargeGive()) * appUserAgent1.getDividendGuaranteeRate()/100;
+                }).sum();
+            }).sum();*/
+            /*if(teamUser.getChildrenList() != null && teamUser.getChildrenList().size()>0) {
+                money = teamUser.getChildrenList().stream().mapToDouble(e -> {
+                    double winLose = 0;
+                    winLose = AppUserAgent.calMoney(e, winLose);
+                    if (winLose > 0) {
+                        return BigDecimal.valueOf(winLose * e.getDividendGuaranteeRate() / 100).setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();
+                    } else {
+                        return 0;
+                    }
+                }).sum();
+            }*/
+//            money = dealChildel(teamUser,money);
+
+            //计算当前用户分红
+            double winLose = appUserCountList.stream().mapToDouble(e->{
+               return e.getGameLoseAmount() - (e.getGameWinAmount() - (e.getGameBetting() - e.getGameLoseAmount())) - e.getGameCommission() - e.getRechargeGive();
+            }).sum();
+
+            if(winLose > 0){
+                money +=  BigDecimal.valueOf(winLose * teamUser.getDividendGuaranteeRate() / 100).setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();
+            }
+
         }
-        if(null != appUserAgent.getDividendGuaranteeRate()){
+
+
+        /*if(null != appUserAgent.getDividendGuaranteeRate()){
             money = money * appUserAgent.getDividendGuaranteeRate() / 100 ;
-        }
+        }else{
+            money = 0;
+        }*/
         //预计分红
         vo.setMyCommission(BigDecimal.valueOf(money>0?money:0).setScale(2,BigDecimal.ROUND_HALF_UP).doubleValue());
-        vo.setLiveCommission(appUserCountList.stream().mapToDouble(e->e.getLiveCommission()).sum());
-        vo.setGameCommission(appUserCountList.stream().mapToDouble(e->e.getGameCommission()).sum());
+        vo.setLiveCommission(BigDecimal.valueOf(appUserCountList.stream().mapToDouble(e->e.getLiveCommission()).sum()).setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue());
+        vo.setGameCommission(BigDecimal.valueOf(appUserCountList.stream().mapToDouble(e->e.getGameCommission()).sum()).setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue());
         //团队人数
-        vo.setTeamUser(appUserCountList.stream().map(AppUserCount::getUserId).distinct().collect(Collectors.toList()).size());
+        vo.setTeamUser(appUserAgentList.stream().collect(Collectors.toList()).size());
         //团队充值
-        vo.setTeamRecharge(appUserCountList.stream().mapToDouble(e->e.getRechargeAmount()).sum());
+        vo.setTeamRecharge(BigDecimal.valueOf(appUserCountList.stream().mapToDouble(e->{
+            return (e.getRechargeAmount() - e.getRechargeGive()) + e.getRechargeCommission();
+        }).sum()).setScale(2,BigDecimal.ROUND_HALF_UP).doubleValue());
         //团队充值赠送金额
-        vo.setRechargeGive(appUserCountList.stream().mapToDouble(e->e.getRechargeGive()).sum());
+        vo.setRechargeGive(BigDecimal.valueOf(appUserCountList.stream().mapToDouble(e->e.getRechargeGive()).sum()).setScale(2,BigDecimal.ROUND_HALF_UP).doubleValue());
         //团队充值手续费
-        vo.setRechargeCommission(appUserCountList.stream().mapToDouble(e->e.getRechargeCommission()).sum());
+        vo.setRechargeCommission(BigDecimal.valueOf(appUserCountList.stream().mapToDouble(e->e.getRechargeCommission()).sum()).setScale(2,BigDecimal.ROUND_HALF_UP).doubleValue());
         //团队投注
-        vo.setTeamBetting(appUserCountList.stream().mapToDouble(e->e.getGameBetting()).sum());
+        vo.setTeamBetting(BigDecimal.valueOf(appUserCountList.stream().mapToDouble(e->e.getGameBetting()).sum()).setScale(2,BigDecimal.ROUND_HALF_UP).doubleValue());
         //团队直播消费
-        vo.setTeamLive(appUserCountList.stream().mapToDouble(e->e.getLiveUseAmount()).sum());
+        vo.setTeamLive(BigDecimal.valueOf(appUserCountList.stream().mapToDouble(e->e.getLiveUseAmount()).sum()).setScale(2,BigDecimal.ROUND_HALF_UP).doubleValue());
         //团队投注赢
-        vo.setTeamWin(appUserCountList.stream().mapToDouble(e->e.getGameWinAmount()).sum());
+        vo.setTeamWin(BigDecimal.valueOf(appUserCountList.stream().mapToDouble(
+                e->{
+                    return e.getGameWinAmount() - (e.getGameBetting() - e.getGameLoseAmount());
+                }
+        ).sum()).setScale(2,BigDecimal.ROUND_HALF_UP).doubleValue());
         //团队投注输
-        vo.setTeamLose(appUserCountList.stream().mapToDouble(e->e.getGameLoseAmount()).sum());
+        vo.setTeamLose(BigDecimal.valueOf(appUserCountList.stream().mapToDouble(e->e.getGameLoseAmount()).sum()).setScale(2,BigDecimal.ROUND_HALF_UP).doubleValue());
         //活跃人数
         vo.setActiveUser(appUserCountList.stream().collect(Collectors.collectingAndThen(Collectors.toCollection(()-> new TreeSet<>(Comparator.comparing(f->f.getUserId()))), ArrayList::new)).size());
         //昨日新增
         Date yesterDay = DateUtil.offsetDay(DateUtil.date(),-1);
-        vo.setYesterdayUser(appUserAgentService.countAgent(topUserId,DateUtil.format(yesterDay,"yyyy-MM-dd").concat(" 00:00:00")
-                ,DateUtil.format(yesterDay,"yyyy-MM-dd").concat(" 23:59:59")));
-        vo.setMonthUser(appUserAgentService.countAgent(topUserId,DateUtil.format(beginDate,"yyyy-MM-dd").concat(" 00:00:00")
-                ,DateUtil.format(endDate,"yyyy-MM-dd").concat(" 23:59:59")));
+        vo.setYesterdayUser(appUserAgentList.stream().filter(e->
+                compareTime(e.getCreateTime(),yesterDay,yesterDay)
+        ).collect(Collectors.toList()).size());
+        vo.setMonthUser(appUserAgentList.stream().filter(e->
+                compareTime(e.getCreateTime(),beginDate,endDate)
+        ).collect(Collectors.toList()).size());
 
         return HttpRet.success(MessageUtils.message("11022"),vo);
     }
@@ -146,7 +193,8 @@ public class AppAgentController extends BaseController {
     @ApiOperation(value = "团队列表", notes = "团队列表")
     public HttpRetPageArr<AppAgentTeamVo> teamList(@RequestBody AppAgentTeamDto teamDto)
     {
-        startPage();
+
+        startPageBySize(10);//每页最多10条
         List<AppAgentTeamVo> list = appUserAgentService.teamList(teamDto);
         return HttpRetPageArr.success(MessageUtils.message("11022"),getDataTable(list));
     }
@@ -168,7 +216,7 @@ public class AppAgentController extends BaseController {
            return HttpRet.fail("转账失败,受益人不是代理");
        }
        if(appUserAgent.getPid().longValue() == 0 || isTwoLevel(appUserAgent.getPid())){
-           List<AppUserAgent> appUserAgentList = appUserAgentService.selectAllAgentList(userId,transerDto.getToUserId());
+           List<AppUserAgent> appUserAgentList = appUserAgentService.selectAllAgentList(userId,transerDto.getToUserId(),null,null);
            if(null == appUserAgentList || appUserAgentList.size() < 1){
                return HttpRet.fail("转账失败,只能给团队成员转账");
            }
@@ -266,4 +314,23 @@ public class AppAgentController extends BaseController {
         return false;
     }
 
+    private boolean compareTime(Date curTime,Date beginTime,Date endTime){
+        beginTime = DateUtil.parse(DateUtil.format(beginTime,"yyyy-MM-dd").concat(" 00:00:00"));
+        endTime = DateUtil.parse(DateUtil.format(endTime,"yyyy-MM-dd").concat(" 23:59:59"));
+        return curTime.getTime() >= beginTime.getTime() && curTime.getTime() <= endTime.getTime();
+    }
+
+    public double dealChildel(AppUserAgent appUserAgent,double money){
+        double winlose = 0;
+        winlose = AppUserAgent.calMoney(appUserAgent,winlose);
+        if(winlose > 0){
+            money += winlose * appUserAgent.getDividendGuaranteeRate() / 100;
+        }
+        if(null != appUserAgent.getChildrenList() && appUserAgent.getChildrenList().size() > 0){
+            for(AppUserAgent child : appUserAgent.getChildrenList()){
+                money = dealChildel(child,money);
+            }
+        }
+        return money;
+    }
 }

+ 3 - 1
game-business/src/main/java/com/game/business/controller/AppUserAgentController.java

@@ -97,8 +97,10 @@ public class AppUserAgentController extends BaseController
 
         //更新上级团队人数
         String subset =  dbPuserAgent.getSubset();
-        if(StringUtils.isNotBlank("subset")){
+        if(StringUtils.isNotBlank(subset)){
             subset = subset.concat(",");
+        }else{
+            subset = "";
         }
         subset = subset.concat(String.valueOf(appUser.getUserid()));
         AppUserAgent updateUserAgent = new AppUserAgent();

+ 52 - 0
game-business/src/main/java/com/game/business/domain/AppUserAgent.java

@@ -12,7 +12,9 @@ import io.swagger.annotations.ApiModelProperty;
 import io.swagger.annotations.ApiModel;
 import lombok.Data;
 
+import java.util.ArrayList;
 import java.util.Date;
+import java.util.List;
 
 /**
  * 用户代理表对象 app_user_agent
@@ -84,4 +86,54 @@ private static final long serialVersionUID=1L;
     @TableField(value = "update_time")
     private Date updateTime;
 
+    @TableField(exist = false)
+    private Double teamWinLose = 0.00;
+
+    @TableField(exist = false)
+    private List<AppUserAgent> childrenList = new ArrayList<>();
+
+    public static AppUserAgent buildTree(List<AppUserAgent> appUserAgentList,Long parentId,List<AppUserCount> appUserCountList){
+        AppUserAgent appUserAgent = new AppUserAgent();
+        if(null != appUserAgentList && appUserAgentList.size() > 0){
+            for(AppUserAgent child : appUserAgentList){
+                if(child.getUserId().equals(parentId)){
+                    appUserAgent = child;
+                    appUserAgent.setTeamWinLose(deal(appUserCountList,appUserAgent.getUserId()));
+                    break;
+                }
+            }
+            buildChildrenList(appUserAgent,appUserAgentList,appUserCountList);
+        }
+        return appUserAgent;
+    }
+
+    public static void buildChildrenList(AppUserAgent appUserAgent,List<AppUserAgent> appUserAgentList,List<AppUserCount> appUserCountList){
+        for(AppUserAgent appUserAgentChild : appUserAgentList){
+             if(appUserAgentChild.getPid().equals(appUserAgent.getUserId())){
+                appUserAgentChild.setTeamWinLose(deal(appUserCountList,appUserAgentChild.getUserId()));
+                appUserAgent.getChildrenList().add(appUserAgentChild);
+                buildChildrenList(appUserAgentChild,appUserAgentList,appUserCountList);
+            }
+        }
+    }
+
+    private static double deal(List<AppUserCount> appUserCountList,Long userId){
+       return appUserCountList.stream().filter(e->e.getUserId().equals(userId)).mapToDouble(e->{
+            return e.getGameLoseAmount() - (e.getGameWinAmount() - (e.getGameBetting() - e.getGameLoseAmount())) - e.getGameCommission() - e.getRechargeGive();
+        }).sum();
+    }
+
+    //递归用户盈亏
+    public static double calMoney(AppUserAgent appUserAgent,double money){
+        money += appUserAgent.getTeamWinLose();
+        if(null != appUserAgent.getChildrenList() && appUserAgent.getChildrenList().size() > 0){
+            for(AppUserAgent child : appUserAgent.getChildrenList()){
+                money = calMoney(child,money);
+            }
+        }
+        return money;
+    }
+
+
+
 }

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

@@ -111,6 +111,11 @@ public class AppUserCount {
     @ApiModelProperty(value = "最后一次更新时间(用于直播、充值、提现增量统计)")
     private Date countTime;
 
+    @Excel(name = "游戏最后一次更新时间")
+    @TableField(value = "game_count_time")
+    @ApiModelProperty(value = "最后一次更新时间(用于游戏返佣)")
+    private Date gameCountTime;
+
     //是否全量更新
     @TableField(exist = false)
     private boolean isUpdate = false;

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

@@ -84,5 +84,5 @@ public interface AppUserAgentMapper extends BaseMapper<AppUserAgent> {
      * 查询所有下级团队列表(递归)
      *
      */
-    public List<AppUserAgent> selectAllAgentList(@Param("pid") Long pid, @Param("userId") Long userId);
+    public List<AppUserAgent> selectAllAgentList(@Param("pid") Long pid, @Param("userId") Long userId,@Param("beginTime") String beginTime, @Param("endTime") String endTime);
 }

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

@@ -92,9 +92,9 @@ public interface IAppUserAgentService extends IService<AppUserAgent> {
     public HttpRet<String> transfer(AppUserTeamTranserDto transfer);
 
     /**
-     * 递归查询所有下级代理
+     * 递归查询所有下级代理(包含自己)
      * */
-    public List<AppUserAgent> selectAllAgentList(Long pid,Long userId);
+    public List<AppUserAgent> selectAllAgentList(Long pid,Long userId,String beginTime,String endTime);
 
     public AppUserAgent selectInfo(Long userId);
 }

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

@@ -4,6 +4,7 @@ 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 com.game.business.domain.AppUserGameRecordCount;
 
 import java.util.List;
 import java.util.Date;
@@ -30,10 +31,17 @@ public interface IAppUserCountService extends IService<AppUserCount> {
 
     public Date selectLastDate();
 
+    public Date selectGameLastDate(Long userId);
+
     public void staticsUserBetting(AppGameBetting appGameBetting,List<AppGameCommission> gameRateList);
 
     /**
      * 查询用户代理统计
      * */
     public List<AppUserCount> getListByUserId(long userId,String beginTime,String endTIme);
+
+    /**
+     * 记录当天已经统计过的用户游戏返佣
+     * */
+    public void setGameCache(List<AppUserGameRecordCount> gameRecordCountList);
 }

+ 59 - 7
game-business/src/main/java/com/game/business/service/impl/AppUserAgentServiceImpl.java

@@ -1,9 +1,14 @@
 package com.game.business.service.impl;
 
+import cn.hutool.core.convert.Convert;
+import cn.hutool.core.date.DateUtil;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 
+import java.math.BigDecimal;
+import java.math.RoundingMode;
 import java.rmi.ServerException;
+import java.text.DecimalFormat;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
@@ -14,9 +19,7 @@ import com.game.business.domain.*;
 import com.game.business.dto.AppAgentEditDto;
 import com.game.business.dto.AppAgentTeamDto;
 import com.game.business.dto.AppUserTeamTranserDto;
-import com.game.business.service.IAppGameCommissionService;
-import com.game.business.service.IAppGameService;
-import com.game.business.service.IAppUserService;
+import com.game.business.service.*;
 import com.game.business.vo.AppAgentTeamVo;
 import com.game.common.constant.AppSceneType;
 import com.game.common.constant.finance.FinTranAddedInfo;
@@ -34,7 +37,6 @@ import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import com.game.business.mapper.AppUserAgentMapper;
-import com.game.business.service.IAppUserAgentService;
 import com.game.common.annotation.DataSource;
 import com.game.common.enums.DataSourceType;
 
@@ -59,6 +61,9 @@ public class AppUserAgentServiceImpl extends ServiceImpl<AppUserAgentMapper, App
     @Autowired
     private IAppGameService appGameService;
 
+    @Autowired
+    private IAppUserCountService appUserCountService;
+
     /**
      * 查询用户代理表
      *
@@ -133,7 +138,7 @@ public class AppUserAgentServiceImpl extends ServiceImpl<AppUserAgentMapper, App
     @Override
     public int countAgent(Long userId, String beginTime, String endTime) {
         LambdaQueryWrapper<AppUserAgent> queryWrapper = new LambdaQueryWrapper<>();
-        queryWrapper.eq(AppUserAgent::getTopId,userId);
+        queryWrapper.eq(AppUserAgent::getPid,userId);
         if(StringUtils.isNotBlank(beginTime)){
             queryWrapper.ge(AppUserAgent::getCreateTime,beginTime);
         }
@@ -192,6 +197,10 @@ public class AppUserAgentServiceImpl extends ServiceImpl<AppUserAgentMapper, App
         if(null == teamDto.getPid()) {
             teamDto.setPid(SecurityUtils.getUserId());
         }
+        if(StringUtils.isBlank(teamDto.getBeginTime()) || StringUtils.isBlank(teamDto.getEndTime())){
+            teamDto.setBeginTime(DateUtil.format(DateUtil.beginOfMonth(DateUtils.getNowDate()), "yyyy-MM-dd"));
+            teamDto.setEndTime(DateUtil.format(DateUtil.endOfMonth(DateUtils.getNowDate()), "yyyy-MM-dd"));
+        }
         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());
@@ -215,6 +224,45 @@ public class AppUserAgentServiceImpl extends ServiceImpl<AppUserAgentMapper, App
                             return gameCommission;
                         }).collect(Collectors.toList()));
                     }
+                    //统计整条线用户数据
+                    List<AppUserCount> appUserCountList = appUserCountService.getAppUserCountNew(e.getUserId(), teamDto.getBeginTime(),teamDto.getEndTime());
+                    if(null != appUserCountList && appUserCountList.size() > 0) {
+                        DecimalFormat df = new DecimalFormat("#.##");
+                        //下注金额
+                        e.setBettingAmount(BigDecimal.valueOf(appUserCountList.stream().mapToDouble(AppUserCount::getGameBetting).sum()).setScale(2, RoundingMode.HALF_UP).doubleValue());
+                        //直播返点
+                        e.setLiveCommission(BigDecimal.valueOf(appUserCountList.stream().mapToDouble(AppUserCount::getLiveCommission).sum()).setScale(2, RoundingMode.HALF_UP).doubleValue());
+                        //游戏返点
+                        e.setGameCommission(BigDecimal.valueOf(appUserCountList.stream().mapToDouble(AppUserCount::getGameCommission).sum()).setScale(2, RoundingMode.HALF_UP).doubleValue());
+                        //盈亏
+                        e.setGameAmount(BigDecimal.valueOf(appUserCountList.stream().mapToDouble(userCount->{
+                            return ((userCount.getGameWinAmount() - (userCount.getGameBetting() - userCount.getGameLoseAmount()))
+                                    - userCount.getGameLoseAmount()) + userCount.getGameCommission() + userCount.getRechargeGive();
+                        }).sum()).setScale(2, RoundingMode.HALF_UP).doubleValue());
+                        //充值金额(由于统计的金额是扣除了手续费并且加上赠送金额的值 故这么计算出原始充值金额)
+                        e.setRechargeAmount(BigDecimal.valueOf(appUserCountList.stream().mapToDouble(userCount->{
+                            return userCount.getRechargeAmount() - userCount.getRechargeGive() + userCount.getRechargeCommission();
+                        }).sum()).setScale(2, RoundingMode.HALF_UP).doubleValue());
+                        //充值手续费
+                        e.setRechargeCommission(BigDecimal.valueOf(appUserCountList.stream().mapToDouble(AppUserCount::getRechargeCommission).sum()).setScale(2, RoundingMode.HALF_UP).doubleValue());
+                        //充值赠送金额
+                        e.setRechargeGive(BigDecimal.valueOf(appUserCountList.stream().mapToDouble(AppUserCount::getRechargeGive).sum()).setScale(2, RoundingMode.HALF_UP).doubleValue());
+                    }else{
+                        //下注金额
+                        e.setBettingAmount(0.00);
+                        //直播返点
+                        e.setLiveCommission(0.00);
+                        //游戏返点
+                        e.setGameCommission(0.00);
+                        //盈亏
+                        e.setGameAmount(0.00);
+                        //充值金额(由于统计的金额是扣除了手续费并且加上赠送金额的值 故这么计算出原始充值金额)
+                        e.setRechargeAmount(0.00);
+                        //充值手续费
+                        e.setRechargeCommission(0.00);
+                        //充值赠送金额
+                        e.setRechargeGive(0.00);
+                    }
                 });
             }
         }
@@ -244,8 +292,12 @@ public class AppUserAgentServiceImpl extends ServiceImpl<AppUserAgentMapper, App
     }
 
     @Override
-    public List<AppUserAgent> selectAllAgentList(Long pid, Long userId) {
-        return appUserAgentMapper.selectAllAgentList(pid,userId);
+    public List<AppUserAgent> selectAllAgentList(Long pid, Long userId,String beginTime,String endTime) {
+        List<AppUserAgent> list = appUserAgentMapper.selectAllAgentList(pid,userId,beginTime,endTime);
+        if(null == list){
+            list = new ArrayList<>();
+        }
+        return list;
     }
 
     @Override

+ 3 - 2
game-business/src/main/java/com/game/business/service/impl/AppUserCountDividendServiceImpl.java

@@ -223,7 +223,8 @@ public class AppUserCountDividendServiceImpl extends ServiceImpl<AppUserCountDiv
 
     @Override
     public void reloadCache(String dateTime, List<Long> userIds) {
-        Date uDate = new Date();
+        //废弃
+        /*Date uDate = new Date();
         if (StringUtils.isNotBlank(dateTime)) {
             uDate = DateUtil.parse(dateTime, "yyyy-MM-dd");
         }
@@ -248,7 +249,7 @@ public class AppUserCountDividendServiceImpl extends ServiceImpl<AppUserCountDiv
                     log.info("用户非代理停止计算周盈亏缓存");
                 }
             });
-        }
+        }*/
     }
 
     private double calculation(Long userId,String beginTime,String endTime){

+ 82 - 30
game-business/src/main/java/com/game/business/service/impl/AppUserCountServiceImpl.java

@@ -7,8 +7,10 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.game.business.domain.*;
 import com.game.business.mapper.AppUserCountMapper;
 import com.game.business.service.*;
+import com.game.common.constant.CacheConstants;
 import com.game.common.constant.finance.FinTranType1;
 import com.game.common.constant.finance.FinTranType3;
+import com.game.common.core.redis.RedisCache;
 import com.game.common.entity.KeyValue;
 import com.game.common.utils.DateUtils;
 import com.game.common.utils.StringUtils;
@@ -55,6 +57,9 @@ public class AppUserCountServiceImpl extends ServiceImpl<AppUserCountMapper, App
     @Autowired
     private IAppUserAgentService appUserAgentService;
 
+    @Autowired
+    private RedisCache redisCache;
+
     @Override
     public List<AppUserCount> getAppUserCount(long userId,String beginTime,String endTIme) {
         LambdaQueryWrapper<AppUserCount> queryWrapper = new LambdaQueryWrapper<AppUserCount>();
@@ -184,7 +189,7 @@ public class AppUserCountServiceImpl extends ServiceImpl<AppUserCountMapper, App
         if(null == appUserCount || null == appUserCount.getUpdateTime()) {
             return DateUtil.beginOfDay(DateUtils.getNowDate());
         }
-        return DateUtil.offsetMillisecond(appUserCount.getUpdateTime(), 1);  //往前加1秒用于增量更新
+        return DateUtil.offsetSecond(appUserCount.getUpdateTime(), 1);  //往前加1秒用于增量更新
     }
 
     /**
@@ -193,45 +198,80 @@ public class AppUserCountServiceImpl extends ServiceImpl<AppUserCountMapper, App
     @Override
     public Date selectLastDate() {
        LambdaQueryWrapper<AppUserCount> queryWrapper = new LambdaQueryWrapper<>();
-       queryWrapper.orderByDesc(AppUserCount::getUpdateTime);
+       queryWrapper.orderByDesc(AppUserCount::getCountTime);
        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毫秒用于增量更新
+       return DateUtil.offsetSecond(appUserCount.getCountTime(), 1);  //往前加1秒用于增量更新
+    }
+
+    /**
+     * 查询最后更新时间
+     * */
+    @Override
+    public Date selectGameLastDate(Long userId) {
+       LambdaQueryWrapper<AppUserCount> queryWrapper = new LambdaQueryWrapper<>();
+       queryWrapper.orderByDesc(AppUserCount::getGameCountTime);
+       queryWrapper.eq(AppUserCount::getUserId,userId);
+       queryWrapper.last("limit 1");
+       AppUserCount appUserCount = appUserCountMapper.selectOne(queryWrapper);
+       if(null == appUserCount || null == appUserCount.getGameCountTime()) {
+           return DateUtil.beginOfDay(DateUtils.getNowDate());
+       }
+       return appUserCount.getGameCountTime();  //往前加1秒用于增量更新
     }
 
     @Override
     public void staticsUserBetting(AppGameBetting appGameBetting,List<AppGameCommission> gameRateList) {
-        Date curDate = DateUtils.getNowDate();
-        String dateTime = DateUtils.parseDateToStr("yyyy-MM-dd", curDate);
+        synchronized (CacheConstants.USER_GAME_RECORD_COUNT.concat(String.valueOf(appGameBetting.getGameId())).concat(appGameBetting.getGameDate())) {
+            Date curDate = DateUtils.getNowDate();
+            String dateTime = DateUtils.parseDateToStr("yyyy-MM-dd", curDate);
+    /*List<Long> userIds = gameRateList.stream().map(AppGameCommission::getUserId).collect(Collectors.toList());
+                    userIds.add(appGameBetting.getUserId());
+                    userIds = userIds.stream().distinct().collect(Collectors.toList());*/
+            //        List<AppUserGameRecordCount> gameRecordCountList = appUserGameRecordCountService.selectByDate(null, null, null,appGameBetting.getGameId(),appGameBetting.getGameDate());
 
-        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(gameRateList.stream().filter(e->e.getUserId().equals(userId)).map(AppGameCommission::getPid).collect(Collectors.toList()).get(0));
-                appUserCount.setUpdateTime(finalCurDate);
-                if(null != gameRecordCountList && gameRecordCountList.size() > 0) {
-                    //游戏佣金 更新所有用户
-                    appUserCount.setGameCommission(gameRecordCountList.stream().filter(e -> e.getUserId().equals(userId)).mapToDouble(e -> e.getCommission()).sum());
-                }
-                //游戏下注金额 更新当前下注用户 (非金币)
-                if(userId.equals(appGameBetting.getUserId()) && appGameBetting.getBettingType().intValue() == 0) {
-                    appUserCount.setGameBetting(appGameBetting.getBettingAmount());
-                }
-                this.createAppUserCount(appUserCount);
-            });
-            //更新周盈亏数据
-            appUserCountDividendService.reloadCache(null,userIds);
+            if (null != gameRateList && gameRateList.size() > 0) {
+
+                String finalDateTime = dateTime;
+                Date finalCurDate = curDate;
+                List<Long> userIds = new ArrayList<>();
+                gameRateList.forEach(gameRate -> {
+                    Long userId = gameRate.getUserId();
+                    //用户最后一次更新时间
+                    Date updateTime = this.selectGameLastDate(userId);
+                    if (!DateUtil.format(updateTime, "yyyy-MM-dd").equals(DateUtil.format(finalCurDate, "yyyy-MM-dd"))) {
+                        //跨天直接从当日零点开始统计
+                        updateTime = DateUtil.beginOfDay(finalCurDate);
+                    }
+                    //查询用户返佣
+                    List<AppUserGameRecordCount> gameRecordCountList = appUserGameRecordCountService.selectByDate(userId, DateUtil.format(updateTime, "yyyy-MM-dd HH:mm:ss"), DateUtil.format(finalCurDate, "yyyy-MM-dd HH:mm:ss"), gameRate.getGameId(), appGameBetting.getGameDate());
+                    userIds.add(userId);
+                    AppUserCount appUserCount = new AppUserCount();
+                    appUserCount.setUserId(userId);
+                    appUserCount.setStrDate(finalDateTime);
+                    appUserCount.setAgentUserId(gameRateList.stream().filter(e -> e.getUserId().equals(userId)).map(AppGameCommission::getPid).collect(Collectors.toList()).get(0));
+                    appUserCount.setUpdateTime(finalCurDate);
+                    appUserCount.setGameCountTime(finalCurDate);
+                    if (null != gameRecordCountList && gameRecordCountList.size() > 0) {
+                        //游戏佣金
+                        Map<String, Double> map = redisCache.getCacheMap(CacheConstants.USER_GAME_RECORD_COUNT.concat(String.valueOf(userId)));
+                        appUserCount.setGameCommission(gameRecordCountList.stream().filter(e -> {
+                            return null == map || null == map.get(String.valueOf(e.getId())); //过滤已统计过的id
+                        }).mapToDouble(e -> e.getCommission()).sum());
+                        setGameCache(gameRecordCountList);
+                    }
+                    //游戏下注金额 更新当前下注用户 (非金币)
+                    if (userId.equals(appGameBetting.getUserId()) && appGameBetting.getBettingType().intValue() == 0) {
+                        appUserCount.setGameBetting(appGameBetting.getBettingAmount());
+                    }
+                    this.createAppUserCount(appUserCount);
+                });
+                //更新周盈亏数据
+                appUserCountDividendService.reloadCache(null, userIds);
+            }
         }
     }
 
@@ -248,6 +288,16 @@ public class AppUserCountServiceImpl extends ServiceImpl<AppUserCountMapper, App
         return appUserCountMapper.selectList(queryWrapper);
     }
 
+    @Override
+    public void setGameCache(List<AppUserGameRecordCount> gameRecordCountList) {
+        if(null != gameRecordCountList && gameRecordCountList.size() > 0) {
+            gameRecordCountList.forEach(e->{
+                //凌晨定时任务清除前一天的数据
+                redisCache.setCacheMapValue(CacheConstants.USER_GAME_RECORD_COUNT.concat(String.valueOf(e.getUserId())),String.valueOf(e.getId()),e.getCommission());
+            });
+        }
+    }
+
     /**
      * 金额为负数则转为正数
      * */
@@ -255,4 +305,6 @@ public class AppUserCountServiceImpl extends ServiceImpl<AppUserCountMapper, App
         return money<0?money*-1:money;
     }
 
+
+
 }

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

@@ -67,6 +67,7 @@ public class AppAgentGameBettingTask {
             AppGameCommission appGameCommission = new AppGameCommission();
             appGameCommission.setUserId(appGameBetting.getUserId());
             appGameCommission.setPid(userAgent.getPid());
+            appGameCommission.setGameRate(0L);
             gameRateList.add(appGameCommission);
             appUserCountService.staticsUserBetting(appGameBetting,gameRateList);
             return;

+ 171 - 75
game-business/src/main/java/com/game/business/task/AppUserCountTask.java

@@ -6,6 +6,7 @@ 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.*;
+import com.game.common.constant.CacheConstants;
 import com.game.common.constant.finance.FinTranType1;
 import com.game.common.constant.finance.FinTranType3;
 import com.game.common.core.redis.RedisCache;
@@ -16,6 +17,7 @@ import lombok.extern.log4j.Log4j2;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 
+import java.math.BigDecimal;
 import java.util.*;
 import java.util.function.Function;
 import java.util.stream.Collectors;
@@ -71,6 +73,8 @@ public class AppUserCountTask {
             if (StringUtils.isNotBlank(dateTime)) {
                 curDate = DateUtil.parse(dateTime, "yyyy-MM-dd");
             } else {
+                //清除前一天游戏返佣缓存
+
                 dateTime = DateUtils.parseDateToStr("yyyy-MM-dd", curDate);
             }
             AppUser queryUser = new AppUser();
@@ -82,6 +86,7 @@ public class AppUserCountTask {
             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"),null,null);
             List<AppGameBetting> gameBettingList = appGameBettingService.selectListByDate(null, dateTime.concat(" 00:00:00"), dateTime.concat(" 23:59:59"),null,null);
+            Date nowDate = new Date();
             if (null != list && list.size() > 0) {
                 List<AppUserCount> appUserCountList = new ArrayList<>();
                 String finalDateTime = dateTime;
@@ -91,6 +96,9 @@ public class AppUserCountTask {
                     appUserCount.setStrDate(finalDateTime);
                     appUserCount.setAgentUserId(appUser.getPid());
                     appUserCount.setUpdate(true);//全量更新
+                    appUserCount.setCountTime(nowDate);
+                    appUserCount.setGameCountTime(nowDate);
+                    appUserCount.setUpdateTime(nowDate);
                     //充值总额
                     appUserCount.setRechargeAmount(appUsersChargeList.stream().filter(e -> e.getUid().equals(appUser.getUserid())).mapToDouble(e -> e.getCoin().doubleValue()).sum());
                     //提现金额
@@ -137,6 +145,8 @@ public class AppUserCountTask {
                     appUserCountService.createAppUserCount(appUserCount);
                 });
             }
+            //统计游戏返佣缓存
+            appUserCountService.setGameCache(gameRecordCountList);
 
             //统计当日用户游戏输赢
             if (null != gameBettingList && gameBettingList.size() > 0) {
@@ -249,90 +259,171 @@ public class AppUserCountTask {
     public void calculateDividends(String dateTime){
         try {
             log.info("开始每周代理分红");
-            Date curDate = DateUtil.offsetDay(DateUtils.getNowDate(), -1);
-            if (StringUtils.isNotBlank(dateTime)) {
-                curDate = DateUtil.parse(dateTime, "yyyy-MM-dd");
-            } else {
-                dateTime = DateUtils.parseDateToStr("yyyy-MM-dd", curDate);
-            }
-            Date beginTime = DateUtil.beginOfWeek(curDate);
-            Date endTime = DateUtil.endOfWeek(curDate);
-            //查询所有总代理用户
-            /*AppUser queryUser = new AppUser();
-            queryUser.setAgentFlag(1);
-            List<AppUser> list = appUserService.selectAppUserList(queryUser);*/
-            List<AppUser> list = appUserService.selectTeamUserList();
-            if (null != list && list.size() > 0) {
-                list.forEach(appUser -> {
-                    //查询用户所有下级本周盈亏
+            dealDividendsNew(dateTime);
+            log.info("每周代理分红完成");
+        }catch (Exception e){
+            log.info("每周分红失败:{}",e.getMessage());
+        }
+
+    }
+
+    /**
+     * 分红(已废弃)
+     * */
+    private void dealDividends(String dateTime){
+        Date curDate = DateUtil.offsetDay(DateUtils.getNowDate(), -1);
+        if (StringUtils.isNotBlank(dateTime)) {
+            curDate = DateUtil.parse(dateTime, "yyyy-MM-dd");
+        } else {
+            dateTime = DateUtils.parseDateToStr("yyyy-MM-dd", curDate);
+        }
+        Date beginTime = DateUtil.beginOfWeek(curDate);
+        Date endTime = DateUtil.endOfWeek(curDate);
+        //查询所有总代理用户
+        AppUser queryUser = new AppUser();
+        queryUser.setAgentFlag(1);
+        List<AppUser> list = appUserService.selectAppUserList(queryUser);
+//            List<AppUser> list = appUserService.selectTeamUserList();
+        if (null != list && list.size() > 0) {
+            list.forEach(appUser -> {
+                String beginTimeStr = DateUtil.format(beginTime,"yyyy-MM-dd");
+                String endTimeStr = DateUtil.format(endTime,"yyyy-MM-dd");
+                //查询用户所有下级本周盈亏
                     /*LambdaQueryWrapper<AppUserCount> queryWrapper = new LambdaQueryWrapper<>();
-                    queryWrapper.ge(AppUserCount::getStrDate, beginTime);
-                    queryWrapper.le(AppUserCount::getStrDate, endTime);
+                    queryWrapper.ge(AppUserCount::getStrDate, beginTimeStr);
+                    queryWrapper.le(AppUserCount::getStrDate, endTimeStr);
                     queryWrapper.eq(AppUserCount::getAgentUserId, appUser.getUserid());
                     List<AppUserCount> appUserCountList = appUserCountService.list(queryWrapper);*/
-                    String beginTimeStr = DateUtil.format(beginTime,"yyyy-MM-dd");
-                    String endTimeStr = DateUtil.format(endTime,"yyyy-MM-dd");
-                    List<AppUserCount> appUserCountList = appUserCountService.getAppUserCountNew(appUser.getUserid(),beginTimeStr,endTimeStr);
-                    if (null != appUserCountList && appUserCountList.size() > 0) {
-                        //游戏输钱
-                        double loseAmount = appUserCountList.stream().mapToDouble(e -> e.getGameLoseAmount()).sum();
-                        //游戏赢钱
-                        double winAmount = appUserCountList.stream().mapToDouble(e -> e.getGameWinAmount()).sum();
-                        //提现手续费
-                        double withdrawalCommission = appUserCountList.stream().mapToDouble(e -> e.getWithdrawalCommission()).sum();
-                        //游戏佣金
-                        double gameCommission = appUserCountList.stream().mapToDouble(e -> e.getGameCommission()).sum();
-                        //直播佣金
-                        double liveCommission = appUserCountList.stream().mapToDouble(e -> e.getLiveCommission()).sum();
-                        //充值赠送
-                        double rechargeGive = appUserCountList.stream().mapToDouble(e -> e.getRechargeGive()).sum();
-
-                        //计算分红金额 (输-赢)
+                List<AppUserCount> appUserCountList = appUserCountService.getAppUserCountNew(appUser.getUserid(),beginTimeStr,endTimeStr);
+                if (null != appUserCountList && appUserCountList.size() > 0) {
+                    //游戏输钱
+                    double loseAmount = appUserCountList.stream().mapToDouble(e -> e.getGameLoseAmount()).sum();
+                    //游戏赢钱
+                    double winAmount = appUserCountList.stream().mapToDouble(e -> e.getGameWinAmount()).sum();
+                    //提现手续费
+                    double withdrawalCommission = appUserCountList.stream().mapToDouble(e -> e.getWithdrawalCommission()).sum();
+                    //游戏佣金
+                    double gameCommission = appUserCountList.stream().mapToDouble(e -> e.getGameCommission()).sum();
+                    //直播佣金
+                    double liveCommission = appUserCountList.stream().mapToDouble(e -> e.getLiveCommission()).sum();
+                    //充值赠送
+                    double rechargeGive = appUserCountList.stream().mapToDouble(e -> e.getRechargeGive()).sum();
+
+                    //计算分红金额 (输-赢)
 //                        double money = (loseAmount - winAmount) - withdrawalCommission - gameCommission - liveCommission;
-                        double money = (loseAmount - winAmount)  - gameCommission - rechargeGive;
-                        if (money > 0) {
-                            //金额大于0 满足分红
-
-                            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;
-                                    }
-                                    double rate = userAgent.getDividendGuaranteeRate();
-                                    double dividends = money * rate/100;
-                                    AppUserCountDividend appUserCountDividend = new AppUserCountDividend();
-                                    appUserCountDividend.setUserId(userAgent.getUserId());
-                                    appUserCountDividend.setDateNo(DateUtil.format(endTime, "yyyy-MM-dd"));
-                                    appUserCountDividend.setBeginTime(beginTime);
-                                    appUserCountDividend.setEndTime(endTime);
-                                    appUserCountDividend.setProfitLoss(money);
-                                    appUserCountDividend.setRate(rate);
-                                    appUserCountDividend.setCoin(0.00);
-                                    appUserCountDividend.setDiamondCoin(dividends);
-                                    appUserCountDividend.setStatus(0);
-                                    appUserCountDividendService.insertAppUserCountDividend(appUserCountDividend);
-                                });
-                            } else {
-                                log.info("用户{},所有下级亏损{},查询下级为空,停止分红", appUser.getUserid(), money);
-                            }
+                    double money = (loseAmount - winAmount)  - gameCommission - rechargeGive;
+                    if (money > 0) {
+                        //金额大于0 满足分红
+                        //查询当前用户所有下级
+                        AppUserAgent queryAppUserAgent = new AppUserAgent();
+                        queryAppUserAgent.setPid(appUser.getUserid());
+                        List<AppUserAgent> appUserAgentList = appUserAgentService.selectAppUserAgentList(queryAppUserAgent);
+                        if (null != appUserAgentList && appUserAgentList.size() > 0) {
+                            appUserAgentList.forEach(userAgent -> {
+                                if (userAgent.getDividendGuaranteeRate() <= 0.00) {
+                                    log.info("用户{},团队亏损{},或未设置分红比例,停止分红", userAgent.getUserId(), money);
+                                    return;
+                                }
+                                double rate = userAgent.getDividendGuaranteeRate();
+                                double dividends = BigDecimal.valueOf(money * rate/100).setScale(2,BigDecimal.ROUND_HALF_UP).doubleValue();
+                                AppUserCountDividend appUserCountDividend = new AppUserCountDividend();
+                                appUserCountDividend.setUserId(userAgent.getUserId());
+                                appUserCountDividend.setDateNo(DateUtil.format(endTime, "yyyy-MM-dd"));
+                                appUserCountDividend.setBeginTime(beginTime);
+                                appUserCountDividend.setEndTime(endTime);
+                                appUserCountDividend.setProfitLoss(money);
+                                appUserCountDividend.setRate(rate);
+                                appUserCountDividend.setCoin(0.00);
+                                appUserCountDividend.setDiamondCoin(dividends);
+                                appUserCountDividend.setStatus(0);
+                                appUserCountDividendService.insertAppUserCountDividend(appUserCountDividend);
+                            });
                         } else {
-                            log.info("用户{},所有下级亏损{},不满足分红条件", appUser.getUserid(), money);
+                            log.info("用户{},所有下级亏损{},查询下级为空,停止分红", appUser.getUserid(), money);
                         }
+                    } else {
+                        log.info("用户{},所有下级亏损{},不满足分红条件", appUser.getUserid(), money);
                     }
-                });
-            }
-            log.info("每周代理分红完成");
-        }catch (Exception e){
-            log.info("每周分红失败:{}",e.getMessage());
+                }
+            });
         }
+    }
 
+    /**
+     * 分红
+     * */
+    private void dealDividendsNew(String dateTime){
+        Date curDate = DateUtil.offsetDay(DateUtils.getNowDate(), -1);
+        if (StringUtils.isNotBlank(dateTime)) {
+            curDate = DateUtil.parse(dateTime, "yyyy-MM-dd");
+        } else {
+            dateTime = DateUtils.parseDateToStr("yyyy-MM-dd", curDate);
+        }
+        Date beginTime = DateUtil.beginOfWeek(curDate);
+        Date endTime = DateUtil.endOfWeek(curDate);
+        //查询所有总代理用户
+        AppUser queryUser = new AppUser();
+        queryUser.setAgentFlag(1);
+        List<AppUser> list = appUserService.selectAppUserList(queryUser);
+//            List<AppUser> list = appUserService.selectTeamUserList();
+        if (null != list && list.size() > 0) {
+            list.forEach(appUser -> {
+                AppUserAgent userAgent = appUserAgentService.selectInfo(appUser.getUserid());
+                if (userAgent.getDividendGuaranteeRate() <= 0.00) {
+                    log.info("用户{},未设置分红比例,停止分红", userAgent.getUserId());
+                    return;
+                }
+                String beginTimeStr = DateUtil.format(beginTime,"yyyy-MM-dd");
+                String endTimeStr = DateUtil.format(endTime,"yyyy-MM-dd");
+                //查询用户所有下级本周盈亏
+                    /*LambdaQueryWrapper<AppUserCount> queryWrapper = new LambdaQueryWrapper<>();
+                    queryWrapper.ge(AppUserCount::getStrDate, beginTimeStr);
+                    queryWrapper.le(AppUserCount::getStrDate, endTimeStr);
+                    queryWrapper.eq(AppUserCount::getAgentUserId, appUser.getUserid());
+                    List<AppUserCount> appUserCountList = appUserCountService.list(queryWrapper);*/
+                List<AppUserCount> appUserCountList = appUserCountService.getAppUserCountNew(appUser.getUserid(),beginTimeStr,endTimeStr);
+                if (null != appUserCountList && appUserCountList.size() > 0) {
+                    //游戏输钱
+                    double loseAmount = appUserCountList.stream().mapToDouble(e -> e.getGameLoseAmount()).sum();
+                    //游戏赢钱
+                    double winAmount = appUserCountList.stream().mapToDouble(e -> {
+                        return e.getGameWinAmount() - (e.getGameBetting() - e.getGameLoseAmount()); //实际赢钱 = 赢 - 中奖本金
+                    }).sum();
+                    //提现手续费
+                    double withdrawalCommission = appUserCountList.stream().mapToDouble(e -> e.getWithdrawalCommission()).sum();
+                    //游戏佣金
+                    double gameCommission = appUserCountList.stream().mapToDouble(e -> e.getGameCommission()).sum();
+                    //直播佣金
+                    double liveCommission = appUserCountList.stream().mapToDouble(e -> e.getLiveCommission()).sum();
+                    //充值赠送
+                    double rechargeGive = appUserCountList.stream().mapToDouble(e -> e.getRechargeGive()).sum();
+
+                    //计算分红金额 (输-赢)
+//                        double money = (loseAmount - winAmount) - withdrawalCommission - gameCommission - liveCommission;
+                    double money = (loseAmount - winAmount)  - gameCommission - rechargeGive;
+                    if (money > 0) {
+                        //金额大于0 满足分红
+                        double rate = userAgent.getDividendGuaranteeRate();
+                        double dividends = BigDecimal.valueOf(money * rate/100).setScale(2,BigDecimal.ROUND_HALF_UP).doubleValue();
+                        AppUserCountDividend appUserCountDividend = new AppUserCountDividend();
+                        appUserCountDividend.setUserId(userAgent.getUserId());
+                        appUserCountDividend.setDateNo(DateUtil.format(endTime, "yyyy-MM-dd"));
+                        appUserCountDividend.setBeginTime(beginTime);
+                        appUserCountDividend.setEndTime(endTime);
+                        appUserCountDividend.setProfitLoss(money);
+                        appUserCountDividend.setRate(rate);
+                        appUserCountDividend.setCoin(0.00);
+                        appUserCountDividend.setDiamondCoin(dividends);
+                        appUserCountDividend.setStatus(0);
+                        appUserCountDividendService.insertAppUserCountDividend(appUserCountDividend);
+                    } else {
+                        log.info("用户{},所有下级亏损{},没有亏损停止分红", appUser.getUserid(), money);
+                    }
+                } else {
+                    log.info("用户{},团队没有流水停止分红", appUser.getUserid());
+                }
+            });
+        }
     }
 
     /**
@@ -354,6 +445,11 @@ public class AppUserCountTask {
         appUserCountDividendService.reloadCache(dateTime,StringUtils.isBlank(topUserId)?null:Arrays.asList(Long.valueOf(topUserId)));
     }
 
+    //凌晨清除缓存
+    public void cleanCache(){
+        redisCache.deleteObject(CacheConstants.USER_GAME_RECORD_COUNT.concat("*"));
+    }
+
     /**
      * 金额为负数则转为正数
      * */

+ 14 - 1
game-business/src/main/resources/mapper/business/AppUserAgentMapper.xml

@@ -221,16 +221,29 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
            SELECT *
            FROM app_user_agent
            WHERE pid = #{pid}
-
+          <if test="beginTime != null and beginTime != ''">
+             and <![CDATA[create_time >= #{beginTime} ]]>
+          </if>
+          <if test="endTime != null and endTime != ''">
+                and <![CDATA[create_time <= #{endTime} ]]>
+          </if>
            UNION ALL
 
            SELECT o.*
            FROM app_user_agent o
                     JOIN useragent s ON o.pid = s.user_id
+            <if test="beginTime != null and beginTime != ''">
+                and <![CDATA[o.create_time >= #{beginTime} ]]>
+            </if>
+            <if test="endTime != null and endTime != ''">
+                and <![CDATA[o.create_time <= #{endTime} ]]>
+            </if>
        )
         SELECT * FROM useragent where 1=1
         <if test="userId != null">
             and user_id = #{userId}
         </if>
+        union all
+        select * from app_user_agent where user_id = #{pid}
     </select>
 </mapper>

+ 5 - 0
game-common/src/main/java/com/game/common/constant/CacheConstants.java

@@ -47,4 +47,9 @@ public class CacheConstants
      */
     public static final String USER_AGENT_TEAM_PHASE = "user_agent_team_phase";
 
+    /**
+     * 用户已经统计过的游戏返佣
+     */
+    public static final String USER_GAME_RECORD_COUNT = "user_game_record_count:";
+
 }

+ 8 - 0
game-common/src/main/java/com/game/common/core/controller/BaseController.java

@@ -55,6 +55,14 @@ public class BaseController
         PageUtils.startPage();
     }
 
+    /**
+     * 设置请求分页数据(限制每页最大条数)
+     */
+    protected void startPageBySize(Integer size)
+    {
+        PageUtils.startPageBySize(size);
+    }
+
     /**
      * 设置请求排序数据
      */

+ 15 - 0
game-common/src/main/java/com/game/common/utils/PageUtils.java

@@ -24,6 +24,21 @@ public class PageUtils extends PageHelper
 //        Boolean reasonable = pageDomain.getReasonable();
         PageHelper.startPage(pageNum, pageSize, orderBy);
     }
+    /**
+     * 设置请求分页数据(传最大条数)
+     */
+    public static void startPageBySize(Integer size)
+    {
+        PageDomain pageDomain = TableSupport.buildPageRequest();
+        Integer pageNum = pageDomain.getPageNum();
+        Integer pageSize = pageDomain.getPageSize();
+        if(null != size && pageSize > size) {
+            pageSize = size;
+        }
+        String orderBy = SqlUtil.escapeOrderBySql(pageDomain.getOrderBy());
+//        Boolean reasonable = pageDomain.getReasonable();
+        PageHelper.startPage(pageNum, pageSize, orderBy);
+    }
 
     /**
      * 清理分页的线程变量