package cc.mrbird.febs.job; import cc.mrbird.febs.common.utils.RedisUtils; import cc.mrbird.febs.dapp.entity.*; import cc.mrbird.febs.dapp.enumerate.DataDictionaryEnum; import cc.mrbird.febs.dapp.mapper.*; import cc.mrbird.febs.dapp.service.DappWalletService; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.date.DateTime; import cn.hutool.core.date.DateUtil; import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.RandomUtil; import cn.hutool.core.util.StrUtil; import cn.hutool.json.JSONObject; import cn.hutool.json.JSONUtil; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.jline.utils.Log; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; import java.math.BigDecimal; import java.text.DecimalFormat; import java.text.Format; import java.text.SimpleDateFormat; import java.util.*; @Slf4j @Component public class OnHookPlanJob { @Autowired private IgtOnHookPlanOrderItemDao igtOnHookPlanOrderItemDao; @Autowired private IgtOnHookPlanOrderDao igtOnHookPlanOrderDao; @Autowired private DappWalletCoinDao dappWalletCoinDao; @Autowired private DappAccountMoneyChangeDao dappAccountMoneyChangeDao; @Autowired private DappMemberDao dappMemberDao; @Autowired private DappOnHookAwardDao dappOnHookAwardDao; @Autowired private RedisUtils redisUtils; @Autowired private DataDictionaryCustomMapper dataDictionaryCustomMapper; @Autowired private DappWalletService dappWalletService; /** * 五分钟更新一次数据 * 让挂机字表的状态为1:已生效 * 更新挂机主表的挂机剩余金额总收益 * 如果挂机主表的状态为1开始,但是挂机子表中已经没有对应数据,则更新挂机主表的状态 */ // @Scheduled(cron = "0/5 * * * * ? ") @Scheduled(cron = "0 0/5 * * * ? ") public void updatePlanOrderItem(){ Log.info("开始更新挂机子表状态"); List igtOnHookPlanOrders = igtOnHookPlanOrderDao.selectByState(1); if(CollUtil.isEmpty(igtOnHookPlanOrders)){ return; } for(IgtOnHookPlanOrder igtOnHookPlanOrder : igtOnHookPlanOrders){ //让挂机子表的状态为1:已生效 Long orderId = igtOnHookPlanOrder.getId(); Long memberId = igtOnHookPlanOrder.getMemberId(); IgtOnHookPlanOrderItem igtOnHookPlanOrderItem = igtOnHookPlanOrderItemDao.selectByOrderIdAndMemberIdAndState(orderId,memberId,2); if(ObjectUtil.isNotEmpty(igtOnHookPlanOrderItem)){ igtOnHookPlanOrderItem.setState(1); igtOnHookPlanOrderItemDao.updateById(igtOnHookPlanOrderItem); if(2 == igtOnHookPlanOrderItem.getIsGoal()){ //如果中奖,增加挂机主表的挂机总收益 Integer updateCount = igtOnHookPlanOrderDao.AddProfitById(igtOnHookPlanOrder.getId() ,igtOnHookPlanOrderItem.getProfit()); }else{ //如果不中奖,减少挂机剩余金额即减少本金 Integer updateCount = igtOnHookPlanOrderDao.updateAvaAmountById(igtOnHookPlanOrder.getId() ,igtOnHookPlanOrderItem.getAmount()); } } } } /** * 根据订单主表获取订单主表中还在开始状态的订单 * 查询相关关联的子表 * 如果子表中的关联数据都已经 生效状态 1:已生效,则 * 1、更新主表状态为结束 * 2、计算总盈利 * 3、更新用户的余额和总额 * 4、生成一条资金流水记录 * 5、TODO * 根据会员等级计算其他的流水,比如分佣金这类操作 */ // @Scheduled(cron = "0/5 * * * * ? ") @Scheduled(cron = "0 0/1 * * * ? ") public void updatePlanOrder(){ Log.info("开始更新挂机主表状态"); List igtOnHookPlanOrders = igtOnHookPlanOrderDao.selectByState(1); if(CollUtil.isEmpty(igtOnHookPlanOrders)){ return; } for(IgtOnHookPlanOrder igtOnHookPlanOrder : igtOnHookPlanOrders){ Long orderId = igtOnHookPlanOrder.getId(); Long memberId = igtOnHookPlanOrder.getMemberId(); BigDecimal planAmount = igtOnHookPlanOrder.getPlanAmount(); BigDecimal avaAmount = igtOnHookPlanOrder.getAvaAmount(); IgtOnHookPlanOrderItem igtOnHookPlanOrderItem = igtOnHookPlanOrderItemDao.selectByOrderIdAndMemberIdAndState(orderId,memberId,2); if(ObjectUtil.isEmpty(igtOnHookPlanOrderItem)){ BigDecimal totalProfit = igtOnHookPlanOrderItemDao.selectTotalProfitByByOrderIdAndMemberIdAndState(orderId,memberId,1,2); DappMemberEntity dappMemberEntity = dappMemberDao.selectById(memberId); String refererIds = dappMemberEntity.getRefererIds(); List refererIdList = StrUtil.split(refererIds, ",", -1, true, true); //生成流水佣金和盈利分成和流水记录,返回剩余盈利 BigDecimal profitSharingTotal = dappWalletService.updateLSYJYLFC(refererIdList, totalProfit); //平台分成,返回剩余盈利 BigDecimal systemTotal = dappWalletService.updatePTFC(memberId,totalProfit); totalProfit = totalProfit.subtract(profitSharingTotal).subtract(systemTotal); //获取用户信息的是否盈利字段 DappMemberEntity dappMember = dappMemberDao.selectById(memberId); Integer isProfit = dappMember.getIsProfit() == null ? 1 : dappMember.getIsProfit(); BigDecimal totalAmount = igtOnHookPlanOrderItemDao.selectTotalAmountByByOrderIdAndMemberIdAndState(orderId,memberId,1,1); igtOnHookPlanOrder.setState(2); //一次挂机剩余的全部金额 BigDecimal totalMoney = BigDecimal.ZERO; if(isProfit == 2){ //设置成不盈利,只返回收益加剩余挂机总金额 totalMoney = totalProfit.add(avaAmount); }else{ //设置成盈利,如果中奖,返回收益,如果没中奖,则返回本金,最后加上剩余总挂机金额 totalMoney = totalProfit.add(totalAmount).add(avaAmount); } if(totalMoney.compareTo(planAmount)<=0){ igtOnHookPlanOrder.setProfitState(2); }else{ igtOnHookPlanOrder.setProfitState(1); } igtOnHookPlanOrder.setProfit(totalProfit); igtOnHookPlanOrderDao.updateById(igtOnHookPlanOrder); dappMemberEntity.setIsOnHook(3); dappMemberDao.updateById(dappMemberEntity); DappWalletCoinEntity dappWalletCoinEntity = dappWalletCoinDao.selectByMemberId(memberId); BigDecimal availableAmount = dappWalletCoinEntity.getAvailableAmount(); BigDecimal total = BigDecimal.ZERO; if(isProfit == 2){ //设置成不盈利,只返回收益加剩余挂机总金额 total = totalProfit.add(igtOnHookPlanOrder.getAvaAmount()).setScale(4, BigDecimal.ROUND_DOWN); }else{ //设置成盈利,如果中奖,返回收益,如果没中奖,则返回本金,最后加上剩余总挂机金额 total = totalProfit.add(totalAmount).add(igtOnHookPlanOrder.getAvaAmount()).setScale(4, BigDecimal.ROUND_DOWN); } dappWalletCoinDao.addTotalAndaddAvailableById(dappWalletCoinEntity.getId(),total); BigDecimal add = availableAmount.add(total); BigDecimal subtract = add.subtract(totalProfit); DappAccountMoneyChangeEntity dappAccountMoneyChangeEntity = new DappAccountMoneyChangeEntity(memberId, subtract, totalProfit, add, "投注盈利", 5); dappAccountMoneyChangeDao.insert(dappAccountMoneyChangeEntity); } } } @Scheduled(cron = "0 0/1 * * * ? ") public void updateMemberIsOnHook(){ Log.info("开始更新用户是否挂机状态"); dappMemberDao.updateIsOnHook(); } @Scheduled(cron = "0 0/1 * * * ? ") public void createAwardInfo(){ Log.info("挂机开奖记录"); /** * 每天跑一次,直接生成全部的记录 * 产生中奖记录 */ //每天开奖次数 288次 DateTime date = DateUtil.date(); String aWardTime = DateUtil.format(date, "yyyy-MM-dd"); DateTime aWardTimeStart = DateUtil.parseDateTime(aWardTime + " 00:00:00"); // DateTime dateTime = DateUtil.offsetMinute(aWardTimeStart, 5); SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd"); String yyyyMMdd = sdf.format(date); QueryWrapper dappOnHookAwardQueryWrapper = new QueryWrapper(); dappOnHookAwardQueryWrapper.like("record_num",yyyyMMdd); Integer selectCount = dappOnHookAwardDao.selectCount(dappOnHookAwardQueryWrapper); if(0 == selectCount){ Format formatCount = new DecimalFormat("000"); //一般都是将累加的数字当做一些单号的一部分,format要求string int dayMillise = (24 * 60) / 5; for(int i= 1;i <= dayMillise;i++){ DappOnHookAward dappOnHookAward = new DappOnHookAward(); int randomInt = RandomUtil.randomInt(10000, 99999); dappOnHookAward.setAwardNum(Integer.toString(randomInt)); dappOnHookAward.setState(2); String str = formatCount.format(i); dappOnHookAward.setRecordNum(yyyyMMdd+str); dappOnHookAward.setAwardTime(aWardTimeStart); dappOnHookAwardDao.insert(dappOnHookAward); aWardTimeStart = DateUtil.offsetMinute(aWardTimeStart, 5); } } DateTime tomorrow = DateUtil.tomorrow(); String tomorrowTime = DateUtil.format(tomorrow, "yyyy-MM-dd"); DateTime tomorrowTimeStart = DateUtil.parseDateTime(tomorrowTime + " 00:00:00"); // DateTime dateTime = DateUtil.offsetMinute(aWardTimeStart, 5); String tomorrowYyyyMMdd = sdf.format(tomorrow); QueryWrapper tomorrowYyyyMMddWrapper = new QueryWrapper(); tomorrowYyyyMMddWrapper.like("record_num",tomorrowYyyyMMdd); Integer tomorrowSelectCount = dappOnHookAwardDao.selectCount(tomorrowYyyyMMddWrapper); if(0 == tomorrowSelectCount){ Format formatCount = new DecimalFormat("000"); //一般都是将累加的数字当做一些单号的一部分,format要求string int dayMilliseT = (24 * 60) / 5; for(int i= 1;i <= dayMilliseT;i++){ DappOnHookAward dappOnHookAward = new DappOnHookAward(); int randomInt = RandomUtil.randomInt(10000, 99999); dappOnHookAward.setAwardNum(Integer.toString(randomInt)); dappOnHookAward.setState(2); String str = formatCount.format(i); dappOnHookAward.setRecordNum(tomorrowYyyyMMdd+str); dappOnHookAward.setAwardTime(tomorrowTimeStart); dappOnHookAwardDao.insert(dappOnHookAward); tomorrowTimeStart = DateUtil.offsetMinute(tomorrowTimeStart, 5); } } } @Scheduled(cron = "0 0/5 * * * ? ") public void updateAwardInfo(){ Log.info("更新挂架开奖记录"); DateTime date = DateUtil.date(); SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm"); String yyyyMMddHHMM = sdf.format(date); DappOnHookAward dappOnHookAward = dappOnHookAwardDao.selectByByAwardTime(yyyyMMddHHMM); dappOnHookAward.setState(1); dappOnHookAwardDao.updateById(dappOnHookAward); String redisKey = "on_hook_award_id"; String onHookAwardRedisId = redisUtils.getString(redisKey); if(StrUtil.isBlank(onHookAwardRedisId)){ redisUtils.set(redisKey,dappOnHookAward.getId().toString(),0L); } redisUtils.set(redisKey,dappOnHookAward.getId().toString(),0L); } /** * 更新用户等级的条件 * 一天跑一次,跑完之后进行分佣,和盈利分成 * 1、三个有效的用户等级用户 * 2、账户余额大于51 */ @Scheduled(cron = "0 0 1 * * ? ") public void updateMemberLevel(){ Log.info("更新用户代理等级"); DateTime date = DateUtil.date(); //查询账户总金额大于51的有效用户 List dappMemberEntities = dappWalletCoinDao.selectTotalAmount(); if(CollUtil.isEmpty(dappMemberEntities)){ //没有账户金额大于51,则全部为会员 dappMemberDao.updateIdentity(); }else{ List LEVEL_IB = getMemberLevelList(dappMemberEntities, DataDictionaryEnum.LEVEL_MB.getCode(), DataDictionaryEnum.LEVEL_IB.getCode()); List LEVEL_FIB = getMemberLevelList(LEVEL_IB, DataDictionaryEnum.LEVEL_IB.getCode(), DataDictionaryEnum.LEVEL_FIB.getCode()); List LEVEL_CIB = getMemberLevelList(LEVEL_FIB, DataDictionaryEnum.LEVEL_FIB.getCode(), DataDictionaryEnum.LEVEL_CIB.getCode()); List LEVEL_AIB = getMemberLevelList(LEVEL_CIB, DataDictionaryEnum.LEVEL_CIB.getCode(), DataDictionaryEnum.LEVEL_AIB.getCode()); List LEVEL_GIB = getMemberLevelList(LEVEL_AIB, DataDictionaryEnum.LEVEL_AIB.getCode(), DataDictionaryEnum.LEVEL_GIB.getCode()); List LEVEL_BP = getMemberLevelList(LEVEL_GIB, DataDictionaryEnum.LEVEL_GIB.getCode(), DataDictionaryEnum.LEVEL_BP.getCode()); List LEVEL_SP = getMemberLevelList(LEVEL_BP, DataDictionaryEnum.LEVEL_BP.getCode(), DataDictionaryEnum.LEVEL_SP.getCode()); List LEVEL_GP = getMemberLevelList(LEVEL_SP, DataDictionaryEnum.LEVEL_SP.getCode(), DataDictionaryEnum.LEVEL_GP.getCode()); } } private List getMemberLevelList(List dappMemberEntities,String identity,String identityNext){ List dappMemberEntitiesNext = new ArrayList<>(); if(CollUtil.isNotEmpty(dappMemberEntities)){ for(DappMemberEntity dappMemberEntity : dappMemberEntities){ Long memberEntityId = dappMemberEntity.getId(); String refererId = dappMemberEntity.getRefererId(); String inviteId = dappMemberEntity.getInviteId(); //下级是否存在三个账户总金额大于51的会员,并且代理等级为identity List levelMbMembers = dappMemberDao.selectTotalAmountByRefererIdAndIdentity(inviteId,identity); if(CollUtil.isNotEmpty(levelMbMembers) && 3 <= levelMbMembers.size()){ //设置identityNext级别 dappMemberDao.updateIdentityByMemberId(identityNext,memberEntityId); //获取他的上级会员信息 DappMemberEntity dappMemberEntityNext = dappMemberDao.selectMemberInfoByInviteId(refererId); dappMemberEntitiesNext.add(dappMemberEntityNext); } } } return dappMemberEntitiesNext; } public static void main(String[] args) { DateTime date = DateUtil.date(); SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm"); String yyyyMMddHHMM = sdf.format(date); System.out.println(yyyyMMddHHMM); DateTime date1 = DateUtil.date(); SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd HH:mm"); String yyyyMMddHHMM1 = sdf1.format(date1); System.out.println(yyyyMMddHHMM1); } }