admin
2020-04-15 3d92fcd729376c584a07d5f23b8e06f81fbcbcde
Merge remote-tracking branch 'origin/div' into div
15个文件已修改
784 ■■■■■ 已修改文件
fanli/src/main/java/com/yeshi/fanli/controller/client/v1/ConfigController.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
fanli/src/main/java/com/yeshi/fanli/controller/client/v2/UserOrderControllerV2.java 47 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
fanli/src/main/java/com/yeshi/fanli/dao/mybatis/money/InviteOrderSubsidyDebtMapper.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
fanli/src/main/java/com/yeshi/fanli/mapping/money/InviteOrderSubsidyDebtMapper.xml 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
fanli/src/main/java/com/yeshi/fanli/service/impl/money/InviteOrderSubsidyDebtServiceImpl.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
fanli/src/main/java/com/yeshi/fanli/service/impl/money/msg/UserMoneyMsgNotificationServiceImpl.java 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
fanli/src/main/java/com/yeshi/fanli/service/impl/order/CommonOrderServiceImpl.java 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
fanli/src/main/java/com/yeshi/fanli/service/impl/user/UserSystemCouponServiceImpl.java 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
fanli/src/main/java/com/yeshi/fanli/service/impl/user/vip/UserVIPPreInfoServiceImpl.java 562 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
fanli/src/main/java/com/yeshi/fanli/service/inter/money/InviteOrderSubsidyDebtService.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
fanli/src/main/java/com/yeshi/fanli/service/inter/money/msg/UserMoneyMsgNotificationService.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
fanli/src/main/java/com/yeshi/fanli/service/inter/user/vip/UserVIPPreInfoService.java 24 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
fanli/src/main/java/com/yeshi/fanli/util/factory/msg/MsgMoneyDetailFactory.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
fanli/src/main/java/com/yeshi/fanli/util/rocketmq/consumer/user/UserVIPMessageListener.java 25 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
fanli/src/main/resource/rocket/consumer.xml 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
fanli/src/main/java/com/yeshi/fanli/controller/client/v1/ConfigController.java
@@ -377,14 +377,14 @@
                // TODO 验证是否是导师
                
                JSONObject inner = new JSONObject();
                inner.put("link", userVipConfigService.getByKey("vip_link"));
                inner.put("link", userVipConfigService.getValueByKey("vip_link"));
                inner.put("ion", "http://img.flqapp.com/resource/vip/icon_vip.png");
                inner.put("title", "免费升级 享会员权益");
                inner.put("btnName", "升级会员");
                if (uid != null) {
                    // 是否导师 TODO
                    if (userVIPInfoService.isVIP(uid)) {
                        inner.put("link", userVipConfigService.getByKey("vip_link"));
                        inner.put("link", userVipConfigService.getValueByKey("vip_link"));
                        inner.put("ion", "http://img.flqapp.com/resource/vip/icon_tearcher.png");
                        inner.put("title", "拿五险与津贴 享导师权益");
                        inner.put("btnName", "升级会员");
fanli/src/main/java/com/yeshi/fanli/controller/client/v2/UserOrderControllerV2.java
@@ -581,6 +581,15 @@
            userLevel = UserLevelEnum.daRen;
        UserLevelEnum upperLevel =  UserLevelEnum.superVIP;
            
        CommonOrder commonOrder1 = hoList.get(0).getCommonOrder();
        Date downTime = commonOrder1.getThirdCreateTime();
        Integer urank = commonOrder1.getUrank();
        UserLevelEnum buyerUserLevel = UserLevelUtil.getByOrderRank(urank);
        boolean direct = false;
        if (hongBaoV2.getType() == HongBaoV2.TYPE_YIJI || hongBaoV2.getType() == HongBaoV2.TYPE_SHARE_YIJI) {
            direct = true;
        }
        BigDecimal upperTotalMoney = new BigDecimal(0);
        List<GoodsRebateVO> voList = new ArrayList<>();
        for (HongBaoOrder hongBaoOrder : hoList) {
@@ -604,20 +613,20 @@
                payment = new BigDecimal(0);
            goodsVO.setActualPay("¥" + payment.setScale(2, BigDecimal.ROUND_DOWN));
            
            BigDecimal fanli = hongBaoOrder.getHongBaoV2().getMoney();
            // 基础佣金
            BigDecimal commission = orderHongBaoMoneyComputeService.computeBaseFanliMoney(commonOrder);
            if (type == 3) { // 奖金
                goodsVO.setBonus("¥" + hongBaoOrder.getHongBaoV2().getMoney() +"");
            } else { // 佣金
                goodsVO.setCommision("¥" +commission);
            }
            // 平台补贴
            BigDecimal vipFanli = hongBaoOrder.getHongBaoV2().getMoney();
            goodsVO.setSubsidy("¥" + vipFanli.subtract(commission).setScale(2, BigDecimal.ROUND_DOWN));
            goodsVO.setCommision("¥" +commission.setScale(2, BigDecimal.ROUND_DOWN));
            // 平台补贴  = 返利 - 基础佣金
            goodsVO.setSubsidy("¥" + fanli.subtract(commission).setScale(2, BigDecimal.ROUND_DOWN));
            //  达人补贴
            if (userLevel != UserLevelEnum.daRen) {
                BigDecimal darenFanli = orderHongBaoMoneyComputeService.computeFanliMoney(commonOrder, UserLevelEnum.daRen);
                goodsVO.setOriginSubsidy("¥" + darenFanli.subtract(commission).setScale(2, BigDecimal.ROUND_DOWN) + "");
            }
            if (type == 3) { // 奖金
                goodsVO.setBonus("¥" + fanli.setScale(2, BigDecimal.ROUND_DOWN) +"");
            }
            
            voList.add(goodsVO);
@@ -626,11 +635,11 @@
                upperTotalMoney = upperTotalMoney.add(orderHongBaoMoneyComputeService.computeFanliMoney(commonOrder, upperLevel));
            } else if (type == 2) {
                upperTotalMoney = upperTotalMoney.add(orderHongBaoMoneyComputeService.computeShareMoney(commonOrder, upperLevel));
            } else if (type == 3) {
                upperTotalMoney = upperTotalMoney.add(hongBao);
            }
        }
            
        CommonOrder commonOrder = hoList.get(0).getCommonOrder();
        Date downTime = commonOrder.getThirdCreateTime();
        
        // 团队补贴
        if (type == 3) {
@@ -639,13 +648,7 @@
            InviteOrderSubsidy inviteOrderSubsidy = inviteOrderSubsidyServiceV2.getByOrderNoAndType(uid, orderNo, sourceType);
            if (inviteOrderSubsidy != null) {
                teamSubsidy = inviteOrderSubsidy.getMoney();
                Integer urank = commonOrder.getUrank();
                UserLevelEnum buyerUserLevel = UserLevelUtil.getByOrderRank(urank);
                boolean direct = false;
                if (hongBaoV2.getType() == HongBaoV2.TYPE_YIJI || hongBaoV2.getType() == HongBaoV2.TYPE_SHARE_YIJI) {
                    direct = true;
                }
                // 计算原比例
                BigDecimal originRate = orderHongBaoMoneyComputeService.getTeamSubsidyRate(downTime,buyerUserLevel, userLevel, direct);
                
                // 计算达人补贴
@@ -655,12 +658,13 @@
                    lowerSubsidy = MoneyBigDecimalUtil.div(teamSubsidy.multiply(daRenRate), originRate);
                }
                
                if (userLevel != UserLevelEnum.superVIP && userLevel != UserLevelEnum.superVIP) {
                // 计算超级会员补贴
                if (userLevel != UserLevelEnum.superVIP && userLevel != UserLevelEnum.tearcher) {
                    BigDecimal vipRate = orderHongBaoMoneyComputeService.getTeamSubsidyRate(downTime,    buyerUserLevel, 
                            UserLevelEnum.superVIP, direct);
                    upperTotalMoney = upperTotalMoney.add(MoneyBigDecimalUtil.div(teamSubsidy.multiply(vipRate), originRate));
                    System.out.println(upperTotalMoney);
                }
            } else {
                teamSubsidy = BigDecimal.valueOf(0.00);
                lowerSubsidy =  BigDecimal.valueOf(0.00);
@@ -687,9 +691,8 @@
            orderRebateVO.setUserLevel(userLevel.name());
        }
        
        // 上级返利
        // 超级会员返利
        if (upperLevel != null) {
            upperTotalMoney = upperTotalMoney.add(hongBao);
            orderRebateVO.setUpperFanLi("¥" + upperTotalMoney);
            orderRebateVO.setJumpLink(upperLevel.getDetailLink());
        }
fanli/src/main/java/com/yeshi/fanli/dao/mybatis/money/InviteOrderSubsidyDebtMapper.java
@@ -47,5 +47,15 @@
     * @return
     */
    BigDecimal sumLeftMoneyByUid(@Param("uid")Long uid,@Param("maxEstimatePayTime")Date maxEstimatePayTime);
    /**
     * 计算欠款金额(补贴ID)
     *
     * @param uid
     * @return
     */
    InviteOrderSubsidyDebt getBySourceId(@Param("sourceId")Long sourceId);
}
fanli/src/main/java/com/yeshi/fanli/mapping/money/InviteOrderSubsidyDebtMapper.xml
@@ -54,6 +54,13 @@
        yeshi_ec_invite_order_subsidy_debt where sd_uid
        = #{uid} and #{maxEstimatePayTime}>=sd_estimate_pay_time
    </select>
    <select id="getBySourceId" resultMap="BaseResultMap">
        select * from yeshi_ec_invite_order_subsidy_debt
        where sd_source_id = #{sourceId}
        Limit 1
    </select>
    <delete id="deleteByPrimaryKey" parameterType="java.lang.Long">delete from
        yeshi_ec_invite_order_subsidy_debt where sd_id = #{id,jdbcType=BIGINT}
    </delete>
fanli/src/main/java/com/yeshi/fanli/service/impl/money/InviteOrderSubsidyDebtServiceImpl.java
@@ -118,5 +118,11 @@
            money = new BigDecimal(0);
        return money;
    }
    @Override
    public InviteOrderSubsidyDebt getBySourceId(Long sourceId) {
        return inviteOrderSubsidyDebtMapper.getBySourceId(sourceId);
    }
}
fanli/src/main/java/com/yeshi/fanli/service/impl/money/msg/UserMoneyMsgNotificationServiceImpl.java
@@ -278,8 +278,20 @@
    @Override
    public void teamReceive(Long uid, BigDecimal money, BigDecimal balance, Date receivedDate) {
        MsgMoneyDetail detail = MsgMoneyDetailFactory.createTeamReceivedMsg(uid, money, balance, receivedDate);
    public void teamReceive(Long uid, BigDecimal money, BigDecimal subsidy, BigDecimal balance, Date receivedDate) {
        BigDecimal totalMoney = new BigDecimal(0);
        if (money != null) {
            totalMoney = totalMoney.add(money);
        }
        if (subsidy != null) {
            totalMoney = totalMoney.add(subsidy);
        }
        if (totalMoney.compareTo(new BigDecimal(0)) <= 0) {
            return;
        }
        MsgMoneyDetail detail = MsgMoneyDetailFactory.createTeamReceivedMsg(uid, totalMoney, balance, receivedDate, "团队收益");
        try {
            msgMoneyDetailService.addMsgMoneyDetail(detail);
        } catch (MsgMoneyDetailException e) {
@@ -287,5 +299,15 @@
        }
    }
    @Override
    public void teamDividend(Long uid, BigDecimal money, BigDecimal balance, Date receivedDate) {
        MsgMoneyDetail detail = MsgMoneyDetailFactory.createTeamReceivedMsg(uid, money, balance, receivedDate, "团队分红");
        try {
            msgMoneyDetailService.addMsgMoneyDetail(detail);
        } catch (MsgMoneyDetailException e) {
            e.printStackTrace();
        }
    }
}
fanli/src/main/java/com/yeshi/fanli/service/impl/order/CommonOrderServiceImpl.java
@@ -36,6 +36,7 @@
import com.yeshi.fanli.entity.jd.JDGoods;
import com.yeshi.fanli.entity.jd.JDOrder;
import com.yeshi.fanli.entity.jd.JDOrderItem;
import com.yeshi.fanli.entity.money.InviteOrderSubsidyDebt;
import com.yeshi.fanli.entity.order.CommonOrder;
import com.yeshi.fanli.entity.order.CommonOrderGoods;
import com.yeshi.fanli.entity.order.CommonOrderTradeIdMap;
@@ -57,6 +58,7 @@
import com.yeshi.fanli.service.inter.config.ConfigService;
import com.yeshi.fanli.service.inter.config.SystemCouponService;
import com.yeshi.fanli.service.inter.goods.CommonGoodsService;
import com.yeshi.fanli.service.inter.money.InviteOrderSubsidyDebtService;
import com.yeshi.fanli.service.inter.order.CommonOrderService;
import com.yeshi.fanli.service.inter.order.HongBaoOrderService;
import com.yeshi.fanli.service.inter.order.HongBaoV2Service;
@@ -133,6 +135,9 @@
    @Resource
    private InviteOrderSubsidyService inviteOrderSubsidyService;
    @Resource
    private InviteOrderSubsidyDebtService inviteOrderSubsidyDebtService;
    @Resource
    private UserVIPInfoService userVIPInfoService;
