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 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 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 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 parents = StrUtil.split(member.getReferrerIds(), ','); List 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)); } }