admin
2025-02-25 30d8e227e8d823b6c38c3b9c90ac2df03b63befe
fanli/src/main/java/com/yeshi/fanli/service/impl/user/invite/UserInviteValidNumServiceImpl.java
@@ -1,150 +1,354 @@
package com.yeshi.fanli.service.impl.user.invite;
import java.math.BigDecimal;
import java.util.Date;
import javax.annotation.Resource;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import com.yeshi.fanli.dao.mybatis.user.UserInviteValidNumMapper;
import com.yeshi.fanli.dao.mybatis.user.UserInviteValidRecordMapper;
import com.yeshi.fanli.entity.bus.user.ThreeSale;
import com.yeshi.fanli.entity.bus.user.UserInviteValidNum;
import com.yeshi.fanli.entity.bus.user.UserInviteValidRecord;
import com.yeshi.fanli.log.LogHelper;
import com.yeshi.fanli.service.inter.user.invite.ThreeSaleSerivce;
import com.yeshi.fanli.service.inter.user.invite.UserInviteValidNumService;
import com.yeshi.fanli.util.Constant;
import com.yeshi.fanli.util.StringUtil;
@Service
public class UserInviteValidNumServiceImpl implements UserInviteValidNumService {
   @Resource
   private UserInviteValidNumMapper userInviteValidNumMapper;
   @Resource
   private UserInviteValidRecordMapper userInviteValidRecordMapper;
   @Resource
   private ThreeSaleSerivce threeSaleSerivce;
   @Override
   public UserInviteValidNum selectByPrimaryKey(Long id) {
      return userInviteValidNumMapper.selectByPrimaryKey(id);
   }
   /**
    *  直接粉丝 +1
    * @param uid
    */
   @Transactional(rollbackFor = Exception.class)
   private void addNumFirst(Long uid) {
      UserInviteValidNum inviteValid = userInviteValidNumMapper.selectForUpdate(uid);
      if (inviteValid != null) {
         userInviteValidNumMapper.addNumFirst(uid, 1);
      } else {
         inviteValid = new UserInviteValidNum();
         inviteValid.setId(uid);
         inviteValid.setNumFirst(1);
         inviteValid.setNumSecond(0);
         inviteValid.setUpdateTime(new Date());
         userInviteValidNumMapper.insertSelective(inviteValid);
      }
   }
   /**
    *  间接粉丝 +1
    * @param uid
    */
   @Transactional(rollbackFor = Exception.class)
   private void addNumSecond(Long uid) {
      UserInviteValidNum inviteValid = userInviteValidNumMapper.selectForUpdate(uid);
      if (inviteValid != null) {
         userInviteValidNumMapper.addNumSecond(uid, 1);
      } else {
         inviteValid = new UserInviteValidNum();
         inviteValid.setId(uid);
         inviteValid.setNumFirst(0);
         inviteValid.setNumSecond(1);
         inviteValid.setUpdateTime(new Date());
         userInviteValidNumMapper.insertSelective(inviteValid);
      }
   }
   @Override
   @Transactional(rollbackFor = Exception.class)
   public void addValidTeamNum(Long uid, BigDecimal payment, Date payDate) {
      if (uid == null || payment == null || payDate == null) {
         return;
      }
      try {
         // 付款金额小于1
         if (payment.compareTo(Constant.VIP_ORDER_PAY) < 0) {
            return;
         }
         // 是否上级
         ThreeSale threeSale = threeSaleSerivce.getMyBoss(uid);
         if (threeSale == null) {
            return;
         }
         // 队员关系有效时间
         Long succeedTime = threeSale.getSucceedTime();
         if (succeedTime == null) {
            succeedTime = threeSale.getCreateTime();
         }
         // 下单时间在生产关系之前
         if (payDate.getTime() <= succeedTime.longValue()) {
            return;
         }
         Long bossId = threeSale.getBoss().getId();
         String uniqueKey = StringUtil.Md5(bossId + "#" + uid + "#" + UserInviteValidRecord.TYPE_ONE);
         UserInviteValidRecord record = userInviteValidRecordMapper.selectByUniqueKey(uniqueKey);
         if (record == null) {
            record = new UserInviteValidRecord();
            record.setUid(bossId);
            record.setWorkerId(uid);
            record.setType(UserInviteValidRecord.TYPE_ONE);
            record.setUniqueKey(uniqueKey);
            record.setCreateTime(new Date());
            userInviteValidRecordMapper.insertSelective(record);
            // 更新上级的直接粉丝数量
            addNumFirst(bossId);
         }
         // 是否上上级
         ThreeSale threeSaleSuper = threeSaleSerivce.getMyBoss(bossId);
         if (threeSaleSuper == null) {
            return;
         }
         // 间接关系
         Long bossIdSuper = threeSaleSuper.getBoss().getId();
         String uniqueKeySuper = StringUtil.Md5(bossIdSuper + "#" + uid + "#" + UserInviteValidRecord.TYPE_TWO);
         UserInviteValidRecord recordSuper = userInviteValidRecordMapper.selectByUniqueKey(uniqueKeySuper);
         if (recordSuper == null) {
            recordSuper = new UserInviteValidRecord();
            recordSuper.setUid(bossIdSuper);
            recordSuper.setWorkerId(uid);
            recordSuper.setType(UserInviteValidRecord.TYPE_TWO);
            recordSuper.setUniqueKey(uniqueKeySuper);
            recordSuper.setCreateTime(new Date());
            userInviteValidRecordMapper.insertSelective(recordSuper);
            // 更新上上级的间接粉丝数量
            addNumSecond(bossIdSuper);
         }
      } catch (Exception e) {
         LogHelper.error(e);
      }
   }
}
package com.yeshi.fanli.service.impl.user.invite;
import java.math.BigDecimal;
import java.util.Date;
import java.util.List;
import javax.annotation.Resource;
import org.springframework.context.annotation.Lazy;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import com.aliyun.openservices.ons.api.Message;
import com.aliyun.openservices.ons.api.Producer;
import com.yeshi.fanli.dao.mybatis.user.UserInviteValidNumMapper;
import com.yeshi.fanli.dao.mybatis.user.UserInviteValidRecordMapper;
import com.yeshi.fanli.dto.mq.user.UserTopicTagEnum;
import com.yeshi.fanli.dto.mq.user.body.BeComeValidUserMQMsg;
import com.yeshi.fanli.entity.bus.user.ThreeSale;
import com.yeshi.fanli.entity.bus.user.UserInfo;
import com.yeshi.fanli.entity.bus.user.UserInviteValidNum;
import com.yeshi.fanli.entity.bus.user.UserInviteValidRecord;
import com.yeshi.fanli.log.LogHelper;
import com.yeshi.fanli.service.inter.order.CommonOrderService;
import com.yeshi.fanli.service.inter.user.UserInfoService;
import com.yeshi.fanli.service.inter.user.invite.ThreeSaleSerivce;
import com.yeshi.fanli.service.inter.user.invite.UserInviteValidNumService;
import com.yeshi.fanli.service.manger.msg.RocketMQManager;
import com.yeshi.fanli.util.Constant;
import com.yeshi.fanli.util.StringUtil;
import com.yeshi.fanli.util.rocketmq.MQMsgBodyFactory;
import com.yeshi.fanli.util.rocketmq.MQTopicName;
@Service
public class UserInviteValidNumServiceImpl implements UserInviteValidNumService {
   @Resource
   private UserInviteValidNumMapper userInviteValidNumMapper;
   @Resource
   private UserInviteValidRecordMapper userInviteValidRecordMapper;
   @Lazy
   @Resource
   private ThreeSaleSerivce threeSaleSerivce;
   @Lazy
   @Resource
   private UserInfoService userInfoService;
   @Lazy
   @Resource
   private CommonOrderService commonOrderService;
   @Resource
   private RocketMQManager rocketMQManager;
   @Override
   public UserInviteValidNum selectByPrimaryKey(Long id) {
      return userInviteValidNumMapper.selectByPrimaryKey(id);
   }
   /**
    *  直接粉丝 +1
    * @param uid
    */
   @Transactional(rollbackFor = Exception.class)
   private void addNumFirst(Long uid) {
      UserInviteValidNum inviteValid = userInviteValidNumMapper.selectForUpdate(uid);
      if (inviteValid != null) {
         userInviteValidNumMapper.addNumFirst(uid, 1);
      } else {
         inviteValid = new UserInviteValidNum();
         inviteValid.setId(uid);
         inviteValid.setNumFirst(1);
         inviteValid.setNumSecond(0);
         inviteValid.setUpdateTime(new Date());
         userInviteValidNumMapper.insertSelective(inviteValid);
      }
   }
   /**
    *  直接粉丝 -1
    * @param uid
    */
   @Override
   @Transactional(rollbackFor = Exception.class)
   public void reduceValidNumFirst(Long uid, Long workerId) {
      UserInviteValidRecord record = userInviteValidRecordMapper.getByUidAndWorkerId(uid, workerId,
            UserInviteValidRecord.TYPE_ONE);
      if (record == null) {
         return;
      }
      UserInviteValidNum inviteValid = userInviteValidNumMapper.selectForUpdate(uid);
      if (inviteValid != null) {
         int num = 0;
         if (inviteValid.getNumFirst() > 0) {
            num = inviteValid.getNumFirst() - 1;
         }
         inviteValid.setId(uid);
         inviteValid.setNumFirst(num);
         inviteValid.setUpdateTime(new Date());
         userInviteValidNumMapper.updateByPrimaryKeySelective(inviteValid);
      }
      // 删除有效记录
      userInviteValidRecordMapper.deleteByPrimaryKey(record.getId());
   }
   /**
    *  直接粉丝 -1
    * @param uid
    */
   @Override
   @Transactional(rollbackFor = Exception.class)
   public void reduceValidNumSecond(Long uid, Long workerId) {
      UserInviteValidRecord record = userInviteValidRecordMapper.getByUidAndWorkerId(uid, workerId,
            UserInviteValidRecord.TYPE_TWO);
      if (record == null) {
         return;
      }
      UserInviteValidNum inviteValid = userInviteValidNumMapper.selectForUpdate(uid);
      if (inviteValid != null) {
         int num = 0;
         if (inviteValid.getNumFirst() > 0) {
            num = inviteValid.getNumSecond() - 1;
         }
         inviteValid.setId(uid);
         inviteValid.setNumSecond(num);
         inviteValid.setUpdateTime(new Date());
         userInviteValidNumMapper.updateByPrimaryKeySelective(inviteValid);
      }
      // 删除有效记录
      userInviteValidRecordMapper.deleteByPrimaryKey(record.getId());
   }
   /**
    *  间接粉丝 +1
    * @param uid
    */
   @Transactional(rollbackFor = Exception.class)
   private void addNumSecond(Long uid) {
      UserInviteValidNum inviteValid = userInviteValidNumMapper.selectForUpdate(uid);
      if (inviteValid != null) {
         userInviteValidNumMapper.addNumSecond(uid, 1);
      } else {
         inviteValid = new UserInviteValidNum();
         inviteValid.setId(uid);
         inviteValid.setNumFirst(0);
         inviteValid.setNumSecond(1);
         inviteValid.setUpdateTime(new Date());
         userInviteValidNumMapper.insertSelective(inviteValid);
      }
   }
   @Override
   @Transactional(rollbackFor = Exception.class)
   public void addValidTeamNum(Long uid, BigDecimal payment, Date payDate) {
      if (uid == null || payment == null || payDate == null) {
         return;
      }
      try {
         // 付款金额小于1
         if (payment.compareTo(Constant.VIP_ORDER_PAY) < 0) {
            return;
         }
         // 是否上级
         ThreeSale threeSale = threeSaleSerivce.getMyBoss(uid);
         if (threeSale == null) {
            return;
         }
         // 队员关系有效时间
         Long succeedTime = threeSale.getSucceedTime();
         if (succeedTime == null) {
            succeedTime = threeSale.getCreateTime();
         }
         // 下单时间在生产关系之前
         if (payDate.getTime() <= succeedTime.longValue()) {
            return;
         }
         Long bossId = threeSale.getBoss().getId();
         String uniqueKey = StringUtil.Md5(uid + "#" + UserInviteValidRecord.TYPE_ONE);
         UserInviteValidRecord record = userInviteValidRecordMapper.selectByUniqueKey(uniqueKey);
         if (record == null) {
            record = new UserInviteValidRecord();
            record.setUid(bossId);
            record.setWorkerId(uid);
            record.setType(UserInviteValidRecord.TYPE_ONE);
            record.setUniqueKey(uniqueKey);
            record.setCreateTime(new Date());
            userInviteValidRecordMapper.insertSelective(record);
            // 更新上级的直接粉丝数量
            addNumFirst(bossId);
         }
         // 发送成为有效粉丝的消息
         if (!Constant.IS_TEST) {
            BeComeValidUserMQMsg msg = new BeComeValidUserMQMsg(uid, new Date());
            Message message = MQMsgBodyFactory.create(MQTopicName.TOPIC_USER, UserTopicTagEnum.becomeValidUser,
                  msg);
            rocketMQManager.sendNormalMsg(message, null);
         }
         // 是否上上级
         ThreeSale threeSaleSuper = threeSaleSerivce.getMyBoss(bossId);
         if (threeSaleSuper == null) {
            return;
         }
         // 间接关系
         Long bossIdSuper = threeSaleSuper.getBoss().getId();
         String uniqueKeySuper = StringUtil.Md5(uid + "#" + UserInviteValidRecord.TYPE_TWO);
         UserInviteValidRecord recordSuper = userInviteValidRecordMapper.selectByUniqueKey(uniqueKeySuper);
         if (recordSuper == null) {
            recordSuper = new UserInviteValidRecord();
            recordSuper.setUid(bossIdSuper);
            recordSuper.setWorkerId(uid);
            recordSuper.setType(UserInviteValidRecord.TYPE_TWO);
            recordSuper.setUniqueKey(uniqueKeySuper);
            recordSuper.setCreateTime(new Date());
            userInviteValidRecordMapper.insertSelective(recordSuper);
            // 更新上上级的间接粉丝数量
            addNumSecond(bossIdSuper);
         }
      } catch (Exception e) {
         LogHelper.error(e);
      }
   }
   @Override
   public void syncInfoAgain(Long workerId) {
      // 更新上级
      ThreeSale threeSale = threeSaleSerivce.getByWorkerId(workerId);
      if (threeSale == null) {
         return;
      }
      Long uid = threeSale.getBoss().getId();
      UserInfo userInfo = userInfoService.selectByPKey(uid);
      if (userInfo == null || userInfo.getState() != UserInfo.STATE_NORMAL) {
         return;
      }
      int countTeam1 = 0;
      List<ThreeSale> listFirstTeam = threeSaleSerivce.listFirstTeam(0, Integer.MAX_VALUE, uid);
      if (listFirstTeam != null && listFirstTeam.size() > 0) {
         for (ThreeSale firstTeam : listFirstTeam) {
            if (firstTeam.getWorker() == null || firstTeam.getWorker().getId() == null) {
               continue;
            }
            Long wid = firstTeam.getWorker().getId();
            String uniqueKey = StringUtil.Md5(wid + "#" + UserInviteValidRecord.TYPE_ONE);
            UserInviteValidRecord record = userInviteValidRecordMapper.selectByUniqueKey(uniqueKey);
            if (record != null) {
               countTeam1++;
            } else {
               long countValid = commonOrderService.countOrderByUidAndSettled(wid, Constant.VIP_ORDER_PAY);
               if (countValid > 0) {
                  countTeam1++;
                  record = new UserInviteValidRecord();
                  record.setUid(uid);
                  record.setWorkerId(wid);
                  record.setType(UserInviteValidRecord.TYPE_ONE);
                  record.setUniqueKey(uniqueKey);
                  record.setCreateTime(new Date());
                  userInviteValidRecordMapper.insertSelective(record);
               }
            }
         }
      }
      UserInviteValidNum inviteValid = userInviteValidNumMapper.selectForUpdate(uid);
      if (inviteValid != null) {
         UserInviteValidNum updateObj = new UserInviteValidNum();
         updateObj.setId(uid);
         updateObj.setNumFirst(countTeam1);
         ;
         userInviteValidNumMapper.updateByPrimaryKeySelective(updateObj);
      } else {
         inviteValid = new UserInviteValidNum();
         inviteValid.setId(uid);
         inviteValid.setNumFirst(countTeam1);
         inviteValid.setNumSecond(0);
         inviteValid.setUpdateTime(new Date());
         userInviteValidNumMapper.insertSelective(inviteValid);
      }
      // 更新上上级信息
      ThreeSale superThreeSale = threeSaleSerivce.getByWorkerId(uid);
      if (superThreeSale == null) {
         return;
      }
      Long superUid = superThreeSale.getBoss().getId();
      UserInfo superUserInfo = userInfoService.selectByPKey(superUid);
      if (superUserInfo == null || superUserInfo.getState() != UserInfo.STATE_NORMAL) {
         return;
      }
      int countTeam2 = 0;
      List<ThreeSale> listSecondTeam = threeSaleSerivce.listSecondTeam(0, Integer.MAX_VALUE, superUid);
      if (listSecondTeam != null && listSecondTeam.size() > 0) {
         for (ThreeSale team : listSecondTeam) {
            if (team.getWorker() == null || team.getWorker().getId() == null) {
               continue;
            }
            Long wid = team.getWorker().getId();
            String uniqueKeySuper = StringUtil.Md5(wid + "#" + UserInviteValidRecord.TYPE_TWO);
            UserInviteValidRecord recordSuper = userInviteValidRecordMapper.selectByUniqueKey(uniqueKeySuper);
            if (recordSuper != null) {
               countTeam2++;
            } else {
               long countValid = commonOrderService.countOrderByUidAndSettled(wid, Constant.VIP_ORDER_PAY);
               if (countValid > 0) {
                  countTeam2++;
                  recordSuper = new UserInviteValidRecord();
                  recordSuper.setUid(superUid);
                  recordSuper.setWorkerId(wid);
                  recordSuper.setType(UserInviteValidRecord.TYPE_TWO);
                  recordSuper.setUniqueKey(uniqueKeySuper);
                  recordSuper.setCreateTime(new Date());
                  userInviteValidRecordMapper.insertSelective(recordSuper);
               }
            }
         }
      }
      UserInviteValidNum inviteValid2 = userInviteValidNumMapper.selectForUpdate(superUid);
      if (inviteValid2 != null) {
         UserInviteValidNum updateObj = new UserInviteValidNum();
         updateObj.setId(superUid);
         updateObj.setNumSecond(countTeam2);
         userInviteValidNumMapper.updateByPrimaryKeySelective(updateObj);
      } else {
         inviteValid2 = new UserInviteValidNum();
         inviteValid2.setId(superUid);
         inviteValid2.setNumFirst(0);
         inviteValid2.setNumSecond(countTeam2);
         inviteValid2.setUpdateTime(new Date());
         userInviteValidNumMapper.insertSelective(inviteValid2);
      }
   }
}