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.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 cn.hutool.core.collection.CollUtil;
|
import cn.hutool.core.util.ObjectUtil;
|
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.List;
|
import java.util.stream.Collectors;
|
|
@Slf4j
|
@Service
|
@RequiredArgsConstructor
|
public class AsyncCjServiceImpl extends ServiceImpl<CjInfoMapper, CjInfo> 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<CjItem> cjItems = cjItemMapper.selectListByInfoId(cjInfo.getId());
|
if(CollUtil.isEmpty(cjItems)){
|
return;
|
}
|
/**
|
* 1-按大小 2-按单双 3-按数字
|
*/
|
BigDecimal perkAmountTotal = BigDecimal.ZERO;//中奖总金额
|
|
ArrayList<CjItem> CjItemUpdateList = new ArrayList<>();
|
//按大小
|
List<CjItem> 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<CjItem> 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<CjItem> 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<ApiCreateItemDto> 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));
|
}
|
|
}
|