From c572ec0f849c780d53f79ecbbafabb20b30fe0dc Mon Sep 17 00:00:00 2001 From: zhanghb <740323835@qq.com> Date: Thu, 20 Feb 2025 11:18:28 +0800 Subject: [PATCH] =?UTF-8?q?=E7=8E=B0=E9=87=91=E3=80=81=E7=A7=AF=E5=88=86?= =?UTF-8?q?=E5=88=86=E6=B6=A6=E9=80=BB=E8=BE=91=E5=AE=9E=E7=8E=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mall/service/UmsMemberLevelService.java | 2 + .../mapper/UmsMemberRelationTreeMapper.java | 4 + .../com/buy507/mall/model/MemberLevel.java | 11 +- .../java/com/buy507/mall/model/UmsMember.java | 19 +- .../model/UmsMemberAccountTransaction.java | 39 +- .../com/buy507/mall/model/UmsMemberLevel.java | 52 ++- .../UmsMemberAccountTransactionMapper.xml | 4 +- .../mapper/UmsMemberRelationTreeMapper.xml | 2 +- .../mall/portal/domain/OrderResult.java | 2 +- .../service/MemberCommissionService.java | 1 - .../impl/MemberPointsSplitProfitService.java | 403 ++++++++++++++++++ .../impl/MemberSplitProfitService.java | 61 --- .../impl/OmsPortalOrderServiceImpl.java | 22 +- 13 files changed, 491 insertions(+), 131 deletions(-) create mode 100644 mall-portal/src/main/java/com/buy507/mall/portal/service/impl/MemberPointsSplitProfitService.java diff --git a/mall-admin/src/main/java/com/buy507/mall/service/UmsMemberLevelService.java b/mall-admin/src/main/java/com/buy507/mall/service/UmsMemberLevelService.java index 86fa813..dae6f33 100644 --- a/mall-admin/src/main/java/com/buy507/mall/service/UmsMemberLevelService.java +++ b/mall-admin/src/main/java/com/buy507/mall/service/UmsMemberLevelService.java @@ -13,4 +13,6 @@ public interface UmsMemberLevelService { * @param defaultStatus 是否为默认会员 */ List list(Integer defaultStatus); + + } diff --git a/mall-dao/src/main/java/com/buy507/mall/mapper/UmsMemberRelationTreeMapper.java b/mall-dao/src/main/java/com/buy507/mall/mapper/UmsMemberRelationTreeMapper.java index 5d651b7..56a7083 100644 --- a/mall-dao/src/main/java/com/buy507/mall/mapper/UmsMemberRelationTreeMapper.java +++ b/mall-dao/src/main/java/com/buy507/mall/mapper/UmsMemberRelationTreeMapper.java @@ -4,6 +4,7 @@ import com.buy507.mall.model.UmsMemberRelationTree; import com.buy507.mall.model.UmsMemberRelationTreeExample; import java.util.List; import org.apache.ibatis.annotations.Param; +import org.apache.ibatis.annotations.Select; public interface UmsMemberRelationTreeMapper { long countByExample(UmsMemberRelationTreeExample example); @@ -27,4 +28,7 @@ public interface UmsMemberRelationTreeMapper { int updateByPrimaryKeySelective(UmsMemberRelationTree record); int updateByPrimaryKey(UmsMemberRelationTree record); + + @Select("select * from ums_member_relation_tree where member_id = #{currentUserId}") + UmsMemberRelationTree findByMemberId(Long currentUserId); } \ No newline at end of file diff --git a/mall-dao/src/main/java/com/buy507/mall/model/MemberLevel.java b/mall-dao/src/main/java/com/buy507/mall/model/MemberLevel.java index 14856de..214a4f3 100644 --- a/mall-dao/src/main/java/com/buy507/mall/model/MemberLevel.java +++ b/mall-dao/src/main/java/com/buy507/mall/model/MemberLevel.java @@ -7,15 +7,16 @@ package com.buy507.mall.model; */ public enum MemberLevel { /**普通用户**/ - Member(0), + Member(1), /**vip会员**/ - Consumer(1), + Consumer(2), /**店长**/ - Partner(2), + Partner(3), /**代理**/ - Diamond(3), + Diamond(4), /** 市代 **/ - OneDiamond(4), + OneDiamond(5), + TwoDiamond(6), //中级合作商 ThreeDiamond(7), //高级合作商 FourDiamond(8); //特级合作商 diff --git a/mall-dao/src/main/java/com/buy507/mall/model/UmsMember.java b/mall-dao/src/main/java/com/buy507/mall/model/UmsMember.java index a038c47..6f39854 100644 --- a/mall-dao/src/main/java/com/buy507/mall/model/UmsMember.java +++ b/mall-dao/src/main/java/com/buy507/mall/model/UmsMember.java @@ -68,29 +68,18 @@ public class UmsMember implements Serializable { @ApiModelProperty(value = "分销实体店状态(0->未开店;1->已开店)") private StoreStatus storeStatus; - /** - * 余额 - */ + @ApiModelProperty(value = "余额") private BigDecimal balance; - /** - * 冻结余额 - */ + @ApiModelProperty(value = "冻结余额") private BigDecimal freeze; - /** - * 详细地址 - */ + @ApiModelProperty(value = "详细地址") private String detailAddress; - /** - * 真实姓名 - */ + @ApiModelProperty(value = "真实姓名") private String realName; - /** - * 排队状态 - */ @ApiModelProperty(value = "排队状态:0->未排队;1->排队中") private Integer orderStatus; diff --git a/mall-dao/src/main/java/com/buy507/mall/model/UmsMemberAccountTransaction.java b/mall-dao/src/main/java/com/buy507/mall/model/UmsMemberAccountTransaction.java index a645166..5650077 100644 --- a/mall-dao/src/main/java/com/buy507/mall/model/UmsMemberAccountTransaction.java +++ b/mall-dao/src/main/java/com/buy507/mall/model/UmsMemberAccountTransaction.java @@ -41,6 +41,9 @@ public class UmsMemberAccountTransaction implements Serializable { @ApiModelProperty(value = "转账时间") private Date transferPaymentTime; + @ApiModelProperty(value = "进账积分") + private Integer revenuePoints; + private static final long serialVersionUID = 1L; public Long getId() { @@ -83,6 +86,14 @@ public class UmsMemberAccountTransaction implements Serializable { this.transactionState = transactionState; } + public Integer getRevenuePoints() { + return revenuePoints; + } + + public void setRevenuePoints(Integer revenuePoints) { + this.revenuePoints = revenuePoints; + } + public String getRemarks() { return remarks; } @@ -117,21 +128,17 @@ public class UmsMemberAccountTransaction implements Serializable { @Override public String toString() { - StringBuilder sb = new StringBuilder(); - sb.append(getClass().getSimpleName()); - sb.append(" ["); - sb.append("Hash = ").append(hashCode()); - sb.append(", id=").append(id); - sb.append(", memberId=").append(memberId); - sb.append(", orderId=").append(orderId); - sb.append(", revenueAmount=").append(revenueAmount); - sb.append(", transactionState=").append(transactionState); - sb.append(", remarks=").append(remarks); - sb.append(", commissionRatio=").append(commissionRatio); - sb.append(", createTime=").append(createTime); - sb.append(", transferPaymentTime=").append(transferPaymentTime); - sb.append(", serialVersionUID=").append(serialVersionUID); - sb.append("]"); - return sb.toString(); + return "UmsMemberAccountTransaction{" + + "id=" + id + + ", memberId=" + memberId + + ", orderId=" + orderId + + ", revenueAmount=" + revenueAmount + + ", transactionState=" + transactionState + + ", remarks='" + remarks + '\'' + + ", commissionRatio=" + commissionRatio + + ", createTime=" + createTime + + ", transferPaymentTime=" + transferPaymentTime + + ", revenuePoints=" + revenuePoints + + '}'; } } \ No newline at end of file diff --git a/mall-dao/src/main/java/com/buy507/mall/model/UmsMemberLevel.java b/mall-dao/src/main/java/com/buy507/mall/model/UmsMemberLevel.java index 1e397af..8e0b59d 100644 --- a/mall-dao/src/main/java/com/buy507/mall/model/UmsMemberLevel.java +++ b/mall-dao/src/main/java/com/buy507/mall/model/UmsMemberLevel.java @@ -1,6 +1,7 @@ package com.buy507.mall.model; import io.swagger.annotations.ApiModelProperty; + import java.io.Serializable; import java.math.BigDecimal; @@ -44,9 +45,12 @@ public class UmsMemberLevel implements Serializable { @ApiModelProperty(value = "注释") private String note; - @ApiModelProperty(value = "提成比例") + @ApiModelProperty(value = "现金提成比例") private Integer commissionRatio; + @ApiModelProperty(value = "积分提成比例") + private Integer pointsRatio; + private static final long serialVersionUID = 1L; public Long getId() { @@ -161,28 +165,32 @@ public class UmsMemberLevel implements Serializable { this.commissionRatio = commissionRatio; } + public Integer getPointsRatio() { + return pointsRatio; + } + + public void setPointsRatio(Integer pointsRatio) { + this.pointsRatio = pointsRatio; + } + @Override public String toString() { - StringBuilder sb = new StringBuilder(); - sb.append(getClass().getSimpleName()); - sb.append(" ["); - sb.append("Hash = ").append(hashCode()); - sb.append(", id=").append(id); - sb.append(", name=").append(name); - sb.append(", growthPoint=").append(growthPoint); - sb.append(", defaultStatus=").append(defaultStatus); - sb.append(", freeFreightPoint=").append(freeFreightPoint); - sb.append(", commentGrowthPoint=").append(commentGrowthPoint); - sb.append(", priviledgeFreeFreight=").append(priviledgeFreeFreight); - sb.append(", priviledgeSignIn=").append(priviledgeSignIn); - sb.append(", priviledgeComment=").append(priviledgeComment); - sb.append(", priviledgePromotion=").append(priviledgePromotion); - sb.append(", priviledgeMemberPrice=").append(priviledgeMemberPrice); - sb.append(", priviledgeBirthday=").append(priviledgeBirthday); - sb.append(", note=").append(note); - sb.append(", commissionRatio=").append(commissionRatio); - sb.append(", serialVersionUID=").append(serialVersionUID); - sb.append("]"); - return sb.toString(); + return "UmsMemberLevel{" + + "id=" + id + + ", name='" + name + '\'' + + ", growthPoint=" + growthPoint + + ", defaultStatus=" + defaultStatus + + ", freeFreightPoint=" + freeFreightPoint + + ", commentGrowthPoint=" + commentGrowthPoint + + ", priviledgeFreeFreight=" + priviledgeFreeFreight + + ", priviledgeSignIn=" + priviledgeSignIn + + ", priviledgeComment=" + priviledgeComment + + ", priviledgePromotion=" + priviledgePromotion + + ", priviledgeMemberPrice=" + priviledgeMemberPrice + + ", priviledgeBirthday=" + priviledgeBirthday + + ", note='" + note + '\'' + + ", commissionRatio=" + commissionRatio + + ", pointsRatio=" + pointsRatio + + '}'; } } \ No newline at end of file diff --git a/mall-dao/src/main/resources/com/buy507/mall/mapper/UmsMemberAccountTransactionMapper.xml b/mall-dao/src/main/resources/com/buy507/mall/mapper/UmsMemberAccountTransactionMapper.xml index ed0f50b..d9e8701 100644 --- a/mall-dao/src/main/resources/com/buy507/mall/mapper/UmsMemberAccountTransactionMapper.xml +++ b/mall-dao/src/main/resources/com/buy507/mall/mapper/UmsMemberAccountTransactionMapper.xml @@ -109,10 +109,10 @@ SELECT LAST_INSERT_ID() insert into ums_member_account_transaction (member_id, order_id, revenue_amount, - transaction_state, remarks, commission_ratio, transfer_payment_time) + transaction_state, remarks, commission_ratio, transfer_payment_time, revenue_points) values (#{memberId,jdbcType=BIGINT}, #{orderId,jdbcType=BIGINT}, #{revenueAmount,jdbcType=DECIMAL}, #{transactionState,jdbcType=INTEGER}, #{remarks,jdbcType=VARCHAR}, #{commissionRatio,jdbcType=INTEGER}, - #{transferPaymentTime,jdbcType=TIMESTAMP}) + #{transferPaymentTime,jdbcType=TIMESTAMP}, #{revenuePoints,jdbcType=INTEGER}) diff --git a/mall-dao/src/main/resources/com/buy507/mall/mapper/UmsMemberRelationTreeMapper.xml b/mall-dao/src/main/resources/com/buy507/mall/mapper/UmsMemberRelationTreeMapper.xml index d21a5e5..901324a 100644 --- a/mall-dao/src/main/resources/com/buy507/mall/mapper/UmsMemberRelationTreeMapper.xml +++ b/mall-dao/src/main/resources/com/buy507/mall/mapper/UmsMemberRelationTreeMapper.xml @@ -141,7 +141,7 @@ - + update ums_member_relation_tree diff --git a/mall-portal/src/main/java/com/buy507/mall/portal/domain/OrderResult.java b/mall-portal/src/main/java/com/buy507/mall/portal/domain/OrderResult.java index d1c1b25..f5ebab4 100644 --- a/mall-portal/src/main/java/com/buy507/mall/portal/domain/OrderResult.java +++ b/mall-portal/src/main/java/com/buy507/mall/portal/domain/OrderResult.java @@ -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 = "支付类型名称") diff --git a/mall-portal/src/main/java/com/buy507/mall/portal/service/MemberCommissionService.java b/mall-portal/src/main/java/com/buy507/mall/portal/service/MemberCommissionService.java index 7335b2a..87252cd 100644 --- a/mall-portal/src/main/java/com/buy507/mall/portal/service/MemberCommissionService.java +++ b/mall-portal/src/main/java/com/buy507/mall/portal/service/MemberCommissionService.java @@ -9,7 +9,6 @@ import com.buy507.mall.model.UmsMember; public interface MemberCommissionService { /** * 开始冻结金额到账,等级升级 - * @param order * @param currentMember */ void computeCommission(UmsMember currentMember); diff --git a/mall-portal/src/main/java/com/buy507/mall/portal/service/impl/MemberPointsSplitProfitService.java b/mall-portal/src/main/java/com/buy507/mall/portal/service/impl/MemberPointsSplitProfitService.java new file mode 100644 index 0000000..1994a66 --- /dev/null +++ b/mall-portal/src/main/java/com/buy507/mall/portal/service/impl/MemberPointsSplitProfitService.java @@ -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 relationTreeList = umsMemberRelationTreeMapper.selectByExample(relationTreeExample); + if(!relationTreeList.isEmpty()) { + //找到上级关系 + relationTree = relationTreeList.get(0); + } + return relationTree; + } +} diff --git a/mall-portal/src/main/java/com/buy507/mall/portal/service/impl/MemberSplitProfitService.java b/mall-portal/src/main/java/com/buy507/mall/portal/service/impl/MemberSplitProfitService.java index e223c35..f862104 100644 --- a/mall-portal/src/main/java/com/buy507/mall/portal/service/impl/MemberSplitProfitService.java +++ b/mall-portal/src/main/java/com/buy507/mall/portal/service/impl/MemberSplitProfitService.java @@ -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; } - - - } diff --git a/mall-portal/src/main/java/com/buy507/mall/portal/service/impl/OmsPortalOrderServiceImpl.java b/mall-portal/src/main/java/com/buy507/mall/portal/service/impl/OmsPortalOrderServiceImpl.java index 462eb58..891bdc4 100644 --- a/mall-portal/src/main/java/com/buy507/mall/portal/service/impl/OmsPortalOrderServiceImpl.java +++ b/mall-portal/src/main/java/com/buy507/mall/portal/service/impl/OmsPortalOrderServiceImpl.java @@ -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); - } } }