xiaoyong931011
2021-06-29 357f148f73eed2b25da6ecd13bc3e632c07d4c11
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
package com.xzx.gc.order.service;
 
import cn.hutool.core.convert.Convert;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.NumberUtil;
import cn.hutool.json.JSONUtil;
import com.xzx.gc.common.constant.*;
import com.xzx.gc.common.utils.BusinessUtil;
import com.xzx.gc.common.utils.IdUtils;
import com.xzx.gc.entity.*;
import com.xzx.gc.model.comon.account.AllAcountParamDto;
import com.xzx.gc.order.mapper.AccountLogMapper;
import com.xzx.gc.order.mapper.OrderMapper;
import com.xzx.gc.order.mapper.PayInfoMapper;
import com.xzx.gc.order.mapper.SysMessageMapper;
import com.xzx.gc.service.BaseAccountService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import tk.mybatis.mapper.entity.Example;
 
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
 
@Service
@Transactional
@Slf4j
public class ShareRebateService extends BaseAccountService {
    @Autowired
    private UserShareService userShareService;
    @Autowired
    private UserService userService;
    @Autowired
    private BlackWhiteService blackWhiteService;
    @Autowired
    private OrderMapper orderMapper;
    @Autowired
    private RedPaperRuleService redPaperRuleService;
    @Autowired
    private AccountService accountService;
    @Autowired
    private BusinessUtil businessUtil;
 
    @Autowired
    private PayInfoMapper payInfoMapper;
 
    @Autowired
    private PartnerAccountLogService partnerAccountLogService;
 
    @Autowired
    private PartnerAccountService partnerAccountService;
 
    @Autowired
    private SysMessageMapper sysMessageMapper;
 
    @Autowired
    private AccountLogMapper accountLogMapper;
 
