From 54bbaf1c88493368b3494928d7bd2a5c51abebb0 Mon Sep 17 00:00:00 2001 From: Hentua <wangdoubleone@gmail.com> Date: Mon, 17 Apr 2023 00:24:34 +0800 Subject: [PATCH] 完成直推返利 --- src/main/java/cc/mrbird/febs/mall/entity/MallOrderItem.java | 7 + src/main/java/cc/mrbird/febs/mall/entity/MallGoods.java | 9 ++ src/main/java/cc/mrbird/febs/mall/entity/MallMember.java | 9 ++ src/main/java/cc/mrbird/febs/common/enumerates/AccountLevelEnums.java | 28 +++++++ src/main/java/cc/mrbird/febs/mall/mapper/MallMemberMapper.java | 2 src/main/java/cc/mrbird/febs/common/enumerates/DataDictionaryEnum.java | 7 + src/main/java/cc/mrbird/febs/mall/service/impl/ApiMallOrderInfoServiceImpl.java | 15 --- src/main/java/cc/mrbird/febs/mall/service/impl/MemberProfitServiceImpl.java | 110 ++++++++++++++++++++++++++ src/main/resources/mapper/modules/MallMemberMapper.xml | 12 +++ src/main/java/cc/mrbird/febs/mall/service/IMemberProfitService.java | 2 10 files changed, 184 insertions(+), 17 deletions(-) diff --git a/src/main/java/cc/mrbird/febs/common/enumerates/AccountLevelEnums.java b/src/main/java/cc/mrbird/febs/common/enumerates/AccountLevelEnums.java new file mode 100644 index 0000000..c8c7cc1 --- /dev/null +++ b/src/main/java/cc/mrbird/febs/common/enumerates/AccountLevelEnums.java @@ -0,0 +1,28 @@ +package cc.mrbird.febs.common.enumerates; + +import lombok.Getter; + +@Getter +public enum AccountLevelEnums { + + /** + * 会员 + */ + VIP(1), + + /** + * 代理 + */ + VVIP(2), + + /** + * 股东 + */ + VVVIP(3); + + private Integer level; + + AccountLevelEnums(Integer level) { + this.level = level; + } +} diff --git a/src/main/java/cc/mrbird/febs/common/enumerates/DataDictionaryEnum.java b/src/main/java/cc/mrbird/febs/common/enumerates/DataDictionaryEnum.java index f0cafc8..d1ccca5 100644 --- a/src/main/java/cc/mrbird/febs/common/enumerates/DataDictionaryEnum.java +++ b/src/main/java/cc/mrbird/febs/common/enumerates/DataDictionaryEnum.java @@ -75,8 +75,13 @@ WIN_CASH("WIN_PROBABILITY", "WIN_CASH"), RANK_BONUS("BONUS_TYPE", "RANK_BONUS"), CASHOUT_SETTING("CASHOUT_SET", "CASHOUT_SETTING"), - INDIRECT_BONUS_SETTING("INDIRECT_BONUS_SETTING", ""); + INDIRECT_BONUS_SETTING("INDIRECT_BONUS_SETTING", ""), + + /** + * 美业直推分红设置 + */ + DIRECT_BONUS_SETTING("DIRECT_BONUS_SETTING", ""); private String type; private String code; diff --git a/src/main/java/cc/mrbird/febs/mall/entity/MallGoods.java b/src/main/java/cc/mrbird/febs/mall/entity/MallGoods.java index 6d03651..f27a864 100644 --- a/src/main/java/cc/mrbird/febs/mall/entity/MallGoods.java +++ b/src/main/java/cc/mrbird/febs/mall/entity/MallGoods.java @@ -130,4 +130,13 @@ @TableField(exist = false) private BigDecimal scorePercentNum; + /** + * 套餐 1-会员 2-代理 3-股东 + */ + private Integer goodsLevel; + + /** + * 普通商品分红百分比 + */ + private Integer normalPer; } diff --git a/src/main/java/cc/mrbird/febs/mall/entity/MallMember.java b/src/main/java/cc/mrbird/febs/mall/entity/MallMember.java index c0d175d..969cb07 100644 --- a/src/main/java/cc/mrbird/febs/mall/entity/MallMember.java +++ b/src/main/java/cc/mrbird/febs/mall/entity/MallMember.java @@ -158,6 +158,13 @@ @TableField(exist = false) private BigDecimal voucherAmount; - //内转标识 1:开启 2:关闭 + /* + * 内转标识 1:开启 2:关闭 + */ private Integer insideWith; + + /** + * 账号级别 1-会员 2-代理 3-股东 + */ + private Integer accountLevel; } diff --git a/src/main/java/cc/mrbird/febs/mall/entity/MallOrderItem.java b/src/main/java/cc/mrbird/febs/mall/entity/MallOrderItem.java index 833a188..520ab99 100644 --- a/src/main/java/cc/mrbird/febs/mall/entity/MallOrderItem.java +++ b/src/main/java/cc/mrbird/febs/mall/entity/MallOrderItem.java @@ -42,4 +42,11 @@ * 是否结清 */ private Integer hasSettle; + + /** + * 1-会员 2-代理 3-股东 + */ + private Integer goodsLevel; + + private Integer normalPer; } diff --git a/src/main/java/cc/mrbird/febs/mall/mapper/MallMemberMapper.java b/src/main/java/cc/mrbird/febs/mall/mapper/MallMemberMapper.java index 60f30cd..dbf4fa1 100644 --- a/src/main/java/cc/mrbird/febs/mall/mapper/MallMemberMapper.java +++ b/src/main/java/cc/mrbird/febs/mall/mapper/MallMemberMapper.java @@ -101,4 +101,6 @@ * @return */ List<MallMember> selectByRole(@Param("type") int type, @Param("state")int state); + + List<MallMember> selectParentMemberList(@Param("list") List<String> inviteIds, @Param("refererId") String refererId, @Param("limit") Integer limit); } diff --git a/src/main/java/cc/mrbird/febs/mall/service/IMemberProfitService.java b/src/main/java/cc/mrbird/febs/mall/service/IMemberProfitService.java index 7806be2..aa3f520 100644 --- a/src/main/java/cc/mrbird/febs/mall/service/IMemberProfitService.java +++ b/src/main/java/cc/mrbird/febs/mall/service/IMemberProfitService.java @@ -18,6 +18,8 @@ */ void dynamicProfit(Long orderId); + void directProfit(Long orderId); + void dynamicProfit(Long orderId, Integer isNormal); /** diff --git a/src/main/java/cc/mrbird/febs/mall/service/impl/ApiMallOrderInfoServiceImpl.java b/src/main/java/cc/mrbird/febs/mall/service/impl/ApiMallOrderInfoServiceImpl.java index 8a17ee8..20adfe6 100644 --- a/src/main/java/cc/mrbird/febs/mall/service/impl/ApiMallOrderInfoServiceImpl.java +++ b/src/main/java/cc/mrbird/febs/mall/service/impl/ApiMallOrderInfoServiceImpl.java @@ -334,18 +334,9 @@ this.baseMapper.updateById(orderInfo); commonService.changeWallet(orderInfo.getId(), FlowTypeEnum.BALANCE.getValue()); - /** - * 插入一条待处理记录 - * mq处理之后,更新状态 - */ - MallMqRecord mallMqRecord = new MallMqRecord(); - mallMqRecord.setOrderId(orderInfo.getId()); - mallMqRecord.setState(2); - mallMqRecord.setRetryTimes(2); - mallMqRecord.setCreateTime(orderInfo.getPayTime()); - mallMqRecordMapper.insert(mallMqRecord); - //发送补贴消息 - agentProducer.sendPerkMoneyMsg(orderInfo.getId()); + + //发送直推返利消息 + agentProducer.sendOrderReturn(orderInfo.getId()); //发送代理自动升级消息 agentProducer.sendAutoLevelUpMsg(member.getId()); break; diff --git a/src/main/java/cc/mrbird/febs/mall/service/impl/MemberProfitServiceImpl.java b/src/main/java/cc/mrbird/febs/mall/service/impl/MemberProfitServiceImpl.java index 49962a3..2bfdc85 100644 --- a/src/main/java/cc/mrbird/febs/mall/service/impl/MemberProfitServiceImpl.java +++ b/src/main/java/cc/mrbird/febs/mall/service/impl/MemberProfitServiceImpl.java @@ -22,6 +22,7 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import io.swagger.models.auth.In; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; @@ -151,8 +152,112 @@ @Override public void dynamicProfit(Long orderId) { - return; -// dynamicProfit(orderId, 2); +// return; + dynamicProfit(orderId, 2); + } + + /** + * 直推收益 + * + * 1、直推收益 1:20;2:30;3:40 返利,隔代奖拿直推收益20% + * 2、若非代理推代理,只拿10%,往上找代理给15%,再往上找代理给15%,往上找连续两层。股东套餐同理 + * 3、代理推代理按照第1点结算 + * + * @param orderId + */ + @Override + public void directProfit(Long orderId) { + log.info("######直推奖励, 订单ID:{}######", orderId); + MallOrderInfo orderInfo = mallOrderInfoMapper.selectById(orderId); + if (orderInfo.getOrderType() == 2) { + log.info("积分订单无返利"); + return; + } + BigDecimal indirectPer = BigDecimal.valueOf(0.2); + BigDecimal indirectPer2 = BigDecimal.valueOf(0.15); + + MallMember member = mallMemberMapper.selectById(orderInfo.getMemberId()); + + // 父级会员 + MallMember parentMember = mallMemberMapper.selectInfoByInviteId(member.getReferrerId()); + + // 父级会员直推人数 + Integer directCnt = mallMemberMapper.selectOwnCntByInviteId(parentMember.getInviteId()); + List<DataDictionaryCustom> dataDices = dataDictionaryCustomMapper.selectDicByType(DataDictionaryEnum.DIRECT_BONUS_SETTING.getType()); + + directCnt = directCnt == null ? 0 : directCnt; + List<MallOrderItem> items = mallOrderInfoMapper.getMallOrderItemByOrderId(orderId); + + if (CollUtil.isEmpty(items)) { + return; + } + + for (MallOrderItem item : items) { + // 减去成本后算收益 + BigDecimal amount = item.getPrice().subtract(item.getCostPrice()).multiply(BigDecimal.valueOf(item.getCnt())); + if (amount.compareTo(BigDecimal.ZERO) < 1) { + continue; + } + + // 直推返利比例 + BigDecimal profitPer = BigDecimal.ZERO; + int isSameLevel = 0; + // 普通商品 -- 直推上级可拿百分比直推奖励 + if (item.getIsNormal() == 1) { + profitPer = new BigDecimal(item.getNormalPer()); + + // 套餐商品 + } else { + + // 判断上级是否与自己购买的套餐符合,若符合则走3级直推逻辑,若不符合则另外一个 + if (parentMember.getAccountLevel().equals(item.getGoodsLevel()) || AccountLevelEnums.VIP.getLevel().equals(parentMember.getAccountLevel())) { + + for (DataDictionaryCustom dataDic : dataDices) { + JSONObject jsonObject = JSONObject.parseObject(dataDic.getValue()); + if (directCnt >= jsonObject.getInteger("pushCnt")) { + profitPer = jsonObject.getBigDecimal("prop"); + } + } + isSameLevel = 1; + // 非代理推代理/非股东推股东 + } else { + profitPer = BigDecimal.valueOf(0.1); + isSameLevel = 2; + } + } + + // 直推奖 + BigDecimal profit = amount.multiply(profitPer.divide(new BigDecimal(100), 2, RoundingMode.HALF_UP)); + changeScoreAndCommission(parentMember.getId(), profit, MoneyFlowTypeEnum.DYNAMIC_ACHIEVE.getValue(), orderInfo.getOrderNo()); + + // 代理推代理 + if (isSameLevel == 1) { + MallMember doubleParentMember = mallMemberMapper.selectInfoByInviteId(parentMember.getReferrerId()); + if (doubleParentMember == null) { + continue; + } + + BigDecimal doubleParentProfit = profit.multiply(indirectPer); + changeScoreAndCommission(doubleParentMember.getId(), doubleParentProfit, MoneyFlowTypeEnum.RECOMMEND_BONUS.getValue(), orderInfo.getOrderNo()); + } + + // 非代理推代理 + if (isSameLevel == 2) { + List<MallMember> mallMembers = mallMemberMapper.selectParentMemberList(StrUtil.split(parentMember.getReferrerIds(), ','), parentMember.getReferrerId(), 2); + if (CollUtil.isEmpty(mallMembers)) { + continue; + } + + for (MallMember mallMember : mallMembers) { + if (!item.getGoodsLevel().equals(mallMember.getAccountLevel())) { + break; + } + + BigDecimal doubleParentProfit = profit.multiply(indirectPer2); + changeScoreAndCommission(mallMember.getId(), doubleParentProfit, MoneyFlowTypeEnum.RECOMMEND_BONUS.getValue(), orderInfo.getOrderNo()); + } + } + } } /** @@ -164,7 +269,6 @@ @Override @Transactional(rollbackFor = Exception.class) public void dynamicProfit(Long orderId, Integer isNormal) { - log.info("######直推奖励, 订单ID:{}######", orderId); MallOrderInfo orderInfo = mallOrderInfoMapper.selectById(orderId); if (orderInfo.getOrderType() == 2) { log.info("积分订单无返利"); diff --git a/src/main/resources/mapper/modules/MallMemberMapper.xml b/src/main/resources/mapper/modules/MallMemberMapper.xml index f0ab081..e7fbe16 100644 --- a/src/main/resources/mapper/modules/MallMemberMapper.xml +++ b/src/main/resources/mapper/modules/MallMemberMapper.xml @@ -445,4 +445,16 @@ </if> </where> </select> + + <select id="selectParentMemberList" resultType="cc.mrbird.febs.mall.entity.MallMember"> + select * from mall_member + where invite_id!=#{refererId} and invite_id IN + <foreach collection = "list" item = "item" separator="," open = "(" close = ")" > + #{item} + </foreach > + order by id desc + <if test="limit != null"> + limit #{limit} + </if> + </select> </mapper> \ No newline at end of file -- Gitblit v1.9.1