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.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; @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 , availableAmount.subtract(balance).setScale(2,BigDecimal.ROUND_DOWN), "挂机", 6); 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(); //更新主表为结束状态 IgtOnHookPlanOrder igtOnHookPlanOrder = igtOnHookPlanOrderDao.selectById(orderId); igtOnHookPlanOrder.setState(3); igtOnHookPlanOrderDao.updateById(igtOnHookPlanOrder); //更新用户表是否正在挂机状态字段为否 DappMemberEntity dappMember = dappMemberDao.selectById(memberId); dappMember.setIsOnHook(3); dappMemberDao.updateById(dappMember); return new FebsResponse().success().message(MessageSourceUtils.getString("Operation_001")); } @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(); 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); } 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