admin
2021-07-10 29918ba877731850d001fb2d1a3f3774698241c1
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
package com.ks.vip.service.remote;
 
import com.ks.vip.dao.UserLijinRecordDao;
import com.ks.vip.exception.LijinBalanceException;
import com.ks.vip.mapper.LijinBalanceMapper;
import com.ks.vip.pojo.DO.LijinBalance;
import com.ks.vip.pojo.DO.UserLijinRecord;
import com.ks.vip.service.LijinBalanceService;
import org.apache.dubbo.config.annotation.Service;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.transaction.annotation.Transactional;
import org.yeshi.utils.TimeUtil;
 
import javax.annotation.Resource;
import java.math.BigDecimal;
import java.util.Date;
import java.util.List;
import java.util.UUID;
 
@Service(version = "1.0")
public class LijinBalanceServiceImpl implements LijinBalanceService {
 
    Logger logger = LoggerFactory.getLogger(LijinBalanceService.class);
 
    @Resource
    private LijinBalanceMapper lijinBalanceMapper;
 
    @Resource
    private UserLijinRecordDao userLijinRecordDao;
 
    @Override
    @Transactional(rollbackFor = Exception.class)
    public void init(String uid) {
        LijinBalance balance = lijinBalanceMapper.selectByPrimaryKeyForUpdate(uid);
        if (balance != null) {
            return;
        }
        balance = new LijinBalance();
        balance.setBalance(new BigDecimal(0));
        balance.setCreateTime(new Date());
        balance.setId(uid);
        lijinBalanceMapper.insertSelective(balance);
    }
 
    @Override
    @Transactional(rollbackFor = Exception.class)
    public BigDecimal getBalance(String uid) {
        LijinBalance balance = lijinBalanceMapper.selectByPrimaryKey(uid);
        if (balance == null) {
            return null;
        }
        return balance.getBalance();
    }
 
    @Transactional(rollbackFor = Exception.class)
    @Override
    public void addLijin(String uid, BigDecimal money, String title, String category, String identifyCode) throws LijinBalanceException {
        //添加记录
        LijinBalance lijinBalance = lijinBalanceMapper.selectByPrimaryKeyForUpdate(uid);
        if (lijinBalance == null) {
            throw new LijinBalanceException(LijinBalanceException.CODE_NOT_INIT, "余额未初始化");
        }
        //增加余额
        LijinBalance update = new LijinBalance();
        update.setId(uid);
        update.setBalance(lijinBalance.getBalance().add(money));
        update.setUpdateTime(new Date());
        lijinBalanceMapper.updateByPrimaryKeySelective(update);
        //增加记录
        UserLijinRecord record = new UserLijinRecord();
        record.setMoney(money);
        record.setId(uid + "-" + UUID.randomUUID().toString());
        record.setTitle(title);
        record.setType(UserLijinRecord.TYPE_ADD);
        record.setUid(uid);
        record.setCategory(category);
        record.setCreateTime(new Date());
        record.setIdentifyCode(identifyCode);
        userLijinRecordDao.save(record);
    }
 
    @Transactional(rollbackFor = Exception.class)
    @Override
    public void consumeLijin(String uid, BigDecimal money, String title, String category, String identifyCode) throws LijinBalanceException {
        logger.info("开始扣除礼金");
        //添加记录
        LijinBalance lijinBalance = lijinBalanceMapper.selectByPrimaryKeyForUpdate(uid);
        logger.info("用户礼金锁定成功");
        if (lijinBalance == null) {
            throw new LijinBalanceException(LijinBalanceException.CODE_NOT_INIT, "余额未初始化");
        }
        if (lijinBalance.getBalance().compareTo(money) < 0) {
            throw new LijinBalanceException(LijinBalanceException.CODE_BALANCE_NOT_ENOUGH, "礼金余额不足");
        }
 
 
        //增加余额
        LijinBalance update = new LijinBalance();
        update.setId(uid);
        update.setBalance(lijinBalance.getBalance().subtract(money));
        update.setUpdateTime(new Date());
        lijinBalanceMapper.updateByPrimaryKeySelective(update);
        logger.info("减余额成功");
        //增加记录
        UserLijinRecord record = new UserLijinRecord();
        record.setMoney(money);
        record.setId(uid + "-" + UUID.randomUUID().toString());
        record.setTitle(title);
        record.setType(UserLijinRecord.TYPE_CONSUME);
        record.setUid(uid);
        record.setCategory(category);
        record.setCreateTime(new Date());
        record.setIdentifyCode(identifyCode);
        userLijinRecordDao.save(record);
        logger.info("增加记录成功");
    }
 
    @Override
    public BigDecimal getUsingLijin(String uid) {
        UserLijinRecordDao.DaoQuery daoQuery = new UserLijinRecordDao.DaoQuery();
        daoQuery.uid = uid;
        daoQuery.type = UserLijinRecord.TYPE_CONSUME;
        daoQuery.category = UserLijinRecord.Category.createGoodsLijin.name();
        daoQuery.count = 100;
        daoQuery.maxCreateTime = new Date();
        daoQuery.minCreateTime = new Date(TimeUtil.convertToTimeTemp(TimeUtil.getGernalTime(daoQuery.maxCreateTime.getTime(), "yyyyMMdd"), "yyyyMMdd"));
        List<UserLijinRecord> list = userLijinRecordDao.list(daoQuery);
        BigDecimal using = new BigDecimal(0);
        if (list != null) {
            for (UserLijinRecord record : list) {
                using = using.add(record.getMoney());
            }
        }
        return using;
    }
}