admin
2025-02-25 30d8e227e8d823b6c38c3b9c90ac2df03b63befe
fanli/src/main/java/com/yeshi/fanli/service/impl/user/invite/ThreeSaleSerivceImpl.java
@@ -1,687 +1,637 @@
package com.yeshi.fanli.service.impl.user.invite;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
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 com.aliyun.openservices.ons.api.Message;
import com.aliyun.openservices.ons.api.Producer;
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.UserInfo;
import com.yeshi.fanli.exception.user.ThreeSaleException;
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.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.rocketmq.MQMsgBodyFactory;
import com.yeshi.fanli.util.rocketmq.MQTopicName;
import net.sf.json.JSONArray;
import net.sf.json.JSONObject;
@Service
public class ThreeSaleSerivceImpl implements ThreeSaleSerivce {
   @Resource
   private HongBaoManageService hongBaoManageService;
   @Resource
   private UserInfoService userInfoService;
   @Resource
   private UserInfoMapper userInfoMapper;
   @Resource
   private ThreeSaleMapper threeSaleMapper;
   @Resource
   private UserInviteMsgNotificationService userInviteMsgNotificationService;
   @Resource
   private MsgInviteDetailService msgInviteDetailService;
   @Resource
   private UserActiveLogService userActiveLogService;
   @Resource
   private UserInfoExtraService userInfoExtraService;
   @Resource
   private ThreeSaleExtraInfoSerivce threeSaleExtraInfoSerivce;
   @Lazy
   @Resource
   private IntegralGetService integralGetService;
   @Resource(name = "taskExecutor")
   private TaskExecutor executor;
   @Resource(name = "producer")
   private Producer producer;
   public UserInfo getBoss(final long uid) {
      return threeSaleMapper.selectBoss(uid);
   }
   @Transactional(rollbackFor = Exception.class)
   public void bind(UserInfo worker, UserInfo inviter) throws ThreeSaleException {
      if (worker == null || inviter == null)
         throw new ThreeSaleException(1, "用户信息为空");
      if (worker.getId() == null)// 该用户还不存在
      {
         // 保存用户
         UserInfo inviteeUser = userInfoService.addUser(worker, Constant.APPID);
         if (inviteeUser == null)
            throw new ThreeSaleException(2, "创建用户失败");
         // 保存关系
         ThreeSale threeSale = new ThreeSale();
         threeSale.setBoss(inviter);
         threeSale.setCreateTime(java.lang.System.currentTimeMillis());
         threeSale.setExpire(ThreeSale.EXPIRE_NORMAL);
         threeSale.setState(false);
         threeSale.setUpdateTime(java.lang.System.currentTimeMillis());
         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());
         }
      } else {// 是已经存在的用户
         if (worker.getId().longValue() == inviter.getId())
            throw new ThreeSaleException(4, "不能绑定自己");
         worker = userInfoService.selectByPKey(worker.getId());
         // 用户已经存在我们的用户库中
         if (worker.getLastLoginTime() == null || worker.getLastLoginTime() == 0L) {
            // 用户未登录
            int outOfDateCount = 0;// 过期数量
            // 查询邀请关系
            List<ThreeSale> list = listByWorkerId(worker.getId());
            if (list != null && list.size() > 0) {
               for (ThreeSale ts : list) {
                  if (!ts.getState() && ts.getExpire() == ThreeSale.EXPIRE_BREAK) {
                     outOfDateCount++;
                  }
               }
               // 全部是失效状态
               if (outOfDateCount == list.size()) {
                  // 可以确定关系
                  ThreeSale threeSale = new ThreeSale();
                  threeSale.setBoss(inviter);
                  threeSale.setCreateTime(java.lang.System.currentTimeMillis());
                  threeSale.setExpire(ThreeSale.EXPIRE_NORMAL);
                  threeSale.setState(false);
                  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());
                  }
               } else {
                  // 还存在有效的邀请,则不做处理
               }
            } else {
               // 用户未登录,又不存在邀请关系,不做处理
            }
         } else {
            // 已经登录,而且没有上下级关系或者上下级关系未生效,则绑定关系
            List<ThreeSale> list = threeSaleMapper.listByWorkerId(worker.getId());
            // 删除无效的
            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_BREAK) {// 过期的
                     list.remove(i);
                     i--;
                  }
               }
            // 查询上级是否有和现在上级一样的
            if (list == null || list.size() == 0)// 尚未确立关系,建立关系
            {
               ThreeSale ts = new ThreeSale();
               ts.setBoss(inviter);
               ts.setCreateTime(System.currentTimeMillis());
               ts.setExpire(ThreeSale.EXPIRE_NORMAL);
               ts.setState(true);
               ts.setSucceedTime(System.currentTimeMillis());
               ts.setWorker(worker);
               threeSaleMapper.insertSelective(ts);
            } else {
               if (!list.get(0).getState() && list.get(0).getExpire() == ThreeSale.EXPIRE_NORMAL
                     && list.get(0).getBoss().getId() == inviter.getId().longValue()) {// 未生效的上级和现在上级一样就生效
                  ThreeSale update = new ThreeSale(list.get(0).getId());
                  update.setState(true);
                  update.setSucceedTime(System.currentTimeMillis());
                  threeSaleMapper.updateByPrimaryKeySelective(update);
               }
            }
         }
      }
   }
   @Transactional
   public void effective(UserInfo worker) {
      List<ThreeSale> list = threeSaleMapper.listByWorkerId(worker.getId());
      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_NORMAL) {
               ;
            } else {
               list.remove(i);
               i--;
            }
         }
      if (list.size() > 0) {
         ThreeSale oldSale = list.get(0);
         ThreeSale update = new ThreeSale(list.get(0).getId());
         update.setState(true);
         update.setSucceedTime(System.currentTimeMillis());
         threeSaleMapper.updateByPrimaryKeySelective(update);
         oldSale.setState(update.getState());
         oldSale.setSucceedTime(update.getSucceedTime());
         // 不以邀请人数计算等级
         // if (inviter != null)
         // reComputeUserRank(inviter.getId());
         // 添加到队列
         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<ThreeSale> listFirstTeamQuery(long start, int count, Long uid, Integer state, String startTime,
         String endTime) {
      return threeSaleMapper.listFirstTeamQuery(start, count, uid, state, startTime, endTime);
   }
   @Override
   public long countFirstTeamQuery(Long uid, Integer state, String startTime, String endTime) {
      return threeSaleMapper.countFirstTeamQuery(uid, state, startTime, endTime);
   }
   @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);
   }
   @Override
   public long countSecondTeamQuery(Long uid, Integer state, String startTime, String endTime) {
      return threeSaleMapper.countSecondTeamQuery(uid, state, startTime, endTime);
   }
   @Override
   public List<ThreeSale> listSuperiorQuery(long start, int count, Integer state, Long uid) {
      return threeSaleMapper.listSuperiorQuery(start, count, state, uid);
   }
   @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
   public ThreeSale getMyBoss(Long uid) {
      return threeSaleMapper.getMyBoss(uid);
   }
   @Override
   public ThreeSale selectByPrimaryKey(Long id) {
      return threeSaleMapper.selectByPrimaryKey(id);
   }
   @Override
   public List<ThreeSale> listbyIdAndBossId(Long id, Long uid, Integer expire) {
      return threeSaleMapper.listbyIdAndBossId(id, uid, expire);
   }
   @Override
   public JSONObject getMyFirstTeam(long start, int count, Long uid, Integer state) {
      List<ThreeSale> list = threeSaleMapper.listFirstTeam(start, count, uid, state);
      if (list == null) {
         list = new ArrayList<ThreeSale>();
      }
      long countTotal = threeSaleMapper.countFirstTeam(uid, state);
      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);
      if (list == null) {
         list = new ArrayList<ThreeSale>();
      }
      long countTotal = threeSaleMapper.countSecondTeam(uid, state);
      return organizeTeam(countTotal, list);
   }
   public JSONObject organizeTeam(long count, List<ThreeSale> list) {
      JSONObject result = new JSONObject();
      JSONArray resultArray = new JSONArray();
      for (ThreeSale threeSale : list) {
         JSONObject object = new JSONObject();
         SimpleDateFormat sdf = new SimpleDateFormat("MM.dd HH:mm");
         SimpleDateFormat format = new SimpleDateFormat("yyyy.MM.dd HH:mm");
         SimpleDateFormat formatYears = new SimpleDateFormat("yyyy");
         Date todayTime = new Date();
         // 邀请id
         object.put("inviteId", threeSale.getId());
         // 加入队列时间
         Long createTime = threeSale.getCreateTime();
         Date inviteTime = new Date(createTime);
         object.put("inviteTime", format.format(inviteTime) + " 加入");
         String memoName = "";
         ThreeSaleExtraInfo threeSaleExtraInfo = threeSale.getThreeSaleExtraInfo();
         if (threeSaleExtraInfo != null) {
            if (!StringUtil.isNullOrEmpty(threeSaleExtraInfo.getNickname())) {
               memoName = threeSaleExtraInfo.getNickname();
            }
         }
         object.put("memoName", memoName);
         String nickName = "";
         String portrait = "";
         Long lastLoginTime = null;
         UserInfo worker = threeSale.getWorker();
         if (worker != null) {
            portrait = worker.getPortrait();
            lastLoginTime = worker.getLastLoginTime();
            nickName = worker.getNickName();
         }
         object.put("nickName", nickName);
         object.put("portrait", portrait);
         int state = 0;
         String fontColor1 = "#888888";
         String fontColor2 = "#F14242";
         JSONArray array = new JSONArray();
         if (threeSale.getState()) {
            state = 1;
            if (lastLoginTime == null) {
               lastLoginTime = threeSale.getCreateTime();
            }
            JSONObject contentJson = new JSONObject();
            contentJson.put("color", fontColor1);
            if (formatYears.format(todayTime).equals(formatYears.format(lastLoginTime))) {
               // 本年
               contentJson.put("content", "最近登录 " + sdf.format(lastLoginTime));
            } else {
               // 往年
               contentJson.put("content", "最近登录 " + format.format(lastLoginTime));
            }
            array.add(contentJson);
         } else if (threeSale.getExpire() != null
               && (threeSale.getExpire() == 1 || threeSale.getExpire().equals(1))) {
            state = 2;
            JSONObject contentJson = new JSONObject();
            contentJson.put("color", fontColor1);
            contentJson.put("content", "已经脱离邀请关系");
            array.add(contentJson);
         } else {
            state = 0;
            Calendar c = Calendar.getInstance();
            c.setTime(inviteTime);
            c.add(Calendar.DAY_OF_MONTH, 60);// 邀请不超过60天
            long days = (c.getTimeInMillis() - todayTime.getTime()) / (1000 * 3600 * 24);
            if (days < 0) {
               days = 0;
            }
            JSONObject contentJson1 = new JSONObject();
            contentJson1.put("color", fontColor1);
            contentJson1.put("content", "将于");
            JSONObject contentJson2 = new JSONObject();
            contentJson2.put("color", fontColor2);
            contentJson2.put("content", days + "天");
            JSONObject contentJson3 = new JSONObject();
            contentJson3.put("color", fontColor1);
            contentJson3.put("content", "后脱离邀请关系");
            array.add(contentJson1);
            array.add(contentJson2);
            array.add(contentJson3);
         }
         object.put("state", state);
         object.put("recentMsg", array);
         resultArray.add(object);
      }
      result.put("count", count);
      result.put("result_list", resultArray);
      return result;
   }
   @Override
   public List<ThreeSale> listByWorkerId(Long workerId) {
      return threeSaleMapper.listByWorkerId(workerId);
   }
   @Override
   public int getSuccessRelationshipNum(Long uid) {
      return threeSaleMapper.getSuccessRelationshipNum(uid);
   }
   @Override
   @Transactional(rollbackFor = Exception.class)
   public void bindInviteRelationship(Long workerId, Long bossId) throws ThreeSaleException {
      if (workerId == null || bossId == null)
         throw new ThreeSaleException(1, "用户信息为空");
      // 新建立确定关系
      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);
      // 邀请成功:消息、相关处理
      inviteSuccess(workerId, bossId);
   }
   /**
    * 邀请成功
    */
   @Transactional
   private void inviteSuccess(Long workerId, Long bossId) {
      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);
         producer.send(message);
      }
      executor.execute(new Runnable() {
         @Override
         public void run() {
            try { // 邀请金币
               integralGetService.addInviteLevelOne(bossId, workerId);
            } catch (Exception e) {
               e.printStackTrace();
            }
            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(bossId, boss.getNickName(),
                        invitee.getNickName(), invitee.getPortrait(), new Date());
               }
            } catch (Exception e) {
               e.printStackTrace();
            }
         }
      });
   }
   /**
    * 根据邀请者查询关系
    *
    * @param workerId
    * @return
    */
   @Override
   public ThreeSale getByWorkerId(Long workerId) {
      return threeSaleMapper.getByWorkerId(workerId);
   }
   @Override
   public long countSuccessFirstTeam(Long uid) {
      return threeSaleMapper.countFirstTeam(uid, 1);
   }
   @Override
   public ThreeSale selectByWorkerId(Long workerId) {
      return threeSaleMapper.selectSuccessByWorkerId(workerId);
   }
   @Override
   public ThreeSale getNearRelationByBossIdAndWorkerId(Long bossId, Long workerId) {
      return threeSaleMapper.getNearRelationByBossIdAndWorkerId(bossId, workerId);
   }
   @Override
   public List<ThreeSale> getSuccessByDate(Long bossId, Long minTime, Long maxTime) {
      return threeSaleMapper.getSuccessByDate(bossId, minTime, maxTime);
   }
   @Override
   public List<ThreeSale> listFirstTeam(long start, int count, Long uid, Integer state) {
      return threeSaleMapper.listFirstTeam(start, count, uid, state);
   }
   @Override
   public List<ThreeSale> listFirstTeamByUndeleted(long start, int count, Long uid) {
      return threeSaleMapper.listFirstTeamByUndeleted(start, count, uid);
   }
   @Override
   public long countFirstTeamByUndeleted(Long uid) {
      return threeSaleMapper.countFirstTeamByUndeleted(uid);
   }
   @Override
   public List<ThreeSale> listSecondTeamByUndeleted(long start, int count, Long uid) {
      return threeSaleMapper.listSecondTeamByUndeleted(start, count, uid);
   }
   @Override
   public long countSecondTeamByUndeleted(Long uid) {
      return threeSaleMapper.countSecondTeamByUndeleted(uid);
   }
   @Override
   public List<ThreeSale> listSecondTeam(long start, int count, Long uid, Integer state) {
      return threeSaleMapper.listSecondTeam(start, count, uid, state);
   }
   @Override
   public ThreeSale selectLatestByWorkerIdAndState(Long workerId, int state) {
      return threeSaleMapper.selectLatestByWorkerIdAndState(workerId, state);
   }
   @Override
   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 void remvoeBreak(Long id, Long uid, Long tid) {
      ThreeSale threeSale = threeSaleMapper.selectByPrimaryKey(id);
      if (threeSale == null) {
         return;
      }
      Long workerId = threeSale.getWorker().getId();
      if (tid.longValue() != workerId.longValue()) {
         return;
      }
      Integer expire = threeSale.getExpire();
      if (expire == ThreeSale.EXPIRE_NORMAL) {
         return;
      }
      int upExpire = expire;
      Long bossId = threeSale.getBoss().getId();
      if (bossId.longValue() == uid.longValue()) { // 直接粉丝
         if (expire == ThreeSale.EXPIRE_BREAK_VIP_DEL4) {
            upExpire = ThreeSale.EXPIRE_BREAK_VIP_DEL34;
         } else {
            upExpire = ThreeSale.EXPIRE_BREAK_VIP_DEL3;
         }
      } else { // 间接粉丝
         if (expire == ThreeSale.EXPIRE_BREAK_VIP_DEL3) {
            upExpire = ThreeSale.EXPIRE_BREAK_VIP_DEL34;
         } else {
            upExpire = ThreeSale.EXPIRE_BREAK_VIP_DEL4;
         }
      }
      ThreeSale update = new ThreeSale();
      update.setId(id);
      update.setExpire(upExpire);
      update.setUpdateTime(java.lang.System.currentTimeMillis());
      threeSaleMapper.updateByPrimaryKeySelective(update);
   }
}
package com.yeshi.fanli.service.impl.user.invite;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import javax.annotation.Resource;
import com.yeshi.fanli.entity.SystemEnum;
import com.yeshi.fanli.entity.SystemFunction;
import com.yeshi.fanli.util.SystemInfoUtil;
import org.springframework.context.annotation.Lazy;
import org.springframework.core.task.TaskExecutor;
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.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.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.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;
import net.sf.json.JSONArray;
import net.sf.json.JSONObject;
@Service
public class ThreeSaleSerivceImpl implements ThreeSaleSerivce {
    @Resource
    private UserInfoService userInfoService;
    @Resource
    private ThreeSaleMapper threeSaleMapper;
    @Resource
    private UserInviteMsgNotificationService userInviteMsgNotificationService;
    @Lazy
    @Resource
    private IntegralGetService integralGetService;
    @Lazy
    @Resource
    private TeamFansInfoService teamFansInfoService;
    @Resource(name = "taskExecutor")
    private TaskExecutor executor;
    @Resource
    private RocketMQManager rocketMQManager;
    public UserInfo getBoss(final long uid) {
        return threeSaleMapper.selectBoss(uid);
    }
    @Transactional(rollbackFor = Exception.class)
    public void bind(UserInfo worker, UserInfo inviter) throws ThreeSaleException {
        if (worker == null || inviter == null)
            throw new ThreeSaleException(1, "用户信息为空");
        //判断是否存在邀请权限
        SystemEnum system1 = userInfoService.getUserSystem(worker.getId());
        if (!SystemInfoUtil.hasFunctions(system1, SystemFunction.threeSale))
            throw new ThreeSaleException(2, "无法建立邀请关系");
        SystemEnum system2 = userInfoService.getUserSystem(inviter.getId());
        if (!SystemInfoUtil.hasFunctions(system2, SystemFunction.threeSale))
            throw new ThreeSaleException(2, "无法建立邀请关系");
        if (system1 != system2)
            throw new ThreeSaleException(2, "无法建立邀请关系");
        if (worker.getId() == null)// 该用户还不存在
        {
            // 保存用户
            UserInfo inviteeUser = userInfoService.addUser(worker, worker.getSystem());
            if (inviteeUser == null)
                throw new ThreeSaleException(2, "创建用户失败");
            // 保存关系
            ThreeSale threeSale = new ThreeSale();
            threeSale.setBoss(inviter);
            threeSale.setCreateTime(java.lang.System.currentTimeMillis());
            threeSale.setExpire(ThreeSale.EXPIRE_NORMAL);
            threeSale.setState(false);
            threeSale.setUpdateTime(java.lang.System.currentTimeMillis());
            threeSale.setWorker(inviteeUser);
            threeSaleMapper.insertSelective(threeSale);
        } else {// 是已经存在的用户
            if (worker.getId().longValue() == inviter.getId())
                throw new ThreeSaleException(4, "不能绑定自己");
            worker = userInfoService.selectByPKey(worker.getId());
            // 用户已经存在我们的用户库中
            if (worker.getLastLoginTime() == null || worker.getLastLoginTime() == 0L) {
                // 用户未登录
                int outOfDateCount = 0;// 过期数量
                // 查询邀请关系
                List<ThreeSale> list = listByWorkerId(worker.getId());
                if (list != null && list.size() > 0) {
                    for (ThreeSale ts : list) {
                        if (!ts.getState() && ts.getExpire() == ThreeSale.EXPIRE_BREAK) {
                            outOfDateCount++;
                        }
                    }
                    // 全部是失效状态
                    if (outOfDateCount == list.size()) {
                        // 可以确定关系
                        ThreeSale threeSale = new ThreeSale();
                        threeSale.setBoss(inviter);
                        threeSale.setCreateTime(java.lang.System.currentTimeMillis());
                        threeSale.setExpire(ThreeSale.EXPIRE_NORMAL);
                        threeSale.setState(false);
                        threeSale.setUpdateTime(java.lang.System.currentTimeMillis());
                        threeSale.setWorker(worker);
                        threeSaleMapper.insertSelective(threeSale);
                    } else {
                        // 还存在有效的邀请,则不做处理
                    }
                } else {
                    // 用户未登录,又不存在邀请关系,不做处理
                }
            } else {
                // 已经登录,而且没有上下级关系或者上下级关系未生效,则绑定关系
                List<ThreeSale> list = threeSaleMapper.listByWorkerId(worker.getId());
                // 删除无效的
                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_BREAK) {// 过期的
                            list.remove(i);
                            i--;
                        }
                    }
                // 查询上级是否有和现在上级一样的
                if (list == null || list.size() == 0)// 尚未确立关系,建立关系
                {
                    ThreeSale ts = new ThreeSale();
                    ts.setBoss(inviter);
                    ts.setCreateTime(System.currentTimeMillis());
                    ts.setExpire(ThreeSale.EXPIRE_NORMAL);
                    ts.setState(true);
                    ts.setSucceedTime(System.currentTimeMillis());
                    ts.setWorker(worker);
                    threeSaleMapper.insertSelective(ts);
                } else {
                    if (!list.get(0).getState() && list.get(0).getExpire() == ThreeSale.EXPIRE_NORMAL
                            && list.get(0).getBoss().getId() == inviter.getId().longValue()) {// 未生效的上级和现在上级一样就生效
                        ThreeSale update = new ThreeSale(list.get(0).getId());
                        update.setState(true);
                        update.setSucceedTime(System.currentTimeMillis());
                        threeSaleMapper.updateByPrimaryKeySelective(update);
                    }
                }
            }
        }
    }
    @Transactional
    public void effective(UserInfo worker) {
        List<ThreeSale> list = threeSaleMapper.listByWorkerId(worker.getId());
        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_NORMAL) {
                    ;
                } else {
                    list.remove(i);
                    i--;
                }
            }
        if (list.size() > 0) {
            ThreeSale oldSale = list.get(0);
            ThreeSale update = new ThreeSale(list.get(0).getId());
            update.setState(true);
            update.setSucceedTime(System.currentTimeMillis());
            threeSaleMapper.updateByPrimaryKeySelective(update);
            oldSale.setState(update.getState());
            oldSale.setSucceedTime(update.getSucceedTime());
            // 不以邀请人数计算等级
            // if (inviter != null)
            // reComputeUserRank(inviter.getId());
            // 添加到队列
            inviteSuccess(worker.getId(), oldSale.getBoss().getId());
        }
    }
    @Override
    public List<ThreeSale> listFirstTeamQuery(long start, int count, Long uid, Integer state, String startTime,
                                              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, 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, Integer validState) {
        return threeSaleMapper.listSecondTeamQuery(start, count, uid, state, startTime, endTime, validState);
    }
    @Override
    public long countSecondTeamQuery(Long uid, Integer state, String startTime, String endTime, Integer validState) {
        return threeSaleMapper.countSecondTeamQuery(uid, state, startTime, endTime, validState);
    }
    @Override
    public List<ThreeSale> listSuperiorQuery(long start, int count, Integer state, Long uid) {
        return threeSaleMapper.listSuperiorQuery(start, count, state, uid);
    }
    @Override
    public long countSuperiorQuery(Integer state, Long uid) {
        return threeSaleMapper.countSuperiorQuery(state, uid);
    }
    @Override
    public ThreeSale getMyBoss(Long uid) {
        return threeSaleMapper.getMyBoss(uid);
    }
    @Override
    public ThreeSale selectByPrimaryKey(Long id) {
        return threeSaleMapper.selectByPrimaryKey(id);
    }
    @Override
    public List<ThreeSale> listbyIdAndBossId(Long id, Long uid, Integer expire) {
        return threeSaleMapper.listbyIdAndBossId(id, uid, expire);
    }
    @Override
    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, null);
        return organizeTeam(countTotal, list);
    }
    @Override
    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, null);
        return organizeTeam(countTotal, list);
    }
    public JSONObject organizeTeam(long count, List<ThreeSale> list) {
        JSONObject result = new JSONObject();
        JSONArray resultArray = new JSONArray();
        for (ThreeSale threeSale : list) {
            JSONObject object = new JSONObject();
            SimpleDateFormat sdf = new SimpleDateFormat("MM.dd HH:mm");
            SimpleDateFormat format = new SimpleDateFormat("yyyy.MM.dd HH:mm");
            SimpleDateFormat formatYears = new SimpleDateFormat("yyyy");
            Date todayTime = new Date();
            // 邀请id
            object.put("inviteId", threeSale.getId());
            // 加入队列时间
            Long createTime = threeSale.getCreateTime();
            Date inviteTime = new Date(createTime);
            object.put("inviteTime", format.format(inviteTime) + " 加入");
            String memoName = "";
            ThreeSaleExtraInfo threeSaleExtraInfo = threeSale.getThreeSaleExtraInfo();
            if (threeSaleExtraInfo != null) {
                if (!StringUtil.isNullOrEmpty(threeSaleExtraInfo.getNickname())) {
                    memoName = threeSaleExtraInfo.getNickname();
                }
            }
            object.put("memoName", memoName);
            String nickName = "";
            String portrait = "";
            Long lastLoginTime = null;
            UserInfo worker = threeSale.getWorker();
            if (worker != null) {
                portrait = worker.getPortrait();
                lastLoginTime = worker.getLastLoginTime();
                nickName = worker.getNickName();
            }
            object.put("nickName", nickName);
            object.put("portrait", portrait);
            int state = 0;
            String fontColor1 = "#888888";
            String fontColor2 = "#F14242";
            JSONArray array = new JSONArray();
            if (threeSale.getState()) {
                state = 1;
                if (lastLoginTime == null) {
                    lastLoginTime = threeSale.getCreateTime();
                }
                JSONObject contentJson = new JSONObject();
                contentJson.put("color", fontColor1);
                if (formatYears.format(todayTime).equals(formatYears.format(lastLoginTime))) {
                    // 本年
                    contentJson.put("content", "最近登录 " + sdf.format(lastLoginTime));
                } else {
                    // 往年
                    contentJson.put("content", "最近登录 " + format.format(lastLoginTime));
                }
                array.add(contentJson);
            } else if (threeSale.getExpire() != null
                    && (threeSale.getExpire() == 1 || threeSale.getExpire().equals(1))) {
                state = 2;
                JSONObject contentJson = new JSONObject();
                contentJson.put("color", fontColor1);
                contentJson.put("content", "已经脱离邀请关系");
                array.add(contentJson);
            } else {
                state = 0;
                Calendar c = Calendar.getInstance();
                c.setTime(inviteTime);
                c.add(Calendar.DAY_OF_MONTH, 60);// 邀请不超过60天
                long days = (c.getTimeInMillis() - todayTime.getTime()) / (1000 * 3600 * 24);
                if (days < 0) {
                    days = 0;
                }
                JSONObject contentJson1 = new JSONObject();
                contentJson1.put("color", fontColor1);
                contentJson1.put("content", "将于");
                JSONObject contentJson2 = new JSONObject();
                contentJson2.put("color", fontColor2);
                contentJson2.put("content", days + "天");
                JSONObject contentJson3 = new JSONObject();
                contentJson3.put("color", fontColor1);
                contentJson3.put("content", "后脱离邀请关系");
                array.add(contentJson1);
                array.add(contentJson2);
                array.add(contentJson3);
            }
            object.put("state", state);
            object.put("recentMsg", array);
            resultArray.add(object);
        }
        result.put("count", count);
        result.put("result_list", resultArray);
        return result;
    }
    @Override
    public List<ThreeSale> listByWorkerId(Long workerId) {
        return threeSaleMapper.listByWorkerId(workerId);
    }
    @Override
    public int getSuccessRelationshipNum(Long uid) {
        return threeSaleMapper.getSuccessRelationshipNum(uid);
    }
    @Override
    @Transactional(rollbackFor = Exception.class)
    public void bindInviteRelationship(Long workerId, Long bossId) throws ThreeSaleException {
        if (workerId == null || bossId == null)
            throw new ThreeSaleException(1, "用户信息为空");
        //判断是否存在邀请权限
        SystemEnum system1 = userInfoService.getUserSystem(workerId);
        if (!SystemInfoUtil.hasFunctions(system1, SystemFunction.threeSale))
            throw new ThreeSaleException(2, "无法建立邀请关系");
        SystemEnum system2 = userInfoService.getUserSystem(bossId);
        if (!SystemInfoUtil.hasFunctions(system2, SystemFunction.threeSale))
            throw new ThreeSaleException(2, "无法建立邀请关系");
        if (system1 != system2)
            throw new ThreeSaleException(2, "无法建立邀请关系");
        // 新建立确定关系
        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);
        // 邀请成功:消息、相关处理
        inviteSuccess(workerId, bossId);
    }
    /**
     * 邀请成功
     */
    @Transactional
    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);
            rocketMQManager.sendNormalMsg(message, 5000L, null);
        }
        executor.execute(new Runnable() {
            @Override
            public void run() {
                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);
                }
            }
        });
    }
    /**
     * 根据邀请者查询关系
     *
     * @param workerId
     * @return
     */
    @Override
    public ThreeSale getByWorkerId(Long workerId) {
        return threeSaleMapper.getByWorkerId(workerId);
    }
    @Override
    public ThreeSale selectByWorkerId(Long workerId) {
        return threeSaleMapper.selectSuccessByWorkerId(workerId);
    }
    @Override
    public ThreeSale getNearRelationByBossIdAndWorkerId(Long bossId, Long workerId) {
        return threeSaleMapper.getNearRelationByBossIdAndWorkerId(bossId, workerId);
    }
    @Override
    public List<ThreeSale> getSuccessByDate(Long bossId, Long minTime, Long maxTime) {
        return threeSaleMapper.getSuccessByDate(bossId, minTime, maxTime);
    }
    @Override
    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) {
        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
    public ThreeSale selectLatestByWorkerIdAndState(Long workerId, int state) {
        return threeSaleMapper.selectLatestByWorkerIdAndState(workerId, state);
    }
    @Override
    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();
    }
}