加入队列分润逻辑

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

View File

@@ -187,10 +187,11 @@ CREATE TABLE `dms_member_month_reward_record` (
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='会员月度奖励发放记录表'; ) 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 `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 `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 `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_status int(1) null COMMENT '分销结算状态0->未结算1->已结算2->不结算)' default '0';
alter table `oms_order` add column settlement_time datetime null COMMENT '分销结算时间'; alter table `oms_order` add column settlement_time datetime null COMMENT '分销结算时间';

View File

@@ -971,7 +971,7 @@ CREATE TABLE IF NOT EXISTS `ums_integration_consume_setting` (
DROP TABLE IF EXISTS `ums_member`; DROP TABLE IF EXISTS `ums_member`;
CREATE TABLE IF NOT EXISTS `ums_member` ( CREATE TABLE IF NOT EXISTS `ums_member` (
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键id', `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 '用户名', `username` varchar(64) DEFAULT NULL COMMENT '用户名',
`password` varchar(64) DEFAULT NULL COMMENT '密码', `password` varchar(64) DEFAULT NULL COMMENT '密码',
`nickname` 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` ( CREATE TABLE `ums_member_relation_tree` (
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键id', `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键id',
`member_id` bigint(20) NULL DEFAULT 0 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', `higher_level_id` bigint(20) NULL DEFAULT 0 COMMENT '上级会员id',
`create_time` datetime(0) NULL DEFAULT CURRENT_TIMESTAMP(0) COMMENT '创建时间', `create_time` datetime(0) NULL DEFAULT CURRENT_TIMESTAMP(0) COMMENT '创建时间',
PRIMARY KEY (`id`) USING BTREE 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 '订单金额', `order_amount` decimal(10, 2) NULL DEFAULT 0 COMMENT '订单金额',
`queue_index` bigint(20) NULL DEFAULT 0 COMMENT '队列位置', `queue_index` bigint(20) NULL DEFAULT 0 COMMENT '队列位置',
`quit_queue_mark` int(1) NULL DEFAULT 0 COMMENT '0 未退出1 准备退队列, 2退出队列', `quit_queue_mark` int(1) NULL DEFAULT 0 COMMENT '0 未退出1 准备退队列, 2退出队列',
`queue_type` int(1) NULL DEFAULT 0 COMMENT '0 普通队列1 加速队列', `queue_type` int(1) NULL DEFAULT 0 COMMENT '0 普通队列1 加速队列',
`remain_number` int(1) NULL DEFAULT 5 COMMENT '加速单剩余数量', `remain_number` int(1) NULL DEFAULT 5 COMMENT '加速单剩余数量',
`create_time` datetime(0) NULL DEFAULT CURRENT_TIMESTAMP(0) COMMENT '创建时间', `create_time` datetime(0) NULL DEFAULT CURRENT_TIMESTAMP(0) COMMENT '创建时间',
PRIMARY KEY (`id`) USING BTREE PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 0 CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '会员订单队列' ROW_FORMAT = DYNAMIC; ) 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', `member_id` bigint(20) NULL DEFAULT 0 COMMENT '会员id',
`order_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 '进帐金额', `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 '备注', `remarks` varchar(200) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '备注',
`commission_ratio` int(10) NULL DEFAULT 0 COMMENT '提成比例', `commission_ratio` int(10) NULL DEFAULT 0 COMMENT '提成比例',
`create_time` datetime(0) NULL DEFAULT CURRENT_TIMESTAMP(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 PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 0 CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '会员账户流水' ROW_FORMAT = DYNAMIC; ) ENGINE = InnoDB AUTO_INCREMENT = 0 CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '会员账户流水' ROW_FORMAT = DYNAMIC;

View File

@@ -24,6 +24,13 @@ public class PmsProductParam extends PmsProduct{
@ApiModelProperty("优选专区和商品的关系") @ApiModelProperty("优选专区和商品的关系")
private List<CmsPrefrenceAreaProductRelation> prefrenceAreaProductRelationList; private List<CmsPrefrenceAreaProductRelation> prefrenceAreaProductRelationList;
public List<Long> productCategoryId;
public void setProductCategoryId(List<Long> productCategoryId) {
this.productCategoryId = productCategoryId;
}
public List<PmsProductLadder> getProductLadderList() { public List<PmsProductLadder> getProductLadderList() {
return productLadderList; return productLadderList;
} }

View File

@@ -76,7 +76,7 @@ public class PmsProductServiceImpl implements PmsProductService {
PmsProduct product = productParam; PmsProduct product = productParam;
product.setId(null); product.setId(null);
product.setVerifyStatus(1); product.setVerifyStatus(1);
PmsProductCategory productCategory = productCategoryMapper.selectByPrimaryKey(product.getProductCategoryId()); PmsProductCategory productCategory = productCategoryMapper.selectByPrimaryKey( productParam.productCategoryId.get(0));
product.setProductCategoryName(productCategory.getName()); product.setProductCategoryName(productCategory.getName());
productMapper.insertSelective(product); productMapper.insertSelective(product);
//根据促销类型设置价格:、阶梯价格、满减价格 //根据促销类型设置价格:、阶梯价格、满减价格
@@ -134,7 +134,7 @@ public class PmsProductServiceImpl implements PmsProductService {
PmsProduct product = productParam; PmsProduct product = productParam;
product.setId(id); product.setId(id);
product.setVerifyStatus(1); product.setVerifyStatus(1);
PmsProductCategory productCategory = productCategoryMapper.selectByPrimaryKey(product.getProductCategoryId()); PmsProductCategory productCategory = productCategoryMapper.selectByPrimaryKey(productParam.productCategoryId.get(0));
product.setProductCategoryName(productCategory.getName()); product.setProductCategoryName(productCategory.getName());
productMapper.updateByPrimaryKeySelective(product); productMapper.updateByPrimaryKeySelective(product);
//会员价格 //会员价格

View File

@@ -7,15 +7,15 @@ package com.buy507.mall.model;
*/ */
public enum MemberLevel { public enum MemberLevel {
/**普通用户**/ /**普通用户**/
Member(1), Member(0),
/**vip会员**/ /**vip会员**/
Consumer(2), Consumer(1),
/**店长**/ /**店长**/
Partner(3), Partner(2),
/**代理**/ /**代理**/
Diamond(4), Diamond(3),
/** 市代 **/ /** 市代 **/
OneDiamond(5), OneDiamond(4),
TwoDiamond(6), //中级合作商 TwoDiamond(6), //中级合作商
ThreeDiamond(7), //高级合作商 ThreeDiamond(7), //高级合作商
FourDiamond(8); //特级合作商 FourDiamond(8); //特级合作商
@@ -30,4 +30,12 @@ public enum MemberLevel {
return value; return value;
} }
public static MemberLevel getMemberByInt(int value){
for (MemberLevel memberLevel : MemberLevel.values()) {
if(value == memberLevel.value){
return memberLevel;
}
}
return null;
}
} }

View File

@@ -337,4 +337,6 @@ public class UmsMember implements Serializable {
} }
} }

