package cc.mrbird.febs.mall.service.impl;
|
|
import cc.mrbird.febs.common.enumerates.AgentLevelEnum;
|
import cc.mrbird.febs.common.enumerates.DataDictionaryEnum;
|
import cc.mrbird.febs.common.enumerates.FlowTypeEnum;
|
import cc.mrbird.febs.common.enumerates.MoneyFlowTypeEnum;
|
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.IApiMallMemberWalletService;
|
import cc.mrbird.febs.mall.service.IMallMoneyFlowService;
|
import cc.mrbird.febs.mall.service.IMemberProfitService;
|
import cn.hutool.core.collection.CollUtil;
|
import cn.hutool.core.date.DateField;
|
import cn.hutool.core.date.DateUtil;
|
import cn.hutool.core.util.StrUtil;
|
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.Date;
|
import java.util.List;
|
|
/**
|
* @author wzy
|
* @date 2022-05-10
|
**/
|
@Slf4j
|
@Service
|
@RequiredArgsConstructor
|
public class MemberProfitServiceImpl implements IMemberProfitService {
|
|
private final MallMemberMapper mallMemberMapper;
|
private final MallOrderInfoMapper mallOrderInfoMapper;
|
private final MallOrderItemMapper mallOrderItemMapper;
|
private final MallGoodsMapper mallGoodsMapper;
|
private final IApiMallMemberWalletService walletService;
|
private final IMallMoneyFlowService moneyFlowService;
|
private final DataDictionaryCustomMapper dataDictionaryCustomMapper;
|
|
@Override
|
@Transactional(rollbackFor = Exception.class)
|
public void staticProfit() {
|
log.info("#####静态分红开始运行:{}#####", new Date());
|
List<MallMember> members = mallMemberMapper.selectList(null);
|
if (CollUtil.isEmpty(members)) {
|
return;
|
}
|
|
Date profitDate = DateUtil.offset(new Date(), DateField.DAY_OF_YEAR, -1);
|
BigDecimal totalIncome = mallOrderInfoMapper.selectTotalAmountForDate(profitDate, null);
|
if (totalIncome.compareTo(BigDecimal.ZERO) == 0) {
|
return;
|
}
|
|
DataDictionaryCustom dic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(DataDictionaryEnum.STATIC_BONUS.getType(), DataDictionaryEnum.STATIC_BONUS.getCode());
|
BigDecimal perProfit = totalIncome.divide(new BigDecimal(dic.getValue()), 2, RoundingMode.HALF_UP).divide(BigDecimal.valueOf(100), 2, RoundingMode.HALF_UP);
|
|
for (MallMember member : members) {
|
List<MallGoods> goodsList = mallGoodsMapper.selectOrderGoodsList(member.getId(), profitDate);
|
|
if (CollUtil.isEmpty(goodsList)) {
|
continue;
|
}
|
|
for (MallGoods goods : goodsList) {
|
BigDecimal goodsProfit = goods.getStaticProp().multiply(perProfit);
|
|
try {
|
walletService.reduce(goodsProfit, member.getId(), "score");
|
} catch (Exception e) {
|
log.info("静态分红异常:{}, {}", goodsProfit, member.getId());
|
break;
|
}
|
|
walletService.add(goodsProfit, member.getId(), "commission");
|
moneyFlowService.addMoneyFlow(member.getId(), goodsProfit, MoneyFlowTypeEnum.STATIC_BONUS.getValue(), goods.getOrderNo(), FlowTypeEnum.COMMISSION.getValue());
|
moneyFlowService.addMoneyFlow(member.getId(), goodsProfit.negate(), MoneyFlowTypeEnum.STATIC_BONUS.getValue(), goods.getOrderNo(), FlowTypeEnum.SCORE.getValue());
|
}
|
}
|
}
|
|
/**
|
* 直推20%,隔代收益为直推奖励金额的30%,a_b_c_d,d购买1000套餐,c得200,b得200*30%=60元,a得60*30%=18元。。。
|
* 以此类推,结算到一元为止。
|
* @param orderId
|
*/
|
@Override
|
public void dynamicProfit(Long orderId) {
|
log.info("######直推奖励, 订单ID:{}######", orderId);
|
MallOrderInfo orderInfo = mallOrderInfoMapper.selectById(orderId);
|
MallMember member = mallMemberMapper.selectById(orderInfo.getMemberId());
|
|
if (StrUtil.isBlank(member.getReferrerId())) {
|
return;
|
}
|
DataDictionaryCustom dic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(DataDictionaryEnum.DYNAMIC_BONUS.getType(), DataDictionaryEnum.DYNAMIC_BONUS.getCode());
|
DataDictionaryCustom indrectDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(DataDictionaryEnum.INDRECT_BONUS.getType(), DataDictionaryEnum.INDRECT_BONUS.getCode());
|
|
String parent = member.getReferrerId();
|
List<MallOrderItem> items = mallOrderInfoMapper.getMallOrderItemByOrderId(orderId);
|
for (MallOrderItem item : items) {
|
BigDecimal dynamicProfit = item.getAmount().multiply(BigDecimal.valueOf(item.getCnt())).divide(new BigDecimal(dic.getValue()), 2, RoundingMode.HALF_UP);
|
|
List<String> parents = StrUtil.split(member.getReferrerIds(), ',');
|
List<MallMember> members = mallMemberMapper.selectByInviteIds(parents);
|
if (CollUtil.isEmpty(members)) {
|
return;
|
}
|
|
// 隔代比例
|
BigDecimal indrectDicProp = new BigDecimal(indrectDic.getValue());
|
|
// 隔代推荐奖
|
BigDecimal direct = dynamicProfit.divide(indrectDicProp, 2, RoundingMode.HALF_UP);
|
for (MallMember parentMember : members) {
|
if (parent.equals(parentMember.getInviteId())) {
|
continue;
|
}
|
|
try {
|
walletService.reduce(direct, parentMember.getId(), "score");
|
} catch (Exception e) {
|
log.info("隔代推荐奖异常:{}, {}", direct, parentMember.getId());
|
continue;
|
}
|
walletService.add(direct, parentMember.getId(), "commission");
|
|
moneyFlowService.addMoneyFlow(parentMember.getId(), direct, MoneyFlowTypeEnum.RECOMMEND_BONUS.getValue(), orderInfo.getOrderNo(), FlowTypeEnum.COMMISSION.getValue());
|
moneyFlowService.addMoneyFlow(parentMember.getId(), direct.negate(), MoneyFlowTypeEnum.RECOMMEND_BONUS.getValue(), orderInfo.getOrderNo(), FlowTypeEnum.SCORE.getValue());
|
|
if (direct.compareTo(BigDecimal.ONE) < 1) {
|
break;
|
}
|
direct = direct.divide(indrectDicProp, 2, RoundingMode.HALF_UP);
|
}
|
|
try {
|
walletService.reduce(dynamicProfit, member.getId(), "score");
|
} catch (Exception e) {
|
log.info("直推奖励异常:{}, {}", dynamicProfit, member.getId());
|
continue;
|
}
|
walletService.add(dynamicProfit, member.getId(), "commission");
|
|
moneyFlowService.addMoneyFlow(member.getId(), dynamicProfit, MoneyFlowTypeEnum.DYNAMIC_ACHIEVE.getValue(), orderInfo.getOrderNo(), FlowTypeEnum.COMMISSION.getValue());
|
moneyFlowService.addMoneyFlow(member.getId(), dynamicProfit.negate(), MoneyFlowTypeEnum.DYNAMIC_ACHIEVE.getValue(), orderInfo.getOrderNo(), FlowTypeEnum.SCORE.getValue());
|
}
|
}
|
|
@Override
|
public void agentProfit() {
|
log.info("#####==代理分红==#####");
|
Date profitDate = DateUtil.offset(new Date(), DateField.DAY_OF_YEAR, -1);
|
BigDecimal totalIncome = mallOrderInfoMapper.selectTotalAmountForDate(profitDate, null);
|
|
|
DataDictionaryCustom dic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(DataDictionaryEnum.AGENT_BONUS.getType(), DataDictionaryEnum.AGENT_BONUS.getCode());
|
BigDecimal profit = totalIncome.divide(new BigDecimal(dic.getValue()),2, RoundingMode.HALF_UP);
|
BigDecimal preProfit = profit.divide(BigDecimal.valueOf(100), 2, RoundingMode.HALF_UP);
|
|
List<MallMember> agentMembers = mallMemberMapper.selectByIdAndNoLevel(null, AgentLevelEnum.FIRST_LEVEL.name());
|
if (CollUtil.isEmpty(agentMembers)) {
|
return;
|
}
|
|
for (MallMember agentMember : agentMembers) {
|
DataDictionaryCustom agentDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(AppContants.AGENT_LEVEL_REQUIRE, agentMember.getLevel());
|
|
// TODO
|
}
|
}
|
|
@Override
|
public void rankProfit() {
|
log.info("######==排名分红==####");
|
|
}
|
|
public static void main(String[] args) {
|
System.out.println(DateUtil.offset(new Date(), DateField.DAY_OF_YEAR, -1));
|
}
|
}
|