现金、积分分润逻辑实现

This commit is contained in:
2025-02-20 11:18:28 +08:00
parent 2b5f4c3c5e
commit c572ec0f84
13 changed files with 491 additions and 131 deletions

View File

@@ -41,7 +41,7 @@ public class OrderResult {
@ApiModelProperty(value = "支付时间")
private Date paymentTime;
@ApiModelProperty(value = "支付类型: 1->支付宝2->微信3->线下支付4->积分支付")
@ApiModelProperty(value = "支付类型: 1->支付宝2->微信3->线下支付4->积分支付 5->余额支付")
private Integer payType;
@ApiModelProperty(value = "支付类型名称")

View File

@@ -9,7 +9,6 @@ import com.buy507.mall.model.UmsMember;
public interface MemberCommissionService {
/**
* 开始冻结金额到账,等级升级
* @param order
* @param currentMember
*/
void computeCommission(UmsMember currentMember);

View File

@@ -0,0 +1,403 @@
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 com.buy507.mall.portal.service.MemberCommissionService;
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 javax.annotation.Resource;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.*;
@Slf4j
@Service
public class MemberPointsSplitProfitService{
@Resource
private UmsMemberMapper memberMapper;
/**
* 会员分成流水
*/
@Resource
private UmsMemberAccountTransactionMapper umsMemberAccountTransactionMapper;
/**
* 会员上下关系
*/
@Resource
private UmsMemberRelationTreeMapper umsMemberRelationTreeMapper;
/**
* 会员等级
*/
@Resource
private UmsMemberLevelMapper umsMemberLevelMapper;
@Autowired
private OmsOrderMapper orderMapper;
@Value("${becomeVipAmount}")
private String becomeVipAmount;
@Value("${sameLevelProfit}")
private String sameLevelProfit;
/**
* 积分分润入口
* @param order
*/
public void pointsSplit(OmsOrder order) {
UmsMember member = memberMapper.selectByPrimaryKey(order.getMemberId());
//找到上级会员
UmsMember higherLevelMember = this.findInOrderQueueMember(member.getId());;
if(higherLevelMember != null){
//进行订单分润
this.splitProfitFroMember(member, higherLevelMember, order);
}
//计算会员等级
UmsMemberRelationTree relationTree = this.getUpLevelRelationTreeById(member.getId());
if(relationTree == null){
return;
}
//上级为空或者为普通用户
UmsMember higherMember = memberMapper.selectByPrimaryKey(relationTree.getHigherLevelId());
if(higherMember == null && higherMember.getMemberLevel().equals(MemberLevel.Member)){
return;
}
}
/**
* 为订单上级进行分润
* @param member
* @param higherLevelMember
* @param order
*/
private void splitProfitFroMember(UmsMember member, UmsMember higherLevelMember, OmsOrder order) {
//新订单及直属上级分润,返回的分润金额
Integer revenuePoints = this.newMemberSplitProfit(member, higherLevelMember, order);
UmsMember moreHigherMember = new UmsMember();
//如果上级是vip会员
if(higherLevelMember.getMemberLevel().equals(MemberLevel.Consumer)) {
moreHigherMember = this.findNextHigherLevelMemberByType(higherLevelMember.getId(), MemberLevel.Consumer);
}
//没有更高的上级退出分润
if(moreHigherMember == null){
return;
}
//给三个级别代理分润
this.twoLevelSplitProfit(higherLevelMember, moreHigherMember, order, revenuePoints);
this.threeLevelSplitProfit(higherLevelMember, moreHigherMember, order, revenuePoints);
this.fourLevelSplitProfit(higherLevelMember, moreHigherMember, order, revenuePoints);
}
/**
* 查询到下一个级别的上级会员
* @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 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;
}
return higherMember;
}
/**
* 会员分润
* @param currentMember
* @param higherLevelMember
* @param order
*/
private Integer newMemberSplitProfit(UmsMember currentMember, UmsMember higherLevelMember, OmsOrder order){
//直推会员分润比例
String ratio = "0."+ 3;
Integer revenuePoints = order.getPayAmount().multiply(new BigDecimal(ratio)).intValue();
UmsMemberAccountTransaction accountTransaction = new UmsMemberAccountTransaction();
accountTransaction.setMemberId(higherLevelMember.getId());
accountTransaction.setOrderId(order.getId());
accountTransaction.setRemarks("直推VIP积分分润");
accountTransaction.setTransactionState(UmsMemberAccountTransaction.TRANSACTION_STATE_YES);
accountTransaction.setRevenuePoints(revenuePoints);
accountTransaction.setTransferPaymentTime(DateUtil.date());
umsMemberAccountTransactionMapper.insert(accountTransaction);
log.info("new Account Transaction {}" , JSONUtil.toJsonStr(accountTransaction));
//会员积分到账
higherLevelMember.setIntegration(revenuePoints + (higherLevelMember.getIntegration() == null ? 0 : higherLevelMember.getIntegration()));
memberMapper.updateByPrimaryKey(higherLevelMember);
return revenuePoints;
}
/**
* 二级店长分润
* @param lowerMember
* @param higherMember
* @param order
*/
private void twoLevelSplitProfit(UmsMember lowerMember, UmsMember higherMember, OmsOrder order,
Integer revenuePoints){
//先判断是否为店长
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.getPointsRatio() != null && lowerLevel.getPointsRatio() != null){
profitRatio = higherLevel.getPointsRatio() - lowerLevel.getPointsRatio();
}
String ratioStr = profitRatio < 10 ? "0.0" + profitRatio : "0."+profitRatio;
//计算上级的分积分分润
Integer pointsCommission = order.getPayAmount().multiply(new BigDecimal(ratioStr)).intValue();
UmsMemberAccountTransaction accountTransaction = new UmsMemberAccountTransaction();
accountTransaction.setCommissionRatio(profitRatio);
accountTransaction.setMemberId(higherMember.getId());
accountTransaction.setOrderId(order.getId());
accountTransaction.setRemarks("二级店长上级积分分润");
accountTransaction.setRevenuePoints(pointsCommission);
//即时到账
accountTransaction.setTransferPaymentTime(DateUtil.date());
umsMemberAccountTransactionMapper.insert(accountTransaction);
//会员金额到账
higherMember.setIntegration(pointsCommission + (higherMember.getIntegration() == null ? 0 : higherMember.getIntegration()));
memberMapper.updateByPrimaryKeySelective(higherMember);
//查询上级
UmsMember next = this.findInOrderQueueMember(higherMember.getId());
if(next != null){
if (next.getMemberLevel().equals(higherMember.getMemberLevel())){
twoLevelSplitProfit(higherMember, next, order, pointsCommission);
}else {
threeLevelSplitProfit(higherMember, next, order, pointsCommission);
fourLevelSplitProfit(higherMember, next, order, pointsCommission);
}
}
//平级关系
}else if(lowerMember.getMemberLevel().equals(lowerMember.getMemberLevel())){
Integer pointsCommission = revenuePoints * (new BigDecimal("0."+sameLevelProfit)).intValue();
UmsMemberAccountTransaction accountTransaction = new UmsMemberAccountTransaction();
accountTransaction.setCommissionRatio(Integer.valueOf(sameLevelProfit));
accountTransaction.setMemberId(higherMember.getId());
accountTransaction.setOrderId(order.getId());
accountTransaction.setRemarks("二级店长平级积分分润");
accountTransaction.setRevenuePoints(pointsCommission);
//即时到账
accountTransaction.setTransferPaymentTime(DateUtil.date());
umsMemberAccountTransactionMapper.insert(accountTransaction);
//会员金额到账
higherMember.setIntegration(pointsCommission + (higherMember.getIntegration() == null ? 0 : higherMember.getIntegration()));
memberMapper.updateByPrimaryKeySelective(higherMember);
//查询比当前级别大的会员
UmsMember next = this.findNextHigherLevelMemberByType(higherMember.getId(), MemberLevel.Partner);
if(next != null){
threeLevelSplitProfit(higherMember, next, order, pointsCommission);
fourLevelSplitProfit(higherMember, next, order, pointsCommission);
}
}
}
}
/**
* 三级代理分润
* @param lowerMember
* @param higherMember
* @param order
*/
private void threeLevelSplitProfit(UmsMember lowerMember, UmsMember higherMember, OmsOrder order, Integer revenuePoints){
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.getPointsRatio() != null && lowerLevel.getPointsRatio() != null){
profitRatio = higherLevel.getPointsRatio() - lowerLevel.getPointsRatio();
}
String ratioStr = profitRatio < 10 ? "0.0" + profitRatio : "0."+profitRatio;
//计算上级的分积分分润
Integer pointsCommission = order.getPayAmount().multiply(new BigDecimal(ratioStr)).intValue();
UmsMemberAccountTransaction accountTransaction = new UmsMemberAccountTransaction();
accountTransaction.setCommissionRatio(profitRatio);
accountTransaction.setMemberId(higherMember.getId());
accountTransaction.setOrderId(order.getId());
accountTransaction.setRemarks("三级代理上级积分分润");
accountTransaction.setRevenuePoints(pointsCommission);
accountTransaction.setTransferPaymentTime(DateUtil.date());
umsMemberAccountTransactionMapper.insert(accountTransaction);
//会员金额到账
higherMember.setIntegration(pointsCommission + (higherMember.getIntegration() == null ? 0 : higherMember.getIntegration()));
memberMapper.updateByPrimaryKeySelective(higherMember);
//查询上级
UmsMember next = this.findInOrderQueueMember(higherMember.getId());
if(next != null){
if (next.getMemberLevel().equals(higherMember.getMemberLevel())){
threeLevelSplitProfit(higherMember, next, order, pointsCommission);
}else {
fourLevelSplitProfit(higherMember, next, order, pointsCommission);
}
}
//平级关系
}else if(lowerMember.getMemberLevel().equals(lowerMember.getMemberLevel())){
Integer pointsCommission = revenuePoints * (new BigDecimal("0."+sameLevelProfit)).intValue();
UmsMemberAccountTransaction accountTransaction = new UmsMemberAccountTransaction();
accountTransaction.setCommissionRatio(Integer.valueOf(sameLevelProfit));
accountTransaction.setMemberId(higherMember.getId());
accountTransaction.setOrderId(order.getId());
accountTransaction.setRemarks("三级代理平级积分分润");
accountTransaction.setRevenuePoints(pointsCommission);
//24小时后到账
accountTransaction.setTransferPaymentTime(DateUtil.tomorrow());
umsMemberAccountTransactionMapper.insert(accountTransaction);
//会员金额到账
higherMember.setIntegration(pointsCommission + (higherMember.getIntegration() == null ? 0 : higherMember.getIntegration()));
memberMapper.updateByPrimaryKeySelective(higherMember);
UmsMember next = this.findNextHigherLevelMemberByType(higherMember.getId(), MemberLevel.Diamond);
if(next != null){
fourLevelSplitProfit(higherMember, next, order, pointsCommission);
}
}
}
}
/**
* 四级市代分润
* @param lowerMember
* @param higherMember
* @param order
*/
private void fourLevelSplitProfit(UmsMember lowerMember, UmsMember higherMember, OmsOrder order, Integer revenuePoints){
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.getPointsRatio() != null && lowerLevel.getPointsRatio() != null){
profitRatio = higherLevel.getPointsRatio() - lowerLevel.getPointsRatio();
}
String ratioStr = profitRatio < 10 ? "0.0" + profitRatio : "0."+profitRatio;
//计算上级的分积分分润
Integer pointsCommission = order.getPayAmount().multiply(new BigDecimal(ratioStr)).intValue();
UmsMemberAccountTransaction accountTransaction = new UmsMemberAccountTransaction();
accountTransaction.setCommissionRatio(profitRatio);
accountTransaction.setMemberId(higherMember.getId());
accountTransaction.setOrderId(order.getId());
accountTransaction.setRemarks("四级市代理上级积分分润");
accountTransaction.setRevenuePoints(pointsCommission);
//24小时后到账
accountTransaction.setTransferPaymentTime(DateUtil.date());
umsMemberAccountTransactionMapper.insert(accountTransaction);
//会员金额到账
higherMember.setIntegration(pointsCommission + (higherMember.getIntegration() == null ? 0 : higherMember.getIntegration()));
memberMapper.updateByPrimaryKeySelective(higherMember);
//查询上级
UmsMember next = this.findInOrderQueueMember(higherMember.getId());
if(next != null && next.getMemberLevel().equals(higherMember.getMemberLevel())){
fourLevelSplitProfit(higherMember, next, order, pointsCommission);
}
//平级关系
}else if(lowerMember.getMemberLevel().equals(lowerMember.getMemberLevel())){
Integer pointsCommission = revenuePoints * (new BigDecimal("0."+sameLevelProfit)).intValue();
UmsMemberAccountTransaction accountTransaction = new UmsMemberAccountTransaction();
accountTransaction.setCommissionRatio(Integer.valueOf(sameLevelProfit));
accountTransaction.setMemberId(higherMember.getId());
accountTransaction.setOrderId(order.getId());
accountTransaction.setRemarks("四级市代理平级积分分润");
accountTransaction.setRevenuePoints(pointsCommission);
//会员金额到账
higherMember.setIntegration(pointsCommission + (higherMember.getIntegration() == null ? 0 : higherMember.getIntegration()));
memberMapper.updateByPrimaryKeySelective(higherMember);
//24小时后到账
accountTransaction.setTransferPaymentTime(DateUtil.tomorrow());
umsMemberAccountTransactionMapper.insert(accountTransaction);
}
}
}
/**
* 获取会员的上级关系
* @param id
* @return
*/
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;
}
}

