package cc.mrbird.febs.mall.service.impl; import cc.mrbird.febs.common.enumerates.DataDictionaryEnum; import cc.mrbird.febs.common.enumerates.FlowTypeEnum; import cc.mrbird.febs.common.enumerates.MoneyFlowTypeNewEnum; import cc.mrbird.febs.common.exception.FebsException; import cc.mrbird.febs.common.utils.AppContants; import cc.mrbird.febs.common.utils.MallUtils; import cc.mrbird.febs.common.utils.RedisUtils; import cc.mrbird.febs.mall.conversion.TzInfoConversion; import cc.mrbird.febs.mall.dto.ApiCreateDto; import cc.mrbird.febs.mall.dto.ApiCreateItemDto; import cc.mrbird.febs.mall.entity.*; import cc.mrbird.febs.mall.mapper.*; import cc.mrbird.febs.mall.service.AsyncCjService; import cc.mrbird.febs.mall.service.IApiMallMemberService; import cc.mrbird.febs.mall.vo.ApiTzInfoVo; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; import cn.hutool.json.JSON; 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.springframework.stereotype.Service; import java.math.BigDecimal; import java.util.ArrayList; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.stream.Collectors; @Slf4j @Service @RequiredArgsConstructor public class AsyncCjServiceImpl extends ServiceImpl implements AsyncCjService { private final RedisUtils redisUtils; private final DataDictionaryCustomMapper dataDictionaryCustomMapper; private final TzInfoMapper tzInfoMapper; private final MallMemberWalletMapper mallMemberWalletMapper; private final CjInfoMapper cjInfoMapper; private final CjItemMapper cjItemMapper; private final IApiMallMemberService mallMemberService; @Override public void openPriceAsync(CjInfo cjInfo, String kjNum,String danshuang,String daXiao) { long l = System.currentTimeMillis(); List cjItems = cjItemMapper.selectListByInfoId(cjInfo.getId()); if(CollUtil.isEmpty(cjItems)){ return; } /** * 1-按大小 2-按单双 3-按数字 */ BigDecimal perkAmountTotal = BigDecimal.ZERO;//中奖总金额 ArrayList CjItemUpdateList = new ArrayList<>(); //按大小 List collectDaXiao = cjItems.stream().filter(cjItem -> cjItem.getType() == 1).collect(Collectors.toList()); if(CollUtil.isNotEmpty(collectDaXiao)){ for(CjItem cjItem : collectDaXiao){ String tzCode = cjItem.getTzCode(); cjItem.setKjNum(daXiao); BigDecimal perkAmount = BigDecimal.ZERO; if(daXiao.equals(tzCode)){ perkAmount = cjItem.getAmount().multiply(cjItem.getTzPercent()).setScale(2, BigDecimal.ROUND_DOWN); cjItem.setPerkAmount(perkAmount); }else{ cjItem.setPerkAmount(perkAmount); } CjItemUpdateList.add(cjItem); perkAmountTotal = perkAmountTotal.add(perkAmount); } } //按单双 List collectDanShuang = cjItems.stream().filter(cjItem -> cjItem.getType() == 2).collect(Collectors.toList()); if(CollUtil.isNotEmpty(collectDanShuang)){ for(CjItem cjItem : collectDanShuang){ String tzCode = cjItem.getTzCode(); cjItem.setKjNum(danshuang); BigDecimal perkAmount = BigDecimal.ZERO; if(danshuang.equals(tzCode)){ perkAmount = cjItem.getAmount().multiply(cjItem.getTzPercent()).setScale(2, BigDecimal.ROUND_DOWN); cjItem.setPerkAmount(perkAmount); }else{ cjItem.setPerkAmount(perkAmount); } CjItemUpdateList.add(cjItem); perkAmountTotal = perkAmountTotal.add(perkAmount); } } //按数字 List collectNumber = cjItems.stream().filter(cjItem -> cjItem.getType() == 3).collect(Collectors.toList()); if(CollUtil.isNotEmpty(collectNumber)){ for(CjItem cjItem : collectNumber){ String tzCode = cjItem.getTzCode(); cjItem.setKjNum(kjNum); BigDecimal perkAmount = BigDecimal.ZERO; if(kjNum.equals(tzCode)){ perkAmount = cjItem.getAmount().multiply(cjItem.getTzPercent()).setScale(2, BigDecimal.ROUND_DOWN); cjItem.setPerkAmount(perkAmount); }else{ cjItem.setPerkAmount(perkAmount); } CjItemUpdateList.add(cjItem); perkAmountTotal = perkAmountTotal.add(perkAmount); } } cjItemMapper.updateBatchById(CjItemUpdateList);//批量更新 if(perkAmountTotal.compareTo(BigDecimal.ZERO) > 0){ cjInfo.setZjState(1); }else{ cjInfo.setZjState(0); } cjInfo.setPerkAmount(perkAmountTotal); cjInfo.setKjNum(kjNum); cjInfo.setKjState(1); cjInfoMapper.updateById(cjInfo); //更新用户余额 MallMemberWallet mallMemberWallet = mallMemberWalletMapper.selectWalletByMemberId(cjInfo.getMemberId()); mallMemberWallet.setBalance(mallMemberWallet.getBalance().add(perkAmountTotal)); mallMemberWalletMapper.updateBalanceWithVersion(mallMemberWallet); String orderNo = MallUtils.getOrderNum("T"); mallMemberService.addMoneyFlow( cjInfo.getMemberId(), perkAmountTotal, MoneyFlowTypeNewEnum.DYNAMIC_ACHIEVE.getValue(), orderNo, MoneyFlowTypeNewEnum.DYNAMIC_ACHIEVE.getDescription(), null, cjInfo.getId(), 2, FlowTypeEnum.BALANCE.getValue()); log.info("结束:{}", (System.currentTimeMillis() - l)); } @Override public void create(ApiCreateDto apiCreateDto) { long l = System.currentTimeMillis(); Long memberId = 1L; //开启下注 DataDictionaryCustom noTimeDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode( DataDictionaryEnum.NO_TIME.getType(), DataDictionaryEnum.NO_TIME.getCode() ); if(noTimeDic.getValue().equals(2)){ throw new FebsException("请等待下一期"); } List items = apiCreateDto.getItems(); if(CollUtil.isEmpty(items)){ throw new FebsException("参数有误,请刷新页面"); } MallMemberWallet mallMemberWallet = mallMemberWalletMapper.selectWalletByMemberId(memberId); BigDecimal totalAmount = BigDecimal.ZERO; for(ApiCreateItemDto apiCreateItemDto : items){ BigDecimal tzAmount = apiCreateItemDto.getTzAmount().setScale(2,BigDecimal.ROUND_DOWN);//投注金额 if(BigDecimal.ZERO.compareTo(tzAmount) >= 0){ throw new FebsException("金额必须大于0"); } totalAmount = totalAmount.add(tzAmount); } if(mallMemberWallet.getBalance().compareTo(totalAmount) < 0){ throw new FebsException("余额不足"); } //更新用户余额 mallMemberWallet.setBalance(mallMemberWallet.getBalance().subtract(totalAmount)); mallMemberWalletMapper.updateBalanceWithVersion(mallMemberWallet); //新增一条投注主表记录 CjInfo cjInfo = new CjInfo(); cjInfo.setMemberId(memberId); String kjNo = redisUtils.getString(AppContants.KJ_RECORD_NO); cjInfo.setKjNo(kjNo); cjInfo.setKjState(0); cjInfo.setPerkAmount(BigDecimal.ZERO); cjInfo.setTotalAmount(totalAmount); cjInfoMapper.insert(cjInfo); for(ApiCreateItemDto apiCreateItemDto : items){ Long id = apiCreateItemDto.getId();//投注ID TzInfo tzInfo = tzInfoMapper.selectById(id); if(ObjectUtil.isEmpty(tzInfo)){ throw new FebsException("参数有误,请刷新页面"); } BigDecimal tzAmount = apiCreateItemDto.getTzAmount().setScale(2,BigDecimal.ROUND_DOWN);//投注金额 CjItem cjItem = new CjItem(); cjItem.setInfoId(cjInfo.getId()); cjItem.setMemberId(memberId); cjItem.setTzId(id); cjItem.setTzCode(tzInfo.getTzCode()); cjItem.setTzPercent(tzInfo.getTzPercent()); cjItem.setType(tzInfo.getType()); cjItem.setAmount(tzAmount); cjItem.setItemNum(tzInfo.getTzCode()); cjItem.setPerkAmount(BigDecimal.ZERO); cjItemMapper.insert(cjItem); } String orderNo = MallUtils.getOrderNum("T"); mallMemberService.addMoneyFlow( memberId, totalAmount.negate(), MoneyFlowTypeNewEnum.STATIC_BONUS.getValue(), orderNo, MoneyFlowTypeNewEnum.STATIC_BONUS.getDescription(), null, cjInfo.getId(), 2, FlowTypeEnum.BALANCE.getValue()); log.info("结束:{}", (System.currentTimeMillis() - l)); } @Override public void tzInfo() { Map linkedHashMap = new LinkedHashMap<>(); ArrayList objectDaxiao = new ArrayList<>(); QueryWrapper daxiaoQueryWrapper = new QueryWrapper<>(); daxiaoQueryWrapper.eq("type",1); List daXiaos = tzInfoMapper.selectList(daxiaoQueryWrapper); if(CollUtil.isNotEmpty(daXiaos)){ for(TzInfo tzInfoRedis : daXiaos){ ApiTzInfoVo apiTzInfoVo = TzInfoConversion.INSTANCE.entityToVo(tzInfoRedis); objectDaxiao.add(apiTzInfoVo); } } linkedHashMap.put("daXiao", JSONUtil.parse(objectDaxiao)); ArrayList objectDanshuang = new ArrayList<>(); QueryWrapper danshuangQueryWrapper = new QueryWrapper<>(); danshuangQueryWrapper.eq("type",2); List danShuangs = tzInfoMapper.selectList(danshuangQueryWrapper); if(CollUtil.isNotEmpty(danShuangs)){ for(TzInfo tzInfoRedis : danShuangs){ ApiTzInfoVo apiTzInfoVo = TzInfoConversion.INSTANCE.entityToVo(tzInfoRedis); objectDanshuang.add(apiTzInfoVo); } } linkedHashMap.put("danShuang",JSONUtil.parse(objectDanshuang)); ArrayList objectShuZi = new ArrayList<>(); QueryWrapper shuZiQueryWrapper = new QueryWrapper<>(); shuZiQueryWrapper.eq("type",3); List shuZis = tzInfoMapper.selectList(shuZiQueryWrapper); if(CollUtil.isNotEmpty(shuZis)){ for(TzInfo tzInfoRedis : shuZis){ ApiTzInfoVo apiTzInfoVo = TzInfoConversion.INSTANCE.entityToVo(tzInfoRedis); objectShuZi.add(apiTzInfoVo); } } linkedHashMap.put("shuZi",JSONUtil.parse(objectShuZi)); //投注信息 String tzInfoNoExit = redisUtils.getString(AppContants.TZ_INFO); if (StrUtil.isNotBlank(tzInfoNoExit)) { redisUtils.del(AppContants.TZ_INFO); } JSON jsonStr = JSONUtil.parse(linkedHashMap); redisUtils.set(AppContants.TZ_INFO, jsonStr); } }