From ec60e757d358636dcac1589c44a66f3e276fe58c Mon Sep 17 00:00:00 2001 From: yujian <yujian@163.com> Date: 星期一, 29 六月 2020 14:41:42 +0800 Subject: [PATCH] 拉新 --- fanli/src/main/java/com/yeshi/fanli/service/impl/redpack/RedPackWinInviteServiceImpl.java | 366 +++++++++++++++++++++++++++++++++++++++++++++++---- 1 files changed, 333 insertions(+), 33 deletions(-) diff --git a/fanli/src/main/java/com/yeshi/fanli/service/impl/redpack/RedPackWinInviteServiceImpl.java b/fanli/src/main/java/com/yeshi/fanli/service/impl/redpack/RedPackWinInviteServiceImpl.java index 59fa6f8..eaeedc7 100644 --- a/fanli/src/main/java/com/yeshi/fanli/service/impl/redpack/RedPackWinInviteServiceImpl.java +++ b/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) { @@ -93,7 +111,7 @@ public BigDecimal getRewardMoney(Long uid) { return redPackWinInviteMapper.getRewardMoney(uid); } - + @Override @RequestSerializableByKeyService(key = "#teamUid") @Transactional(rollbackFor = Exception.class) @@ -103,35 +121,35 @@ return; // 灏忎簬2.0.5鐗堟湰涓嶅鍔� - if (!VersionUtil.greaterThan_2_1("appstore".equalsIgnoreCase(activeLog.getChannel()) ? "ios" : "android", + if (!VersionUtil.greaterThan_2_0_5("appstore".equalsIgnoreCase(activeLog.getChannel()) ? "ios" : "android", activeLog.getVersionCode())) return; - + // 鍚屼竴闃熷憳鍙褰曚竴娆� int totalReward = redPackWinInviteMapper.countByUidAndTeamUidAndType(bossId, teamUid, - RedPackWinInviteTypeEnum.oneStageReward.name()); + RedPackWinInviteTypeEnum.zeroStageReward.name()); if (totalReward > 0) return; - + // 鑾峰緱绾㈠寘 RedPackWinInvite winInvite = new RedPackWinInvite(); winInvite.setUid(bossId); winInvite.setTeamUid(teamUid); winInvite.setMoney(new BigDecimal(0)); winInvite.setType(RedPackWinInviteTypeEnum.zeroStageReward); - winInvite.setIdentifyCode(StringUtil.Md5(RedPackWinInviteTypeEnum.oneStageReward.name() + ":" + teamUid)); + winInvite.setIdentifyCode(StringUtil.Md5(RedPackWinInviteTypeEnum.zeroStageReward.name() + ":" + teamUid)); winInvite.setCreateTime(new Date()); winInvite.setUpdateTime(new Date()); redPackWinInviteMapper.insertSelective(winInvite); } - @Override @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)); + ThreeSale threeSale = threeSaleSerivce.getByWorkerIdAndTime(teamUid, + TimeUtil.convertDateToTemp(Constant.RED_PACK_ONLINE_TIME)); if (threeSale == null) return; @@ -142,8 +160,13 @@ return; // 灏忎簬2.0.2鐗堟湰涓嶅鍔� - if (!VersionUtil.greaterThan_2_1("appstore".equalsIgnoreCase(activeLog.getChannel()) ? "ios" : "android", + 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; // 鍚屼竴闃熷憳濂栧姳涓�娆� @@ -196,7 +219,7 @@ dto.setNickName(userInfo.getNickName()); dto.setPortrait(userInfo.getPortrait()); userMoneyMsgNotificationService.teamRedPackRewardMsg(bossId, MsgTypeMoneyTypeEnum.redPackOneStageReward, money, - "闃熷憳锛堝ソ鍙嬶級瀹屾垚绗竴闃舵", new Gson().toJson(dto)); + "绮変笣锛堝ソ鍙嬶級瀹屾垚绗竴闃舵", new Gson().toJson(dto)); } @RequestSerializableByKeyService(key = "#uid") @@ -222,7 +245,8 @@ return; // 楠岃瘉涓婁笅绾у叧绯� - ThreeSale threeSale = threeSaleSerivce.getByWorkerIdAndTime(teamUid, TimeUtil.convertDateToTemp(Constant.RED_PACK_ONLINE_TIME)); + ThreeSale threeSale = threeSaleSerivce.getByWorkerIdAndTime(teamUid, + TimeUtil.convertDateToTemp(Constant.RED_PACK_ONLINE_TIME)); if (threeSale == null || threeSale.getBoss().getId().longValue() != uid.longValue()) return; @@ -252,7 +276,7 @@ * @param orderNo * @param bossId */ - @Transactional + @Transactional(rollbackFor = Exception.class) private void twoStageRewardToBoss(Long bossId, Long teamUid, Date oneStageTime, Integer source, String orderNo) throws Exception { // 绗竴闃舵瀹屾垚涔嬪悗鐨�90澶╁唴 ; 闃熷弸浜х敓鐨勮鍗曚腑锛堣嚜璐�+鍒嗕韩锛夛紝閭�璇蜂汉绱浜х敓鈮�1 鍏冨閲� @@ -294,7 +318,7 @@ dto.setNickName(userInfo.getNickName()); dto.setPortrait(userInfo.getPortrait()); userMoneyMsgNotificationService.teamRedPackRewardMsg(bossId, MsgTypeMoneyTypeEnum.redPackTwoStageReward, money, - "闃熷憳锛堝ソ鍙嬶級瀹屾垚绗簩闃舵", new Gson().toJson(dto)); + "绮変笣锛堝ソ鍙嬶級瀹屾垚绗簩闃舵", new Gson().toJson(dto)); } /** @@ -305,7 +329,7 @@ * @param orderNo * @param bossId */ - @Transactional + @Transactional(rollbackFor = Exception.class) private void threeStageRewardToBoss(Long bossId, Long teamUid, Date twoStageTime, Integer source, String orderNo) throws Exception { // 浜屻�佷笁闃舵涓嶅彲鍚屾湀 @@ -363,28 +387,27 @@ dto.setNickName(userInfo.getNickName()); dto.setPortrait(userInfo.getPortrait()); userMoneyMsgNotificationService.teamRedPackRewardMsg(bossId, MsgTypeMoneyTypeEnum.redPackThreeStageReward, - money, "闃熷憳锛堝ソ鍙嬶級瀹屾垚绗笁闃舵杩炵画[绗�" + monthSpace + "涓湀]", new Gson().toJson(dto)); + 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) + if (userInfo == null) return listVO; - + // 濂栧姳璁板綍 List<RedPackWinInvite> listWin = redPackWinInviteMapper.getWinListByBossIdAndTeamUid(uid, tid); - if (listWin == null || listWin.size() == 0) + if (listWin == null || listWin.size() == 0) return listVO; - + int month = 1; - for (RedPackWinInvite win: listWin) { + 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()))); @@ -394,37 +417,314 @@ 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 ++; + month++; continue; } } return listVO; } - - + @Override public List<RedPackWinInvite> getWinTopListByBossId(int page, int count, Long uid) { - return redPackWinInviteMapper.getWinTopListByBossId(count * (page-1), count, 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; + } + + + @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; + + // 鍟嗗搧浣i噾姣斾緥闄愬埗 + 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; + + // 鍟嗗搧浣i噾姣斾緥闄愬埗 + 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; + + // 鍟嗗搧浣i噾姣斾緥闄愬埗 + 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); + + } + + + } -- Gitblit v1.8.0