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.*; 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 ,String hong,String lan,String caiqiu,String liugehao,String sangehao) { long l = System.currentTimeMillis(); List cjItems = cjItemMapper.selectListByInfoId(cjInfo.getId()); if(CollUtil.isEmpty(cjItems)){ return; } BigDecimal perkAmountTotal = BigDecimal.ZERO;//中奖总金额 List 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(kjNum); 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(kjNum); 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); } } //按红 List collectHong = cjItems.stream().filter(cjItem -> cjItem.getType() == 4).collect(Collectors.toList()); if(CollUtil.isNotEmpty(collectHong)){ for(CjItem cjItem : collectHong){ String tzCode = cjItem.getTzCode(); cjItem.setKjNum(kjNum); BigDecimal perkAmount = BigDecimal.ZERO; if(hong.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 collectLan = cjItems.stream().filter(cjItem -> cjItem.getType() == 8).collect(Collectors.toList()); if(CollUtil.isNotEmpty(collectLan)){ for(CjItem cjItem : collectLan){ String tzCode = cjItem.getTzCode(); cjItem.setKjNum(kjNum); BigDecimal perkAmount = BigDecimal.ZERO; if(lan.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 collectCaiQiu = cjItems.stream().filter(cjItem -> cjItem.getType() == 5).collect(Collectors.toList()); if(CollUtil.isNotEmpty(collectCaiQiu)){ for(CjItem cjItem : collectCaiQiu){ String tzCode = cjItem.getTzCode(); cjItem.setKjNum(kjNum); BigDecimal perkAmount = BigDecimal.ZERO; if(caiqiu.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 collectLiuGeHao = cjItems.stream().filter(cjItem -> cjItem.getType() == 6).collect(Collectors.toList()); if(CollUtil.isNotEmpty(collectLiuGeHao)){ for(CjItem cjItem : collectLiuGeHao){ String tzCode = cjItem.getTzCode(); cjItem.setKjNum(kjNum); BigDecimal perkAmount = BigDecimal.ZERO; if(liugehao.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 collectSanGeHao = cjItems.stream().filter(cjItem -> cjItem.getType() == 7).collect(Collectors.toList()); if(CollUtil.isNotEmpty(collectSanGeHao)){ for(CjItem cjItem : collectSanGeHao){ String tzCode = cjItem.getTzCode(); cjItem.setKjNum(kjNum); BigDecimal perkAmount = BigDecimal.ZERO; if(sangehao.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 memberId) { long l = System.currentTimeMillis(); //开启下注 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"); } Long id = apiCreateItemDto.getId();//投注ID TzInfo tzInfo = tzInfoMapper.selectById(id); if(ObjectUtil.isEmpty(tzInfo)){ throw new FebsException("参数有误,请刷新页面"); } apiCreateItemDto.setTzInfo(tzInfo); 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 = apiCreateItemDto.getTzInfo(); 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<>(); List tzInfos = tzInfoMapper.selectList(null); linkedHashMap.put("daXiao", JSONUtil.parse( TzInfoConversion.INSTANCE.entitysToVo( tzInfos.stream().filter(tzInfo -> tzInfo.getType() == 1).collect(Collectors.toList())))); linkedHashMap.put("danShuang", JSONUtil.parse( TzInfoConversion.INSTANCE.entitysToVo( tzInfos.stream().filter(tzInfo -> tzInfo.getType() == 2).collect(Collectors.toList())))); linkedHashMap.put("shuZi", JSONUtil.parse( TzInfoConversion.INSTANCE.entitysToVo( tzInfos.stream().filter(tzInfo -> tzInfo.getType() == 3).collect(Collectors.toList())))); linkedHashMap.put("hong", JSONUtil.parse( TzInfoConversion.INSTANCE.entitysToVo( tzInfos.stream().filter(tzInfo -> tzInfo.getType() == 4).collect(Collectors.toList())))); linkedHashMap.put("caiqiu", JSONUtil.parse( TzInfoConversion.INSTANCE.entitysToVo( tzInfos.stream().filter(tzInfo -> tzInfo.getType() == 5).collect(Collectors.toList())))); linkedHashMap.put("liuHao", JSONUtil.parse( TzInfoConversion.INSTANCE.entitysToVo( tzInfos.stream().filter(tzInfo -> tzInfo.getType() == 6).collect(Collectors.toList())))); linkedHashMap.put("sanHao", JSONUtil.parse( TzInfoConversion.INSTANCE.entitysToVo( tzInfos.stream().filter(tzInfo -> tzInfo.getType() == 7).collect(Collectors.toList())))); linkedHashMap.put("lan", JSONUtil.parse( TzInfoConversion.INSTANCE.entitysToVo( tzInfos.stream().filter(tzInfo -> tzInfo.getType() == 8).collect(Collectors.toList())))); //投注信息 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); } }