嗨森逛服务
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
hai-server/hai-service/src/main/java/com/hai/service/impl/HighActivityUserLotteryNumS...

142 lines
5.2 KiB

package com.hai.service.impl;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.hai.common.exception.ErrorCode;
import com.hai.common.exception.ErrorHelp;
import com.hai.common.exception.SysCode;
import com.hai.dao.HighActivityUserLotteryNumMapper;
import com.hai.entity.*;
import com.hai.enum_type.ActivityInfoStatus;
import com.hai.service.*;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Isolation;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource;
import java.util.Date;
import java.util.List;
@Service("highActivityUserLotteryNumService")
public class HighActivityUserLotteryNumServiceImpl implements HighActivityUserLotteryNumService {
@Resource
private HighActivityInfoService highActivityInfoService;
@Resource
private HighActivityAwardSerialNumService highActivityAwardSerialNumService;
@Resource
private HighActivityAwardActualPrizeService highActivityAwardActualPrizeService;
@Resource
private HighActivityAwardUserService highActivityAwardUserService;
@Resource
private HighActivityPrizeService highActivityPrizeService;
@Resource
private HighActivityUserLotteryNumMapper highActivityUserLotteryNumMapper;
@Resource
private HighDiscountUserRelService highDiscountUserRelService;
@Override
@Transactional(rollbackFor = Exception.class,
propagation= Propagation.REQUIRES_NEW,
isolation= Isolation.SERIALIZABLE,
timeout = 30)
public Object userLottery(Long activityId, Long userId) {
// 查询活动未中奖的号码
List<HighActivityAwardSerialNum> serialNumList = highActivityAwardSerialNumService.getNoGainListByActivity(activityId);
if (serialNumList.size() == 0) {
throw ErrorHelp.genException(SysCode.System, ErrorCode.COMMON_ERROR, "奖励已经被抽完了");
}
// 减去用户抽奖次数
minusLotteryNum(activityId,userId);
// 抽中的号码
int index = (int) (Math.random() * serialNumList.size());
HighActivityAwardSerialNum serialNum = serialNumList.get(index);
serialNum.setStatus(2);
highActivityAwardSerialNumService.update(serialNum);
// 增加中奖记录
highActivityAwardUserService.insertAwardUser(serialNum.getId(),userId);
// 异步领取奖品,减少接口响应时间
new Thread(() -> {
// 领取奖品
receivePrize(serialNum,userId);
}).start();
JSONObject jsonObject = new JSONObject();
jsonObject.put("activityAwardId", serialNum.getActivityAwardId());
jsonObject.put("serialNum", serialNum.getSerialNum());
return jsonObject;
}
/**
* 领取奖品
*/
private void receivePrize(HighActivityAwardSerialNum serialNum, Long userId) {
// 查询中奖的奖品
List<HighActivityAwardActualPrize> prizeList = highActivityAwardActualPrizeService.getActualPrizeBySerialNumId(serialNum.getId());
for (HighActivityAwardActualPrize actualPrize : prizeList) {
// 实际奖品类型 1:卡券 2:优惠券
if (actualPrize.getActualPrizeType() == 2) {
highDiscountUserRelService.receiveDiscount(userId,actualPrize.getActualPrizeId());
}
}
}
@Override
public void addLotteryNum(Long activityId, Long userId, Integer num) {
HighActivityUserLotteryNum detail = getDetail(activityId, userId);
if (detail == null) {
detail = new HighActivityUserLotteryNum();
detail.setActivityInfoId(activityId);
detail.setUserId(userId);
detail.setLotteryNum(num);
detail.setCreateTime(new Date());
detail.setUpdateTime(new Date());
highActivityUserLotteryNumMapper.insert(detail);
} else {
detail.setLotteryNum(detail.getLotteryNum() + num);
detail.setUpdateTime(new Date());
highActivityUserLotteryNumMapper.updateByPrimaryKey(detail);
}
}
@Override
public void minusLotteryNum(Long activityId, Long userId) {
HighActivityUserLotteryNum detail = getDetail(activityId, userId);
if (detail != null) {
detail.setLotteryNum(detail.getLotteryNum() - 1);
highActivityUserLotteryNumMapper.updateByPrimaryKeySelective(detail);
}
}
@Override
public HighActivityUserLotteryNum getDetail(Long activityId, Long userId) {
HighActivityUserLotteryNumExample example = new HighActivityUserLotteryNumExample();
example.createCriteria().andUserIdEqualTo(userId).andActivityInfoIdEqualTo(activityId);
List<HighActivityUserLotteryNum> list = highActivityUserLotteryNumMapper.selectByExample(example);
if (list.size() > 0) {
return list.get(0);
}
return null;
}
@Override
public Integer getLotteryNum(Long activityId, Long userId) {
HighActivityUserLotteryNum detail = getDetail(activityId, userId);
if (detail == null) {
return 0;
}
return detail.getLotteryNum();
}
}