package cc.mrbird.febs.mall.service.impl; import cc.mrbird.febs.common.enumerates.FlowTypeEnum; import cc.mrbird.febs.common.enumerates.RunVipDataDictionaryEnum; import cc.mrbird.febs.common.enumerates.RunVipMoneyFlowTypeEnum; import cc.mrbird.febs.common.enumerates.YesOrNoEnum; import cc.mrbird.febs.common.utils.MallUtils; import cc.mrbird.febs.mall.entity.DataDictionaryCustom; import cc.mrbird.febs.mall.entity.MallMember; import cc.mrbird.febs.mall.mapper.DataDictionaryCustomMapper; import cc.mrbird.febs.mall.mapper.MallMemberMapper; import cc.mrbird.febs.mall.service.AsyncService; import cc.mrbird.febs.mall.service.IApiMallMemberWalletService; import cc.mrbird.febs.mall.service.IMallMoneyFlowService; import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import java.math.BigDecimal; import java.math.RoundingMode; @Slf4j @Service @RequiredArgsConstructor public class AsyncServiceImpl extends ServiceImpl implements AsyncService { private final IMallMoneyFlowService mallMoneyFlowService; private final IApiMallMemberWalletService walletService; private final DataDictionaryCustomMapper dataDictionaryCustomMapper; /** * 执行直推奖励的逻辑 * 当一个会员进行操作时,此方法会根据直推关系给予推荐人一定的奖励 * 奖励金额计算基于操作金额和系统设定的直推奖励比例 * * @param amount 操作金额,用于计算直推奖励 * @param memberId 会员ID,用于查找会员及其推荐人信息 */ @Override public void directCoin(BigDecimal amount, Long memberId) { // 根据会员ID查询会员信息 MallMember mallMember = this.baseMapper.selectById(memberId); // 如果会员不存在或没有推荐人,则直接返回 if (null == mallMember || StrUtil.isBlank(mallMember.getReferrerId())){ return; } // 根据推荐人ID查询推荐人信息 MallMember mallRef = this.baseMapper.selectInfoByInviteId(mallMember.getReferrerId()); // 如果推荐人不存在,则直接返回 if(mallRef == null){ return; } // 查询直推奖励的比例设置 DataDictionaryCustom dataDictionaryCustom = dataDictionaryCustomMapper.selectDicDataByTypeAndCode( RunVipDataDictionaryEnum.CHARGE_SYS_DIRECT.getType(), RunVipDataDictionaryEnum.CHARGE_SYS_DIRECT.getCode() ); // 如果未设置直推奖励比例,则初始化一个默认值(0.1代表10%,设置成0,则不返直推) if(null == dataDictionaryCustom){ dataDictionaryCustom = new DataDictionaryCustom(); dataDictionaryCustom.setType(RunVipDataDictionaryEnum.CHARGE_SYS_DIRECT.getType()); dataDictionaryCustom.setCode(RunVipDataDictionaryEnum.CHARGE_SYS_DIRECT.getCode()); dataDictionaryCustom.setValue("0"); dataDictionaryCustom.setDescription("直推奖励(0.1代表10%,设置成0,则不返直推)"); dataDictionaryCustomMapper.insert(dataDictionaryCustom); } // 解析直推奖励比例 BigDecimal directPercent = new BigDecimal(dataDictionaryCustom.getValue()); // 计算直推奖励金额 BigDecimal directAmount = amount.multiply(directPercent).setScale(2, RoundingMode.DOWN); // 如果直推奖励金额小于等于0,则直接返回 if(BigDecimal.ZERO.compareTo(directAmount) >=0){ return; } // 如果直推奖励金额大于等于操作金额,则直接返回,防止奖励金额异常 if(directAmount.compareTo(amount) >=0){ return; } // 调用服务增加推荐人的佣金 walletService.addCommission(directAmount,mallRef.getId()); // 生成订单号 String orderNo = MallUtils.getOrderNum("DPE"); // 记录推荐人的资金流水 mallMoneyFlowService.runVipMoneyFlowAdd( mallRef.getId(), memberId, orderNo, FlowTypeEnum.COMMISSION.getValue(), RunVipMoneyFlowTypeEnum.DIRECT_USDT.getValue(), directAmount, StrUtil.format(RunVipMoneyFlowTypeEnum.DIRECT_USDT.getDescription(),directAmount), YesOrNoEnum.YES.getValue() ); } @Override public void releaseScore(BigDecimal V3, Long memberId) { walletService.addScore(V3,memberId); String orderNo = MallUtils.getOrderNum("HD"); mallMoneyFlowService.runVipMoneyFlowAdd( memberId, memberId, orderNo, FlowTypeEnum.SCORE.getValue(), RunVipMoneyFlowTypeEnum.GET_SCORE.getValue(), V3, StrUtil.format(RunVipMoneyFlowTypeEnum.GET_SCORE.getDescription(),V3), YesOrNoEnum.YES.getValue() ); } @Override public void releaseNodeCoin(BigDecimal amount, BigDecimal percent, Long memberId) { //实际节点助力的碳币 BigDecimal multiply = amount.multiply(percent).setScale(2,RoundingMode.DOWN); if(BigDecimal.ZERO.compareTo(multiply) >=0){ return; } walletService.addCommission(multiply,memberId); String orderNo = MallUtils.getOrderNum("JD"); mallMoneyFlowService.runVipMoneyFlowAdd( memberId, memberId, orderNo, FlowTypeEnum.COMMISSION.getValue(), RunVipMoneyFlowTypeEnum.NODE_COMMISSION.getValue(), multiply, StrUtil.format(RunVipMoneyFlowTypeEnum.NODE_COMMISSION.getDescription(),multiply), YesOrNoEnum.YES.getValue() ); } }