|
@@ -1,10 +1,47 @@
|
|
|
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.TicketAwardsPrize;
|
|
|
+import com.qs.mp.admin.domain.dto.TicketDrawNumDTO;
|
|
|
+import com.qs.mp.admin.service.ICouponService;
|
|
|
+import com.qs.mp.admin.service.ITicketAwardsPrizeService;
|
|
|
+import com.qs.mp.admin.service.ITicketService;
|
|
|
+import com.qs.mp.common.enums.CouponUseAreaEnum;
|
|
|
+import com.qs.mp.common.enums.PrizeStorageInTypeEnum;
|
|
|
+import com.qs.mp.common.enums.PrizeStorageStatusEnum;
|
|
|
+import com.qs.mp.common.enums.TicketPrizeTypeEnum;
|
|
|
+import com.qs.mp.common.enums.UserCouponStatusEnum;
|
|
|
+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.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.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;
|
|
|
+import com.qs.mp.user.service.IUserTicketOrderItemService;
|
|
|
+import java.util.ArrayList;
|
|
|
+import java.util.Date;
|
|
|
+import java.util.List;
|
|
|
+import org.codehaus.janino.IClass.IField;
|
|
|
+import org.slf4j.Logger;
|
|
|
+import org.slf4j.LoggerFactory;
|
|
|
+import org.springframework.beans.factory.annotation.Autowired;
|
|
|
import org.springframework.stereotype.Service;
|
|
|
+import org.springframework.transaction.annotation.Transactional;
|
|
|
+import org.springframework.util.CollectionUtils;
|
|
|
|
|
|
/**
|
|
|
* <p>
|
|
@@ -17,4 +54,83 @@ import org.springframework.stereotype.Service;
|
|
|
@Service
|
|
|
public class UserHitPrizeServiceImpl extends ServiceImpl<UserHitPrizeMapper, UserHitPrize> implements IUserHitPrizeService {
|
|
|
|
|
|
+ protected final Logger logger = LoggerFactory.getLogger(this.getClass());
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ private IUserTicketOrderItemService userTicketOrderItemService;
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ private ITicketAwardsPrizeService ticketAwardsPrizeService;
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ private IUserPrizeStorageService userPrizeStorageService;
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ private IUserCoinService userCoinService;
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ private ICouponService couponService;
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public List<TicketAwardsPrize> listPrize(Ticket ticket, Long userId) {
|
|
|
+ UserHitPrize userHitPrize = getOne(new LambdaQueryWrapper<UserHitPrize>().eq(UserHitPrize::getTicketId, ticket.getTicketId()));
|
|
|
+ UserTicketOrderItem orderItem = userTicketOrderItemService.queryFinishedOrderItem(userId, ticket.getTicketId());
|
|
|
+ if (null == orderItem) {
|
|
|
+ LogUtil.error(logger, "查询盲票的奖品信息,盲票订单不存在。ticketId:{0}, userId:{1}",
|
|
|
+ new Object[]{ticket.getTicketId(), userId});
|
|
|
+ throw new ServiceException("盲票订单不存在");
|
|
|
+ }
|
|
|
+
|
|
|
+ if (null == userHitPrize) {
|
|
|
+ List<TicketDrawNumDTO> drawNumDTOList = JSONObject.parseArray(ticket.getDrawNum(), TicketDrawNumDTO.class);
|
|
|
+ for (TicketDrawNumDTO ticketDrawNumDTO : drawNumDTOList) {
|
|
|
+ if (ticketDrawNumDTO.getNum() == ticket.getPlainLuckyNum()) {
|
|
|
+ userHitPrize = new UserHitPrize();
|
|
|
+ userHitPrize.setUserId(userId);
|
|
|
+ userHitPrize.setOrderId(orderItem.getOrderId());
|
|
|
+ userHitPrize.setOrderItemId(orderItem.getItemId());
|
|
|
+ userHitPrize.setTicketId(ticket.getTicketId());
|
|
|
+ userHitPrize.setAwardsId(ticketDrawNumDTO.getId());
|
|
|
+ // 奖品ID等用户选择后填入
|
|
|
+// userHitPrize.setPrizeId();
|
|
|
+ save(userHitPrize);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ List<TicketAwardsPrize> awardsPrizes = ticketAwardsPrizeService.list(new LambdaQueryWrapper<TicketAwardsPrize>()
|
|
|
+ .eq(TicketAwardsPrize::getAwardsId, userHitPrize.getAwardsId()).orderByDesc(TicketAwardsPrize::getRemainQty));
|
|
|
+ return awardsPrizes;
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ @Transactional
|
|
|
+ public void cashPrize(Ticket ticket, Long userId, String awardsId, String prizeId) {
|
|
|
+ // 更新奖品已兑奖数量
|
|
|
+ TicketAwardsPrize ticketAwardsPrize = ticketAwardsPrizeService.getById(prizeId);
|
|
|
+ if (ticketAwardsPrize.getRemainQty() <= 0) {
|
|
|
+ throw new ServiceException("奖品已兑完,请重新选择");
|
|
|
+ }
|
|
|
+ // 乐观锁
|
|
|
+ ticketAwardsPrizeService.update(new LambdaUpdateWrapper<TicketAwardsPrize>().set(TicketAwardsPrize::getCashedQty, ticketAwardsPrize.getCashedQty() + 1)
|
|
|
+ .set(TicketAwardsPrize::getRemainQty, ticketAwardsPrize.getRemainQty() - 1)
|
|
|
+ .eq(TicketAwardsPrize::getPrizeId, prizeId).eq(TicketAwardsPrize::getCashedQty, ticketAwardsPrize.getCashedQty()));
|
|
|
+
|
|
|
+ // 保存奖品到中奖记录中
|
|
|
+ UserHitPrize userHitPrize = getOne(new LambdaQueryWrapper<UserHitPrize>().eq(UserHitPrize::getTicketId, ticket.getTicketId()));
|
|
|
+ userHitPrize.setPrizeId(prizeId);
|
|
|
+ updateById(userHitPrize);
|
|
|
+
|
|
|
+ // 放入仓库
|
|
|
+ if (ticketAwardsPrize.getPrizeType() == TicketPrizeTypeEnum.COIN) {
|
|
|
+ userCoinService.produce(userId, ticketAwardsPrize.getValue(), String.valueOf(userHitPrize.getId()));
|
|
|
+ } else if (ticketAwardsPrize.getPrizeType() == TicketPrizeTypeEnum.COUPON) {
|
|
|
+ couponService.distribute(ticket, userId, ticketAwardsPrize.getRefId());
|
|
|
+ } else {
|
|
|
+ userPrizeStorageService.takeInStorage(userId, ticketAwardsPrize, PrizeStorageInTypeEnum.TICKET_CASHED, String.valueOf(userHitPrize.getId()));
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
}
|