| | |
| | | package com.yeshi.fanli.service.impl.redpack;
|
| | |
|
| | | import java.math.BigDecimal;
|
| | | import java.util.ArrayList;
|
| | | import java.util.Date;
|
| | | import java.util.List;
|
| | |
|
| | |
| | |
|
| | | import com.google.gson.Gson;
|
| | | import com.yeshi.fanli.dao.mybatis.redpack.RedPackWinInviteMapper;
|
| | | import com.yeshi.fanli.dto.msg.MsgRedPackAddContentDTO;
|
| | | import com.yeshi.fanli.dto.msg.MsgRedPackTeamRewardContentDTO;
|
| | | import com.yeshi.fanli.entity.bus.msg.MsgMoneyDetail.MsgTypeMoneyTypeEnum;
|
| | | import com.yeshi.fanli.entity.bus.user.ThreeSale;
|
| | | import com.yeshi.fanli.entity.bus.user.UserActiveLog;
|
| | | import com.yeshi.fanli.entity.bus.user.UserExtraTaoBaoInfo;
|
| | | import com.yeshi.fanli.entity.bus.user.UserInfo;
|
| | | import com.yeshi.fanli.entity.order.CommonOrder;
|
| | | import com.yeshi.fanli.entity.redpack.RedPackWinInvite;
|
| | | import com.yeshi.fanli.entity.redpack.RedPackWinInvite.RedPackWinInviteTypeEnum;
|
| | | import com.yeshi.fanli.service.inter.count.HongBaoV2CountService;
|
| | | import com.yeshi.fanli.service.inter.money.msg.UserMoneyMsgNotificationService;
|
| | | import com.yeshi.fanli.service.inter.order.CommonOrderService;
|
| | | import com.yeshi.fanli.service.inter.redpack.RedPackBalanceService;
|
| | | import com.yeshi.fanli.service.inter.redpack.RedPackConfigService;
|
| | | import com.yeshi.fanli.service.inter.redpack.RedPackWinInviteService;
|
| | | import com.yeshi.fanli.service.inter.user.UserActiveLogService;
|
| | | import com.yeshi.fanli.service.inter.user.UserInfoService;
|
| | | import com.yeshi.fanli.service.inter.user.integral.IntegralTaskRecordService;
|
| | | import com.yeshi.fanli.service.inter.user.invite.ThreeSaleSerivce;
|
| | |
| | | import com.yeshi.fanli.util.Constant;
|
| | | import com.yeshi.fanli.util.MoneyBigDecimalUtil;
|
| | | import com.yeshi.fanli.util.StringUtil;
|
| | | import com.yeshi.fanli.util.TimeUtil;
|
| | | import com.yeshi.fanli.util.VersionUtil;
|
| | | import com.yeshi.fanli.util.annotation.RequestSerializableByKeyService;
|
| | | import com.yeshi.fanli.util.annotation.redpack.RedPackGetVersionLimit;
|
| | | import com.yeshi.fanli.util.factory.RedPackDetailFactory;
|
| | | import com.yeshi.fanli.vo.order.CommonOrderVO;
|
| | | import com.yeshi.fanli.vo.redpack.RedPackWinProgressVO;
|
| | |
|
| | | @Service
|
| | | public class RedPackWinInviteServiceImpl implements RedPackWinInviteService {
|
| | |
|
| | | @Resource
|
| | | private RedPackWinInviteMapper redPackWinInviteMapper;
|
| | | |
| | |
|
| | | @Resource
|
| | | private RedPackConfigService redPackConfigService;
|
| | | |
| | |
|
| | | @Resource
|
| | | private RedPackBalanceService redPackBalanceService;
|
| | |
|
| | | @Resource
|
| | | private CommonOrderService commonOrderService;
|
| | | |
| | | private CommonOrderService commonOrderService;
|
| | |
|
| | | @Resource
|
| | | private ThreeSaleSerivce threeSaleSerivce;
|
| | | |
| | |
|
| | | @Resource
|
| | | private UserMoneyMsgNotificationService userMoneyMsgNotificationService;
|
| | | |
| | | @Resource |
| | |
|
| | | @Resource
|
| | | private UserInfoService userInfoService;
|
| | | |
| | | @Resource |
| | |
|
| | | @Resource
|
| | | private UserExtraTaoBaoInfoService userExtraTaoBaoInfoService;
|
| | | |
| | | @Resource |
| | |
|
| | | @Resource
|
| | | private IntegralTaskRecordService integralTaskRecordService;
|
| | | |
| | | |
| | |
|
| | | @Resource
|
| | | private UserActiveLogService userActiveLogService;
|
| | |
|
| | | @Resource
|
| | | private HongBaoV2CountService hongBaoV2CountService;
|
| | |
|
| | | @Override
|
| | | public List<RedPackWinInvite> getRewardList(int start, int count, Long uid) {
|
| | | return redPackWinInviteMapper.getRewardList(start, count, uid);
|
| | | }
|
| | | |
| | | |
| | |
|
| | | @Override
|
| | | public Long countRewardRecord(Long uid) {
|
| | | return redPackWinInviteMapper.countRewardRecord(uid);
|
| | | }
|
| | | |
| | |
|
| | | @Override
|
| | | public BigDecimal getRewardMoney(Long uid) {
|
| | | return redPackWinInviteMapper.getRewardMoney(uid);
|
| | | }
|
| | | |
| | | |
| | | @RedPackGetVersionLimit(uid = "#uid")
|
| | | @RequestSerializableByKeyService(key = "#uid")
|
| | |
|
| | | @Override
|
| | | @RequestSerializableByKeyService(key = "#teamUid")
|
| | | @Transactional(rollbackFor = Exception.class)
|
| | | @Override
|
| | | public void orderArriveReward(Long uid, Integer source, String orderNo) throws Exception {
|
| | | if (uid == null || source == null || orderNo == null)
|
| | | public void initCreateRedPackWin(Long bossId, Long teamUid) {
|
| | | UserActiveLog activeLog = userActiveLogService.getUserLatestActiveInfo(bossId);
|
| | | if (activeLog == null)
|
| | | return;
|
| | | |
| | | // 上一级的奖励
|
| | | UserInfo boss = threeSaleSerivce.getBoss(uid);
|
| | | if(boss != null) {
|
| | | bossReward(boss.getId(), uid, source, orderNo);
|
| | | }
|
| | | }
|
| | | |
| | | |
| | | /**
|
| | | * 上级奖励
|
| | | * @param uid
|
| | | * @param teamUid
|
| | | * @param source
|
| | | * @param orderNo
|
| | | * @throws Exception
|
| | | */
|
| | | @RedPackGetVersionLimit(uid = "#uid")
|
| | | @Transactional
|
| | | private void bossReward(Long uid, Long teamUid, Integer source, String orderNo) throws Exception {
|
| | | firstSharedOrderRewardToBoss(uid, teamUid, source, orderNo);
|
| | | firstSharedOrderRewardTheMonthToBoss(uid, teamUid, source, orderNo);
|
| | | }
|
| | | |
| | | /**
|
| | | * 上级奖励:被邀请人完成首笔分享订单 (已到账) |
| | | * @param uid
|
| | | * @param source
|
| | | * @param orderNo
|
| | | * @param bossId
|
| | | */
|
| | | @Transactional
|
| | | private void firstSharedOrderRewardToBoss(Long uid, Long inviteeUid, Integer source, String orderNo) throws Exception{
|
| | | // 同一队员奖励一次
|
| | | long totalReward = redPackWinInviteMapper.countByUidAndTeamUidAndType(uid, inviteeUid, RedPackWinInviteTypeEnum.firstSharedOrder.name());
|
| | |
|
| | | // 小于2.0.5版本不增加
|
| | | if (!VersionUtil.greaterThan_2_0_5("appstore".equalsIgnoreCase(activeLog.getChannel()) ? "ios" : "android",
|
| | | activeLog.getVersionCode()))
|
| | | return;
|
| | |
|
| | | // 同一队员只记录一次
|
| | | int totalReward = redPackWinInviteMapper.countByUidAndTeamUidAndType(bossId, teamUid,
|
| | | RedPackWinInviteTypeEnum.zeroStageReward.name());
|
| | | if (totalReward > 0)
|
| | | return;
|
| | | |
| | | // 1、判断是否是改用户首个分享订单
|
| | | CommonOrderVO order = commonOrderService.firstValidOrderByUidAndType(inviteeUid, 2);
|
| | | if (order == null || source != order.getSourceType() || !orderNo.equals(order.getOrderNo())) |
| | | return;
|
| | | |
| | | // 2、判断是第几个人
|
| | | long total = redPackWinInviteMapper.countByUidAndType(uid, RedPackWinInviteTypeEnum.firstSharedOrder.name());
|
| | | |
| | | |
| | | // 计算应增加红包金额
|
| | | BigDecimal money = new BigDecimal(redPackConfigService.getValueByKey("first_shared_order"));
|
| | | long num = total % 9;
|
| | | if (num > 0) {
|
| | | BigDecimal addMoney = new BigDecimal(redPackConfigService.getValueByKey("first_shared_order_add"));
|
| | | money = MoneyBigDecimalUtil.add(money, MoneyBigDecimalUtil.mul(addMoney, new BigDecimal(num)));
|
| | | }
|
| | | |
| | | // 3、获得红包记录
|
| | |
|
| | | // 获得红包
|
| | | RedPackWinInvite winInvite = new RedPackWinInvite();
|
| | | winInvite.setUid(bossId);
|
| | | winInvite.setTeamUid(teamUid);
|
| | | winInvite.setMoney(new BigDecimal(0));
|
| | | winInvite.setType(RedPackWinInviteTypeEnum.zeroStageReward);
|
| | | winInvite.setIdentifyCode(StringUtil.Md5(RedPackWinInviteTypeEnum.zeroStageReward.name() + ":" + teamUid));
|
| | | winInvite.setCreateTime(new Date());
|
| | | winInvite.setUpdateTime(new Date());
|
| | | winInvite.setType(RedPackWinInviteTypeEnum.firstSharedOrder);
|
| | | winInvite.setUid(uid);
|
| | | winInvite.setTeamUid(inviteeUid);
|
| | | winInvite.setMoney(money);
|
| | | winInvite.setSource(source);
|
| | | winInvite.setOrderNo(orderNo);
|
| | | redPackWinInviteMapper.insertSelective(winInvite);
|
| | | |
| | | // 4、增加红包
|
| | | redPackBalanceService.addRedPack(uid, money, RedPackDetailFactory.createIncreaseReward(winInvite));
|
| | | |
| | | // 5、消息
|
| | | MsgRedPackAddContentDTO dto = new MsgRedPackAddContentDTO();
|
| | | dto.setTitle("红包增加");
|
| | | dto.setMoney("¥" + money.setScale(2));
|
| | | dto.setBalance("¥" + redPackBalanceService.getBalance(uid).setScale(2));
|
| | | userMoneyMsgNotificationService.redPackMsg(uid, MsgTypeMoneyTypeEnum.redPackFirstSharedOrder, new Gson().toJson(dto), "红包可用于购买会员");
|
| | | }
|
| | | |
| | | |
| | | /**
|
| | | * 上级奖励:次月开始产生满足条件的分享订单(分享订单实付款≥10元) 连续15个月 自然月获得(已到账)每月最高2元
|
| | | * @param uid
|
| | | * @param source
|
| | | * @param orderNo
|
| | | * @param bossId
|
| | | */
|
| | | @Transactional
|
| | | private void firstSharedOrderRewardTheMonthToBoss(Long uid, Long inviteeUid, Integer source, String orderNo) throws Exception{
|
| | | // 1、判断是否是上个月首单
|
| | | CommonOrderVO order = commonOrderService.firstValidOrderLastMonthByUidAndType(inviteeUid, 2);
|
| | | if (order == null || source != order.getSourceType() || !orderNo.equals(order.getOrderNo()) ||
|
| | | order.getAccountTime() == null) |
| | | return;
|
| | | |
| | | // 分享订单实付款≥10元
|
| | | if (order.getPayment() == null || order.getPayment().compareTo(Constant.RED_PACK_PAY_MIN) < 0) |
| | | return;
|
| | | |
| | | // 查询首单奖励时间
|
| | | CommonOrderVO firstorder = commonOrderService.firstValidOrderByUidAndType(inviteeUid, 2);
|
| | | if (firstorder == null || firstorder.getAccountTime() == null) |
| | | return;
|
| | | |
| | | // 第一次到账的次月开始连续15个月 自然月获得(已到账)
|
| | | int monthSpace = DateUtil.getMonthSpace( order.getAccountTime(), firstorder.getAccountTime());
|
| | | if (monthSpace == 0 || monthSpace > Constant.RED_PACK_REWARd_MONTH) |
| | | return;
|
| | | |
| | | |
| | | // 计算随机奖励
|
| | | double randomMoney = Constant.RED_PACK_RANDOM_MIN + Math.random() * (Constant.RED_PACK_RANDOM_MAX - Constant.RED_PACK_RANDOM_MIN);
|
| | | // 保留两位小数
|
| | | BigDecimal money = new BigDecimal(randomMoney).setScale(2, BigDecimal.ROUND_HALF_UP);
|
| | | |
| | | // 3、获得红包记录
|
| | | RedPackWinInvite winInvite = new RedPackWinInvite();
|
| | | winInvite.setCreateTime(new Date());
|
| | | winInvite.setUpdateTime(new Date());
|
| | | winInvite.setType(RedPackWinInviteTypeEnum.monthSharedOrder);
|
| | | winInvite.setUid(uid);
|
| | | winInvite.setTeamUid(inviteeUid);
|
| | | winInvite.setMoney(money);
|
| | | winInvite.setSource(source);
|
| | | winInvite.setOrderNo(orderNo);
|
| | | redPackWinInviteMapper.insertSelective(winInvite);
|
| | | |
| | | // 4、增加红包
|
| | | redPackBalanceService.addRedPack(uid, money, RedPackDetailFactory.createSeriesReward(winInvite));
|
| | | |
| | | //消息
|
| | | MsgRedPackAddContentDTO dto = new MsgRedPackAddContentDTO();
|
| | | dto.setTitle("红包增加");
|
| | | dto.setMoney("¥" + money.setScale(2));
|
| | | dto.setBalance("¥" + redPackBalanceService.getBalance(uid).setScale(2));
|
| | | userMoneyMsgNotificationService.redPackMsg(uid, MsgTypeMoneyTypeEnum.redPackMonthSharedOrder, new Gson().toJson(dto), "红包可用于购买会员");
|
| | | }
|
| | | |
| | | |
| | | @RequestSerializableByKeyService(key = "#uid")
|
| | |
|
| | | @Override
|
| | | @Transactional
|
| | | public void inviteSucceedReward(Long uid) throws Exception{
|
| | | // 验证是否存在上级
|
| | | UserInfo boss = threeSaleSerivce.getBoss(uid);
|
| | | if(boss == null) |
| | | @RequestSerializableByKeyService(key = "#teamUid")
|
| | | @Transactional(rollbackFor = Exception.class)
|
| | | public void inviteSucceedReward(Long teamUid) throws Exception {
|
| | | // 是否在上线之后的邀请关系
|
| | | ThreeSale threeSale = threeSaleSerivce.getByWorkerIdAndTime(teamUid,
|
| | | TimeUtil.convertDateToTemp(Constant.RED_PACK_ONLINE_TIME));
|
| | | if (threeSale == null)
|
| | | return;
|
| | | |
| | |
|
| | | // 上级id
|
| | | Long bossId = threeSale.getBoss().getId();
|
| | | UserActiveLog activeLog = userActiveLogService.getUserLatestActiveInfo(bossId);
|
| | | if (activeLog == null)
|
| | | return;
|
| | |
|
| | | // 小于2.0.2版本不增加
|
| | | if (!VersionUtil.greaterThan_2_0_5("appstore".equalsIgnoreCase(activeLog.getChannel()) ? "ios" : "android",
|
| | | activeLog.getVersionCode()))
|
| | | return;
|
| | |
|
| | | int totalRewardZero = redPackWinInviteMapper.countByUidAndTeamUidAndType(bossId, teamUid,
|
| | | RedPackWinInviteTypeEnum.zeroStageReward.name());
|
| | | if (totalRewardZero <= 0)
|
| | | return;
|
| | |
|
| | | // 同一队员奖励一次
|
| | | long totalReward = redPackWinInviteMapper.countByUidAndTeamUidAndType(boss.getId(), uid, RedPackWinInviteTypeEnum.inviteSucceed.name());
|
| | | int totalReward = redPackWinInviteMapper.countByUidAndTeamUidAndType(bossId, teamUid,
|
| | | RedPackWinInviteTypeEnum.oneStageReward.name());
|
| | | if (totalReward > 0)
|
| | | return;
|
| | | |
| | | // 1、绑定电话号码
|
| | | UserInfo userInfo = userInfoService.selectByPKey(uid);
|
| | | if (userInfo == null || StringUtil.isNullOrEmpty(userInfo.getPhone())) |
| | |
|
| | | // 建立邀请关系时间超过20天
|
| | | Long succeedTime = threeSale.getSucceedTime();
|
| | | Date endDate = DateUtil.plusDayDate(Constant.ONE_STAGE_LIMIT_DAYS, new Date(succeedTime));
|
| | | if (endDate.getTime() < java.lang.System.currentTimeMillis())
|
| | | return;
|
| | | |
| | | // 2、授权淘宝
|
| | | UserExtraTaoBaoInfo taoBaoInfo = userExtraTaoBaoInfoService.getByUid(uid);
|
| | |
|
| | | // 绑定电话号码和微信
|
| | | UserInfo userInfo = userInfoService.selectByPKey(teamUid);
|
| | | if (userInfo == null || StringUtil.isNullOrEmpty(userInfo.getPhone())
|
| | | || StringUtil.isNullOrEmpty(userInfo.getWxOpenId()))
|
| | | return;
|
| | |
|
| | | // 授权淘宝
|
| | | UserExtraTaoBaoInfo taoBaoInfo = userExtraTaoBaoInfoService.getByUid(teamUid);
|
| | | if (taoBaoInfo == null || StringUtil.isNullOrEmpty(taoBaoInfo.getTaoBaoUid()))
|
| | | return;
|
| | | |
| | | |
| | | boolean finishTask = false;
|
| | | // 3.1、产生任意有效订单(无需到账)
|
| | | CommonOrder commonOrder = commonOrderService.selectLatestValidByUid(uid);
|
| | | if (commonOrder != null) |
| | | finishTask = true;
|
| | | |
| | | // 3.2、单位时间类累计产生≥200金币
|
| | | if (!finishTask) {
|
| | | long totalGoldCoin = integralTaskRecordService.getTotalGoldCoinByUid(uid);
|
| | | if (totalGoldCoin >= Constant.RED_PACK_GOLD_COIN)
|
| | | finishTask = true;
|
| | |
|
| | | // 好友产生一笔返利订单(自购)且 24 小时内不失效;
|
| | | long validOrder = commonOrderService.count24HValidOrderByUid(teamUid, new Date(succeedTime));
|
| | | if (validOrder < 1)
|
| | | return;
|
| | |
|
| | | // 奖励金额
|
| | | BigDecimal money = Constant.ONE_STAGE_MONEY;
|
| | |
|
| | | // 获得红包
|
| | | RedPackWinInvite winInvite = new RedPackWinInvite();
|
| | | winInvite.setCreateTime(new Date());
|
| | | winInvite.setUpdateTime(new Date());
|
| | | winInvite.setType(RedPackWinInviteTypeEnum.oneStageReward);
|
| | | winInvite.setUid(bossId);
|
| | | winInvite.setTeamUid(teamUid);
|
| | | winInvite.setMoney(money);
|
| | | winInvite.setIdentifyCode(StringUtil.Md5(RedPackWinInviteTypeEnum.oneStageReward.name() + ":" + teamUid));
|
| | | redPackWinInviteMapper.insertSelective(winInvite);
|
| | |
|
| | | // 增加红包
|
| | | redPackBalanceService.addRedPack(bossId, money, RedPackDetailFactory.createInvite(winInvite));
|
| | |
|
| | | // 消息
|
| | | MsgRedPackTeamRewardContentDTO dto = new MsgRedPackTeamRewardContentDTO();
|
| | | dto.setNickName(userInfo.getNickName());
|
| | | dto.setPortrait(userInfo.getPortrait());
|
| | | userMoneyMsgNotificationService.teamRedPackRewardMsg(bossId, MsgTypeMoneyTypeEnum.redPackOneStageReward, money,
|
| | | "粉丝(好友)完成第一阶段", new Gson().toJson(dto));
|
| | | }
|
| | |
|
| | | @RequestSerializableByKeyService(key = "#uid")
|
| | | @RedPackGetVersionLimit(uid = "#uid")
|
| | | @Transactional(rollbackFor = Exception.class)
|
| | | @Override
|
| | | public void inviteOrderArriveReward(Long uid, Integer source, String orderNo) throws Exception {
|
| | | if (uid == null || source == null || StringUtil.isNullOrEmpty(orderNo))
|
| | | return;
|
| | |
|
| | | // 获取订单对应下单人
|
| | | List<CommonOrder> list = commonOrderService.listBySourceTypeAndOrderId(source, orderNo);
|
| | | if (list == null || list.isEmpty())
|
| | | return;
|
| | |
|
| | | CommonOrder commonOrder = list.get(0);
|
| | | if (commonOrder == null || commonOrder.getUserInfo() == null)
|
| | | return;
|
| | |
|
| | | // 下单人id
|
| | | Long teamUid = commonOrder.getUserInfo().getId();
|
| | | if (teamUid == null)
|
| | | return;
|
| | |
|
| | | // 验证上下级关系
|
| | | ThreeSale threeSale = threeSaleSerivce.getByWorkerIdAndTime(teamUid,
|
| | | TimeUtil.convertDateToTemp(Constant.RED_PACK_ONLINE_TIME));
|
| | | if (threeSale == null || threeSale.getBoss().getId().longValue() != uid.longValue())
|
| | | return;
|
| | |
|
| | | // 第一阶段(验证)
|
| | | RedPackWinInvite oneStage = redPackWinInviteMapper.getByUidAndTeamUidAndType(uid, teamUid,
|
| | | RedPackWinInviteTypeEnum.oneStageReward.name());
|
| | | if (oneStage == null)
|
| | | return;
|
| | |
|
| | | // 第二阶段(验证)
|
| | | RedPackWinInvite twoStage = redPackWinInviteMapper.getByUidAndTeamUidAndType(uid, teamUid,
|
| | | RedPackWinInviteTypeEnum.twoStageReward.name());
|
| | | if (twoStage == null) {
|
| | | twoStageRewardToBoss(uid, teamUid, oneStage.getCreateTime(), source, orderNo);
|
| | | return;
|
| | | }
|
| | | |
| | | // 3.3、成功邀请一个好友
|
| | | if (!finishTask) {
|
| | | long countTeam = threeSaleSerivce.countSuccessFirstTeam(uid);
|
| | | if (countTeam >= 1)
|
| | | finishTask = true;
|
| | |
|
| | | // 第三阶段
|
| | | threeStageRewardToBoss(uid, teamUid, twoStage.getCreateTime(), source, orderNo);
|
| | | }
|
| | |
|
| | | /**
|
| | | * 上级奖励--第二阶段
|
| | | * |
| | | * @param uid
|
| | | * @param source
|
| | | * @param orderNo
|
| | | * @param bossId
|
| | | */
|
| | | @Transactional(rollbackFor = Exception.class)
|
| | | private void twoStageRewardToBoss(Long bossId, Long teamUid, Date oneStageTime, Integer source, String orderNo)
|
| | | throws Exception {
|
| | | // 第一阶段完成之后的90天内 ; 队友产生的订单中(自购+分享),邀请人累计产生≥1 元奖金
|
| | | Date endDate = DateUtil.plusDayDate(Constant.TWO_STAGE_LIMIT_DAYS, oneStageTime);
|
| | |
|
| | | // 统计订单奖金 (“好友自购”和“好友分享”)
|
| | | BigDecimal rewardMoney = hongBaoV2CountService.getOrderRewardByTeamUid(bossId, teamUid, endDate);
|
| | | if (rewardMoney == null || rewardMoney.compareTo(Constant.TWO_STAGE_ORDER_REWARD_MIN) < 0)
|
| | | return;
|
| | |
|
| | | // 计算奖励
|
| | | BigDecimal money = Constant.TWO_STAGE_MONEY_MIN;
|
| | | long total = redPackWinInviteMapper.countByUidAndType(bossId, RedPackWinInviteTypeEnum.twoStageReward.name());
|
| | | if (total > 0 && total < Constant.TWO_STAGE_MONEY_ADD_NUM) {
|
| | | long num = total % Constant.TWO_STAGE_MONEY_ADD_NUM;
|
| | | money = MoneyBigDecimalUtil.add(money,
|
| | | MoneyBigDecimalUtil.mul(Constant.TWO_STAGE_MONEY_ADD, new BigDecimal(num)));
|
| | | }
|
| | | |
| | | if (finishTask) {
|
| | | // 奖励金额
|
| | | BigDecimal money = new BigDecimal(redPackConfigService.getValueByKey("invite_succeed"));
|
| | | |
| | | // 获得红包记录
|
| | | RedPackWinInvite winInvite = new RedPackWinInvite();
|
| | | winInvite.setCreateTime(new Date());
|
| | | winInvite.setUpdateTime(new Date());
|
| | | winInvite.setType(RedPackWinInviteTypeEnum.inviteSucceed);
|
| | | winInvite.setUid(boss.getId());
|
| | | winInvite.setTeamUid(uid);
|
| | | winInvite.setMoney(money);
|
| | | redPackWinInviteMapper.insertSelective(winInvite);
|
| | | |
| | | // 增加红包
|
| | | redPackBalanceService.addRedPack(boss.getId(), money, RedPackDetailFactory.createInvite(winInvite));
|
| | | |
| | | // 消息
|
| | | MsgRedPackAddContentDTO dto = new MsgRedPackAddContentDTO();
|
| | | dto.setTitle("红包增加");
|
| | | dto.setMoney("¥" + money.setScale(2));
|
| | | dto.setBalance("¥" + redPackBalanceService.getBalance(boss.getId()).setScale(2));
|
| | | userMoneyMsgNotificationService.redPackMsg(boss.getId(), MsgTypeMoneyTypeEnum.redPackInviteSucceed, new Gson().toJson(dto), "红包可用于购买会员");
|
| | |
|
| | | // 获得红包记录
|
| | | RedPackWinInvite winInvite = new RedPackWinInvite();
|
| | | winInvite.setUid(bossId);
|
| | | winInvite.setTeamUid(teamUid);
|
| | | winInvite.setMoney(money);
|
| | | winInvite.setSource(source);
|
| | | winInvite.setOrderNo(orderNo);
|
| | | winInvite.setCreateTime(new Date());
|
| | | winInvite.setUpdateTime(new Date());
|
| | | winInvite.setType(RedPackWinInviteTypeEnum.twoStageReward);
|
| | | winInvite.setIdentifyCode(StringUtil.Md5(RedPackWinInviteTypeEnum.twoStageReward.name() + ":" + teamUid));
|
| | | redPackWinInviteMapper.insertSelective(winInvite);
|
| | |
|
| | | // 4、增加红包
|
| | | redPackBalanceService.addRedPack(bossId, money, RedPackDetailFactory.createIncreaseReward(winInvite));
|
| | |
|
| | | // 5、消息
|
| | | UserInfo userInfo = userInfoService.selectByPKey(teamUid);
|
| | | MsgRedPackTeamRewardContentDTO dto = new MsgRedPackTeamRewardContentDTO();
|
| | | dto.setNickName(userInfo.getNickName());
|
| | | dto.setPortrait(userInfo.getPortrait());
|
| | | userMoneyMsgNotificationService.teamRedPackRewardMsg(bossId, MsgTypeMoneyTypeEnum.redPackTwoStageReward, money,
|
| | | "粉丝(好友)完成第二阶段", new Gson().toJson(dto));
|
| | | }
|
| | |
|
| | | /**
|
| | | * 上级奖励:次月开始产生满足条件的分享订单(分享订单实付款≥10元) 连续15个月 自然月获得(已到账)每月最高2元
|
| | | * |
| | | * @param uid
|
| | | * @param source
|
| | | * @param orderNo
|
| | | * @param bossId
|
| | | */
|
| | | @Transactional(rollbackFor = Exception.class)
|
| | | private void threeStageRewardToBoss(Long bossId, Long teamUid, Date twoStageTime, Integer source, String orderNo)
|
| | | throws Exception {
|
| | | // 二、三阶段不可同月
|
| | | if (DateUtil.isSameMonth(twoStageTime, new Date()))
|
| | | return;
|
| | |
|
| | | // 是否已领取本月
|
| | | RedPackWinInvite threeStage = redPackWinInviteMapper.getByUidAndTeamUidAndTypeMonth(bossId, teamUid,
|
| | | RedPackWinInviteTypeEnum.threeStageReward.name());
|
| | | if (threeStage != null)
|
| | | return;
|
| | |
|
| | | // 已奖励次数
|
| | | int totalNum = redPackWinInviteMapper.countByUidAndTeamUidAndType(bossId, teamUid,
|
| | | RedPackWinInviteTypeEnum.threeStageReward.name());
|
| | | if (totalNum >= Constant.THREE_STAGE_REWARD_MONTH)
|
| | | return;
|
| | |
|
| | | // 是否已间断
|
| | | int monthSpace = DateUtil.getMonthSpace(twoStageTime, new Date());
|
| | | if (monthSpace != totalNum + 1)
|
| | | return;
|
| | |
|
| | | // 统计本月获得奖金 (“好友自购”和“好友分享”)
|
| | | BigDecimal rewardMoney = hongBaoV2CountService.getOrderRewardByTeamUidTheMonth(bossId, teamUid);
|
| | | if (rewardMoney == null || rewardMoney.compareTo(Constant.THREE_STAGE_ORDER_REWARD_MIN) < 0)
|
| | | return;
|
| | |
|
| | | // 计算随机奖励
|
| | | double randomMoney = Constant.THREE_STAGE_RANDOM_MIN
|
| | | + Math.random() * (Constant.THREE_STAGE_RANDOM_MAX - Constant.THREE_STAGE_RANDOM_MIN);
|
| | | // 保留两位小数
|
| | | BigDecimal money = new BigDecimal(randomMoney).setScale(2, BigDecimal.ROUND_HALF_UP);
|
| | |
|
| | | // 3、获得红包记录
|
| | | RedPackWinInvite winInvite = new RedPackWinInvite();
|
| | | winInvite.setCreateTime(new Date());
|
| | | winInvite.setUpdateTime(new Date());
|
| | | winInvite.setType(RedPackWinInviteTypeEnum.threeStageReward);
|
| | | winInvite.setUid(bossId);
|
| | | winInvite.setTeamUid(teamUid);
|
| | | winInvite.setMoney(money);
|
| | | winInvite.setSource(source);
|
| | | winInvite.setOrderNo(orderNo);
|
| | | winInvite.setIdentifyCode(
|
| | | StringUtil.Md5(RedPackWinInviteTypeEnum.threeStageReward.name() + ":" + teamUid + "-" + monthSpace));
|
| | | redPackWinInviteMapper.insertSelective(winInvite);
|
| | |
|
| | | // 4、增加红包
|
| | | redPackBalanceService.addRedPack(bossId, money, RedPackDetailFactory.createSeriesReward(winInvite));
|
| | |
|
| | | // 消息
|
| | | UserInfo userInfo = userInfoService.selectByPKey(teamUid);
|
| | | MsgRedPackTeamRewardContentDTO dto = new MsgRedPackTeamRewardContentDTO();
|
| | | dto.setNickName(userInfo.getNickName());
|
| | | dto.setPortrait(userInfo.getPortrait());
|
| | | userMoneyMsgNotificationService.teamRedPackRewardMsg(bossId, MsgTypeMoneyTypeEnum.redPackThreeStageReward,
|
| | | money, "粉丝(好友)完成第三阶段连续[第" + monthSpace + "个月]", new Gson().toJson(dto));
|
| | | }
|
| | |
|
| | | @Override
|
| | | public List<RedPackWinProgressVO> getInviteProgressByWorkerId(Long uid, Long tid) {
|
| | | List<RedPackWinProgressVO> listVO = new ArrayList<RedPackWinProgressVO>();
|
| | | ThreeSale threeSale = threeSaleSerivce.getNearRelationByBossIdAndWorkerId(uid, tid);
|
| | | if (threeSale == null || threeSale.getSucceedTime() == null)
|
| | | return listVO;
|
| | |
|
| | | UserInfo userInfo = userInfoService.selectByPKey(tid);
|
| | | if (userInfo == null)
|
| | | return listVO;
|
| | |
|
| | | // 奖励记录
|
| | | List<RedPackWinInvite> listWin = redPackWinInviteMapper.getWinListByBossIdAndTeamUid(uid, tid);
|
| | | if (listWin == null || listWin.size() == 0)
|
| | | return listVO;
|
| | |
|
| | | int month = 1;
|
| | | for (RedPackWinInvite win : listWin) {
|
| | | if (win.getType() == RedPackWinInviteTypeEnum.zeroStageReward) {
|
| | | listVO.add(new RedPackWinProgressVO("成功注册", TimeUtil.formatDate(userInfo.getCreatetime())));
|
| | | listVO.add(new RedPackWinProgressVO("确立邀请", TimeUtil.formatDate(threeSale.getSucceedTime())));
|
| | | }
|
| | | String time = TimeUtil.formatDate(win.getCreateTime());
|
| | | BigDecimal money = win.getMoney().setScale(2);
|
| | | if (win.getType() == RedPackWinInviteTypeEnum.oneStageReward) {
|
| | | listVO.add(new RedPackWinProgressVO("第一阶段", time, money.toString()));
|
| | | continue;
|
| | | }
|
| | |
|
| | | if (win.getType() == RedPackWinInviteTypeEnum.twoStageReward) {
|
| | | listVO.add(new RedPackWinProgressVO("第二阶段", time, money.toString()));
|
| | | continue;
|
| | | }
|
| | |
|
| | | if (win.getType() == RedPackWinInviteTypeEnum.threeStageReward) {
|
| | | listVO.add(new RedPackWinProgressVO("第三阶段第" + month + "个月", time, money.toString()));
|
| | | month++;
|
| | | continue;
|
| | | }
|
| | | }
|
| | | return listVO;
|
| | | }
|
| | |
|
| | | @Override
|
| | | public List<RedPackWinInvite> getWinTopListByBossId(int page, int count, Long uid) {
|
| | | return redPackWinInviteMapper.getWinTopListByBossId(count * (page - 1), count, uid);
|
| | | }
|
| | |
|
| | | @Override
|
| | | public long countWinTopListByBossId(Long uid) {
|
| | | return redPackWinInviteMapper.countWinTopListByBossId(uid);
|
| | | }
|
| | |
|
| | | @Override
|
| | | public long countTeamNumByTid(Long uid, Long teamUid) {
|
| | | return redPackWinInviteMapper.countTeamNumByTid(uid, teamUid);
|
| | | }
|
| | |
|
| | | |
| | | @Override
|
| | | public List<RedPackWinInvite> query(long page, int count, String key, String type){
|
| | | return redPackWinInviteMapper.query(count * (page - 1), count, key, type);
|
| | | }
|
| | |
|
| | | |
| | | @Override
|
| | | public long count(String key, String type){
|
| | | Long count = redPackWinInviteMapper.count(key, type);
|
| | | if (count == null) {
|
| | | count = 0L;
|
| | | }
|
| | | return count;
|
| | | }
|
| | | }
|