Commit c56596c7 authored by 邓吉芬's avatar 邓吉芬

1. 修改活动门店可配置化

2. 单个用户限中奖品
parent 25cbfdc4
......@@ -51,9 +51,15 @@ public class ActivityConfig implements Serializable {
@ApiModelProperty(value = "抽奖次数有效时间 1:当天有效 2:两天内有效以此类推")
private int validTime;
@ApiModelProperty(value = "0 不限制门店 1限制门店")
private Integer activityStoreStatus;
@ApiModelProperty(value = "活动是否有效 0无效 1有效")
private Integer validStatus;
@ApiModelProperty(value = "单个用户限制奖品Id,多个用逗号隔开")
private Long prizeId;
@ApiModelProperty(value = "创建时间")
private LocalDateTime createTime;
......
package com.miya.draw.enums;
import lombok.Getter;
/**
* @author :djf
* @date :2022-11-08
* @description:活动限制门店状态
*/
@Getter
public enum ActivityStoreStatusEnum {
NO_CONFINE(0,"不限制"),
CONFINE(1,"限制");
private int code;
private String name;
ActivityStoreStatusEnum(int code, String name) {
this.code = code;
this.name = name;
}
}
......@@ -85,7 +85,7 @@ public class DrawManagerImpl implements IDrawManager {
LocalDateTime end = LocalDateTimeUtil.endOfDay(nowTime);
Integer maxDrawCountLimit = activityConfig.getDrawMaxCount();
Integer alreadyDrawCount = accountPrizeService.gainAlreadyDrawCount(request.getPhone(), activityConfig.getActivityId(), start, end);
List<String> storeIdList = activityStoreService.listAllActivityStoreId();
List<String> storeIdList = activityStoreService.listAllActivityStoreId(activityConfig.getActivityId());
List<String> goodCodeList = activityGoodsService.listAllActivityGoods(activityConfig.getActivityId());
List<SyncTrade> buyGoodList = syncTradeService.listCanDrawGoods(request.getPhone(), start, end, storeIdList, goodCodeList);
BigDecimal buyTotal = gainBuyTotal(buyGoodList);
......@@ -188,8 +188,14 @@ public class DrawManagerImpl implements IDrawManager {
LocalDateTime start = nowTime.minusDays(activityConfig.getValidTime()-1);
start = LocalDateTimeUtil.beginOfDay(start);
LocalDateTime end = LocalDateTimeUtil.endOfDay(nowTime);
List<SyncTrade> buyGoodList = syncTradeService.listCanDrawGoods(phone, start, end, activityStoreService.listAllActivityStoreId(), activityGoodsService.listAllActivityGoods(activityConfig.getActivityId()));
int drawCountTotal =0;
List<SyncTrade> buyGoodList;
if(activityConfig.getActivityStoreStatus() == ActivityStoreStatusEnum.NO_CONFINE.getCode() ){
buyGoodList = syncTradeService.listCanDrawGoods(phone, start, end, null, activityGoodsService.listAllActivityGoods(activityConfig.getActivityId()));
}else{
buyGoodList = syncTradeService.listCanDrawGoods(phone, start, end, activityStoreService.listAllActivityStoreId(activityConfig.getActivityId()), activityGoodsService.listAllActivityGoods(activityConfig.getActivityId()));
}
int drawCountTotal =0;
//判断抽奖方式
//满额抽奖
if(activityConfig.getRaffle()== RaffleEnum.AMOUNTUNIT.getCode()){
......@@ -215,10 +221,7 @@ public class DrawManagerImpl implements IDrawManager {
AccountPrize accountPrize;
if (drawCountTotal - alreadyDrawCount > 0) {
// 获得奖品
List<Prize> prizeList = prizeService.listAllPrizes(activityConfig.getActivityId());
if (CollectionUtils.isEmpty(prizeList)) {
throw new BusinessException(ErrorEnum.DRAW_CHECK_EXP, "活动已结束!");
}
List<Prize> prizeList = gainPrizeInfo(phone,activityConfig);
// 抽奖
prize = selectCoupon(prizeList);
// 乐观锁效验抽到的奖品它合不合规
......@@ -269,10 +272,32 @@ public class DrawManagerImpl implements IDrawManager {
start = LocalDateTimeUtil.beginOfDay(start);
LocalDateTime end = LocalDateTimeUtil.endOfDay(nowTime);
}
/**
* 用户限中奖品后重新获取奖品List
* 1. 获取限制的奖品Id
* 2. 查询当前号码是否满足中奖限制
* 3. 如果满足中奖限制,将该奖品剔除
* @param
*/
public List<Prize> gainPrizeInfo(String phone,ActivityConfig activityConfig){
List<Prize> prizeList = prizeService.listAllPrizes(activityConfig.getActivityId());
if (CollectionUtils.isEmpty(prizeList)) {
throw new BusinessException(ErrorEnum.DRAW_CHECK_EXP, "活动已结束!");
}
if(activityConfig.getPrizeId() != null){
int count = accountPrizeService.gainAlreadyDrawCountByPrize(phone,activityConfig.getActivityId(),activityConfig.getPrizeId());
if(count>=1){
prizeList= prizeList.stream().filter(p->!activityConfig.getPrizeId().equals(p.getId()) ).collect(Collectors.toList());
}
System.out.println(Arrays.toString(prizeList.toArray()));
}
return prizeList;
}
@Override
public List<DrawModel> listAllWinningInfo(Integer size) {
ActivityConfig activityConfig = activityConfigService.getConfig();
......@@ -323,6 +348,7 @@ public class DrawManagerImpl implements IDrawManager {
/**
*
* 加锁可以
*
* @param phone
......
......@@ -26,6 +26,15 @@ public interface IAccountPrizeService extends IService<AccountPrize> {
*/
Integer gainAlreadyDrawCount(String phone,Long activityId, LocalDateTime start, LocalDateTime end);
/**
* 获取用户手机号抽中指定奖品的次数
* @param phone
* @param activityId
* @param prizeId
* @return
*/
Integer gainAlreadyDrawCountByPrize(String phone,Long activityId,Long prizeId);
/**
* 获得我的奖品列表
*
......
......@@ -19,5 +19,5 @@ public interface IActivityStoreService extends IService<ActivityStore> {
* 获得参加活动的所有门店id
* @return
*/
List<String> listAllActivityStoreId();
List<String> listAllActivityStoreId(Long activityId);
}
......@@ -3,8 +3,10 @@ package com.miya.draw.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.miya.draw.config.constant.ConStants;
import com.miya.draw.config.exception.BusinessException;
import com.miya.draw.entity.AccountPrize;
import com.miya.draw.entity.ActivityGoods;
import com.miya.draw.entity.Prize;
import com.miya.draw.enums.ErrorEnum;
import com.miya.draw.enums.PrizeTypeEnum;
......@@ -13,12 +15,16 @@ import com.miya.draw.mapper.PrizeMapper;
import com.miya.draw.service.IAccountPrizeService;
import org.apache.commons.collections4.CollectionUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.time.Duration;
import java.time.LocalDateTime;
import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;
/**
......@@ -39,6 +45,8 @@ public class AccountPrizeServiceImpl extends ServiceImpl<AccountPrizeMapper, Acc
private PrizeMapper prizeMapper;
@Override
public Integer gainAlreadyDrawCount(String phone,Long activityId, LocalDateTime start, LocalDateTime end) {
LambdaQueryWrapper<AccountPrize> wrapper = new LambdaQueryWrapper<>();
......@@ -76,4 +84,22 @@ public class AccountPrizeServiceImpl extends ServiceImpl<AccountPrizeMapper, Acc
return accountPrizeMapper.selectCount(wrapper);
}
@Override
public Integer gainAlreadyDrawCountByPrize(String phone, Long activityId, Long prizeId) {
LambdaQueryWrapper<AccountPrize> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(AccountPrize::getActivityId,activityId);
wrapper.eq(AccountPrize::getPrizeId, prizeId);
wrapper.eq(AccountPrize::getAccountPhone,phone);
return accountPrizeMapper.selectCount(wrapper);
}
/**
* 获得获得商品的key
*
* @return
*/
private String buildKey(String phone, Long activityId, Long prizeId) {
//shizu:draw:activity:good
return ConStants.SHIZU_DRAW_PREFIX + ConStants.SHIZU_ACTIVITY_PRIZE+":"+activityId+":"+prizeId+":"+phone;
}
}
......@@ -40,7 +40,7 @@ public class ActivityStoreServiceImpl extends ServiceImpl<ActivityStoreMapper, A
private RedisTemplate<String, Object> redisTemplate;
@Override
public List<String> listAllActivityStoreId() {
public List<String> listAllActivityStoreId(Long activityId) {
List<String> storeIds = new ArrayList<>();
try {
Object object = redisTemplate.opsForValue().get(buildKey());
......@@ -52,6 +52,7 @@ public class ActivityStoreServiceImpl extends ServiceImpl<ActivityStoreMapper, A
}
LambdaQueryWrapper<ActivityStore> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(ActivityStore::getValidState, YesOrNoEnum.YES.getCode());
wrapper.eq(ActivityStore::getActivityId,activityId);
List<ActivityStore> storeList = activityStoreMapper.selectList(wrapper);
if (CollectionUtils.isNotEmpty(storeList)) {
storeIds = storeList.stream().map(ActivityStore::getStoreId).collect(Collectors.toList());
......
......@@ -13,6 +13,7 @@ import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;
/**
......@@ -34,13 +35,13 @@ public class SyncTradeServiceImpl extends ServiceImpl<SyncTradeMapper, SyncTrade
@Override
public List<SyncTrade> listCanDrawGoods(String phone, LocalDateTime start, LocalDateTime end, List<String> storeIdList, List<String> goodCodeList) {
if (CollectionUtils.isEmpty(storeIdList) || CollectionUtils.isEmpty(goodCodeList)) {
if (CollectionUtils.isEmpty(goodCodeList)) {
return Lists.newArrayList();
}
LambdaQueryWrapper<SyncTrade> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(SyncTrade::getPhone, phone)
.between(SyncTrade::getTranTime, start, end)
.in(SyncTrade::getStoreId, storeIdList)
.in(CollectionUtils.isNotEmpty(storeIdList),SyncTrade::getStoreId, storeIdList)
.in(SyncTrade::getCode, goodCodeList);
return syncTradeMapper.selectList(wrapper);
}
......
......@@ -8,3 +8,4 @@ draw:
maxmoney: 200 #满额抽奖时理论上最多花费金额 元
maxamount: 0 #满量抽奖时理论上最多买多少件
validTime: 1 #抽奖次数有效时间 1:当天有效 2:两天内有效以此类推
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment