release: 新增实物抽奖逻辑

release-2024-08-08
huangyw 4 months ago
parent 8f674eec70
commit 61c9b1eb92

@ -52,5 +52,7 @@ public class ErrorConstants {
public static final String NOT_ARTIST = "非音乐人不能参与"; public static final String NOT_ARTIST = "非音乐人不能参与";
public static final String ALREADY_PARTICIPATED = "已参与抽奖"; public static final String ALREADY_PARTICIPATED = "已参与抽奖";
public static final String NOT_END_OF_SIGN_UP = "报名未结束,不允许抽奖"; public static final String NOT_END_OF_SIGN_UP = "报名未结束,不允许抽奖";
public static final String TICKET_CITY_IS_REQUIRED = "门票抽奖城市必填";
public static final String REAL_NUMBER_IS_REQUIRED = "实物抽奖数量必填";
} }

@ -14,6 +14,9 @@ public enum PointEnums {
TASK_POINT_TYPE_ADD(1, "增加"), TASK_POINT_TYPE_ADD(1, "增加"),
TASK_POINT_TYPE_REDUCE(2, "减少"), TASK_POINT_TYPE_REDUCE(2, "减少"),
LOTTERY_TICKET(1, "门票抽奖"),
LOTTERY_REAL(2, "实物抽奖"),
LOTTERY_ALL(1, "全部"), LOTTERY_ALL(1, "全部"),
LOTTERY_ALL_MEMBER(2, "全部会员"), LOTTERY_ALL_MEMBER(2, "全部会员"),
LOTTERY_LIFE_MEMBER(3, "永久会员"), LOTTERY_LIFE_MEMBER(3, "永久会员"),

@ -3,6 +3,7 @@ package com.luoo.user.controller;
import annotation.GlobalInterceptor; import annotation.GlobalInterceptor;
import api.PageResult; import api.PageResult;
import api.Result; import api.Result;
import com.luoo.user.dto.point.LotteryDto;
import com.luoo.user.dto.point.LotterySearchDto; import com.luoo.user.dto.point.LotterySearchDto;
import com.luoo.user.dto.point.TaskPointDto; import com.luoo.user.dto.point.TaskPointDto;
import com.luoo.user.dto.point.UserPointLogSearchDto; import com.luoo.user.dto.point.UserPointLogSearchDto;
@ -242,7 +243,9 @@ public class PointController {
@ApiImplicitParam(name = "lottery", value = "抽奖信息", required = true, dataType = "Lottery", paramType = "body") @ApiImplicitParam(name = "lottery", value = "抽奖信息", required = true, dataType = "Lottery", paramType = "body")
}) })
public Result<Void> editLottery(@RequestHeader("Authorization") String token, public Result<Void> editLottery(@RequestHeader("Authorization") String token,
@RequestBody Lottery lottery) { @RequestBody LotteryDto lotteryDto) {
Lottery lottery = new Lottery();
BeanUtils.copyProperties(lotteryDto, lottery);
lotteryService.edit(lottery, token); lotteryService.edit(lottery, token);
return Result.success(); return Result.success();
} }

