Explorar o código

优化护工和管理老师强制登出逻辑

baifucheng hai 2 meses
pai
achega
b0efa54418

+ 18 - 0
ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/ApiTokenService.java

@@ -3,6 +3,7 @@ package com.ruoyi.framework.web.service;
 import java.util.Date;
 import java.util.HashMap;
 import java.util.Map;
+import java.util.Set;
 import java.util.concurrent.TimeUnit;
 import java.util.function.Function;
 
@@ -24,6 +25,7 @@ import com.ruoyi.user.domain.model.UserCacheInfo;
 import com.ruoyi.user.domain.vo.UserVo;
 import com.ruoyi.user.service.IUserService;
 
+import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.date.DateUtil;
 import cn.hutool.json.JSONUtil;
 import io.jsonwebtoken.Claims;
@@ -76,6 +78,22 @@ public class ApiTokenService {
         stringRedisTemplate.opsForSet().remove(Constants.JWT_ONLINE_USER_TOKEN + user.getId(), token);
     }
 
+    /**
+     * 根据手机号强制登出用户
+     *
+     * @param mobile
+     */
+    public void forcedLogoutByMobile(String mobile) {
+        // 获取护工对应的用户id
+        User user = userService.loadByMobile(mobile, true);
+        Set<String> tokens = stringRedisTemplate.opsForSet().members(Constants.JWT_ONLINE_USER_TOKEN + user.getId());
+        if (CollUtil.isNotEmpty(tokens)) {
+            for (String token : tokens) {
+                removeToken(token);
+            }
+        }
+    }
+
     /**
      * 生成小程序token
      *

+ 14 - 18
ruoyi-info/ruoyi-info-biz/src/main/java/com/ruoyi/info/management/service/impl/ManagementTeacherServiceImpl.java

@@ -2,11 +2,9 @@ package com.ruoyi.info.management.service.impl;
 
 import java.util.ArrayList;
 import java.util.Collection;
-import java.util.Collections;
 import java.util.Date;
 import java.util.List;
 import java.util.Map;
-import java.util.Set;
 
 import javax.annotation.Resource;
 
@@ -18,7 +16,6 @@ import org.springframework.transaction.annotation.Transactional;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
-import com.ruoyi.common.constant.Constants;
 import com.ruoyi.common.core.domain.PageQuery;
 import com.ruoyi.common.core.page.TableDataInfo;
 import com.ruoyi.common.exception.ServiceException;
@@ -39,7 +36,6 @@ import com.ruoyi.info.management.service.IManagementTeacherService;
 import com.ruoyi.info.management.service.ITeacherDepartmentRelService;
 import com.ruoyi.info.nursing.domain.bo.EnableStatusBo;
 import com.ruoyi.info.nursing.enums.EnableStatusEnum;
-import com.ruoyi.user.domain.User;
 import com.ruoyi.user.service.IUserService;
 
 import cn.hutool.core.bean.BeanUtil;
@@ -69,16 +65,10 @@ public class ManagementTeacherServiceImpl implements IManagementTeacherService {
 
     private final ITeacherDepartmentRelService teacherDepartmentRelService;
 
-    private final StringRedisTemplate stringRedisTemplate;
-
     @Lazy
     @Resource
     private ApiTokenService apiTokenService;
 
-    @Lazy
-    @Resource
-    private IUserService iUserService;
-
     /**
      * 查询管理老师信息分页
      *
@@ -184,6 +174,8 @@ public class ManagementTeacherServiceImpl implements IManagementTeacherService {
         validEntityBeforeSave(bo);
 
         ManagementTeacher managementTeacher = baseMapper.selectById(bo.getId());
+        String currentStatus = managementTeacher.getEnableStatus();
+        String currentMobile = managementTeacher.getPhoneNumber();
         if (ObjectUtil.isEmpty(managementTeacher)) {
             throw new ServiceException(ManagementTeacherExceptionEnum.MANAGEMENT_TEACHER_IS_NOT_EXISTS);
         }
@@ -202,6 +194,13 @@ public class ManagementTeacherServiceImpl implements IManagementTeacherService {
                 h -> new TeacherDepartmentRel(bo.getId(), h.getHospitalId(), h.getId())) ;
             teacherDepartmentRelMapper.insertBatch(teacherDepartmentRelSaveList);
         }
+
+        // 如果状态从启用变为了禁用,则强制踢出该护工的登录状态
+        if ((StringUtils.equals(currentStatus, EnableStatusEnum.ENABLE.getKey()) && StringUtils.equals(bo.getEnableStatus(), EnableStatusEnum.FORBIDDEN.getKey()))
+            || !StringUtils.equals(currentMobile, bo.getPhoneNumber())) {
+            apiTokenService.forcedLogoutByMobile(currentMobile);
+        }
+
         return true;
     }
 
@@ -242,6 +241,7 @@ public class ManagementTeacherServiceImpl implements IManagementTeacherService {
         if(isValid){
             //TODO 做一些业务上的校验,判断是否需要校验
         }
+        List<ManagementTeacher> managementTeachers = baseMapper.selectBatchIds(ids);
         baseMapper.deleteBatchIds(ids);
 
         for (Long id : ids) {
@@ -249,6 +249,9 @@ public class ManagementTeacherServiceImpl implements IManagementTeacherService {
             List<TeacherDepartmentRel> teacherDepartmentRelDBList = teacherDepartmentRelService.queryByTeacherId(id);
             teacherDepartmentRelMapper.deleteBatchIds(convertSet(teacherDepartmentRelDBList, TeacherDepartmentRel::getId));
         }
+
+        // 强制踢出管理老师
+        managementTeachers.forEach(managementTeacher -> apiTokenService.forcedLogoutByMobile(managementTeacher.getPhoneNumber()));
         return true;
     }
 
@@ -267,14 +270,7 @@ public class ManagementTeacherServiceImpl implements IManagementTeacherService {
 
         // 如果是禁用状态 则需要强制踢出小程序端的登录用户
         if (EnableStatusEnum.isForbidden(bo.getEnableStatus())) {
-            // 获取护工对应的用户id
-            User user = iUserService.loadByMobile(managementTeacher.getPhoneNumber(), true);
-            Set<String> tokens = stringRedisTemplate.opsForSet().members(Constants.JWT_ONLINE_USER_TOKEN + user.getId());
-            if (CollUtil.isNotEmpty(tokens)) {
-                for (String token : tokens) {
-                    apiTokenService.removeToken(token);
-                }
-            }
+            apiTokenService.forcedLogoutByMobile(managementTeacher.getPhoneNumber());
         }
     }
 

+ 17 - 13
ruoyi-info/ruoyi-info-biz/src/main/java/com/ruoyi/info/nursing/service/impl/NursingWorkerServiceImpl.java

@@ -66,11 +66,6 @@ public class NursingWorkerServiceImpl implements INursingWorkerService {
     @Resource
     private ApiTokenService apiTokenService;
 
-    @Lazy
-    @Resource
-    private IUserService iUserService;
-
-    private final StringRedisTemplate stringRedisTemplate;
 
     /**
      * 查询护工信息分页
@@ -184,6 +179,9 @@ public class NursingWorkerServiceImpl implements INursingWorkerService {
     @Override
     public Boolean updateByBo(NursingWorkerBo bo) {
         NursingWorker nursingWorker = baseMapper.selectById(bo.getId());
+        String currentStatus = nursingWorker.getEnableStatus();    // 护工当前状态
+        String currentMobile = nursingWorker.getPhoneNumber();     // 护工当前手机号
+
         NursingWorker update = BeanCopyUtils.copy(bo, nursingWorker);
         validEntityBeforeSave(update);
 
@@ -201,9 +199,16 @@ public class NursingWorkerServiceImpl implements INursingWorkerService {
             List<NursingCertificate> nursingCertificateList = BeanCopyUtils.copyList(bo.getNursingCertificateList(), NursingCertificate.class);
             nursingCertificateMapper.insertBatch(nursingCertificateList);
         }
+
+        // 如果从启用变为禁用,或手机号被更改,则强制踢出小程序该护工的登录状态
+        if ((StringUtils.equals(currentStatus, EnableStatusEnum.ENABLE.getKey()) && StringUtils.equals(bo.getEnableStatus(), EnableStatusEnum.FORBIDDEN.getKey()))
+            || !StringUtils.equals(currentMobile, bo.getPhoneNumber())) {
+            apiTokenService.forcedLogoutByMobile(currentMobile);
+        }
         return true;
     }
 
+
     /**
      * 保存前的数据校验
      *
@@ -225,12 +230,18 @@ public class NursingWorkerServiceImpl implements INursingWorkerService {
         if(isValid){
             //TODO 做一些业务上的校验,判断是否需要校验
         }
+        // 查询选中的护工信息
+        List<NursingWorker> nursingWorkers = baseMapper.selectBatchIds(ids);
+
         baseMapper.deleteBatchIds(ids);
 
         for (Long id : ids) {
             // 删除从业证书信息
             nursingCertificateService.deleteByWorkerId(id);
         }
+
+        // 强制登出护工
+        nursingWorkers.forEach(nursingWorker -> apiTokenService.forcedLogoutByMobile(nursingWorker.getPhoneNumber()));
         return true;
     }
 
@@ -245,14 +256,7 @@ public class NursingWorkerServiceImpl implements INursingWorkerService {
 
         // 如果是禁用状态 则需要强制踢出小程序端的登录用户
         if (EnableStatusEnum.isForbidden(bo.getEnableStatus())) {
-            // 获取护工对应的用户id
-            User user = iUserService.loadByMobile(nursingWorker.getPhoneNumber(), true);
-            Set<String> tokens = stringRedisTemplate.opsForSet().members(Constants.JWT_ONLINE_USER_TOKEN + user.getId());
-            if (CollUtil.isNotEmpty(tokens)) {
-                for (String token : tokens) {
-                    apiTokenService.removeToken(token);
-                }
-            }
+            apiTokenService.forcedLogoutByMobile(nursingWorker.getPhoneNumber());
         }
     }