admin
2020-06-15 3e4ef41ffacd7f5fda2e81c3810cd11a6375b83c
fanli/src/main/java/com/yeshi/fanli/service/impl/user/invite/ThreeSaleSerivceImpl.java
@@ -15,28 +15,28 @@
import com.aliyun.openservices.ons.api.Message;
import com.aliyun.openservices.ons.api.Producer;
import com.google.gson.Gson;
import com.yeshi.fanli.dao.mybatis.ThreeSaleMapper;
import com.yeshi.fanli.dao.mybatis.UserInfoMapper;
import com.yeshi.fanli.dto.mq.user.UserTopicTagEnum;
import com.yeshi.fanli.dto.mq.user.body.UserInviteMQMsg;
import com.yeshi.fanli.entity.bus.user.ThreeSale;
import com.yeshi.fanli.entity.bus.user.ThreeSaleExtraInfo;
import com.yeshi.fanli.entity.bus.user.UserActiveLog;
import com.yeshi.fanli.entity.bus.user.UserInfo;
import com.yeshi.fanli.exception.user.ThreeSaleException;
import com.yeshi.fanli.log.LogHelper;
import com.yeshi.fanli.service.inter.order.config.HongBaoManageService;
import com.yeshi.fanli.service.inter.user.UserActiveLogService;
import com.yeshi.fanli.service.inter.user.UserInfoExtraService;
import com.yeshi.fanli.service.inter.user.UserInfoService;
import com.yeshi.fanli.service.inter.user.integral.IntegralGetService;
import com.yeshi.fanli.service.inter.user.invite.MsgInviteDetailService;
import com.yeshi.fanli.service.inter.user.invite.TeamFansInfoService;
import com.yeshi.fanli.service.inter.user.invite.ThreeSaleExtraInfoSerivce;
import com.yeshi.fanli.service.inter.user.invite.ThreeSaleSerivce;
import com.yeshi.fanli.service.inter.user.invite.UserInviteMsgNotificationService;
import com.yeshi.fanli.util.Constant;
import com.yeshi.fanli.util.StringUtil;
import com.yeshi.fanli.util.VersionUtil;
import com.yeshi.fanli.util.rocketmq.MQMsgBodyFactory;
import com.yeshi.fanli.util.rocketmq.MQTopicName;
import net.sf.json.JSONArray;
@@ -75,6 +75,11 @@
   @Lazy
   @Resource
   private IntegralGetService integralGetService;
   @Lazy
   @Resource
   private TeamFansInfoService teamFansInfoService;
   @Resource(name = "taskExecutor")
   private TaskExecutor executor;
