Authored by LUOXC

Merge branch 'test6.9.0' into gray

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
... ...
... ... @@ -22,7 +22,8 @@ public interface InviteSettlementItemMapper {
InviteSettlementItem selectByUidAndBuyerOrderCode(@Param("uid") Integer uid, @Param("buyerOrderCode") Long buyerOrderCode);
InviteSettlementItem selectOneByUidAndStatus(@Param("uid") Integer uid,
InviteSettlementItem selectOneByUidTypeAndStatus(@Param("uid") Integer uid,
@Param("type") Integer type,
@Param("status") Integer status);
int selectCountByUidTypeAndInviteSettlementId(@Param("uid") Integer uid,
... ... @@ -81,4 +82,17 @@ public interface InviteSettlementItemMapper {
@Param("start") Integer start,
@Param("limit") Integer limit);
InviteSettlementItemStats selectStats(@Param("uid") Integer uid,
@Param("type") Integer type,
@Param("startTime") Integer startTime,
@Param("endTime") Integer endTime);
List<InviteSettlementItem> select(@Param("uid") Integer uid,
@Param("type") Integer type,
@Param("startTime") Integer startTime,
@Param("endTime") Integer endTime,
@Param("start") Integer start,
@Param("limit") Integer limit);
}
\ 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
... ...
... ... @@ -13,10 +13,22 @@ public class InviteSettlement {
public static final int STATUS_PAID = 2;
/**
* 结算方式:入驻商家 包括type1
*/
public static final int SETTLE_TYPE_STORED = 1;
/**
* 结算方式:一级代理 包括type2
*/
public static final int SETTLE_TYPE_AGENT= 2;
private Integer id;
private Integer uid;
private Integer settleType;
private Integer settleCode;
private BigDecimal settleAmount;
... ...
<?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
... ...
... ... @@ -73,11 +73,12 @@
where uid = #{uid,jdbcType=INTEGER} and buyer_order_code = #{buyerOrderCode,jdbcType=BIGINT}
</select>
<select id="selectOneByUidAndStatus" resultMap="BaseResultMap" >
<select id="selectOneByUidTypeAndStatus" resultMap="BaseResultMap" >
select
<include refid="Base_Column_List" />
from invite_settlement_item
where uid = #{uid,jdbcType=INTEGER}
and type = #{type,jdbcType=INTEGER}
and status = #{status,jdbcType=INTEGER}
limit 1
</select>
... ...
... ... @@ -5,6 +5,7 @@
<id column="id" property="id" jdbcType="INTEGER" />
<result column="uid" property="uid" jdbcType="INTEGER" />
<result column="settle_code" property="settleCode" jdbcType="INTEGER" />
<result column="settle_type" property="settleType" jdbcType="INTEGER" />
<result column="settle_amount" property="settleAmount" jdbcType="DECIMAL" />
<result column="settle_time" property="settleTime" jdbcType="INTEGER" />
<result column="name" property="name" jdbcType="VARCHAR" />
... ... @@ -17,18 +18,38 @@
<result column="create_time" property="createTime" jdbcType="INTEGER" />
</resultMap>
<sql id="Base_Column_List" >
id, uid, settle_code, settle_amount, settle_time, name, id_card_no, bank_name, bank_branch, bank_card_no, paid_time, status, create_time
id, uid, settle_code, settle_type, settle_amount, settle_time,name, id_card_no, bank_name, bank_branch, bank_card_no,paid_time, status, create_time
</sql>
<insert id="insert" parameterType="com.yohoufo.dal.order.model.InviteSettlement" useGeneratedKeys="true" keyProperty="id">
insert into invite_settlement (id, uid,
settle_code, settle_amount, settle_time,
name, id_card_no, bank_name, bank_branch, bank_card_no,
status, create_time)
values (#{id,jdbcType=INTEGER}, #{uid,jdbcType=INTEGER},
#{settleCode,jdbcType=DECIMAL}, #{settleAmount,jdbcType=DECIMAL}, #{settleTime,jdbcType=INTEGER},
#{name,jdbcType=VARCHAR},#{idCardNo,jdbcType=VARCHAR},#{bankName,jdbcType=VARCHAR},#{bankBranch,jdbcType=VARCHAR},#{bankCardNo,jdbcType=VARCHAR},
#{status,jdbcType=INTEGER}, #{createTime,jdbcType=INTEGER})
insert into invite_settlement (
id,
uid,
settle_code,
settle_type,
settle_amount,
settle_time,
name,
id_card_no,
bank_name,
bank_branch,
bank_card_no,
status,
create_time)
values (
#{id,jdbcType=INTEGER},
#{uid,jdbcType=INTEGER},
#{settleCode,jdbcType=INTEGER},
#{settleType,jdbcType=INTEGER},
#{settleAmount,jdbcType=DECIMAL},
#{settleTime,jdbcType=INTEGER},
#{name,jdbcType=VARCHAR},
#{idCardNo,jdbcType=VARCHAR},
#{bankName,jdbcType=VARCHAR},
#{bankBranch,jdbcType=VARCHAR},
#{bankCardNo,jdbcType=VARCHAR},
#{status,jdbcType=INTEGER},
#{createTime,jdbcType=INTEGER})
</insert>
<update id="updateByUidAndId" parameterType="com.yohoufo.dal.order.model.InviteSettlement" >
... ...
package com.yohoufo.order.service.impl;
import com.alibaba.fastjson.JSONObject;
import com.google.common.collect.Maps;
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.*;
import com.yohoufo.dal.order.InviteActivityMapper;
import com.yohoufo.dal.order.InviteRecordMapper;
import com.yohoufo.dal.order.InviteSettlementItemMapper;
import com.yohoufo.dal.order.InviterMapper;
import com.yohoufo.dal.order.model.InviteActivity;
import com.yohoufo.dal.order.model.InviteRecord;
import com.yohoufo.dal.order.model.InviteSettlementItem;
import com.yohoufo.dal.order.model.Inviter;
import com.yohoufo.order.common.InviteRecordStatusEnum;
import com.yohoufo.order.common.InviterStatus;
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.apache.commons.lang3.tuple.Pair;
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 +33,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 +44,6 @@ public class InviteServiceImpl implements IInviteService {
IStoredSellerService storedSellerService;
@Autowired
InviteCodeSequenceMapper inviteCodeSequenceMapper;
@Autowired
InviterMapper inviterMapper;
@Autowired
... ... @@ -60,9 +58,12 @@ public class InviteServiceImpl implements IInviteService {
@Autowired
ServiceCaller serviceCaller;
@Autowired
UserProxyService userProxyService;
@Autowired
InviteCodeGenerator inviteCodeGenerator;
/**
* 是否需要跳转到入驻页面
* @param uid
... ... @@ -189,15 +190,23 @@ public class InviteServiceImpl implements IInviteService {
}
// 获取展示用的邀请码
String showInviteCode = getShowInviteCode(uid);
Pair<String,List<Inviter>> showInviteCodeAndInviter = getShowInviteCode(uid);
if (StringUtils.isEmpty(showInviteCode)){
if (StringUtils.isEmpty(showInviteCodeAndInviter.getLeft())){
LOGGER.warn("has no showInviteCode. uid is {}", uid);
throw new ServiceException(ServiceError.HAS_NO_ENTER);
}
// 有邀请码的场合,获取邀请的好友
List<InviteRecord> inviteRecords = inviteRecordMapper.selectByInviterUid(uid);
// 入驻商户角色的邀请记录
Integer storedInviterId = showInviteCodeAndInviter.getRight().stream()
.filter(e->e.getType().intValue() == InviterType.STORED_SELLER.getType())
.map(Inviter::getId)
.findFirst()
.orElse(null);
List<InviteRecord> inviteRecords = inviteRecordMapper.selectByInviterUid(uid).stream()
.filter(e->e.getInviterId().equals(storedInviterId))
.collect(Collectors.toList());
if (!CollectionUtils.isEmpty(inviteRecords)){
List<Integer> inviteeUidList = inviteRecords.stream().map(InviteRecord::getInviteeUid).collect(Collectors.toList());
... ... @@ -215,7 +224,7 @@ public class InviteServiceImpl implements IInviteService {
return InviteInfoResp.builder()
.uid(uid)
.showInviteCode(showInviteCode)
.showInviteCode(showInviteCodeAndInviter.getLeft())
.inviteeUidNum(inviteeUidList.size())
.finishedOrderNum(orderNumMap.values().stream().collect(Collectors.summingInt(Integer::intValue)))
.inviteRecordList(getInviteRecordList(inviteRecords, orderNumMap, nickNameMap))
... ... @@ -223,21 +232,21 @@ public class InviteServiceImpl implements IInviteService {
}
return InviteInfoResp.builder().uid(uid).showInviteCode(showInviteCode).build();
return InviteInfoResp.builder().uid(uid).showInviteCode(showInviteCodeAndInviter.getLeft()).build();
}
private List<InviteInfoResp.InviteRecord> getInviteRecordList(List<InviteRecord> inviteRecords,
Map<Integer, Integer> orderNumMap,
Map<Integer, String> nickNameMap) {
return inviteRecords.stream().map(x ->{
return InviteInfoResp.InviteRecord.builder()
return inviteRecords.stream()
.map(x -> InviteInfoResp.InviteRecord.builder()
.inviteeUid(x.getInviteeUid())
.nickName(Objects.isNull(nickNameMap.get(x.getInviteeUid())) ? "" : nickNameMap.get(x.getInviteeUid()))
.enterTime(DateUtil.formatYYMMddHHmmssPoint(x.getCreateTime()))
.orderNum(Objects.isNull(orderNumMap.get(x.getInviteeUid())) ? 0 : orderNumMap.get(x.getInviteeUid()))
.build();
}).collect(Collectors.toList());
.build())
.collect(Collectors.toList());
}
/**
... ... @@ -245,7 +254,7 @@ public class InviteServiceImpl implements IInviteService {
* @param uid
* @return
*/
private String getShowInviteCode(int uid) {
private Pair<String,List<Inviter>> getShowInviteCode(int uid) {
// 查看是否已经有邀请码
List<Inviter> inviters = inviterMapper.selectInviteCodeByUid(uid);
... ... @@ -272,7 +281,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,13 +297,13 @@ 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;
}
}
return lastShowInvite;
return Pair.of(lastShowInvite,inviters);
}
... ... @@ -318,7 +327,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 +338,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
... ...
... ... @@ -13,8 +13,8 @@ import com.yohoufo.order.common.Payment;
import com.yohoufo.order.constants.InviteConstant;
import com.yohoufo.order.model.request.InviteSettlementItemCreateRequest;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.tuple.Pair;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.tuple.Pair;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
... ...
... ... @@ -69,7 +69,9 @@ public class InviteSettlementServiceImpl implements IInviteSettlementService {
public InviteSettlementListVO getInviteSettlementList(Integer uid) {
// build bo
List<InviteSettlement> inviteSettlementList = inviteSettlementMapper.selectByUidAndStatusWithLimit(uid, InviteSettlement.STATUS_PAID, 0, 100);
List<InviteSettlement> inviteSettlementList = inviteSettlementMapper.selectByUidAndStatusWithLimit(uid, InviteSettlement.STATUS_PAID, 0, 100).stream()
.filter(settlement -> InviteSettlement.SETTLE_TYPE_STORED == settlement.getSettleType())
.collect(Collectors.toList());
// build vo
... ... @@ -192,9 +194,7 @@ public class InviteSettlementServiceImpl implements IInviteSettlementService {
@Override
public void settle() {
inviterMapper.selectAll().stream()
.map(Inviter::getUid)
.distinct()
.forEach(uid -> inviterSettleService.settle(uid));
.forEach(inviterSettleService::settle);
}
@Override
... ...
... ... @@ -14,6 +14,9 @@ import com.yohoufo.dal.order.model.InviteSettlementItem;
import com.yohoufo.dal.order.model.InviteSettlementItemStats;
import com.yohoufo.order.model.bo.BankCard;
import com.yohoufo.order.service.proxy.BankCardService;
import com.yohoufo.dal.order.InviterMapper;
import com.yohoufo.dal.order.model.*;
import com.yohoufo.order.common.InviterType;
import com.yohoufo.order.utils.IdUtils;
import com.yohoufo.order.utils.InviteSettlementUtils;
import lombok.extern.slf4j.Slf4j;
... ... @@ -50,11 +53,22 @@ public class InviterSettleService {
@Autowired
private InviteRecordMapper inviteRecordMapper;
public void settle(int uid) {
log.info("settle for {}", uid);
@Autowired
private InviterMapper inviterMapper;
public void settle(Integer uid) {
inviterMapper.selectInviteCodeByUid(uid)
.forEach(this::settle);
}
public void settle(Inviter inviter) {
log.info("settle for {}", inviter);
int uid = inviter.getUid();
int now = DateUtil.getCurrentTimeSecond();
int inviterType = inviter.getType();
int settleType = inviterType == InviterType.CLASS_B_AGENT.getType() ? InviteSettlement.SETTLE_TYPE_AGENT : InviteSettlement.SETTLE_TYPE_STORED;
// 检查有没有要结算的记录
InviteSettlementItem settlementItem = inviteSettlementItemMapper.selectOneByUidAndStatus(uid, InviteSettlementItem.STATUS_ENABLE);
InviteSettlementItem settlementItem = inviteSettlementItemMapper.selectOneByUidTypeAndStatus(uid, settleType, InviteSettlementItem.STATUS_ENABLE);
if (Objects.isNull(settlementItem)) {
log.info("settle for {} end it has no item to settle.", uid);
return;
... ... @@ -69,6 +83,7 @@ public class InviterSettleService {
InviteSettlement settlement = new InviteSettlement();
settlement.setUid(uid);
settlement.setCreateTime(now);
settlement.setSettleType(settleType);
settlement.setSettleCode(0);
settlement.setSettleAmount(BigDecimal.ZERO);
settlement.setSettleTime(0);
... ... @@ -85,7 +100,7 @@ public class InviterSettleService {
.withStopStrategy(StopStrategies.stopAfterAttempt(3))
.withWaitStrategy(WaitStrategies.fixedWait(50, TimeUnit.MILLISECONDS))
.build().call(() -> {
updateSettleAmount(uid, settlement);
updateSettleAmount(uid, settleType, settlement);
return null;
});
} catch (ExecutionException | RetryException e) {
... ... @@ -94,20 +109,24 @@ public class InviterSettleService {
log.info("settle for {} end settle amount for settlement {} is {}.", uid, settlement.getId(), settlement.getSettleAmount());
}
private void updateSettleAmount(int uid, InviteSettlement settlement) {
private void updateSettleAmount(int uid, int settleType, InviteSettlement settlement) {
int settlementId = settlement.getId();
log.info("settle for {} calculate settle amount for settlement {}.", uid, settlementId);
// type1方式结算金额
BigDecimal settleAmountOfType1 = calculateSettleAmountOfType1(uid, settlementId);
log.info("settle for {} calculate settle amount for settlement {}, the amount of type1 is {}.",
uid, settlementId, settleAmountOfType1);
// type2方式结算金额
BigDecimal settleAmountOfType2 = calculateSettleAmountOfType2(uid, settlementId);
log.info("settle for {} calculate settle amount for settlement {}, the amount of type2 is {}.",
uid, settlementId, settleAmountOfType2);
BigDecimal settleAmount;
if (settleType == InviteSettlement.SETTLE_TYPE_AGENT) {
// type1方式结算金额
settleAmount = calculateSettleAmountOfType1(uid, settlementId);
log.info("settle for {} calculate settle amount for settlement {}, the amount of type1 is {}.",
uid, settlementId, settleAmount);
} else {
// type2方式结算金额
settleAmount = calculateSettleAmountOfType2(uid, settlementId);
log.info("settle for {} calculate settle amount for settlement {}, the amount of type2 is {}.",
uid, settlementId, settleAmount);
}
// 更新结算金额
settlement.setSettleCode(IdUtils.derangement(settlementId));
settlement.setSettleAmount(settleAmountOfType1.add(settleAmountOfType2));
settlement.setSettleAmount(settleAmount);
settlement.setSettleTime(DateUtil.getCurrentTimeSecond());
settlement.setStatus(InviteSettlement.STATUS_WAIT_PAY);
inviteSettlementMapper.updateByUidAndId(settlement);
... ...
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:
... ...
... ... @@ -117,6 +117,4 @@ offline.store.seller=${offline.store.seller}
ip.port.uic.server = ${ip.port.uic.server}
ufo.nfc.syncBlockChain.url=${ufo.nfc.syncBlockChain.url}
ufo.invite.productSortLimit=16,20,40
\ No newline at end of file
ufo.nfc.syncBlockChain.url=${ufo.nfc.syncBlockChain.url}
\ No newline at end of file
... ...
... ... @@ -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:
... ...