package cc.mrbird.febs.mall.service.impl; import cc.mrbird.febs.common.entity.FebsResponse; 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.*; import cc.mrbird.febs.mall.conversion.CjInfoConversion; 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.dto.KjRecordDto; import cc.mrbird.febs.mall.dto.OpenPrice; import cc.mrbird.febs.mall.entity.*; import cc.mrbird.febs.mall.mapper.*; import cc.mrbird.febs.mall.service.CJService; import cc.mrbird.febs.mall.service.IApiMallMemberService; import cc.mrbird.febs.mall.vo.ApiKjInfoVo; import cc.mrbird.febs.mall.vo.ApiKjRecordVo; import cc.mrbird.febs.mall.vo.ApiTzInfoVo; import cc.mrbird.febs.mall.vo.ApiTzListVo; import cc.mrbird.febs.rabbit.producter.AgentProducer; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.RandomUtil; import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.math.BigDecimal; import java.text.ParseException; import java.util.ArrayList; import java.util.List; @Slf4j @Service @RequiredArgsConstructor public class CJServiceImpl extends ServiceImpl implements CJService { private final KjRecordMapper kjRecordMapper; private final RedisUtils redisUtils; private final DataDictionaryCustomMapper dataDictionaryCustomMapper; private final AgentProducer agentProducer; private final TzInfoMapper tzInfoMapper; private final MallMemberWalletMapper mallMemberWalletMapper; private final CjInfoMapper cjInfoMapper; private final CjItemMapper cjItemMapper; private final IApiMallMemberService mallMemberService; @Override public FebsResponse kjRecord(KjRecordDto kjRecordDto) { IPage page = new Page<>(kjRecordDto.getPageNum(), kjRecordDto.getPageSize()); IPage pages = kjRecordMapper.selectListInPage(page, kjRecordDto); return new FebsResponse().success().data(pages); } @Override public void createKjRecord() { KjRecord kjRecord = new KjRecord(); String kjNo = MallUtils.getOrderNum(); kjRecord.setKjNo(kjNo); kjRecordMapper.insert(kjRecord); /** * redis中设置下一期的开奖编号和开奖时间 */ //开奖编号 String recordNoExit = redisUtils.getString(AppContants.KJ_RECORD_NO); if (StrUtil.isNotBlank(recordNoExit)) { redisUtils.del(AppContants.KJ_RECORD_NO); } redisUtils.set(AppContants.KJ_RECORD_NO, kjNo, 600); //开奖时间 if (StrUtil.isNotBlank(redisUtils.getString(AppContants.KJ_RECORD_TIME))) { redisUtils.del(AppContants.KJ_RECORD_TIME); } redisUtils.set(AppContants.KJ_RECORD_TIME, kjRecord.getCreatedTime(), 600); agentProducer.sendChouJiangDelayMsg(kjNo, 10 * 60 * 1000L); agentProducer.sendNoTimeDelayMsg(kjNo, 95 * 6 * 1000L);//提前三十秒停止下注 } @Override public FebsResponse kjInfo() { ApiKjInfoVo apiKjInfoVo = new ApiKjInfoVo(); String kjNoOld = redisUtils.getString(AppContants.KJ_RECORD_NO_OLD); String kjNumOld = redisUtils.getString(AppContants.KJ_RECORD_NUM_OLD); if(StrUtil.isBlank(kjNoOld)){ KjRecord kjRecordOld = kjRecordMapper.selectOneByLimitZero(1,1); if(ObjectUtil.isNotEmpty(kjRecordOld)){ apiKjInfoVo.setKjNoOld(kjRecordOld.getKjNo()); apiKjInfoVo.setKjNumOld(kjRecordOld.getKjNum()); } }else{ apiKjInfoVo.setKjNoOld(kjNoOld); apiKjInfoVo.setKjNumOld(kjNumOld); } String kjNo = redisUtils.getString(AppContants.KJ_RECORD_NO); String createdTime = redisUtils.getString(AppContants.KJ_RECORD_TIME); if(StrUtil.isBlank(kjNo)){ KjRecord kjRecord = kjRecordMapper.selectOneByLimitZero(0,1); if(ObjectUtil.isNotEmpty(kjRecord)){ apiKjInfoVo.setKjNo(kjRecord.getKjNo()); apiKjInfoVo.setCreatedTime(kjRecord.getCreatedTime().toString()); } }else{ apiKjInfoVo.setKjNo(kjNo); try { apiKjInfoVo.setCreatedTime(DateUtil.formatCstTime(createdTime, DateUtil.FULL_TIME_SPLIT_PATTERN)); } catch (ParseException e) { e.printStackTrace(); } } DataDictionaryCustom timeIntervalDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode( DataDictionaryEnum.TIME_INTERVAL.getType(), DataDictionaryEnum.TIME_INTERVAL.getCode() ); apiKjInfoVo.setDjs(Integer.parseInt(timeIntervalDic.getValue())); return new FebsResponse().success().data(apiKjInfoVo); } @Override public void getChouJiangDelayMsg(String kjNo) { //开启下注 DataDictionaryCustom noTimeDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode( DataDictionaryEnum.NO_TIME.getType(), DataDictionaryEnum.NO_TIME.getCode() ); noTimeDic.setValue("1"); dataDictionaryCustomMapper.updateById(noTimeDic); //开奖 KjRecord kjRecord = kjRecordMapper.selectKjNo(kjNo); if(ObjectUtil.isEmpty(kjRecord)){ return; } int randomInt = RandomUtil.randomInt(1, 25); kjRecord.setKjNum( String.valueOf(randomInt)); kjRecordMapper.updateById(kjRecord); //开奖编号 String recordNoExit = redisUtils.getString(AppContants.KJ_RECORD_NO_OLD); if (StrUtil.isNotBlank(recordNoExit)) { redisUtils.del(AppContants.KJ_RECORD_NO_OLD); } redisUtils.set(AppContants.KJ_RECORD_NO_OLD, kjNo, 600); //开奖号码 if (StrUtil.isNotBlank(redisUtils.getString(AppContants.KJ_RECORD_NUM_OLD))) { redisUtils.del(AppContants.KJ_RECORD_NUM_OLD); } redisUtils.set(AppContants.KJ_RECORD_NUM_OLD, randomInt, 600); OpenPrice openPrice = new OpenPrice(); openPrice.setKjNo(kjNo); openPrice.setKjNum(String.valueOf(randomInt)); agentProducer.sendOpenPriceMsg(openPrice); } @Override public FebsResponse tzInfo() { ArrayList objects = new ArrayList<>(); List tzInfos = tzInfoMapper.selectList(null); if(CollUtil.isNotEmpty(tzInfos)){ for(TzInfo tzInfo : tzInfos){ ApiTzInfoVo apiTzInfoVo = TzInfoConversion.INSTANCE.entityToVo(tzInfo); objects.add(apiTzInfoVo); } } return new FebsResponse().success().data(objects); } @Override @Transactional public FebsResponse create(ApiCreateDto apiCreateDto) { // Long memberId = LoginUserUtil.getLoginUser().getId(); 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("余额不足"); } //新增一条投注主表记录 CjInfo cjInfo = new CjInfo(); cjInfo.setMemberId(memberId); String kjNo = redisUtils.getString(AppContants.KJ_RECORD_NO); cjInfo.setKjNo(kjNo); cjInfo.setKjState(1); cjInfo.setZjState(1); 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);//投注金额 totalAmount = totalAmount.add(tzAmount); CjItem cjItem = new CjItem(); cjItem.setInfoId(cjInfo.getId()); cjItem.setMemberId(memberId); cjItem.setTzId(id); 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, MoneyFlowTypeNewEnum.STATIC_BONUS.getValue(), orderNo, MoneyFlowTypeNewEnum.STATIC_BONUS.getDescription(), null, cjInfo.getId(), 2, FlowTypeEnum.BALANCE.getValue()); return new FebsResponse().success().message("操作成功"); } @Override public FebsResponse tzInfoList(KjRecordDto kjRecordDto) { // Long memberId = LoginUserUtil.getLoginUser().getId(); Long memberId = 1L; kjRecordDto.setMemberId(memberId); IPage page = new Page<>(kjRecordDto.getPageNum(), kjRecordDto.getPageSize()); IPage pages = cjInfoMapper.selectTzListByMemberId(page, kjRecordDto); List records = pages.getRecords(); List apiTzListVos = CjInfoConversion.INSTANCE.entitysToVos(records); return new FebsResponse().success().data(apiTzListVos); } @Override public void getNoTimeDelayMsg(String kjNo) { DataDictionaryCustom noTimeDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode( DataDictionaryEnum.NO_TIME.getType(), DataDictionaryEnum.NO_TIME.getCode() ); noTimeDic.setValue("2"); dataDictionaryCustomMapper.updateById(noTimeDic); } @Override public void getOpenPriceMsg(String kjNo, String kjNum) { } }