@@ -86,7 +91,7 @@
      return threeSaleMapper.selectBoss(uid);
   }
   @Transactional
   @Transactional(rollbackFor = Exception.class)
   public void bind(UserInfo worker, UserInfo inviter) throws ThreeSaleException {
      if (worker == null || inviter == null)
         throw new ThreeSaleException(1, "用户信息为空");
@@ -107,19 +112,6 @@
         threeSale.setWorker(inviteeUser);
         threeSaleMapper.insertSelective(threeSale);
         List<ThreeSale> listExpire = threeSaleMapper.getExpireRecord(inviter.getId(), inviteeUser.getId());
         if (listExpire != null && listExpire.size() > 0) {
            // 删除失效
            for (ThreeSale saleExpire : listExpire) {
               msgInviteDetailService.deleteByThreeSale(saleExpire);
            }
            // 删除已失效关系
            threeSaleMapper.deleteExpireRecord(inviter.getId(), inviteeUser.getId());
         }
         // 创建通知
         userInviteMsgNotificationService.inviteScan(inviter.getId(), threeSale);
      } else {// 是已经存在的用户
         if (worker.getId().longValue() == inviter.getId())
            throw new ThreeSaleException(4, "不能绑定自己");
@@ -134,7 +126,7 @@
            List<ThreeSale> list = listByWorkerId(worker.getId());
            if (list != null && list.size() > 0) {
               for (ThreeSale ts : list) {
                  if (!ts.getState() && ts.getExpire() == ThreeSale.EXPIRE_OUTOFDATE) {
                  if (!ts.getState() && ts.getExpire() == ThreeSale.EXPIRE_BREAK) {
                     outOfDateCount++;
                  }
               }
@@ -149,23 +141,6 @@
                  threeSale.setUpdateTime(java.lang.System.currentTimeMillis());
                  threeSale.setWorker(worker);
                  threeSaleMapper.insertSelective(threeSale);
                  // 删除已失效关系
                  threeSaleMapper.deleteExpireRecord(inviter.getId(), worker.getId());
                  List<ThreeSale> listExpire = threeSaleMapper.getExpireRecord(inviter.getId(), worker.getId());
                  if (listExpire != null && listExpire.size() > 0) {
                     // 删除历史通知
                     for (ThreeSale saleExpire : listExpire) {
                        msgInviteDetailService.deleteByThreeSale(saleExpire);
                     }
                     // 删除已失效关系
                     threeSaleMapper.deleteExpireRecord(inviter.getId(), worker.getId());
                  }
                  userInviteMsgNotificationService.inviteScan(inviter.getId(), threeSale);
                  // threeSaleSerivce.bind(invitee, inviter);
               } else {
                  // 还存在有效的邀请,则不做处理
               }
@@ -179,7 +154,7 @@
            if (list != null)
               for (int i = 0; i < list.size(); i++) {
                  if (list.get(i).getState() != null && list.get(i).getState() == false
                        && list.get(i).getExpire() == ThreeSale.EXPIRE_OUTOFDATE) {// 过期的
                        && list.get(i).getExpire() == ThreeSale.EXPIRE_BREAK) {// 过期的
                     list.remove(i);
                     i--;
                  }
@@ -195,7 +170,6 @@
               ts.setSucceedTime(System.currentTimeMillis());
               ts.setWorker(worker);
               threeSaleMapper.insertSelective(ts);
               inviteSuccess(inviter.getId(), worker.getId(), ts);
            } else {
               if (!list.get(0).getState() && list.get(0).getExpire() == ThreeSale.EXPIRE_NORMAL
                     && list.get(0).getBoss().getId() == inviter.getId().longValue()) {// 未生效的上级和现在上级一样就生效
@@ -203,7 +177,6 @@
                  update.setState(true);
                  update.setSucceedTime(System.currentTimeMillis());
                  threeSaleMapper.updateByPrimaryKeySelective(update);
                  inviteSuccess(list.get(0).getBoss().getId(), list.get(0).getWorker().getId(), list.get(0));
               }
            }
         }
@@ -238,80 +211,30 @@
         // if (inviter != null)
         // reComputeUserRank(inviter.getId());
         // 添加到队列
         inviteSuccess(oldSale.getBoss().getId(), oldSale.getWorker().getId(), oldSale);
         inviteSuccess(worker.getId(), oldSale.getBoss().getId());
      }
   }
   @Override
   public long getFirstUsersCount(Long uid) {
      return threeSaleMapper.countFirstTeam(uid, null);
   }
   @Override
   public long getSecondUsersCount(Long uid) {
      return threeSaleMapper.countSecondTeam(uid, null);
   }
   @Override
   public List<ThreeSale> queryMyFirstTeamList(int start, int count, String key, Long bossId) {
      return threeSaleMapper.queryMyFirstTeamList(start, count, key, bossId);
   }
   @Override
   public long queryCountMyFirstTeamList(String key, Long bossId) {
      return threeSaleMapper.queryCountMyFirstTeamList(key, bossId);
   }
   @Override
   public List<ThreeSale> queryMySecondTeamList(int start, int count, String key, Long bossId) {
      return threeSaleMapper.queryMySecondTeamList(start, count, key, bossId);
   }
   @Override
   public long queryCountMySecondTeamList(String key, Long bossId) {
      return threeSaleMapper.queryCountMySecondTeamList(key, bossId);
   }
   @Override
   public int deleteByPrimaryKey(Long id) {
      return threeSaleMapper.deleteByPrimaryKey(id);
   }
   @Override
   public List<Long> queryLongTimeFailed(int daysNum) {
      return threeSaleMapper.queryLongTimeFailed(daysNum);
   }
   @Override
   public List<ThreeSale> queryLongTimeSuccess(int daysNum) {
      return threeSaleMapper.queryLongTimeSuccess(daysNum);
   }
   @Override
   public int updateExpire(List<Long> list) {
      return threeSaleMapper.updateExpire(list);
   }
   @Override
   public List<ThreeSale> listFirstTeamQuery(long start, int count, Long uid, Integer state, String startTime,
         String endTime) {
      return threeSaleMapper.listFirstTeamQuery(start, count, uid, state, startTime, endTime);
         String endTime, Integer validState) {
      return threeSaleMapper.listFirstTeamQuery(start, count, uid, state, startTime, endTime, validState);
   }
   @Override
   public long countFirstTeamQuery(Long uid, Integer state, String startTime, String endTime) {
      return threeSaleMapper.countFirstTeamQuery(uid, state, startTime, endTime);
   public long countFirstTeamQuery(Long uid, Integer state, String startTime, String endTime, Integer validState) {
      return threeSaleMapper.countFirstTeamQuery(uid, state, startTime, endTime, validState);
   }
   @Override
   public List<ThreeSale> listSecondTeamQuery(long start, int count, Long uid, Integer state, String startTime,
         String endTime) {
      return threeSaleMapper.listSecondTeamQuery(start, count, uid, state, startTime, endTime);
         String endTime, Integer validState) {
      return threeSaleMapper.listSecondTeamQuery(start, count, uid, state, startTime, endTime, validState);
   }
   @Override
   public long countSecondTeamQuery(Long uid, Integer state, String startTime, String endTime) {
      return threeSaleMapper.countSecondTeamQuery(uid, state, startTime, endTime);
   public long countSecondTeamQuery(Long uid, Integer state, String startTime, String endTime, Integer validState) {
      return threeSaleMapper.countSecondTeamQuery(uid, state, startTime, endTime, validState);
   }
   @Override
@@ -322,16 +245,6 @@
   @Override
   public long countSuperiorQuery(Integer state, Long uid) {
      return threeSaleMapper.countSuperiorQuery(state, uid);
   }
   @Override
   public long countFirstTeam(Long uid, Integer state) {
      return threeSaleMapper.countFirstTeam(uid, state);
   }
   @Override
   public long countSecondTeam(Long uid, Integer state) {
      return threeSaleMapper.countSecondTeam(uid, state);
   }
   @Override
@@ -350,27 +263,22 @@
   }
   @Override
   public JSONObject getMyFirstTeam(long start, int count, Long uid, Integer state) {
      List<ThreeSale> list = threeSaleMapper.listFirstTeam(start, count, uid, state);
   public JSONObject getMyFirstTeam(long start, int count, Long uid) {
      List<ThreeSale> list = threeSaleMapper.listFirstTeam(start, count, uid, null);
      if (list == null) {
         list = new ArrayList<ThreeSale>();
      }
      long countTotal = threeSaleMapper.countFirstTeam(uid, state);
      long countTotal = threeSaleMapper.countFirstTeam(uid, null);
      return organizeTeam(countTotal, list);
   }
   @Override
   public JSONObject getMySecondTeam(long start, int count, Long uid, Integer state) {
      List<ThreeSale> list = threeSaleMapper.listSecondTeam(start, count, uid, state);
   public JSONObject getMySecondTeam(long start, int count, Long uid) {
      List<ThreeSale> list = threeSaleMapper.listSecondTeam(start, count, uid, null);
      if (list == null) {
         list = new ArrayList<ThreeSale>();
      }
      long countTotal = threeSaleMapper.countSecondTeam(uid, state);
      long countTotal = threeSaleMapper.countSecondTeam(uid, null);
      return organizeTeam(countTotal, list);
   }
@@ -500,127 +408,70 @@
   }
   @Override
   @Transactional
   public void bindRelationshipByInviteCode(UserInfo invitee, UserInfo inviter) throws ThreeSaleException {
      if (invitee == null || inviter == null)
   @Transactional(rollbackFor = Exception.class)
   public void bindInviteRelationship(Long workerId, Long bossId) throws ThreeSaleException {
      if (workerId == null || bossId == null)
         throw new ThreeSaleException(1, "用户信息为空");
      // 获取有效的邀请关系
      ThreeSale threeSale = threeSaleMapper.getRelationshipByBossIdAndWorkerId(inviter.getId(), invitee.getId());
      // 新建立确定关系
      ThreeSale threeSale = new ThreeSale();
      threeSale.setBoss(new UserInfo(bossId));
      threeSale.setWorker(new UserInfo(workerId));
      threeSale.setState(true);
      threeSale.setExpire(ThreeSale.EXPIRE_NORMAL);
      threeSale.setSucceedTime(java.lang.System.currentTimeMillis());
      threeSale.setCreateTime(java.lang.System.currentTimeMillis());
      threeSale.setUpdateTime(java.lang.System.currentTimeMillis());
      threeSaleMapper.insertSelective(threeSale);
      if (threeSale != null) {
         // 有效关系--生效
         threeSale.setBoss(inviter);
         threeSale.setWorker(invitee);
         threeSale.setState(true);
         threeSale.setExpire(ThreeSale.EXPIRE_NORMAL);
         threeSale.setSucceedTime(java.lang.System.currentTimeMillis());
         threeSale.setUpdateTime(java.lang.System.currentTimeMillis());
         threeSaleMapper.updateByPrimaryKeySelective(threeSale);
      } else {
         // 新建立确定关系
         threeSale = new ThreeSale();
         threeSale.setBoss(inviter);
         threeSale.setWorker(invitee);
         threeSale.setState(true);
         threeSale.setExpire(ThreeSale.EXPIRE_NORMAL);
         threeSale.setSucceedTime(java.lang.System.currentTimeMillis());
         threeSale.setCreateTime(java.lang.System.currentTimeMillis());
         threeSale.setUpdateTime(java.lang.System.currentTimeMillis());
         threeSaleMapper.insertSelective(threeSale);
      }
      List<ThreeSale> listExpire = threeSaleMapper.getExpireRecord(inviter.getId(), invitee.getId());
      if (listExpire != null && listExpire.size() > 0) {
         // 删除历史通知
         for (ThreeSale saleExpire : listExpire) {
            msgInviteDetailService.deleteByThreeSale(saleExpire);
         }
         // 删除已失效关系
         threeSaleMapper.deleteExpireRecord(inviter.getId(), invitee.getId());
      }
      inviteSuccess(inviter.getId(), invitee.getId(), threeSale);
   }
   @Override
   @Transactional
   public void bindRelationshipByWX(UserInfo invitee, Long inviterId, ThreeSale threeSaleOld)
         throws ThreeSaleException {
      if (invitee == null || (inviterId == null && threeSaleOld == null))
         throw new ThreeSaleException(1, "用户信息为空");
      ThreeSale threeSale = null;
      if (inviterId != null) {
         // 新建立确定关系
         threeSale = new ThreeSale();
         threeSale.setBoss(new UserInfo(inviterId));
         threeSale.setWorker(invitee);
         threeSale.setState(true);
         threeSale.setExpire(ThreeSale.EXPIRE_NORMAL);
         threeSale.setSucceedTime(java.lang.System.currentTimeMillis());
         threeSale.setCreateTime(java.lang.System.currentTimeMillis());
         threeSale.setUpdateTime(java.lang.System.currentTimeMillis());
         threeSaleMapper.insertSelective(threeSale);
         // 邀请关系失效 1.5.3 之前失效
         if (threeSaleOld != null) {
            ThreeSale three = new ThreeSale();
            three.setId(threeSaleOld.getId());
            three.setExpire(ThreeSale.EXPIRE_OUTOFDATE);
            three.setUpdateTime(java.lang.System.currentTimeMillis());
            threeSaleMapper.updateByPrimaryKeySelective(three);
         }
      } else if (threeSaleOld != null && inviterId == null) {
         // 1.5.3 之前生效
         threeSaleOld.setState(true);
         threeSaleOld.setExpire(ThreeSale.EXPIRE_NORMAL);
         threeSaleOld.setSucceedTime(java.lang.System.currentTimeMillis());
         threeSaleOld.setUpdateTime(java.lang.System.currentTimeMillis());
         threeSaleMapper.updateByPrimaryKeySelective(threeSaleOld);
         threeSale = threeSaleOld;
      }
      if (threeSale == null) {
         throw new ThreeSaleException(1, "关系绑定失败");
      }
      UserInfo boss = userInfoService.selectByPKey(threeSale.getBoss().getId());
      threeSale.setBoss(boss);
      threeSale.setWorker(invitee);
      inviteSuccess(boss.getId(), invitee.getId(), threeSale);
      // 邀请成功:消息、相关处理
      inviteSuccess(workerId, bossId);
   }
   /**
    * 邀请成功
    */
   @Transactional
   private void inviteSuccess(Long bossId, Long workerId, ThreeSale threeSale) {
      // 邀请消息
      UserActiveLog activeLog = userActiveLogService.getUserLatestActiveInfo(bossId);
      if (activeLog != null && VersionUtil.greaterThan_2_1("appstore".equalsIgnoreCase(activeLog.getChannel()) ? "ios" : "android",
            activeLog.getVersionCode())) { // 2.1版本以上
         userInviteMsgNotificationService.inviteSuccess2_1(bossId, threeSale);
      } else { // 最初消息
         userInviteMsgNotificationService.inviteSuccess(threeSale.getBoss().getId(), threeSale);
      }
   private void inviteSuccess(Long workerId, Long bossId) {
      // 同步粉丝消息
      teamFansInfoService.addFansInfo(workerId, bossId, new Date());
      
      if (!Constant.IS_TEST) {
         UserInviteMQMsg msg = new UserInviteMQMsg(bossId, workerId, null, new Date(),
               UserInviteMQMsg.STATE_SUCCESS);
         Message message = MQMsgBodyFactory.create(MQTopicName.TOPIC_USER, UserTopicTagEnum.inviteSuccess, msg);
         message.setStartDeliverTime(java.lang.System.currentTimeMillis() + 5000);
         producer.send(message);
      }
      executor.execute(new Runnable() {
         @Override
         public void run() {
            // 邀请金币
            integralGetService.addInviteLevelOne(bossId, workerId);
            try { // 邀请金币
               integralGetService.addInviteLevelOne(bossId, workerId);
            } catch (Exception e) {
               LogHelper.error(e);
            }
            // 邀请成功消息
            try {
               // 直接粉丝邀请成功
               UserInfo invitee = userInfoService.selectByPKey(workerId);
               userInviteMsgNotificationService.directInviteSuccess(bossId, invitee.getNickName(),
                     invitee.getPortrait(), new Date());
               // 间接粉丝邀请成功
               ThreeSale myBoss = threeSaleMapper.getMyBoss(bossId);
               if (myBoss != null) {
                  UserInfo boss = userInfoService.selectByPKey(bossId);
                  userInviteMsgNotificationService.indirectInviteSuccess(myBoss.getBoss().getId(),
                        boss.getNickName(), invitee.getNickName(), invitee.getPortrait(), new Date());
               }
            } catch (Exception e) {
               LogHelper.error(e);
            }
         }
      });
      UserInviteMQMsg msg = new UserInviteMQMsg(bossId, workerId, null, new Date(), UserInviteMQMsg.STATE_SUCCESS);
      Message message = new Message(MQTopicName.TOPIC_USER.name(), UserTopicTagEnum.inviteSuccess.name(),
            new Gson().toJson(msg).getBytes());
      producer.send(message);
   }
   /**
@@ -635,13 +486,13 @@
   }
   @Override
   public long countSuccessFirstTeam(Long uid) {
      return threeSaleMapper.countFirstTeam(uid, 1);
   public ThreeSale selectByWorkerId(Long workerId) {
      return threeSaleMapper.selectSuccessByWorkerId(workerId);
   }
   @Override
   public ThreeSale selectByWorkerId(Long workerId) {
      return threeSaleMapper.selectSuccessByWorkerId(workerId);
   public ThreeSale getNearRelationByBossIdAndWorkerId(Long bossId, Long workerId) {
      return threeSaleMapper.getNearRelationByBossIdAndWorkerId(bossId, workerId);
   }
   @Override
@@ -650,13 +501,53 @@
   }
   @Override
   public List<ThreeSale> listFirstTeam(long start, int count, Long uid, Integer state) {
      return threeSaleMapper.listFirstTeam(start, count, uid, state);
   public List<ThreeSale> listFirstTeam(long start, int count, Long uid) {
      return threeSaleMapper.listFirstTeam(start, count, uid, null);
   }
   @Override
   public List<ThreeSale> listSecondTeam(long start, int count, Long uid, Integer state) {
      return threeSaleMapper.listSecondTeam(start, count, uid, state);
   public List<ThreeSale> listSecondTeam(long start, int count, Long uid) {
      return threeSaleMapper.listSecondTeam(start, count, uid, null);
   }
   @Override
   public List<ThreeSale> listFirstTeam(long start, int count, Long uid, List<Long> listId) {
      return threeSaleMapper.listFirstTeam(start, count, uid, listId);
   }
   @Override
   public List<ThreeSale> listSecondTeam(long start, int count, Long uid, List<Long> listId) {
      return threeSaleMapper.listSecondTeam(start, count, uid, listId);
   }
   @Override
   public long countFirstTeam(Long uid) {
      return threeSaleMapper.countFirstTeam(uid, null);
   }
   @Override
   public long countSecondTeam(Long uid) {
      return threeSaleMapper.countSecondTeam(uid, null);
   }
   @Override
   public long countFirstTeam(Long uid, List<Long> listId) {
      return threeSaleMapper.countFirstTeam(uid, listId);
   }
   @Override
   public long countSecondTeam(Long uid, List<Long> listId) {
      return threeSaleMapper.countSecondTeam(uid, listId);
   }
   @Override
   public long countFirstTeamByDate(Long uid, int dayType) {
      return threeSaleMapper.countFirstTeamByDate(uid, dayType);
   }
   @Override
   public long countSecondTeamByDate(Long uid, int dayType) {
      return threeSaleMapper.countSecondTeamByDate(uid, dayType);
   }
   @Override
@@ -668,4 +559,69 @@
   public ThreeSale getByWorkerIdAndTime(Long workerId, long time) {
      return threeSaleMapper.getByWorkerIdAndTime(workerId, time);
   }
   @Override
   public void inviteSeparate(Long workerId, Long bossId) {
      threeSaleMapper.inviteSeparate(workerId, bossId);
   }
   @Override
   public long getTeamOrderNumByWorkerId(Long workerId) {
      return threeSaleMapper.getTeamOrderNumByWorkerId(workerId);
   }
   @Override
   public List<ThreeSale> getValidWorkerIdsByTime(Long bossId, long limitTime) {
      return threeSaleMapper.getValidWorkerIdsByTime(bossId, limitTime);
   }
   @Override
   public List<ThreeSale> getMyBossDeepList(Long uid, int deep) {
      List<ThreeSale> deepList = new ArrayList<>();
      ThreeSale boss = getMyBoss(uid);
      while (deep > 0 && boss != null) {
         deep--;
         deepList.add(boss);
         boss = getMyBoss(boss.getBoss().getId());
      }
      return deepList;
   }
   @Override
   public List<ThreeSale> getMyBossDeepList(Long uid) {
      // TODO 需要更加简便的方式处理
      return getMyBossDeepList(uid, 100);
   }
   @Override
   public Long getTopBoss(Long uid) {
      Long bossUid = null;
      UserInfo boss = getBoss(uid);
      while (boss != null) {
         bossUid = boss.getId();
         boss = getBoss(boss.getId());
      }
      return bossUid;
   }
   @Override
   public List<ThreeSale> listAll(Date minTime, Date maxTime, int page, int pageSize) {
      return threeSaleMapper.listAll(minTime == null ? null : minTime.getTime(),
            maxTime == null ? null : maxTime.getTime(), (page - 1) * pageSize, pageSize);
   }
   @Override
   public long countAll(Date minTime, Date maxTime) {
      return threeSaleMapper.countAll(minTime == null ? null : minTime.getTime(),
            maxTime == null ? null : maxTime.getTime());
   }
   @Override
   public List<Long> getAllBossId(){
      return threeSaleMapper.getAllBossId();
   }
}