@@ -2062,6 +2067,21 @@
                order.setOrderOrigin("3");
                order.setHongBaoTypePic(CommonOrder.TYPE_INVITE);
                signList.add(CommonOrder.TYPE_INVITE);
                // 红包加上补贴金额
                InviteOrderSubsidy orderSubsidy = inviteOrderSubsidyService.getByOrderNoAndType(uid, orderNo, sourceType);
                if (orderSubsidy != null && orderSubsidy.getMoney() != null) {
                    BigDecimal subsidyMoney = orderSubsidy.getMoney();
                    // 维权金额
                    InviteOrderSubsidyDebt subsidyDebt = inviteOrderSubsidyDebtService.getBySourceId(orderSubsidy.getId());
                    if (subsidyDebt != null && subsidyDebt.getOriginMoney() != null) {
                        subsidyMoney = subsidyMoney.subtract(subsidyDebt.getOriginMoney());
                    }
                    //  最终补贴
                    if (subsidyMoney.compareTo(new BigDecimal(0)) > 0) {
                        hongBao = hongBao.add(subsidyMoney);
                    }
                }
            } 
            order.setSignList(signList);
@@ -2104,9 +2124,8 @@
            stateMap.put("content", stateContent);
            stateMap.put("fontColor", stateFontColor);
            order.setAccountState(stateMap);
            hongbaoInfo = hongBaoState_Str + hongbaoInfo;
            Map<String, String> hongBaoMap = new HashMap<String, String>();
            hongBaoMap.put("content", hongbaoInfo + " ¥" + hongBao.setScale(2, BigDecimal.ROUND_DOWN).toString());
            hongBaoMap.put("fontColor", hongbaoInfoFontColor);
