yujian
2020-06-29 ec60e757d358636dcac1589c44a66f3e276fe58c
fanli/src/main/java/com/yeshi/fanli/service/impl/redpack/RedPackWinInviteServiceImpl.java
@@ -19,17 +19,25 @@
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.bus.user.UserInfoRegister;
import com.yeshi.fanli.entity.bus.user.UserSystemCoupon;
import com.yeshi.fanli.entity.order.CommonOrder;
import com.yeshi.fanli.entity.redpack.RedPackDetail;
import com.yeshi.fanli.entity.redpack.RedPackWinInvite;
import com.yeshi.fanli.entity.redpack.RedPackWinInvite.RedPackWinInviteTypeEnum;
import com.yeshi.fanli.entity.system.SystemCoupon.CouponTypeEnum;
import com.yeshi.fanli.exception.user.UserSystemCouponException;
import com.yeshi.fanli.service.inter.count.HongBaoV2CountService;
import com.yeshi.fanli.service.inter.money.msg.UserMoneyMsgNotificationService;
import com.yeshi.fanli.service.inter.order.CommonOrderGoodsService;
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.UserInfoRegisterService;
import com.yeshi.fanli.service.inter.user.UserInfoService;
import com.yeshi.fanli.service.inter.user.UserSystemCouponService;
import com.yeshi.fanli.service.inter.user.integral.IntegralTaskRecordService;
import com.yeshi.fanli.service.inter.user.invite.ThreeSaleSerivce;
import com.yeshi.fanli.service.inter.user.tb.UserExtraTaoBaoInfoService;
@@ -66,6 +74,9 @@
   @Resource
   private UserInfoService userInfoService;
   @Resource
   private UserInfoRegisterService userInfoRegisterService;
   @Resource
   private UserExtraTaoBaoInfoService userExtraTaoBaoInfoService;
