package com.yeshi.fanli.lijin.manager;
|
|
import com.ks.vip.exception.LijinBalanceException;
|
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.config.ConfigService;
|
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;
|
|
@Resource
|
private ConfigService configService;
|
|
|
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 LijinBalanceException, 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() != null && 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);
|
}
|
}
|
|
/**
|
* 初始化余额
|
*
|
* @param uid
|
*/
|
public void initBalance(Long uid) {
|
userLijinMnager.initBalance(uid);
|
}
|
|
|
}
|