From 85e204ffc471a73fd9cab58470f906e1ef3c13c4 Mon Sep 17 00:00:00 2001 From: KKSU <15274802129@163.com> Date: Thu, 29 Feb 2024 10:14:59 +0800 Subject: [PATCH] 抽奖 --- src/main/java/cc/mrbird/febs/mall/service/impl/CJServiceImpl.java | 203 ++++++++++++++++++++++++++++++++++++++++++++------ 1 files changed, 177 insertions(+), 26 deletions(-) diff --git a/src/main/java/cc/mrbird/febs/mall/service/impl/CJServiceImpl.java b/src/main/java/cc/mrbird/febs/mall/service/impl/CJServiceImpl.java index 3df8f3b..76e0c51 100644 --- a/src/main/java/cc/mrbird/febs/mall/service/impl/CJServiceImpl.java +++ b/src/main/java/cc/mrbird/febs/mall/service/impl/CJServiceImpl.java @@ -14,6 +14,7 @@ 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.AsyncCjService; import cc.mrbird.febs.mall.service.CJService; import cc.mrbird.febs.mall.service.IApiMallMemberService; import cc.mrbird.febs.mall.vo.ApiKjInfoVo; @@ -25,6 +26,10 @@ import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.RandomUtil; 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.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; @@ -35,8 +40,12 @@ import java.math.BigDecimal; import java.text.ParseException; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; import java.util.ArrayList; +import java.util.LinkedHashMap; import java.util.List; +import java.util.Map; @Slf4j @Service @@ -52,6 +61,7 @@ private final CjInfoMapper cjInfoMapper; private final CjItemMapper cjItemMapper; private final IApiMallMemberService mallMemberService; + private final AsyncCjService asyncCjService; @Override public FebsResponse kjRecord(KjRecordDto kjRecordDto) { @@ -74,15 +84,49 @@ if (StrUtil.isNotBlank(recordNoExit)) { redisUtils.del(AppContants.KJ_RECORD_NO); } - redisUtils.set(AppContants.KJ_RECORD_NO, kjNo, 600); + redisUtils.set(AppContants.KJ_RECORD_NO, kjNo, AppContants.KJ_RECORD_TIME_INTERVAL*60); //开奖时间 if (StrUtil.isNotBlank(redisUtils.getString(AppContants.KJ_RECORD_TIME))) { redisUtils.del(AppContants.KJ_RECORD_TIME); } - redisUtils.set(AppContants.KJ_RECORD_TIME, kjRecord.getCreatedTime(), 600); + redisUtils.set(AppContants.KJ_RECORD_TIME, kjRecord.getCreatedTime(), AppContants.KJ_RECORD_TIME_INTERVAL*60); - agentProducer.sendChouJiangDelayMsg(kjNo, 10 * 60 * 1000L); - agentProducer.sendNoTimeDelayMsg(kjNo, 95 * 6 * 1000L);//提前三十秒停止下注 + agentProducer.sendChouJiangDelayMsg(kjNo, AppContants.KJ_RECORD_TIME_INTERVAL * 60 * 1000L); + agentProducer.sendNoTimeDelayMsg(kjNo, (AppContants.KJ_RECORD_TIME_INTERVAL-1) * 60 * 1000L);//提一分钟停止下注 + + //todo 测试下注 +// ApiCreateDto apiCreateDto = new ApiCreateDto(); +// List<ApiCreateItemDto> items = new ArrayList<>(); +// ApiCreateItemDto apiCreateItemDto = new ApiCreateItemDto(); +// apiCreateItemDto.setId(1L); +// apiCreateItemDto.setTzAmount(new BigDecimal("10")); +// items.add(apiCreateItemDto); +// +// ApiCreateItemDto apiCreateItemDto2 = new ApiCreateItemDto(); +// apiCreateItemDto2.setId(2L); +// apiCreateItemDto2.setTzAmount(new BigDecimal("10")); +// items.add(apiCreateItemDto2); +// +// ApiCreateItemDto apiCreateItemDto3 = new ApiCreateItemDto(); +// apiCreateItemDto3.setId(3L); +// apiCreateItemDto3.setTzAmount(new BigDecimal("10")); +// items.add(apiCreateItemDto3); +// +// ApiCreateItemDto apiCreateItemDto4 = new ApiCreateItemDto(); +// apiCreateItemDto4.setId(4L); +// apiCreateItemDto4.setTzAmount(new BigDecimal("10")); +// items.add(apiCreateItemDto4); +// +// ApiCreateItemDto apiCreateItemDto5 = new ApiCreateItemDto(); +// int randomInt = RandomUtil.randomInt(1, 25); +// apiCreateItemDto5.setId(Long.parseLong(String.valueOf(randomInt))); +// apiCreateItemDto5.setTzAmount(new BigDecimal("10")); +// items.add(apiCreateItemDto5); +// apiCreateDto.setItems(items); +// +// for(int i = 0;i<=100;i++){ +// asyncCjService.create(apiCreateDto); +// } } @@ -124,6 +168,12 @@ DataDictionaryEnum.TIME_INTERVAL.getCode() ); apiKjInfoVo.setDjs(Integer.parseInt(timeIntervalDic.getValue())); + + // 获取当前时间 + LocalDateTime currentTime = LocalDateTime.now(); + // 定义时间格式 + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); + apiKjInfoVo.setSystemTime(currentTime.format(formatter)); return new FebsResponse().success().data(apiKjInfoVo); } @@ -141,7 +191,16 @@ if(ObjectUtil.isEmpty(kjRecord)){ return; } + DataDictionaryCustom openPriceDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode( + DataDictionaryEnum.OPEN_PRICE.getType(), + DataDictionaryEnum.OPEN_PRICE.getCode() + ); int randomInt = RandomUtil.randomInt(1, 25); + if(StrUtil.isNotEmpty(openPriceDic.getValue())){ + randomInt = Integer.parseInt(openPriceDic.getValue()); + openPriceDic.setValue(""); + dataDictionaryCustomMapper.updateById(openPriceDic); + } kjRecord.setKjNum( String.valueOf(randomInt)); kjRecordMapper.updateById(kjRecord); @@ -150,13 +209,13 @@ if (StrUtil.isNotBlank(recordNoExit)) { redisUtils.del(AppContants.KJ_RECORD_NO_OLD); } - redisUtils.set(AppContants.KJ_RECORD_NO_OLD, kjNo, 600); + redisUtils.set(AppContants.KJ_RECORD_NO_OLD, kjNo, AppContants.KJ_RECORD_TIME_INTERVAL * 60); //开奖号码 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); + redisUtils.set(AppContants.KJ_RECORD_NUM_OLD, randomInt, AppContants.KJ_RECORD_TIME_INTERVAL * 60); OpenPrice openPrice = new OpenPrice(); openPrice.setKjNo(kjNo); openPrice.setKjNum(String.valueOf(randomInt)); @@ -166,30 +225,27 @@ @Override public FebsResponse tzInfo() { - ArrayList<ApiTzInfoVo> objects = new ArrayList<>(); - - List<TzInfo> tzInfos = tzInfoMapper.selectList(null); - if(CollUtil.isNotEmpty(tzInfos)){ - for(TzInfo tzInfo : tzInfos){ - ApiTzInfoVo apiTzInfoVo = TzInfoConversion.INSTANCE.entityToVo(tzInfo); - objects.add(apiTzInfoVo); - } + LinkedHashMap<String, JSON> tzInfo1 = new LinkedHashMap<>(); + Object tzInfoMap = redisUtils.get(AppContants.TZ_INFO); + if(ObjectUtil.isEmpty(tzInfoMap)){ + tzInfo1 = this.getTzInfo(); + }else{ + tzInfo1 = JSONUtil.toBean(JSONUtil.parseObj(tzInfoMap), LinkedHashMap.class); } - return new FebsResponse().success().data(objects); + return new FebsResponse().success().data(tzInfo1); } @Override @Transactional public FebsResponse create(ApiCreateDto apiCreateDto) { -// Long memberId = LoginUserUtil.getLoginUser().getId(); - Long memberId = 1L; + Long memberId = LoginUserUtil.getLoginUser().getId(); //开启下注 DataDictionaryCustom noTimeDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode( DataDictionaryEnum.NO_TIME.getType(), DataDictionaryEnum.NO_TIME.getCode() ); - if(noTimeDic.getValue().equals(2)){ - throw new FebsException("请等待下一期"); + if("2".equals(noTimeDic.getValue())){ + throw new FebsException("已停止投注"); } List<ApiCreateItemDto> items = apiCreateDto.getItems(); @@ -208,13 +264,16 @@ 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(1); - cjInfo.setZjState(1); + cjInfo.setKjState(0); cjInfo.setPerkAmount(BigDecimal.ZERO); cjInfo.setTotalAmount(totalAmount); cjInfoMapper.insert(cjInfo); @@ -226,12 +285,12 @@ 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.setTzCode(tzInfo.getTzCode()); + cjItem.setTzPercent(tzInfo.getTzPercent()); cjItem.setType(tzInfo.getType()); cjItem.setAmount(tzAmount); cjItem.setItemNum(tzInfo.getTzCode()); @@ -242,7 +301,7 @@ String orderNo = MallUtils.getOrderNum("T"); mallMemberService.addMoneyFlow( memberId, - totalAmount, + totalAmount.negate(), MoneyFlowTypeNewEnum.STATIC_BONUS.getValue(), orderNo, MoneyFlowTypeNewEnum.STATIC_BONUS.getDescription(), @@ -256,12 +315,18 @@ @Override public FebsResponse tzInfoList(KjRecordDto kjRecordDto) { -// Long memberId = LoginUserUtil.getLoginUser().getId(); - Long memberId = 1L; + Long memberId = LoginUserUtil.getLoginUser().getId(); kjRecordDto.setMemberId(memberId); IPage<CjInfo> page = new Page<>(kjRecordDto.getPageNum(), kjRecordDto.getPageSize()); IPage<CjInfo> pages = cjInfoMapper.selectTzListByMemberId(page, kjRecordDto); List<CjInfo> records = pages.getRecords(); + if(CollUtil.isNotEmpty(records)){ + for(CjInfo item : records){ + Long id = item.getId(); + List<CjItem> cjItems = cjItemMapper.selectListByInfoId(id); + item.setItems(cjItems); + } + } List<ApiTzListVo> apiTzListVos = CjInfoConversion.INSTANCE.entitysToVos(records); return new FebsResponse().success().data(apiTzListVos); } @@ -278,7 +343,93 @@ @Override public void getOpenPriceMsg(String kjNo, String kjNum) { + QueryWrapper<CjInfo> objectQueryWrapper = new QueryWrapper<>(); + objectQueryWrapper.eq("kj_no",kjNo); + List<CjInfo> cjInfos = cjInfoMapper.selectList(objectQueryWrapper); + if(ObjectUtil.isEmpty(cjInfos)){ + return; + } + String danshuang = judgeNumberOne(Integer.parseInt(kjNum)); + String daXiao = judgeNumberTwo(Integer.parseInt(kjNum)); + for(CjInfo cjInfo : cjInfos){ + asyncCjService.openPriceAsync(cjInfo,kjNum,danshuang,daXiao); + } + } + @Override + public LinkedHashMap<String, JSON> getTzInfo() { + LinkedHashMap<String, JSON> linkedHashMap = new LinkedHashMap<>(); + + ArrayList<ApiTzInfoVo> objectDaxiao = new ArrayList<>(); + QueryWrapper<TzInfo> daxiaoQueryWrapper = new QueryWrapper<>(); + daxiaoQueryWrapper.eq("type",1); + List<TzInfo> 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<ApiTzInfoVo> objectDanshuang = new ArrayList<>(); + QueryWrapper<TzInfo> danshuangQueryWrapper = new QueryWrapper<>(); + danshuangQueryWrapper.eq("type",2); + List<TzInfo> 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<ApiTzInfoVo> objectShuZi = new ArrayList<>(); + QueryWrapper<TzInfo> shuZiQueryWrapper = new QueryWrapper<>(); + shuZiQueryWrapper.eq("type",3); + List<TzInfo> 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); + return linkedHashMap; + } + + /** + * 取模运算符%来判断该数字是否为偶数。如果余数为0,则该数字为偶数,返回"双数";否则,该数字为奇数,返回"单数" + * @param num + * @return 1-单数 2-双数 + */ + public static String judgeNumberOne(int num) { + if (num % 2 == 0) { + return "双"; + } else { + return "单"; + } + } + + /** + * 小于等于12为小 大于12为大 + * @param num + * @return 1-小数 2-大数 + */ + public static String judgeNumberTwo(int num) { + if (num <= 12) { + return "小"; + } else { + return "大"; + } } } -- Gitblit v1.9.1