View File

@@ -11,9 +11,6 @@ public class UmsMemberRelationTree implements Serializable {
@ApiModelProperty(value = "会员id") @ApiModelProperty(value = "会员id")
private Long memberId; private Long memberId;
@ApiModelProperty(value = "下级会员id")
private Long lowerLevelId;
@ApiModelProperty(value = "上级会员id") @ApiModelProperty(value = "上级会员id")
private Long higherLevelId; private Long higherLevelId;
@@ -38,14 +35,6 @@ public class UmsMemberRelationTree implements Serializable {
this.memberId = memberId; this.memberId = memberId;
} }
public Long getLowerLevelId() {
return lowerLevelId;
}
public void setLowerLevelId(Long lowerLevelId) {
this.lowerLevelId = lowerLevelId;
}
public Long getHigherLevelId() { public Long getHigherLevelId() {
return higherLevelId; return higherLevelId;
} }
@@ -70,7 +59,6 @@ public class UmsMemberRelationTree implements Serializable {
sb.append("Hash = ").append(hashCode()); sb.append("Hash = ").append(hashCode());
sb.append(", id=").append(id); sb.append(", id=").append(id);
sb.append(", memberId=").append(memberId); sb.append(", memberId=").append(memberId);
sb.append(", lowerLevelId=").append(lowerLevelId);
sb.append(", higherLevelId=").append(higherLevelId); sb.append(", higherLevelId=").append(higherLevelId);
sb.append(", createTime=").append(createTime); sb.append(", createTime=").append(createTime);
sb.append(", serialVersionUID=").append(serialVersionUID); sb.append(", serialVersionUID=").append(serialVersionUID);

View File

@@ -225,66 +225,6 @@ public class UmsMemberRelationTreeExample {
return (Criteria) this; 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<Long> values) {
addCriterion("lower_level_id in", values, "lowerLevelId");
return (Criteria) this;
}
public Criteria andLowerLevelIdNotIn(List<Long> 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() { public Criteria andHigherLevelIdIsNull() {
addCriterion("higher_level_id is null"); addCriterion("higher_level_id is null");
return (Criteria) this; return (Criteria) this;

View File

@@ -109,11 +109,10 @@
SELECT LAST_INSERT_ID() SELECT LAST_INSERT_ID()
</selectKey> </selectKey>
insert into ums_member_account_transaction (member_id, order_id, revenue_amount, insert into ums_member_account_transaction (member_id, order_id, revenue_amount,
transaction_state, remarks, commission_ratio, transaction_state, remarks, commission_ratio, transfer_payment_time)
create_time, transfer_payment_time)
values (#{memberId,jdbcType=BIGINT}, #{orderId,jdbcType=BIGINT}, #{revenueAmount,jdbcType=DECIMAL}, values (#{memberId,jdbcType=BIGINT}, #{orderId,jdbcType=BIGINT}, #{revenueAmount,jdbcType=DECIMAL},
#{transactionState,jdbcType=INTEGER}, #{remarks,jdbcType=VARCHAR}, #{commissionRatio,jdbcType=INTEGER}, #{transactionState,jdbcType=INTEGER}, #{remarks,jdbcType=VARCHAR}, #{commissionRatio,jdbcType=INTEGER},
#{createTime,jdbcType=TIMESTAMP}, #{transferPaymentTime,jdbcType=TIMESTAMP}) #{transferPaymentTime,jdbcType=TIMESTAMP})
</insert> </insert>
<insert id="insertSelective" parameterType="com.buy507.mall.model.UmsMemberAccountTransaction"> <insert id="insertSelective" parameterType="com.buy507.mall.model.UmsMemberAccountTransaction">
<selectKey keyProperty="id" order="AFTER" resultType="java.lang.Long"> <selectKey keyProperty="id" order="AFTER" resultType="java.lang.Long">

View File

@@ -533,8 +533,8 @@
balance = #{balance,jdbcType=DECIMAL}, balance = #{balance,jdbcType=DECIMAL},
freeze = #{freeze,jdbcType=DECIMAL}, freeze = #{freeze,jdbcType=DECIMAL},
detail_address = #{detailAddress,jdbcType=VARCHAR}, detail_address = #{detailAddress,jdbcType=VARCHAR},
real_name = #{realName,jdbcType=VARCHAR} real_name = #{realName,jdbcType=VARCHAR},
order_status = #{orderStatus,jdbcType=INTEGER}, order_status = #{orderStatus,jdbcType=INTEGER}
where id = #{id,jdbcType=BIGINT} where id = #{id,jdbcType=BIGINT}
</update> </update>
<select id="selectPhoneExists" parameterType="java.lang.String" resultMap="BaseResultMap"> <select id="selectPhoneExists" parameterType="java.lang.String" resultMap="BaseResultMap">

View File

@@ -109,11 +109,10 @@
SELECT LAST_INSERT_ID() SELECT LAST_INSERT_ID()
</selectKey> </selectKey>
insert into ums_member_order_queue (member_id, order_id, order_amount, insert into ums_member_order_queue (member_id, order_id, order_amount,
queue_index, quit_queue_mark, queue_type, queue_index, quit_queue_mark, queue_type,remain_number)
remain_number, create_time)
values (#{memberId,jdbcType=BIGINT}, #{orderId,jdbcType=BIGINT}, #{orderAmount,jdbcType=DECIMAL}, values (#{memberId,jdbcType=BIGINT}, #{orderId,jdbcType=BIGINT}, #{orderAmount,jdbcType=DECIMAL},
#{queueIndex,jdbcType=BIGINT}, #{quitQueueMark,jdbcType=INTEGER}, #{queueType,jdbcType=INTEGER}, #{queueIndex,jdbcType=BIGINT}, #{quitQueueMark,jdbcType=INTEGER}, #{queueType,jdbcType=INTEGER},
#{remainNumber,jdbcType=INTEGER}, #{createTime,jdbcType=TIMESTAMP}) #{remainNumber,jdbcType=INTEGER})
</insert> </insert>
<insert id="insertSelective" parameterType="com.buy507.mall.model.UmsMemberOrderQueue"> <insert id="insertSelective" parameterType="com.buy507.mall.model.UmsMemberOrderQueue">
<selectKey keyProperty="id" order="AFTER" resultType="java.lang.Long"> <selectKey keyProperty="id" order="AFTER" resultType="java.lang.Long">

View File

@@ -4,7 +4,6 @@
<resultMap id="BaseResultMap" type="com.buy507.mall.model.UmsMemberRelationTree"> <resultMap id="BaseResultMap" type="com.buy507.mall.model.UmsMemberRelationTree">
<id column="id" jdbcType="BIGINT" property="id" /> <id column="id" jdbcType="BIGINT" property="id" />
<result column="member_id" jdbcType="BIGINT" property="memberId" /> <result column="member_id" jdbcType="BIGINT" property="memberId" />
<result column="lower_level_id" jdbcType="BIGINT" property="lowerLevelId" />
<result column="higher_level_id" jdbcType="BIGINT" property="higherLevelId" /> <result column="higher_level_id" jdbcType="BIGINT" property="higherLevelId" />
<result column="create_time" jdbcType="TIMESTAMP" property="createTime" /> <result column="create_time" jdbcType="TIMESTAMP" property="createTime" />
</resultMap> </resultMap>
@@ -67,7 +66,7 @@
</where> </where>
</sql> </sql>
<sql id="Base_Column_List"> <sql id="Base_Column_List">
id, member_id, lower_level_id, higher_level_id, create_time id, member_id, higher_level_id, create_time
</sql> </sql>
<select id="selectByExample" parameterType="com.buy507.mall.model.UmsMemberRelationTreeExample" resultMap="BaseResultMap"> <select id="selectByExample" parameterType="com.buy507.mall.model.UmsMemberRelationTreeExample" resultMap="BaseResultMap">
select select
@@ -103,10 +102,10 @@
<selectKey keyProperty="id" order="AFTER" resultType="java.lang.Long"> <selectKey keyProperty="id" order="AFTER" resultType="java.lang.Long">
SELECT LAST_INSERT_ID() SELECT LAST_INSERT_ID()
</selectKey> </selectKey>
insert into ums_member_relation_tree (member_id, lower_level_id, higher_level_id, insert into ums_member_relation_tree (member_id, higher_level_id, create_time
create_time) )
values (#{memberId,jdbcType=BIGINT}, #{lowerLevelId,jdbcType=BIGINT}, #{higherLevelId,jdbcType=BIGINT}, values (#{memberId,jdbcType=BIGINT}, #{higherLevelId,jdbcType=BIGINT}, #{createTime,jdbcType=TIMESTAMP}
#{createTime,jdbcType=TIMESTAMP}) )
</insert> </insert>
<insert id="insertSelective" parameterType="com.buy507.mall.model.UmsMemberRelationTree"> <insert id="insertSelective" parameterType="com.buy507.mall.model.UmsMemberRelationTree">
<selectKey keyProperty="id" order="AFTER" resultType="java.lang.Long"> <selectKey keyProperty="id" order="AFTER" resultType="java.lang.Long">
@@ -117,9 +116,6 @@
<if test="memberId != null"> <if test="memberId != null">
member_id, member_id,
</if> </if>
<if test="lowerLevelId != null">
lower_level_id,
</if>
<if test="higherLevelId != null"> <if test="higherLevelId != null">
higher_level_id, higher_level_id,
</if> </if>
@@ -131,9 +127,6 @@
<if test="memberId != null"> <if test="memberId != null">
#{memberId,jdbcType=BIGINT}, #{memberId,jdbcType=BIGINT},
</if> </if>
<if test="lowerLevelId != null">
#{lowerLevelId,jdbcType=BIGINT},
</if>
<if test="higherLevelId != null"> <if test="higherLevelId != null">
#{higherLevelId,jdbcType=BIGINT}, #{higherLevelId,jdbcType=BIGINT},
</if> </if>
@@ -157,9 +150,6 @@
<if test="record.memberId != null"> <if test="record.memberId != null">
member_id = #{record.memberId,jdbcType=BIGINT}, member_id = #{record.memberId,jdbcType=BIGINT},
</if> </if>
<if test="record.lowerLevelId != null">
lower_level_id = #{record.lowerLevelId,jdbcType=BIGINT},
</if>
<if test="record.higherLevelId != null"> <if test="record.higherLevelId != null">
higher_level_id = #{record.higherLevelId,jdbcType=BIGINT}, higher_level_id = #{record.higherLevelId,jdbcType=BIGINT},
</if> </if>
@@ -175,7 +165,6 @@
update ums_member_relation_tree update ums_member_relation_tree
set id = #{record.id,jdbcType=BIGINT}, set id = #{record.id,jdbcType=BIGINT},
member_id = #{record.memberId,jdbcType=BIGINT}, member_id = #{record.memberId,jdbcType=BIGINT},
lower_level_id = #{record.lowerLevelId,jdbcType=BIGINT},
higher_level_id = #{record.higherLevelId,jdbcType=BIGINT}, higher_level_id = #{record.higherLevelId,jdbcType=BIGINT},
create_time = #{record.createTime,jdbcType=TIMESTAMP} create_time = #{record.createTime,jdbcType=TIMESTAMP}
<if test="_parameter != null"> <if test="_parameter != null">
@@ -188,9 +177,6 @@
<if test="memberId != null"> <if test="memberId != null">
member_id = #{memberId,jdbcType=BIGINT}, member_id = #{memberId,jdbcType=BIGINT},
</if> </if>
<if test="lowerLevelId != null">
lower_level_id = #{lowerLevelId,jdbcType=BIGINT},
</if>
<if test="higherLevelId != null"> <if test="higherLevelId != null">
higher_level_id = #{higherLevelId,jdbcType=BIGINT}, higher_level_id = #{higherLevelId,jdbcType=BIGINT},
</if> </if>
@@ -203,7 +189,6 @@
<update id="updateByPrimaryKey" parameterType="com.buy507.mall.model.UmsMemberRelationTree"> <update id="updateByPrimaryKey" parameterType="com.buy507.mall.model.UmsMemberRelationTree">
update ums_member_relation_tree update ums_member_relation_tree
set member_id = #{memberId,jdbcType=BIGINT}, set member_id = #{memberId,jdbcType=BIGINT},
lower_level_id = #{lowerLevelId,jdbcType=BIGINT},
higher_level_id = #{higherLevelId,jdbcType=BIGINT}, higher_level_id = #{higherLevelId,jdbcType=BIGINT},
create_time = #{createTime,jdbcType=TIMESTAMP} create_time = #{createTime,jdbcType=TIMESTAMP}
where id = #{id,jdbcType=BIGINT} where id = #{id,jdbcType=BIGINT}

View File

@@ -41,9 +41,6 @@ public class MemberCommissionServiceImpl implements MemberCommissionService {
private ExecutorService executorService = Executors.newFixedThreadPool(10); private ExecutorService executorService = Executors.newFixedThreadPool(10);
static Long modulus = new Long(5);
@Override @Override
public void computeCommission(OmsOrder order, UmsMember currentMember) { 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 * @param order

View File

@@ -0,0 +1,540 @@
package com.buy507.mall.portal.service.impl;
import cn.hutool.core.date.DateUtil;
import cn.hutool.json.JSONUtil;
import com.buy507.mall.mapper.*;
import com.buy507.mall.model.*;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.List;
@Slf4j
@Service
public class MemberSplitProfitService{
@Resource
private UmsMemberMapper memberMapper;
/**
* 会员分成流水
*/
@Resource
private UmsMemberAccountTransactionMapper umsMemberAccountTransactionMapper;
/**
* 订单队列
*/
@Resource
private UmsMemberOrderQueueMapper umsMemberOrderQueueMapper;
/**
* 会员上下关系
*/
@Resource
private UmsMemberRelationTreeMapper umsMemberRelationTreeMapper;
/**
* 会员等级
*/
@Resource
private UmsMemberLevelMapper umsMemberLevelMapper;
@Value("${becomeVipAmount}")
private String becomeVipAmount;
@Async
@Transactional
public void updateOderAndMemberInfo(OmsOrder order) {
UmsMember member = memberMapper.selectByPrimaryKey(order.getMemberId());
//找到上级会员
UmsMember higherLevelMember = this.findInOrderQueueMember(member.getId());;
/**
* 先验证该订单是否是五联单加速,如果不是则普通计算上级提成
* 如果是提成,则全额给上级
*/
boolean splitForFiveQueue = fiveQuickQueueBusiness(higherLevelMember);
//未进行满5联单分润开始进行普通分润流程
if(!splitForFiveQueue && higherLevelMember != null){
//进行订单分润
this.splitProfitFroMember(member, higherLevelMember, order);
}
}
/**
* 为订单上级进行分润
* @param member
* @param higherLevelMember
* @param order
*/
private void splitProfitFroMember(UmsMember member, UmsMember higherLevelMember, OmsOrder order) {
//新订单及直属上级分润,返回的分润金额
BigDecimal revenueAmount = this.newMemberSplitProfit(member, higherLevelMember, order);
UmsMember moreHigherMember;
//如果上级是vip会员
if(higherLevelMember.getMemberLevel().equals(MemberLevel.Consumer)) {
moreHigherMember = this.findNextHigherLevelMemberByType(higherLevelMember.getId(), MemberLevel.Consumer);
}else {
moreHigherMember = this.findInOrderQueueMember(higherLevelMember.getId());
}
//没有更高的上级退出分润
if(moreHigherMember == null){
return;
}
//给三个级别代理分润
this.twoLevelSplitProfit(higherLevelMember, moreHigherMember, order, revenueAmount);
this.threeLevelSplitProfit(higherLevelMember, moreHigherMember, order, revenueAmount);
this.fourLevelSplitProfit(higherLevelMember, moreHigherMember, order, revenueAmount);
}
/**
* 查询到下一个级别的上级会员
* @param id
* @param consumer
* @return
*/
private UmsMember findNextHigherLevelMemberByType(Long id, MemberLevel consumer) {
//找到上级
UmsMember moreHigherMember = this.findInOrderQueueMember(id);
if(moreHigherMember == null){
return null;
}
while (moreHigherMember != null){
if(moreHigherMember.getMemberLevel().getValue() > consumer.getValue()){
return moreHigherMember;
}
moreHigherMember = this.findInOrderQueueMember(moreHigherMember.getId());
if(moreHigherMember == null){
return null;
}
}
return moreHigherMember;
}
/***
* 五联单排队分红逻辑,该订单支付后处理
**/
private boolean fiveQuickQueueBusiness(UmsMember higherLevelMember) {
//分润标识
boolean splitMark = false;
if(higherLevelMember != null){
//订单加入队列
UmsMemberOrderQueueExample orderQueueExample = new UmsMemberOrderQueueExample();
orderQueueExample.createCriteria()
.andQuitQueueMarkEqualTo(UmsMemberOrderQueue.QUEUE_STATUS_WAIT)
.andQueueTypeEqualTo(UmsMemberOrderQueue.QUEUE_TYPE_FAST)
.andMemberIdEqualTo(higherLevelMember.getId());
List<UmsMemberOrderQueue> orderQueueList = umsMemberOrderQueueMapper.selectByExample(orderQueueExample);
//上级订单队列中是否有加速5联单
if(!orderQueueList.isEmpty()){
UmsMemberOrderQueue umoq = orderQueueList.get(0);
if(umoq.getRemainNumber() <= 4){
//没有加速满5单
umoq.setRemainNumber(1 + umoq.getRemainNumber());
umsMemberOrderQueueMapper.updateByPrimaryKeySelective(umoq);
}else {
//设置本单待退出且5单满24小时未退款
umoq.setQuitQueueMark(UmsMemberOrderQueue.QUEUE_PREPARE_QUIT);
//冻结上级会费的冻结金额
//订单金额加入冻结余额
BigDecimal freeze = higherLevelMember.getFreeze();
BigDecimal orderAmount = umoq.getOrderAmount();
higherLevelMember.setFreeze(freeze.add(orderAmount));
//更新数据库
memberMapper.updateByPrimaryKeySelective(higherLevelMember);
umsMemberOrderQueueMapper.updateByPrimaryKeySelective(umoq);
UmsMemberAccountTransaction accountTransaction = new UmsMemberAccountTransaction();
accountTransaction.setCommissionRatio(100);
accountTransaction.setMemberId(umoq.getMemberId());
accountTransaction.setOrderId(umoq.getOrderId());
accountTransaction.setRemarks("满五单加速流水");
accountTransaction.setTransactionState(UmsMemberAccountTransaction.TRANSACTION_STATE_NO);
//24小时后到账
accountTransaction.setTransferPaymentTime(DateUtil.tomorrow());
umsMemberAccountTransactionMapper.insert(accountTransaction);
splitMark = true;
}
}
}
return splitMark;
}
/**
* 会员分润
* @param currentMember
* @param higherLevelMember
* @param order
*/
private BigDecimal newMemberSplitProfit(UmsMember currentMember, UmsMember higherLevelMember, OmsOrder order){
/**
* 新增用户位普通用户订单支付成功后满一定金额成为vip普通会员
* 当前订单金额 大于等于 vip门槛金额
*/
if(currentMember.getMemberLevel().equals(MemberLevel.Member) &&
order.getPayAmount().compareTo(new BigDecimal(becomeVipAmount)) >= 0 ){
log.info("new order member {}" , JSONUtil.toJsonStr(currentMember));
currentMember.setMemberLevel(MemberLevel.Consumer);
}
//更新改会员为排队中
currentMember.setOrderStatus(1);
memberMapper.updateByPrimaryKeySelective(currentMember);
//订单加入队列
UmsMemberOrderQueueExample example = new UmsMemberOrderQueueExample();
example.createCriteria().andQuitQueueMarkEqualTo(UmsMemberOrderQueue.QUEUE_STATUS_WAIT)
.andQueueTypeEqualTo(UmsMemberOrderQueue.QUEUE_TYPE_ORDINARY);
long allQueue = umsMemberOrderQueueMapper.countByExample(example);
UmsMemberOrderQueue record = new UmsMemberOrderQueue();
record.setOrderId(order.getId());
record.setMemberId(currentMember.getId());
record.setOrderAmount(order.getPayAmount());
record.setQuitQueueMark(UmsMemberOrderQueue.QUEUE_STATUS_WAIT);
record.setQueueType(UmsMemberOrderQueue.QUEUE_TYPE_ORDINARY);
record.setQueueIndex(++allQueue);
umsMemberOrderQueueMapper.insert(record);
log.info("new Order Queue {}" , JSONUtil.toJsonStr(record));
UmsMemberLevel higherLevel = umsMemberLevelMapper.selectByPrimaryKey(higherLevelMember.getMemberLevelId());
//直推会员分润
String ratio = "0."+higherLevel.getCommissionRatio();
BigDecimal revenueAmount = order.getPayAmount().multiply(new BigDecimal(ratio)).setScale(2, RoundingMode.HALF_UP);
UmsMemberAccountTransaction accountTransaction = new UmsMemberAccountTransaction();
accountTransaction.setCommissionRatio(higherLevel.getCommissionRatio());
accountTransaction.setMemberId(higherLevelMember.getId());
accountTransaction.setOrderId(order.getId());
accountTransaction.setRemarks("直推会员分润");
accountTransaction.setTransactionState(UmsMemberAccountTransaction.TRANSACTION_STATE_NO);
accountTransaction.setRevenueAmount(revenueAmount);
//24小时后到账
accountTransaction.setTransferPaymentTime(DateUtil.tomorrow());
umsMemberAccountTransactionMapper.insert(accountTransaction);
log.info("new Account Transaction {}" , JSONUtil.toJsonStr(accountTransaction));
return revenueAmount;
}
/**
* 二级店长分润
* @param lowerMember
* @param higherMember
* @param order
*/
private void twoLevelSplitProfit(UmsMember lowerMember, UmsMember higherMember, OmsOrder order,
BigDecimal revenueAmount){
if(higherMember.getMemberLevel().equals(MemberLevel.Partner)){
//上下级关系
if(higherMember.getMemberLevel().getValue() > lowerMember.getMemberLevel().getValue()){
UmsMemberLevel lowerLevel = umsMemberLevelMapper.selectByPrimaryKey(lowerMember.getMemberLevelId());
UmsMemberLevel higherLevel = umsMemberLevelMapper.selectByPrimaryKey(higherMember.getMemberLevelId());
Integer profitRatio = 0;
if(higherLevel.getCommissionRatio() != null && lowerLevel.getCommissionRatio() != null){
profitRatio = higherLevel.getCommissionRatio() - lowerLevel.getCommissionRatio();
}
String ratioStr = profitRatio < 10 ? "0.0" + profitRatio : "0."+profitRatio;
//查看上级的分润比例
BigDecimal tenPercent = order.getPayAmount().multiply(new BigDecimal(ratioStr)).setScale(2, RoundingMode.HALF_UP);
UmsMemberAccountTransaction accountTransaction = new UmsMemberAccountTransaction();
accountTransaction.setCommissionRatio(profitRatio);
accountTransaction.setMemberId(higherMember.getId());
accountTransaction.setOrderId(order.getId());
accountTransaction.setRemarks("二级店长上级分润");
accountTransaction.setTransactionState(UmsMemberAccountTransaction.TRANSACTION_STATE_NO);
accountTransaction.setRevenueAmount(tenPercent);
//24小时后到账
accountTransaction.setTransferPaymentTime(DateUtil.tomorrow());
umsMemberAccountTransactionMapper.insert(accountTransaction);
//查询上级
UmsMember next = this.findInOrderQueueMember(higherMember.getId());
if(next != null){
if (next.getMemberLevel().equals(higherMember.getMemberLevel())){
twoLevelSplitProfit(higherMember, next, order, tenPercent);
}else {
threeLevelSplitProfit(higherMember, next, order, tenPercent);
fourLevelSplitProfit(higherMember, next, order, tenPercent);
}
}
//平级关系
}else if(lowerMember.getMemberLevel().equals(lowerMember.getMemberLevel())){
BigDecimal tenPercent = revenueAmount.multiply(new BigDecimal("0.10")).setScale(2, RoundingMode.HALF_UP);
UmsMemberAccountTransaction accountTransaction = new UmsMemberAccountTransaction();
accountTransaction.setCommissionRatio(10);
accountTransaction.setMemberId(higherMember.getId());
accountTransaction.setOrderId(order.getId());
accountTransaction.setRemarks("二级店长平级分润");
accountTransaction.setTransactionState(UmsMemberAccountTransaction.TRANSACTION_STATE_NO);
accountTransaction.setRevenueAmount(tenPercent);
//24小时后到账
accountTransaction.setTransferPaymentTime(DateUtil.tomorrow());
umsMemberAccountTransactionMapper.insert(accountTransaction);
//查询比当前级别大的会员
UmsMember next = this.findNextHigherLevelMemberByType(higherMember.getId(), MemberLevel.Partner);
if(next != null){
threeLevelSplitProfit(higherMember, next, order, tenPercent);
fourLevelSplitProfit(higherMember, next, order, tenPercent);
}
}
}
}
/**
* 三级代理分润
* @param lowerMember
* @param higherMember
* @param order
*/
private void threeLevelSplitProfit(UmsMember lowerMember, UmsMember higherMember, OmsOrder order, BigDecimal revenueAmount){
if(higherMember.getMemberLevel().equals(MemberLevel.Diamond)){
//上下级关系
if(higherMember.getMemberLevel().getValue() > lowerMember.getMemberLevel().getValue()){
UmsMemberLevel lowerLevel = umsMemberLevelMapper.selectByPrimaryKey(lowerMember.getMemberLevelId());
UmsMemberLevel higherLevel = umsMemberLevelMapper.selectByPrimaryKey(higherMember.getMemberLevelId());
Integer profitRatio = 0;
if(higherLevel.getCommissionRatio() != null && lowerLevel.getCommissionRatio() != null){
profitRatio = higherLevel.getCommissionRatio() - lowerLevel.getCommissionRatio();
}
String ratioStr = profitRatio < 10 ? "0.0" + profitRatio : "0."+profitRatio;
//查看上级的分润比例
BigDecimal tenPercent = order.getPayAmount().multiply(new BigDecimal(ratioStr)).setScale(2, RoundingMode.HALF_UP);
UmsMemberAccountTransaction accountTransaction = new UmsMemberAccountTransaction();
accountTransaction.setCommissionRatio(profitRatio);
accountTransaction.setMemberId(higherMember.getId());
accountTransaction.setOrderId(order.getId());
accountTransaction.setRemarks("三级代理上级分润");
accountTransaction.setTransactionState(UmsMemberAccountTransaction.TRANSACTION_STATE_NO);
accountTransaction.setRevenueAmount(tenPercent);
//24小时后到账
accountTransaction.setTransferPaymentTime(DateUtil.tomorrow());
umsMemberAccountTransactionMapper.insert(accountTransaction);
//查询上级
UmsMember next = this.findInOrderQueueMember(higherMember.getId());
if(next != null){
if (next.getMemberLevel().equals(higherMember.getMemberLevel())){
threeLevelSplitProfit(higherMember, next, order, tenPercent);
}else {
fourLevelSplitProfit(higherMember, next, order, tenPercent);
}
}
//平级关系
}else if(lowerMember.getMemberLevel().equals(lowerMember.getMemberLevel())){
BigDecimal tenPercent = revenueAmount.multiply(new BigDecimal("0.10")).setScale(2, RoundingMode.HALF_UP);
UmsMemberAccountTransaction accountTransaction = new UmsMemberAccountTransaction();
accountTransaction.setCommissionRatio(10);
accountTransaction.setMemberId(higherMember.getId());
accountTransaction.setOrderId(order.getId());
accountTransaction.setRemarks("三级代理平级分润");
accountTransaction.setTransactionState(UmsMemberAccountTransaction.TRANSACTION_STATE_NO);
accountTransaction.setRevenueAmount(tenPercent);
//24小时后到账
accountTransaction.setTransferPaymentTime(DateUtil.tomorrow());
umsMemberAccountTransactionMapper.insert(accountTransaction);
UmsMember next = this.findNextHigherLevelMemberByType(higherMember.getId(), MemberLevel.Diamond);
if(next != null){
fourLevelSplitProfit(higherMember, next, order, tenPercent);
}
}
}
}
/**
* 四级市代分润
* @param lowerMember
* @param higherMember
* @param order
*/
private void fourLevelSplitProfit(UmsMember lowerMember, UmsMember higherMember, OmsOrder order, BigDecimal revenueAmount){
if(higherMember.getMemberLevel().equals(MemberLevel.OneDiamond)){
//上下级关系
if(higherMember.getMemberLevel().getValue() > lowerMember.getMemberLevel().getValue()){
UmsMemberLevel lowerLevel = umsMemberLevelMapper.selectByPrimaryKey(lowerMember.getMemberLevelId());
UmsMemberLevel higherLevel = umsMemberLevelMapper.selectByPrimaryKey(higherMember.getMemberLevelId());
Integer profitRatio = 0;
if(higherLevel.getCommissionRatio() != null && lowerLevel.getCommissionRatio() != null){
profitRatio = higherLevel.getCommissionRatio() - lowerLevel.getCommissionRatio();
}
String ratioStr = profitRatio < 10 ? "0.0" + profitRatio : "0."+profitRatio;
//查看上级的分润比例
BigDecimal tenPercent = order.getPayAmount().multiply(new BigDecimal(ratioStr)).setScale(2, RoundingMode.HALF_UP);
UmsMemberAccountTransaction accountTransaction = new UmsMemberAccountTransaction();
accountTransaction.setCommissionRatio(profitRatio);
accountTransaction.setMemberId(higherMember.getId());
accountTransaction.setOrderId(order.getId());
accountTransaction.setRemarks("四级市代上级分润");
accountTransaction.setTransactionState(UmsMemberAccountTransaction.TRANSACTION_STATE_NO);
accountTransaction.setRevenueAmount(tenPercent);
//24小时后到账
accountTransaction.setTransferPaymentTime(DateUtil.tomorrow());
umsMemberAccountTransactionMapper.insert(accountTransaction);
//查询上级
UmsMember next = this.findInOrderQueueMember(higherMember.getId());
if(next != null && next.getMemberLevel().equals(higherMember.getMemberLevel())){
fourLevelSplitProfit(higherMember, next, order, tenPercent);
}
//平级关系
}else if(lowerMember.getMemberLevel().equals(lowerMember.getMemberLevel())){
BigDecimal tenPercent = revenueAmount.multiply(new BigDecimal("0.10")).setScale(2, RoundingMode.HALF_UP);
UmsMemberAccountTransaction accountTransaction = new UmsMemberAccountTransaction();
accountTransaction.setCommissionRatio(10);
accountTransaction.setMemberId(higherMember.getId());
accountTransaction.setOrderId(order.getId());
accountTransaction.setRemarks("四级市代平级分润");
accountTransaction.setTransactionState(UmsMemberAccountTransaction.TRANSACTION_STATE_NO);
accountTransaction.setRevenueAmount(tenPercent);
//24小时后到账
accountTransaction.setTransferPaymentTime(DateUtil.tomorrow());
umsMemberAccountTransactionMapper.insert(accountTransaction);
}
}
}
/**
* 寻找上级且在队列中,未在队列且返回null
*/
private UmsMember findInOrderQueueMember(Long id) {
UmsMemberRelationTree relationTree = this.getUpLevelRelationTreeById(id);
if(relationTree == null){
return null;
}
UmsMember higherMember = memberMapper.selectByPrimaryKey(relationTree.getHigherLevelId());
if(higherMember == null){
return null;
}
if(higherMember.getOrderStatus() == 0){
UmsMember nextMember = this.findInOrderQueueMember(higherMember.getId());
if(nextMember != null){
return nextMember;
}
}else if(higherMember.getOrderStatus() == 1){
return higherMember;
}
return null;
}
private UmsMemberRelationTree getUpLevelRelationTreeById(Long id) {
UmsMemberRelationTree relationTree = null;
UmsMemberRelationTreeExample relationTreeExample = new UmsMemberRelationTreeExample();
relationTreeExample.createCriteria().andMemberIdEqualTo(id);
List<UmsMemberRelationTree> relationTreeList = umsMemberRelationTreeMapper.selectByExample(relationTreeExample);
if(!relationTreeList.isEmpty()) {
//找到上级关系
relationTree = relationTreeList.get(0);
}
return relationTree;
}
/************************会员退款逻辑******************************/
@Async
@Transactional
public void checkQueueOrderInfo(OmsOrder order, UmsMember currentMember) {
UmsMemberOrderQueueExample queueExample = new UmsMemberOrderQueueExample();
queueExample.createCriteria().andOrderIdEqualTo(order.getId());
List<UmsMemberOrderQueue> orderQueueList = umsMemberOrderQueueMapper.selectByExample(queueExample);
//排队队列状态改变为退出
if(!orderQueueList.isEmpty()){
UmsMemberOrderQueue memberOrderQueue = orderQueueList.get(0);
memberOrderQueue.setQuitQueueMark(UmsMemberOrderQueue.QUEUE_STATUS_QUIT);
umsMemberOrderQueueMapper.updateByPrimaryKeySelective(memberOrderQueue);
}
UmsMemberRelationTreeExample relationTreeExample = new UmsMemberRelationTreeExample();
relationTreeExample.createCriteria().andMemberIdEqualTo(currentMember.getId());
List<UmsMemberRelationTree> relationTreeList = umsMemberRelationTreeMapper.selectByExample(relationTreeExample);
if(!relationTreeList.isEmpty()) {
//找到上级关系
UmsMemberRelationTree relationTree = relationTreeList.get(0);
//订单加入队列
UmsMemberOrderQueueExample orderQueueExample = new UmsMemberOrderQueueExample();
orderQueueExample.createCriteria()
.andQuitQueueMarkEqualTo(UmsMemberOrderQueue.QUEUE_PREPARE_QUIT)
.andQueueTypeEqualTo(UmsMemberOrderQueue.QUEUE_TYPE_FAST)
.andMemberIdEqualTo(relationTree.getHigherLevelId());
List<UmsMemberOrderQueue> upQueueList = umsMemberOrderQueueMapper.selectByExample(orderQueueExample);
//更新五连单中的上级订单,修改订单为继续排队数量减去1
if(!upQueueList.isEmpty()){
UmsMemberOrderQueue upQueue = upQueueList.get(0);
upQueue.setQuitQueueMark(UmsMemberOrderQueue.QUEUE_STATUS_WAIT);
upQueue.setRemainNumber((upQueue.getRemainNumber() - 1));
umsMemberOrderQueueMapper.updateByPrimaryKeySelective(upQueue);
//上级的冻结金额修改
this.modifyFreezeAmountForRefund(upQueue);
}
}
}
private void modifyFreezeAmountForRefund(UmsMemberOrderQueue upQueue) {
//冻结上级会费的冻结金额
UmsMember higherMember = memberMapper.selectByPrimaryKey(upQueue.getMemberId());
//订单金额加入冻结余额
BigDecimal freeze = higherMember.getFreeze();
BigDecimal orderAmount = upQueue.getOrderAmount();
higherMember.setFreeze(freeze.subtract(orderAmount));
//更新数据库
memberMapper.updateByPrimaryKeySelective(higherMember);
UmsMemberAccountTransactionExample accountTransactionExample = new UmsMemberAccountTransactionExample();
accountTransactionExample.createCriteria()
.andTransactionStateEqualTo(UmsMemberAccountTransaction.TRANSACTION_STATE_NO)
.andOrderIdEqualTo(upQueue.getOrderId());
List<UmsMemberAccountTransaction> transactionList = umsMemberAccountTransactionMapper.selectByExample(accountTransactionExample);
//该笔流水账
if(!transactionList.isEmpty()){
UmsMemberAccountTransaction umat = transactionList.get(0);
umat.setTransactionState(UmsMemberAccountTransaction.TRANSACTION_STATE_OUT);
umsMemberAccountTransactionMapper.updateByPrimaryKeySelective(umat);
}
}
}

View File

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

View File

@@ -0,0 +1,37 @@
package com.buy507.mall.portal;
import com.buy507.mall.portal.service.OmsPortalOrderService;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import java.util.HashMap;
import java.util.Map;
@RunWith(SpringRunner.class)
@SpringBootTest
public class OmsPortalOrderServiceTest {
@Autowired
private OmsPortalOrderService portalOrderService;
/**
* 支付宝回调逻辑 测试
*/
@Test
public void alipayCallbackTest() {
Map params = new HashMap<>();
params.put("trade_status", "TRADE_SUCCESS");
params.put("out_trade_no", "23123wwww2");
portalOrderService.alipayCallback(params);
}
}