admin
2021-06-30 0912f56a392bdf48315747c64ec0c18bf0aa29a6
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
package com.yeshi.fanli.lijin.manager;
 
import com.ks.vip.pojo.DO.UserLijinRecord;
import com.ks.vip.pojo.Enums.VIPEnum;
import com.yeshi.fanli.entity.SystemEnum;
import com.yeshi.fanli.entity.bus.user.UserInfo;
import com.yeshi.fanli.entity.push.DeviceActive;
import com.yeshi.fanli.lijin.dto.LijinSendInfo;
import com.yeshi.fanli.service.inter.push.DeviceActiveService;
import com.yeshi.fanli.service.inter.user.UserInfoService;
import com.yeshi.fanli.util.RedisManager;
import com.yeshi.fanli.util.StringUtil;
import org.springframework.stereotype.Component;
 
import javax.annotation.Resource;
import java.math.BigDecimal;
import java.util.Date;
 
/**
 * 用户礼金发放管理器
 */
@Component
public class UserLijinSendManager {
 
    @Resource
    private RedisManager redisManager;
 
    @Resource
    private DeviceActiveService deviceActiveService;
 
    @Resource
    private UserInfoService userInfoService;
 
    @Resource
    private UserLijinMnager userLijinMnager;
 
 
    private String getRedisKey(SystemEnum system, String deviceId, Long uid) {
        String key = "lijinsend-" + system.name() + "-";
        if (uid != null) {
            key += "uid-" + uid;
        } else {
            key += "device-" + StringUtil.Md5(deviceId);
        }
        return key;
    }
 
    /**
     * 礼金发放
     *
     * @param system
     * @param deviceId
     * @param uid
     */
    public void sendLijin(SystemEnum system, String deviceId, Long uid, BigDecimal minMoney) {
        String key = getRedisKey(system, deviceId, uid);
        if (redisManager.hasKey(key)) {
            //还有未领取的礼金
            return;
        }
 
        if (uid == null) {
            //未登录
            //查询是否为新设备
            DeviceActive deviceActive = deviceActiveService.getFirstActiveInfo(deviceId);
            if (deviceActive == null || System.currentTimeMillis() - deviceActive.getCreateTime().getTime() < 1000 * 60 * 60 * 48L) {
                //新设备
                LijinSendInfo sendInfo = new LijinSendInfo();
                sendInfo.setExpireTime(new Date(System.currentTimeMillis() + 1000 * 60 * 60 * 48L));
                sendInfo.setDeviceId(deviceId);
                sendInfo.setMoney(new BigDecimal("188"));
                sendInfo.setName("新用户福利");
                sendInfo.setSystem(system);
                sendInfo.setUser(null);
                sendInfo.setId(key);
                sendInfo.setCategory(UserLijinRecord.Category.newer.name());
                sendInfo.setMd5(sendInfo.toMD5());
                redisManager.saveObj(sendInfo, key, 60 * 60 * 48);
                return;
            } else {
                //非新设备不发送
                return;
            }
        } else {
            //已登录
            //查询是否为新用户ID
            UserInfo userInfo = userInfoService.getUserByIdWithMybatis(uid);
            if (userInfo == null) {
                return;
            }
 
            UserInfo simpleUser = new UserInfo();
            simpleUser.setId(userInfo.getId());
            simpleUser.setNickName(userInfo.getNickName());
            simpleUser.setPortrait(userInfo.getPortrait());
 
            if (System.currentTimeMillis() - userInfo.getCreatetime() < 1000 * 60 * 60 * 48L) {
 
                //是否已经领取过新人红包
                UserLijinRecord record = userLijinMnager.getLijinRecord(uid, null, UserLijinRecord.Category.newer.name());
                if (record == null) {
                    //新用户
                    LijinSendInfo sendInfo = new LijinSendInfo();
                    sendInfo.setExpireTime(new Date(System.currentTimeMillis() + 1000 * 60 * 60 * 48L));
                    sendInfo.setDeviceId(deviceId);
                    sendInfo.setMoney(new BigDecimal("188"));
                    sendInfo.setSystem(system);
                    sendInfo.setUser(simpleUser);
                    sendInfo.setId(key);
                    sendInfo.setName("新用户福利");
                    sendInfo.setCategory(UserLijinRecord.Category.newer.name());
                    sendInfo.setMd5(sendInfo.toMD5());
                    redisManager.saveObj(sendInfo, key, 60 * 60 * 48);
                    return;
                }
            }
            //是否余额已经不足
            BigDecimal balance = userLijinMnager.getLijinBalance(uid);
            if (balance != null && balance.compareTo(minMoney) >= 0) {
                //余额充足
                return;
            }
 
            LijinSendInfo sendInfo = new LijinSendInfo();
            sendInfo.setExpireTime(new Date(System.currentTimeMillis() + 1000 * 60 * 60 * 48L));
            sendInfo.setDeviceId(deviceId);
            sendInfo.setSystem(system);
            sendInfo.setUser(simpleUser);
            sendInfo.setId(key);
            //老用户
            String[] normal = new String[]{"66.66", "88.88", "99.99"};
            String[] vip = new String[]{"166.66", "188.88", "199.99"};
            VIPEnum rank = userLijinMnager.getVIPRank(uid);
            if (rank == VIPEnum.silver) {
                //白银
                sendInfo.setMoney(new BigDecimal(normal[(int) (normal.length * Math.random())]));
                sendInfo.setName("白银会员福利");
            } else {
                sendInfo.setMoney(new BigDecimal(vip[(int) (vip.length * Math.random())]));
                sendInfo.setName("铂金会员福利");
            }
            sendInfo.setMd5(sendInfo.toMD5());
            redisManager.saveObj(sendInfo, key, 60 * 60 * 48);
        }
    }
 
