package cc.mrbird.febs.dapp.service.impl; import cc.mrbird.febs.common.configure.i18n.MessageSourceUtils; import cc.mrbird.febs.common.contants.AppContants; import cc.mrbird.febs.common.entity.FebsResponse; import cc.mrbird.febs.common.exception.FebsException; import cc.mrbird.febs.common.utils.LoginUserUtil; import cc.mrbird.febs.common.utils.RedisUtils; import cc.mrbird.febs.dapp.dto.ApiStartDto; import cc.mrbird.febs.dapp.entity.*; import cc.mrbird.febs.dapp.enumerate.DataDictionaryEnum; import cc.mrbird.febs.dapp.enumerate.MemberOnHookPlanEnum; import cc.mrbird.febs.dapp.mapper.*; import cc.mrbird.febs.dapp.service.ApiIgtOnHookPlanService; import cc.mrbird.febs.dapp.service.DappWalletService; import cc.mrbird.febs.dapp.vo.ApiAwardInfoVo; import cc.mrbird.febs.dapp.vo.ApiPlanInfoVo; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.date.DateTime; import cn.hutool.core.date.DateUnit; import cn.hutool.core.date.DateUtil; import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; import cn.hutool.json.JSON; import cn.hutool.json.JSONObject; import cn.hutool.json.JSONUtil; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.aspectj.bridge.MessageUtil; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.math.BigDecimal; import java.text.SimpleDateFormat; import java.util.*; @Slf4j @Service @RequiredArgsConstructor public class ApiIgtOnHookPlanServiceImpl extends ServiceImpl implements ApiIgtOnHookPlanService { private final IgtOnHookPlanOrderDao igtOnHookPlanOrderDao; private final IgtOnHookPlanOrderItemDao igtOnHookPlanOrderItemDao; private final DappWalletCoinDao dappWalletCoinDao; private final DataDictionaryCustomMapper dataDictionaryCustomMapper; private final DappMemberDao dappMemberDao; private final DappAccountMoneyChangeDao dappAccountMoneyChangeDao; private final RedisUtils redisUtils; private final DappOnHookAwardDao dappOnHookAwardDao; private final DappWalletService dappWalletService; private final DappOnHookDoneDao dappOnHookDoneDao; @Value("${spring.profiles.active}") private String active; @Override @Transactional(rollbackFor = Exception.class) public FebsResponse start(ApiStartDto apiStartDto) { /** * 开始挂机 * 增加一条挂机记录 * 匹配收益方案(预先生成) * 发送一条mq消息,根据受益方案生成挂机字表未生效详细记录 * 余额减少 * 更新用户表是否正在挂机状态字段 * 定时器五分钟去更新一下详细记录的状态 * */ //todo 发送一条mq消息,根据受益方案生成挂机字表未生效详细记录(目前定时器) DappMemberEntity dappMemberEntity = LoginUserUtil.getAppUser(); Long memberId = dappMemberEntity.getId(); DappMemberEntity member = dappMemberDao.selectById(memberId); int isOnHook = member.getIsOnHook() == null ? 2 : member.getIsOnHook(); if(2 != isOnHook){ return new FebsResponse().fail().message(MessageSourceUtils.getString("Operation_002")); } //挂机金额的倍数 Integer planCode = apiStartDto.getPlanCode() == null ? 1 : apiStartDto.getPlanCode(); if(0 >= planCode){ return new FebsResponse().fail().message(MessageSourceUtils.getString("balance_err_001")); } //挂机金额 BigDecimal balance = apiStartDto.getBalance() == null ? BigDecimal.ZERO : apiStartDto.getBalance(); if(AppContants.ONHOOK_BASIC_AMOUNT.compareTo(balance) > 0){ return new FebsResponse().fail().message(MessageSourceUtils.getString("balance_err_001")); } DappWalletCoinEntity dappWalletCoinEntity = dappWalletCoinDao.selectByMemberId(memberId); if(ObjectUtil.isEmpty(dappWalletCoinEntity)){ return new FebsResponse().fail().message(MessageSourceUtils.getString("login_err_003")); } BigDecimal availableAmount = dappWalletCoinEntity.getAvailableAmount(); if(balance.compareTo(availableAmount) > 0){ return new FebsResponse().fail().message(MessageSourceUtils.getString("balance_err_002")); } //挂机开始时间和结束时间 DataDictionaryCustom startTimeDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(DataDictionaryEnum.START_TIME.getType(), DataDictionaryEnum.START_TIME.getCode()); DataDictionaryCustom endTimeDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(DataDictionaryEnum.END_TIME.getType(), DataDictionaryEnum.END_TIME.getCode()); DateTime startTime = DateUtil.parseTimeToday(startTimeDic.getValue()); DateTime endTime = DateUtil.parseTimeToday(endTimeDic.getValue()); DateTime nowTime = DateUtil.parseTimeToday(DateUtil.format(DateUtil.date(),"HH:mm:ss")); if(DateUtil.compare(nowTime,startTime) < 0){ return new FebsResponse().fail().message(MessageSourceUtils.getString("member_err_0015")); } if(DateUtil.compare(nowTime,endTime) > 0){ return new FebsResponse().fail().message(MessageSourceUtils.getString("member_err_0015")); } //增加一条挂机记录 IgtOnHookPlanOrder igtOnHookPlanOrder = new IgtOnHookPlanOrder(); igtOnHookPlanOrder.setMemberId(memberId); igtOnHookPlanOrder.setStartTime(DateUtil.date()); igtOnHookPlanOrder.setState(IgtOnHookPlanOrder.STATE_START); igtOnHookPlanOrder.setPlanAmount(apiStartDto.getBalance()); igtOnHookPlanOrder.setAvaAmount(apiStartDto.getBalance()); igtOnHookPlanOrder.setPlanCode(apiStartDto.getPlanCode()); igtOnHookPlanOrder.setProfit(AppContants.INIT_MONEY); igtOnHookPlanOrderDao.insert(igtOnHookPlanOrder); //余额减少 Integer updateCount = dappWalletCoinDao.delAvailableDelTotalById(dappWalletCoinEntity.getId(), balance); if(1 != updateCount){ throw new FebsException(MessageSourceUtils.getString("balance_err_002")); } DappMemberEntity dappMember= dappMemberDao.selectById(memberId); //更新用户表是否正在挂机状态字段 dappMember.setIsOnHook(1); dappMemberDao.updateById(dappMember); DappAccountMoneyChangeEntity dappAccountMoneyChangeEntity = new DappAccountMoneyChangeEntity(memberId, availableAmount, balance.negate() , availableAmount.subtract(balance).setScale(2,BigDecimal.ROUND_DOWN), "挂机", 6,igtOnHookPlanOrder.getId()); dappAccountMoneyChangeDao.insert(dappAccountMoneyChangeEntity); return new FebsResponse().success().message(MessageSourceUtils.getString("Operation_001")); } @Override public FebsResponse endPlan(Long orderId) { DappMemberEntity dappMemberEntity = LoginUserUtil.getAppUser(); Long memberId = dappMemberEntity.getId(); //判断系统是否已经结算过了 QueryWrapper objectQueryWrapper = new QueryWrapper<>(); objectQueryWrapper.eq("order_id",orderId); List dappOnHookDones = dappOnHookDoneDao.selectList(objectQueryWrapper); if(CollUtil.isNotEmpty(dappOnHookDones)){ new FebsResponse().fail().message(MessageSourceUtils.getString("Operation_003")); } //更新主表为结束状态 IgtOnHookPlanOrder igtOnHookPlanOrder = igtOnHookPlanOrderDao.selectById(orderId); igtOnHookPlanOrder.setState(2); igtOnHookPlanOrderDao.updateById(igtOnHookPlanOrder); // BigDecimal totalProfit = igtOnHookPlanOrder.getProfit(); BigDecimal planAmount = igtOnHookPlanOrder.getPlanAmount(); // BigDecimal avaAmount = igtOnHookPlanOrder.getAvaAmount(); //更新用户表是否正在挂机状态字段为否 DappMemberEntity dappMember = dappMemberDao.selectById(memberId); dappMember.setIsOnHook(3); dappMemberDao.updateById(dappMember); //获取当前用户每分钟应该获取的收益 String identity = dappMember.getIdentity(); //当前用户的挂机收益率 BigDecimal hangingRevenue = getHangingRevenue(identity); BigDecimal multiply = hangingRevenue.multiply(planAmount); DataDictionaryCustom maxHoursDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(DataDictionaryEnum.MAX_HOURS.getType(), DataDictionaryEnum.MAX_HOURS.getCode()); //挂机总时长(分钟) BigDecimal maxHours = new BigDecimal(maxHoursDic.getValue()).multiply(new BigDecimal(60)); //得到每分钟的收益 BigDecimal minuteProfit = multiply.divide(maxHours, 4, BigDecimal.ROUND_DOWN); //获取挂机开始时间到现在的总时长(分钟数) Date startTime = igtOnHookPlanOrder.getStartTime(); long between = DateUtil.between(startTime, DateUtil.date(), DateUnit.MINUTE); //获得总收益 BigDecimal totalProfit = minuteProfit.multiply(new BigDecimal(between)); String refererIds = dappMemberEntity.getRefererIds(); List refererIdList = StrUtil.split(refererIds, ",", -1, true, true); //只有上级用户金额大于51U才能得到对应的佣金 ArrayList refererIdLisstUp = new ArrayList<>(); for(String inviteId : refererIdList){ DappMemberEntity dappMemberUp = dappMemberDao.selectMemberInfoByInviteId(inviteId); if(ObjectUtil.isNotEmpty(dappMemberUp)){ DappWalletCoinEntity dappWalletCoinEntity = dappWalletCoinDao.selectByMemberId(dappMemberUp.getId()); if(AppContants.ONHOOK_BASIC_AMOUNT.compareTo(dappWalletCoinEntity.getAvailableAmount())<=0){ refererIdLisstUp.add(inviteId); } } } //生成流水佣金和盈利分成和流水记录,返回剩余盈利 BigDecimal profitSharingTotal = dappWalletService.updateLSYJYLFC(refererIdLisstUp, totalProfit,igtOnHookPlanOrder.getId()); //生成流水佣金和盈利分成和流水记录,返回盈利分成和流水佣金总共分成 // BigDecimal profitSharingTotal = dappWalletService.updateLSYJYLFC(refererIdList, totalProfit,igtOnHookPlanOrder.getId()); //平台分成 //平台拿走35%盈利分成和流水佣金剩下的全部 BigDecimal systemAdd = totalProfit.multiply(new BigDecimal(0.4)).subtract(profitSharingTotal); BigDecimal systemTotal = dappWalletService.updatePTFC(memberId,systemAdd,igtOnHookPlanOrder.getId()); //个人固定拿走60% totalProfit = totalProfit.multiply(new BigDecimal(0.6)); igtOnHookPlanOrder.setProfit(totalProfit); igtOnHookPlanOrderDao.updateById(igtOnHookPlanOrder); BigDecimal totalMoney = planAmount.add(totalProfit); DappWalletCoinEntity dappWalletCoinEntity = dappWalletCoinDao.selectByMemberId(memberId); dappWalletCoinDao.addTotalAndaddAvailableById(dappWalletCoinEntity.getId(),totalMoney); BigDecimal add = dappWalletCoinEntity.getAvailableAmount().add(totalMoney); BigDecimal subtract = add.subtract(totalProfit); DappAccountMoneyChangeEntity dappAccountMoneyChangeEntity = new DappAccountMoneyChangeEntity(memberId, subtract, totalProfit, add, "投注盈利", 5,igtOnHookPlanOrder.getId()); dappAccountMoneyChangeDao.insert(dappAccountMoneyChangeEntity); DappOnHookDone dappOnHookDone = new DappOnHookDone(memberId, igtOnHookPlanOrder.getId()); dappOnHookDoneDao.insert(dappOnHookDone); return new FebsResponse().success().message(MessageSourceUtils.getString("Operation_001")); } public static void main(String[] args) { DateTime startTime = DateUtil.offsetMinute(DateUtil.date(), 10); System.out.println(startTime); System.out.println(DateUtil.date()); long between = DateUtil.between(startTime, DateUtil.date(), DateUnit.MINUTE); System.out.println(between); } private BigDecimal getHangingRevenue(String identity){ DataDictionaryCustom dataDictionaryCustom = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(DataDictionaryEnum.LEVEL_MB.getType(), identity); String dataDictionaryCustomValue = dataDictionaryCustom.getValue(); cn.hutool.json.JSONObject jsonObject = JSONUtil.parseObj(dataDictionaryCustomValue); String runningCommission = jsonObject.get("hangingRevenue").toString(); return new BigDecimal(runningCommission).multiply(new BigDecimal(0.01)); } @Override public FebsResponse planInfo() { DappMemberEntity dappMemberEntity = LoginUserUtil.getAppUser(); Long memberId = dappMemberEntity.getId(); DappMemberEntity member = dappMemberDao.selectById(memberId); Integer isOnHook = member.getIsOnHook() == null ? 2 : member.getIsOnHook(); ApiPlanInfoVo apiPlanInfoVo = new ApiPlanInfoVo(); if(1 == isOnHook){ //获取当前最新的一条 IgtOnHookPlanOrder igtOnHookPlanOrder = igtOnHookPlanOrderDao.selectByMemberId(memberId); if(ObjectUtil.isNotEmpty(igtOnHookPlanOrder)){ apiPlanInfoVo.setPlanAmount(igtOnHookPlanOrder.getPlanAmount()); apiPlanInfoVo.setCreateTime(igtOnHookPlanOrder.getCreateTime()); apiPlanInfoVo.setId(igtOnHookPlanOrder.getId()); apiPlanInfoVo.setAvaAmount(igtOnHookPlanOrder.getAvaAmount().setScale(4,BigDecimal.ROUND_DOWN)); apiPlanInfoVo.setProfit(igtOnHookPlanOrder.getProfit().setScale(4,BigDecimal.ROUND_DOWN)); } } return new FebsResponse().success().data(apiPlanInfoVo); } @Override public BigDecimal getTotalFrofit(Long memberId) { BigDecimal totalProfit = igtOnHookPlanOrderDao.selectSumProfitByMemberId(memberId); return totalProfit; } @Override public FebsResponse awardInfo() { DappMemberEntity dappMemberEntity = LoginUserUtil.getAppUser(); Long memberId = dappMemberEntity.getId(); ArrayList apiAwardInfoVos = new ArrayList<>(); // DateTime date = DateUtil.date(); String redisKey = ""; if("prod".equals(active)){ redisKey = "on_hook_award_id"; }else{ redisKey = "on_hook_award_id_test"; } String onHookAwardRedisId = redisUtils.getString(redisKey); DappOnHookAward dappOnHookAwardNow = dappOnHookAwardDao.selectById(Long.parseLong(onHookAwardRedisId)); Date date = dappOnHookAwardNow.getAwardTime(); SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm"); String yyyyMMddHHMM = sdf.format(date); List dappOnHookAwards = dappOnHookAwardDao.selectInfoByByAwardTime(yyyyMMddHHMM); if(CollUtil.isNotEmpty(dappOnHookAwards)){ for(DappOnHookAward dappOnHookAward : dappOnHookAwards){ ApiAwardInfoVo apiAwardInfoVo = new ApiAwardInfoVo(); apiAwardInfoVo.setAwardNum(dappOnHookAward.getAwardNum()); apiAwardInfoVo.setRecordNum(dappOnHookAward.getRecordNum()); IgtOnHookPlanOrderItem igtOnHookPlanOrderItem = igtOnHookPlanOrderItemDao.selectByMemberIdAndBelongNum(memberId,dappOnHookAward.getRecordNum()); if(ObjectUtil.isNotEmpty(igtOnHookPlanOrderItem)){ BigDecimal bigDecimal = igtOnHookPlanOrderItem.getAmount().setScale(1, BigDecimal.ROUND_DOWN); apiAwardInfoVo.setAmount(bigDecimal.toString()); }else{ apiAwardInfoVo.setAmount("-"); } apiAwardInfoVos.add(apiAwardInfoVo); } } return new FebsResponse().success().data(apiAwardInfoVos); } @Override public void updatePlanOrderItem() { List igtOnHookPlanOrders = igtOnHookPlanOrderDao.selectByState(1); if(CollUtil.isEmpty(igtOnHookPlanOrders)){ return; } String redisKey = ""; if("prod".equals(active)){ redisKey = "on_hook_award_id"; }else{ redisKey = "on_hook_award_id_test"; } String onHookAwardRedisId = redisUtils.getString(redisKey); DappOnHookAward dappOnHookAward = dappOnHookAwardDao.selectById(Long.parseLong(onHookAwardRedisId)); Date awardTime = dappOnHookAward.getAwardTime(); DateTime dateTime = DateUtil.offsetMinute(awardTime, 5); SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm"); String yyyyMMddHHMM = sdf.format(dateTime); DappOnHookAward dappOnHookAwardNext = dappOnHookAwardDao.selectByByAwardTime(yyyyMMddHHMM); //系统挂机总次数 = 时长 * 60 / 5 DataDictionaryCustom maxHoursDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(DataDictionaryEnum.MAX_HOURS.getType(), DataDictionaryEnum.MAX_HOURS.getCode()); Float maxHours = Float.parseFloat(maxHoursDic.getValue()); maxHours = maxHours * 60 / 5; for(IgtOnHookPlanOrder igtOnHookPlanOrder : igtOnHookPlanOrders){ BigDecimal avaAmount = igtOnHookPlanOrder.getAvaAmount(); if(avaAmount.compareTo(BigDecimal.ZERO) > 0){ /** * 获取下一个开奖记录 * 生成一条开奖字表记录 * 计算收益 */ // List igtOnHookPlanOrderItemsOld = igtOnHookPlanOrderItemDao.selectByIgtIdAndMemberId(igtOnHookPlanOrder.getId(),igtOnHookPlanOrder.getMemberId()); IgtOnHookPlanOrderItem igtOnHookPlanOrderItemsOld = igtOnHookPlanOrderItemDao.selectOneByIgtIdAndMemberId(igtOnHookPlanOrder.getId(),igtOnHookPlanOrder.getMemberId()); //如果没有中奖记录则是新增一条1挂机方案的挂机子表记录 if(ObjectUtil.isEmpty(igtOnHookPlanOrderItemsOld)){ //获取挂机方案 DataDictionaryCustom dataDictionaryCustom = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(DataDictionaryEnum.PLAN_A.getType(), DataDictionaryEnum.PLAN_A.getCode()); String dataDictionaryCustomValue = dataDictionaryCustom.getValue(); JSONObject levelMemberValueParse = JSONUtil.parseObj(dataDictionaryCustomValue); BigDecimal amountPlanA = new BigDecimal(levelMemberValueParse.get("amount").toString()) .multiply(new BigDecimal(igtOnHookPlanOrder.getPlanCode())).setScale(4,BigDecimal.ROUND_DOWN); IgtOnHookPlanOrderItem igtOnHookPlanOrderItem = new IgtOnHookPlanOrderItem(); igtOnHookPlanOrderItem.setMemberId(igtOnHookPlanOrder.getMemberId()); igtOnHookPlanOrderItem.setOrderId(igtOnHookPlanOrder.getId()); igtOnHookPlanOrderItem.setAmount(amountPlanA); //获取收益率 DappMemberEntity dappMemberEntity = dappMemberDao.selectById(igtOnHookPlanOrder.getMemberId()); DataDictionaryCustom identityDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(DataDictionaryEnum.LEVEL_MB.getType(), dappMemberEntity.getIdentity()); String identityDicValue = identityDic.getValue(); JSONObject identityDicValueParse = JSONUtil.parseObj(identityDicValue); BigDecimal hangingRevenueLevel = new BigDecimal(identityDicValueParse.get("hangingRevenue").toString()) .multiply(new BigDecimal(0.01)).setScale(4,BigDecimal.ROUND_DOWN); //获取收益 BigDecimal profit = amountPlanA.multiply(hangingRevenueLevel).setScale(4,BigDecimal.ROUND_DOWN); igtOnHookPlanOrderItem.setProfit(profit.setScale(4,BigDecimal.ROUND_DOWN)); igtOnHookPlanOrderItem.setState(1); igtOnHookPlanOrderItem.setPlanCode(igtOnHookPlanOrder.getPlanCode()); Integer isGoal = dappWalletService.isGoal(dappOnHookAwardNext.getAwardNum()); igtOnHookPlanOrderItem.setIsGoal(isGoal); igtOnHookPlanOrderItem.setBelongNum(dappOnHookAwardNext.getRecordNum()); igtOnHookPlanOrderItem.setOrderNum(1); igtOnHookPlanOrderItem.setPlan(dataDictionaryCustom.getDescription()); igtOnHookPlanOrderItemDao.insert(igtOnHookPlanOrderItem); if(2 == igtOnHookPlanOrderItem.getIsGoal()){ //如果中奖,增加挂机主表的挂机总收益 Integer updateCount = igtOnHookPlanOrderDao.AddProfitById(igtOnHookPlanOrder.getId() ,igtOnHookPlanOrderItem.getProfit()); }else{ //如果不中奖,减少挂机剩余金额即减少本金 Integer updateCount = igtOnHookPlanOrderDao.updateAvaAmountById(igtOnHookPlanOrder.getId() ,igtOnHookPlanOrderItem.getAmount()); } }else { if(2 == igtOnHookPlanOrderItemsOld.getIsGoal()){ //第一条中奖记录为中奖则是新增一条1挂机方案的挂机子表记录 //获取挂机方案 DataDictionaryCustom dataDictionaryCustom = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(DataDictionaryEnum.PLAN_A.getType(), DataDictionaryEnum.PLAN_A.getCode()); String dataDictionaryCustomValue = dataDictionaryCustom.getValue(); JSONObject levelMemberValueParse = JSONUtil.parseObj(dataDictionaryCustomValue); BigDecimal amountPlanA = new BigDecimal(levelMemberValueParse.get("amount").toString()) .multiply(new BigDecimal(igtOnHookPlanOrder.getPlanCode())).setScale(4,BigDecimal.ROUND_DOWN); //此次下注金额不足,则更新主表信息为结算中 //挂机次数超过系统规定的时间,则更新主表信息为结算中 if(avaAmount.compareTo(amountPlanA) < 0 || igtOnHookPlanOrderItemsOld.getOrderNum() >= maxHours){ igtOnHookPlanOrder.setState(3); igtOnHookPlanOrderDao.updateById(igtOnHookPlanOrder); }else{ IgtOnHookPlanOrderItem igtOnHookPlanOrderItem = new IgtOnHookPlanOrderItem(); igtOnHookPlanOrderItem.setMemberId(igtOnHookPlanOrder.getMemberId()); igtOnHookPlanOrderItem.setOrderId(igtOnHookPlanOrder.getId()); igtOnHookPlanOrderItem.setAmount(amountPlanA); //获取收益率 DappMemberEntity dappMemberEntity = dappMemberDao.selectById(igtOnHookPlanOrder.getMemberId()); DataDictionaryCustom identityDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(DataDictionaryEnum.LEVEL_MB.getType(), dappMemberEntity.getIdentity()); String identityDicValue = identityDic.getValue(); JSONObject identityDicValueParse = JSONUtil.parseObj(identityDicValue); BigDecimal hangingRevenueLevel = new BigDecimal(identityDicValueParse.get("hangingRevenue").toString()) .multiply(new BigDecimal(0.01)).setScale(4,BigDecimal.ROUND_DOWN); //获取收益 BigDecimal profit = amountPlanA.multiply(hangingRevenueLevel).setScale(4,BigDecimal.ROUND_DOWN); igtOnHookPlanOrderItem.setProfit(profit.setScale(4,BigDecimal.ROUND_DOWN)); igtOnHookPlanOrderItem.setState(1); igtOnHookPlanOrderItem.setPlanCode(igtOnHookPlanOrder.getPlanCode()); Integer isGoal = dappWalletService.isGoal(dappOnHookAwardNext.getAwardNum()); igtOnHookPlanOrderItem.setIsGoal(isGoal); igtOnHookPlanOrderItem.setBelongNum(dappOnHookAwardNext.getRecordNum()); igtOnHookPlanOrderItem.setOrderNum(igtOnHookPlanOrderItemsOld.getOrderNum() + 1); igtOnHookPlanOrderItem.setPlan(dataDictionaryCustom.getDescription()); igtOnHookPlanOrderItemDao.insert(igtOnHookPlanOrderItem); if(2 == igtOnHookPlanOrderItem.getIsGoal()){ //如果中奖,增加挂机主表的挂机总收益 Integer updateCount = igtOnHookPlanOrderDao.AddProfitById(igtOnHookPlanOrder.getId() ,igtOnHookPlanOrderItem.getProfit()); }else{ //如果不中奖,减少挂机剩余金额即减少本金 Integer updateCount = igtOnHookPlanOrderDao.updateAvaAmountById(igtOnHookPlanOrder.getId() ,igtOnHookPlanOrderItem.getAmount()); } } }else{ //第一条没中奖则是新增一条n+1挂机方案的挂机子表记录 String plan = igtOnHookPlanOrderItemsOld.getPlan(); //获取挂机方案 DataDictionaryCustom dataDictionaryCustom = dataDictionaryCustomMapper.selectDicDataByTypeAndCodeAndDesc( DataDictionaryEnum.PLAN_A.getType(), Integer.toString(Integer.parseInt(plan)+1)); if(ObjectUtil.isEmpty(dataDictionaryCustom)){ igtOnHookPlanOrder.setState(3); igtOnHookPlanOrderDao.updateById(igtOnHookPlanOrder); }else{ String dataDictionaryCustomValue = dataDictionaryCustom.getValue(); JSONObject levelMemberValueParse = JSONUtil.parseObj(dataDictionaryCustomValue); BigDecimal amountPlanA = new BigDecimal(levelMemberValueParse.get("amount").toString()) .multiply(new BigDecimal(igtOnHookPlanOrder.getPlanCode())).setScale(4,BigDecimal.ROUND_DOWN); //此次下注金额不足,则更新主表信息为结算中 if(avaAmount.compareTo(amountPlanA) < 0 || igtOnHookPlanOrderItemsOld.getOrderNum() >= maxHours){ igtOnHookPlanOrder.setState(3); igtOnHookPlanOrderDao.updateById(igtOnHookPlanOrder); }else{ IgtOnHookPlanOrderItem igtOnHookPlanOrderItem = new IgtOnHookPlanOrderItem(); igtOnHookPlanOrderItem.setMemberId(igtOnHookPlanOrder.getMemberId()); igtOnHookPlanOrderItem.setOrderId(igtOnHookPlanOrder.getId()); igtOnHookPlanOrderItem.setAmount(amountPlanA); //获取收益率 DappMemberEntity dappMemberEntity = dappMemberDao.selectById(igtOnHookPlanOrder.getMemberId()); DataDictionaryCustom identityDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(DataDictionaryEnum.LEVEL_MB.getType(), dappMemberEntity.getIdentity()); String identityDicValue = identityDic.getValue(); JSONObject identityDicValueParse = JSONUtil.parseObj(identityDicValue); BigDecimal hangingRevenueLevel = new BigDecimal(identityDicValueParse.get("hangingRevenue").toString()) .multiply(new BigDecimal(0.01)).setScale(4,BigDecimal.ROUND_DOWN); //获取收益 BigDecimal profit = amountPlanA.multiply(hangingRevenueLevel).setScale(4,BigDecimal.ROUND_DOWN); igtOnHookPlanOrderItem.setProfit(profit.setScale(4,BigDecimal.ROUND_DOWN)); igtOnHookPlanOrderItem.setState(1); igtOnHookPlanOrderItem.setPlanCode(igtOnHookPlanOrder.getPlanCode()); Integer isGoal = dappWalletService.isGoal(dappOnHookAwardNext.getAwardNum()); igtOnHookPlanOrderItem.setIsGoal(isGoal); igtOnHookPlanOrderItem.setBelongNum(dappOnHookAwardNext.getRecordNum()); igtOnHookPlanOrderItem.setOrderNum(igtOnHookPlanOrderItemsOld.getOrderNum() + 1); igtOnHookPlanOrderItem.setPlan(dataDictionaryCustom.getDescription()); igtOnHookPlanOrderItemDao.insert(igtOnHookPlanOrderItem); if(2 == igtOnHookPlanOrderItem.getIsGoal()){ //返还两次中奖之间的本金 BigDecimal totalAmount = BigDecimal.ZERO; //返回上次中奖的记录 IgtOnHookPlanOrderItem igtOld = igtOnHookPlanOrderItemDao.selectByCreateTimeAndIsgoaAndOrderId( igtOnHookPlanOrderItem.getId(),2,igtOnHookPlanOrderItem.getOrderId()); if(ObjectUtil.isNotEmpty(igtOld)){ totalAmount = igtOnHookPlanOrderItemDao.selectTotalAmountByIDAndOrderId(igtOld.getId(), igtOnHookPlanOrderItem.getId(),igtOnHookPlanOrderItem.getOrderId()); }else{ totalAmount = igtOnHookPlanOrderItemDao.selectTotalAmountByIDAndOrderId(null, igtOnHookPlanOrderItem.getId(),igtOnHookPlanOrderItem.getOrderId()); } //如果中奖,增加挂机主表的挂机总收益,返还两次中奖之间的本金 igtOnHookPlanOrderDao.AddProfitById(igtOnHookPlanOrder.getId() ,igtOnHookPlanOrderItem.getProfit()); igtOnHookPlanOrderDao.addAvaAmountById(igtOnHookPlanOrder.getId() ,totalAmount); }else{ //如果不中奖,减少挂机剩余金额即减少本金 Integer updateCount = igtOnHookPlanOrderDao.updateAvaAmountById(igtOnHookPlanOrder.getId() ,igtOnHookPlanOrderItem.getAmount()); } } } } } } } } @Override public void endOnHookMessage(Long orderId) { IgtOnHookPlanOrder igtOnHookPlanOrder = igtOnHookPlanOrderDao.selectById(orderId); if(ObjectUtil.isEmpty(igtOnHookPlanOrder)){ return; } Long memberId = igtOnHookPlanOrder.getMemberId(); BigDecimal planAmount = igtOnHookPlanOrder.getPlanAmount(); DappMemberEntity dappMemberEntity = dappMemberDao.selectById(memberId); if(ObjectUtil.isEmpty(dappMemberEntity)){ return; } //避免重复 QueryWrapper objectQueryWrapper = new QueryWrapper<>(); objectQueryWrapper.eq("order_id",igtOnHookPlanOrder.getId()); List dappOnHookDones = dappOnHookDoneDao.selectList(objectQueryWrapper); if(CollUtil.isNotEmpty(dappOnHookDones)){ return; } //生成记录 DappOnHookDone dappOnHookDone = new DappOnHookDone(dappMemberEntity.getId(), igtOnHookPlanOrder.getId()); dappOnHookDoneDao.insert(dappOnHookDone); //获取收益率 DataDictionaryCustom identityDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(DataDictionaryEnum.LEVEL_MB.getType(), dappMemberEntity.getIdentity()); String identityDicValue = identityDic.getValue(); JSONObject identityDicValueParse = JSONUtil.parseObj(identityDicValue); BigDecimal hangingRevenueLevel = new BigDecimal(identityDicValueParse.get("hangingRevenue").toString()) .multiply(new BigDecimal(0.01)).setScale(4,BigDecimal.ROUND_DOWN); //获取收益 //获取当前用户每分钟应该获取的收益 BigDecimal multiply = hangingRevenueLevel.multiply(planAmount); DataDictionaryCustom maxHoursDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(DataDictionaryEnum.MAX_HOURS.getType(), DataDictionaryEnum.MAX_HOURS.getCode()); //挂机总时长(分钟) BigDecimal maxHours = new BigDecimal(maxHoursDic.getValue()).multiply(new BigDecimal(60)); //得到每分钟的收益 BigDecimal minuteProfit = multiply.divide(maxHours, 4, BigDecimal.ROUND_DOWN); //获取挂机开始时间到现在的总时长(分钟数) Date startTime = igtOnHookPlanOrder.getStartTime(); long between = DateUtil.between(startTime, DateUtil.date(), DateUnit.MINUTE); //获得总收益 BigDecimal totalProfit = minuteProfit.multiply(new BigDecimal(between)).setScale(4,BigDecimal.ROUND_DOWN); // BigDecimal totalProfit = planAmount.multiply(hangingRevenueLevel).setScale(4,BigDecimal.ROUND_DOWN); String refererIds = dappMemberEntity.getRefererIds(); List refererIdList = StrUtil.split(refererIds, ",", -1, true, true); //只有上级用户金额大于51U才能得到对应的佣金 ArrayList refererIdLisstUp = new ArrayList<>(); for(String inviteId : refererIdList){ DappMemberEntity dappMemberUp = dappMemberDao.selectMemberInfoByInviteId(inviteId); if(ObjectUtil.isNotEmpty(dappMemberUp)){ DappWalletCoinEntity dappWalletCoinEntity = dappWalletCoinDao.selectByMemberId(dappMemberUp.getId()); if(AppContants.ONHOOK_BASIC_AMOUNT.compareTo(dappWalletCoinEntity.getAvailableAmount())<=0){ refererIdLisstUp.add(inviteId); } } } //生成流水佣金和盈利分成和流水记录,返回剩余盈利 BigDecimal profitSharingTotal = dappWalletService.updateLSYJYLFC(refererIdLisstUp, totalProfit,igtOnHookPlanOrder.getId()); //平台分成 //平台拿走35%盈利分成和流水佣金剩下的全部 BigDecimal systemAdd = totalProfit.multiply(new BigDecimal(0.4)).subtract(profitSharingTotal); BigDecimal systemTotal = dappWalletService.updatePTFC(memberId,systemAdd,igtOnHookPlanOrder.getId()); //个人固定拿走60% totalProfit = totalProfit.multiply(new BigDecimal(0.6)); igtOnHookPlanOrder.setState(2); //一次挂机剩余的全部金额 BigDecimal totalMoney = totalProfit.add(planAmount); igtOnHookPlanOrder.setProfit(totalProfit); igtOnHookPlanOrderDao.updateById(igtOnHookPlanOrder); dappMemberEntity.setIsOnHook(3); dappMemberDao.updateById(dappMemberEntity); DappWalletCoinEntity dappWalletCoinEntity = dappWalletCoinDao.selectByMemberId(memberId); BigDecimal availableAmount = dappWalletCoinEntity.getAvailableAmount(); dappWalletCoinDao.addTotalAndaddAvailableById(dappWalletCoinEntity.getId(),totalMoney); BigDecimal add = availableAmount.add(totalMoney); BigDecimal subtract = add.subtract(totalProfit); DappAccountMoneyChangeEntity dappAccountMoneyChangeEntity = new DappAccountMoneyChangeEntity(memberId, subtract, totalProfit, add, "投注盈利", 5,igtOnHookPlanOrder.getId()); dappAccountMoneyChangeDao.insert(dappAccountMoneyChangeEntity); } private String getProfitCase(String identity,BigDecimal balance){ //匹配会员等级获取对应的收益率 List dataDictionaryCustoms = dataDictionaryCustomMapper.selectDicByType(DataDictionaryEnum.LEVEL_MB.getType()); if(CollUtil.isNotEmpty(dataDictionaryCustoms)){ for(DataDictionaryCustom memberLevel : dataDictionaryCustoms){ String code = memberLevel.getCode(); String memberLevelValue = memberLevel.getValue(); JSONObject profitValue = JSONUtil.parseObj(memberLevelValue); //挂机收益 BigDecimal hangingRevenue = new BigDecimal(profitValue.get("hangingRevenue").toString()).divide(new BigDecimal(100)); //预计收益 BigDecimal expectProfit = balance.multiply(balance).setScale(4, BigDecimal.ROUND_DOWN); } } return null; } // public static void main(String[] args) { // // DateTime nowTime = DateUtil.parseTimeToday(DateUtil.format(DateUtil.date(),"HH:mm:ss")); // System.out.println(nowTime); // int maxTimes = 10; // for(int i =1;i