Authored by tanling

邀请码随机数

package com.yohoufo.common.utils;
import java.util.*;
public class RandomUtil {
public static String autoGetPassword() {
StringBuilder sb = new StringBuilder();
Random random = new Random();
sb.append(random.nextInt(1000000));
sb.append("yh");
return sb.toString();
}
/**
* java生成随机数字和字母组合
* @param length[生成随机数的长度]
* @return
*/
public static String getCharAndNumr(int numLength,int charLength) {
String val = "";
Random random = new Random();
for (int i = 0; i < numLength; i++) {
// 输出字母还是数字
val += String.valueOf(random.nextInt(10));
}
for(int j=0;j<charLength;j++){
int choice = random.nextInt(2) % 2 == 0 ? 65 : 97;
val += (char) (choice + random.nextInt(26));
}
return val.toLowerCase();
}
/**
* 随机指定范围内N个不重复的数
* 利用HashSet的特征,只能存放不同的值
* @param min 指定范围最小值
* @param max 指定范围最大值
* @param n 随机数个数
* @param set 随机数结果集
*/
public static void randomSet(int min, int max, int n, HashSet<Integer> set) {
if (n > (max - min + 1) || max < min) {
return;
}
for (int i = 0; i < n; i++) {
// 调用Math.random()方法
int num = (int) (Math.random() * (max - min)) + min;
set.add(num);// 将不同的数存入HashSet中
}
int setSize = set.size();
// 如果存入的数小于指定生成的个数,则调用递归再生成剩余个数的随机数,如此循环,直到达到指定大小
if (setSize < n) {
randomSet(min, max, n - setSize, set);// 递归
}
}
/**
* @param min 指定范围最小值
* @param max 指定范围最大值
* @param n 随机数个数
*/
public static List<Integer> getRandomList(int min, int max, int n) {
List<Integer> list = new ArrayList<>();
if (n > (max - min + 1) || max < min) {
return list;
}
int interval = (max - min) / n;
for (int i = 0; i < n; i++) {
list.add((i+1)*interval-1);
}
Collections.shuffle(list);
return list;
}
/**
* 随机指定范围内N个不重复的数
* @param min 指定范围最小值
* @param max 指定范围最大值
* @param n 随机数个数
* @return
*/
public static List<Integer> randomCommon(int min, int max, int n) {
List<Integer> integers = new ArrayList<Integer>();
if (min < 0) {
min = 0;
}
if ((max - min) + 1 < n) {
n = (max - min) + 1;
}
if (max < min) {
max = min;
}
if (max < 0 || n < 0) {
return integers;
}
for (int i = 1; i <= n; i++) {
int randomNumber = (int) Math.round(Math.random() * (max - min) + min);
if (integers.contains(randomNumber)) {
i--;
continue;
} else {
integers.add(randomNumber);
}
}
return integers;
}
public static void main(String[] args){
HashSet<Integer> set = new HashSet<>();
System.out.println(randomCommon(0, 16, 12));
}
}
... ...
package com.yohoufo.dal.order;
import com.yohoufo.dal.order.model.InviteCodeSequenceRandom;
import org.apache.ibatis.annotations.Param;
public interface InviteCodeSequenceRandomMapper {
int deleteByPrimaryKey(Integer id);
int insert(InviteCodeSequenceRandom record);
int insertSelective(InviteCodeSequenceRandom record);
InviteCodeSequenceRandom selectByPrimaryKey(Integer id);
InviteCodeSequenceRandom selectValidCode();
int updateByPrimaryKeySelective(InviteCodeSequenceRandom record);
int updateByPrimaryKey(InviteCodeSequenceRandom record);
int updateStatusByid(@Param("id") Integer id);
}
\ No newline at end of file
... ...
package com.yohoufo.dal.order.model;
public class InviteCodeSequenceRandom {
private Integer id;
private Integer code;
private Integer status;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public Integer getCode() {
return code;
}
public void setCode(Integer code) {
this.code = code;
}
public Integer getStatus() {
return status;
}
public void setStatus(Integer status) {
this.status = status;
}
}
\ No newline at end of file
... ...
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="com.yohoufo.dal.order.InviteCodeSequenceRandomMapper" >
<resultMap id="BaseResultMap" type="com.yohoufo.dal.order.model.InviteCodeSequenceRandom" >
<id column="id" property="id" jdbcType="INTEGER" />
<result column="code" property="code" jdbcType="INTEGER" />
<result column="status" property="status" jdbcType="INTEGER" />
</resultMap>
<sql id="Base_Column_List" >
id, code, status
</sql>
<select id="selectByPrimaryKey" resultMap="BaseResultMap" parameterType="java.lang.Integer" >
select
<include refid="Base_Column_List" />
from invite_code_sequence_random
where id = #{id,jdbcType=INTEGER}
</select>
<select id="selectValidCode" resultMap="BaseResultMap" >
select
<include refid="Base_Column_List" />
from invite_code_sequence_random
where status=0
order by id limit 1
</select>
<delete id="deleteByPrimaryKey" parameterType="java.lang.Integer" >
delete from invite_code_sequence_random
where id = #{id,jdbcType=INTEGER}
</delete>
<insert id="insert" parameterType="com.yohoufo.dal.order.model.InviteCodeSequenceRandom" >
insert into invite_code_sequence_random (id, code, status
)
values (#{id,jdbcType=INTEGER}, #{code,jdbcType=INTEGER}, #{status,jdbcType=INTEGER}
)
</insert>
<insert id="insertSelective" parameterType="com.yohoufo.dal.order.model.InviteCodeSequenceRandom" >
insert into invite_code_sequence_random
<trim prefix="(" suffix=")" suffixOverrides="," >
<if test="id != null" >
id,
</if>
<if test="code != null" >
code,
</if>
<if test="status != null" >
status,
</if>
</trim>
<trim prefix="values (" suffix=")" suffixOverrides="," >
<if test="id != null" >
#{id,jdbcType=INTEGER},
</if>
<if test="code != null" >
#{code,jdbcType=INTEGER},
</if>
<if test="status != null" >
#{status,jdbcType=INTEGER},
</if>
</trim>
</insert>
<update id="updateByPrimaryKeySelective" parameterType="com.yohoufo.dal.order.model.InviteCodeSequenceRandom" >
update invite_code_sequence_random
<set >
<if test="code != null" >
code = #{code,jdbcType=INTEGER},
</if>
<if test="status != null" >
status = #{status,jdbcType=INTEGER},
</if>
</set>
where id = #{id,jdbcType=INTEGER}
</update>
<update id="updateStatusByid" parameterType="java.lang.Integer" >
update invite_code_sequence_random
set status=1
where id = #{id,jdbcType=INTEGER}
and status=0
</update>
<update id="updateByPrimaryKey" parameterType="com.yohoufo.dal.order.model.InviteCodeSequenceRandom" >
update invite_code_sequence_random
set code = #{code,jdbcType=INTEGER},
status = #{status,jdbcType=INTEGER}
where id = #{id,jdbcType=INTEGER}
</update>
</mapper>
\ No newline at end of file
... ...
package com.yohoufo.order.service.impl;
import com.alibaba.fastjson.JSONObject;
import com.google.common.collect.Maps;
import com.github.rholder.retry.Retryer;
import com.github.rholder.retry.RetryerBuilder;
import com.github.rholder.retry.StopStrategies;
import com.google.common.base.Predicates;
import com.yoho.core.rest.client.ServiceCaller;
import com.yoho.error.ServiceError;
import com.yoho.error.exception.ServiceException;
import com.yoho.message.sdk.utils.DateUtils;
import com.yoho.service.model.social.response.UserInfoRspBO;
import com.yohobuy.ufo.model.order.resp.InviteInfoResp;
import com.yohoufo.common.ApiResponse;
import com.yohoufo.common.exception.UfoServiceException;
import com.yohoufo.common.utils.DateUtil;
import com.yohoufo.dal.order.*;
import com.yohoufo.dal.order.model.*;
... ... @@ -19,10 +18,10 @@ import com.yohoufo.order.common.InviterType;
import com.yohoufo.order.service.IInviteService;
import com.yohoufo.order.service.IStoredSellerService;
import com.yohoufo.order.service.proxy.UserProxyService;
import com.yohoufo.order.service.support.InviteCodeGenerator;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils;
... ... @@ -31,7 +30,6 @@ import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.Optional;
import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;
@Service
... ... @@ -43,9 +41,6 @@ public class InviteServiceImpl implements IInviteService {
IStoredSellerService storedSellerService;
@Autowired
InviteCodeSequenceMapper inviteCodeSequenceMapper;
@Autowired
InviterMapper inviterMapper;
@Autowired
... ... @@ -60,9 +55,12 @@ public class InviteServiceImpl implements IInviteService {
@Autowired
ServiceCaller serviceCaller;
@Autowired
UserProxyService userProxyService;
@Autowired
InviteCodeGenerator inviteCodeGenerator;
/**
* 是否需要跳转到入驻页面
* @param uid
... ... @@ -272,7 +270,7 @@ public class InviteServiceImpl implements IInviteService {
// 已入驻
if (storedSeller){
Integer generateAInviteCode = generateInviteCodeSequence(uid);
Integer generateAInviteCode = saveInviteCode(uid);
lastShowInvite = generateAInviteCode != null ?
getShowInviteCode(InviterType.STORED_SELLER, generateAInviteCode)
... ... @@ -288,7 +286,7 @@ public class InviteServiceImpl implements IInviteService {
if (!storedSeller){
lastShowInvite = null;
}else{
Integer generateAInviteCode = generateInviteCodeSequence(uid);
Integer generateAInviteCode = saveInviteCode(uid);
lastShowInvite = generateAInviteCode != null ? getShowInviteCode(InviterType.STORED_SELLER, generateAInviteCode) : null;
}
... ... @@ -318,7 +316,7 @@ public class InviteServiceImpl implements IInviteService {
* @param uid
* @return
*/
private Integer generateInviteCodeSequence(int uid) {
private Integer saveInviteCode(int uid) {
// 是否存在A类邀请码,(即使是无效的也不会继续生成)
Inviter aClassInviter = inviterMapper.selectInviteCodeByUidType(uid, InviterType.STORED_SELLER.getType());
... ... @@ -329,25 +327,25 @@ public class InviteServiceImpl implements IInviteService {
return null;
}
}
// 生成邀请码
InviteCodeSequence inviteCodeSequence = new InviteCodeSequence();
inviteCodeSequence.setCreateTime(DateUtil.getCurrentTimeSecond());
inviteCodeSequenceMapper.insert(inviteCodeSequence);
Integer codeSequence = inviteCodeGenerator.generateCodeSequenceRandom();
// 插入邀请码
Inviter inviter = new Inviter();
inviter.setUid(uid);
inviter.setType(InviterType.STORED_SELLER.getType());
inviter.setInviteCode(inviteCodeSequence.getId());
inviter.setInviteCode(codeSequence);
int now = DateUtil.getCurrentTimeSecond();
inviter.setUpdateTime(now);
inviter.setCreateTime(now);
inviterMapper.insertSelective(inviter);
return inviteCodeSequence.getId();
return codeSequence;
}
/**
* 邀请者退驻则之前的所有绑定关系无效
* @param uid
... ...
package com.yohoufo.order.service.support;
import com.github.rholder.retry.Retryer;
import com.github.rholder.retry.RetryerBuilder;
import com.github.rholder.retry.StopStrategies;
import com.google.common.base.Predicates;
import com.yohoufo.common.utils.DateUtil;
import com.yohoufo.dal.order.InviteCodeSequenceMapper;
import com.yohoufo.dal.order.InviteCodeSequenceRandomMapper;
import com.yohoufo.dal.order.model.InviteCodeSequence;
import com.yohoufo.dal.order.model.InviteCodeSequenceRandom;
import com.yohoufo.order.service.impl.InviteServiceImpl;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@Component
public class InviteCodeGenerator {
private static final Logger LOGGER = LoggerFactory.getLogger(InviteCodeGenerator.class);
public static final int RETRY_NUM = 3;
@Autowired
InviteCodeSequenceMapper inviteCodeSequenceMapper;
@Autowired
InviteCodeSequenceRandomMapper inviteCodeSequenceRandomMapper;
// 用于邀请码创建重试
Retryer<Integer> codeRetryer = RetryerBuilder.<Integer>newBuilder()
.retryIfResult(Predicates.equalTo(0))
.retryIfException()
.withStopStrategy(StopStrategies.stopAfterAttempt(RETRY_NUM))
.build();
private Integer generateCodeSequence() {
LOGGER.info("generateCodeSequence...");
// 生成邀请码
InviteCodeSequence inviteCodeSequence = new InviteCodeSequence();
inviteCodeSequence.setCreateTime(DateUtil.getCurrentTimeSecond());
inviteCodeSequenceMapper.insert(inviteCodeSequence);
return inviteCodeSequence.getId();
}
/**
* 获取随机的6位邀请码
* @return
*/
public Integer generateCodeSequenceRandom(){
try{
return codeRetryer.call(()->{
InviteCodeSequenceRandom inviteCodeSequenceRandom = inviteCodeSequenceRandomMapper.selectValidCode();
if (inviteCodeSequenceRandom != null){
int num = inviteCodeSequenceRandomMapper.updateStatusByid(inviteCodeSequenceRandom.getId());
// 更新成功则返回,否则重试
return num !=0 ? inviteCodeSequenceRandom.getCode() : 0;
}
LOGGER.info("generateCodeSequenceRandom prestore date not exist");
// 预放置的数据使用完毕,使用原方法
return generateCodeSequence();
});
}catch (Exception e){
LOGGER.error("generateCodeSequenceRandom fail.{}", e);
}
// 重试机制异常,使用原方法
return generateCodeSequence();
}
}
... ...
package com.yohoufo.order;
import com.google.common.collect.Sets;
import com.yohoufo.common.utils.RandomUtil;
import java.util.HashSet;
public class TestRandom {
public static void main(String[] args){
HashSet<Integer> code = Sets.newHashSet();
RandomUtil.randomSet(101000, 999999, 5000, code);
StringBuilder sb = new StringBuilder("insert into ufo_order.invite_code_sequence_random (code) VALUE ");
for (Integer c : code){
sb.append("(");
sb.append(c);
sb.append("),");
}
System.out.println(sb);
}
}
... ...
... ... @@ -143,4 +143,6 @@ offline.store.seller=70,50000638
ip.port.uic.server = java-yoho-uic.test3.ingress.dev.yohocorp.com
ufo.nfc.syncBlockChain.url=http://192.168.102.49:3030/api/addItem
\ No newline at end of file
ufo.nfc.syncBlockChain.url=http://192.168.102.49:3030/api/addItem
ufo.invite.productSortLimit=16,20,40
\ No newline at end of file
... ...
... ... @@ -97,6 +97,7 @@ datasources:
- com.yohoufo.dal.order.InviteSettlementItemMapper
- com.yohoufo.dal.order.InviteSettlementMapper
- com.yohoufo.dal.order.InviteCodeSequenceMapper
- com.yohoufo.dal.order.InviteCodeSequenceRandomMapper
ufo_promotion:
servers:
... ...
... ... @@ -96,6 +96,7 @@ datasources:
- com.yohoufo.dal.order.InviteSettlementItemMapper
- com.yohoufo.dal.order.InviteSettlementMapper
- com.yohoufo.dal.order.InviteCodeSequenceMapper
- com.yohoufo.dal.order.InviteCodeSequenceRandomMapper
ufo_promotion:
servers:
... ...