    @Autowired
    private IdUtils idUtils;
 
 
    @Override
    public Object account(AllAcountParamDto allAcountParamDto) {
        String now = DateUtil.now();
        RedPaperRule one = redPaperRuleService.getOne(UserEnum.分享分利规则.getValue(), allAcountParamDto.getPartnerId());
        if (one != null) {
            BigDecimal moneyDecimal = NumberUtil.toBigDecimal(allAcountParamDto.getMoney());
            //分享返利
            UserShareInfo userShareInfo1 = userShareService.findByRegister(allAcountParamDto.getMobile());
            if (userShareInfo1 != null) {
                //邀请人手机号码
                String mobilePhone = userShareInfo1.getMobilePhone();
                UserInfo userInfo1 = userService.findByMobile(mobilePhone);
                if (userInfo1 != null) {
                    //邀请人的Id  otherUserId为被被邀请人ID
                    allAcountParamDto.setUserId(userInfo1.getUserId());
                    //邀请人是否在白名单  如果不是在白名单则只有被邀请的用户首单才可以分享分利
                    boolean whiteByMobile = blackWhiteService.isWhiteByMobile(OrderEnum.分享.getValue(), mobilePhone, OrderEnum.白名单.getValue());
                    boolean hasMul = false;
                    if (whiteByMobile) {
                        hasMul = true;
                    } else {
                        Example example = new Example(OrderInfo.class);
                        Example.Criteria criteria = example.createCriteria();
                        criteria.andEqualTo("createUserId", allAcountParamDto.getOtherUserId());
                        List<String> list = new ArrayList<>();
                        list.add(OrderEnum.待入库.getValue());
                        list.add(OrderEnum.入库中.getValue());
                        list.add(OrderEnum.完成.getValue());
                        criteria.andIn("orderStatus", list);
                        if (orderMapper.selectCountByExample(example) == 0) {
                            hasMul = true;
                        }
                    }
 
                    //存在返利 执行操作
                    if (hasMul) {
                        AccountInfo accountInfo1 = accountService.findByUserId(userInfo1.getUserId());
                        if (accountInfo1 != null) {
                            BigDecimal div = NumberUtil.div(Convert.toBigDecimal(one.getShareRatio(), new BigDecimal("0")), new BigDecimal("100"));
                            //获取返利金额
                            BigDecimal mul = NumberUtil.mul(moneyDecimal, div);
                            mul = Convert.toBigDecimal(businessUtil.changeMoney(Convert.toStr(mul, "0")));
                            if(mul.compareTo(BigDecimal.ZERO)==0){
                                return null;
                            }
                            BigDecimal rewardMoney = Convert.toBigDecimal(userShareInfo1.getRewardMoney(), Constants.MONEY_INIT);
                            userShareInfo1.setRewardMoney(Convert.toStr(NumberUtil.add(rewardMoney, mul)));
                            userShareService.updateById(userShareInfo1);
                            allAcountParamDto.setMoney(mul);
                            allAcountParamDto.setAccountId(accountInfo1.getAccountId());
                            allAcountParamDto.setMobile(accountInfo1.getAccountName());
 
 
                            log.debug("准备进行分享返利操作:{}", JSONUtil.toJsonPrettyStr(allAcountParamDto));
                            //分享返利 用户加钱 合伙人扣钱
                            PartnerAccountLog partnerAccountLog = new PartnerAccountLog();
                            partnerAccountLog.setPartnerId(allAcountParamDto.getPartnerId());
                            partnerAccountLog.setFlowNo(allAcountParamDto.getFlowNo());
                            partnerAccountLog.setType(OrderEnum.分享返利.getValue());
                            partnerAccountLog.setMoney("-" + allAcountParamDto.getMoney().toString());
                            partnerAccountLog.setRuleId(allAcountParamDto.getRuleId());
                            partnerAccountLogService.add(partnerAccountLog);
                            partnerAccountService.updateReduceMoneyByPartnerId(allAcountParamDto.getPartnerId(), allAcountParamDto.getMoney());
 
                            //消息 环保金明细
                            Map payMap = new HashMap();
                            String payOrderId = idUtils.generate("ZF", 0);
                            payMap.put("payOrderId", payOrderId);
                            payMap.put("orderId", allAcountParamDto.getFlowNo());
                            payMap.put("createUserId", allAcountParamDto.getUserId());
                            payMap.put("money", allAcountParamDto.getMoney());
                            payMap.put("accountId", allAcountParamDto.getAccountId());
                            payMap.put("payType", PayEnum.分享返利.getValue());
                            payMap.put("status", PayEnum.已支付.getValue());
                            payMap.put("createTime", now);
                            payInfoMapper.payInfoAdd(payMap);
 
                            SysMessage sysMessage = new SysMessage();
                            sysMessage.setCreateTime(now);
                            sysMessage.setCreateUserId(allAcountParamDto.getUserId());
                            sysMessage.setFlag(SysEnum.未读.getValue());
                            sysMessage.setMessage("您邀请的好友“" + allAcountParamDto.getMobile() + "”已下单完成,您收到返利" + allAcountParamDto.getMoney().toString() + "元");
                            sysMessage.setMessageSubTypeName("返利");
                            sysMessage.setMessageType(SysEnum.返利.getValue());
                            sysMessage.setUserId(allAcountParamDto.getUserId());
                            sysMessageMapper.insert(sysMessage);
 
                            //用户日志
                            accountService.updateMoneyByUserId(allAcountParamDto.getUserId(), allAcountParamDto.getMoney());
                            AccountLog accountLog = new AccountLog();
                            accountLog.setCreateTime(now);
                            accountLog.setAccountId(allAcountParamDto.getAccountId());
                            accountLog.setCreateUserId(allAcountParamDto.getUserId());
                            accountLog.setChannelType(Convert.toShort(CommonEnum.分享返利操作.getValue()));
                            accountLog.setOldMoney(allAcountParamDto.getMoney().toString());
                            accountLog.setNewMoney(Convert.toStr(NumberUtil.add(Convert.toBigDecimal(accountLog.getOldMoney()), allAcountParamDto.getMoney())));
                            accountLog.setOrderId(payOrderId);
                            accountLogMapper.insertSelective(accountLog);
                            log.debug("分享返利操作已完成:用户:{},金额:{}",allAcountParamDto.getUserId(), allAcountParamDto.getMoney().toString());
                        }
                    }
                }
            }
        }
        return null;
    }
}