content: package com.ruoyi.system.service.impl;
  
  import java.io.Serializable;
  import java.util.Date;
  import java.util.Deque;
  import java.util.List;
  import org.apache.shiro.cache.Cache;
  import org.apache.shiro.cache.ehcache.EhCacheManager;
  import org.springframework.beans.factory.annotation.Autowired;
  import org.springframework.stereotype.Service;
  import com.ruoyi.common.constant.ShiroConstants;
  import com.ruoyi.common.utils.DateUtils;
  import com.ruoyi.common.utils.StringUtils;
  import com.ruoyi.system.domain.SysUserOnline;
  import com.ruoyi.system.mapper.SysUserOnlineMapper;
  import com.ruoyi.system.service.ISysUserOnlineService;
  
  /**
   * 在线用户 服务层处理
   * 
   * @author ruoyi
   */
  @Service
  public class SysUserOnlineServiceImpl implements ISysUserOnlineService
  {
      @Autowired
      private SysUserOnlineMapper userOnlineDao;
      
      @Autowired
      private EhCacheManager ehCacheManager;
  
      /**
       * 通过会话序号查询信息
       * 
       * @param sessionId 会话ID
       * @return 在线用户信息
       */
      @Override
      public SysUserOnline selectOnlineById(String sessionId)
      {
          return userOnlineDao.selectOnlineById(sessionId);
      }
  
      /**
       * 通过会话序号删除信息
       * 
       * @param sessionId 会话ID
       * @return 在线用户信息
       */
      @Override
      public void deleteOnlineById(String sessionId)
      {
          SysUserOnline userOnline = selectOnlineById(sessionId);
          if (StringUtils.isNotNull(userOnline))
          {
              userOnlineDao.deleteOnlineById(sessionId);
          }
      }
  
      /**
       * 通过会话序号删除信息
       * 
       * @param sessions 会话ID集合
       * @return 在线用户信息
       */
      @Override
      public void batchDeleteOnline(List<String> sessions)
      {
          for (String sessionId : sessions)
          {
              SysUserOnline userOnline = selectOnlineById(sessionId);
              if (StringUtils.isNotNull(userOnline))
              {
                  userOnlineDao.deleteOnlineById(sessionId);
              }
          }
      }
  
      /**
       * 保存会话信息
       * 
       * @param online 会话信息
       */
      @Override
      public void saveOnline(SysUserOnline online)
      {
          userOnlineDao.saveOnline(online);
      }
  
      /**
       * 查询会话集合
       * 
       * @param userOnline 在线用户
       */
      @Override
      public List<SysUserOnline> selectUserOnlineList(SysUserOnline userOnline)
      {
          return userOnlineDao.selectUserOnlineList(userOnline);
      }
  
      /**
       * 强退用户
       * 
       * @param sessionId 会话ID
       */
      @Override
      public void forceLogout(String sessionId)
      {
          userOnlineDao.deleteOnlineById(sessionId);
      }
  
      /**
       * 清理用户缓存
       * 
       * @param loginName 登录名称
       * @param sessionId 会话ID
       */
      @Override
      public void removeUserCache(String loginName, String sessionId)
      {
          Cache<String, Deque<Serializable>> cache = ehCacheManager.getCache(ShiroConstants.SYS_USERCACHE);
          Deque<Serializable> deque = cache.get(loginName);
          if (StringUtils.isEmpty(deque) || deque.size() == 0)
          {
              return;
          }
          deque.remove(sessionId);
      }
  
      /**
       * 查询会话集合
       * 
       * @param expiredDate 失效日期
       */
      @Override
      public List<SysUserOnline> selectOnlineByExpired(Date expiredDate)
      {
          String lastAccessTime = DateUtils.parseDateToStr(DateUtils.YYYY_MM_DD_HH_MM_SS, expiredDate);
          return userOnlineDao.selectOnlineByExpired(lastAccessTime);
      }
  }
  