From 30d8e227e8d823b6c38c3b9c90ac2df03b63befe Mon Sep 17 00:00:00 2001 From: admin <weikou2014> Date: 星期二, 25 二月 2025 16:41:22 +0800 Subject: [PATCH] 淘宝转链接口更新 --- fanli/src/main/java/com/yeshi/fanli/service/impl/redpack/RedPackWinInviteServiceImpl.java | 1516 +++++++++++++++++++++++++++++----------------------------- 1 files changed, 758 insertions(+), 758 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 6f84731..71b4f51 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 @@ -1,758 +1,758 @@ -package com.yeshi.fanli.service.impl.redpack; - -import java.math.BigDecimal; -import java.util.ArrayList; -import java.util.Date; -import java.util.List; - -import javax.annotation.Resource; - -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; -import org.yeshi.utils.DateUtil; - -import com.google.gson.Gson; -import com.yeshi.fanli.dao.mybatis.redpack.RedPackWinInviteMapper; -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.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.invite.UserInviteMsgNotificationService; -import com.yeshi.fanli.service.inter.user.tb.UserExtraTaoBaoInfoService; -import com.yeshi.fanli.util.Constant; -import org.yeshi.utils.MoneyBigDecimalUtil; -import com.yeshi.fanli.util.StringUtil; -import org.yeshi.utils.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.redpack.RedPackWinProgressVO; - -@Service -public class RedPackWinInviteServiceImpl implements RedPackWinInviteService { - - @Resource - private RedPackWinInviteMapper redPackWinInviteMapper; - - @Resource - private RedPackConfigService redPackConfigService; - - @Resource - private RedPackBalanceService redPackBalanceService; - - @Resource - private CommonOrderService commonOrderService; - - @Resource - private ThreeSaleSerivce threeSaleSerivce; - - @Resource - private UserMoneyMsgNotificationService userMoneyMsgNotificationService; - - @Resource - private UserInfoService userInfoService; - - @Resource - private UserInfoRegisterService userInfoRegisterService; - - @Resource - private UserExtraTaoBaoInfoService userExtraTaoBaoInfoService; - - @Resource - private IntegralTaskRecordService integralTaskRecordService; - - @Resource - private UserActiveLogService userActiveLogService; - - @Resource - private HongBaoV2CountService hongBaoV2CountService; - - @Resource - private CommonOrderGoodsService commonOrderGoodsService; - - @Resource - private UserSystemCouponService userSystemCouponService; - - @Resource - private UserInviteMsgNotificationService userInviteMsgNotificationService; - - - @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); - } - - @Override - @RequestSerializableByKeyService(key = "#teamUid") - @Transactional(rollbackFor = Exception.class) - public void initCreateRedPackWin(Long bossId, Long teamUid) { - UserActiveLog activeLog = userActiveLogService.getUserLatestActiveInfo(bossId); - if (activeLog == null) - return; - - // 灏忎簬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; - - // 鑾峰緱绾㈠寘 - 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()); - 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)); - 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; - - // 鍚屼竴闃熷憳濂栧姳涓�娆� - int totalReward = redPackWinInviteMapper.countByUidAndTeamUidAndType(bossId, teamUid, - RedPackWinInviteTypeEnum.oneStageReward.name()); - if (totalReward > 0) - return; - - // 寤虹珛閭�璇峰叧绯绘椂闂磋秴杩�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; - - // 缁戝畾鐢佃瘽鍙风爜鍜屽井淇� - 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; - - // 濂藉弸浜х敓涓�绗旇繑鍒╄鍗曪紙鑷喘锛変笖 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; - - // 涓嬪崟浜篿d - 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; - } - - // 绗笁闃舵 - 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))); - } - - // 鑾峰緱绾㈠寘璁板綍 - 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; - } - - - @Override - @RequestSerializableByKeyService(key = "#orderUid") - @Transactional(rollbackFor = Exception.class) - public void winRedPackByOrder(Long orderUid, String orderNo, Integer source) { - if (orderUid == null || StringUtil.isNullOrEmpty(orderNo)) { - return; - } - // 楠岃瘉鏄惁鏈鍗� - CommonOrder firstOrder = commonOrderService.getFirstOrder(orderUid); - if (!firstOrder.getOrderNo().equals(orderNo) || firstOrder.getSourceType() != source) - return; - - Date downTime = firstOrder.getThirdCreateTime(); - // 娉ㄥ唽鏃堕棿 - UserInfoRegister register = userInfoRegisterService.selectByPrimaryKey(orderUid); - if (register == null) - return; - long registerTime = register.getCreateTime().getTime(); - // 娉ㄥ唽48灏忔椂鍐呬笅鍗曢檺鍒� - if (downTime.getTime() < registerTime || downTime.getTime() > registerTime + 1000*60*60*48L) - return; - - // 鏄惁瀛樺湪涓婁笅绾у叧绯� - ThreeSale threeSale = threeSaleSerivce.getByWorkerId(orderUid); - if (threeSale == null) - return; - Long bossId = threeSale.getBoss().getId(); - if (bossId == null) - return; - - // 璇ラ個璇锋槸鍚﹀凡娣诲姞 - RedPackWinInvite threeStage = redPackWinInviteMapper.getByUidAndTeamUid(bossId, orderUid); - if (threeStage != 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; - - // 鏌ヨ璁㈠崟 - 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) { - // 璁㈠崟鏈粨绠� - if(commonOrder.getState() != CommonOrder.STATE_JS) - continue; - - // 閭�璇峰叧绯讳箣鍚� - 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.mul(MoneyBigDecimalUtil.div(eIncome, settlement), BigDecimal.valueOf(100)) ; - 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); - - // 娑堟伅鎻愰啋 - UserInfo userInfo = userInfoService.selectByPKey(orderUid); - userInviteMsgNotificationService.pullNewRedPack(bossId, userInfo.getNickName(), userInfo.getPortrait()); - } - - @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; - - // 楠岃瘉鏄惁鏈鍗� - CommonOrder firstOrder = commonOrderService.getFirstOrder(orderUid); - if (!firstOrder.getOrderNo().equals(orderNo) || firstOrder.getSourceType() != source) - 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; - // 璁㈠崟澶辨晥 - if(commonOrder.getState() != CommonOrder.STATE_FK && commonOrder.getState() != CommonOrder.STATE_JS) - 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) { - // 璁㈠崟澶辨晥 - if(commonOrder.getState() != CommonOrder.STATE_FK && commonOrder.getState() != CommonOrder.STATE_JS) - 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; - } - - // 璧犻�佽喘涔拌�呬竴寮犲厤鍗曞埜 - try { - userSystemCouponService.freeCouponWinBySystem(orderUid, CouponTypeEnum.freeCoupon, - UserSystemCoupon.SOURCE_PULL_NEW, 1, true, 2, 1); - } 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); - - } - - - - -} +package com.yeshi.fanli.service.impl.redpack; + +import java.math.BigDecimal; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; + +import javax.annotation.Resource; + +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.yeshi.utils.DateUtil; + +import com.google.gson.Gson; +import com.yeshi.fanli.dao.mybatis.redpack.RedPackWinInviteMapper; +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.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.invite.UserInviteMsgNotificationService; +import com.yeshi.fanli.service.inter.user.tb.UserExtraTaoBaoInfoService; +import com.yeshi.fanli.util.Constant; +import org.yeshi.utils.MoneyBigDecimalUtil; +import com.yeshi.fanli.util.StringUtil; +import org.yeshi.utils.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.redpack.RedPackWinProgressVO; + +@Service +public class RedPackWinInviteServiceImpl implements RedPackWinInviteService { + + @Resource + private RedPackWinInviteMapper redPackWinInviteMapper; + + @Resource + private RedPackConfigService redPackConfigService; + + @Resource + private RedPackBalanceService redPackBalanceService; + + @Resource + private CommonOrderService commonOrderService; + + @Resource + private ThreeSaleSerivce threeSaleSerivce; + + @Resource + private UserMoneyMsgNotificationService userMoneyMsgNotificationService; + + @Resource + private UserInfoService userInfoService; + + @Resource + private UserInfoRegisterService userInfoRegisterService; + + @Resource + private UserExtraTaoBaoInfoService userExtraTaoBaoInfoService; + + @Resource + private IntegralTaskRecordService integralTaskRecordService; + + @Resource + private UserActiveLogService userActiveLogService; + + @Resource + private HongBaoV2CountService hongBaoV2CountService; + + @Resource + private CommonOrderGoodsService commonOrderGoodsService; + + @Resource + private UserSystemCouponService userSystemCouponService; + + @Resource + private UserInviteMsgNotificationService userInviteMsgNotificationService; + + + @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); + } + + @Override + @RequestSerializableByKeyService(key = "#teamUid") + @Transactional(rollbackFor = Exception.class) + public void initCreateRedPackWin(Long bossId, Long teamUid) { + UserActiveLog activeLog = userActiveLogService.getUserLatestActiveInfo(bossId); + if (activeLog == null) + return; + + // 灏忎簬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; + + // 鑾峰緱绾㈠寘 + 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()); + 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)); + 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; + + // 鍚屼竴闃熷憳濂栧姳涓�娆� + int totalReward = redPackWinInviteMapper.countByUidAndTeamUidAndType(bossId, teamUid, + RedPackWinInviteTypeEnum.oneStageReward.name()); + if (totalReward > 0) + return; + + // 寤虹珛閭�璇峰叧绯绘椂闂磋秴杩�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; + + // 缁戝畾鐢佃瘽鍙风爜鍜屽井淇� + 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; + + // 濂藉弸浜х敓涓�绗旇繑鍒╄鍗曪紙鑷喘锛変笖 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; + + // 涓嬪崟浜篿d + 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; + } + + // 绗笁闃舵 + 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))); + } + + // 鑾峰緱绾㈠寘璁板綍 + 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; + } + + + @Override + @RequestSerializableByKeyService(key = "#orderUid") + @Transactional(rollbackFor = Exception.class) + public void winRedPackByOrder(Long orderUid, String orderNo, Integer source) { + if (orderUid == null || StringUtil.isNullOrEmpty(orderNo)) { + return; + } + // 楠岃瘉鏄惁鏈鍗� + CommonOrder firstOrder = commonOrderService.getFirstOrder(orderUid); + if (!firstOrder.getOrderNo().equals(orderNo) || firstOrder.getSourceType() != source) + return; + + Date downTime = firstOrder.getThirdCreateTime(); + // 娉ㄥ唽鏃堕棿 + UserInfoRegister register = userInfoRegisterService.selectByPrimaryKey(orderUid); + if (register == null) + return; + long registerTime = register.getCreateTime().getTime(); + // 娉ㄥ唽48灏忔椂鍐呬笅鍗曢檺鍒� + if (downTime.getTime() < registerTime || downTime.getTime() > registerTime + 1000*60*60*48L) + return; + + // 鏄惁瀛樺湪涓婁笅绾у叧绯� + ThreeSale threeSale = threeSaleSerivce.getByWorkerId(orderUid); + if (threeSale == null) + return; + Long bossId = threeSale.getBoss().getId(); + if (bossId == null) + return; + + // 璇ラ個璇锋槸鍚﹀凡娣诲姞 + RedPackWinInvite threeStage = redPackWinInviteMapper.getByUidAndTeamUid(bossId, orderUid); + if (threeStage != 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; + + // 鏌ヨ璁㈠崟 + 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) { + // 璁㈠崟鏈粨绠� + if(commonOrder.getState() != CommonOrder.STATE_JS) + continue; + + // 閭�璇峰叧绯讳箣鍚� + 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.mul(MoneyBigDecimalUtil.div(eIncome, settlement), BigDecimal.valueOf(100)) ; + 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); + + // 娑堟伅鎻愰啋 + UserInfo userInfo = userInfoService.selectByPKey(orderUid); + userInviteMsgNotificationService.pullNewRedPack(bossId, userInfo.getNickName(), userInfo.getPortrait()); + } + + @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; + + // 楠岃瘉鏄惁鏈鍗� + CommonOrder firstOrder = commonOrderService.getFirstOrder(orderUid); + if (!firstOrder.getOrderNo().equals(orderNo) || firstOrder.getSourceType() != source) + 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; + // 璁㈠崟澶辨晥 + if(commonOrder.getState() != CommonOrder.STATE_FK && commonOrder.getState() != CommonOrder.STATE_JS) + 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) { + // 璁㈠崟澶辨晥 + if(commonOrder.getState() != CommonOrder.STATE_FK && commonOrder.getState() != CommonOrder.STATE_JS) + 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; + } + + // 璧犻�佽喘涔拌�呬竴寮犲厤鍗曞埜 + try { + userSystemCouponService.freeCouponWinBySystem(orderUid, CouponTypeEnum.freeCoupon, + UserSystemCoupon.SOURCE_PULL_NEW, 1, true, 2, 1); + } 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