xiaoyong931011
2021-07-02 280c1bf9b93fb57b65d2c3f88cc4924aa9d780b4
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
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.exception.RestException;
import com.xzx.gc.common.utils.BusinessUtil;
import com.xzx.gc.common.utils.IdUtils;
import com.xzx.gc.entity.AccountInfo;
import com.xzx.gc.entity.AccountLog;
import com.xzx.gc.entity.RedPaper;
import com.xzx.gc.entity.SysMessage;
import com.xzx.gc.model.comon.account.AllAcountParamDto;
import com.xzx.gc.order.mapper.*;
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 java.math.BigDecimal;
import java.util.HashMap;
import java.util.Map;
 
@Service
@Transactional
@Slf4j
public class RedpaperRebateService extends BaseAccountService {
 
    @Autowired
    private RedPaperRuleService redPaperRuleService;
    @Autowired
    private AccountService accountService;
    @Autowired
    private BusinessUtil businessUtil;
 
    @Autowired
    private PayInfoMapper payInfoMapper;
 
    @Autowired
    private SysMessageMapper sysMessageMapper;
 
    @Autowired
    private AccountLogMapper accountLogMapper;
 
    @Autowired
    private IdUtils idUtils;
 
 
    @Autowired
    private RedPaperMapper redPaperMapper;
 
 
 
    @Override
    public Object account(AllAcountParamDto allAcountParamDto) {
 
        String now=DateUtil.now();
        //判断红包已被领取
        RedPaper redPaper3=new RedPaper();
        redPaper3.setRuleId(Convert.toInt(allAcountParamDto.getRuleId()));
        redPaper3.setReceiveUserId(allAcountParamDto.getUserId());
        int i = redPaperMapper.selectCount(redPaper3);
        if(i>0){
            throw new RestException(-1,"红包已被领取");
        }
        RedPaper redPaper = redPaperMapper.getOne(Convert.toInt(allAcountParamDto.getRuleId()));
        if(redPaper==null||redPaper.getMoney()==null||redPaper.getMoney().compareTo(BigDecimal.ZERO)==0){
            throw new RestException(-1,"红包已被领完");
        }
        boolean isvalid = redPaperRuleService.isvalid(Convert.toInt(allAcountParamDto.getRuleId()));
        if(!isvalid){
            throw new RestException(-1,"红包已失效");
        }
 
        //添加账户记录
        AccountInfo accountInfo1 = accountService.findByUserId(allAcountParamDto.getUserId());
        if(accountInfo1==null){
            throw new RestException(-3,"账户不存在");
        }
        allAcountParamDto.setAccountId(accountInfo1.getAccountId());
        allAcountParamDto.setOldMoney(Convert.toBigDecimal(accountInfo1.getMoney(),Constants.MONEY_INIT));
        allAcountParamDto.setMoney(redPaper.getMoney());
        allAcountParamDto.setFlowNo(redPaper.getId().toString());
 
 
        log.debug("准备进行领取红包操作:{}",JSONUtil.toJsonPrettyStr(allAcountParamDto));
        //合伙人扣钱(在红包生成后已经在后台扣除了),用户加钱
        String payOrderId=idUtils.generate("ZF",0);
 
        AccountLog accountLog=new AccountLog();
        accountLog.setCreateTime(now);
        accountLog.setAccountId(allAcountParamDto.getAccountId());
        accountLog.setOldMoney(allAcountParamDto.getOldMoney().toString());
        String newMoney=businessUtil.changeMoney(Convert.toStr(NumberUtil.add(Convert.toBigDecimal(accountLog.getOldMoney()),allAcountParamDto.getMoney())));
        accountLog.setNewMoney(newMoney);
        accountLog.setCreateUserId(allAcountParamDto.getUserId());
        accountLog.setChannelType(Convert.toShort(CommonEnum.领取红包操作.getValue()));
        accountLog.setOrderId(payOrderId);
        accountLogMapper.insertSelective(accountLog);
 
        //更新账户余额
        AccountInfo accountInfo2=new AccountInfo();
        accountInfo2.setAccountId(allAcountParamDto.getAccountId());
        accountInfo2.setMoney(newMoney);
        accountInfo2.setUpdateTime(DateUtil.now());
        accountService.update(accountInfo2);
 
        //更新红包领取状态
        RedPaper redPaper2=new RedPaper();
        redPaper2.setId(Convert.toInt(allAcountParamDto.getFlowNo()));
        redPaper2.setReceiveFlag(Convert.toShort(OrderEnum.已领取红包.getValue()));
        redPaper2.setReceiveTime(now);
        redPaper2.setReceiveUserId(allAcountParamDto.getUserId());
        redPaperMapper.updateByPrimaryKeySelective(redPaper2);
 
        //添加操作记录 我的环保金明细展示
        Map<String,Object>  payMap = new HashMap();
 
        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.getMoney().toString() + "元");
        sysMessage.setMessageSubTypeName("红包");
        sysMessage.setMessageType(SysEnum.红包.getValue());
        sysMessage.setUserId(allAcountParamDto.getUserId());
        sysMessageMapper.insertSelective(sysMessage);
        log.debug("领取红包操作已完成:用户:{},金额:{}",allAcountParamDto.getUserId(),allAcountParamDto.getMoney().toString());
        return redPaper;
    }
}