package cc.mrbird.febs.mall.service.impl;
|
|
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.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());
|
}
|
}
|
}
|
|
@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());
|
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());
|
}
|
}
|
|
public static void main(String[] args) {
|
System.out.println(DateUtil.offset(new Date(), DateField.DAY_OF_YEAR, -1));
|
}
|
}
|