加入队列分润逻辑

This commit is contained in:
2024-11-07 18:07:14 +08:00
parent aea65c9782
commit a4c54b16c8
16 changed files with 669 additions and 668 deletions

View File

@@ -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

View File

@@ -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);
}
}
}

View File

@@ -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();
// }
}
}

View File

@@ -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);
}
}