Helius
2022-02-21 f54f8a92c09a2cd76b3bbb796df680215b63ab8a
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
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
package com.xzx.gc.order.service;
 
import cn.hutool.core.codec.Base64;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.StrUtil;
import com.xzx.gc.common.constant.CommonEnum;
import com.xzx.gc.common.constant.Constants;
import com.xzx.gc.entity.*;
import com.xzx.gc.order.mapper.*;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
 
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
 
/**
 * @author wzy
 * @date 2021-07-14
 **/
@Slf4j
@Service
@Transactional(rollbackFor = Exception.class)
public class DistribService {
 
    @Autowired
    private UserHeadDetailsMapper userHeadDetailsMapper;
    @Autowired
    private UserHeadRelateMapper userHeadRelateMapper;
    @Autowired
    private JhyOrderMapper jhyOrderMapper;
    @Autowired
    private RedPaperRuleMapper redPaperRuleMapper;
    @Autowired
    private JhyOrderItemsMapper jhyOrderItemsMapper;
    @Autowired
    private SysMessageMapper sysMessageMapper;
    @Autowired
    private AccountMapper accountMapper;
    @Autowired
    private UserMapper userMapper;
    @Autowired
    private ScoreDetailsMapper scoreDetailsMapper;
    @Autowired
    private UserShareInfoMapper userShareInfoMapper;
    @Autowired
    private OrderMapper orderMapper;
 
