admin
2019-11-16 a6f34b99ee20e528b766c8ed5a61bd9c5aa0e7ae
fanli/src/main/java/com/yeshi/fanli/service/impl/redpack/RedPackWinNewUserServiceImpl.java
@@ -11,14 +11,19 @@
import com.yeshi.fanli.dao.mongodb.redpack.RedPackWinNewUserDao;
import com.yeshi.fanli.entity.bus.user.UserInfoExtra;
import com.yeshi.fanli.entity.push.DeviceActive;
import com.yeshi.fanli.entity.redpack.RedPackBalance;
import com.yeshi.fanli.entity.redpack.RedPackWinNewUser;
import com.yeshi.fanli.log.LogHelper;
import com.yeshi.fanli.service.inter.money.msg.UserMoneyMsgNotificationService;
import com.yeshi.fanli.service.inter.push.DeviceActiveService;
import com.yeshi.fanli.service.inter.redpack.RedPackBalanceService;
import com.yeshi.fanli.service.inter.redpack.RedPackConfigService;
import com.yeshi.fanli.service.inter.redpack.RedPackWinNewUserService;
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.util.factory.RedPackDetailFactory;
import com.yeshi.fanli.vo.redpack.RedPackWinDetailVO;
@@ -41,11 +46,75 @@
   @Resource
   private UserMoneyMsgNotificationService userMoneyMsgNotificationService;
   
   @Resource
   private DeviceActiveService deviceActiveService;
   @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.RED_PACK_NEW_USER_DAYS) {
               return false; // 已经超出设置天数
            }
            return true; // 未超过时间
         }
         RedPackBalance redPackBalance = redPackBalanceService.selectByPrimaryKey(uid);
         if (redPackBalance != null && redPackBalance.getState() != null
               && redPackBalance.getState() == RedPackBalance.STATE_LOCKED)
            return false;  // 红包封禁
         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.RED_PACK_NEW_USER_DAYS)
            return false; // 已经超出设置天数
         RedPackWinNewUser redPackWin = redPackWinNewUserDao.getByUid(uid);
         if (redPackWin != null) {
            if (redPackWin.getMoney().compareTo(Constant.RED_PACK_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.RED_PACK_NEW_USER_DAYS)
               return false; // 领取次数超限
         }
         return true;
      } catch (Exception e) {
         LogHelper.errorDetailInfo(e);
      }
      return false;
   }
   
   @RequestSerializableByKeyService(key = "#uid")
   @Transactional(rollbackFor = Exception.class)
   @Override
   public RedPackWinDetailVO 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;
@@ -53,7 +122,7 @@
      Date nowTime = new Date();
      Date firstLoginTime = userInfoExtra.getFirstLoginTime();
      int days = DateUtil.daysBetween2(firstLoginTime, nowTime);
      if (days > Constant.RED_PACK_NEW_USER_DAYS)
      if (days >= Constant.RED_PACK_NEW_USER_DAYS)
         return null; // 已经超出设置天数
      
      RedPackWinNewUser redPackWin = redPackWinNewUserDao.getByUid(uid);
@@ -73,23 +142,28 @@
            
      BigDecimal money = null;
      if (redPackWin == null) { // 第一次
         if (days == Constant.RED_PACK_NEW_USER_DAYS) {  // 最后一天
         if (days == Constant.RED_PACK_NEW_USER_DAYS - 1) {  // 最后一天
            money = Constant.RED_PACK_NEW_USER_MONEY;
         } else { // 计算随机奖励
            double randomNum = Constant.RED_PACK_NEW_USER_MIN +  Math.random() * (Constant.RED_PACK_NEW_USER_MAX - Constant.RED_PACK_NEW_USER_MIN);
            BigDecimal rate = new BigDecimal(randomNum/100).setScale(2);
            randomNum = randomNum/100;
            BigDecimal rate = new BigDecimal(randomNum).setScale(2, BigDecimal.ROUND_DOWN);
            money = MoneyBigDecimalUtil.mul(Constant.RED_PACK_NEW_USER_MONEY,rate);
         }
      } else if (days == Constant.RED_PACK_NEW_USER_DAYS) { // 最后一天
      } else if (days == Constant.RED_PACK_NEW_USER_DAYS - 1) { // 最后一天
         money = MoneyBigDecimalUtil.sub(Constant.RED_PACK_NEW_USER_MONEY, redPackWin.getMoney());
      } else { // 计算剩余随机奖励 10%-25% 
         double randomNum = 10 +  Math.random() * (20 - 10);
         BigDecimal rate = new BigDecimal(randomNum/100).setScale(2);
         BigDecimal rate = new BigDecimal(randomNum/100).setScale(2, BigDecimal.ROUND_DOWN);
         money = MoneyBigDecimalUtil.mul(MoneyBigDecimalUtil.sub(Constant.RED_PACK_NEW_USER_MONEY,redPackWin.getMoney()),rate);
      }
      
      int num = 1;
      money = money.setScale(2);
      // 4、增加红包
      redPackBalanceService.addRedPack(uid, money, RedPackDetailFactory.createNewUserReward(uid, days, money));
      // 插入领取记录
      int num = 1;
      if (redPackWin == null) {
         redPackWin = new RedPackWinNewUser();
         redPackWin.setNum(1);
@@ -99,16 +173,11 @@
         redPackWin.setUpdateTime(nowTime);
      } else {
         num = redPackWin.getNum() + 1;
         redPackWin = new RedPackWinNewUser();
         redPackWin.setUid(uid.toString());
         redPackWin.setNum(num);
         redPackWin.setMoney(MoneyBigDecimalUtil.add(money, redPackWin.getMoney()));
         redPackWin.setUpdateTime(nowTime);
      }
      redPackWinNewUserDao.save(redPackWin);
      // 4、增加红包
      redPackBalanceService.addRedPack(uid, money, RedPackDetailFactory.createNewUserReward(uid,num, money));
      
      RedPackWinDetailVO winDetailVO = new RedPackWinDetailVO();
      winDetailVO.setTitle("新人红包");