|
@@ -3,28 +3,24 @@ package com.qs.mp.user.service.impl;
|
|
|
import com.alibaba.fastjson.JSONObject;
|
|
|
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
|
|
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
|
|
|
-import com.qs.mp.admin.domain.Coupon;
|
|
|
import com.qs.mp.admin.domain.Ticket;
|
|
|
import com.qs.mp.admin.domain.TicketAwards;
|
|
|
import com.qs.mp.admin.domain.TicketAwardsPrize;
|
|
|
import com.qs.mp.admin.domain.dto.TicketDrawNumDTO;
|
|
|
import com.qs.mp.admin.service.*;
|
|
|
+import com.qs.mp.common.core.domain.AjaxResult;
|
|
|
import com.qs.mp.common.enums.*;
|
|
|
import com.qs.mp.common.exception.ServiceException;
|
|
|
-import com.qs.mp.common.utils.DateUtils;
|
|
|
import com.qs.mp.common.utils.LogUtil;
|
|
|
import com.qs.mp.common.utils.StringUtils;
|
|
|
import com.qs.mp.system.service.id.BizIdGenerator;
|
|
|
-import com.qs.mp.user.domain.UserCoupon;
|
|
|
-import com.qs.mp.user.domain.UserCouponChannel;
|
|
|
import com.qs.mp.user.domain.UserHitPrize;
|
|
|
-import com.qs.mp.user.domain.UserPrizeStorage;
|
|
|
import com.qs.mp.user.domain.UserTicketOrderItem;
|
|
|
+import com.qs.mp.user.domain.param.TicketAutoCashPrizeParam;
|
|
|
import com.qs.mp.user.domain.vo.TicketHitPrizeBarrageVO;
|
|
|
+import com.qs.mp.user.domain.vo.UserHitPrizeDetailVO;
|
|
|
import com.qs.mp.user.mapper.UserHitPrizeMapper;
|
|
|
import com.qs.mp.user.service.IUserCoinService;
|
|
|
-import com.qs.mp.user.service.IUserCouponChannelService;
|
|
|
-import com.qs.mp.user.service.IUserCouponService;
|
|
|
import com.qs.mp.user.service.IUserHitPrizeService;
|
|
|
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
|
|
import com.qs.mp.user.service.IUserPrizeStorageService;
|
|
@@ -33,17 +29,16 @@ import com.qs.mp.user.service.IUserTicketOrderItemService;
|
|
|
import java.time.LocalDateTime;
|
|
|
import java.time.LocalTime;
|
|
|
import java.util.ArrayList;
|
|
|
-import java.util.Date;
|
|
|
import java.util.List;
|
|
|
+import java.util.Random;
|
|
|
|
|
|
-import org.codehaus.janino.IClass.IField;
|
|
|
import org.slf4j.Logger;
|
|
|
import org.slf4j.LoggerFactory;
|
|
|
+import org.springframework.beans.BeanUtils;
|
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
|
import org.springframework.stereotype.Service;
|
|
|
import org.springframework.transaction.annotation.Transactional;
|
|
|
import org.springframework.util.Assert;
|
|
|
-import org.springframework.util.CollectionUtils;
|
|
|
|
|
|
/**
|
|
|
* <p>
|
|
@@ -85,6 +80,9 @@ public class UserHitPrizeServiceImpl extends ServiceImpl<UserHitPrizeMapper, Use
|
|
|
@Autowired
|
|
|
private ICouponPkgService couponPkgService;
|
|
|
|
|
|
+ @Autowired
|
|
|
+ private IUserHitPrizeService userHitPrizeService;
|
|
|
+
|
|
|
@Override
|
|
|
public List<TicketAwardsPrize> listPrize(Ticket ticket, Long userId) {
|
|
|
UserHitPrize userHitPrize = getOne(new LambdaQueryWrapper<UserHitPrize>().eq(UserHitPrize::getTicketId, ticket.getTicketId()));
|
|
@@ -119,6 +117,104 @@ public class UserHitPrizeServiceImpl extends ServiceImpl<UserHitPrizeMapper, Use
|
|
|
return awardsPrizes;
|
|
|
}
|
|
|
|
|
|
+ @Override
|
|
|
+ @Transactional(rollbackFor = Exception.class)
|
|
|
+ public UserHitPrizeDetailVO autoCashPrize(Long userId, TicketAutoCashPrizeParam param) {
|
|
|
+
|
|
|
+ UserHitPrizeDetailVO userHitPrizeDetailVO = new UserHitPrizeDetailVO();
|
|
|
+
|
|
|
+ // 封装出参对象
|
|
|
+ List<TicketAwardsPrize> ticketAwardsPrizeList = ticketAwardsPrizeService.list(new LambdaQueryWrapper<TicketAwardsPrize>()
|
|
|
+ .eq(TicketAwardsPrize::getBoxId, param.getBoxId()));
|
|
|
+
|
|
|
+ List<TicketAwardsPrize> params = new ArrayList<>();
|
|
|
+ int index = 0;
|
|
|
+ for (int i = 0; i < 48; i++) {
|
|
|
+ TicketAwardsPrize ticketAwardsPrize = new TicketAwardsPrize();
|
|
|
+ BeanUtils.copyProperties(ticketAwardsPrizeList.get(index),ticketAwardsPrize);
|
|
|
+ params.add(ticketAwardsPrize);
|
|
|
+ if (index == ticketAwardsPrizeList.size() - 1) {
|
|
|
+ index = 0;
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ index++;
|
|
|
+ }
|
|
|
+ userHitPrizeDetailVO.setTicketAwardsPrizeList(params);
|
|
|
+ if (param.getIsTry() == 1) {
|
|
|
+ List<TicketAwards> list = ticketAwardsService.list(new LambdaQueryWrapper<TicketAwards>()
|
|
|
+ .eq(TicketAwards::getBoxId,param.getBoxId())
|
|
|
+ .orderByAsc(TicketAwards::getSort));
|
|
|
+ List<TicketAwardsPrize> prizeList = ticketAwardsPrizeService.list(new LambdaQueryWrapper<TicketAwardsPrize>()
|
|
|
+ .eq(TicketAwardsPrize::getBoxId, param.getBoxId())
|
|
|
+ .in(TicketAwardsPrize::getAwardsId, list.get(0).getAwardsId(),list.get(1).getAwardsId()));
|
|
|
+ TicketAwardsPrize ticketAwardsPrize = prizeList.get(new Random().nextInt(prizeList.size()));
|
|
|
+ userHitPrizeDetailVO.setPrizeId(ticketAwardsPrize.getPrizeId());
|
|
|
+ userHitPrizeDetailVO.setPicUrl(ticketAwardsPrize.getPicUrl());
|
|
|
+ userHitPrizeDetailVO.setTitle(ticketAwardsPrize.getTitle());
|
|
|
+ userHitPrizeDetailVO.setValue(ticketAwardsPrize.getValue());
|
|
|
+ userHitPrizeDetailVO.setPrizeType(ticketAwardsPrize.getPrizeType());
|
|
|
+ userHitPrizeDetailVO.setRefId(ticketAwardsPrize.getRefId());
|
|
|
+ }else {
|
|
|
+
|
|
|
+ Ticket ticket = ticketService.getById(param.getTicketId());
|
|
|
+ if (null == ticket) {
|
|
|
+ throw new ServiceException("参数异常,盲票不存在");
|
|
|
+ }
|
|
|
+ if (ticket.getStatus() == TicketStatusEnum.CASHED) {
|
|
|
+ throw new ServiceException(ErrorCodeEnum.ERROR_CODE_1017);
|
|
|
+ }
|
|
|
+ if (ticket.getStatus() != TicketStatusEnum.ACTIVATED) {
|
|
|
+ throw new ServiceException(ErrorCodeEnum.ERROR_CODE_1019);
|
|
|
+ }
|
|
|
+
|
|
|
+ // 查看奖级下的奖品
|
|
|
+ List<TicketAwardsPrize> ticketAwardsPrizes = userHitPrizeService.listPrize(ticket, userId);
|
|
|
+
|
|
|
+ // 开奖
|
|
|
+ int random = -1;
|
|
|
+ // 计算总权重
|
|
|
+ double sumWeight = 0;
|
|
|
+ for (TicketAwardsPrize ticketAwardsPrize : ticketAwardsPrizes) {
|
|
|
+ sumWeight += ticketAwardsPrize.getRemainQty();
|
|
|
+ }
|
|
|
+
|
|
|
+ //产生随机数
|
|
|
+ double randomNumber;
|
|
|
+ randomNumber = Math.random();
|
|
|
+
|
|
|
+ //根据随机数在所有奖品分布的区域并确定所抽奖品
|
|
|
+ double d1 = 0;
|
|
|
+ double d2 = 0;
|
|
|
+ for (int i = 0; i < ticketAwardsPrizes.size(); i++) {
|
|
|
+ d2 += Double.parseDouble(String.valueOf(ticketAwardsPrizes.get(i).getQuantity())) / sumWeight;
|
|
|
+ if (i == 0) {
|
|
|
+ d1 = 0;
|
|
|
+ } else {
|
|
|
+ d1 += Double.parseDouble(String.valueOf(ticketAwardsPrizes.get(i - 1).getQuantity())) / sumWeight;
|
|
|
+ }
|
|
|
+ if (randomNumber > d1 && randomNumber <= d2) {
|
|
|
+ random = i;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ TicketAwardsPrize ticketAwardsPrize = ticketAwardsPrizes.get(random);
|
|
|
+
|
|
|
+ userHitPrizeDetailVO.setPrizeId(ticketAwardsPrize.getPrizeId());
|
|
|
+ userHitPrizeDetailVO.setPicUrl(ticketAwardsPrize.getPicUrl());
|
|
|
+ userHitPrizeDetailVO.setTitle(ticketAwardsPrize.getTitle());
|
|
|
+ userHitPrizeDetailVO.setValue(ticketAwardsPrize.getValue());
|
|
|
+ userHitPrizeDetailVO.setPrizeType(ticketAwardsPrize.getPrizeType());
|
|
|
+ userHitPrizeDetailVO.setRefId(ticketAwardsPrize.getRefId());
|
|
|
+
|
|
|
+ // 兑奖
|
|
|
+ this.cashPrize(ticket, userId, ticketAwardsPrize.getAwardsId(), ticketAwardsPrize.getPrizeId());
|
|
|
+ }
|
|
|
+
|
|
|
+ return userHitPrizeDetailVO;
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
@Override
|
|
|
@Transactional(rollbackFor = Exception.class)
|
|
|
public void cashPrize(Ticket ticket, Long userId, String awardsId, String prizeId) {
|