package cc.mrbird.febs.mall.service.impl; import cc.mrbird.febs.common.enumerates.FlowTypeEnum; import cc.mrbird.febs.common.enumerates.MoneyFlowTypeEnum; import cc.mrbird.febs.mall.entity.MallGoods; import cc.mrbird.febs.mall.entity.MallMember; import cc.mrbird.febs.mall.mapper.MallGoodsMapper; import cc.mrbird.febs.mall.mapper.MallMemberMapper; import cc.mrbird.febs.mall.mapper.MallOrderInfoMapper; import cc.mrbird.febs.mall.mapper.MallOrderItemMapper; 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 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; @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; } BigDecimal perProfit = totalIncome.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); walletService.add(goodsProfit, member.getId(), "score", "total_score"); moneyFlowService.addMoneyFlow(member.getId(), goodsProfit, MoneyFlowTypeEnum.STATIC_BONUS.getValue(), goods.getOrderNo(), FlowTypeEnum.SCORE.getValue()); } } } public static void main(String[] args) { System.out.println(DateUtil.offset(new Date(), DateField.DAY_OF_YEAR, -1)); } }