KKSU
2025-02-21 68bb55731629f29e7e275d6c0bff6a6e23886421
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
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;
        }
        // 如果直推奖励金额大于等于操作金额,则直接返回,防止奖励金额异常
        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()
        );
 
    }
}