@ -0,0 +1,72 @@
package com.luoo.user.dto.point;
import com.luoo.user.pojo.LotteryRegion;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import javax.persistence.Transient;
import java.io.Serializable;
import java.time.LocalDateTime;
import java.util.List;
/**
* DTO for {@link com.luoo.user.pojo.Lottery}
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class LotteryDto implements Serializable {
@ApiModelProperty(value = "主键")
private String id;
@ApiModelProperty(value = "抽奖编码")
private String code;
@ApiModelProperty(value = "标题")
private String title;
@ApiModelProperty(value = "抽奖类型 1-门票抽奖 2-实物抽奖")
private Integer type;
@ApiModelProperty(value = "奖品总数量")
private Integer num;
@ApiModelProperty(value = "可参加人员 1-全部 2-全部会员 3-永久会员 4-贡献者")
private Integer participant;
@ApiModelProperty(value = "积分")
private Integer point;
@ApiModelProperty(value = "地区编码")
private String regionCode;
@ApiModelProperty(value = "地区名称")
private String regionName;
@ApiModelProperty(value = "报名开始时间")
private LocalDateTime applyStartTime;
@ApiModelProperty(value = "报名结束时间")
private LocalDateTime applyEndTime;
@ApiModelProperty(value = "抽奖方式 1-自动抽奖 2-手动抽奖")
private Integer way;
@ApiModelProperty(value = "抽奖封面url")
private String image;
@ApiModelProperty(value = "抽奖描述")
private String description;
@ApiModelProperty(value = "抽奖状态 0-编辑中 1-报名中 2-已抽奖 3-已停止")
private Integer status;
@ApiModelProperty(value = "停止原因")
private String stopReason;
@Transient
@ApiModelProperty(value = "抽奖地区列表")
private List<LotteryRegion> lotteryRegionList;
}

@ -53,6 +53,14 @@ public class Lottery {
@ApiModelProperty(value = "标题") @ApiModelProperty(value = "标题")
private String title; private String title;
@Column(name = "type")
@ApiModelProperty(value = "抽奖类型 1-门票抽奖 2-实物抽奖")
private Integer type;
@Column(name = "num")
@ApiModelProperty(value = "奖品总数量")
private Integer num;
@Column(name = "participant") @Column(name = "participant")
@ApiModelProperty(value = "可参加人员 1-全部 2-全部会员 3-永久会员 4-贡献者") @ApiModelProperty(value = "可参加人员 1-全部 2-全部会员 3-永久会员 4-贡献者")
private Integer participant; private Integer participant;

@ -12,12 +12,16 @@ import com.luoo.user.pojo.LotteryUser;
import com.luoo.user.pojo.Region; import com.luoo.user.pojo.Region;
import com.luoo.user.pojo.UserInfo; import com.luoo.user.pojo.UserInfo;
import com.luoo.user.pojo.UserPointLog; import com.luoo.user.pojo.UserPointLog;
import constants.Constants;
import constants.ErrorConstants; import constants.ErrorConstants;
import dto.UserLoginDto; import dto.UserLoginDto;
import dto.UserMessageDto;
import enums.MessageTypeEnum;
import enums.PointEnums; import enums.PointEnums;
import enums.UserTypeEnum; import enums.UserTypeEnum;
import enums.UserVipStatusEnum; import enums.UserVipStatusEnum;
import exception.BizException; import exception.BizException;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collections; import java.util.Collections;
@ -28,6 +32,7 @@ import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery; import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Predicate; import javax.persistence.criteria.Predicate;
import javax.persistence.criteria.Root; import javax.persistence.criteria.Root;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang.StringUtils; import org.apache.commons.lang.StringUtils;
import org.springframework.amqp.rabbit.core.RabbitTemplate; import org.springframework.amqp.rabbit.core.RabbitTemplate;
@ -53,377 +58,449 @@ import util.RedisLockUtil;
@Slf4j @Slf4j
public class LotteryService { public class LotteryService {
public static final String POINTS_WILL_BE_RETURNED = "抽奖返积分"; public static final String POINTS_WILL_BE_RETURNED = "抽奖返积分";
public static final String LOTTERY_POINTS_TYPE = "积分抽奖"; public static final String LOTTERY_POINTS_TYPE = "积分抽奖";
private final LotteryDao lotteryDao; private final LotteryDao lotteryDao;
private final JwtUtil jwtUtil; private final JwtUtil jwtUtil;
private final IdWorker idWorker; private final IdWorker idWorker;
private final RedisLockUtil redisLockUtil; private final RedisLockUtil redisLockUtil;
private final RegionService regionService; private final RegionService regionService;
private final LotteryRegionDao lotteryRegionDao; private final LotteryRegionDao lotteryRegionDao;
private final UserInfoDao userInfoDao; private final UserInfoDao userInfoDao;
private final RabbitTemplate rabbitTemplate; private final RabbitTemplate rabbitTemplate;
private final LotteryUserDao lotteryUserDao; private final LotteryUserDao lotteryUserDao;
public LotteryService(LotteryDao lotteryDao, IdWorker idWorker, JwtUtil jwtUtil, private final UserMessageService userMessageService;
RedisLockUtil redisLockUtil, RegionService regionService, LotteryRegionDao lotteryRegionDao,
UserInfoDao userInfoDao, RabbitTemplate rabbitTemplate, LotteryUserDao lotteryUserDao) {
this.lotteryDao = lotteryDao;
this.idWorker = idWorker;
this.jwtUtil = jwtUtil;
this.redisLockUtil = redisLockUtil;
this.regionService = regionService;
this.lotteryRegionDao = lotteryRegionDao;
this.userInfoDao = userInfoDao;
this.rabbitTemplate = rabbitTemplate;
this.lotteryUserDao = lotteryUserDao;
}
/** public LotteryService(LotteryDao lotteryDao, IdWorker idWorker, JwtUtil jwtUtil,
* RedisLockUtil redisLockUtil, RegionService regionService, LotteryRegionDao lotteryRegionDao,
* UserInfoDao userInfoDao, RabbitTemplate rabbitTemplate, LotteryUserDao lotteryUserDao, UserMessageService userMessageService) {
* @param lottery this.lotteryDao = lotteryDao;
* @param token token this.idWorker = idWorker;
*/ this.jwtUtil = jwtUtil;
@Transactional(rollbackFor = Exception.class) this.redisLockUtil = redisLockUtil;
public void add(Lottery lottery, String token) { this.regionService = regionService;
this.lotteryRegionDao = lotteryRegionDao;
this.userInfoDao = userInfoDao;
this.rabbitTemplate = rabbitTemplate;
this.lotteryUserDao = lotteryUserDao;
this.userMessageService = userMessageService;
}
UserLoginDto userLoginDto = jwtUtil.getUserLoginDto(token); /**
*
*
* @param lottery
* @param token token
*/
@Transactional(rollbackFor = Exception.class)
public void add(Lottery lottery, String token) {
StringBuilder regionCode = new StringBuilder(); UserLoginDto userLoginDto = jwtUtil.getUserLoginDto(token);
StringBuilder regionName = new StringBuilder();
List<LotteryRegion> lotteryRegionList = lottery.getLotteryRegionList(); StringBuilder regionCode = new StringBuilder();
StringBuilder regionName = new StringBuilder();
for (LotteryRegion lotteryRegion : lotteryRegionList) { String id = String.valueOf(idWorker.nextId());
Region regionById = regionService.getRegionById(lotteryRegion.getRegionId());
regionCode.append(regionById.getCode()).append(",");
regionName.append(regionById.getName()).append(",");
}
lottery.setId(String.valueOf(idWorker.nextId())); if (Objects.equals(lottery.getType(), PointEnums.LOTTERY_TICKET.getCode())) {
lottery.setCreateUser(userLoginDto.getUserId()); // 门票抽奖,城市必填
lottery.setUpdateUser(userLoginDto.getUserId()); List<LotteryRegion> lotteryRegionList = lottery.getLotteryRegionList();
lottery.setCreateUserName(userLoginDto.getNickName());
lottery.setUpdateUserName(userLoginDto.getNickName());
lottery.setCode(redisLockUtil.lotteryGenerateSerialNumber());
lottery.setStatus(PointEnums.LOTTERY_STATUS_EDITING.getCode());
lottery.setRegionCode(regionCode.toString());
lottery.setRegionName(regionName.toString());
lotteryDao.save(lottery);
lotteryRegionList.forEach(lotteryRegion -> {
lotteryRegion.setId(String.valueOf(idWorker.nextId()));
lotteryRegion.setLotteryId(lottery.getId());
lotteryRegion.setCreateUser(userLoginDto.getUserId());
lotteryRegion.setUpdateUser(userLoginDto.getUserId());
lotteryRegionDao.save(lotteryRegion);
});
}
/**
*
*
* @param lottery
* @param token
*/
@Transactional(rollbackFor = Exception.class)
public void edit(Lottery lottery, String token) {
UserLoginDto userLoginDto = jwtUtil.getUserLoginDto(token);
StringBuilder regionCode = new StringBuilder();
StringBuilder regionName = new StringBuilder();
List<LotteryRegion> lotteryRegionList = lottery.getLotteryRegionList();
for (LotteryRegion lotteryRegion : lotteryRegionList) {
Region regionById = regionService.getRegionById(lotteryRegion.getRegionId());
regionCode.append(regionById.getCode()).append(",");
regionName.append(regionById.getName()).append(",");
}
String id = lottery.getId(); if (lotteryRegionList.isEmpty()) {
Lottery lottery1 = lotteryDao.findById(id).orElse(null); throw new BizException(ErrorConstants.TICKET_CITY_IS_REQUIRED);
if (!Objects.equals(PointEnums.LOTTERY_STATUS_EDITING.getCode(), lottery1.getStatus())) { }
// 不是编辑中,不允许修改
throw new BizException(ErrorConstants.CAN_NOT_EDIT); Integer num = 0;
for (LotteryRegion lotteryRegion : lotteryRegionList) {
Region regionById = regionService.getRegionById(lotteryRegion.getRegionId());
regionCode.append(regionById.getCode()).append(",");
regionName.append(regionById.getName()).append(",");
num += lotteryRegion.getNum();
lotteryRegion.setId(id);
lotteryRegion.setLotteryId(lottery.getId());
lotteryRegion.setCreateUser(userLoginDto.getUserId());
lotteryRegion.setUpdateUser(userLoginDto.getUserId());
lotteryRegionDao.save(lotteryRegion);
}
lottery.setRegionCode(regionCode.toString());
lottery.setRegionName(regionName.toString());
lottery.setNum(num);
} else {
// 实物抽奖,数量必填
if (lottery.getNum() == null) {
throw new BizException(ErrorConstants.REAL_NUMBER_IS_REQUIRED);
}
}
lottery.setId(id);
lottery.setCreateUser(userLoginDto.getUserId());
lottery.setUpdateUser(userLoginDto.getUserId());
lottery.setCreateUserName(userLoginDto.getNickName());
lottery.setUpdateUserName(userLoginDto.getNickName());
lottery.setCode(redisLockUtil.lotteryGenerateSerialNumber());
lottery.setStatus(PointEnums.LOTTERY_STATUS_EDITING.getCode());
lotteryDao.save(lottery);
} }
lottery.setRegionCode(regionCode.toString()); /**
lottery.setRegionName(regionName.toString()); *
lottery.setUpdateUser(userLoginDto.getUserId()); *
lottery.setUpdateUserName(userLoginDto.getNickName()); * @param lottery
* @param token
lotteryDao.save(lottery); */
@Transactional(rollbackFor = Exception.class)
lotteryRegionDao.deleteByLotteryId(id); public void edit(Lottery lottery, String token) {
lotteryRegionList.forEach(lotteryRegion -> {
lotteryRegion.setId(String.valueOf(idWorker.nextId())); UserLoginDto userLoginDto = jwtUtil.getUserLoginDto(token);
lotteryRegion.setLotteryId(id);
lotteryRegion.setCreateUser(userLoginDto.getUserId()); String id = lottery.getId();
lotteryRegion.setUpdateUser(userLoginDto.getUserId());
StringBuilder regionCode = new StringBuilder();
lotteryRegionDao.save(lotteryRegion); StringBuilder regionName = new StringBuilder();
});
if (Objects.equals(lottery.getType(), PointEnums.LOTTERY_TICKET.getCode())) {
} // 门票抽奖,城市必填
List<LotteryRegion> lotteryRegionList = lottery.getLotteryRegionList();
/**
* if (lotteryRegionList.isEmpty()) {
* throw new BizException(ErrorConstants.TICKET_CITY_IS_REQUIRED);
* @param id id }
* @param token token
*/ Integer num = 0;
@Transactional(rollbackFor = Exception.class)
public void publish(String id, String token) { lotteryRegionDao.deleteByLotteryId(id);
UserLoginDto userLoginDto = jwtUtil.getUserLoginDto(token); for (LotteryRegion lotteryRegion : lotteryRegionList) {
Region regionById = regionService.getRegionById(lotteryRegion.getRegionId());
Lottery lottery = lotteryDao.findById(id).orElse(null); regionCode.append(regionById.getCode()).append(",");
lottery.setUpdateUser(userLoginDto.getUserId()); regionName.append(regionById.getName()).append(",");
lottery.setUpdateUserName(userLoginDto.getNickName()); num += lotteryRegion.getNum();
lottery.setStatus(PointEnums.LOTTERY_STATUS_SIGN.getCode());
lotteryRegion.setId(String.valueOf(idWorker.nextId()));
lotteryDao.save(lottery); lotteryRegion.setLotteryId(id);
lotteryRegion.setCreateUser(userLoginDto.getUserId());
} lotteryRegion.setUpdateUser(userLoginDto.getUserId());
/** lotteryRegionDao.save(lotteryRegion);
* }
* lottery.setRegionCode(regionCode.toString());
* @param id id lottery.setRegionName(regionName.toString());
* @param token token lottery.setNum(num);
* @param stopReason
*/ } else {
@Transactional(rollbackFor = Exception.class) // 实物抽奖,数量必填
public void stop(String id, String token, String stopReason) { if (lottery.getNum() == null) {
UserLoginDto userLoginDto = jwtUtil.getUserLoginDto(token); throw new BizException(ErrorConstants.REAL_NUMBER_IS_REQUIRED);
}
Lottery lottery = lotteryDao.findById(id).orElse(null); }
lottery.setUpdateUser(userLoginDto.getUserId());
lottery.setUpdateUserName(userLoginDto.getNickName()); Lottery oldLottery = lotteryDao.getOne(id);
lottery.setStopReason(stopReason); if (!Objects.equals(PointEnums.LOTTERY_STATUS_EDITING.getCode(), oldLottery.getStatus())) {
lottery.setStatus(PointEnums.LOTTERY_STATUS_SIGN.getCode()); // 不是编辑中,不允许修改
throw new BizException(ErrorConstants.CAN_NOT_EDIT);
lotteryDao.save(lottery); }
// 返还用户积分 放到MQ队列 lottery.setCreateTime(oldLottery.getCreateTime());
lotteryUserDao.findByLotteryId(id).forEach(lotteryUser -> { lottery.setCreateUser(oldLottery.getCreateUser());
lottery.setCreateUserName(oldLottery.getCreateUserName());
UserPointLog userPointLog = UserPointLog.builder() lottery.setUpdateUser(userLoginDto.getUserId());
.id(String.valueOf(idWorker.nextId())) lottery.setUpdateUserName(userLoginDto.getNickName());
.type(PointEnums.TASK_POINT_TYPE_ADD.getCode())
.createUser(lotteryUser.getUserId()) lotteryDao.save(lottery);
.taskPointId(null)
.description(POINTS_WILL_BE_RETURNED)
.userId(lotteryUser.getUserId())
.score(lottery.getPoint())
.build();
rabbitTemplate.convertAndSend("pointLog", userPointLog);
});
}
/**
*
*
* @param id id
* @param token token
* @param regionId id
*/
@Transactional(rollbackFor = Exception.class)
public void participate(String id, String token, Integer regionId) {
UserLoginDto userLoginDto = jwtUtil.getUserLoginDto(token);
Lottery lottery = lotteryDao.findById(id).get();
if (!Objects.equals(PointEnums.LOTTERY_STATUS_SIGN.getCode(), lottery.getStatus())) {
// 不是报名中,不允许参与
throw new BizException(ErrorConstants.NOT_IN_THE_SIGN_UP_PERIOD);
} }
// 校验用户是否可参与 /**
UserInfo userInfo = userInfoDao.findById(userLoginDto.getUserId()).get(); *
*
Integer participant = lottery.getParticipant(); * @param id id
if (Objects.equals(participant, PointEnums.LOTTERY_ALL_MEMBER.getCode())) { * @param token token
// 会员可参与 */
if (!Objects.equals(userInfo.getVipStatus(), UserVipStatusEnum.INITIAL.getCode()) && @Transactional(rollbackFor = Exception.class)
!Objects.equals(userInfo.getVipStatus(), UserVipStatusEnum.LIFE.getCode())) { public void publish(String id, String token) {
throw new BizException(ErrorConstants.NOT_MEMBER); UserLoginDto userLoginDto = jwtUtil.getUserLoginDto(token);
}
} else if (Objects.equals(userInfo.getVipStatus(), UserVipStatusEnum.LIFE.getCode())) { Lottery lottery = lotteryDao.findById(id).orElse(null);
// 永久会员可参与 lottery.setUpdateUser(userLoginDto.getUserId());
if (!Objects.equals(userInfo.getVipStatus(), UserVipStatusEnum.LIFE.getCode())) { lottery.setUpdateUserName(userLoginDto.getNickName());
throw new BizException(ErrorConstants.NOT_PERMANENT_MEMBER);
} lottery.setStatus(PointEnums.LOTTERY_STATUS_SIGN.getCode());
} else if (Objects.equals(participant, PointEnums.LOTTERY_CONTRIBUTORS.getCode())) {
// 贡献者可参与 lotteryDao.save(lottery);
if (StringUtils.isBlank(userInfo.getBadges()) || !userInfo.getBadges().startsWith("1")) {
throw new BizException(ErrorConstants.NOT_CONTRIBUTOR);
}
} else if (Objects.equals(participant, PointEnums.LOTTERY_ARTIST.getCode())) {
// 音乐人可参与
if (!Objects.equals(String.valueOf(userInfo.getType()), UserTypeEnum.ARTIST_PERSON.getCode())
&& !Objects.equals(String.valueOf(userInfo.getType()), UserTypeEnum.ARTIST_BAND.getCode())
) {
throw new BizException(ErrorConstants.NOT_ARTIST);
}
} }
List<LotteryUser> checkUserList = lotteryUserDao.findByLotteryIdAndUserIdAndRegionId( /**
id, userLoginDto.getUserId(), regionId); *
if(!checkUserList.isEmpty()) { *
throw new BizException(ErrorConstants.ALREADY_PARTICIPATED); * @param id id
* @param token token
* @param stopReason
*/
@Transactional(rollbackFor = Exception.class)
public void stop(String id, String token, String stopReason) {
UserLoginDto userLoginDto = jwtUtil.getUserLoginDto(token);
Lottery lottery = lotteryDao.findById(id).orElse(null);
lottery.setUpdateUser(userLoginDto.getUserId());
lottery.setUpdateUserName(userLoginDto.getNickName());
lottery.setStopReason(stopReason);
lottery.setStatus(PointEnums.LOTTERY_STATUS_SIGN.getCode());
lotteryDao.save(lottery);
// 返还用户积分 放到MQ队列
lotteryUserDao.findByLotteryId(id).forEach(lotteryUser -> {
UserPointLog userPointLog = UserPointLog.builder()
.id(String.valueOf(idWorker.nextId()))
.type(PointEnums.TASK_POINT_TYPE_ADD.getCode())
.createUser(lotteryUser.getUserId())
.taskPointId(null)
.description(POINTS_WILL_BE_RETURNED)
.userId(lotteryUser.getUserId())
.score(lottery.getPoint())
.build();
rabbitTemplate.convertAndSend("pointLog", userPointLog);
});
} }
LotteryUser lotteryUser = LotteryUser.builder() /**
.id(String.valueOf(idWorker.nextId())) *
.lotteryId(id) *
.regionId(regionId) * @param id id
.userId(userLoginDto.getUserId()) * @param token token
.createUser(userLoginDto.getUserId()) * @param regionId id
.updateUser(userLoginDto.getUserId()) */
.build(); @Transactional(rollbackFor = Exception.class)
public void participate(String id, String token, Integer regionId) {
lotteryUserDao.save(lotteryUser);
UserLoginDto userLoginDto = jwtUtil.getUserLoginDto(token);
UserPointLog userPointLog = UserPointLog.builder() Lottery lottery = lotteryDao.findById(id).get();
.id(String.valueOf(idWorker.nextId())) if (!Objects.equals(PointEnums.LOTTERY_STATUS_SIGN.getCode(), lottery.getStatus())) {
.type(PointEnums.TASK_POINT_TYPE_REDUCE.getCode()) // 不是报名中,不允许参与
.createUser(lotteryUser.getUserId()) throw new BizException(ErrorConstants.NOT_IN_THE_SIGN_UP_PERIOD);
.taskPointId(null) }
.description(LOTTERY_POINTS_TYPE)
.userId(lotteryUser.getUserId()) // 校验用户是否可参与
.score(lottery.getPoint()) UserInfo userInfo = userInfoDao.findById(userLoginDto.getUserId()).get();
.build();
rabbitTemplate.convertAndSend("pointLog", userPointLog); Integer participant = lottery.getParticipant();
if (Objects.equals(participant, PointEnums.LOTTERY_ALL_MEMBER.getCode())) {
} // 会员可参与
if (!Objects.equals(userInfo.getVipStatus(), UserVipStatusEnum.INITIAL.getCode()) &&
/** !Objects.equals(userInfo.getVipStatus(), UserVipStatusEnum.LIFE.getCode())) {
* throw new BizException(ErrorConstants.NOT_MEMBER);
* }
* @param id id } else if (Objects.equals(userInfo.getVipStatus(), UserVipStatusEnum.LIFE.getCode())) {
*/ // 永久会员可参与
@Transactional(rollbackFor = Exception.class) if (!Objects.equals(userInfo.getVipStatus(), UserVipStatusEnum.LIFE.getCode())) {
public void auto(String id, String token) { throw new BizException(ErrorConstants.NOT_PERMANENT_MEMBER);
}
Lottery lottery = lotteryDao.findById(id).get(); } else if (Objects.equals(participant, PointEnums.LOTTERY_CONTRIBUTORS.getCode())) {
// 贡献者可参与
LocalDateTime applyEndTime = lottery.getApplyEndTime(); if (StringUtils.isBlank(userInfo.getBadges()) || !userInfo.getBadges().startsWith("1")) {
// 比较当前时间与applyEndTime throw new BizException(ErrorConstants.NOT_CONTRIBUTOR);
if (LocalDateTime.now().isBefore(applyEndTime)) { }
throw new BizException(ErrorConstants.NOT_END_OF_SIGN_UP); } else if (Objects.equals(participant, PointEnums.LOTTERY_ARTIST.getCode())) {
// 音乐人可参与
if (!Objects.equals(String.valueOf(userInfo.getType()), UserTypeEnum.ARTIST_PERSON.getCode())
&& !Objects.equals(String.valueOf(userInfo.getType()), UserTypeEnum.ARTIST_BAND.getCode())
) {
throw new BizException(ErrorConstants.NOT_ARTIST);
}
}
List<LotteryUser> checkUserList = lotteryUserDao.findByLotteryIdAndUserIdAndRegionId(
id, userLoginDto.getUserId(), regionId);
if (!checkUserList.isEmpty()) {
throw new BizException(ErrorConstants.ALREADY_PARTICIPATED);
}
LotteryUser lotteryUser = LotteryUser.builder()
.id(String.valueOf(idWorker.nextId()))
.lotteryId(id)
.regionId(regionId)
.userId(userLoginDto.getUserId())
.createUser(userLoginDto.getUserId())
.updateUser(userLoginDto.getUserId())
.build();
lotteryUserDao.save(lotteryUser);
UserPointLog userPointLog = UserPointLog.builder()
.id(String.valueOf(idWorker.nextId()))
.type(PointEnums.TASK_POINT_TYPE_REDUCE.getCode())
.createUser(lotteryUser.getUserId())
.taskPointId(null)
.description(LOTTERY_POINTS_TYPE)
.userId(lotteryUser.getUserId())
.score(lottery.getPoint())
.build();
rabbitTemplate.convertAndSend("pointLog", userPointLog);
} }
if (Objects.equals(lottery.getStatus(), PointEnums.LOTTERY_STATUS_SIGN.getCode())) { /**
*
*
* @param id id
*/
@Transactional(rollbackFor = Exception.class)
public void auto(String id, String token) {
Lottery lottery = lotteryDao.findById(id).get();
LocalDateTime applyEndTime = lottery.getApplyEndTime();
// 比较当前时间与applyEndTime
if (LocalDateTime.now().isBefore(applyEndTime)) {
throw new BizException(ErrorConstants.NOT_END_OF_SIGN_UP);
}
if (Objects.equals(lottery.getStatus(), PointEnums.LOTTERY_STATUS_SIGN.getCode())) {
if (Objects.equals(lottery.getType(), PointEnums.LOTTERY_TICKET.getCode())) {
// 门票抽奖业务
List<LotteryRegion> lotteryRegionList = lotteryRegionDao.findByLotteryId(id);
lotteryRegionList.forEach(lotteryRegion -> {
Integer num = lotteryRegion.getNum();
if (num > 0) {
List<LotteryUser> lotteryUserList = lotteryUserDao.findByLotteryIdAndRegionId(id,
lotteryRegion.getRegionId());
List<LotteryRegion> lotteryRegionList = lotteryRegionDao.findByLotteryId(id); lotteryFunc(token, lotteryUserList, num);
lotteryRegionList.forEach(lotteryRegion -> { }
Integer num = lotteryRegion.getNum(); });
if (num > 0) {
List<LotteryUser> lotteryUserList = lotteryUserDao.findByLotteryIdAndRegionId(id,
lotteryRegion.getRegionId());
List<LotteryUser> winnerList = new ArrayList<>(); } else if (Objects.equals(lottery.getType(), PointEnums.LOTTERY_REAL.getCode())) {
if (lotteryUserList.size() > num) { // 实物抽奖业务
List<LotteryUser> byLotteryId = lotteryUserDao.findByLotteryId(id);
lotteryFunc(token, byLotteryId, lottery.getNum());
}
// 抽奖状态为报名中,自动抽奖
lottery.setStatus(PointEnums.LOTTERY_STATUS_LOTTERY.getCode());
lotteryDao.save(lottery);
}
}
/**
*
*
* @param token
* @param lotteryUserList
* @param num
*/
private void lotteryFunc(String token, List<LotteryUser> lotteryUserList, Integer num) {
List<LotteryUser> winnerList = new ArrayList<>();
if (lotteryUserList.size() > num) {
// 抽奖人数大于设定人数 // 抽奖人数大于设定人数
// 随机设定人数的数量中奖 // 随机设定人数的数量中奖
winnerList = drawWinners(lotteryUserList, lotteryRegion.getNum()); winnerList = drawWinners(lotteryUserList, num);
} else { } else {
// 抽奖人数小于设定人数 // 抽奖人数小于设定人数
// 全部中奖 // 全部中奖
winnerList = lotteryUserList; winnerList = lotteryUserList;
} }
winnerList.forEach(lotteryUser -> { winnerList.forEach(lotteryUser -> {
lotteryUser.setResult(PointEnums.LOTTERY_RESULT_WIN.getCode()); lotteryUser.setResult(PointEnums.LOTTERY_RESULT_WIN.getCode());
if(StringUtils.isNotBlank(token)) { if (StringUtils.isNotBlank(token)) {
UserLoginDto userLoginDto = jwtUtil.getUserLoginDto(token); UserLoginDto userLoginDto = jwtUtil.getUserLoginDto(token);
lotteryUser.setUpdateUser(userLoginDto.getUserId()); lotteryUser.setUpdateUser(userLoginDto.getUserId());
} }
lotteryUserDao.save(lotteryUser); lotteryUserDao.save(lotteryUser);
});
} // 发送恭喜中奖站内信
}); UserMessageDto userMessageDto = new UserMessageDto();
// 抽奖状态为报名中,自动抽奖 userMessageDto.setType(MessageTypeEnum.PRIVATE_MESSAGE.getType());
lottery.setStatus(PointEnums.LOTTERY_STATUS_LOTTERY.getCode()); userMessageDto.setSendUserId(StringUtils.isNotBlank(token) ? jwtUtil.getUserLoginDto(token).getUserId() : null);
lotteryDao.save(lottery); userMessageDto.setTitle("恭喜中奖!");
userMessageDto.setContent("恭喜中奖请加微信XXXXXX");
userMessageDto.setUserId(lotteryUser.getUserId());
userMessageDto.setSendUserAvatar(Constants.RESOURCE_PREFIX + (StringUtils.isNotBlank(token) ? jwtUtil.getUserLoginDto(token).getAvatar() : null));
userMessageDto.setSendUserNickName(StringUtils.isNotBlank(token) ? jwtUtil.getUserLoginDto(token).getNickName() : null);
userMessageService.sendUserMessage(userMessageDto);
});
}
/**
*
*
* @param list
* @param winnersCount
* @return
*/
private List<LotteryUser> drawWinners(List<LotteryUser> list, int winnersCount) {
List<LotteryUser> winners = new ArrayList<>();
Collections.shuffle(winners, new Random());
return winners.subList(0, Math.min(winnersCount, winners.size()));
}
/**
*
*
* @param page
* @param size
* @param lotterySearchDto
* @return
*/
public PageResult<Lottery> lotteryPageResult(Integer page, Integer size,
LotterySearchDto lotterySearchDto) {
Sort sort = new Sort(Direction.DESC, "createTime");
PageRequest pageRequest = PageRequest.of(page - 1, size, sort);
Specification<Lottery> specification = getSpecification(lotterySearchDto);
Page<Lottery> lotteryPage = lotteryDao.findAll(specification, pageRequest);
long totalElements = lotteryPage.getTotalElements();
return new PageResult<>(totalElements, lotteryPage.getContent());
}
private Specification<Lottery> getSpecification(LotterySearchDto lotterySearchDto) {
return (Root<Lottery> root, CriteriaQuery<?> query, CriteriaBuilder criteriaBuilder) -> {
List<Predicate> predicateList = new ArrayList<>();
if (StringUtils.isNotBlank(lotterySearchDto.getSearchStr())) {
predicateList.add(
criteriaBuilder.or(
criteriaBuilder.like(root.get("title"),
"%" + lotterySearchDto.getSearchStr() + "%"),
criteriaBuilder.like(root.get("code"), "%" + lotterySearchDto.getSearchStr() + "%")
)
);
}
if (lotterySearchDto.getStatus() != null) {
predicateList.add(criteriaBuilder.equal(root.get("status"), lotterySearchDto.getStatus()));
}
if (StringUtils.isNotBlank(lotterySearchDto.getCreateUser())) {
predicateList.add(
criteriaBuilder.equal(root.get("createUser"), lotterySearchDto.getCreateUser()));
}
return criteriaBuilder.and(predicateList.toArray(new Predicate[predicateList.size()]));
};
} }
}
/**
*
*
* @param participants
* @param winnersCount
* @return
*/
private List<LotteryUser> drawWinners(List<LotteryUser> participants, int winnersCount) {
List<LotteryUser> winners = new ArrayList<>(participants);
Collections.shuffle(winners, new Random());
return winners.subList(0, Math.min(winnersCount, winners.size()));
}
/**
*
*
* @param page
* @param size
* @param lotterySearchDto
* @return
*/
public PageResult<Lottery> lotteryPageResult(Integer page, Integer size,
LotterySearchDto lotterySearchDto) {
Sort sort = new Sort(Direction.DESC, "createTime");
PageRequest pageRequest = PageRequest.of(page - 1, size, sort);
Specification<Lottery> specification = getSpecification(lotterySearchDto);
Page<Lottery> lotteryPage = lotteryDao.findAll(specification, pageRequest);
long totalElements = lotteryPage.getTotalElements();
return new PageResult<>(totalElements, lotteryPage.getContent());
}
private Specification<Lottery> getSpecification(LotterySearchDto lotterySearchDto) {
return (Root<Lottery> root, CriteriaQuery<?> query, CriteriaBuilder criteriaBuilder) -> {
List<Predicate> predicateList = new ArrayList<>();
if (StringUtils.isNotBlank(lotterySearchDto.getSearchStr())) {
predicateList.add(
criteriaBuilder.or(
criteriaBuilder.like(root.get("title"),
"%" + lotterySearchDto.getSearchStr() + "%"),
criteriaBuilder.like(root.get("code"), "%" + lotterySearchDto.getSearchStr() + "%")
)
);
}
if (lotterySearchDto.getStatus() != null) {
predicateList.add(criteriaBuilder.equal(root.get("status"), lotterySearchDto.getStatus()));
}
if (StringUtils.isNotBlank(lotterySearchDto.getCreateUser())) {
predicateList.add(
criteriaBuilder.equal(root.get("createUser"), lotterySearchDto.getCreateUser()));
}
return criteriaBuilder.and(predicateList.toArray(new Predicate[predicateList.size()]));
};
}
} }

@ -3,6 +3,8 @@ create table tb_lottery
id varchar(20) not null comment 'id' id varchar(20) not null comment 'id'
primary key, primary key,
code varchar(50) null comment '抽奖码', code varchar(50) null comment '抽奖码',
type tinyint null comment '抽奖类型 1-门票抽奖 2-实物抽奖',
num int null comment '奖品总数量',
title varchar(255) null comment '抽奖标题', title varchar(255) null comment '抽奖标题',
participant int null comment '可参加人员 1-全部 2-全部会员 3-永久会员 4-贡献者 5-音乐人', participant int null comment '可参加人员 1-全部 2-全部会员 3-永久会员 4-贡献者 5-音乐人',
point int null comment '消耗积分', point int null comment '消耗积分',

Loading…
Cancel
Save