package com.yeshi.fanli.service.impl.tlj;
|
|
import java.math.BigDecimal;
|
import java.util.Date;
|
import java.util.HashMap;
|
import java.util.Map;
|
|
import javax.annotation.Resource;
|
|
import org.springframework.stereotype.Service;
|
import org.springframework.transaction.annotation.Transactional;
|
import org.yeshi.utils.DateUtil;
|
|
import com.yeshi.fanli.dao.mybatis.tlj.UserTaoLiJinNewbiesMapper;
|
import com.yeshi.fanli.entity.bus.tlj.UserTaoLiJinNewbies;
|
import com.yeshi.fanli.entity.bus.user.UserInfoExtra;
|
import com.yeshi.fanli.entity.push.DeviceActive;
|
import com.yeshi.fanli.log.LogHelper;
|
import com.yeshi.fanli.service.inter.common.JumpDetailV2Service;
|
import com.yeshi.fanli.service.inter.money.msg.UserMoneyMsgNotificationService;
|
import com.yeshi.fanli.service.inter.push.DeviceActiveService;
|
import com.yeshi.fanli.service.inter.redpack.UserTaoLiJinNewbiesService;
|
import com.yeshi.fanli.service.inter.tlj.ConfigTaoLiJinService;
|
import com.yeshi.fanli.service.inter.user.UserInfoExtraService;
|
import com.yeshi.fanli.util.Constant;
|
import com.yeshi.fanli.util.MoneyBigDecimalUtil;
|
import com.yeshi.fanli.util.StringUtil;
|
import com.yeshi.fanli.util.annotation.RequestSerializableByKeyService;
|
import com.yeshi.fanli.vo.redpack.TaoLiJinWinDetailVO;
|
|
@Service
|
public class UserTaoLiJinNewbiesServiceImpl implements UserTaoLiJinNewbiesService {
|
|
@Resource
|
private UserTaoLiJinNewbiesMapper userTaoLiJinNewbiesMapper;
|
|
@Resource
|
private ConfigTaoLiJinService configTaoLiJinService;
|
|
@Resource
|
private UserInfoExtraService userInfoExtraService;
|
|
@Resource
|
private UserMoneyMsgNotificationService userMoneyMsgNotificationService;
|
|
@Resource
|
private DeviceActiveService deviceActiveService;
|
|
@Resource
|
private JumpDetailV2Service jumpDetailV2Service;
|
|
|
@Override
|
public boolean verifyHasReward(Long uid, String device) {
|
try {
|
if (StringUtil.isNullOrEmpty(device) && (uid == null || uid <= 0))
|
return false;
|
|
if (uid == null || uid <= 0) {
|
DeviceActive deviceActive = deviceActiveService.getFirstActiveInfo(device);
|
if (deviceActive == null)
|
return true; // 新设备弹出
|
|
Date nowTime = new Date();
|
Date createTime = deviceActive.getCreateTime();
|
int days = DateUtil.daysBetween2(createTime, nowTime);
|
if (days >= Constant.TLJ_NEW_USER_DAYS) {
|
return false; // 已经超出设置天数
|
}
|
return true; // 未超过时间
|
}
|
|
UserInfoExtra userInfoExtra = userInfoExtraService.getUserInfoExtra(uid);
|
if (userInfoExtra == null || userInfoExtra.getFirstLoginTime() == null)
|
return false;
|
|
Date nowTime = new Date();
|
Date firstLoginTime = userInfoExtra.getFirstLoginTime();
|
int days = DateUtil.daysBetween2(firstLoginTime, nowTime);
|
if (days >= Constant.TLJ_NEW_USER_DAYS)
|
return false; // 已经超出设置天数
|
|
UserTaoLiJinNewbies redPackWin = userTaoLiJinNewbiesMapper.selectByPrimaryKey(uid);
|
if (redPackWin != null) {
|
if (redPackWin.getMoney().compareTo(Constant.TLJ_NEW_USER_MONEY) >= 0)
|
return false; // 已领取完
|
|
Date updateTime = redPackWin.getUpdateTime();
|
int daysNum = DateUtil.daysBetween2(updateTime, nowTime);
|
if (daysNum == 0)
|
return false; // 今日已领取
|
|
Integer num = redPackWin.getNum();
|
if (num >= Constant.TLJ_NEW_USER_DAYS)
|
return false; // 领取次数超限
|
}
|
return true;
|
} catch (Exception e) {
|
LogHelper.errorDetailInfo(e);
|
}
|
return false;
|
}
|
|
|
|
@RequestSerializableByKeyService(key = "#uid")
|
@Transactional(rollbackFor = Exception.class)
|
@Override
|
public TaoLiJinWinDetailVO receiveReward(Long uid) throws Exception {
|
if (uid == null || uid <= 0)
|
return null; // 未登录弹出
|
|
UserInfoExtra userInfoExtra = userInfoExtraService.getUserInfoExtra(uid);
|
if (userInfoExtra == null || userInfoExtra.getFirstLoginTime() == null)
|
return null;
|
|
Date nowTime = new Date();
|
Date firstLoginTime = userInfoExtra.getFirstLoginTime();
|
int days = DateUtil.daysBetween2(firstLoginTime, nowTime);
|
if (days >= Constant.TLJ_NEW_USER_DAYS)
|
return null; // 已经超出设置天数
|
|
UserTaoLiJinNewbies redPackWin = userTaoLiJinNewbiesMapper.selectForUpdate(uid);
|
if (redPackWin != null) {
|
if (redPackWin.getMoney().compareTo(Constant.TLJ_NEW_USER_MONEY) >= 0)
|
return null; // 已领取完
|
|
Date updateTime = redPackWin.getUpdateTime();
|
int daysNum = DateUtil.daysBetween2(updateTime, nowTime);
|
if (daysNum == 0)
|
return null; // 今日已领取
|
|
Integer num = redPackWin.getNum();
|
if (num >= Constant.TLJ_NEW_USER_DAYS)
|
return null; // 领取次数超限
|
}
|
|
BigDecimal money = null;
|
if (redPackWin == null) { // 第一次
|
if (days == Constant.TLJ_NEW_USER_DAYS - 1) { // 最后一天
|
money = Constant.TLJ_NEW_USER_MONEY;
|
} else { // 计算随机奖励
|
double randomNum = Constant.TLJ_NEW_USER_MIN + Math.random() * (Constant.TLJ_NEW_USER_MAX - Constant.TLJ_NEW_USER_MIN);
|
randomNum = randomNum/100;
|
BigDecimal rate = new BigDecimal(randomNum).setScale(2, BigDecimal.ROUND_DOWN);
|
money = MoneyBigDecimalUtil.mul(Constant.TLJ_NEW_USER_MONEY,rate);
|
}
|
} else if (days == Constant.TLJ_NEW_USER_DAYS - 1) { // 最后一天
|
money = MoneyBigDecimalUtil.sub(Constant.TLJ_NEW_USER_MONEY, redPackWin.getMoney());
|
} else { // 计算剩余随机奖励 10%-25%
|
double randomNum = 10 + Math.random() * (20 - 10);
|
BigDecimal rate = new BigDecimal(randomNum/100).setScale(2, BigDecimal.ROUND_DOWN);
|
money = MoneyBigDecimalUtil.mul(MoneyBigDecimalUtil.sub(Constant.TLJ_NEW_USER_MONEY,redPackWin.getMoney()),rate);
|
}
|
money = money.setScale(2);
|
|
// 插入领取记录
|
int num = 1;
|
BigDecimal balance = null;
|
if (redPackWin == null) {
|
balance = money;
|
|
// 注册开始 有效期
|
Date endDate = DateUtil.plusDayDate(Constant.TLJ_NEW_USER_LIMIT, firstLoginTime);
|
|
redPackWin = new UserTaoLiJinNewbies();
|
redPackWin.setId(uid);
|
redPackWin.setNum(1);
|
redPackWin.setMoney(money);
|
redPackWin.setEndTime(endDate);
|
redPackWin.setCreateTime(nowTime);
|
redPackWin.setUpdateTime(nowTime);
|
userTaoLiJinNewbiesMapper.insertSelective(redPackWin);
|
} else {
|
userTaoLiJinNewbiesMapper.addMoney(uid, money);
|
|
num = redPackWin.getNum() + 1;
|
balance = MoneyBigDecimalUtil.add(money, redPackWin.getMoney());
|
}
|
|
Map<String,String> map = new HashMap<String,String>();
|
map.put("url", configTaoLiJinService.getValueByKey("new_user_free_buy_list"));
|
|
TaoLiJinWinDetailVO winDetailVO = new TaoLiJinWinDetailVO();
|
winDetailVO.setTitle("新人红包");
|
winDetailVO.setBless("恭喜你!已领" + num + "/" + Constant.TLJ_NEW_USER_DAYS + "次");
|
winDetailVO.setMoney(money.toString());
|
winDetailVO.setDesc("已领取:" + balance + "元");
|
winDetailVO.setTips(configTaoLiJinService.getValueByKey("new_user_win_tips"));
|
winDetailVO.setParams(map.toString());
|
winDetailVO.setJumpDetail(jumpDetailV2Service.getByTypeCache("web"));
|
winDetailVO.setLogo(Constant.systemCommonConfig.getDefaultPortrait());
|
winDetailVO.setLogoLight(Constant.systemCommonConfig.getDefaultPortrait());
|
return winDetailVO;
|
}
|
|
@Override
|
public UserTaoLiJinNewbies selectByPrimaryKey(Long uid) {
|
return userTaoLiJinNewbiesMapper.selectByPrimaryKey(uid);
|
}
|
|
|
}
|