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<MallMemberMapper, MallMember> 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;
|
}
|
|
// 调用服务增加推荐人的佣金
|
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()
|
);
|
|
}
|
}
|