记得上下班打卡 | git大法好,push需谨慎

Commit adad91dc authored by jiangxiulong's avatar jiangxiulong

draw

parent 8ad1ddf8
package com.liquidnet.service.sweet.service; package com.liquidnet.service.sweet.service;
import com.liquidnet.service.base.ResponseDto;
import com.liquidnet.service.sweet.dto.vo.admin.SweetIntegralActivityPrizeVo;
import com.liquidnet.service.sweet.entity.SweetIntegralActivityDraw; import com.liquidnet.service.sweet.entity.SweetIntegralActivityDraw;
import com.baomidou.mybatisplus.extension.service.IService; import com.baomidou.mybatisplus.extension.service.IService;
import java.util.List;
/** /**
* <p> * <p>
* 积分活动抽奖记录表 服务类 * 积分活动抽奖记录表 服务类
* </p> * </p>
* *
* @author jiangxiulong * @author jiangxiulong
* @since 2021-10-25 * @since 2021-10-26
*/ */
public interface ISweetIntegralActivityDrawService extends IService<SweetIntegralActivityDraw> { public interface ISweetIntegralActivityDrawService extends IService<SweetIntegralActivityDraw> {
ResponseDto<SweetIntegralActivityPrizeVo> create(String integralActivityId);
ResponseDto<List<SweetIntegralActivityPrizeVo>> winPrize(Integer type);
ResponseDto<List<SweetIntegralActivityPrizeVo>> winPrizeUser(String integralActivityId);
ResponseDto perfectAddress(String drawId, String receivingAddressesId, String receivingName, String receivingPhone, String receivingAddress);
} }
...@@ -70,7 +70,7 @@ public class SweetIntegralActivityServiceImpl extends ServiceImpl<SweetIntegralA ...@@ -70,7 +70,7 @@ public class SweetIntegralActivityServiceImpl extends ServiceImpl<SweetIntegralA
sweetIntegralActivityPrizeMapper.insert(sweetIntegralActivityPrize); sweetIntegralActivityPrizeMapper.insert(sweetIntegralActivityPrize);
} }
} }
// TODO: 2021/10/20 增加redis处理 // redis处理
this.integralActivityList(integralActivityId); this.integralActivityList(integralActivityId);
return insert; return insert;
} catch (Exception e) { } catch (Exception e) {
...@@ -101,7 +101,7 @@ public class SweetIntegralActivityServiceImpl extends ServiceImpl<SweetIntegralA ...@@ -101,7 +101,7 @@ public class SweetIntegralActivityServiceImpl extends ServiceImpl<SweetIntegralA
); );
} }
} }
// TODO: 2021/10/20 增加redis处理 // redis处理
this.integralActivityList(integralActivityId); this.integralActivityList(integralActivityId);
return update; return update;
} catch (Exception e) { } catch (Exception e) {
...@@ -119,7 +119,7 @@ public class SweetIntegralActivityServiceImpl extends ServiceImpl<SweetIntegralA ...@@ -119,7 +119,7 @@ public class SweetIntegralActivityServiceImpl extends ServiceImpl<SweetIntegralA
sweetIntegralActivity, sweetIntegralActivity,
Wrappers.lambdaUpdate(SweetIntegralActivity.class).eq(SweetIntegralActivity::getIntegralActivityId, integralActivityId) Wrappers.lambdaUpdate(SweetIntegralActivity.class).eq(SweetIntegralActivity::getIntegralActivityId, integralActivityId)
); );
// TODO: 2021/10/20 更新缓存 // redis处理
this.integralActivityList(integralActivityId); this.integralActivityList(integralActivityId);
return update; return update;
} }
......
...@@ -133,8 +133,8 @@ global-auth: ...@@ -133,8 +133,8 @@ global-auth:
- ${liquidnet.info.context}/sync/** - ${liquidnet.info.context}/sync/**
- ${liquidnet.info.context}/wechatSync/** - ${liquidnet.info.context}/wechatSync/**
# h5活动 # h5活动
- ${liquidnet.info.context}/sweetAnswer/**
- ${liquidnet.info.context}/AntigenicQuestion/** - ${liquidnet.info.context}/AntigenicQuestion/**
- ${liquidnet.info.context}/sweetAnswer/**
- ${liquidnet.info.context}/sweetCityVote/** - ${liquidnet.info.context}/sweetCityVote/**
# 公众号 小程序公共接口 # 公众号 小程序公共接口
- ${liquidnet.info.context}/actionCallback/** - ${liquidnet.info.context}/actionCallback/**
...@@ -142,15 +142,11 @@ global-auth: ...@@ -142,15 +142,11 @@ global-auth:
- ${liquidnet.info.context}/wechatShareSign/** - ${liquidnet.info.context}/wechatShareSign/**
- ${liquidnet.info.context}/wechatTemplate/** - ${liquidnet.info.context}/wechatTemplate/**
# 大美草莓手册 # 大美草莓手册
- ${liquidnet.info.context}/sweet-applet/**
- ${liquidnet.info.context}/mdsk/** - ${liquidnet.info.context}/mdsk/**
- ${liquidnet.info.context}/sweet-manual**
- ${liquidnet.info.context}/sweet-applet/**
- ${liquidnet.info.context}/sweet-artists/** - ${liquidnet.info.context}/sweet-artists/**
- ${liquidnet.info.context}/sweetData/** - ${liquidnet.info.context}/sweetData/**
- ${liquidnet.info.context}/sweet-manual-artists/**
- ${liquidnet.info.context}/sweet-manual/**
- ${liquidnet.info.context}/sweet-manual-notify/**
- ${liquidnet.info.context}/sweet-manual-shop/**
- ${liquidnet.info.context}/sweet-manual-sort/**
- ${liquidnet.info.context}/sweet-richtext/** - ${liquidnet.info.context}/sweet-richtext/**
- ${liquidnet.info.context}/sweet-stage/** - ${liquidnet.info.context}/sweet-stage/**
# 积分抽奖活动 # 积分抽奖活动
......
package com.liquidnet.service.sweet.controller; package com.liquidnet.service.sweet.controller;
import com.liquidnet.service.base.ResponseDto;
import com.liquidnet.service.sweet.dto.vo.IntegralActivityVo;
import com.liquidnet.service.sweet.dto.vo.admin.SweetIntegralActivityPrizeVo;
import com.liquidnet.service.sweet.service.ISweetIntegralActivityDrawService; import com.liquidnet.service.sweet.service.ISweetIntegralActivityDrawService;
import io.swagger.annotations.Api; import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.*;
import org.springframework.web.bind.annotation.RestController; import java.util.List;
/** /**
* <p> * <p>
...@@ -14,7 +20,7 @@ import org.springframework.web.bind.annotation.RestController; ...@@ -14,7 +20,7 @@ import org.springframework.web.bind.annotation.RestController;
* </p> * </p>
* *
* @author jiangxiulong * @author jiangxiulong
* @since 2021-10-25 * @since 2021-10-26
*/ */
@Api(tags = "活动-积分抽奖") @Api(tags = "活动-积分抽奖")
@RestController @RestController
...@@ -22,4 +28,57 @@ import org.springframework.web.bind.annotation.RestController; ...@@ -22,4 +28,57 @@ import org.springframework.web.bind.annotation.RestController;
public class SweetIntegralActivityDrawController { public class SweetIntegralActivityDrawController {
@Autowired @Autowired
private ISweetIntegralActivityDrawService activityDrawService; private ISweetIntegralActivityDrawService activityDrawService;
@PostMapping("create")
@ApiOperation("用户抽奖")
@ApiImplicitParams({
@ApiImplicitParam(type = "query", dataType = "String", name = "integralActivityId", value = "活动id", required = true)
})
public ResponseDto<SweetIntegralActivityPrizeVo> create(
@RequestParam("integralActivityId") String integralActivityId
) {
return activityDrawService.create(integralActivityId);
}
@GetMapping("winPrize")
@ApiOperation("用户(中奖、抽奖)记录列表")
@ApiImplicitParams({
@ApiImplicitParam(type = "query", dataType = "Integer", name = "type", value = "1中奖记录 2抽奖记录", required = true)
})
public ResponseDto<List<SweetIntegralActivityPrizeVo>> winPrize(
@RequestParam("type") Integer type
) {
return activityDrawService.winPrize(type);
}
@GetMapping("winPrizeUser")
@ApiOperation("活动中奖用户列表")
@ApiImplicitParams({
@ApiImplicitParam(type = "query", dataType = "String", name = "integralActivityId", value = "活动id", required = true)
})
public ResponseDto<List<SweetIntegralActivityPrizeVo>> winPrizeUser(
@RequestParam("integralActivityId") String integralActivityId
) {
return activityDrawService.winPrizeUser(integralActivityId);
}
@PostMapping("perfectAddress")
@ApiOperation("中奖完善收货地址")
@ApiImplicitParams({
@ApiImplicitParam(type = "query", dataType = "String", name = "drawId", value = "中奖ID", required = true),
@ApiImplicitParam(type = "query", dataType = "String", name = "receivingAddressesId", value = "adam收货地址addresses_id", required = true),
@ApiImplicitParam(type = "query", dataType = "String", name = "receivingName", value = "adam收货人姓名", required = true),
@ApiImplicitParam(type = "query", dataType = "String", name = "receivingPhone", value = "adam收货人手机号", required = true),
@ApiImplicitParam(type = "query", dataType = "String", name = "receivingAddress", value = "adam收货人完整地址 空格隔离省市区详细地址", required = true)
})
public ResponseDto perfectAddress(
@RequestParam("drawId") String drawId,
@RequestParam("receivingAddressesId") String receivingAddressesId,
@RequestParam("receivingName") String receivingName,
@RequestParam("receivingPhone") String receivingPhone,
@RequestParam("receivingAddress") String receivingAddress
) {
return activityDrawService.perfectAddress(drawId, receivingAddressesId, receivingName, receivingPhone, receivingAddress);
}
} }
package com.liquidnet.service.sweet.service.impl; package com.liquidnet.service.sweet.service.impl;
import com.liquidnet.commons.lang.util.CurrentUtil;
import com.liquidnet.service.base.ResponseDto;
import com.liquidnet.service.sweet.dto.vo.IntegralActivityVo;
import com.liquidnet.service.sweet.dto.vo.admin.SweetIntegralActivityPrizeVo;
import com.liquidnet.service.sweet.entity.SweetIntegralActivityDraw; import com.liquidnet.service.sweet.entity.SweetIntegralActivityDraw;
import com.liquidnet.service.sweet.entity.SweetIntegralActivityPrize;
import com.liquidnet.service.sweet.mapper.SweetIntegralActivityDrawMapper; import com.liquidnet.service.sweet.mapper.SweetIntegralActivityDrawMapper;
import com.liquidnet.service.sweet.service.ISweetIntegralActivityDrawService; import com.liquidnet.service.sweet.service.ISweetIntegralActivityDrawService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.liquidnet.service.sweet.utils.RedisDataUtils;
import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import java.math.BigDecimal;
import java.util.*;
/** /**
* <p> * <p>
* 积分活动抽奖记录表 服务实现类 * 积分活动抽奖记录表 服务实现类
* </p> * </p>
* *
* @author jiangxiulong * @author jiangxiulong
* @since 2021-10-25 * @since 2021-10-26
*/ */
@Service @Service
public class SweetIntegralActivityDrawServiceImpl extends ServiceImpl<SweetIntegralActivityDrawMapper, SweetIntegralActivityDraw> implements ISweetIntegralActivityDrawService { public class SweetIntegralActivityDrawServiceImpl extends ServiceImpl<SweetIntegralActivityDrawMapper, SweetIntegralActivityDraw> implements ISweetIntegralActivityDrawService {
@Autowired
private RedisDataUtils redisDataUtils;
@Override
public ResponseDto<SweetIntegralActivityPrizeVo> create(String integralActivityId) {
Map tokenClaims = CurrentUtil.getTokenClaims();
String userId = StringUtils.defaultString((String.valueOf(tokenClaims.get("sub"))), "");
String nickname = StringUtils.defaultString((String.valueOf(tokenClaims.get("nickname"))), "");
IntegralActivityVo integralActivity = redisDataUtils.getIntegralActivityInfo(integralActivityId);
SweetIntegralActivityPrize sweetIntegralActivityPrize = this.lotteryDraw(integralActivity.getPrizeList());
// 活动是否上架 是否在有效期内 奖品库存是否够
SweetIntegralActivityPrizeVo sweetIntegralActivityPrizeVo = SweetIntegralActivityPrizeVo.getNew().copy(sweetIntegralActivityPrize);
return ResponseDto.success(sweetIntegralActivityPrizeVo);
}
@Override
public ResponseDto<List<SweetIntegralActivityPrizeVo>> winPrize(Integer type) {
return null;
}
@Override
public ResponseDto<List<SweetIntegralActivityPrizeVo>> winPrizeUser(String integralActivityId) {
return null;
}
@Override
public ResponseDto perfectAddress(String drawId, String receivingAddressesId, String receivingName, String receivingPhone, String receivingAddress) {
return null;
}
/**
* 抽奖方法
*/
private static SweetIntegralActivityPrize lotteryDraw(List<SweetIntegralActivityPrize> prizeList) {
if (prizeList == null || prizeList.isEmpty()) {
return null;
}
int size = prizeList.size();
// 计算总概率,这样可以保证不一定总概率是1
BigDecimal sumRate = BigDecimal.ZERO;
for (SweetIntegralActivityPrize prize : prizeList) {
sumRate = sumRate.add(prize.getWinningProbability());
}
// 计算每个物品在总概率的基础下的概率情况
List<BigDecimal> sortOrignalRates = new ArrayList<>(size);
BigDecimal tempSumRate = BigDecimal.ZERO;
for (SweetIntegralActivityPrize prize : prizeList) {
tempSumRate = tempSumRate.add(prize.getWinningProbability());
sortOrignalRates.add(tempSumRate.divide(sumRate, 4, BigDecimal.ROUND_HALF_UP));
}
// 根据区块值来获取抽取到的物品索引
double nextDouble = Math.random();
BigDecimal nextDoubleNew = BigDecimal.valueOf(nextDouble);
sortOrignalRates.add(nextDoubleNew);
Collections.sort(sortOrignalRates);
int index = sortOrignalRates.indexOf(nextDoubleNew);
SweetIntegralActivityPrize sweetIntegralActivityPrize = prizeList.get(index);
return sweetIntegralActivityPrize;
}
/*public static void main(String[] args) {
List<SweetIntegralActivityPrizeVo> gifts = new ArrayList<>();
SweetIntegralActivityPrizeVo aNew = SweetIntegralActivityPrizeVo.getNew();
SweetIntegralActivityPrizeVo aNew2 = SweetIntegralActivityPrizeVo.getNew();
SweetIntegralActivityPrizeVo aNew3 = SweetIntegralActivityPrizeVo.getNew();
aNew.setWinningProbability(BigDecimal.valueOf(0.4));
aNew.setPrizeTitle("一等奖");
aNew.setPrizeId("111");
aNew2.setWinningProbability(BigDecimal.valueOf(0.5));
aNew2.setPrizeTitle("二等奖");
aNew2.setPrizeId("222");
aNew3.setWinningProbability(BigDecimal.valueOf(0.1));
aNew3.setPrizeTitle("三等奖");
aNew3.setPrizeId("333");
gifts.add(aNew);
gifts.add(aNew2);
gifts.add(aNew3);
// 统计
Map<Integer, Integer> count = new HashMap<>();
// 测试次数
double num = 1000000;
for (int i = 0; i < num; i++) {
SweetIntegralActivityPrizeVo orignalIndex = lottery(gifts);
Integer integer = count.get(Integer.valueOf(orignalIndex.getPrizeId()));
count.put(Integer.valueOf(orignalIndex.getPrizeId()), integer == null ? 1 : integer + 1);
}
for (Map.Entry<Integer, Integer> entry : count.entrySet()) {
System.out.println(entry.getKey() + ", 命中次数=" + entry.getValue() + ", 实际概率="
+ entry.getValue() / num);
}
}*/
} }
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