View File

@@ -63,42 +63,6 @@ public class MemberSplitProfitService{
public void updateOderAndMemberInfo(OmsOrder order) {
/*UmsMember member = memberMapper.selectByPrimaryKey(order.getMemberId());
//找到上级会员
UmsMember higherLevelMember = this.findInOrderQueueMember(member.getId());;
*
* 先验证该订单是否是五联单加速,如果不是则普通计算上级提成
* 如果是提成,则全额给上级
boolean splitForFiveQueue = false; //是否加速完成
//在此判断是否是首单新用户
UmsMemberOrderQueueExample orderQueueExample1 = new UmsMemberOrderQueueExample();
orderQueueExample1.createCriteria().andMemberIdEqualTo(order.getMemberId());
long memberOrderCount = umsMemberOrderQueueMapper.countByExample(orderQueueExample1);
if(memberOrderCount == 1){
splitForFiveQueue = fiveQuickQueueBusiness(order, member, higherLevelMember);
}
//未进行满5联单分润开始进行普通分润流程
if(!splitForFiveQueue && higherLevelMember != null){
//进行订单分润
this.splitProfitFroMember(member, higherLevelMember, order);
}
//计算会员等级
UmsMemberRelationTree relationTree = this.getUpLevelRelationTreeById(member.getId());
if(relationTree == null){
return;
}
//上级为空或者为普通用户
UmsMember higherMember = memberMapper.selectByPrimaryKey(relationTree.getHigherLevelId());
if(higherMember == null && higherMember.getMemberLevel().equals(MemberLevel.Member)){
return;
}
memberCommissionService.computeCommission(higherMember);*/
UmsMember member = memberMapper.selectByPrimaryKey(order.getMemberId());
//找到上级会员
UmsMember higherLevelMember = this.findInOrderQueueMember(member.getId());;
@@ -280,10 +244,6 @@ public class MemberSplitProfitService{
if(higherQueue != null){
return splitMark;
}
//添加帮助加速的订单号
/*UmsMemberOrderQueue orderQ = umsMemberOrderQueueMapper.selectByExample(orderQueueExample);
orderQ.setAccelerateOrderId(higherQueue.getOrderId());
umsMemberOrderQueueMapper.updateByPrimaryKeySelective(orderQ);*/
//查找上级还有多少下级(查看同级别的用户)
UmsMemberRelationTreeExample umrtExample = new UmsMemberRelationTreeExample();
@@ -431,16 +391,6 @@ public class MemberSplitProfitService{
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());*/
//UmsMemberLevel higherLevel = umsMemberLevelMapper.selectByPrimaryKey(higherLevelMember.getMemberLevelId());
//直推会员分润
//String ratio = "0."+higherLevel.getCommissionRatio(); mcoo Integer()
String ratio = "0."+ 2;
BigDecimal revenueAmount = order.getPayAmount().multiply(new BigDecimal(ratio)).setScale(2, RoundingMode.HALF_UP);
UmsMemberAccountTransaction accountTransaction = new UmsMemberAccountTransaction();
@@ -688,14 +638,6 @@ public class MemberSplitProfitService{
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;
}*/
if( higherMember.getOrderStatus() == 1){
return higherMember;
}
@@ -715,7 +657,4 @@ public class MemberSplitProfitService{
}
return relationTree;
}
}

View File

@@ -144,6 +144,15 @@ public class OmsPortalOrderServiceImpl implements OmsPortalOrderService {
@Autowired
private UmsDevelopmentFundMapper umsDevelopmentFundMapper;
@Autowired
private UmsMemberRelationTreeMapper memberRelationTreeMapper;
@Autowired
private UmsMemberLevelMapper memberLevelMapper;
@Autowired
private MemberPointsSplitProfitService memberPointsSplitProfitService;
@Value("${kuaidi100.url}")
private String KUAIDI100_URL;
@@ -1830,6 +1839,8 @@ public class OmsPortalOrderServiceImpl implements OmsPortalOrderService {
if (list != null && !list.isEmpty()) {
OmsOrder order = list.get(0);
// 获取下单用户信息
UmsMember member = memberMapper.selectByPrimaryKey(order.getMemberId());
//获取订单实付金额
BigDecimal payAmount = order.getPayAmount();
//获取商品信息
@@ -1844,8 +1855,6 @@ public class OmsPortalOrderServiceImpl implements OmsPortalOrderService {
if (pmsProduct.getPointsAreaStatus() == 1) {
//奖励积分是购买的价格的100%
int rewardPoints = order.getPayAmount().intValue();
// 获取用户信息
UmsMember member = memberMapper.selectByPrimaryKey(order.getMemberId());
// 增加用户积分
if (member != null) {
@@ -1860,6 +1869,9 @@ public class OmsPortalOrderServiceImpl implements OmsPortalOrderService {
//增加基金积分
int fundPoints = (int)(rewardPoints * 0.05);
umsDevelopmentFundMapper.updatePoints(fundPoints);
//积分分润
memberPointsSplitProfitService.pointsSplit(order);
}
}
//订单状态0->待付款1->待发货2->已发货3->已完成4->已关闭5->无效订单
@@ -1877,12 +1889,8 @@ public class OmsPortalOrderServiceImpl implements OmsPortalOrderService {
order.setPaymentTime(date);
orderMapper.updateByPrimaryKey(order);
/**
* 会员分润,升级逻辑
*/
//会员现金分润,升级逻辑
memberSplitProfitService.updateOderAndMemberInfo(order);
}
}
}