Commit 5f4d77c5 authored by 邓吉芬's avatar 邓吉芬

优化

parent d604c67c
......@@ -56,5 +56,11 @@ public interface BusinessConfig {
*/
Long getDrawMaxMoney();
/**
* 抽奖有效时间
* @return
*/
int getValidTime();
}
......@@ -37,5 +37,8 @@ public class BusinessConfigImpl implements BusinessConfig {
@Value("${draw.maxmoney}")
public Long drawMaxMoney;
@Value("${draw.validTime}")
private int validTime;
}
package com.miya.draw.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.springframework.beans.factory.annotation.Value;
import java.io.Serializable;
import java.time.LocalDateTime;
/**
* @author :djf
* @date :2022-10-24
* @description:活动业务参数配置
*/
@Data
@EqualsAndHashCode(callSuper = false)
@ApiModel(value="activity_config对象", description="")
@TableName("activity_config")
public class ActivityConfig implements Serializable {
private static final long serialVersionUID = 1L;
@TableId(value = "id", type = IdType.AUTO)
private Long id;
@ApiModelProperty(value = "活动Id")
private Long activityId;
@ApiModelProperty(value = "抽奖方式 1满额抽奖 2足量抽奖")
private Integer raffle;
@ApiModelProperty(value = "抽奖最大次数")
private Integer drawMaxCount;
@ApiModelProperty(value = "足量抽奖时每多少件加1次次数")
private Integer amountUnit;
@ApiModelProperty(value = "足量抽奖时理论上最多买多少件")
private Integer maxAmount;
@ApiModelProperty(value = "满额抽奖时每多少元加1次次数")
public String countUnit;
@ApiModelProperty(value = "满额抽奖时理论上最多花费金额 元")
public Long maxMoney;
@ApiModelProperty(value = "抽奖次数有效时间 1:当天有效 2:两天内有效以此类推")
private int validTime;
@ApiModelProperty(value = "活动是否有效 0无效 1有效")
private Integer validStatus;
@ApiModelProperty(value = "创建时间")
private LocalDateTime createTime;
@ApiModelProperty(value = "更新时间")
private LocalDateTime updateTime;
}
......@@ -3,17 +3,14 @@ package com.miya.draw.manager;
import cn.hutool.core.bean.copier.BeanCopier;
import cn.hutool.core.bean.copier.CopyOptions;
import cn.hutool.core.date.LocalDateTimeUtil;
import com.miya.draw.config.business.BusinessConfigImpl;
import com.miya.draw.config.constant.ConStants;
import com.miya.draw.config.exception.BusinessException;
import com.miya.draw.entity.Account;
import com.miya.draw.entity.AccountPrize;
import com.miya.draw.entity.Prize;
import com.miya.draw.entity.SyncTrade;
import com.miya.draw.entity.*;
import com.miya.draw.enums.*;
import com.miya.draw.model.DrawModel;
import com.miya.draw.request.DrawUserInfoGainRequest;
import com.miya.draw.service.*;
import com.miya.draw.service.impl.ActivityConfigServiceImpl;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
......@@ -42,8 +39,6 @@ public class DrawManagerImpl implements IDrawManager {
@Autowired
private IAccountService accountService;
@Autowired
private BusinessConfigImpl businessConfigImpl;
@Autowired
private IAccountPrizeService accountPrizeService;
......@@ -66,6 +61,9 @@ public class DrawManagerImpl implements IDrawManager {
@Autowired
private IOtherManager otherManager;
@Autowired
private IActivityConfigService activityConfigService;
@Override
public DrawModel gainActivityUserInfo(DrawUserInfoGainRequest request) {
try {
......@@ -77,35 +75,40 @@ public class DrawManagerImpl implements IDrawManager {
} catch (Exception e) {
log.error("保存用户信息出错:{}", e.getMessage());
}
ActivityConfig activityConfig = activityConfigService.getConfig();
if(activityConfig == null){
throw new BusinessException(ErrorEnum.SYSTEM_EXP, "未获取活动有效配置");
}
LocalDateTime nowTime = LocalDateTime.now();
LocalDateTime start = nowTime.minusDays(3);
LocalDateTime start = nowTime.minusDays(activityConfig.getValidTime()-1);
start = LocalDateTimeUtil.beginOfDay(start);
LocalDateTime end = LocalDateTimeUtil.endOfDay(nowTime);
Integer maxDrawCountLimit = businessConfigImpl.getDrawMaxCount();
Integer alreadyDrawCount = accountPrizeService.gainAlreadyDrawCount(request.getPhone(), businessConfigImpl.getActivityId(), start, end);
Integer maxDrawCountLimit = activityConfig.getDrawMaxCount();
Integer alreadyDrawCount = accountPrizeService.gainAlreadyDrawCount(request.getPhone(), activityConfig.getActivityId(), start, end);
List<String> storeIdList = activityStoreService.listAllActivityStoreId();
List<String> goodCodeList = activityGoodsService.listAllActivityGoods();
List<String> goodCodeList = activityGoodsService.listAllActivityGoods(activityConfig.getActivityId());
List<SyncTrade> buyGoodList = syncTradeService.listCanDrawGoods(request.getPhone(), start, end, storeIdList, goodCodeList);
BigDecimal buyTotal = gainBuyTotal(buyGoodList);
Long purchasedAmount = buyTotal.multiply(BigDecimal.valueOf(100)).longValue();
Integer drawCountTotal =0;
if(businessConfigImpl.getRaffle()== RaffleEnum.AMOUNTUNIT.getCode()){
if(activityConfig.getRaffle()== RaffleEnum.AMOUNTUNIT.getCode()){
buyTotal = getAmountTotal(buyGoodList);
drawCountTotal = buyTotal.divide(new BigDecimal(businessConfigImpl.getAmountunit()), RoundingMode.DOWN).intValue();
drawCountTotal = buyTotal.divide(new BigDecimal(activityConfig.getAmountUnit()), RoundingMode.DOWN).intValue();
//足量抽奖
}else{
drawCountTotal = buyTotal.divide(new BigDecimal(businessConfigImpl.getDrawCountUnit()), RoundingMode.DOWN).intValue();
drawCountTotal = buyTotal.divide(new BigDecimal(activityConfig.getCountUnit()), RoundingMode.DOWN).intValue();
}
drawCountTotal = Math.min(businessConfigImpl.getDrawMaxCount(), drawCountTotal);
drawCountTotal = Math.min(activityConfig.getDrawMaxCount(), drawCountTotal);
drawCountTotal = drawCountTotal - alreadyDrawCount;
Integer joinActivityPeopleNum = accountPrizeService.countJoinActivityPeople(businessConfigImpl.getActivityId());
Integer joinActivityPeopleNum = accountPrizeService.countJoinActivityPeople(activityConfig.getActivityId());
return DrawModel.builder()
.alreadyDrawCount(alreadyDrawCount)
.drawCountTotal(drawCountTotal>=0?drawCountTotal:0)
.maxDrawCountLimit(maxDrawCountLimit)
.numOfDrawCount(Math.max(0, maxDrawCountLimit - alreadyDrawCount))
.purchasedAmount(purchasedAmount)
.taxAmountCache(Math.max(0L, BigDecimal.valueOf(businessConfigImpl.getDrawMaxMoney()).subtract(buyTotal).multiply(BigDecimal.valueOf(100)).longValue()))
.taxAmountCache(Math.max(0L, BigDecimal.valueOf(activityConfig.getMaxMoney()).subtract(buyTotal).multiply(BigDecimal.valueOf(100)).longValue()))
.numOfJoinActivityPeople(joinActivityPeopleNum)
.build();
}
......@@ -141,7 +144,11 @@ public class DrawManagerImpl implements IDrawManager {
@Override
public List<DrawModel> listMinePrizeList(String phone) {
List<AccountPrize> prizeList = accountPrizeService.listMinePrize(phone, businessConfigImpl.getActivityId());
ActivityConfig activityConfig = activityConfigService.getConfig();
if(activityConfig == null){
throw new BusinessException(ErrorEnum.SYSTEM_EXP, "未获取活动有效配置");
}
List<AccountPrize> prizeList = accountPrizeService.listMinePrize(phone, activityConfig.getActivityId());
return getDrawModels(prizeList);
}
......@@ -174,32 +181,35 @@ public class DrawManagerImpl implements IDrawManager {
RLock lock = redissonClient.getLock(buildKey(phone));
try {
lock.tryLock(5, 10, TimeUnit.SECONDS);
//获取配置
ActivityConfig activityConfig = activityConfigService.getConfig();
// 1 验证是否可以抽奖
LocalDateTime nowTime = LocalDateTime.now();
LocalDateTime start = nowTime.minusDays(3);
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());
List<SyncTrade> buyGoodList = syncTradeService.listCanDrawGoods(phone, start, end, activityStoreService.listAllActivityStoreId(), activityGoodsService.listAllActivityGoods(activityConfig.getActivityId()));
int drawCountTotal =0;
//判断抽奖方式
//满额抽奖
if(businessConfigImpl.getRaffle()== RaffleEnum.AMOUNTUNIT.getCode()){
if(activityConfig.getRaffle()== RaffleEnum.AMOUNTUNIT.getCode()){
BigDecimal buyTotal = getAmountTotal(buyGoodList);
drawCountTotal = buyTotal.divide(new BigDecimal(businessConfigImpl.getAmountunit()), RoundingMode.DOWN).intValue();
drawCountTotal = Math.min(businessConfigImpl.getDrawMaxCount(), drawCountTotal);
drawCountTotal = buyTotal.divide(new BigDecimal(activityConfig.getAmountUnit()), RoundingMode.DOWN).intValue();
drawCountTotal = Math.min(activityConfig.getDrawMaxCount(), drawCountTotal);
if (drawCountTotal <= 0) {
throw new BusinessException(ErrorEnum.DRAW_CHECK_EXP, "抱歉,你的购物金额不足,已无抽奖次数");
}
//足量抽奖
}else{
BigDecimal buyTotal = gainBuyTotal(buyGoodList);
drawCountTotal = buyTotal.divide(new BigDecimal(businessConfigImpl.getDrawCountUnit()), RoundingMode.DOWN).intValue();
drawCountTotal = Math.min(businessConfigImpl.getDrawMaxCount(), drawCountTotal);
drawCountTotal = buyTotal.divide(new BigDecimal(activityConfig.getCountUnit()), RoundingMode.DOWN).intValue();
drawCountTotal = Math.min(activityConfig.getDrawMaxCount(), drawCountTotal);
if (drawCountTotal <= 0) {
throw new BusinessException(ErrorEnum.DRAW_CHECK_EXP, "抱歉,您购买的活动商品不足,已无抽奖次数");
}
}
Integer alreadyDrawCount = accountPrizeService.gainAlreadyDrawCount(phone, businessConfigImpl.getActivityId(), start, end);
Integer alreadyDrawCount = accountPrizeService.gainAlreadyDrawCount(phone, activityConfig.getActivityId(), start, end);
// 可抽奖次数> 已抽奖次数
Prize prize;
AccountPrize accountPrize;
......@@ -221,7 +231,7 @@ public class DrawManagerImpl implements IDrawManager {
}
// 记录抽奖信息
accountPrize = new AccountPrize();
accountPrize.setActivityId(businessConfigImpl.getActivityId());
accountPrize.setActivityId(activityConfig.getActivityId());
accountPrize.setPrizeId(prize.getId());
accountPrize.setAccountName(phone);
accountPrize.setAccountPhone(phone);
......@@ -233,7 +243,7 @@ public class DrawManagerImpl implements IDrawManager {
otherManager.sendCoupon(prize.getCouponId(), phone, accountPrize.getId());
}
} else {
if (alreadyDrawCount >= businessConfigImpl.getDrawMaxCount()) {
if (alreadyDrawCount >= activityConfig.getDrawMaxCount()) {
throw new BusinessException(ErrorEnum.DRAW_CHECK_EXP, "抱歉,你的今日可抽奖次数已用完,请明日再来哦");
} else {
throw new BusinessException(ErrorEnum.DRAW_CHECK_EXP, "抱歉,你的购物金额或购买活动商品不足,已无抽奖次数");
......@@ -253,9 +263,23 @@ public class DrawManagerImpl implements IDrawManager {
}
}
public static void main(String[] args) {
LocalDateTime nowTime = LocalDateTime.now();
LocalDateTime start = nowTime.minusDays(1-1);
start = LocalDateTimeUtil.beginOfDay(start);
LocalDateTime end = LocalDateTimeUtil.endOfDay(nowTime);
}
@Override
public List<DrawModel> listAllWinningInfo(Integer size) {
List<AccountPrize> prizeList = accountPrizeService.listAllWinningInfo(size, businessConfigImpl.getActivityId());
ActivityConfig activityConfig = activityConfigService.getConfig();
if(activityConfig == null){
throw new BusinessException(ErrorEnum.SYSTEM_EXP, "未获取活动有效配置");
}
List<AccountPrize> prizeList = accountPrizeService.listAllWinningInfo(size, activityConfig.getActivityId());
return getDrawModels(prizeList);
}
......
package com.miya.draw.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.miya.draw.entity.Account;
import com.miya.draw.entity.ActivityConfig;
import org.apache.ibatis.annotations.Mapper;
/**
* @author :djf
* @date :2022-10-25
* @description:活动配置
*/
@Mapper
public interface ActivityConfigMapper extends BaseMapper<ActivityConfig> {
}
package com.miya.draw.service;
import com.miya.draw.entity.ActivityConfig;
/**
* @author :djf
* @date :2022-10-25
* @description:活动配置
*/
public interface IActivityConfigService {
ActivityConfig getConfig();
}
......@@ -20,5 +20,5 @@ public interface IActivityGoodsService extends IService<ActivityGoods> {
*
* @return
*/
List<String> listAllActivityGoods();
List<String> listAllActivityGoods(Long activityId);
}
package com.miya.draw.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.miya.draw.entity.ActivityConfig;
import com.miya.draw.mapper.ActivityConfigMapper;
import com.miya.draw.service.IActivityConfigService;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import java.util.ArrayList;
import java.util.List;
/**
* @author :djf
* @date :2022-10-25
* @description:
*/
@Service
public class ActivityConfigServiceImpl extends ServiceImpl<ActivityConfigMapper, ActivityConfig> implements IActivityConfigService {
@Override
public ActivityConfig getConfig() {
LambdaQueryWrapper<ActivityConfig> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(ActivityConfig::getValidStatus,1);
wrapper.last("order by create_time desc ");
List<ActivityConfig> list = baseMapper.selectList(wrapper);
if(!CollectionUtils.isEmpty(list)){
return list.get(0);
}
return null;
}
}
......@@ -2,7 +2,6 @@ package com.miya.draw.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.miya.draw.config.business.BusinessConfigImpl;
import com.miya.draw.config.constant.ConStants;
import com.miya.draw.entity.ActivityGoods;
import com.miya.draw.enums.YesOrNoEnum;
......@@ -39,11 +38,11 @@ public class ActivityGoodsServiceImpl extends ServiceImpl<ActivityGoodsMapper, A
@Autowired
private RedisTemplate<String, Object> redisTemplate;
@Resource
private BusinessConfigImpl businessConfigImpl;
@Override
public List<String> listAllActivityGoods() {
public List<String> listAllActivityGoods(Long activityId) {
List<String> goodList = new ArrayList<>();
try {
Object object = redisTemplate.opsForValue().get(buildKey());
......@@ -55,7 +54,7 @@ public class ActivityGoodsServiceImpl extends ServiceImpl<ActivityGoodsMapper, A
}
LambdaQueryWrapper<ActivityGoods> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(ActivityGoods::getValidState, YesOrNoEnum.YES.getCode());
wrapper.eq(ActivityGoods::getActivityId, businessConfigImpl.getActivityId());
wrapper.eq(ActivityGoods::getActivityId, activityId);
List<ActivityGoods> activityGoodsList = activityGoodsMapper.selectList(wrapper);
if (CollectionUtils.isNotEmpty(activityGoodsList)) {
goodList = activityGoodsList.stream().map(ActivityGoods::getCode).collect(Collectors.toList());
......
......@@ -7,3 +7,4 @@ draw:
amountunit: 0 #满量抽奖时每多少件加1次次数
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