    /**
     * 团长积分/环保币返利规则
     *
     * @param orderId
     * @param userId
     */
    public void distribRecord(Long orderId, String userId) {
        UserHeadRelate userHeadRelate = userHeadRelateMapper.selectRelateByUserId(userId);
        if (userHeadRelate == null) {
            return;
        }
 
        RedPaperRule redPaperRule = redPaperRuleMapper.selectDistribRule();
        if (0 == redPaperRule.getStatus()) {
            return;
        }
 
        Integer count = userHeadDetailsMapper.selectDetailsCount(userId);
        UserInfo userInfo = userMapper.selectByPrimaryKey(userId);
        AccountInfo accountInfo = accountMapper.selectAccountInfoByUserId(userHeadRelate.getHeadUserId());
 
        if (AccountInfo.IS_PROHIBIT_Y.equals(accountInfo.getIsProhibit())) {
            return;
        }
 
        List<String> remark = new ArrayList<>();
        BigDecimal totalReturnScore = BigDecimal.ZERO;
        BigDecimal totalReturnCoin = BigDecimal.ZERO;
 
        BigDecimal totalScore = jhyOrderItemsMapper.selectOrderScoreByOrderId(orderId);
        JhyOrder order = jhyOrderMapper.selectByPrimaryKey(orderId);
        if (count == 0) {
            String value = getRuleValue(redPaperRule, CommonEnum.团长首单奖励.getValue());
 
            // 首单返利
            if (StrUtil.isNotBlank(value) && !"0".equals(value)) {
                BigDecimal money = new BigDecimal(value);
                totalReturnCoin = totalReturnCoin.add(money);
                remark.add("首单返利:" + money);
            }
        }
 
        if (count > 0) {
            String value = getRuleValue(redPaperRule, CommonEnum.首单后返利数量.getValue());
 
            if (StrUtil.isNotBlank(value) && !"0".equals(value)) {
                // 首单完成后,在value单内,返利积分或者环保币
                if (count - 1 < Integer.parseInt(value)) {
                    String scoreStr = getRuleValue(redPaperRule, CommonEnum.返利固定积分.getValue());
                    String coinStr = getRuleValue(redPaperRule, CommonEnum.返利环保币比例.getValue());
                    // 根据积分返利固定积分
                    if (StrUtil.isNotBlank(scoreStr) && !"0".equals(scoreStr)) {
                        BigDecimal score = new BigDecimal(scoreStr);
                        totalReturnScore = totalReturnScore.add(score);
                        remark.add("首单完成后返固定积分:" + scoreStr);
                    }
 
                    // 根据订单总积分, 1:40比例,换算成环保币,返对应百分比
                    if (StrUtil.isNotBlank(coinStr) && !"0".equals(coinStr)) {
                        BigDecimal coinRatio = new BigDecimal(coinStr).divide(BigDecimal.valueOf(100), 2, BigDecimal.ROUND_DOWN);
                        BigDecimal totalCoin = totalScore.divide(new BigDecimal(Constants.PRICE_SCORE_EXCHANGE), 2, BigDecimal.ROUND_DOWN);
 
                        BigDecimal returnCoin = totalCoin.multiply(coinRatio).setScale(2, BigDecimal.ROUND_DOWN);
                        totalReturnCoin = totalReturnCoin.add(returnCoin);
                        remark.add("首单完成后返比例环保币:" + returnCoin +"(" + coinRatio +")");
                    }
 
                    // 当用户进行订单数量,超过value单后,每完成一单返利指定积分
                } else {
                    String finishValue = getRuleValue(redPaperRule, CommonEnum.完成数量后返积分.getValue());
                    if (StrUtil.isNotBlank(finishValue) && !"0".equals(finishValue)) {
                        BigDecimal score = new BigDecimal(finishValue);
                        totalReturnScore = totalReturnScore.add(score);
                        remark.add("完成指定"+ Integer.parseInt(value) +"数量后每单返利:" + score);
                    }
                }
            }
        }
 
        if (totalReturnCoin.intValue() == 0 && totalReturnScore.intValue() == 0) {
            return;
        }
 
        UserHeadDetails userHeadDetails = new UserHeadDetails();
        userHeadDetails.setHeadUserId(userHeadRelate.getHeadUserId());
        userHeadDetails.setUserId(userId);
        userHeadDetails.setOrderNo(order.getOrderNo());
        userHeadDetails.setAmount(totalReturnCoin);
        userHeadDetails.setScore(totalReturnScore);
        userHeadDetails.setCreatedTime(new Date());
        userHeadDetails.setRemark(CollUtil.join(remark, ","));
        userHeadDetailsMapper.insert(userHeadDetails);
 
        userHeadRelate.setAmount(userHeadRelate.getAmount().add(totalReturnCoin));
        userHeadRelate.setScore(userHeadRelate.getScore().add(totalReturnScore));
        userHeadRelateMapper.updateByPrimaryKey(userHeadRelate);
 
        accountInfo.setMoney(new BigDecimal(accountInfo.getMoney()).add(totalReturnCoin).setScale(2, BigDecimal.ROUND_DOWN).toString());
        BigDecimal collectScore = StrUtil.isNotBlank(accountInfo.getCollectScore()) ? new BigDecimal(accountInfo.getCollectScore()) : BigDecimal.ZERO;
        accountInfo.setCollectScore(collectScore.add(totalReturnScore).setScale(0, BigDecimal.ROUND_DOWN).toString());
        accountMapper.updateByPrimaryKey(accountInfo);
 
        if (totalReturnScore.compareTo(BigDecimal.ZERO) > 0) {
            ScoreDetails scoreDetails = new ScoreDetails();
            scoreDetails.setCurrentScore(new BigDecimal(accountInfo.getCollectScore()));
            scoreDetails.setOriginalScore(collectScore);
            scoreDetails.setChangeScore(totalReturnScore);
            scoreDetails.setCreatedTime(new Date());
            scoreDetails.setType(ScoreDetails.SCORE_TYPE_OTHER);
            scoreDetails.setUserId(userHeadRelate.getHeadUserId());
            scoreDetails.setOrderNo(order.getOrderNo());
            scoreDetailsMapper.insert(scoreDetails);
        }
 
        SysMessage sysMessage = new SysMessage();
        sysMessage.setCreateTime(DateUtil.format(new Date(), "yyyy-MM-dd HH:mm:ss"));
        sysMessage.setCreateUserId(userHeadRelate.getHeadUserId());
        sysMessage.setUserId(userHeadRelate.getHeadUserId());
        sysMessage.setMessageType("4");
        sysMessage.setMessageSubTypeName("返利消息");
        sysMessage.setMessage("收到用户:" + userInfo.getMobilePhone().replaceAll("(\\w{3})\\w*(\\w{4})", "$1****$2") + "的订单返利, 积分:" + totalReturnScore +", 环保币:" + totalReturnCoin);
        sysMessage.setFlag("2");
        sysMessageMapper.insert(sysMessage);
    }
 
