diff --git a/document/sql/mall_dms_structure.sql b/document/sql/mall_dms_structure.sql index 962ddcb..64b7a26 100644 --- a/document/sql/mall_dms_structure.sql +++ b/document/sql/mall_dms_structure.sql @@ -187,10 +187,11 @@ CREATE TABLE `dms_member_month_reward_record` ( ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='会员月度奖励发放记录表'; -alter table `ums_member` add column `member_level` int(1) null COMMENT '分销会员等级(0->普通会员;1->消费商;2->经销商;3->合作商;4->初级合作商;5->中级合作商;6->高级合作商;7->特级合作商))' default '0' AFTER `member_level_id`; +alter table `ums_member` add column `member_level` int(1) null COMMENT '分销会员等级(0->普通用户;1->vip会员;2->店长;3->代理;4->市代;5->中级合作商;6->高级合作商;7->特级合作商))' default '0' AFTER `member_level_id`; alter table `ums_member` add column `store_status` int(1) null COMMENT '分销实体店状态(0->未开店;1->已开店)' default '0'; alter table `ums_member` add column `balance` decimal(10,2) null COMMENT '余额' default '0.00'; alter table `ums_member` add column `freeze` decimal(10,2) null COMMENT '冻结余额' default '0.00'; +alter table `ums_member` add column `order_status` int(1) null COMMENT '排队状态:0->未排队;1->排队中' default '0'; alter table `oms_order` add column settlement_status int(1) null COMMENT '分销结算状态(0->未结算;1->已结算;2->不结算)' default '0'; alter table `oms_order` add column settlement_time datetime null COMMENT '分销结算时间'; diff --git a/document/sql/mall_structure.sql b/document/sql/mall_structure.sql index 1e32cd7..fe12e8b 100644 --- a/document/sql/mall_structure.sql +++ b/document/sql/mall_structure.sql @@ -971,7 +971,7 @@ CREATE TABLE IF NOT EXISTS `ums_integration_consume_setting` ( DROP TABLE IF EXISTS `ums_member`; CREATE TABLE IF NOT EXISTS `ums_member` ( `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键id', - `member_level_id` bigint(20) DEFAULT NULL COMMENT '会员等级id', + `member_level_id` bigint(20) DEFAULT 0 COMMENT '会员等级id', `username` varchar(64) DEFAULT NULL COMMENT '用户名', `password` varchar(64) DEFAULT NULL COMMENT '密码', `nickname` varchar(64) DEFAULT NULL COMMENT '昵称', @@ -1209,7 +1209,6 @@ alter table ums_member change nickname nickname varchar(64) character set utf8mb CREATE TABLE `ums_member_relation_tree` ( `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键id', `member_id` bigint(20) NULL DEFAULT 0 COMMENT '会员id', - `lower_level_id` bigint(20) NULL DEFAULT 0 COMMENT '下级会员id', `higher_level_id` bigint(20) NULL DEFAULT 0 COMMENT '上级会员id', `create_time` datetime(0) NULL DEFAULT CURRENT_TIMESTAMP(0) COMMENT '创建时间', PRIMARY KEY (`id`) USING BTREE @@ -1224,8 +1223,8 @@ alter table ums_member change nickname nickname varchar(64) character set utf8mb `order_amount` decimal(10, 2) NULL DEFAULT 0 COMMENT '订单金额', `queue_index` bigint(20) NULL DEFAULT 0 COMMENT '队列位置', `quit_queue_mark` int(1) NULL DEFAULT 0 COMMENT '0 未退出,1 准备退队列, 2退出队列', - `queue_type` int(1) NULL DEFAULT 0 COMMENT '0 普通队列,1 加速队列', - `remain_number` int(1) NULL DEFAULT 5 COMMENT '加速单剩余数量', + `queue_type` int(1) NULL DEFAULT 0 COMMENT '0 普通队列,1 加速队列', + `remain_number` int(1) NULL DEFAULT 5 COMMENT '加速单剩余数量', `create_time` datetime(0) NULL DEFAULT CURRENT_TIMESTAMP(0) COMMENT '创建时间', PRIMARY KEY (`id`) USING BTREE ) ENGINE = InnoDB AUTO_INCREMENT = 0 CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '会员订单队列' ROW_FORMAT = DYNAMIC; @@ -1237,11 +1236,11 @@ CREATE TABLE `ums_member_account_transaction` ( `member_id` bigint(20) NULL DEFAULT 0 COMMENT '会员id', `order_id` bigint(20) NULL DEFAULT 0 COMMENT '订单id', `revenue_amount` decimal(10, 2) NULL DEFAULT 0 COMMENT '进帐金额', - `transaction_state` int(1) NULL DEFAULT 0 COMMENT '转账状态 0 未转账,1 转账, 2 退款', + `transaction_state` int(1) NULL DEFAULT 0 COMMENT '转账状态 0 未转账,1 转账, 2 退款', `remarks` varchar(200) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '备注', `commission_ratio` int(10) NULL DEFAULT 0 COMMENT '提成比例', `create_time` datetime(0) NULL DEFAULT CURRENT_TIMESTAMP(0) COMMENT '创建时间', - `transfer_payment_time` datetime(0) NULL DEFAULT CURRENT_TIMESTAMP(0) COMMENT '转账时间', + `transfer_payment_time` datetime(0) NULL DEFAULT CURRENT_TIMESTAMP(0) COMMENT '转账时间', PRIMARY KEY (`id`) USING BTREE ) ENGINE = InnoDB AUTO_INCREMENT = 0 CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '会员账户流水' ROW_FORMAT = DYNAMIC; diff --git a/mall-admin/src/main/java/com/buy507/mall/dto/PmsProductParam.java b/mall-admin/src/main/java/com/buy507/mall/dto/PmsProductParam.java index 7616017..40472d3 100644 --- a/mall-admin/src/main/java/com/buy507/mall/dto/PmsProductParam.java +++ b/mall-admin/src/main/java/com/buy507/mall/dto/PmsProductParam.java @@ -24,6 +24,13 @@ public class PmsProductParam extends PmsProduct{ @ApiModelProperty("优选专区和商品的关系") private List prefrenceAreaProductRelationList; + + public List productCategoryId; + + public void setProductCategoryId(List productCategoryId) { + this.productCategoryId = productCategoryId; + } + public List getProductLadderList() { return productLadderList; } diff --git a/mall-admin/src/main/java/com/buy507/mall/service/impl/PmsProductServiceImpl.java b/mall-admin/src/main/java/com/buy507/mall/service/impl/PmsProductServiceImpl.java index 6d410b7..85eac7f 100644 --- a/mall-admin/src/main/java/com/buy507/mall/service/impl/PmsProductServiceImpl.java +++ b/mall-admin/src/main/java/com/buy507/mall/service/impl/PmsProductServiceImpl.java @@ -76,7 +76,7 @@ public class PmsProductServiceImpl implements PmsProductService { PmsProduct product = productParam; product.setId(null); product.setVerifyStatus(1); - PmsProductCategory productCategory = productCategoryMapper.selectByPrimaryKey(product.getProductCategoryId()); + PmsProductCategory productCategory = productCategoryMapper.selectByPrimaryKey( productParam.productCategoryId.get(0)); product.setProductCategoryName(productCategory.getName()); productMapper.insertSelective(product); //根据促销类型设置价格:、阶梯价格、满减价格 @@ -134,7 +134,7 @@ public class PmsProductServiceImpl implements PmsProductService { PmsProduct product = productParam; product.setId(id); product.setVerifyStatus(1); - PmsProductCategory productCategory = productCategoryMapper.selectByPrimaryKey(product.getProductCategoryId()); + PmsProductCategory productCategory = productCategoryMapper.selectByPrimaryKey(productParam.productCategoryId.get(0)); product.setProductCategoryName(productCategory.getName()); productMapper.updateByPrimaryKeySelective(product); //会员价格 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 efcbe81..14856de 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,15 @@ package com.buy507.mall.model; */ public enum MemberLevel { /**普通用户**/ - Member(1), + Member(0), /**vip会员**/ - Consumer(2), + Consumer(1), /**店长**/ - Partner(3), + Partner(2), /**代理**/ - Diamond(4), + Diamond(3), /** 市代 **/ - OneDiamond(5), + OneDiamond(4), TwoDiamond(6), //中级合作商 ThreeDiamond(7), //高级合作商 FourDiamond(8); //特级合作商 @@ -30,4 +30,12 @@ public enum MemberLevel { return value; } + public static MemberLevel getMemberByInt(int value){ + for (MemberLevel memberLevel : MemberLevel.values()) { + if(value == memberLevel.value){ + return memberLevel; + } + } + return null; + } } 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 7b2865c..72268c1 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 @@ -337,4 +337,6 @@ public class UmsMember implements Serializable { } + + } \ No newline at end of file diff --git a/mall-dao/src/main/java/com/buy507/mall/model/UmsMemberRelationTree.java b/mall-dao/src/main/java/com/buy507/mall/model/UmsMemberRelationTree.java index e56b1a8..495e585 100644 --- a/mall-dao/src/main/java/com/buy507/mall/model/UmsMemberRelationTree.java +++ b/mall-dao/src/main/java/com/buy507/mall/model/UmsMemberRelationTree.java @@ -11,9 +11,6 @@ public class UmsMemberRelationTree implements Serializable { @ApiModelProperty(value = "会员id") private Long memberId; - @ApiModelProperty(value = "下级会员id") - private Long lowerLevelId; - @ApiModelProperty(value = "上级会员id") private Long higherLevelId; @@ -38,14 +35,6 @@ public class UmsMemberRelationTree implements Serializable { this.memberId = memberId; } - public Long getLowerLevelId() { - return lowerLevelId; - } - - public void setLowerLevelId(Long lowerLevelId) { - this.lowerLevelId = lowerLevelId; - } - public Long getHigherLevelId() { return higherLevelId; } @@ -70,7 +59,6 @@ public class UmsMemberRelationTree implements Serializable { sb.append("Hash = ").append(hashCode()); sb.append(", id=").append(id); sb.append(", memberId=").append(memberId); - sb.append(", lowerLevelId=").append(lowerLevelId); sb.append(", higherLevelId=").append(higherLevelId); sb.append(", createTime=").append(createTime); sb.append(", serialVersionUID=").append(serialVersionUID); diff --git a/mall-dao/src/main/java/com/buy507/mall/model/UmsMemberRelationTreeExample.java b/mall-dao/src/main/java/com/buy507/mall/model/UmsMemberRelationTreeExample.java index bca4e95..26292ad 100644 --- a/mall-dao/src/main/java/com/buy507/mall/model/UmsMemberRelationTreeExample.java +++ b/mall-dao/src/main/java/com/buy507/mall/model/UmsMemberRelationTreeExample.java @@ -225,66 +225,6 @@ public class UmsMemberRelationTreeExample { return (Criteria) this; } - public Criteria andLowerLevelIdIsNull() { - addCriterion("lower_level_id is null"); - return (Criteria) this; - } - - public Criteria andLowerLevelIdIsNotNull() { - addCriterion("lower_level_id is not null"); - return (Criteria) this; - } - - public Criteria andLowerLevelIdEqualTo(Long value) { - addCriterion("lower_level_id =", value, "lowerLevelId"); - return (Criteria) this; - } - - public Criteria andLowerLevelIdNotEqualTo(Long value) { - addCriterion("lower_level_id <>", value, "lowerLevelId"); - return (Criteria) this; - } - - public Criteria andLowerLevelIdGreaterThan(Long value) { - addCriterion("lower_level_id >", value, "lowerLevelId"); - return (Criteria) this; - } - - public Criteria andLowerLevelIdGreaterThanOrEqualTo(Long value) { - addCriterion("lower_level_id >=", value, "lowerLevelId"); - return (Criteria) this; - } - - public Criteria andLowerLevelIdLessThan(Long value) { - addCriterion("lower_level_id <", value, "lowerLevelId"); - return (Criteria) this; - } - - public Criteria andLowerLevelIdLessThanOrEqualTo(Long value) { - addCriterion("lower_level_id <=", value, "lowerLevelId"); - return (Criteria) this; - } - - public Criteria andLowerLevelIdIn(List values) { - addCriterion("lower_level_id in", values, "lowerLevelId"); - return (Criteria) this; - } - - public Criteria andLowerLevelIdNotIn(List values) { - addCriterion("lower_level_id not in", values, "lowerLevelId"); - return (Criteria) this; - } - - public Criteria andLowerLevelIdBetween(Long value1, Long value2) { - addCriterion("lower_level_id between", value1, value2, "lowerLevelId"); - return (Criteria) this; - } - - public Criteria andLowerLevelIdNotBetween(Long value1, Long value2) { - addCriterion("lower_level_id not between", value1, value2, "lowerLevelId"); - return (Criteria) this; - } - public Criteria andHigherLevelIdIsNull() { addCriterion("higher_level_id is null"); return (Criteria) this; 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 c323e6d..ed0f50b 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,11 +109,10 @@ SELECT LAST_INSERT_ID() insert into ums_member_account_transaction (member_id, order_id, revenue_amount, - transaction_state, remarks, commission_ratio, - create_time, transfer_payment_time) + transaction_state, remarks, commission_ratio, transfer_payment_time) values (#{memberId,jdbcType=BIGINT}, #{orderId,jdbcType=BIGINT}, #{revenueAmount,jdbcType=DECIMAL}, #{transactionState,jdbcType=INTEGER}, #{remarks,jdbcType=VARCHAR}, #{commissionRatio,jdbcType=INTEGER}, - #{createTime,jdbcType=TIMESTAMP}, #{transferPaymentTime,jdbcType=TIMESTAMP}) + #{transferPaymentTime,jdbcType=TIMESTAMP}) diff --git a/mall-dao/src/main/resources/com/buy507/mall/mapper/UmsMemberMapper.xml b/mall-dao/src/main/resources/com/buy507/mall/mapper/UmsMemberMapper.xml index 905e7c7..b9c7347 100644 --- a/mall-dao/src/main/resources/com/buy507/mall/mapper/UmsMemberMapper.xml +++ b/mall-dao/src/main/resources/com/buy507/mall/mapper/UmsMemberMapper.xml @@ -533,8 +533,8 @@ balance = #{balance,jdbcType=DECIMAL}, freeze = #{freeze,jdbcType=DECIMAL}, detail_address = #{detailAddress,jdbcType=VARCHAR}, - real_name = #{realName,jdbcType=VARCHAR} - order_status = #{orderStatus,jdbcType=INTEGER}, + real_name = #{realName,jdbcType=VARCHAR}, + order_status = #{orderStatus,jdbcType=INTEGER} where id = #{id,jdbcType=BIGINT} select @@ -103,10 +102,10 @@ SELECT LAST_INSERT_ID() - insert into ums_member_relation_tree (member_id, lower_level_id, higher_level_id, - create_time) - values (#{memberId,jdbcType=BIGINT}, #{lowerLevelId,jdbcType=BIGINT}, #{higherLevelId,jdbcType=BIGINT}, - #{createTime,jdbcType=TIMESTAMP}) + insert into ums_member_relation_tree (member_id, higher_level_id, create_time + ) + values (#{memberId,jdbcType=BIGINT}, #{higherLevelId,jdbcType=BIGINT}, #{createTime,jdbcType=TIMESTAMP} + ) @@ -117,9 +116,6 @@ member_id, - - lower_level_id, - higher_level_id, @@ -131,9 +127,6 @@ #{memberId,jdbcType=BIGINT}, - - #{lowerLevelId,jdbcType=BIGINT}, - #{higherLevelId,jdbcType=BIGINT}, @@ -157,9 +150,6 @@ member_id = #{record.memberId,jdbcType=BIGINT}, - - lower_level_id = #{record.lowerLevelId,jdbcType=BIGINT}, - higher_level_id = #{record.higherLevelId,jdbcType=BIGINT}, @@ -175,7 +165,6 @@ update ums_member_relation_tree set id = #{record.id,jdbcType=BIGINT}, member_id = #{record.memberId,jdbcType=BIGINT}, - lower_level_id = #{record.lowerLevelId,jdbcType=BIGINT}, higher_level_id = #{record.higherLevelId,jdbcType=BIGINT}, create_time = #{record.createTime,jdbcType=TIMESTAMP} @@ -188,9 +177,6 @@ member_id = #{memberId,jdbcType=BIGINT}, - - lower_level_id = #{lowerLevelId,jdbcType=BIGINT}, - higher_level_id = #{higherLevelId,jdbcType=BIGINT}, @@ -203,7 +189,6 @@ update ums_member_relation_tree set member_id = #{memberId,jdbcType=BIGINT}, - lower_level_id = #{lowerLevelId,jdbcType=BIGINT}, higher_level_id = #{higherLevelId,jdbcType=BIGINT}, create_time = #{createTime,jdbcType=TIMESTAMP} where id = #{id,jdbcType=BIGINT} diff --git a/mall-portal/src/main/java/com/buy507/mall/portal/service/impl/MemberCommissionServiceImpl.java b/mall-portal/src/main/java/com/buy507/mall/portal/service/impl/MemberCommissionServiceImpl.java index 972fcc4..fe0cdf3 100644 --- a/mall-portal/src/main/java/com/buy507/mall/portal/service/impl/MemberCommissionServiceImpl.java +++ b/mall-portal/src/main/java/com/buy507/mall/portal/service/impl/MemberCommissionServiceImpl.java @@ -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 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 new file mode 100644 index 0000000..ab13430 --- /dev/null +++ b/mall-portal/src/main/java/com/buy507/mall/portal/service/impl/MemberSplitProfitService.java @@ -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 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 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 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 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 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 transactionList = umsMemberAccountTransactionMapper.selectByExample(accountTransactionExample); + //该笔流水账 + if(!transactionList.isEmpty()){ + UmsMemberAccountTransaction umat = transactionList.get(0); + umat.setTransactionState(UmsMemberAccountTransaction.TRANSACTION_STATE_OUT); + umsMemberAccountTransactionMapper.updateByPrimaryKeySelective(umat); + } + } + +} 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 6bce941..ad96619 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 @@ -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 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 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 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 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 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 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 relationTreeList = umsMemberRelationTreeMapper.selectByExample(relationTreeExample); - if(!relationTreeList.isEmpty()) { - //找到上级关系 - relationTree = relationTreeList.get(0); - } - return relationTree; +// } catch (AlipayApiException e) { +// e.printStackTrace(); +// } } } diff --git a/mall-portal/src/test/java/com/buy507/mall/portal/OmsPortalOrderServiceTest.java b/mall-portal/src/test/java/com/buy507/mall/portal/OmsPortalOrderServiceTest.java new file mode 100644 index 0000000..c70cde0 --- /dev/null +++ b/mall-portal/src/test/java/com/buy507/mall/portal/OmsPortalOrderServiceTest.java @@ -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); + } + + + + + +}