@@ -78,6 +89,13 @@
   @Resource
   private HongBaoV2CountService hongBaoV2CountService;
   @Resource
   private CommonOrderGoodsService commonOrderGoodsService;
   @Resource
   private UserSystemCouponService userSystemCouponService;
   @Override
   public List<RedPackWinInvite> getRewardList(int start, int count, Long uid) {
@@ -430,4 +448,283 @@
      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;
   }
   @Override
   @RequestSerializableByKeyService(key = "#orderUid")
   @Transactional(rollbackFor = Exception.class)
   public void winRedPackByOrder(Long orderUid, String orderNo, Integer source, Date downTime) {
      if (orderUid == null || StringUtil.isNullOrEmpty(orderNo)) {
         return;
      }
      // 注册时间
      UserInfoRegister register = userInfoRegisterService.selectByPrimaryKey(orderUid);
      if (register == null)
         return;
      // 注册48小时 以内 :新人
      long registerTime = register.getCreateTime().getTime();
      // 48小时限制
      if (downTime.getTime() < registerTime || downTime.getTime() > registerTime + 1000*60*60*48)
         return;
      // 是否存在上下级关系
      ThreeSale threeSale = threeSaleSerivce.getByWorkerId(orderUid);
      if (threeSale == null)
         return;
      Long bossId = threeSale.getBoss().getId();
      if (bossId == null)
         return;
      // 小于2.1.3版本不增加
      UserActiveLog activeLog = userActiveLogService.getUserLatestActiveInfo(bossId);
      if (activeLog == null)
         return;
      if (!VersionUtil.greaterThan_2_1_3("appstore".equalsIgnoreCase(activeLog.getChannel()) ? "ios" : "android",
            activeLog.getVersionCode()))
         return;
      // 该邀请是否已添加
      RedPackWinInvite threeStage = redPackWinInviteMapper.getByUidAndTeamUid(bossId, orderUid);
      if (threeStage != null)
         return;
      // 查询订单
      List<CommonOrder> list = commonOrderService.getByOrderNo(orderUid, orderNo);
      if (list == null || list.size() ==0) {
         return;
      }
       // 商品比例限制
       BigDecimal limitRate = new BigDecimal(redPackConfigService.getValueByKey("goods_reate_limit"));
       BigDecimal limitPayMent = new BigDecimal(redPackConfigService.getValueByKey("goods_pay_ment_limit"));
       boolean satisfy = false;
      // 遍历是否存在符合相应商品
      for (CommonOrder commonOrder: list) {
         // 邀请关系之后
         long thirdTime = commonOrder.getThirdCreateTime().getTime();
         if (thirdTime < threeSale.getCreateTime())
            continue;
         // 付款金额限制
         BigDecimal payment = commonOrder.getPayment();
         if (payment == null || payment.compareTo(limitPayMent) < 0)
            continue;
         // 商品佣金比例限制
         BigDecimal eIncome = commonOrder.geteIncome();
         BigDecimal settlement = commonOrder.getSettlement();
         if(eIncome == null || settlement == null) {
            continue;
         }
         BigDecimal rete = MoneyBigDecimalUtil.div(eIncome, settlement);
         if (rete.compareTo(limitRate) >= 0) {
            satisfy = true;
            break;
         }
      }
      if (!satisfy) {
         return;
      }
      // 获得红包记录
      RedPackWinInvite winInvite = new RedPackWinInvite();
      winInvite.setUid(bossId);
      winInvite.setTeamUid(orderUid);
      winInvite.setMoney(null);
      winInvite.setSource(source);
      winInvite.setOrderNo(orderNo);
      winInvite.setCreateTime(new Date());
      winInvite.setUpdateTime(new Date());
      winInvite.setType(RedPackWinInviteTypeEnum.inviteDownOrder);
      winInvite.setIdentifyCode(StringUtil.Md5(RedPackWinInviteTypeEnum.inviteDownOrder.name() + ":" + orderUid));
      redPackWinInviteMapper.insertSelective(winInvite);
   }
   @Override
   @RequestSerializableByKeyService(key = "#orderUid")
   public boolean verifyOrder(Long orderUid, String orderNo, Integer source, Date downTime) {
       boolean satisfy = false;
      // 注册时间
      UserInfoRegister register = userInfoRegisterService.selectByPrimaryKey(orderUid);
      if (register == null)
         return satisfy;
      // 注册48小时 以内:新人
      long registerTime = register.getCreateTime().getTime();
      // 48小时限制
      if (downTime.getTime() < registerTime || downTime.getTime() > registerTime + 1000*60*60*48)
         return satisfy;
      // 是否已奖励
      List<UserSystemCoupon> coupons = userSystemCouponService.getUserCouponBySource(orderUid, UserSystemCoupon.SOURCE_PULL_NEW);
      if (coupons != null && coupons.size() > 0) {
         return satisfy;
      }
      // 是否存在上下级关系
      ThreeSale threeSale = threeSaleSerivce.getByWorkerId(orderUid);
      if (threeSale == null)
         return satisfy;
      Long bossId = threeSale.getBoss().getId();
      if (bossId == null)
         return satisfy;
      // 小于2.1.3版本不增加
      UserActiveLog activeLog = userActiveLogService.getUserLatestActiveInfo(orderUid);
      if (activeLog == null)
         return satisfy;
      if (!VersionUtil.greaterThan_2_1_3("appstore".equalsIgnoreCase(activeLog.getChannel()) ? "ios" : "android",
            activeLog.getVersionCode()))
         return satisfy;
      // 查询订单
      List<CommonOrder> list = commonOrderService.getByOrderNo(orderUid, orderNo);
      if (list == null || list.size() ==0)
         return satisfy;
       // 商品比例限制
       BigDecimal limitRate = new BigDecimal(redPackConfigService.getValueByKey("goods_reate_limit"));
       BigDecimal limitPayMent = new BigDecimal(redPackConfigService.getValueByKey("goods_pay_ment_limit"));
      // 遍历是否存在符合相应商品
      for (CommonOrder commonOrder: list) {
         // 邀请关系之后
         long thirdTime = commonOrder.getThirdCreateTime().getTime();
         if (thirdTime < threeSale.getCreateTime())
            continue;
         // 付款金额限制
         BigDecimal payment = commonOrder.getPayment();
         if (payment == null || payment.compareTo(limitPayMent) < 0)
            continue;
         // 商品佣金比例限制
         BigDecimal eIncome = commonOrder.geteIncome();
         BigDecimal settlement = commonOrder.getSettlement();
         if(eIncome == null || settlement == null) {
            continue;
         }
         BigDecimal rete = MoneyBigDecimalUtil.div(eIncome, settlement);
         if (rete.compareTo(limitRate) >= 0) {
            satisfy = true;
            break;
         }
      }
      return satisfy;
   }
   @Override
   @RequestSerializableByKeyService(key = "#orderUid")
   @Transactional(rollbackFor = Exception.class)
   public void winFreeCoupon(Long orderUid, String orderNo, Integer source, Date downTime) {
      if (orderUid == null || StringUtil.isNullOrEmpty(orderNo)) {
         return;
      }
      // 注册时间
      UserInfoRegister register = userInfoRegisterService.selectByPrimaryKey(orderUid);
      if (register == null)
         return;
      // 注册48小时 以内:新人
      long registerTime = register.getCreateTime().getTime();
      // 48小时限制
      if (downTime.getTime() < registerTime || downTime.getTime() > registerTime + 1000*60*60*48)
         return;
      // 是否已奖励
      List<UserSystemCoupon> coupons = userSystemCouponService.getUserCouponBySource(orderUid, UserSystemCoupon.SOURCE_PULL_NEW);
      if (coupons != null && coupons.size() > 0) {
         return;
      }
      // 查询订单
      List<CommonOrder> list = commonOrderService.getByOrderNo(orderUid, orderNo);
      if (list == null || list.size() ==0) {
         return;
      }
       // 商品比例限制
       BigDecimal limitRate = new BigDecimal(redPackConfigService.getValueByKey("goods_reate_limit"));
       BigDecimal limitPayMent = new BigDecimal(redPackConfigService.getValueByKey("goods_pay_ment_limit"));
       boolean satisfy = false;
      // 遍历是否存在符合相应商品
      for (CommonOrder commonOrder: list) {
         // 付款金额限制
         BigDecimal payment = commonOrder.getPayment();
         if (payment == null || payment.compareTo(limitPayMent) < 0)
            continue;
         // 商品佣金比例限制
         BigDecimal eIncome = commonOrder.geteIncome();
         BigDecimal settlement = commonOrder.getSettlement();
         if(eIncome == null || settlement == null) {
            continue;
         }
         BigDecimal rete = MoneyBigDecimalUtil.div(eIncome, settlement);
         if (rete.compareTo(limitRate) >= 0) {
            satisfy = true;
            break;
         }
      }
      if (!satisfy) {
         return;
      }
      // 赠送购买者一张免单券
      try {
         userSystemCouponService.freeCouponWinBySystem(orderUid, CouponTypeEnum.freeCouponBuy,
               UserSystemCoupon.SOURCE_PULL_NEW, 1, true, 2);
      } catch (UserSystemCouponException e) {
         e.printStackTrace();
      } catch (Exception e) {
         e.printStackTrace();
      }
   }
   @Override
   public List<Long> listWinUid(int start, int count) {
      return redPackWinInviteMapper.listWinUid(start, count);
   }
   @Override
   public List<RedPackWinInvite> listLastMonthByUid(int start, int count, Long uid) {
      return redPackWinInviteMapper.listLastMonthByUid(start, count, uid);
   }
   @Override
   public long countLastMonthByUid(Long uid) {
      Long count = redPackWinInviteMapper.countLastMonthByUid(uid);
      if (count == null)
         count = 0L;
      return count;
   }
   @Override
   @Transactional(rollbackFor = Exception.class)
   public void arriveMoney(Long uid, BigDecimal money, Date date) throws Exception {
      RedPackDetail detail = RedPackDetailFactory.createByMonth(uid, money, date);
      redPackBalanceService.addRedPack(uid, money, detail);
   }
}