    /**
     * 获取发放中的礼金信息
     *
     * @param system
     * @param deviceId
     * @param uid
     */
    public LijinSendInfo getSendingLijinInfo(SystemEnum system, String deviceId, Long uid) {
        String key = getRedisKey(system, deviceId, uid);
        return (LijinSendInfo) redisManager.getObj(LijinSendInfo.class, key);
    }
 
    /**
     * 领取礼金
     *
     * @param id
     */
    public LijinSendInfo recieveLijin(String id, Long uid) throws Exception {
        LijinSendInfo lijinSendInfo = (LijinSendInfo) redisManager.getObj(LijinSendInfo.class, id);
        if (lijinSendInfo == null)
            throw new Exception("红包为空");
        if (System.currentTimeMillis() > lijinSendInfo.getExpireTime().getTime()) {
            throw new Exception("红包已过期");
        }
 
        //判断是否是新人红包
        if(lijinSendInfo.getCategory().equalsIgnoreCase(UserLijinRecord.Category.newer.name())){
            UserLijinRecord record = userLijinMnager.getLijinRecord(uid, null, UserLijinRecord.Category.newer.name());
            if(record!=null){
                throw new Exception("已领过新人红包");
            }
        }
 
 
        userLijinMnager.addLijin(uid, lijinSendInfo.getMoney(), lijinSendInfo.getName(), lijinSendInfo.getCategory());
        redisManager.removeKey(id);
        return lijinSendInfo;
    }
 
    /**
     * 自动发送礼金
     *
     * @param uid
     * @param minMoney
     */
    public void autoSendLijin(Long uid, BigDecimal minMoney) {
        UserInfo user = userInfoService.getUserByIdWithMybatis(uid);
        BigDecimal balance = userLijinMnager.getLijinBalance(uid);
        if (balance == null || balance.compareTo(minMoney) < 0) {
            sendLijin(user.getSystem(), null, uid, minMoney);
        }
    }
 
    /**
     * 自动领取礼金
     *
     * @param system
     * @param deviceId
     * @param uid
     * @throws Exception
     */
    public void autoRecieveLijin(SystemEnum system, String deviceId, Long uid) throws Exception {
        LijinSendInfo sendInfo = getSendingLijinInfo(system, deviceId, uid);
        if (sendInfo != null) {
            recieveLijin(sendInfo.getId(), uid);
        }
    }
 
 
}