Commit 56855414 by lvyp

签到和红包拆分

1 parent 95b863fa
......@@ -38,7 +38,7 @@ public class UserController {
}
@PostMapping("/saveUserSign")
@ResponseBody
public ApiResult saveUserSign(@RequestBody @Validated UserInfoParam param) {
public ApiResult saveUserSign(@RequestBody UserInfoParam param) {
return userInfoService.saveUserSign(param);
}
}
......@@ -2,6 +2,7 @@ package com.polysoft.activity.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.polysoft.activity.model.dto.CattleBrandDto;
import com.polysoft.activity.model.vo.CattleBrandConfVO;
import com.polysoft.activity.model.vo.CattleBrandFroUserVO;
import com.polysoft.activity.model.vo.CattleBrandVO;
import org.apache.ibatis.annotations.Param;
......@@ -11,6 +12,7 @@ import java.util.List;
@Mapper
public interface CattleBrandMapper extends BaseMapper<CattleBrandDto> {
List<CattleBrandVO> queryCattleBrandList();
List<CattleBrandVO> queryCattleBrandList(@Param("brandType") String brandType);
CattleBrandFroUserVO queryCattleBrandByUserId(@Param("userId")Long userId);
CattleBrandConfVO queryCattleBrandConf(@Param("signDate") String signDate);
}
......@@ -22,4 +22,5 @@ public interface UserInfoMapper {
int saveUserSign(UserSignDto dto);
int updateUserSign(UserSignDto dto);
List<FirstLoginRedVO> queryFirstLoginRed();
int updateFirstLoginRed(@Param("id") Long id);
}
package com.polysoft.activity.model.vo;
import lombok.Data;
@Data
public class CattleBrandConfVO {
private Long id ;
private String signDate;
private double rate1;
private double rate2;
private double rate3;
private double rate4;
private double rate5;
}
......@@ -4,6 +4,6 @@ import com.polysoft.activity.utils.ApiResult;
public interface CattleBrandService {
ApiResult queryCattleBrandList();
ApiResult queryCattleBrandList(String brandType);
ApiResult queryCattleBrandByUserId(Long userId);
}
......@@ -13,8 +13,8 @@ public class CattleBrandServiceImpl implements CattleBrandService {
private CattleBrandMapper cattleBrandMapper;
@Override
public ApiResult queryCattleBrandList() {
return ApiResult.ok(cattleBrandMapper.queryCattleBrandList());
public ApiResult queryCattleBrandList(String brandType) {
return ApiResult.ok(cattleBrandMapper.queryCattleBrandList(brandType));
}
@Override
......
......@@ -13,29 +13,20 @@ import com.polysoft.activity.model.dto.UserSignDto;
import com.polysoft.activity.model.dto.WechatTokenDto;
import com.polysoft.activity.model.param.ShareLinkParam;
import com.polysoft.activity.model.param.UserInfoParam;
import com.polysoft.activity.model.vo.CattleBrandVO;
import com.polysoft.activity.model.vo.FirstLoginRedVO;
import com.polysoft.activity.model.vo.ShareLinkVO;
import com.polysoft.activity.model.vo.UserInfoVO;
import com.polysoft.activity.model.vo.WechatToken;
import com.polysoft.activity.model.vo.*;
import com.polysoft.activity.service.UserInfoService;
import com.polysoft.activity.utils.ApiResult;
import com.polysoft.activity.utils.MathRandom;
import com.polysoft.activity.utils.SHA1;
import com.polysoft.activity.utils.SnowFlakeUtil;
import org.apache.commons.lang.time.DateUtils;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.HttpEntity;
import org.springframework.stereotype.Service;
import org.springframework.util.unit.DataUnit;
import org.springframework.web.client.RestTemplate;
import javax.annotation.Resource;
import java.math.BigDecimal;
import java.text.ParseException;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Random;
import java.util.UUID;
......@@ -105,13 +96,15 @@ public class UserInfoServiceImpl implements UserInfoService {
@Override
public ApiResult saveUserSign(UserInfoParam param) {
UserSignDto userSignDto = new UserSignDto();
// CattleBrandConfVO confVO = cattleBrandMapper.queryCattleBrandConf(DateUtil.format(new Date(),"yyyy-MM-dd"));
CattleBrandConfVO confVO = cattleBrandMapper.queryCattleBrandConf("2021-02-11");
if(param.getSignId() != null){
userSignDto.setId(param.getSignId());
userSignDto.setCreateTime(new Date());
userSignDto.setSignStatus("2");
mapper.updateUserSign(userSignDto);
}else {
List<CattleBrandVO> cattleList = cattleBrandMapper.queryCattleBrandList();
MathRandom a = new MathRandom(confVO.getRate1(),confVO.getRate2(),confVO.getRate3(),confVO.getRate4(),confVO.getRate5());
userSignDto.setId(SnowFlakeUtil.nextId());
userSignDto.setUserId(param.getUserId());
userSignDto.setSignStatus("1");
......@@ -122,7 +115,7 @@ public class UserInfoServiceImpl implements UserInfoService {
SaveUserCattleDto dto = new SaveUserCattleDto();
dto.setId(SnowFlakeUtil.nextId());
dto.setUserId(param.getUserId());
dto.setCattleBrandId(cattleList.get(new Random().nextInt(5)).getCattleId());
dto.setCattleBrandId(cattleBrandMapper.queryCattleBrandList((a.PercentageRandom()+"")).get(0).getCattleId());
mapper.saveCattleBrand(list);
}
return ApiResult.ok();
......@@ -135,7 +128,7 @@ public class UserInfoServiceImpl implements UserInfoService {
List<FirstLoginRedVO> firstLoginRedVOList = mapper.queryFirstLoginRed();
if(firstLoginRedVOList != null && firstLoginRedVOList.size() >0){
//新增到红包雨表 作为红包基础数据
FirstLoginRedVO redVO = firstLoginRedVOList.get(new Random().nextInt(firstLoginRedVOList.size()));
FirstLoginRedVO redVO = firstLoginRedVOList.get(0);
AddRedRainDto dto = new AddRedRainDto();
dto.setRedId(SnowFlakeUtil.nextId());
dto.setUserId(userId);
......@@ -145,6 +138,7 @@ public class UserInfoServiceImpl implements UserInfoService {
dto.setBatchNum(4);
dto.setCreateTime(new Date());
activityMapper.saveRedRainForOne(dto);
mapper.updateFirstLoginRed(redVO.getId());
//更新聚宝盆余额
List<UserInfoDto> userInfoDtoList = new ArrayList<>();
UserInfoDto userInfoDto = new UserInfoDto();
......
......@@ -10,6 +10,7 @@ import com.polysoft.activity.model.vo.CattleBrandVO;
import com.polysoft.activity.model.vo.RedAmountTotalVO;
import com.polysoft.activity.model.vo.RedRainVO;
import com.polysoft.activity.service.CattleBrandService;
import com.polysoft.activity.utils.RedPacketUtil;
import com.polysoft.activity.utils.SnowFlakeUtil;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.scheduling.annotation.EnableScheduling;
......@@ -42,7 +43,7 @@ public class InitRedPackageTask {
private UserInfoMapper userInfoMapper;
// @Scheduled(initialDelay = 10000, fixedRate = 1*15*60*1000)
@Scheduled( cron = "20 42 23 * * ? ")
@Scheduled( cron = "20 17 21 * * ? ")
public void execute() {
sendWechat();
}
......@@ -69,8 +70,8 @@ public class InitRedPackageTask {
// }
LoggerHelper.debug(this.getClass(),"任务开始");
//查询出没有初始化的红包
int batchNum = 1;
double totalMoney = 5000.00;
final int batchNum = 1;
final double totalMoney = 5000.00;
if(1==1){
QueryRedRainDto dto1 = new QueryRedRainDto();
List<AddRedRainDto> batchList = new ArrayList<>();
......@@ -79,12 +80,13 @@ public class InitRedPackageTask {
List<RedRainVO> list = activityMapper.queryRedRainList(dto1);
//前10%红包
int redNum = (int)(list.size()*0.1);
double [] redAmount = getMoney(5000.00*0.25,redNum);
RedPacketUtil redpack = new RedPacketUtil();
List<Double> redAmount= redpack.getMoney(totalMoney*0.25,redNum,0.01,100,2.1);
HashSet<Integer> set = getLuckUser(redNum,list.size());
int i = 0;
for (Integer s : set) {
AddRedRainDto addRedRainDto = BeanTransferUtils.transfer(list.get(s),AddRedRainDto.class);
addRedRainDto.setRedAmount(BigDecimal.valueOf(redAmount[i]));
addRedRainDto.setRedAmount(BigDecimal.valueOf(redAmount.get(i)));
addRedRainDto.setRedType("1");
addRedRainDto.setIsEnble("1");
batchList.add(addRedRainDto);
......@@ -107,12 +109,13 @@ public class InitRedPackageTask {
//前20%红包
int redNum = (int)(list.size()*0.2);
double [] redAmount = getMoney(5000.00*0.25,redNum);
RedPacketUtil redpack = new RedPacketUtil();
List<Double> redAmount= redpack.getMoney(totalMoney*0.25,redNum,0.01,100,2.1);
HashSet<Integer> set = getLuckUser(redNum,list2.size());
int i = 0;
for (Integer s : set) {
AddRedRainDto addRedRainDto = BeanTransferUtils.transfer(list2.get(s),AddRedRainDto.class);
addRedRainDto.setRedAmount(BigDecimal.valueOf(redAmount[i]));
addRedRainDto.setRedAmount(BigDecimal.valueOf(redAmount.get(i)));
addRedRainDto.setRedType("1");
addRedRainDto.setIsEnble("1");
batchList2.add(addRedRainDto);
......@@ -133,12 +136,13 @@ public class InitRedPackageTask {
List<RedRainVO> list2 = activityMapper.queryRedRainList(dto3_1);
//前65%红包
int redNum = (int)(list.size()*0.65);
double [] redAmount = getMoney(5000.00*0.5,redNum);
RedPacketUtil redpack = new RedPacketUtil();
List<Double> redAmount= redpack.getMoney(totalMoney*0.5,redNum,0.01,100,2.1);
HashSet<Integer> set = getLuckUser(redNum,list2.size());
int i = 0;
for (Integer s : set) {
AddRedRainDto addRedRainDto = BeanTransferUtils.transfer(list2.get(s),AddRedRainDto.class);
addRedRainDto.setRedAmount(BigDecimal.valueOf(redAmount[i]));
addRedRainDto.setRedAmount(BigDecimal.valueOf(redAmount.get(i)));
addRedRainDto.setRedType("1");
addRedRainDto.setIsEnble("1");
batchList2.add(addRedRainDto);
......@@ -160,7 +164,7 @@ public class InitRedPackageTask {
//前5%红包牛牌
int redNum =list2.size();
HashSet<Integer> set = getLuckUser(redNum,list2.size());
List<CattleBrandVO> cattleList = (List<CattleBrandVO>) cattleBrandService.queryCattleBrandList().get("data");
List<CattleBrandVO> cattleList = (List<CattleBrandVO>) cattleBrandService.queryCattleBrandList(null).get("data");
int i = 0;
for (Integer s : set) {
AddRedRainDto addRedRainDto = BeanTransferUtils.transfer(list2.get(s),AddRedRainDto.class);
......@@ -216,40 +220,10 @@ public class InitRedPackageTask {
}
return has;
}
private double [] getMoney(double money, int num){
Random r = new Random();
DecimalFormat format = new DecimalFormat(".##");
double middle = Double.parseDouble(format.format(money/num));
double [] dou = new double[num];
double redMoney = 0;
double nextMoney = money;
double sum = 0;
int index = 0;
for(int i=num;i>0;i--){
if(i == 1){
dou[index] = nextMoney;
}else{
while(true){
String str = format.format(r.nextDouble()*nextMoney);
redMoney = Double.parseDouble(str);
if(redMoney>0.01 && redMoney < middle ){
break;
}
}
nextMoney = Double.parseDouble(format.format(nextMoney - redMoney));
sum = sum + redMoney;
dou[index] = redMoney;
middle = Double.parseDouble(format.format(nextMoney/(i-1)));
index++;
}
}
return dou;
}
public static void main(String[] args) {
double [] ss = new InitRedPackageTask().getMoney(1000,15);
for (double s : ss) {
System.out.println(s);
}
public static void main(String[] args) {
RedPacketUtil redpack = new RedPacketUtil();
List<Double> redAmount= redpack.getMoney(4000,227,5,100,2.1);
redAmount.forEach(item ->System.out.println(item));
}
}
......@@ -132,7 +132,7 @@
parameterType="com.polysoft.activity.model.dto.CalculateAmoutDto">
SELECT
t.user_id,
max( t.red_amount ) AS redAmountTatol
sum( t.red_amount ) AS redAmountTatol
FROM
t_red_rain t where t.red_type=#{redType} and t.batch_num=#{batchNum}
......
......@@ -6,7 +6,11 @@
cattle_id,
brand_type,
brand_name
from t_cattle_brand
from t_cattle_brand where
1=1
<if test="brandType != null and brandType != '' ">
and brand_name#{brandType}
</if>
</select>
<select id="queryCattleBrandByUserId" resultType="com.polysoft.activity.model.vo.CattleBrandFroUserVO">
SELECT
......@@ -19,6 +23,19 @@
FROM
t_user_cattle t
WHERE
t.user_id =#{userId} GROUP BY t.user_id
t.user_id =#{userId}
</select>
<select id="queryCattleBrandConf" resultType="com.polysoft.activity.model.vo.CattleBrandConfVO">
SELECT
cattle_id,
sign_date,
rate1,
rate2,
rate3,
rate4,
rate5
FROM
t_cattle_brand_conf where sign_date=#{signDate}
</select>
</mapper>
......@@ -19,7 +19,7 @@
SELECT
id,
amount
from t_first_login_red where is_flag = '0'
from t_first_login_red where is_flag = '0' order by id asc limit 1
</select>
<update id="updateWechatToken" parameterType="com.polysoft.activity.model.dto.WechatTokenDto">
update wechat_token set access_token=#{accessToken},update_time=#{updateTime} where id =1
......@@ -39,6 +39,9 @@
</foreach>
</where>
</update>
<update id="updateFirstLoginRed">
update t_first_login_red set is_flag = 1 where id =#{id}
</update>
<insert id="saveCattleBrand" parameterType="com.polysoft.activity.model.dto.SaveUserCattleDto">
INSERT into t_user_cattle (
id,
......
......@@ -41,38 +41,38 @@ public class MathRandom {
* @return int
*
*/
private int PercentageRandom()
public int PercentageRandom()
{
double randomNumber;
randomNumber = Math.random();
if (randomNumber >= 0 && randomNumber <= rate0)
{
return 0;
return 1;
}
else if (randomNumber >= rate0 / 100 && randomNumber <= rate0 + rate1)
{
return 1;
return 2;
}
else if (randomNumber >= rate0 + rate1
&& randomNumber <= rate0 + rate1 + rate2)
{
return 2;
return 3;
}
else if (randomNumber >= rate0 + rate1 + rate2
&& randomNumber <= rate0 + rate1 + rate2 + rate3)
{
return 3;
return 4;
}
else if (randomNumber >= rate0 + rate1 + rate2 + rate3
&& randomNumber <= rate0 + rate1 + rate2 + rate3 + rate4)
{
return 4;
return 5;
}
else if (randomNumber >= rate0 + rate1 + rate2 + rate3 + rate4
&& randomNumber <= rate0 + rate1 + rate2 + rate3 + rate4
)
{
return 5;
return 6;
}
return -1;
}
......@@ -84,10 +84,10 @@ public class MathRandom {
public static void main(String[] agrs)
{
int i = 0;
MathRandom a = new MathRandom(0.50,0.30,0.15,0.04,0.01);
for (i = 0; i < 1; i++)//打印100个测试概率的准确性
MathRandom a = new MathRandom(0.01,0.3,0.15,0.04,0.5);
for (i = 0; i < 100; i++)//打印100个测试概率的准确性
{
System.out.println(a.PercentageRandom()+1);
System.out.println(a.PercentageRandom());
}
}
......
package com.polysoft.activity.constant;
package com.polysoft.activity.utils;
import java.util.ArrayList;
import java.util.List;
......@@ -11,15 +11,15 @@ import java.util.List;
*/
public class RedPacketUtil {
//1.设置金额的上下限 最少0.01,最多200
private double MINMONEY ;
private double MAXMONEY ;
private double TIMES ;
// private double MINMONEY ;
// private double MAXMONEY ;
// private double TIMES ;
/**
* 4.实现红包分配,为了避免一个红包占用大量的金额,设定非最后一个红包的 最大金额,可以设置平均值的N陪,
*
* */
public List<Double> splitRedPackets(double money, int count) {
if (!isRight(money, count)) {
public List<Double> splitRedPackets(double money, int count,double MINMONEY,double MAXMONEY,double TIMES ) {
if (!isRight(money, count,MINMONEY,MAXMONEY)) {
return null;
}
List<Double> list = new ArrayList<Double>();
......@@ -27,7 +27,7 @@ public class RedPacketUtil {
max = max > MAXMONEY ? MAXMONEY : max;
for (int i = 0; i < count; i++) {
double one = randomRedPacket(money, MINMONEY, max, count - i);
double one = randomRedPacket(money, MINMONEY, max, count - i,MINMONEY,MAXMONEY);
list.add(one);
money -= one;
}
......@@ -37,7 +37,7 @@ public class RedPacketUtil {
* 3.随机产生红包
*
* */
private double randomRedPacket(double money, double mins, double maxs, int count) {
private double randomRedPacket(double money, double mins, double maxs, int count,double MINMONEY,double MAXMONEY) {
if (count == 1) {
return (double) (Math.round(money * 100)) / 100;
}
......@@ -48,28 +48,23 @@ public class RedPacketUtil {
double one = ((double) Math.random() * (max - mins) + mins);
one = (double) (Math.round(one * 100)) / 100;
double moneyOther = money - one;
if (isRight(moneyOther, count - 1)) {
if (isRight(moneyOther, count - 1,MINMONEY,MAXMONEY)) {
return one;
} else {
double avg = moneyOther / (count - 1);
if (avg < MINMONEY) {
return randomRedPacket(money, mins, one, count);
return randomRedPacket(money, mins, one, count,MINMONEY,MAXMONEY);
} else if (avg > MAXMONEY) {
return randomRedPacket(money, one, maxs, count);
return randomRedPacket(money, one, maxs, count,MINMONEY,MAXMONEY);
}
}
return one;
}
public RedPacketUtil(double MINMONEY, double MAXMONEY, double TIMES) {
this.MINMONEY = MINMONEY;
this.MAXMONEY = MAXMONEY;
this.TIMES = TIMES;
}
//2.判断金额是否合法 如果超过了最大值与最小值,错误
private boolean isRight(double money, int count) {
private boolean isRight(double money, int count,double MINMONEY,double MAXMONEY) {
double avg = money / count;
if (avg < MINMONEY) {
return false;
......@@ -79,10 +74,8 @@ public class RedPacketUtil {
return true;
}
public static void main(String[] args) {
public List<Double> getMoney(double money,int count ,double MINMONEY,double MAXMONEY ,double TIMES) {
RedPacketUtil util = new RedPacketUtil(5,100,2);
List<Double> doubles = util.splitRedPackets(1250, 100);
doubles.forEach(item -> System.out.println(item));
return splitRedPackets(money,count,MINMONEY, MAXMONEY,TIMES);
}
}
Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!