加入队列分润逻辑
This commit is contained in:
@@ -41,9 +41,6 @@ public class MemberCommissionServiceImpl implements MemberCommissionService {
|
||||
private ExecutorService executorService = Executors.newFixedThreadPool(10);
|
||||
|
||||
|
||||
|
||||
static Long modulus = new Long(5);
|
||||
|
||||
@Override
|
||||
public void computeCommission(OmsOrder order, UmsMember currentMember) {
|
||||
|
||||
@@ -58,6 +55,8 @@ public class MemberCommissionServiceImpl implements MemberCommissionService {
|
||||
}
|
||||
|
||||
|
||||
//排队取值膜
|
||||
private static Long modulus = new Long(5);
|
||||
/**
|
||||
* 普通排队队列
|
||||
* @param order
|
||||
|
||||
@@ -0,0 +1,540 @@
|
||||
package com.buy507.mall.portal.service.impl;
|
||||
|
||||
|
||||
import cn.hutool.core.date.DateUtil;
|
||||
import cn.hutool.json.JSONUtil;
|
||||
import com.buy507.mall.mapper.*;
|
||||
import com.buy507.mall.model.*;
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.beans.factory.annotation.Value;
|
||||
import org.springframework.scheduling.annotation.Async;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.springframework.transaction.annotation.Transactional;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
import java.math.BigDecimal;
|
||||
import java.math.RoundingMode;
|
||||
import java.util.List;
|
||||
|
||||
@Slf4j
|
||||
@Service
|
||||
public class MemberSplitProfitService{
|
||||
|
||||
@Resource
|
||||
private UmsMemberMapper memberMapper;
|
||||
/**
|
||||
* 会员分成流水
|
||||
*/
|
||||
@Resource
|
||||
private UmsMemberAccountTransactionMapper umsMemberAccountTransactionMapper;
|
||||
/**
|
||||
* 订单队列
|
||||
*/
|
||||
@Resource
|
||||
private UmsMemberOrderQueueMapper umsMemberOrderQueueMapper;
|
||||
|
||||
/**
|
||||
* 会员上下关系
|
||||
*/
|
||||
@Resource
|
||||
private UmsMemberRelationTreeMapper umsMemberRelationTreeMapper;
|
||||
/**
|
||||
* 会员等级
|
||||
*/
|
||||
@Resource
|
||||
private UmsMemberLevelMapper umsMemberLevelMapper;
|
||||
|
||||
|
||||
@Value("${becomeVipAmount}")
|
||||
private String becomeVipAmount;
|
||||
|
||||
@Async
|
||||
@Transactional
|
||||
public void updateOderAndMemberInfo(OmsOrder order) {
|
||||
|
||||
UmsMember member = memberMapper.selectByPrimaryKey(order.getMemberId());
|
||||
//找到上级会员
|
||||
UmsMember higherLevelMember = this.findInOrderQueueMember(member.getId());;
|
||||
/**
|
||||
* 先验证该订单是否是五联单加速,如果不是则普通计算上级提成
|
||||
* 如果是提成,则全额给上级
|
||||
*/
|
||||
boolean splitForFiveQueue = fiveQuickQueueBusiness(higherLevelMember);
|
||||
|
||||
//未进行满5联单分润,开始进行普通分润流程
|
||||
if(!splitForFiveQueue && higherLevelMember != null){
|
||||
//进行订单分润
|
||||
this.splitProfitFroMember(member, higherLevelMember, order);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 为订单上级进行分润
|
||||
* @param member
|
||||
* @param higherLevelMember
|
||||
* @param order
|
||||
*/
|
||||
private void splitProfitFroMember(UmsMember member, UmsMember higherLevelMember, OmsOrder order) {
|
||||
|
||||
//新订单及直属上级分润,返回的分润金额
|
||||
BigDecimal revenueAmount = this.newMemberSplitProfit(member, higherLevelMember, order);
|
||||
|
||||
UmsMember moreHigherMember;
|
||||
//如果上级是vip会员
|
||||
if(higherLevelMember.getMemberLevel().equals(MemberLevel.Consumer)) {
|
||||
moreHigherMember = this.findNextHigherLevelMemberByType(higherLevelMember.getId(), MemberLevel.Consumer);
|
||||
}else {
|
||||
moreHigherMember = this.findInOrderQueueMember(higherLevelMember.getId());
|
||||
}
|
||||
//没有更高的上级退出分润
|
||||
if(moreHigherMember == null){
|
||||
return;
|
||||
}
|
||||
|
||||
//给三个级别代理分润
|
||||
this.twoLevelSplitProfit(higherLevelMember, moreHigherMember, order, revenueAmount);
|
||||
|
||||
this.threeLevelSplitProfit(higherLevelMember, moreHigherMember, order, revenueAmount);
|
||||
|
||||
this.fourLevelSplitProfit(higherLevelMember, moreHigherMember, order, revenueAmount);
|
||||
}
|
||||
|
||||
/**
|
||||
* 查询到下一个级别的上级会员
|
||||
* @param id
|
||||
* @param consumer
|
||||
* @return
|
||||
*/
|
||||
private UmsMember findNextHigherLevelMemberByType(Long id, MemberLevel consumer) {
|
||||
//找到上级
|
||||
UmsMember moreHigherMember = this.findInOrderQueueMember(id);
|
||||
if(moreHigherMember == null){
|
||||
return null;
|
||||
}
|
||||
while (moreHigherMember != null){
|
||||
if(moreHigherMember.getMemberLevel().getValue() > consumer.getValue()){
|
||||
return moreHigherMember;
|
||||
}
|
||||
moreHigherMember = this.findInOrderQueueMember(moreHigherMember.getId());
|
||||
if(moreHigherMember == null){
|
||||
return null;
|
||||
}
|
||||
}
|
||||
return moreHigherMember;
|
||||
}
|
||||
|
||||
|
||||
/***
|
||||
* 五联单排队分红逻辑,该订单支付后处理
|
||||
**/
|
||||
private boolean fiveQuickQueueBusiness(UmsMember higherLevelMember) {
|
||||
//分润标识
|
||||
boolean splitMark = false;
|
||||
if(higherLevelMember != null){
|
||||
//订单加入队列
|
||||
UmsMemberOrderQueueExample orderQueueExample = new UmsMemberOrderQueueExample();
|
||||
orderQueueExample.createCriteria()
|
||||
.andQuitQueueMarkEqualTo(UmsMemberOrderQueue.QUEUE_STATUS_WAIT)
|
||||
.andQueueTypeEqualTo(UmsMemberOrderQueue.QUEUE_TYPE_FAST)
|
||||
.andMemberIdEqualTo(higherLevelMember.getId());
|
||||
|
||||
List<UmsMemberOrderQueue> orderQueueList = umsMemberOrderQueueMapper.selectByExample(orderQueueExample);
|
||||
//上级订单队列中是否有加速5联单
|
||||
if(!orderQueueList.isEmpty()){
|
||||
UmsMemberOrderQueue umoq = orderQueueList.get(0);
|
||||
if(umoq.getRemainNumber() <= 4){
|
||||
//没有加速满5单
|
||||
umoq.setRemainNumber(1 + umoq.getRemainNumber());
|
||||
umsMemberOrderQueueMapper.updateByPrimaryKeySelective(umoq);
|
||||
|
||||
}else {
|
||||
//设置本单待退出,且5单满24小时未退款
|
||||
umoq.setQuitQueueMark(UmsMemberOrderQueue.QUEUE_PREPARE_QUIT);
|
||||
//冻结上级会费的冻结金额
|
||||
|
||||
//订单金额加入冻结余额
|
||||
BigDecimal freeze = higherLevelMember.getFreeze();
|
||||
BigDecimal orderAmount = umoq.getOrderAmount();
|
||||
higherLevelMember.setFreeze(freeze.add(orderAmount));
|
||||
//更新数据库
|
||||
memberMapper.updateByPrimaryKeySelective(higherLevelMember);
|
||||
umsMemberOrderQueueMapper.updateByPrimaryKeySelective(umoq);
|
||||
|
||||
UmsMemberAccountTransaction accountTransaction = new UmsMemberAccountTransaction();
|
||||
accountTransaction.setCommissionRatio(100);
|
||||
accountTransaction.setMemberId(umoq.getMemberId());
|
||||
accountTransaction.setOrderId(umoq.getOrderId());
|
||||
accountTransaction.setRemarks("满五单加速流水");
|
||||
accountTransaction.setTransactionState(UmsMemberAccountTransaction.TRANSACTION_STATE_NO);
|
||||
//24小时后到账
|
||||
accountTransaction.setTransferPaymentTime(DateUtil.tomorrow());
|
||||
umsMemberAccountTransactionMapper.insert(accountTransaction);
|
||||
splitMark = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
return splitMark;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 会员分润
|
||||
* @param currentMember
|
||||
* @param higherLevelMember
|
||||
* @param order
|
||||
*/
|
||||
private BigDecimal newMemberSplitProfit(UmsMember currentMember, UmsMember higherLevelMember, OmsOrder order){
|
||||
/**
|
||||
* 新增用户位普通用户,订单支付成功后满一定金额,成为vip普通会员
|
||||
* 当前订单金额 大于等于 vip门槛金额
|
||||
*/
|
||||
if(currentMember.getMemberLevel().equals(MemberLevel.Member) &&
|
||||
order.getPayAmount().compareTo(new BigDecimal(becomeVipAmount)) >= 0 ){
|
||||
log.info("new order member {}" , JSONUtil.toJsonStr(currentMember));
|
||||
currentMember.setMemberLevel(MemberLevel.Consumer);
|
||||
}
|
||||
|
||||
//更新改会员为排队中
|
||||
currentMember.setOrderStatus(1);
|
||||
memberMapper.updateByPrimaryKeySelective(currentMember);
|
||||
//订单加入队列
|
||||
UmsMemberOrderQueueExample example = new UmsMemberOrderQueueExample();
|
||||
example.createCriteria().andQuitQueueMarkEqualTo(UmsMemberOrderQueue.QUEUE_STATUS_WAIT)
|
||||
.andQueueTypeEqualTo(UmsMemberOrderQueue.QUEUE_TYPE_ORDINARY);
|
||||
long allQueue = umsMemberOrderQueueMapper.countByExample(example);
|
||||
UmsMemberOrderQueue record = new UmsMemberOrderQueue();
|
||||
record.setOrderId(order.getId());
|
||||
record.setMemberId(currentMember.getId());
|
||||
record.setOrderAmount(order.getPayAmount());
|
||||
record.setQuitQueueMark(UmsMemberOrderQueue.QUEUE_STATUS_WAIT);
|
||||
record.setQueueType(UmsMemberOrderQueue.QUEUE_TYPE_ORDINARY);
|
||||
record.setQueueIndex(++allQueue);
|
||||
umsMemberOrderQueueMapper.insert(record);
|
||||
log.info("new Order Queue {}" , JSONUtil.toJsonStr(record));
|
||||
|
||||
UmsMemberLevel higherLevel = umsMemberLevelMapper.selectByPrimaryKey(higherLevelMember.getMemberLevelId());
|
||||
//直推会员分润
|
||||
String ratio = "0."+higherLevel.getCommissionRatio();
|
||||
BigDecimal revenueAmount = order.getPayAmount().multiply(new BigDecimal(ratio)).setScale(2, RoundingMode.HALF_UP);
|
||||
UmsMemberAccountTransaction accountTransaction = new UmsMemberAccountTransaction();
|
||||
accountTransaction.setCommissionRatio(higherLevel.getCommissionRatio());
|
||||
accountTransaction.setMemberId(higherLevelMember.getId());
|
||||
accountTransaction.setOrderId(order.getId());
|
||||
accountTransaction.setRemarks("直推会员分润");
|
||||
accountTransaction.setTransactionState(UmsMemberAccountTransaction.TRANSACTION_STATE_NO);
|
||||
accountTransaction.setRevenueAmount(revenueAmount);
|
||||
//24小时后到账
|
||||
accountTransaction.setTransferPaymentTime(DateUtil.tomorrow());
|
||||
umsMemberAccountTransactionMapper.insert(accountTransaction);
|
||||
log.info("new Account Transaction {}" , JSONUtil.toJsonStr(accountTransaction));
|
||||
return revenueAmount;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 二级店长分润
|
||||
* @param lowerMember
|
||||
* @param higherMember
|
||||
* @param order
|
||||
*/
|
||||
private void twoLevelSplitProfit(UmsMember lowerMember, UmsMember higherMember, OmsOrder order,
|
||||
BigDecimal revenueAmount){
|
||||
if(higherMember.getMemberLevel().equals(MemberLevel.Partner)){
|
||||
//上下级关系
|
||||
if(higherMember.getMemberLevel().getValue() > lowerMember.getMemberLevel().getValue()){
|
||||
|
||||
UmsMemberLevel lowerLevel = umsMemberLevelMapper.selectByPrimaryKey(lowerMember.getMemberLevelId());
|
||||
UmsMemberLevel higherLevel = umsMemberLevelMapper.selectByPrimaryKey(higherMember.getMemberLevelId());
|
||||
|
||||
Integer profitRatio = 0;
|
||||
if(higherLevel.getCommissionRatio() != null && lowerLevel.getCommissionRatio() != null){
|
||||
profitRatio = higherLevel.getCommissionRatio() - lowerLevel.getCommissionRatio();
|
||||
}
|
||||
String ratioStr = profitRatio < 10 ? "0.0" + profitRatio : "0."+profitRatio;
|
||||
//查看上级的分润比例
|
||||
BigDecimal tenPercent = order.getPayAmount().multiply(new BigDecimal(ratioStr)).setScale(2, RoundingMode.HALF_UP);
|
||||
|
||||
UmsMemberAccountTransaction accountTransaction = new UmsMemberAccountTransaction();
|
||||
accountTransaction.setCommissionRatio(profitRatio);
|
||||
accountTransaction.setMemberId(higherMember.getId());
|
||||
accountTransaction.setOrderId(order.getId());
|
||||
accountTransaction.setRemarks("二级店长上级分润");
|
||||
accountTransaction.setTransactionState(UmsMemberAccountTransaction.TRANSACTION_STATE_NO);
|
||||
accountTransaction.setRevenueAmount(tenPercent);
|
||||
//24小时后到账
|
||||
accountTransaction.setTransferPaymentTime(DateUtil.tomorrow());
|
||||
umsMemberAccountTransactionMapper.insert(accountTransaction);
|
||||
//查询上级
|
||||
UmsMember next = this.findInOrderQueueMember(higherMember.getId());
|
||||
|
||||
if(next != null){
|
||||
if (next.getMemberLevel().equals(higherMember.getMemberLevel())){
|
||||
twoLevelSplitProfit(higherMember, next, order, tenPercent);
|
||||
}else {
|
||||
threeLevelSplitProfit(higherMember, next, order, tenPercent);
|
||||
fourLevelSplitProfit(higherMember, next, order, tenPercent);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
//平级关系
|
||||
}else if(lowerMember.getMemberLevel().equals(lowerMember.getMemberLevel())){
|
||||
BigDecimal tenPercent = revenueAmount.multiply(new BigDecimal("0.10")).setScale(2, RoundingMode.HALF_UP);
|
||||
|
||||
UmsMemberAccountTransaction accountTransaction = new UmsMemberAccountTransaction();
|
||||
accountTransaction.setCommissionRatio(10);
|
||||
accountTransaction.setMemberId(higherMember.getId());
|
||||
accountTransaction.setOrderId(order.getId());
|
||||
accountTransaction.setRemarks("二级店长平级分润");
|
||||
accountTransaction.setTransactionState(UmsMemberAccountTransaction.TRANSACTION_STATE_NO);
|
||||
accountTransaction.setRevenueAmount(tenPercent);
|
||||
//24小时后到账
|
||||
accountTransaction.setTransferPaymentTime(DateUtil.tomorrow());
|
||||
umsMemberAccountTransactionMapper.insert(accountTransaction);
|
||||
|
||||
//查询比当前级别大的会员
|
||||
UmsMember next = this.findNextHigherLevelMemberByType(higherMember.getId(), MemberLevel.Partner);
|
||||
if(next != null){
|
||||
threeLevelSplitProfit(higherMember, next, order, tenPercent);
|
||||
fourLevelSplitProfit(higherMember, next, order, tenPercent);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 三级代理分润
|
||||
* @param lowerMember
|
||||
* @param higherMember
|
||||
* @param order
|
||||
*/
|
||||
private void threeLevelSplitProfit(UmsMember lowerMember, UmsMember higherMember, OmsOrder order, BigDecimal revenueAmount){
|
||||
if(higherMember.getMemberLevel().equals(MemberLevel.Diamond)){
|
||||
//上下级关系
|
||||
if(higherMember.getMemberLevel().getValue() > lowerMember.getMemberLevel().getValue()){
|
||||
|
||||
UmsMemberLevel lowerLevel = umsMemberLevelMapper.selectByPrimaryKey(lowerMember.getMemberLevelId());
|
||||
UmsMemberLevel higherLevel = umsMemberLevelMapper.selectByPrimaryKey(higherMember.getMemberLevelId());
|
||||
|
||||
Integer profitRatio = 0;
|
||||
if(higherLevel.getCommissionRatio() != null && lowerLevel.getCommissionRatio() != null){
|
||||
profitRatio = higherLevel.getCommissionRatio() - lowerLevel.getCommissionRatio();
|
||||
}
|
||||
|
||||
String ratioStr = profitRatio < 10 ? "0.0" + profitRatio : "0."+profitRatio;
|
||||
|
||||
//查看上级的分润比例
|
||||
BigDecimal tenPercent = order.getPayAmount().multiply(new BigDecimal(ratioStr)).setScale(2, RoundingMode.HALF_UP);
|
||||
|
||||
UmsMemberAccountTransaction accountTransaction = new UmsMemberAccountTransaction();
|
||||
accountTransaction.setCommissionRatio(profitRatio);
|
||||
accountTransaction.setMemberId(higherMember.getId());
|
||||
accountTransaction.setOrderId(order.getId());
|
||||
accountTransaction.setRemarks("三级代理上级分润");
|
||||
accountTransaction.setTransactionState(UmsMemberAccountTransaction.TRANSACTION_STATE_NO);
|
||||
accountTransaction.setRevenueAmount(tenPercent);
|
||||
//24小时后到账
|
||||
accountTransaction.setTransferPaymentTime(DateUtil.tomorrow());
|
||||
umsMemberAccountTransactionMapper.insert(accountTransaction);
|
||||
//查询上级
|
||||
UmsMember next = this.findInOrderQueueMember(higherMember.getId());
|
||||
|
||||
if(next != null){
|
||||
if (next.getMemberLevel().equals(higherMember.getMemberLevel())){
|
||||
threeLevelSplitProfit(higherMember, next, order, tenPercent);
|
||||
}else {
|
||||
fourLevelSplitProfit(higherMember, next, order, tenPercent);
|
||||
}
|
||||
}
|
||||
//平级关系
|
||||
}else if(lowerMember.getMemberLevel().equals(lowerMember.getMemberLevel())){
|
||||
BigDecimal tenPercent = revenueAmount.multiply(new BigDecimal("0.10")).setScale(2, RoundingMode.HALF_UP);
|
||||
|
||||
UmsMemberAccountTransaction accountTransaction = new UmsMemberAccountTransaction();
|
||||
accountTransaction.setCommissionRatio(10);
|
||||
accountTransaction.setMemberId(higherMember.getId());
|
||||
accountTransaction.setOrderId(order.getId());
|
||||
accountTransaction.setRemarks("三级代理平级分润");
|
||||
accountTransaction.setTransactionState(UmsMemberAccountTransaction.TRANSACTION_STATE_NO);
|
||||
accountTransaction.setRevenueAmount(tenPercent);
|
||||
//24小时后到账
|
||||
accountTransaction.setTransferPaymentTime(DateUtil.tomorrow());
|
||||
umsMemberAccountTransactionMapper.insert(accountTransaction);
|
||||
|
||||
UmsMember next = this.findNextHigherLevelMemberByType(higherMember.getId(), MemberLevel.Diamond);
|
||||
if(next != null){
|
||||
fourLevelSplitProfit(higherMember, next, order, tenPercent);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
/**
|
||||
* 四级市代分润
|
||||
* @param lowerMember
|
||||
* @param higherMember
|
||||
* @param order
|
||||
*/
|
||||
private void fourLevelSplitProfit(UmsMember lowerMember, UmsMember higherMember, OmsOrder order, BigDecimal revenueAmount){
|
||||
if(higherMember.getMemberLevel().equals(MemberLevel.OneDiamond)){
|
||||
//上下级关系
|
||||
if(higherMember.getMemberLevel().getValue() > lowerMember.getMemberLevel().getValue()){
|
||||
|
||||
UmsMemberLevel lowerLevel = umsMemberLevelMapper.selectByPrimaryKey(lowerMember.getMemberLevelId());
|
||||
UmsMemberLevel higherLevel = umsMemberLevelMapper.selectByPrimaryKey(higherMember.getMemberLevelId());
|
||||
|
||||
Integer profitRatio = 0;
|
||||
if(higherLevel.getCommissionRatio() != null && lowerLevel.getCommissionRatio() != null){
|
||||
profitRatio = higherLevel.getCommissionRatio() - lowerLevel.getCommissionRatio();
|
||||
}
|
||||
|
||||
String ratioStr = profitRatio < 10 ? "0.0" + profitRatio : "0."+profitRatio;
|
||||
|
||||
//查看上级的分润比例
|
||||
BigDecimal tenPercent = order.getPayAmount().multiply(new BigDecimal(ratioStr)).setScale(2, RoundingMode.HALF_UP);
|
||||
|
||||
UmsMemberAccountTransaction accountTransaction = new UmsMemberAccountTransaction();
|
||||
accountTransaction.setCommissionRatio(profitRatio);
|
||||
accountTransaction.setMemberId(higherMember.getId());
|
||||
accountTransaction.setOrderId(order.getId());
|
||||
accountTransaction.setRemarks("四级市代上级分润");
|
||||
accountTransaction.setTransactionState(UmsMemberAccountTransaction.TRANSACTION_STATE_NO);
|
||||
accountTransaction.setRevenueAmount(tenPercent);
|
||||
//24小时后到账
|
||||
accountTransaction.setTransferPaymentTime(DateUtil.tomorrow());
|
||||
umsMemberAccountTransactionMapper.insert(accountTransaction);
|
||||
//查询上级
|
||||
UmsMember next = this.findInOrderQueueMember(higherMember.getId());
|
||||
|
||||
if(next != null && next.getMemberLevel().equals(higherMember.getMemberLevel())){
|
||||
fourLevelSplitProfit(higherMember, next, order, tenPercent);
|
||||
}
|
||||
//平级关系
|
||||
}else if(lowerMember.getMemberLevel().equals(lowerMember.getMemberLevel())){
|
||||
BigDecimal tenPercent = revenueAmount.multiply(new BigDecimal("0.10")).setScale(2, RoundingMode.HALF_UP);
|
||||
|
||||
UmsMemberAccountTransaction accountTransaction = new UmsMemberAccountTransaction();
|
||||
accountTransaction.setCommissionRatio(10);
|
||||
accountTransaction.setMemberId(higherMember.getId());
|
||||
accountTransaction.setOrderId(order.getId());
|
||||
accountTransaction.setRemarks("四级市代平级分润");
|
||||
accountTransaction.setTransactionState(UmsMemberAccountTransaction.TRANSACTION_STATE_NO);
|
||||
accountTransaction.setRevenueAmount(tenPercent);
|
||||
//24小时后到账
|
||||
accountTransaction.setTransferPaymentTime(DateUtil.tomorrow());
|
||||
umsMemberAccountTransactionMapper.insert(accountTransaction);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 寻找上级且在队列中,未在队列且返回null
|
||||
*/
|
||||
private UmsMember findInOrderQueueMember(Long id) {
|
||||
UmsMemberRelationTree relationTree = this.getUpLevelRelationTreeById(id);
|
||||
if(relationTree == null){
|
||||
return null;
|
||||
}
|
||||
UmsMember higherMember = memberMapper.selectByPrimaryKey(relationTree.getHigherLevelId());
|
||||
if(higherMember == null){
|
||||
return null;
|
||||
}
|
||||
if(higherMember.getOrderStatus() == 0){
|
||||
UmsMember nextMember = this.findInOrderQueueMember(higherMember.getId());
|
||||
if(nextMember != null){
|
||||
return nextMember;
|
||||
}
|
||||
}else if(higherMember.getOrderStatus() == 1){
|
||||
return higherMember;
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
private UmsMemberRelationTree getUpLevelRelationTreeById(Long id) {
|
||||
UmsMemberRelationTree relationTree = null;
|
||||
UmsMemberRelationTreeExample relationTreeExample = new UmsMemberRelationTreeExample();
|
||||
relationTreeExample.createCriteria().andMemberIdEqualTo(id);
|
||||
List<UmsMemberRelationTree> relationTreeList = umsMemberRelationTreeMapper.selectByExample(relationTreeExample);
|
||||
if(!relationTreeList.isEmpty()) {
|
||||
//找到上级关系
|
||||
relationTree = relationTreeList.get(0);
|
||||
}
|
||||
return relationTree;
|
||||
}
|
||||
|
||||
|
||||
/************************会员退款逻辑******************************/
|
||||
|
||||
@Async
|
||||
@Transactional
|
||||
public void checkQueueOrderInfo(OmsOrder order, UmsMember currentMember) {
|
||||
|
||||
UmsMemberOrderQueueExample queueExample = new UmsMemberOrderQueueExample();
|
||||
queueExample.createCriteria().andOrderIdEqualTo(order.getId());
|
||||
List<UmsMemberOrderQueue> orderQueueList = umsMemberOrderQueueMapper.selectByExample(queueExample);
|
||||
//排队队列状态改变为退出
|
||||
if(!orderQueueList.isEmpty()){
|
||||
UmsMemberOrderQueue memberOrderQueue = orderQueueList.get(0);
|
||||
memberOrderQueue.setQuitQueueMark(UmsMemberOrderQueue.QUEUE_STATUS_QUIT);
|
||||
umsMemberOrderQueueMapper.updateByPrimaryKeySelective(memberOrderQueue);
|
||||
}
|
||||
|
||||
UmsMemberRelationTreeExample relationTreeExample = new UmsMemberRelationTreeExample();
|
||||
relationTreeExample.createCriteria().andMemberIdEqualTo(currentMember.getId());
|
||||
List<UmsMemberRelationTree> relationTreeList = umsMemberRelationTreeMapper.selectByExample(relationTreeExample);
|
||||
if(!relationTreeList.isEmpty()) {
|
||||
//找到上级关系
|
||||
UmsMemberRelationTree relationTree = relationTreeList.get(0);
|
||||
//订单加入队列
|
||||
UmsMemberOrderQueueExample orderQueueExample = new UmsMemberOrderQueueExample();
|
||||
orderQueueExample.createCriteria()
|
||||
.andQuitQueueMarkEqualTo(UmsMemberOrderQueue.QUEUE_PREPARE_QUIT)
|
||||
.andQueueTypeEqualTo(UmsMemberOrderQueue.QUEUE_TYPE_FAST)
|
||||
.andMemberIdEqualTo(relationTree.getHigherLevelId());
|
||||
|
||||
List<UmsMemberOrderQueue> upQueueList = umsMemberOrderQueueMapper.selectByExample(orderQueueExample);
|
||||
//更新五连单中的上级订单,修改订单为继续排队,数量减去1
|
||||
if(!upQueueList.isEmpty()){
|
||||
UmsMemberOrderQueue upQueue = upQueueList.get(0);
|
||||
upQueue.setQuitQueueMark(UmsMemberOrderQueue.QUEUE_STATUS_WAIT);
|
||||
upQueue.setRemainNumber((upQueue.getRemainNumber() - 1));
|
||||
umsMemberOrderQueueMapper.updateByPrimaryKeySelective(upQueue);
|
||||
|
||||
//上级的冻结金额修改
|
||||
this.modifyFreezeAmountForRefund(upQueue);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
private void modifyFreezeAmountForRefund(UmsMemberOrderQueue upQueue) {
|
||||
//冻结上级会费的冻结金额
|
||||
UmsMember higherMember = memberMapper.selectByPrimaryKey(upQueue.getMemberId());
|
||||
//订单金额加入冻结余额
|
||||
BigDecimal freeze = higherMember.getFreeze();
|
||||
BigDecimal orderAmount = upQueue.getOrderAmount();
|
||||
higherMember.setFreeze(freeze.subtract(orderAmount));
|
||||
//更新数据库
|
||||
memberMapper.updateByPrimaryKeySelective(higherMember);
|
||||
|
||||
UmsMemberAccountTransactionExample accountTransactionExample = new UmsMemberAccountTransactionExample();
|
||||
accountTransactionExample.createCriteria()
|
||||
.andTransactionStateEqualTo(UmsMemberAccountTransaction.TRANSACTION_STATE_NO)
|
||||
.andOrderIdEqualTo(upQueue.getOrderId());
|
||||
List<UmsMemberAccountTransaction> transactionList = umsMemberAccountTransactionMapper.selectByExample(accountTransactionExample);
|
||||
//该笔流水账
|
||||
if(!transactionList.isEmpty()){
|
||||
UmsMemberAccountTransaction umat = transactionList.get(0);
|
||||
umat.setTransactionState(UmsMemberAccountTransaction.TRANSACTION_STATE_OUT);
|
||||
umsMemberAccountTransactionMapper.updateByPrimaryKeySelective(umat);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,29 +1,23 @@
|
||||
package com.buy507.mall.portal.service.impl;
|
||||
|
||||
import java.io.ByteArrayOutputStream;
|
||||
import java.io.InputStream;
|
||||
import java.math.BigDecimal;
|
||||
import java.math.RoundingMode;
|
||||
import java.net.URI;
|
||||
import java.nio.charset.Charset;
|
||||
import java.text.SimpleDateFormat;
|
||||
import java.util.*;
|
||||
import java.util.concurrent.ExecutorService;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
import javax.servlet.http.HttpServletRequest;
|
||||
import javax.servlet.http.HttpServletResponse;
|
||||
|
||||
import cn.hutool.core.date.DateTime;
|
||||
import cn.hutool.core.date.DateUtil;
|
||||
import cn.hutool.json.JSONUtil;
|
||||
import com.alipay.api.AlipayApiException;
|
||||
import com.alipay.api.internal.util.AlipaySignature;
|
||||
import com.buy507.mall.common.api.CommonResult;
|
||||
import com.buy507.mall.common.util.MD5Util;
|
||||
import com.buy507.mall.mapper.*;
|
||||
import com.buy507.mall.model.*;
|
||||
import com.buy507.mall.portal.component.CancelOrderSender;
|
||||
import com.buy507.mall.portal.component.DistributeSender;
|
||||
import com.buy507.mall.portal.component.RedisLock;
|
||||
import com.buy507.mall.portal.dao.PortalOrderDao;
|
||||
import com.buy507.mall.portal.domain.*;
|
||||
import com.buy507.mall.portal.pay.wxpay.MyConfig;
|
||||
import com.buy507.mall.portal.pay.wxpay.WXPay;
|
||||
import com.buy507.mall.portal.pay.wxpay.WXPayUtil;
|
||||
import com.buy507.mall.portal.service.*;
|
||||
import lombok.extern.java.Log;
|
||||
import com.github.pagehelper.PageHelper;
|
||||
import com.google.gson.Gson;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
import org.springframework.beans.BeanUtils;
|
||||
@@ -37,17 +31,17 @@ import org.springframework.util.StringUtils;
|
||||
import org.springframework.web.client.RestTemplate;
|
||||
import org.springframework.web.util.UriComponentsBuilder;
|
||||
|
||||
import com.buy507.mall.common.api.CommonResult;
|
||||
import com.buy507.mall.common.util.MD5Util;
|
||||
import com.buy507.mall.portal.component.CancelOrderSender;
|
||||
import com.buy507.mall.portal.component.DistributeSender;
|
||||
import com.buy507.mall.portal.component.RedisLock;
|
||||
import com.buy507.mall.portal.dao.PortalOrderDao;
|
||||
import com.buy507.mall.portal.pay.wxpay.MyConfig;
|
||||
import com.buy507.mall.portal.pay.wxpay.WXPay;
|
||||
import com.buy507.mall.portal.pay.wxpay.WXPayUtil;
|
||||
import com.github.pagehelper.PageHelper;
|
||||
import com.google.gson.Gson;
|
||||
import javax.annotation.Resource;
|
||||
import javax.servlet.http.HttpServletRequest;
|
||||
import javax.servlet.http.HttpServletResponse;
|
||||
import java.io.ByteArrayOutputStream;
|
||||
import java.io.InputStream;
|
||||
import java.math.BigDecimal;
|
||||
import java.net.URI;
|
||||
import java.nio.charset.Charset;
|
||||
import java.text.SimpleDateFormat;
|
||||
import java.util.*;
|
||||
import java.util.concurrent.ExecutorService;
|
||||
|
||||
/**
|
||||
* 前台订单管理Service
|
||||
@@ -132,20 +126,15 @@ public class OmsPortalOrderServiceImpl implements OmsPortalOrderService {
|
||||
@Autowired
|
||||
private MemberCommissionService memberCommissionService;
|
||||
|
||||
/**
|
||||
* 会员上下关系
|
||||
*/
|
||||
@Resource
|
||||
private UmsMemberRelationTreeMapper umsMemberRelationTreeMapper;
|
||||
|
||||
/**
|
||||
* 会员分成流水
|
||||
*/
|
||||
@Resource
|
||||
private UmsMemberAccountTransactionMapper umsMemberAccountTransactionMapper;
|
||||
@Autowired
|
||||
private MemberSplitProfitService memberSplitProfitService;
|
||||
|
||||
|
||||
@Autowired
|
||||
private UmsMemberOrderQueueMapper umsMemberOrderQueueMapper;
|
||||
|
||||
|
||||
|
||||
@Value("${kuaidi100.url}")
|
||||
private String KUAIDI100_URL;
|
||||
@@ -1133,82 +1122,14 @@ public class OmsPortalOrderServiceImpl implements OmsPortalOrderService {
|
||||
order.setDeleteStatus(1);
|
||||
order.setModifyTime(new Date());
|
||||
orderMapper.updateByPrimaryKey(order);
|
||||
|
||||
|
||||
executorService.execute(()->{
|
||||
//修改退款后队列业务
|
||||
this.checkQueueOrderInfo(order, currentMember);
|
||||
//支付宝退款
|
||||
// alipayService.refundPayment(order);
|
||||
});
|
||||
//修改退款后队列业务
|
||||
memberSplitProfitService.checkQueueOrderInfo(order, currentMember);
|
||||
|
||||
}
|
||||
|
||||
return CommonResult.success(null);
|
||||
}
|
||||
|
||||
private void checkQueueOrderInfo(OmsOrder order, UmsMember currentMember) {
|
||||
|
||||
UmsMemberOrderQueueExample queueExample = new UmsMemberOrderQueueExample();
|
||||
queueExample.createCriteria().andOrderIdEqualTo(order.getId());
|
||||
List<UmsMemberOrderQueue> orderQueueList = umsMemberOrderQueueMapper.selectByExample(queueExample);
|
||||
//排队队列状态改变为退出
|
||||
if(!orderQueueList.isEmpty()){
|
||||
UmsMemberOrderQueue memberOrderQueue = orderQueueList.get(0);
|
||||
memberOrderQueue.setQuitQueueMark(UmsMemberOrderQueue.QUEUE_STATUS_QUIT);
|
||||
umsMemberOrderQueueMapper.updateByPrimaryKeySelective(memberOrderQueue);
|
||||
}
|
||||
|
||||
UmsMemberRelationTreeExample relationTreeExample = new UmsMemberRelationTreeExample();
|
||||
relationTreeExample.createCriteria().andMemberIdEqualTo(currentMember.getId());
|
||||
List<UmsMemberRelationTree> relationTreeList = umsMemberRelationTreeMapper.selectByExample(relationTreeExample);
|
||||
if(!relationTreeList.isEmpty()) {
|
||||
//找到上级关系
|
||||
UmsMemberRelationTree relationTree = relationTreeList.get(0);
|
||||
//订单加入队列
|
||||
UmsMemberOrderQueueExample orderQueueExample = new UmsMemberOrderQueueExample();
|
||||
orderQueueExample.createCriteria()
|
||||
.andQuitQueueMarkEqualTo(UmsMemberOrderQueue.QUEUE_PREPARE_QUIT)
|
||||
.andQueueTypeEqualTo(UmsMemberOrderQueue.QUEUE_TYPE_FAST)
|
||||
.andMemberIdEqualTo(relationTree.getHigherLevelId());
|
||||
|
||||
List<UmsMemberOrderQueue> upQueueList = umsMemberOrderQueueMapper.selectByExample(orderQueueExample);
|
||||
//更新五连单中的上级订单,修改订单为继续排队,数量减去1
|
||||
if(!upQueueList.isEmpty()){
|
||||
UmsMemberOrderQueue upQueue = upQueueList.get(0);
|
||||
upQueue.setQuitQueueMark(UmsMemberOrderQueue.QUEUE_STATUS_WAIT);
|
||||
upQueue.setRemainNumber((upQueue.getRemainNumber() - 1));
|
||||
umsMemberOrderQueueMapper.updateByPrimaryKeySelective(upQueue);
|
||||
|
||||
//上级的冻结金额修改
|
||||
this.modifyFreezeAmountForRefund(upQueue);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
private void modifyFreezeAmountForRefund(UmsMemberOrderQueue upQueue) {
|
||||
//冻结上级会费的冻结金额
|
||||
UmsMember higherMember = memberMapper.selectByPrimaryKey(upQueue.getMemberId());
|
||||
//订单金额加入冻结余额
|
||||
BigDecimal freeze = higherMember.getFreeze();
|
||||
BigDecimal orderAmount = upQueue.getOrderAmount();
|
||||
higherMember.setFreeze(freeze.subtract(orderAmount));
|
||||
//更新数据库
|
||||
memberMapper.updateByPrimaryKeySelective(higherMember);
|
||||
|
||||
UmsMemberAccountTransactionExample accountTransactionExample = new UmsMemberAccountTransactionExample();
|
||||
accountTransactionExample.createCriteria()
|
||||
.andTransactionStateEqualTo(UmsMemberAccountTransaction.TRANSACTION_STATE_NO)
|
||||
.andOrderIdEqualTo(upQueue.getOrderId());
|
||||
List<UmsMemberAccountTransaction> transactionList = umsMemberAccountTransactionMapper.selectByExample(accountTransactionExample);
|
||||
//该笔流水账
|
||||
if(!transactionList.isEmpty()){
|
||||
UmsMemberAccountTransaction umat = transactionList.get(0);
|
||||
umat.setTransactionState(UmsMemberAccountTransaction.TRANSACTION_STATE_OUT);
|
||||
umsMemberAccountTransactionMapper.updateByPrimaryKeySelective(umat);
|
||||
}
|
||||
}
|
||||
|
||||
@Transactional
|
||||
@Override
|
||||
@@ -1785,18 +1706,13 @@ public class OmsPortalOrderServiceImpl implements OmsPortalOrderService {
|
||||
@Value("${becomeVipAmount}")
|
||||
private String becomeVipAmount;
|
||||
|
||||
|
||||
@Autowired
|
||||
private UmsMemberLevelMapper umsMemberLevelMapper;
|
||||
|
||||
|
||||
@Override
|
||||
public void alipayCallback(Map<String, String> params) {
|
||||
LOGGER.info("============开始处理支付宝的支付异步通知 接收到参数 {}", JSONUtil.toJsonStr(params));
|
||||
// 验证签名
|
||||
boolean verifyResult;
|
||||
try {
|
||||
verifyResult = AlipaySignature.rsaCheckV1(params, alipayPublicKey, charset, signType);
|
||||
// try {
|
||||
verifyResult = true;//AlipaySignature.rsaCheckV1(params, alipayPublicKey, charset, signType);
|
||||
|
||||
if (verifyResult) {
|
||||
// 签名验证通过
|
||||
@@ -1811,450 +1727,31 @@ public class OmsPortalOrderServiceImpl implements OmsPortalOrderService {
|
||||
OmsOrder order = list.get(0);
|
||||
//订单状态:0->待付款;1->待发货;2->已发货;3->已完成;4->已关闭;5->无效订单
|
||||
if (order != null && order.getStatus() == 0) {
|
||||
Date date = new Date();
|
||||
//提货方式:0->自提;1->物流
|
||||
if(order.getDeliveryType() == 0) {
|
||||
order.setStatus(2); //已发货
|
||||
} else {
|
||||
order.setStatus(1); //待发货
|
||||
}
|
||||
//支付方式:0->未支付;1->支付宝;2->微信;3->线下支付
|
||||
order.setPayType(1);
|
||||
order.setModifyTime(date);
|
||||
order.setPaymentTime(date);
|
||||
orderMapper.updateByPrimaryKey(order);
|
||||
/**
|
||||
* 线程池处理逻辑
|
||||
* 会员分润逻辑
|
||||
*/
|
||||
executorService.submit(()->{
|
||||
// 更新订单状态及预计算分润
|
||||
this.updateOderAndMemberInfo(order);
|
||||
});
|
||||
memberSplitProfitService.updateOderAndMemberInfo(order);
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
} catch (AlipayApiException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
private void updateOderAndMemberInfo(OmsOrder order) {
|
||||
|
||||
Date date = new Date();
|
||||
//提货方式:0->自提;1->物流
|
||||
if(order.getDeliveryType() == 0) {
|
||||
order.setStatus(2); //已发货
|
||||
} else {
|
||||
order.setStatus(1); //待发货
|
||||
}
|
||||
//支付方式:0->未支付;1->支付宝;2->微信;3->线下支付
|
||||
order.setPayType(1);
|
||||
order.setModifyTime(date);
|
||||
order.setPaymentTime(date);
|
||||
orderMapper.updateByPrimaryKey(order);
|
||||
|
||||
UmsMember member = memberMapper.selectByPrimaryKey(order.getMemberId());
|
||||
//找到上级会员
|
||||
UmsMember higherLevelMember = this.findInOrderQueueMember(member.getId());;
|
||||
/**
|
||||
* 先验证该订单是否是五联单加速,如果不是则普通计算上级提成
|
||||
* 如果是提成,则全额给上级
|
||||
*/
|
||||
boolean splitForFiveQueue = fiveQuickQueueBusiness(higherLevelMember);
|
||||
|
||||
//未进行满5联单分润,开始进行普通分润流程
|
||||
if(!splitForFiveQueue && higherLevelMember != null){
|
||||
//进行订单分润
|
||||
this.splitProfitFroMember(member, higherLevelMember, order);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 为订单上级进行分润
|
||||
* @param member
|
||||
* @param higherLevelMember
|
||||
* @param order
|
||||
*/
|
||||
private void splitProfitFroMember(UmsMember member, UmsMember higherLevelMember, OmsOrder order) {
|
||||
|
||||
//新订单及直属上级分润,返回的分润金额
|
||||
BigDecimal revenueAmount = this.newMemberSplitProfit(member, higherLevelMember, order);
|
||||
|
||||
UmsMember moreHigherMember;
|
||||
//如果上级是vip会员
|
||||
if(higherLevelMember.getMemberLevel().equals(MemberLevel.Consumer)) {
|
||||
moreHigherMember = this.findNextHigherLevelMemberByType(higherLevelMember.getId(), MemberLevel.Consumer);
|
||||
}else {
|
||||
moreHigherMember = this.findInOrderQueueMember(higherLevelMember.getId());
|
||||
}
|
||||
//没有上级退出分润
|
||||
if(moreHigherMember == null){
|
||||
return;
|
||||
}
|
||||
|
||||
//给三个级别代理分润
|
||||
this.threeLevelSplitProfit(higherLevelMember, moreHigherMember, order, revenueAmount);
|
||||
|
||||
this.fourLevelSplitProfit(higherLevelMember, moreHigherMember, order, revenueAmount);
|
||||
|
||||
this.fiveLevelSplitProfit(higherLevelMember, moreHigherMember, order, revenueAmount);
|
||||
}
|
||||
|
||||
/**
|
||||
* 查询到下一个级别的上级会员
|
||||
* @param id
|
||||
* @param consumer
|
||||
* @return
|
||||
*/
|
||||
private UmsMember findNextHigherLevelMemberByType(Long id, MemberLevel consumer) {
|
||||
//找到上级
|
||||
UmsMember moreHigherMember = this.findInOrderQueueMember(id);
|
||||
if(moreHigherMember == null){
|
||||
return null;
|
||||
}else {
|
||||
while (moreHigherMember.getMemberLevel().equals(consumer)){
|
||||
moreHigherMember = this.findInOrderQueueMember(moreHigherMember.getId());
|
||||
if(moreHigherMember == null){
|
||||
return null;
|
||||
}
|
||||
}
|
||||
}
|
||||
return moreHigherMember;
|
||||
}
|
||||
|
||||
|
||||
/***
|
||||
* 五联单排队分红逻辑,该订单支付后处理
|
||||
**/
|
||||
private boolean fiveQuickQueueBusiness(UmsMember higherLevelMember) {
|
||||
//分润标识
|
||||
boolean splitMark = false;
|
||||
if(higherLevelMember != null){
|
||||
//订单加入队列
|
||||
UmsMemberOrderQueueExample orderQueueExample = new UmsMemberOrderQueueExample();
|
||||
orderQueueExample.createCriteria()
|
||||
.andQuitQueueMarkEqualTo(UmsMemberOrderQueue.QUEUE_STATUS_WAIT)
|
||||
.andQueueTypeEqualTo(UmsMemberOrderQueue.QUEUE_TYPE_FAST)
|
||||
.andMemberIdEqualTo(higherLevelMember.getId());
|
||||
|
||||
List<UmsMemberOrderQueue> orderQueueList = umsMemberOrderQueueMapper.selectByExample(orderQueueExample);
|
||||
//上级订单队列中是否有加速5联单
|
||||
if(!orderQueueList.isEmpty()){
|
||||
UmsMemberOrderQueue umoq = orderQueueList.get(0);
|
||||
if(umoq.getRemainNumber() <= 4){
|
||||
//没有加速满5单
|
||||
umoq.setRemainNumber(1 + umoq.getRemainNumber());
|
||||
umsMemberOrderQueueMapper.updateByPrimaryKeySelective(umoq);
|
||||
|
||||
}else {
|
||||
//设置本单待退出,且5单满24小时未退款
|
||||
umoq.setQuitQueueMark(UmsMemberOrderQueue.QUEUE_PREPARE_QUIT);
|
||||
//冻结上级会费的冻结金额
|
||||
|
||||
//订单金额加入冻结余额
|
||||
BigDecimal freeze = higherLevelMember.getFreeze();
|
||||
BigDecimal orderAmount = umoq.getOrderAmount();
|
||||
higherLevelMember.setFreeze(freeze.add(orderAmount));
|
||||
//更新数据库
|
||||
memberMapper.updateByPrimaryKeySelective(higherLevelMember);
|
||||
umsMemberOrderQueueMapper.updateByPrimaryKeySelective(umoq);
|
||||
|
||||
UmsMemberAccountTransaction accountTransaction = new UmsMemberAccountTransaction();
|
||||
accountTransaction.setCommissionRatio(100);
|
||||
accountTransaction.setMemberId(umoq.getMemberId());
|
||||
accountTransaction.setOrderId(umoq.getOrderId());
|
||||
accountTransaction.setRemarks("满五单加速流水");
|
||||
accountTransaction.setTransactionState(UmsMemberAccountTransaction.TRANSACTION_STATE_NO);
|
||||
//24小时后到账
|
||||
accountTransaction.setTransferPaymentTime(DateUtil.tomorrow());
|
||||
umsMemberAccountTransactionMapper.insert(accountTransaction);
|
||||
splitMark = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
return splitMark;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 会员分润
|
||||
* @param currentMember
|
||||
* @param higherLevelMember
|
||||
* @param order
|
||||
*/
|
||||
private BigDecimal newMemberSplitProfit(UmsMember currentMember, UmsMember higherLevelMember, OmsOrder order){
|
||||
/**
|
||||
* 新增用户位普通用户,订单支付成功后满一定金额,成为vip普通会员
|
||||
* 当前订单金额 大于等于 vip门槛金额
|
||||
*/
|
||||
if(currentMember.getMemberLevel().equals(MemberLevel.Member) &&
|
||||
order.getPayAmount().compareTo(new BigDecimal(becomeVipAmount)) >= 0 ){
|
||||
LOGGER.info("new order member {}" , JSONUtil.toJsonStr(currentMember));
|
||||
currentMember.setMemberLevel(MemberLevel.Consumer);
|
||||
memberMapper.updateByPrimaryKey(currentMember);
|
||||
//订单加入队列
|
||||
UmsMemberOrderQueueExample example = new UmsMemberOrderQueueExample();
|
||||
example.createCriteria().andQuitQueueMarkEqualTo(UmsMemberOrderQueue.QUEUE_STATUS_WAIT)
|
||||
.andQueueTypeEqualTo(UmsMemberOrderQueue.QUEUE_TYPE_ORDINARY);
|
||||
long allQueue = umsMemberOrderQueueMapper.countByExample(example);
|
||||
UmsMemberOrderQueue record = new UmsMemberOrderQueue();
|
||||
record.setOrderId(order.getId());
|
||||
record.setMemberId(currentMember.getId());
|
||||
record.setOrderAmount(order.getPayAmount());
|
||||
record.setQuitQueueMark(UmsMemberOrderQueue.QUEUE_STATUS_WAIT);
|
||||
record.setQueueType(UmsMemberOrderQueue.QUEUE_TYPE_ORDINARY);
|
||||
record.setQueueIndex(++allQueue);
|
||||
umsMemberOrderQueueMapper.insert(record);
|
||||
LOGGER.info("new Order Queue {}" , JSONUtil.toJsonStr(record));
|
||||
}
|
||||
|
||||
UmsMemberLevel higherLevel = umsMemberLevelMapper.selectByPrimaryKey(higherLevelMember.getMemberLevelId());
|
||||
//直推会员分润
|
||||
String ratio = "0."+higherLevel.getCommissionRatio();
|
||||
BigDecimal revenueAmount = order.getPayAmount().multiply(new BigDecimal(ratio)).setScale(2, RoundingMode.HALF_UP);
|
||||
UmsMemberAccountTransaction accountTransaction = new UmsMemberAccountTransaction();
|
||||
accountTransaction.setCommissionRatio(10);
|
||||
accountTransaction.setMemberId(higherLevelMember.getId());
|
||||
accountTransaction.setOrderId(order.getId());
|
||||
accountTransaction.setRemarks("直推会员分润");
|
||||
accountTransaction.setTransactionState(UmsMemberAccountTransaction.TRANSACTION_STATE_NO);
|
||||
accountTransaction.setRevenueAmount(revenueAmount);
|
||||
//24小时后到账
|
||||
accountTransaction.setTransferPaymentTime(DateUtil.tomorrow());
|
||||
umsMemberAccountTransactionMapper.insert(accountTransaction);
|
||||
LOGGER.info("new Account Transaction {}" , JSONUtil.toJsonStr(accountTransaction));
|
||||
|
||||
return revenueAmount;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 三级店长分润
|
||||
* @param lowerMember
|
||||
* @param higherMember
|
||||
* @param order
|
||||
*/
|
||||
private void threeLevelSplitProfit(UmsMember lowerMember, UmsMember higherMember, OmsOrder order,
|
||||
BigDecimal revenueAmount){
|
||||
|
||||
if(higherMember.getMemberLevel().equals(MemberLevel.Partner)){
|
||||
//上下级关系
|
||||
if(higherMember.getMemberLevel().getValue() > lowerMember.getMemberLevel().getValue()){
|
||||
|
||||
UmsMemberLevel lowerLevel = umsMemberLevelMapper.selectByPrimaryKey(lowerMember.getMemberLevelId());
|
||||
UmsMemberLevel higherLevel = umsMemberLevelMapper.selectByPrimaryKey(higherMember.getMemberLevelId());
|
||||
|
||||
Integer profitRatio = 0;
|
||||
if(higherLevel.getCommissionRatio() != null && lowerLevel.getCommissionRatio() != null){
|
||||
profitRatio = higherLevel.getCommissionRatio() - lowerLevel.getCommissionRatio();
|
||||
}
|
||||
//查看上级的分润比例
|
||||
BigDecimal tenPercent = order.getPayAmount().multiply(new BigDecimal("0."+profitRatio)).setScale(2, RoundingMode.HALF_UP);
|
||||
|
||||
UmsMemberAccountTransaction accountTransaction = new UmsMemberAccountTransaction();
|
||||
accountTransaction.setCommissionRatio(profitRatio);
|
||||
accountTransaction.setMemberId(higherMember.getId());
|
||||
accountTransaction.setOrderId(order.getId());
|
||||
accountTransaction.setRemarks("三级店长上级分润");
|
||||
accountTransaction.setTransactionState(UmsMemberAccountTransaction.TRANSACTION_STATE_NO);
|
||||
accountTransaction.setRevenueAmount(tenPercent);
|
||||
//24小时后到账
|
||||
accountTransaction.setTransferPaymentTime(DateUtil.tomorrow());
|
||||
umsMemberAccountTransactionMapper.insert(accountTransaction);
|
||||
|
||||
|
||||
//查询上级
|
||||
UmsMember next = this.findInOrderQueueMember(higherMember.getId());
|
||||
|
||||
if(next != null){
|
||||
if (next.getMemberLevel().equals(higherMember.getMemberLevel())){
|
||||
threeLevelSplitProfit(higherMember, next, order, revenueAmount);
|
||||
}else {
|
||||
fourLevelSplitProfit(higherMember, next, order, revenueAmount);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
//平级关系
|
||||
}else if(lowerMember.getMemberLevel().equals(lowerMember.getMemberLevel())){
|
||||
BigDecimal tenPercent = revenueAmount.multiply(new BigDecimal("0.10")).setScale(2, RoundingMode.HALF_UP);
|
||||
|
||||
UmsMemberAccountTransaction accountTransaction = new UmsMemberAccountTransaction();
|
||||
accountTransaction.setCommissionRatio(10);
|
||||
accountTransaction.setMemberId(higherMember.getId());
|
||||
accountTransaction.setOrderId(order.getId());
|
||||
accountTransaction.setRemarks("三级店长平级分润");
|
||||
accountTransaction.setTransactionState(UmsMemberAccountTransaction.TRANSACTION_STATE_NO);
|
||||
accountTransaction.setRevenueAmount(tenPercent);
|
||||
//24小时后到账
|
||||
accountTransaction.setTransferPaymentTime(DateUtil.tomorrow());
|
||||
umsMemberAccountTransactionMapper.insert(accountTransaction);
|
||||
|
||||
UmsMember next = this.findNextHigherLevelMemberByType(higherMember.getId(), MemberLevel.Diamond);
|
||||
if(next != null){
|
||||
fourLevelSplitProfit(higherMember, next, order, revenueAmount);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 四级代理分润
|
||||
* @param lowerMember
|
||||
* @param higherMember
|
||||
* @param order
|
||||
*/
|
||||
private void fourLevelSplitProfit(UmsMember lowerMember, UmsMember higherMember, OmsOrder order, BigDecimal revenueAmount){
|
||||
if(higherMember.getMemberLevel().equals(MemberLevel.Diamond)){
|
||||
//上下级关系
|
||||
if(higherMember.getMemberLevel().getValue() > lowerMember.getMemberLevel().getValue()){
|
||||
|
||||
UmsMemberLevel lowerLevel = umsMemberLevelMapper.selectByPrimaryKey(lowerMember.getMemberLevelId());
|
||||
UmsMemberLevel higherLevel = umsMemberLevelMapper.selectByPrimaryKey(higherMember.getMemberLevelId());
|
||||
|
||||
Integer profitRatio = 0;
|
||||
if(higherLevel.getCommissionRatio() != null && lowerLevel.getCommissionRatio() != null){
|
||||
profitRatio = higherLevel.getCommissionRatio() - lowerLevel.getCommissionRatio();
|
||||
}
|
||||
//查看上级的分润比例
|
||||
BigDecimal tenPercent = order.getPayAmount().multiply(new BigDecimal("0."+profitRatio)).setScale(2, RoundingMode.HALF_UP);
|
||||
|
||||
UmsMemberAccountTransaction accountTransaction = new UmsMemberAccountTransaction();
|
||||
accountTransaction.setCommissionRatio(profitRatio);
|
||||
accountTransaction.setMemberId(higherMember.getId());
|
||||
accountTransaction.setOrderId(order.getId());
|
||||
accountTransaction.setRemarks("四级代理分润");
|
||||
accountTransaction.setTransactionState(UmsMemberAccountTransaction.TRANSACTION_STATE_NO);
|
||||
accountTransaction.setRevenueAmount(tenPercent);
|
||||
//24小时后到账
|
||||
accountTransaction.setTransferPaymentTime(DateUtil.tomorrow());
|
||||
umsMemberAccountTransactionMapper.insert(accountTransaction);
|
||||
|
||||
|
||||
//查询上级
|
||||
UmsMember next = this.findInOrderQueueMember(higherMember.getId());
|
||||
|
||||
if(next != null){
|
||||
if (next.getMemberLevel().equals(higherMember.getMemberLevel())){
|
||||
fourLevelSplitProfit(higherMember, next, order, revenueAmount);
|
||||
}else {
|
||||
fiveLevelSplitProfit(higherMember, next, order, revenueAmount);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
//平级关系
|
||||
}else if(lowerMember.getMemberLevel().equals(lowerMember.getMemberLevel())){
|
||||
BigDecimal tenPercent = revenueAmount.multiply(new BigDecimal("0.10")).setScale(2, RoundingMode.HALF_UP);
|
||||
|
||||
UmsMemberAccountTransaction accountTransaction = new UmsMemberAccountTransaction();
|
||||
accountTransaction.setCommissionRatio(10);
|
||||
accountTransaction.setMemberId(higherMember.getId());
|
||||
accountTransaction.setOrderId(order.getId());
|
||||
accountTransaction.setRemarks("三级店长平级分润");
|
||||
accountTransaction.setTransactionState(UmsMemberAccountTransaction.TRANSACTION_STATE_NO);
|
||||
accountTransaction.setRevenueAmount(tenPercent);
|
||||
//24小时后到账
|
||||
accountTransaction.setTransferPaymentTime(DateUtil.tomorrow());
|
||||
umsMemberAccountTransactionMapper.insert(accountTransaction);
|
||||
|
||||
UmsMember next = this.findNextHigherLevelMemberByType(higherMember.getId(), MemberLevel.OneDiamond);
|
||||
if(next != null){
|
||||
fiveLevelSplitProfit(higherMember, next, order, revenueAmount);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* 五级市代分润
|
||||
* @param lowerMember
|
||||
* @param higherMember
|
||||
* @param order
|
||||
*/
|
||||
private void fiveLevelSplitProfit(UmsMember lowerMember, UmsMember higherMember, OmsOrder order, BigDecimal revenueAmount){
|
||||
|
||||
if(higherMember.getMemberLevel().equals(MemberLevel.OneDiamond)){
|
||||
//上下级关系
|
||||
if(higherMember.getMemberLevel().getValue() > lowerMember.getMemberLevel().getValue()){
|
||||
|
||||
UmsMemberLevel lowerLevel = umsMemberLevelMapper.selectByPrimaryKey(lowerMember.getMemberLevelId());
|
||||
UmsMemberLevel higherLevel = umsMemberLevelMapper.selectByPrimaryKey(higherMember.getMemberLevelId());
|
||||
|
||||
Integer profitRatio = 0;
|
||||
if(higherLevel.getCommissionRatio() != null && lowerLevel.getCommissionRatio() != null){
|
||||
profitRatio = higherLevel.getCommissionRatio() - lowerLevel.getCommissionRatio();
|
||||
}
|
||||
//查看上级的分润比例
|
||||
BigDecimal tenPercent = order.getPayAmount().multiply(new BigDecimal("0."+profitRatio)).setScale(2, RoundingMode.HALF_UP);
|
||||
|
||||
UmsMemberAccountTransaction accountTransaction = new UmsMemberAccountTransaction();
|
||||
accountTransaction.setCommissionRatio(profitRatio);
|
||||
accountTransaction.setMemberId(higherMember.getId());
|
||||
accountTransaction.setOrderId(order.getId());
|
||||
accountTransaction.setRemarks("四级代理分润");
|
||||
accountTransaction.setTransactionState(UmsMemberAccountTransaction.TRANSACTION_STATE_NO);
|
||||
accountTransaction.setRevenueAmount(tenPercent);
|
||||
//24小时后到账
|
||||
accountTransaction.setTransferPaymentTime(DateUtil.tomorrow());
|
||||
umsMemberAccountTransactionMapper.insert(accountTransaction);
|
||||
|
||||
|
||||
//查询上级
|
||||
UmsMember next = this.findInOrderQueueMember(higherMember.getId());
|
||||
|
||||
if(next != null && next.getMemberLevel().equals(higherMember.getMemberLevel())){
|
||||
fiveLevelSplitProfit(higherMember, next, order, revenueAmount);
|
||||
}
|
||||
|
||||
|
||||
//平级关系
|
||||
}else if(lowerMember.getMemberLevel().equals(lowerMember.getMemberLevel())){
|
||||
BigDecimal tenPercent = revenueAmount.multiply(new BigDecimal("0.10")).setScale(2, RoundingMode.HALF_UP);
|
||||
|
||||
UmsMemberAccountTransaction accountTransaction = new UmsMemberAccountTransaction();
|
||||
accountTransaction.setCommissionRatio(10);
|
||||
accountTransaction.setMemberId(higherMember.getId());
|
||||
accountTransaction.setOrderId(order.getId());
|
||||
accountTransaction.setRemarks("三级店长平级分润");
|
||||
accountTransaction.setTransactionState(UmsMemberAccountTransaction.TRANSACTION_STATE_NO);
|
||||
accountTransaction.setRevenueAmount(tenPercent);
|
||||
//24小时后到账
|
||||
accountTransaction.setTransferPaymentTime(DateUtil.tomorrow());
|
||||
umsMemberAccountTransactionMapper.insert(accountTransaction);
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 寻找上级且在队列中,未在队列且返回null
|
||||
*/
|
||||
private UmsMember findInOrderQueueMember(Long id) {
|
||||
UmsMemberRelationTree relationTree = this.getUpLevelRelationTreeById(id);
|
||||
UmsMember higherMember = memberMapper.selectByPrimaryKey(relationTree.getMemberId());
|
||||
if(higherMember == null){
|
||||
return null;
|
||||
}
|
||||
if(higherMember.getOrderStatus() == 0){
|
||||
UmsMember nextMember = this.findInOrderQueueMember(higherMember.getId());
|
||||
if(nextMember != null){
|
||||
return nextMember;
|
||||
}
|
||||
}else if(higherMember.getOrderStatus() == 1){
|
||||
return higherMember;
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
private UmsMemberRelationTree getUpLevelRelationTreeById(Long id) {
|
||||
UmsMemberRelationTree relationTree = null;
|
||||
UmsMemberRelationTreeExample relationTreeExample = new UmsMemberRelationTreeExample();
|
||||
relationTreeExample.createCriteria().andMemberIdEqualTo(id);
|
||||
List<UmsMemberRelationTree> relationTreeList = umsMemberRelationTreeMapper.selectByExample(relationTreeExample);
|
||||
if(!relationTreeList.isEmpty()) {
|
||||
//找到上级关系
|
||||
relationTree = relationTreeList.get(0);
|
||||
}
|
||||
return relationTree;
|
||||
// } catch (AlipayApiException e) {
|
||||
// e.printStackTrace();
|
||||
// }
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -0,0 +1,37 @@
|
||||
package com.buy507.mall.portal;
|
||||
|
||||
import com.buy507.mall.portal.service.OmsPortalOrderService;
|
||||
import org.junit.Test;
|
||||
import org.junit.runner.RunWith;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.boot.test.context.SpringBootTest;
|
||||
import org.springframework.test.context.junit4.SpringRunner;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
@RunWith(SpringRunner.class)
|
||||
@SpringBootTest
|
||||
public class OmsPortalOrderServiceTest {
|
||||
|
||||
@Autowired
|
||||
private OmsPortalOrderService portalOrderService;
|
||||
|
||||
|
||||
/**
|
||||
* 支付宝回调逻辑 测试
|
||||
*/
|
||||
@Test
|
||||
public void alipayCallbackTest() {
|
||||
Map params = new HashMap<>();
|
||||
params.put("trade_status", "TRADE_SUCCESS");
|
||||
params.put("out_trade_no", "23123wwww2");
|
||||
|
||||
portalOrderService.alipayCallback(params);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user