fanli/src/main/java/com/yeshi/fanli/service/impl/user/UserSystemCouponServiceImpl.java
@@ -1060,7 +1060,22 @@
            couponRecord.setUpdateTime(date);
            userSystemCouponRecordService.insertSelective(couponRecord);
            // 消息推送
            int goodsCount = 0;
            String orderId = order.getOrderId();
            Integer orderType = order.getOrderType();
            List<CommonOrder> orderList = commonOrderService.listBySourceTypeAndOrderId(orderType, orderId);
            if (orderList != null && orderList.size() > 0) {
                for (CommonOrder co : orderList) {
                    goodsCount += co.getCount();
                }
            }
            // 资金消息
            UserInfo userInfo = userInfoService.selectByPKey(uid);
            userMoneyMsgNotificationService.rewardCounponReceived(uid, orderId, orderType, goodsCount,
                    money, userInfo.getMyHongBao(), order.getThirdCreateTime());
            // 券使用成功消息
            try {
                userOtherMsgNotificationService.rewardCouponEndMsg(uid, userSystemCoupon.getSource(), 1, "使用成功");
            } catch (Exception e) {
fanli/src/main/java/com/yeshi/fanli/service/impl/user/vip/UserVIPPreInfoServiceImpl.java
@@ -9,6 +9,7 @@
import javax.annotation.Resource;
import org.springframework.context.annotation.Lazy;
import org.springframework.core.task.TaskExecutor;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.yeshi.utils.DateUtil;
@@ -99,6 +100,10 @@
    
    @Resource
    private UserLevelUpgradedNotifyService userLevelUpgradedNotifyService;
    @Resource(name = "taskExecutor")
    private TaskExecutor executor;
    @Override
    public void addUserVIPPreInfo(UserVIPPreInfo info) throws UserVIPPreInfoException {
@@ -158,69 +163,179 @@
        return null;
    }
    @Override
    @RequestSerializableByKeyService(key = "#uid")
    @Transactional(rollbackFor = Exception.class)
    public void upgradeVipByFanLiOrder(Long uid) {
        UserVIPPreInfo latest = getLatestProcessInfo(uid);
        if (latest != null && latest.getProcess() == UserVIPPreInfo.PROCESS_2) {
            return;
        }
        if (latest == null) {
            String inviteCode = userInfoExtraService.getInviteCodeByUid(uid);
            if (StringUtil.isNullOrEmpty(inviteCode)) {
                return; //未激活邀请码
            }
        }
        // 自购订单到账
        long doneZiGou = hongBaoV2CountService.counOrderByUidAndOrderType(uid, Constant.VIP_ORDER_PAY, HongBaoV2.TYPE_ZIGOU);
        // 高级会员限制条件
        long limitZiGou7 = 0;
        String zigou7 = userVipConfigService.getValueByKey("vip_pre_7_zigou_order_count");
        if (!StringUtil.isNullOrEmpty(zigou7)) {
            limitZiGou7 = Long.parseLong(zigou7);
        }
        // 验证是否满足升级高级会员
        if (doneZiGou >= limitZiGou7) {
            twoProcess(uid, limitZiGou7, null, Constant.TYPE_REBATE);
            return;
        }
        // 已经成为普通会员
        if (latest != null && latest.getProcess() == UserVIPPreInfo.PROCESS_1) {
            return;
        }
        // 普通会员条件
        long limitZiGou3 = 0;
        String zigou3 = userVipConfigService.getValueByKey("vip_pre_3_zigou_order_count");
        if (!StringUtil.isNullOrEmpty(zigou3)) {
            limitZiGou3 = Long.parseLong(zigou3);
        }
        if (doneZiGou >= limitZiGou3) {
            oneProcess(uid, limitZiGou3, null, Constant.TYPE_REBATE);
        }
    }
    @Override
    public void verifyVipPreInfo(Long uid, boolean inviteSuccess) {
        if (uid == null || uid <= 0)
    @RequestSerializableByKeyService(key = "#uid")
    @Transactional(rollbackFor = Exception.class)
    public void upgradeVipByShareOrder(Long uid) {
        UserVIPPreInfo latest = getLatestProcessInfo(uid);
        if (latest != null && latest.getProcess() == UserVIPPreInfo.PROCESS_2) {
            return;
        verifyCondition(uid);
        // 验证上级
        if (inviteSuccess) {
            UserInfo boss = threeSaleSerivce.getBoss(uid);
            if (boss != null) {
                verifyVipPreInfoBoss(boss.getId());
        }
        if (latest == null) {
            String inviteCode = userInfoExtraService.getInviteCodeByUid(uid);
            if (StringUtil.isNullOrEmpty(inviteCode)) {
                return; //未激活邀请码
            }
        }
        // 分享订单已到账
        long doneShare = hongBaoV2CountService.counOrderByUidAndOrderType(uid, Constant.VIP_ORDER_PAY,
                HongBaoV2.TYPE_SHARE_GOODS);
        // 高级会员限制条件
        long limitShare7 = 0;
        String share7 = userVipConfigService.getValueByKey("vip_pre_7_share_order_count");
        if (!StringUtil.isNullOrEmpty(share7)) {
            limitShare7 = Long.parseLong(share7);
        }
        // 验证是否满足升级高级会员
        if (doneShare >= limitShare7) {
            twoProcess(uid, limitShare7, null, Constant.TYPE_SHAER);
            return;
        }
        // 已经成为普通会员
        if (latest != null && latest.getProcess() == UserVIPPreInfo.PROCESS_1) {
            return;
        }
        // 普通会员条件
        long limitShare3 = 0;
        String share3 = userVipConfigService.getValueByKey("vip_pre_3_share_order_count");
        if (!StringUtil.isNullOrEmpty(share3)) {
            limitShare3 = Long.parseLong(share3);
        }
        if (doneShare >= limitShare3) {
            oneProcess(uid, limitShare3, null, Constant.TYPE_SHAER);
        }
    }
    @Override
    @RequestSerializableByKeyService(key = "#tid")
    @Transactional(rollbackFor = Exception.class)
    public void upgradeVipByTeamNum(Long tid) {
        UserInfo boss = threeSaleSerivce.getBoss(tid);
        if (boss == null) {
            return;
        }
        Long bossId = boss.getId();
        // 验证上上级 -间接粉丝是否满足
        executor.execute(new Runnable() {
            @Override
            public void run() {
                upgradeVipByTeamNum(bossId);
            }
        });
        UserVIPPreInfo latest = getLatestProcessInfo(bossId);
        if (latest != null && latest.getProcess() == UserVIPPreInfo.PROCESS_2) {
            return;
        }
        // 有效粉丝
        int doneFirst = 0;
        int doneSecond = 0;
        UserInviteValidNum userInviteValidNum = userInviteValidNumService.selectByPrimaryKey(bossId);
        if (userInviteValidNum != null) {
            doneFirst = userInviteValidNum.getNumFirst() == null ? 0 : userInviteValidNum.getNumFirst();
            doneSecond = userInviteValidNum.getNumSecond() == null ? 0 : userInviteValidNum.getNumSecond();
        }
        long limitFirst7 = 0;
        String first7 = userVipConfigService.getValueByKey("vip_pre_7_first_level_team_count");
        if (!StringUtil.isNullOrEmpty(first7)) {
            limitFirst7 = Long.parseLong(first7);
        }
        long limitSecond7 = 0;
        String second7 = userVipConfigService.getValueByKey("vip_pre_7_second_level_team_count");
        if (!StringUtil.isNullOrEmpty(second7)) {
            limitSecond7 = Long.parseLong(second7);
        }
        // 验证是否满足升级高级会员
        if (doneFirst >= limitFirst7 && doneSecond >= limitSecond7) {
            twoProcess(bossId, limitFirst7, limitSecond7, null);
            return;
        }
        // 已经成为普通会员
        if (latest != null && latest.getProcess() == UserVIPPreInfo.PROCESS_1) {
            return;
        }
        // 普通会员 条件
        long limitFirst3 = 0;
        String first = userVipConfigService.getValueByKey("vip_pre_3_first_level_team_count");
        if (!StringUtil.isNullOrEmpty(first)) {
            limitFirst3 = Long.parseLong(first);
        }
        long limitSecond3 = 0;
        String second = userVipConfigService.getValueByKey("vip_pre_3_second_level_team_count");
        if (!StringUtil.isNullOrEmpty(second)) {
            limitSecond3 = Long.parseLong(second);
        }
        if (doneFirst >= limitFirst3 && doneSecond >= limitSecond3) {
            oneProcess(bossId, limitFirst3, limitSecond3, null);
        }
    }
    // 上级验证
    private void verifyVipPreInfoBoss(Long uid) {
        if (uid == null || uid <= 0)
            return;
        verifyCondition(uid);
    }
    private void verifyCondition(Long uid) {
        try {
            // 验证二阶段
            UserVIPPreInfo oldInfo = userVIPPreInfoMapper.selectByUidAndProcess(uid, UserVIPPreInfo.PROCESS_2);
            if (oldInfo != null) {
                return;
            }
            // 自购订单
            long doneZiGou = hongBaoV2CountService.counOrderByUidAndOrderType(uid, Constant.VIP_ORDER_PAY,
                    HongBaoV2.TYPE_ZIGOU);
            // 分享订单
            long doneShare = hongBaoV2CountService.counOrderByUidAndOrderType(uid, Constant.VIP_ORDER_PAY,
                    HongBaoV2.TYPE_SHARE_GOODS);
            // 有效粉丝
            int doneFirst = 0;
            int doneSecond = 0;
            UserInviteValidNum userInviteValidNum = userInviteValidNumService.selectByPrimaryKey(uid);
            if (userInviteValidNum != null) {
                doneFirst = userInviteValidNum.getNumFirst() == null ? 0 : userInviteValidNum.getNumFirst();
                doneSecond = userInviteValidNum.getNumSecond() == null ? 0 : userInviteValidNum.getNumSecond();
            }
            // 一阶段
            boolean process1 = oneProcess(uid, doneZiGou, doneShare, doneFirst, doneSecond);
            if (!process1) {
                return;
            }
            // 二阶段
            twoProcess(uid, doneZiGou, doneShare, doneFirst, doneSecond);
        } catch (Exception e) {
            LogHelper.errorDetailInfo(e);
        }
    }
    /**
     * 一阶段
     * 
@@ -231,120 +346,55 @@
     * @param secondTeam
     */
    @Transactional(rollbackFor = Exception.class)
    private boolean oneProcess(Long uid, long countZiGou, long countShare, long firstTeam, long secondTeam) throws Exception{
        UserVIPPreInfo oldInfo = userVIPPreInfoMapper.selectByUidAndProcess(uid, UserVIPPreInfo.PROCESS_1);
        if (oldInfo != null) {
            return true;
        }
        long limitZiGou = 0;
        String zigou = userVipConfigService.getValueByKey("vip_pre_3_zigou_order_count");
        if (!StringUtil.isNullOrEmpty(zigou)) {
            limitZiGou = Long.parseLong(zigou);
        }
        long limitShare = 0;
        String share = userVipConfigService.getValueByKey("vip_pre_3_share_order_count");
        if (!StringUtil.isNullOrEmpty(share)) {
            limitShare = Long.parseLong(share);
        }
        long limitFirst = 0;
        String first = userVipConfigService.getValueByKey("vip_pre_3_first_level_team_count");
        if (!StringUtil.isNullOrEmpty(first)) {
            limitFirst = Long.parseLong(first);
        }
        long limitSecond = 0;
        String second = userVipConfigService.getValueByKey("vip_pre_3_second_level_team_count");
        if (!StringUtil.isNullOrEmpty(second)) {
            limitSecond = Long.parseLong(second);
        }
        String item = "";
        Integer type = null;
        long targetNum1 = 0L;
        Long targetNum2 = 0L;
        boolean process = false;
        if (countZiGou >= limitZiGou) {
            process = true;
            type = Constant.TYPE_REBATE;
            targetNum1 = limitZiGou;
            item = "返利订单";
        } else if (countShare >= limitShare) {
            process = true;
            type = Constant.TYPE_SHAER;
            targetNum1 = limitShare;
            item = "分享订单";
        } else if (firstTeam >= limitFirst && secondTeam >= limitSecond) {
            process = true;
            targetNum1 = limitFirst;
            targetNum2 = limitSecond;
            item = "邀请粉丝";
        }
        if (process) {
            try {
                Date upgradeTime = new Date();
                UserVIPPreInfo info = new UserVIPPreInfo();
                info.setUid(uid);
                info.setProcess(UserVIPPreInfo.PROCESS_1);
                info.setCreateTime(upgradeTime);
                info.setUpdateTime(upgradeTime);
                addUserVIPPreInfo(info);
                // 升级消息
                Date registerTime = new Date(1577836800000L);
                UserInfoRegister userInfoRegister = userInfoRegisterService.selectByPrimaryKey(uid);
                if (userInfoRegister != null && userInfoRegister.getCreateTime() != null) {
                    registerTime = userInfoRegister.getCreateTime();
                }
                int daysBetween = DateUtil.daysBetween(registerTime, new Date());
                userAccountMsgNotificationService.vipPreUpgrade(uid, "快省达人", "普通会员", daysBetween, targetNum1, targetNum2, type);
                // 升级弹框提示
                UserLevelUpgradedNotify notify = new UserLevelUpgradedNotify();
                notify.setUid(uid);
                notify.setFromLevel(UserLevelEnum.daRen);
                notify.setToLevel(UserLevelEnum.normalVIP);
                notify.setValid(true);
                notify.setCreateTime(new Date());
                userLevelUpgradedNotifyService.addUserLevelUpgradedNotify(notify);
                // 赠送金币
                String goldcoin = userVipConfigService.getValueByKey("vip_pre_3_gift_goldcoin");
                if (!StringUtil.isNullOrEmpty(goldcoin)) {
                    int goldcoinNum = Integer.parseInt(goldcoin);
                    // 添加金币明细
                    IntegralDetail detail = new IntegralDetail();
                    detail.setTitle("升级VIP福利");
                    detail.setUid(uid);
                    detail.setMoney(Integer.parseInt(goldcoin));
                    detail.setCreateTime(upgradeTime);
                    detail.setUniqueKey("VIP-3-" + uid);
                    integralDetailService.insertSelective(detail);
                    // 添加金币
                    userInfoExtraService.addGoldCoinByUid(uid, Integer.parseInt(goldcoin));
                    // 消息
                    UserInfoExtra userInfoExtra = userInfoExtraService.getUserInfoExtra(uid);
                    userOtherMsgNotificationService.goldCoinSystemGiveMsg(uid, goldcoinNum, userInfoExtra.getGoldCoin());
                }
                // 是否存在下级脱离期限 -更新不脱离
                userInviteSeparateService.updateInvalidByBossId(uid);
                // 提醒上级
                remindBoss(uid, "普通会员", item, upgradeTime, true);
            } catch (UserVIPPreInfoException e) {
                e.printStackTrace();
    private void oneProcess(Long uid, long limit1, Long limit2, Integer type) {
        try {
            String item = null;
            if (type == null) {
                item = "邀请粉丝";
            } else if (type == Constant.TYPE_REBATE) {
                item = "返利订单";
            } else {
                item = "分享订单";
            }
            Date upgradeTime = new Date();
            UserVIPPreInfo info = new UserVIPPreInfo();
            info.setUid(uid);
            info.setProcess(UserVIPPreInfo.PROCESS_1);
            info.setCreateTime(upgradeTime);
            info.setUpdateTime(upgradeTime);
            addUserVIPPreInfo(info);
            // 升级消息
            Date registerTime = new Date(1577836800000L);
            UserInfoRegister userInfoRegister = userInfoRegisterService.selectByPrimaryKey(uid);
            if (userInfoRegister != null && userInfoRegister.getCreateTime() != null) {
                registerTime = userInfoRegister.getCreateTime();
            }
            int daysBetween = DateUtil.daysBetween(registerTime, new Date());
            userAccountMsgNotificationService.vipPreUpgrade(uid, "快省达人", "普通会员", daysBetween, limit1, limit2, type);
            // 升级弹框提示
            UserLevelUpgradedNotify notify = new UserLevelUpgradedNotify();
            notify.setUid(uid);
            notify.setFromLevel(UserLevelEnum.daRen);
            notify.setToLevel(UserLevelEnum.normalVIP);
            notify.setValid(true);
            notify.setCreateTime(new Date());
            userLevelUpgradedNotifyService.addUserLevelUpgradedNotify(notify);
            // 金币奖励
            goldcoinReward(uid);
            // 是否存在下级脱离期限 -更新不脱离
            userInviteSeparateService.updateInvalidByBossId(uid);
            // 提醒上级
            remindBoss(uid, "普通会员", item, upgradeTime, true);
        } catch (Exception e) {
           e.printStackTrace();
        }
        return process;
    }
    
    
    /**
@@ -357,97 +407,98 @@
     * @param secondTeam
     */
    @Transactional(rollbackFor = Exception.class)
    private boolean twoProcess(Long uid, long countZiGou, long countShare, long firstTeam, long secondTeam) {
        long limitZiGou = 0;
        String zigou = userVipConfigService.getValueByKey("vip_pre_7_zigou_order_count");
        if (!StringUtil.isNullOrEmpty(zigou)) {
            limitZiGou = Long.parseLong(zigou);
        }
        long limitShare = 0;
        String share = userVipConfigService.getValueByKey("vip_pre_7_share_order_count");
        if (!StringUtil.isNullOrEmpty(share)) {
            limitShare = Long.parseLong(share);
        }
        long limitFirst = 0;
        String first = userVipConfigService.getValueByKey("vip_pre_7_first_level_team_count");
        if (!StringUtil.isNullOrEmpty(first)) {
            limitFirst = Long.parseLong(first);
        }
        long limitSecond = 0;
        String second = userVipConfigService.getValueByKey("vip_pre_7_second_level_team_count");
        if (!StringUtil.isNullOrEmpty(second)) {
            limitSecond = Long.parseLong(second);
        }
        Integer type = null;
        long targetNum1 = 0L;
        Long targetNum2 = 0L;
        String item = "";
        boolean process = false;
        if (countZiGou >= limitZiGou) {
            process = true;
            targetNum1 = limitZiGou;
            type = Constant.TYPE_REBATE;
            item = "返利订单";
        } else if (countShare >= limitShare) {
            process = true;
            targetNum1 = limitShare;
            type = Constant.TYPE_SHAER;
            item = "分享订单";
        } else if (firstTeam >= limitFirst && secondTeam >= limitSecond) {
            process = true;
            targetNum1 = limitFirst;
            targetNum2 = limitSecond;
            item = "邀请粉丝";
        }
        if (process) {
            try {
                Date upgradeTime = new Date();
                UserVIPPreInfo info = new UserVIPPreInfo();
                info.setUid(uid);
                info.setProcess(UserVIPPreInfo.PROCESS_2);
                info.setCreateTime(upgradeTime);
                info.setUpdateTime(upgradeTime);
                addUserVIPPreInfo(info);
                // 升级弹框提示
                UserLevelUpgradedNotify notify = new UserLevelUpgradedNotify();
                notify.setUid(uid);
                notify.setFromLevel(UserLevelEnum.normalVIP);
                notify.setToLevel(UserLevelEnum.highVIP);
                notify.setValid(true);
                notify.setCreateTime(new Date());
                userLevelUpgradedNotifyService.addUserLevelUpgradedNotify(notify);
                // 升级消息
                UserVIPPreInfo pre1 = userVIPPreInfoMapper.selectByUidAndProcess(uid, UserVIPPreInfo.PROCESS_1);
                int daysBetween = DateUtil.daysBetween(pre1.getCreateTime(), upgradeTime);
                userAccountMsgNotificationService.vipPreUpgrade(uid, "普通会员", "高级会员", daysBetween, targetNum1, targetNum2, type);
                // 赠送奖励券
                String rewardCoupon = userVipConfigService.getValueByKey("vip_pre_7_gift_reward_coupon");
                if (!StringUtil.isNullOrEmpty(rewardCoupon)) {
                    int num = Integer.parseInt(rewardCoupon);
                    BigDecimal percent = new BigDecimal(configService.get(ConfigKeyEnum.exchangeRebatePercent.getKey()));
                    userSystemCouponService.rewardCouponWin(uid, UserSystemCoupon.SOURCE_SYSTEM_PUSH, num, true, percent);
                }
                // 提醒上级
                remindBoss(uid, "高级会员", item, upgradeTime, false);
            } catch (Exception e) {
                e.printStackTrace();
                LogHelper.error(e);
    private void twoProcess(Long uid, long limit1, Long limit2, Integer type) {
        try {
            String item = null;
            if (type == null) {
                item = "邀请粉丝";
            } else if (type == Constant.TYPE_REBATE) {
                item = "返利订单";
            } else {
                item = "分享订单";
            }
            Date upgradeTime = new Date();
            UserVIPPreInfo info = new UserVIPPreInfo();
            info.setUid(uid);
            info.setProcess(UserVIPPreInfo.PROCESS_2);
            info.setCreateTime(upgradeTime);
            info.setUpdateTime(upgradeTime);
            addUserVIPPreInfo(info);
            // 升级弹框提示
            UserLevelUpgradedNotify notify = new UserLevelUpgradedNotify();
            notify.setUid(uid);
            notify.setFromLevel(UserLevelEnum.normalVIP);
            notify.setToLevel(UserLevelEnum.highVIP);
            notify.setValid(true);
            notify.setCreateTime(new Date());
            userLevelUpgradedNotifyService.addUserLevelUpgradedNotify(notify);
            // 升级福利-赠送奖励券
            String rewardCoupon = userVipConfigService.getValueByKey("vip_pre_7_gift_reward_coupon");
            if (!StringUtil.isNullOrEmpty(rewardCoupon)) {
                int num = Integer.parseInt(rewardCoupon);
                BigDecimal percent = new BigDecimal(configService.get(ConfigKeyEnum.exchangeRebatePercent.getKey()));
                userSystemCouponService.rewardCouponWin(uid, UserSystemCoupon.SOURCE_SYSTEM_PUSH, num, true, percent);
            }
            // 升级消息
            int daysBetween = 0;
            boolean divorced = false;
            String beforeName = "快省达人";
            UserVIPPreInfo pre1 = userVIPPreInfoMapper.selectByUidAndProcess(uid, UserVIPPreInfo.PROCESS_1);
            if (pre1 != null) {
                beforeName = "普通会员";
                daysBetween = DateUtil.daysBetween(pre1.getCreateTime(), upgradeTime);
            } else {
                Date registerTime = new Date(1577836800000L);
                UserInfoRegister userInfoRegister = userInfoRegisterService.selectByPrimaryKey(uid);
                if (userInfoRegister != null && userInfoRegister.getCreateTime() != null) {
                    registerTime = userInfoRegister.getCreateTime();
                }
                daysBetween = DateUtil.daysBetween(registerTime, upgradeTime);
                // 金币奖励 (直接升级高级会员补齐一级奖励)
                goldcoinReward(uid);
                // 需要发送脱离信息
                divorced = true;
            }
            userAccountMsgNotificationService.vipPreUpgrade(uid, beforeName, "高级会员", daysBetween, limit1, limit2, type);
            // 提醒上级
            remindBoss(uid, "高级会员", item, upgradeTime, divorced);
        } catch (Exception e) {
            e.printStackTrace();
            LogHelper.error(e);
        }
        return process;
    }
    
    /**
     * 升级奖励金币
     * @param uid
     */
    private void goldcoinReward(Long uid) {
        String goldcoin = userVipConfigService.getValueByKey("vip_pre_3_gift_goldcoin");
        if (!StringUtil.isNullOrEmpty(goldcoin)) {
            int goldcoinNum = Integer.parseInt(goldcoin);
            // 添加金币明细
            IntegralDetail detail = new IntegralDetail();
            detail.setTitle("升级VIP福利");
            detail.setUid(uid);
            detail.setMoney(Integer.parseInt(goldcoin));
            detail.setCreateTime(new Date());
            detail.setUniqueKey("VIP-3-" + uid);
            integralDetailService.insertSelective(detail);
            // 添加金币
            userInfoExtraService.addGoldCoinByUid(uid, Integer.parseInt(goldcoin));
            // 消息
            UserInfoExtra userInfoExtra = userInfoExtraService.getUserInfoExtra(uid);
            userOtherMsgNotificationService.goldCoinSystemGiveMsg(uid, goldcoinNum, userInfoExtra.getGoldCoin());
        }
    }
    @Override
    public void remindBoss(Long uid, String rankName, String item, Date time, boolean divorced) {
        // 是否存在上级
@@ -493,8 +544,7 @@
    
    @Override
    public UserVIPPreInfo selectByUidAndProcess(Long uid, int process) {
        UserVIPPreInfo info = userVIPPreInfoMapper.selectByUidAndProcess(uid, process);
        return info;
        return userVIPPreInfoMapper.selectByUidAndProcess(uid, process);
    }
}
fanli/src/main/java/com/yeshi/fanli/service/inter/money/InviteOrderSubsidyDebtService.java
@@ -61,4 +61,11 @@
     */
    public BigDecimal getTotalDebtMoney(Long uid,Date maxEstimatePayTime);
    /**
     * 根据补贴id查询
     * @param sourceId
     * @return
     */
    public InviteOrderSubsidyDebt getBySourceId(Long sourceId);
}
fanli/src/main/java/com/yeshi/fanli/service/inter/money/msg/UserMoneyMsgNotificationService.java
@@ -148,10 +148,11 @@
     * 团队收益消息
     * @param uid
     * @param money 本次到账金额
     * @param subsidy 补贴金额
     * @param balance 余额
     * @param receivedDate  结算月度
     */
    public void teamReceive(Long uid, BigDecimal money, BigDecimal balance, Date receivedDate);
    public void teamReceive(Long uid, BigDecimal money,BigDecimal subsidy,  BigDecimal balance, Date receivedDate);
    /**
     * 使用奖励券
@@ -166,6 +167,15 @@
    public void rewardCounponReceived(Long uid, String orderId, int orderType, int goodsCount, BigDecimal money,
            BigDecimal balance, Date downTime);
    /**
     * 团队分红
     * @param uid
     * @param money
     * @param balance
     * @param receivedDate
     */
    public void teamDividend(Long uid, BigDecimal money, BigDecimal balance, Date receivedDate);
    
}
fanli/src/main/java/com/yeshi/fanli/service/inter/user/vip/UserVIPPreInfoService.java
@@ -38,12 +38,6 @@
     */
    public UserVIPPreInfo getProcessInfo(Long uid,Date time);
    /**
     * 会员等级添加并验证
     * @param uid
     * @param inviteSuccess
     */
    public void verifyVipPreInfo(Long uid, boolean inviteSuccess);
    
    /**
     * 根据用户ID与步骤查询
@@ -79,4 +73,22 @@
     */
    public void remindBoss(Long uid, String rankName, String item, Date time, boolean divorced);
    /**
     * 自购订单到账 满足升级验证
     * @param uid
     */
    public void upgradeVipByFanLiOrder(Long uid);
    /**
     * 分享订单到账 -满足升级验证
     * @param uid
     */
    public void upgradeVipByShareOrder(Long uid);
    /**
     * 粉丝完成收货-验证直接-间接粉丝
     * @param uid 粉丝id
     */
    public void upgradeVipByTeamNum(Long uid);
}
fanli/src/main/java/com/yeshi/fanli/util/factory/msg/MsgMoneyDetailFactory.java
@@ -364,7 +364,8 @@
     * @param beiZhu
     * @return
     */
    public static MsgMoneyDetail createTeamReceivedMsg(Long uid, BigDecimal money, BigDecimal balance, Date receivedDate) {
    public static MsgMoneyDetail createTeamReceivedMsg(Long uid, BigDecimal money, BigDecimal balance, Date receivedDate,
            String teamName) {
        if (money == null || balance == null || uid == null)
            return null;
@@ -376,7 +377,7 @@
        listMsg.add(CommonMsgItemVOFactory.createMsgItemVO(new ClientTextStyleVO("结算月度", ClientTextStyleVO.COLOR_TITLE), contentList));
        
        listMsg.add(CommonMsgItemVOFactory.createMsgItemVO(new ClientTextStyleVO("到账类目", ClientTextStyleVO.COLOR_TITLE),
                new ClientTextStyleVO("团队收益", ClientTextStyleVO.COLOR_CONTENT), true));
                new ClientTextStyleVO(teamName, ClientTextStyleVO.COLOR_CONTENT), true));
        
        List<ClientTextStyleVO> contentList2 = new ArrayList<>();
        contentList2.add(new ClientTextStyleVO("¥" + money.setScale(2, BigDecimal.ROUND_DOWN), ClientTextStyleVO.COLOR_HIGHLIGHT_CONTENT));
fanli/src/main/java/com/yeshi/fanli/util/rocketmq/consumer/user/UserVIPMessageListener.java
@@ -10,10 +10,10 @@
import com.aliyun.openservices.ons.api.MessageListener;
import com.google.gson.Gson;
import com.yeshi.fanli.dto.mq.order.OrderTopicTagEnum;
import com.yeshi.fanli.dto.mq.order.body.OrderConfirmMQMsg;
import com.yeshi.fanli.dto.mq.order.body.OrderMoneyRecievedMQMsg;
import com.yeshi.fanli.dto.mq.user.UserTopicTagEnum;
import com.yeshi.fanli.dto.mq.user.body.ThreeSaleSeparateMQMsg;
import com.yeshi.fanli.dto.mq.user.body.UserInviteMQMsg;
import com.yeshi.fanli.dto.mq.user.body.UserLevelChangedMQMsg;
import com.yeshi.fanli.entity.bus.user.UserInfo;
import com.yeshi.fanli.log.LogHelper;
@@ -51,12 +51,7 @@
        // 邀请相关
        if (MQTopicName.TOPIC_USER.name().equalsIgnoreCase(message.getTopic())) {
            // 邀请成功
            if (tag.equalsIgnoreCase(UserTopicTagEnum.inviteSuccess.name())) {
                UserInviteMQMsg msg = new Gson().fromJson(new String(message.getBody()), UserInviteMQMsg.class);
                // 会员等级升级
                userVIPPreInfoService.verifyVipPreInfo(msg.getBossId(), true);
            } else if (tag.equalsIgnoreCase(UserTopicTagEnum.userLevelChanged.name())) {// 用户等级发生变化
            if (tag.equalsIgnoreCase(UserTopicTagEnum.userLevelChanged.name())) {// 用户等级发生变化
                UserLevelChangedMQMsg msg = new Gson().fromJson(new String(message.getBody()),
                        UserLevelChangedMQMsg.class);
                // 更新上2级的邀请统计
@@ -89,12 +84,18 @@
                        OrderMoneyRecievedMQMsg.class);
                if (dto != null) {
                    if (dto.getType() == OrderMoneyRecievedMQMsg.TYPE_ZIGOU) {// 自购到账
                        // 会员等级升级
                        userVIPPreInfoService.verifyVipPreInfo(dto.getUid(), false);
                        // 会员升级-自购订单数量验证
                        userVIPPreInfoService.upgradeVipByFanLiOrder(dto.getUid());
                    } else if (dto.getType() == OrderMoneyRecievedMQMsg.TYPE_SHARE) {// 分享到账
                        // 会员等级升级
                        userVIPPreInfoService.verifyVipPreInfo(dto.getUid(), false);
                    }
                        // 会员升级-分享订单数量验证
                        userVIPPreInfoService.upgradeVipByShareOrder(dto.getUid());
                    }
                }
            } else if (tag.equalsIgnoreCase(OrderTopicTagEnum.orderConfirm.name())) {
                OrderConfirmMQMsg dto = new Gson().fromJson(new String(message.getBody()),OrderConfirmMQMsg.class);
                if (dto != null) {
                    // 会员等级升级-粉丝数量验证
                    userVIPPreInfoService.upgradeVipByTeamNum(dto.getSourceUid());
                }
            }
        }
fanli/src/main/resource/rocket/consumer.xml
@@ -200,7 +200,7 @@
    </bean>
    <!-- 邀请图修改消息订阅 -->
    <!-- vip自动升级 -->
    <bean id="userVIPMessageListener"
        class="com.yeshi.fanli.util.rocketmq.consumer.user.UserVIPMessageListener"></bean>
    <!-- Group ID 订阅同一个 Topic,可以创建多个 ConsumerBean -->
@@ -223,18 +223,17 @@
                        <bean class="com.aliyun.openservices.ons.api.bean.Subscription">
                            <property name="topic" value="TOPIC_USER" />
                            <property name="expression"
                                value="inviteSuccess||userLevelChanged||threeSaleSeparate" />
                                value="userLevelChanged||threeSaleSeparate" />
                        </bean>
                    </key>
                </entry>
                <!-- 订单到账 -->
                <!-- 订单到账  订单收货-->
                <entry value-ref="userVIPMessageListener">
                    <key>
                        <bean class="com.aliyun.openservices.ons.api.bean.Subscription">
                            <property name="topic" value="TOPIC_ORDER" />
                            <property name="expression" value="orderFanLiActual" />
                            <property name="expression" value="orderFanLiActual||orderConfirm" />
                        </bean>
                    </key>
                </entry>