    /**
     * 普通用户邀请用户并下单返利规则
     *
     */
    public void inviteAddOrderScore(String userId, String orderId) {
        UserInfo userInfo = userMapper.selectByPrimaryKey(userId);
        UserShareInfo userShareInfo = userShareInfoMapper.selectUserShareInfoByInvited(userInfo.getMobilePhone());
 
        if (userShareInfo == null) {
            return;
        }
 
        // 查询当前用户邀请人信息,判断是否为团长,如果是团长,则不返利
        AccountInfo accountInfo = accountMapper.selectAccountInfoByPhone(userShareInfo.getMobilePhone());
        if (AccountInfo.IS_HEAD_Y.equals(accountInfo.getIsHead())) {
            log.info("邀请人为团长, 不执行返利");
            return;
        }
 
        if (AccountInfo.IS_PROHIBIT_Y.equals(accountInfo.getIsProhibit())) {
            return;
        }
 
        List<RedPaperRule> rules = redPaperRuleMapper.selectRuleByType(10);
        if (CollUtil.isEmpty(rules)) {
            log.info("没有具体规则");
            return;
        }
 
        RedPaperRule rule = rules.get(0);
        if (rule.getStatus() == 0) {
            log.info("规则被禁用, 不执行返利");
            return;
        }
 
        List<OrderInfo> riderOrders = orderMapper.selectOrderNoWaitAndCancel(userId);
        int riderCnt = 0;
        if (CollUtil.isNotEmpty(riderOrders)) {
            riderCnt = riderOrders.size();
        }
 
        List<JhyOrder> jhyOrders = jhyOrderMapper.selectJhyOrderNoWaitAndCancel(userId);
        int jhyCnt = 0;
        if (CollUtil.isNotEmpty(jhyOrders)) {
            jhyCnt = jhyOrders.size();
        }
 
        // 仅首单返利
        if (jhyCnt + riderCnt > 1) {
            return;
        }
 
        String value = getRuleValue(rule, CommonEnum.推荐首单奖励.getValue());
        BigDecimal returnScore = BigDecimal.ZERO;
        if (StrUtil.isNotBlank(value)) {
            returnScore = new BigDecimal(value);
        }
 
        BigDecimal collectScore = StrUtil.isNotBlank(accountInfo.getCollectScore()) ? new BigDecimal(accountInfo.getCollectScore()) : BigDecimal.ZERO;
        accountInfo.setCollectScore(collectScore.add(returnScore).setScale(0, BigDecimal.ROUND_DOWN).toString());
        accountMapper.updateByPrimaryKey(accountInfo);
 
        if (returnScore.compareTo(BigDecimal.ZERO) > 0) {
            ScoreDetails scoreDetails = new ScoreDetails();
            scoreDetails.setCurrentScore(new BigDecimal(accountInfo.getCollectScore()));
            scoreDetails.setOriginalScore(collectScore);
            scoreDetails.setChangeScore(returnScore);
            scoreDetails.setCreatedTime(new Date());
            scoreDetails.setType(ScoreDetails.SCORE_TYPE_INVITE_FIRST_ORDER);
            scoreDetails.setUserId(accountInfo.getUserId());
            scoreDetails.setOrderNo(orderId.toString());
            scoreDetailsMapper.insert(scoreDetails);
        }
 
        SysMessage sysMessage = new SysMessage();
        sysMessage.setCreateTime(DateUtil.format(new Date(), "yyyy-MM-dd HH:mm:ss"));
        sysMessage.setCreateUserId(accountInfo.getUserId());
        sysMessage.setUserId(accountInfo.getUserId());
        sysMessage.setMessageType("4");
        sysMessage.setMessageSubTypeName("返利消息");
        sysMessage.setMessage("收到用户:" + userInfo.getMobilePhone().replaceAll("(\\w{3})\\w*(\\w{4})", "$1****$2") + "的订单返利, 积分:" + returnScore);
        sysMessage.setFlag("2");
        sysMessageMapper.insert(sysMessage);
 
    }
 
    private String getRuleValue(RedPaperRule redPaperRule, String key) {
        List<String> rules = StrUtil.split(redPaperRule.getSharingProfitType(), ',');
        List<String> values = StrUtil.split(redPaperRule.getShareRatio(), ',');
 
        int i = rules.indexOf(key);
        return values.get(i);
    }
}