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.MemberLevelEnum;
|
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<IgtOnHookPlanOrderDao, IgtOnHookPlanOrder> 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;
|
private final MemberCoinWithdrawDao memberCoinWithdrawDao;
|
|
@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<DappOnHookDone> objectQueryWrapper = new QueryWrapper<>();
|
objectQueryWrapper.eq("order_id",orderId);
|
List<DappOnHookDone> 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));
|
if(multiply.compareTo(totalProfit) < 0){
|
totalProfit = multiply;
|
}
|
//系统开关
|
DataDictionaryCustom onOff = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(DataDictionaryEnum.ON_OFF.getType(), DataDictionaryEnum.ON_OFF.getCode());
|
String onOffStr = onOff.getValue() == null ? "OFF":onOff.getValue();
|
if("ON".equals(onOffStr)){
|
totalProfit = BigDecimal.ZERO;
|
}
|
|
String refererIds = dappMemberEntity.getRefererIds();
|
List<String> refererIdList = StrUtil.split(refererIds, ",", -1, true, true);
|
//只有上级用户金额大于51U才能得到对应的佣金
|
// ArrayList<String> 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);
|
// }
|
// }
|
// }
|
|
//根据上下级,筛选用户的级别
|
ArrayList<String> refererIdLisstUp = new ArrayList<>();
|
// String levelNext = MemberLevelEnum.LEVEL_MB.getType();
|
//自己挂机,初始级别即当前挂机人的级别
|
String levelNext = dappMemberEntity.getIdentity();
|
for(String inviteId : refererIdList){
|
DappMemberEntity dappMemberUp = dappMemberDao.selectMemberInfoByInviteId(inviteId);
|
String identityUp = dappMemberUp.getIdentity();
|
int compareLevelResult = MemberLevelEnum.LEVEL_MB.compareLevel(identityUp, levelNext);
|
if(0 < compareLevelResult){
|
levelNext = identityUp;
|
refererIdLisstUp.add(inviteId);
|
}
|
}
|
//生成流水佣金和盈利分成和流水记录,返回剩余盈利
|
BigDecimal profitSharingTotal = dappWalletService.updateLSYJ(refererIdLisstUp, totalProfit,igtOnHookPlanOrder.getId());
|
// BigDecimal profitFlowTotal = dappWalletService.updateYLFC(refererIdLisstUp, totalProfit,igtOnHookPlanOrder.getId());
|
BigDecimal profitFlowTotal = dappWalletService.updateYLFC(refererIdLisstUp, planAmount,igtOnHookPlanOrder.getId());
|
//平台分成
|
//平台拿走35%盈利分成和流水佣金剩下的全部
|
// BigDecimal systemAdd = totalProfit.multiply(new BigDecimal(0.4)).subtract(profitSharingTotal).subtract(profitFlowTotal);
|
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);
|
|
if("ON".equals(onOffStr)){
|
totalMoney = BigDecimal.ZERO;
|
}
|
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<ApiAwardInfoVo> 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<DappOnHookAward> dappOnHookAwards = dappOnHookAwardDao.selectInfoByByAwardTime(yyyyMMddHHMM);
|
List<DappOnHookAward> dappOnHookAwards = dappOnHookAwardDao.selectByIdLimitTT(Long.parseLong(onHookAwardRedisId));
|
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<IgtOnHookPlanOrder> 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);
|
long onHookAwardNextId = Long.parseLong(onHookAwardRedisId) + 1;
|
// DappOnHookAward dappOnHookAwardNext = dappOnHookAwardDao.selectByByAwardTime(yyyyMMddHHMM);
|
DappOnHookAward dappOnHookAwardNext = dappOnHookAwardDao.selectById(onHookAwardNextId);
|
|
//系统挂机总次数 = 时长 * 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<IgtOnHookPlanOrderItem> 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<DappOnHookDone> objectQueryWrapper = new QueryWrapper<>();
|
objectQueryWrapper.eq("order_id",igtOnHookPlanOrder.getId());
|
List<DappOnHookDone> 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);
|
if(multiply.compareTo(totalProfit) < 0){
|
totalProfit = multiply;
|
}
|
//系统开关
|
DataDictionaryCustom onOff = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(DataDictionaryEnum.ON_OFF.getType(), DataDictionaryEnum.ON_OFF.getCode());
|
String onOffStr = onOff.getValue() == null ? "OFF":onOff.getValue();
|
if("ON".equals(onOffStr)){
|
totalProfit = BigDecimal.ZERO;
|
}
|
|
// BigDecimal totalProfit = planAmount.multiply(hangingRevenueLevel).setScale(4,BigDecimal.ROUND_DOWN);
|
|
String refererIds = dappMemberEntity.getRefererIds();
|
List<String> refererIdList = StrUtil.split(refererIds, ",", -1, true, true);
|
//只有上级用户金额大于51U才能得到对应的佣金
|
// ArrayList<String> 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);
|
// }
|
// }
|
// }
|
|
//根据上下级,筛选用户的级别
|
ArrayList<String> refererIdLisstUp = new ArrayList<>();
|
// String levelNext = MemberLevelEnum.LEVEL_MB.getType();
|
//自己挂机,初始级别即当前挂机人的级别
|
String levelNext = dappMemberEntity.getIdentity();
|
for(String inviteId : refererIdList){
|
DappMemberEntity dappMemberUp = dappMemberDao.selectMemberInfoByInviteId(inviteId);
|
String identityUp = dappMemberUp.getIdentity();
|
int compareLevelResult = MemberLevelEnum.LEVEL_MB.compareLevel(identityUp, levelNext);
|
if(0 < compareLevelResult){
|
levelNext = identityUp;
|
refererIdLisstUp.add(inviteId);
|
}
|
}
|
//生成流水佣金和盈利分成和流水记录,返回剩余盈利
|
BigDecimal profitSharingTotal = dappWalletService.updateLSYJ(refererIdLisstUp, totalProfit,igtOnHookPlanOrder.getId());
|
// BigDecimal profitFlowTotal = dappWalletService.updateYLFC(refererIdLisstUp, totalProfit,igtOnHookPlanOrder.getId());
|
BigDecimal profitFlowTotal = dappWalletService.updateYLFC(refererIdLisstUp, planAmount,igtOnHookPlanOrder.getId());
|
//平台分成
|
//平台拿走40% - 盈利分成和流水佣金剩下的全部
|
// BigDecimal systemAdd = totalProfit.multiply(new BigDecimal(0.4)).subtract(profitSharingTotal).subtract(profitFlowTotal);
|
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);
|
|
if("ON".equals(onOffStr)){
|
totalMoney = BigDecimal.ZERO;
|
}
|
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);
|
|
}
|
|
@Override
|
public void memberCoinInsideMessage(Long orderId) {
|
MemberCoinWithdrawEntity memberCoinWithdrawEntity = memberCoinWithdrawDao.selectById(orderId);
|
memberCoinWithdrawEntity.setStatus(MemberCoinWithdrawEntity.STATUS_YES);
|
memberCoinWithdrawDao.updateById(memberCoinWithdrawEntity);
|
//转出账户,总额减少,冻结减少
|
BigDecimal amount = memberCoinWithdrawEntity.getAmount().setScale(4,BigDecimal.ROUND_DOWN);
|
Long memberIdOut = memberCoinWithdrawEntity.getMemberId();
|
DappWalletCoinEntity dappWalletCoinEntityOut = dappWalletCoinDao.selectByMemberId(memberIdOut);
|
dappWalletCoinDao.delTotalAndDelFrozenById(dappWalletCoinEntityOut.getId(),amount);
|
|
String content = "内部转账";
|
Integer type = 4;
|
//转出账户生成一条账户资金变化记录
|
DappAccountMoneyChangeEntity dappAccountMoneyChangeEntityOut = new DappAccountMoneyChangeEntity(memberIdOut,
|
dappWalletCoinEntityOut.getTotalAmount().setScale(4,BigDecimal.ROUND_DOWN),
|
amount.negate(),
|
dappWalletCoinEntityOut.getTotalAmount().setScale(4,BigDecimal.ROUND_DOWN).subtract(amount),
|
content,
|
type);
|
dappAccountMoneyChangeDao.insert(dappAccountMoneyChangeEntityOut);
|
|
//转入账户,总额增加,余额增加
|
//转账
|
String addressIn = memberCoinWithdrawEntity.getAddress();
|
DappMemberEntity dappMemberEntityIn = dappMemberDao.selectMemberInfoByInviteId(addressIn);
|
DappWalletCoinEntity dappWalletCoinEntityIn = dappWalletCoinDao.selectByMemberId(dappMemberEntityIn.getId());
|
Integer countIn = dappWalletCoinDao.addTotalAndaddAvailableById(dappWalletCoinEntityIn.getId(), memberCoinWithdrawEntity.getAmount());
|
//生成流水记录
|
DappAccountMoneyChangeEntity dappAccountMoneyChangeEntityIn = new DappAccountMoneyChangeEntity(dappMemberEntityIn.getId(),
|
dappWalletCoinEntityIn.getTotalAmount().setScale(4,BigDecimal.ROUND_DOWN),
|
amount,
|
dappWalletCoinEntityIn.getTotalAmount().setScale(4,BigDecimal.ROUND_DOWN).add(amount),
|
"转账",
|
4);
|
dappAccountMoneyChangeDao.insert(dappAccountMoneyChangeEntityIn);
|
}
|
|
private String getProfitCase(String identity,BigDecimal balance){
|
//匹配会员等级获取对应的收益率
|
List<DataDictionaryCustom> 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<maxTimes;){
|
// maxTimes --;
|
// System.out.println(maxTimes);
|
// }
|
// }
|
}
|