package cc.mrbird.febs.mall.service.impl;
|
|
import cc.mrbird.febs.common.enumerates.*;
|
import cc.mrbird.febs.common.utils.AppContants;
|
import cc.mrbird.febs.mall.entity.*;
|
import cc.mrbird.febs.mall.mapper.*;
|
import cc.mrbird.febs.mall.service.*;
|
import cn.hutool.core.collection.CollUtil;
|
import cn.hutool.core.util.ObjectUtil;
|
import cn.hutool.core.util.StrUtil;
|
import cn.hutool.json.JSONUtil;
|
import com.alibaba.fastjson.JSONObject;
|
import jdk.nashorn.internal.ir.IfNode;
|
import lombok.RequiredArgsConstructor;
|
import lombok.extern.slf4j.Slf4j;
|
import org.springframework.stereotype.Service;
|
import org.springframework.transaction.annotation.Transactional;
|
|
import java.math.BigDecimal;
|
import java.math.RoundingMode;
|
import java.util.ArrayList;
|
import java.util.HashMap;
|
import java.util.List;
|
import java.util.Map;
|
|
/**
|
* @author wzy
|
* @date 2021-09-26
|
**/
|
@Slf4j
|
@Service
|
@RequiredArgsConstructor
|
public class AgentServiceImpl implements IAgentService {
|
|
private final DataDictionaryCustomMapper dataDictionaryCustomMapper;
|
private final MallMemberMapper memberMapper;
|
private final MallOrderInfoMapper mallOrderInfoMapper;
|
private final IMallMoneyFlowService mallMoneyFlowService;
|
private final IApiMallMemberWalletService memberWalletService;
|
|
@Override
|
@Transactional(rollbackFor = Exception.class)
|
public void autoUpAgentLevel(Long memberId) {
|
MallMember member = memberMapper.selectById(memberId);
|
if(StrUtil.isBlank(member.getReferrerIds())) {
|
return;
|
}
|
|
List<String> ids = StrUtil.split(member.getReferrerIds(), ',');
|
List<MallMember> parentMembers = memberMapper.selectByInviteIds(ids);
|
for (MallMember parent : parentMembers) {
|
// 未激活用户无法升级
|
if (AgentLevelEnum.ZERO_LEVEL.name().equals(member.getLevel())) {
|
continue;
|
}
|
|
DataDictionaryCustom nextLevel = dataDictionaryCustomMapper.selectNextAgentLevelInfo(parent.getLevel());
|
if (nextLevel == null) {
|
log.info("当前层级无下一级:{}", parent.getLevel());
|
continue;
|
}
|
|
AgentInfo agentInfo = JSONObject.parseObject(nextLevel.getValue(), AgentInfo.class);
|
if (!directMemberCnt(parent, agentInfo)) {
|
continue;
|
}
|
|
if (!agentCntFinish(parent, agentInfo)) {
|
continue;
|
}
|
|
if (!teamIncome(parent, agentInfo)) {
|
continue;
|
}
|
|
parent.setLevel(nextLevel.getCode());
|
memberMapper.updateById(parent);
|
}
|
}
|
|
/**
|
* 判断直推人数是否达标
|
*
|
* @param member
|
* @return
|
*/
|
private boolean directMemberCnt(MallMember member, AgentInfo agentInfo) {
|
List<MallMember> childs = memberMapper.selectByRefererId(member.getInviteId());
|
if (CollUtil.isEmpty(childs)) {
|
return false;
|
}
|
|
if (childs.size() >= agentInfo.getDirectCnt()) {
|
return true;
|
}
|
|
log.info("用户:{}直推数量未达标, 当前等级:{}, 当前数量:{}, 目标数量:{}", member.getPhone(), member.getLevel(), childs.size(), agentInfo.getLastAgentCnt());
|
return false;
|
}
|
|
/**
|
* 判断下级代理数量是否达标
|
*
|
* @return
|
*/
|
private boolean agentCntFinish(MallMember member, AgentInfo agentInfo) {
|
if (agentInfo.getLastAgentCnt() == null || agentInfo.getLastAgentCnt() == 0) {
|
return true;
|
}
|
|
// 直推用户
|
List<MallMember> directMember = memberMapper.selectByRefererId(member.getInviteId());
|
if (CollUtil.isEmpty(directMember)) {
|
return false;
|
}
|
|
// 用户团队达到指定代理数量,且都不在同一条线
|
int i = 0;
|
for (MallMember child : directMember) {
|
List<MallMember> mallMembers = memberMapper.selectChildAgentList(child.getInviteId(), member.getLevel());
|
if (CollUtil.isNotEmpty(mallMembers)) {
|
i++;
|
}
|
}
|
|
if (i >= agentInfo.getLastAgentCnt()) {
|
return true;
|
}
|
|
log.info("用户:{}代理数量未达标, 当前等级:{}, 当前数量:{}, 目标数量:{}", member.getPhone(), member.getLevel(), i, agentInfo.getLastAgentCnt());
|
return false;
|
}
|
|
/**
|
* 团队业绩是否达标
|
*
|
* @param agentInfo
|
* @return
|
*/
|
private boolean teamIncome(MallMember member, AgentInfo agentInfo) {
|
BigDecimal totalIncome = memberMapper.selectAchieveByMemberId(member.getInviteId(), 2);
|
|
BigDecimal targetIncome = agentInfo.getTeamIncome().multiply(new BigDecimal("10000"));
|
if (totalIncome.compareTo(targetIncome) >= 0) {
|
return true;
|
}
|
|
log.info("用户:{}团队业绩未达标, 当前等级:{}, 当前数量:{}, 目标数量:{}", member.getPhone(), member.getLevel(), totalIncome, targetIncome);
|
return false;
|
}
|
|
@Override
|
@Transactional(rollbackFor = Exception.class)
|
public void returnMoneyToAgent(Long orderId) {
|
}
|
|
@Override
|
public void rankReturnMoney(Long orderId) {
|
|
}
|
|
@Override
|
@Transactional
|
public void directReward(Long directRewardId) {
|
log.info("消费补贴奖励、直推返利、分享奖励直推上级、分享奖励直推上级的直推、团队管理补贴消息,ID:{}", directRewardId);
|
MallOrderInfo orderInfo = mallOrderInfoMapper.selectById(directRewardId);
|
if(ObjectUtil.isEmpty(orderInfo)){
|
return;
|
}
|
Integer status = orderInfo.getStatus();
|
if(OrderStatusEnum.FINISH.getValue() != status){
|
return;
|
}
|
//下单补贴金额
|
BigDecimal subsidyAmount = orderInfo.getSubsidyAmount();
|
//下单人
|
Long memberId = orderInfo.getMemberId();
|
MallMember mallMember = memberMapper.selectById(memberId);
|
/**
|
* 生成补贴的流水记录
|
* 1、待生效
|
* 2、返利对象,下单人
|
* 3、金额,补贴金额
|
*/
|
Long subsidyAmountFlowId = mallMoneyFlowService.addMoneyFlow(
|
mallMember.getId(),
|
orderInfo.getOrderNo(),
|
subsidyAmount.setScale(4, BigDecimal.ROUND_DOWN),
|
MallMoneyFlowTypeEnum.MARKET_SUBSIDIES.getCode(),
|
MallMoneyFlow.STATUS_SUCCESS,
|
MallMoneyFlow.IS_RETURN_Y,
|
mallMember.getId(),
|
FlowTypeEnum.BALANCE.getValue(),
|
MallMoneyFlowTypeEnum.MARKET_SUBSIDIES.getName()
|
);
|
|
memberWalletService.addBalance(subsidyAmount.setScale(2, BigDecimal.ROUND_DOWN),mallMember.getId());
|
|
/**
|
* 生成直推返利的流水记录
|
* 1、待生效
|
* 2、返利对象:下单人的直推上级
|
* 3、金额:返利比例乘以补贴金额
|
*/
|
/**
|
* 生成分享奖励的流水记录
|
* 1、待生效
|
* 2、返利对象:下单人的直推上级 10%,直推的直推 5%
|
* 3、金额:补贴金额乘以分享奖励的比例
|
*/
|
if(StrUtil.isEmpty(mallMember.getReferrerId())){
|
return;
|
}
|
//下单人的直推上级
|
MallMember mallMemberOne = memberMapper.selectInfoByInviteId(mallMember.getReferrerId());
|
//生成直推返利的流水记录
|
if(ObjectUtil.isNotEmpty(mallMemberOne)){
|
// DataDictionaryCustom rewardPercentDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(
|
// DataDictionaryEnum.REWARD_PERCENT.getType(),
|
// DataDictionaryEnum.REWARD_PERCENT.getCode()
|
// );
|
// BigDecimal rewardPercent = new BigDecimal(rewardPercentDic.getValue()).multiply(new BigDecimal(0.01)).setScale(2,BigDecimal.ROUND_DOWN);
|
// BigDecimal directRewardAmount = subsidyAmount.multiply(rewardPercent).setScale(4, BigDecimal.ROUND_DOWN);
|
//
|
// Long marketSubsidyFlowId = mallMoneyFlowService.addMoneyFlow(
|
// mallMember.getId(),
|
// orderInfo.getOrderNo(),
|
// directRewardAmount,
|
// MallMoneyFlowTypeEnum.DIRECT_REWARD.getCode(),
|
// MallMoneyFlow.STATUS_SUCCESS,
|
// MallMoneyFlow.IS_RETURN_Y,
|
// mallMemberOne.getId(),
|
// FlowTypeEnum.BALANCE.getValue(),
|
// MallMoneyFlowTypeEnum.DIRECT_REWARD.getName()
|
// );
|
// memberWalletService.addBalance(directRewardAmount,mallMemberOne.getId());
|
DataDictionaryCustom shareOneDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(
|
DataDictionaryEnum.LEVEL_ONE.getType(),
|
DataDictionaryEnum.LEVEL_ONE.getCode()
|
);
|
//生成分享奖励的流水记录
|
BigDecimal shareOne = new BigDecimal(shareOneDic.getValue()).multiply(new BigDecimal(0.01)).setScale(2,BigDecimal.ROUND_DOWN);
|
BigDecimal shareOneAmount = subsidyAmount.multiply(shareOne).setScale(4, BigDecimal.ROUND_DOWN);
|
Long ShareOneFlowId = mallMoneyFlowService.addMoneyFlow(
|
mallMember.getId(),
|
orderInfo.getOrderNo(),
|
shareOneAmount,
|
MallMoneyFlowTypeEnum.SHARE_REWARD_ONE.getCode(),
|
MallMoneyFlow.STATUS_SUCCESS,
|
MallMoneyFlow.IS_RETURN_Y,
|
mallMemberOne.getId(),
|
FlowTypeEnum.BALANCE.getValue(),
|
MallMoneyFlowTypeEnum.SHARE_REWARD_ONE.getName()
|
);
|
memberWalletService.addBalance(shareOneAmount,mallMemberOne.getId());
|
}
|
|
if(StrUtil.isEmpty(mallMemberOne.getReferrerId())){
|
return;
|
}
|
//下单人的直推上级的直推
|
MallMember mallMemberTwo = memberMapper.selectInfoByInviteId(mallMemberOne.getReferrerId());
|
if(ObjectUtil.isNotEmpty(mallMemberTwo)){
|
DataDictionaryCustom shareTwoDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(
|
DataDictionaryEnum.LEVEL_TWO.getType(),
|
DataDictionaryEnum.LEVEL_TWO.getCode()
|
);
|
BigDecimal shareTwo = new BigDecimal(shareTwoDic.getValue()).multiply(new BigDecimal(0.01)).setScale(2,BigDecimal.ROUND_DOWN);
|
BigDecimal shareTwoAmount = subsidyAmount.multiply(shareTwo).setScale(4, BigDecimal.ROUND_DOWN);
|
Long shareTwoFlowId = mallMoneyFlowService.addMoneyFlow(
|
mallMember.getId(),
|
orderInfo.getOrderNo(),
|
shareTwoAmount,
|
MallMoneyFlowTypeEnum.SHARE_REWARD_TWO.getCode(),
|
MallMoneyFlow.STATUS_SUCCESS,
|
MallMoneyFlow.IS_RETURN_Y,
|
mallMemberTwo.getId(),
|
FlowTypeEnum.BALANCE.getValue(),
|
MallMoneyFlowTypeEnum.SHARE_REWARD_TWO.getName()
|
);
|
memberWalletService.addBalance(shareTwoAmount,mallMemberTwo.getId());
|
}
|
/**
|
* 团队管理补贴
|
*/
|
|
|
if(StrUtil.isEmpty(mallMember.getReferrerIds())){
|
return;
|
}
|
//下单人所有的上级
|
String referrerIds = mallMember.getReferrerIds();
|
List<String> refererIdList = StrUtil.split(referrerIds, ",", -1, true, true);
|
//下单人所有符合条件的上级-邀请码
|
ArrayList<String> refererIdListUp = new ArrayList<>();
|
//初始级别即当前下单人的级别
|
String levelStart = mallMember.getLevel();
|
if(CollUtil.isNotEmpty(refererIdList)){
|
for(String inviteId : refererIdList){
|
MallMember mallMemberUp = memberMapper.selectInfoByInviteId(inviteId);
|
String levelUp = mallMemberUp.getLevel();
|
//团队补贴从区代开始
|
if(!MemberAgentLevelEnum.AGENT.getName().equals(levelUp)){
|
//比较两个代理级别,同级别或者大于下单人的级别都保留
|
int compareLevel = MemberAgentLevelEnum.AGENT_ONE.compareLevel(levelUp,levelStart);
|
if(0 < compareLevel){
|
levelStart = levelUp;
|
refererIdListUp.add(inviteId);
|
}
|
}
|
}
|
}
|
if(CollUtil.isNotEmpty(refererIdListUp)){
|
levelStart = mallMember.getLevel();
|
for(String inviteId : refererIdList){
|
MallMember mallMemberUp = memberMapper.selectInfoByInviteId(inviteId);
|
String levelUp = mallMemberUp.getLevel();
|
//获取团队分享比例
|
BigDecimal manageSubsidyPercent = getManageSubsidyPercent(levelStart, levelUp);
|
if(manageSubsidyPercent.compareTo(BigDecimal.ZERO) > 0){
|
BigDecimal teamManageAmount = subsidyAmount.multiply(manageSubsidyPercent).setScale(4, BigDecimal.ROUND_DOWN);
|
//生成团队分享流水
|
Long teamManageFlowId = mallMoneyFlowService.addMoneyFlow(
|
mallMember.getId(),
|
orderInfo.getOrderNo(),
|
teamManageAmount,
|
MallMoneyFlowTypeEnum.TEAM_REWARD.getCode(),
|
MallMoneyFlow.STATUS_SUCCESS,
|
MallMoneyFlow.IS_RETURN_Y,
|
mallMemberUp.getId(),
|
FlowTypeEnum.BALANCE.getValue(),
|
MallMoneyFlowTypeEnum.TEAM_REWARD.getName()
|
);
|
|
memberWalletService.addBalance(teamManageAmount,mallMemberUp.getId());
|
}
|
levelStart = levelUp;
|
}
|
}
|
}
|
|
/**
|
* 根据传入的两个级别,比较之后获取对应的团队管理奖励比例
|
* @param levelStart
|
* @param levelUp
|
* @return
|
*/
|
private BigDecimal getManageSubsidyPercent(String levelStart,String levelUp){
|
BigDecimal manageSubsidyPercent = BigDecimal.ZERO;
|
String agentCodeStart = MemberAgentLevelEnum.AGENT_ONE.getCodeByName(levelStart);
|
String agentCodeUp = MemberAgentLevelEnum.AGENT_ONE.getCodeByName(levelUp);
|
int compareLevel = MemberAgentLevelEnum.AGENT_ONE.compareLevel(levelUp, levelStart);
|
//如果是平级
|
if(compareLevel == 2){
|
manageSubsidyPercent = getDicSubsidyPercent(agentCodeStart);
|
}
|
//如果不是平级
|
if(compareLevel == 1){
|
//1、初始级别不能是会员
|
//2、当前级别的上一个级别是否是levelStart,
|
// 满足,需要减去levelStart的团队管理奖励
|
String minLevel = MemberAgentLevelEnum.AGENT_ONE.minLevel(agentCodeUp);
|
if(levelStart.equals(minLevel)
|
&& !MemberAgentLevelEnum.AGENT.getName().equals(levelStart)){
|
// && MemberAgentLevelEnum.AGENT.getName()levelStart){
|
BigDecimal dicManageSubsidyPercentUp = getDicManageSubsidyPercent(agentCodeUp);
|
BigDecimal dicManageSubsidyPercentStart = getDicManageSubsidyPercent(agentCodeStart);
|
manageSubsidyPercent = dicManageSubsidyPercentUp.subtract(dicManageSubsidyPercentStart);
|
}else{
|
manageSubsidyPercent = getDicManageSubsidyPercent(agentCodeUp);
|
}
|
}
|
return manageSubsidyPercent;
|
}
|
|
/**
|
* 获取对应的团队管理奖励比例
|
* @param agentCode
|
* @return
|
*/
|
private BigDecimal getDicManageSubsidyPercent(String agentCode){
|
BigDecimal manageSubsidyPercent = BigDecimal.ZERO;
|
DataDictionaryCustom agentDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(
|
DataDictionaryEnum.AGENT_ONE.getType(),
|
agentCode
|
);
|
cn.hutool.json.JSONObject jsonObject = JSONUtil.parseObj(agentDic.getValue());
|
String manageSubsidyPercentStr = jsonObject.get("manageSubsidyPercent").toString();
|
manageSubsidyPercent = new BigDecimal(manageSubsidyPercentStr)
|
.multiply(new BigDecimal(0.01))
|
.setScale(2,BigDecimal.ROUND_DOWN);
|
return manageSubsidyPercent;
|
}
|
|
/**
|
* 获取对应的平级团队管理奖励比例
|
* @param agentCode
|
* @return
|
*/
|
private BigDecimal getDicSubsidyPercent(String agentCode){
|
BigDecimal subsidyPercent = BigDecimal.ZERO;
|
DataDictionaryCustom agentDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(
|
DataDictionaryEnum.AGENT_ONE.getType(),
|
agentCode
|
);
|
cn.hutool.json.JSONObject jsonObject = JSONUtil.parseObj(agentDic.getValue());
|
String subsidyPercentStr = jsonObject.get("subsidyPercent").toString();
|
subsidyPercent = new BigDecimal(subsidyPercentStr)
|
.multiply(new BigDecimal(0.01))
|
.setScale(2,BigDecimal.ROUND_DOWN);
|
return subsidyPercent;
|
}
|
|
}
|