yujian
2019-11-06 54e6398cabe1b32b1dbc9857c6a99d8f15b549f7
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
package com.yeshi.fanli.service.impl.redpack;
 
import java.math.BigDecimal;
import java.util.Date;
 
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.mongodb.redpack.RedPackWinNewUserDao;
import com.yeshi.fanli.entity.bus.user.UserInfoExtra;
import com.yeshi.fanli.entity.redpack.RedPackWinNewUser;
import com.yeshi.fanli.service.inter.money.msg.UserMoneyMsgNotificationService;
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.annotation.RequestSerializableByKeyService;
import com.yeshi.fanli.util.factory.RedPackDetailFactory;
import com.yeshi.fanli.vo.redpack.RedPackWinDetailVO;
 
@Service
public class RedPackWinNewUserServiceImpl implements RedPackWinNewUserService {
 
    @Resource
    private RedPackWinNewUserDao redPackWinNewUserDao;
    
    @Resource
    private RedPackConfigService redPackConfigService;
    
    @Resource    
    private UserInfoExtraService userInfoExtraService;
    
    @Resource
    private RedPackBalanceService redPackBalanceService;
    
    @Resource
    private UserMoneyMsgNotificationService userMoneyMsgNotificationService;
    
    
    @RequestSerializableByKeyService(key = "#uid")
    @Transactional(rollbackFor = Exception.class)
    @Override
    public RedPackWinDetailVO receiveReward(Long uid) throws Exception {
        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.RED_PACK_NEW_USER_DAYS)
            return null; // 已经超出设置天数
        
        RedPackWinNewUser redPackWin = redPackWinNewUserDao.getByUid(uid);
        if (redPackWin != null) {
            if (redPackWin.getMoney().compareTo(Constant.RED_PACK_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.RED_PACK_NEW_USER_DAYS) 
                return null; // 领取次数超限
        }
                
        BigDecimal money = null;
        if (redPackWin == null) { // 第一次
            if (days == Constant.RED_PACK_NEW_USER_DAYS) {  // 最后一天
                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);
                money = MoneyBigDecimalUtil.mul(Constant.RED_PACK_NEW_USER_MONEY,rate);
            }
        } else if (days == Constant.RED_PACK_NEW_USER_DAYS) { // 最后一天
            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);
            money = MoneyBigDecimalUtil.mul(MoneyBigDecimalUtil.sub(Constant.RED_PACK_NEW_USER_MONEY,redPackWin.getMoney()),rate);
        }
        
        int num = 1;
        money = money.setScale(2);
        if (redPackWin == null) {
            redPackWin = new RedPackWinNewUser();
            redPackWin.setNum(1);
            redPackWin.setMoney(money);
            redPackWin.setUid(uid.toString());
            redPackWin.setCreateTime(nowTime);
            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("新人红包");
        winDetailVO.setBless("恭喜你!已领" + num + "/" + Constant.RED_PACK_NEW_USER_DAYS + "次");
        winDetailVO.setMoney(money.toString());
        winDetailVO.setDesc("领取成功,已存入“我的-红包”");
        winDetailVO.setTips(redPackConfigService.getValueByKey("new_user_win_tips"));
        return winDetailVO;
    }
    
    
 
}