فهرست منبع

add 多权限体系

18339543638 3 سال پیش
والد
کامیت
5f65c9300e
31فایلهای تغییر یافته به همراه306 افزوده شده و 53 حذف شده
  1. 2 2
      nb-admin/src/main/java/com/nb/admin/controller/monitor/OnlineUserController.java
  2. 1 1
      nb-admin/src/main/resources/application.yml
  3. 5 0
      nb-auth/pom.xml
  4. 2 0
      nb-auth/src/main/java/com/nb/auth/bean/AuthInfo.java
  5. 3 0
      nb-auth/src/main/java/com/nb/auth/bean/LoginUser.java
  6. 6 4
      nb-auth/src/main/java/com/nb/auth/controller/AuthController.java
  7. 28 0
      nb-auth/src/main/java/com/nb/auth/enums/StpTypeEnum.java
  8. 6 0
      nb-auth/src/main/java/com/nb/auth/sa/SaConfig.java
  9. 3 1
      nb-auth/src/main/java/com/nb/auth/sa/SaTokenConfig.java
  10. 17 5
      nb-auth/src/main/java/com/nb/auth/utils/SecurityUtil.java
  11. 1 1
      nb-common/log-common/src/main/java/com/nb/common/log/aop/LogAspect.java
  12. 0 2
      nb-core/src/main/java/com/nb/core/cache/manager/ClusterStorageManager.java
  13. 11 0
      nb-service-api/web-service-api/src/main/java/com/nb/web/api/feign/IPatientClient.java
  14. 29 0
      nb-service-api/web-service-api/src/main/java/com/nb/web/api/feign/result/InviteCodeResult.java
  15. 2 1
      nb-service/app-assistant/src/main/java/com/nb/app/assistant/controller/base/AppAssistantBaseCrudController.java
  16. 4 3
      nb-service/app-doctor/src/main/java/com/nb/app/doctor/auth/AppDoctorAuthGranter.java
  17. 1 3
      nb-service/app-doctor/src/main/java/com/nb/app/doctor/auth/AppDoctorUserAccountOperator.java
  18. 0 12
      nb-service/app-doctor/src/main/java/com/nb/app/doctor/constant/StpConstant.java
  19. 12 0
      nb-service/app-doctor/src/main/java/com/nb/app/doctor/controller/PatientMonitorController.java
  20. 2 2
      nb-service/app-doctor/src/main/java/com/nb/app/doctor/controller/base/AppDoctorBaseCrudController.java
  21. 22 0
      nb-service/app-doctor/src/main/java/com/nb/app/doctor/controller/vo/InviteCodeVo.java
  22. 1 1
      nb-service/web-service/src/main/java/com/nb/web/service/bus/controller/BusDeviceHistoryController.java
  23. 46 0
      nb-service/web-service/src/main/java/com/nb/web/service/bus/service/LocalBusPatientService.java
  24. 81 0
      nb-service/web-service/src/main/java/com/nb/web/service/bus/utils/PatientInviteCodeUtil.java
  25. 2 1
      nb-service/web-service/src/main/java/com/nb/web/service/bus/utils/WsPublishUtils.java
  26. 4 2
      nb-service/web-service/src/main/java/com/nb/web/service/system/auth/ApplyAuthGranter.java
  27. 1 1
      nb-service/web-service/src/main/java/com/nb/web/service/system/auth/DefaultAccountOperator.java
  28. 5 4
      nb-service/web-service/src/main/java/com/nb/web/service/system/auth/WebAuthGranter.java
  29. 4 3
      nb-service/web-service/src/main/java/com/nb/web/service/system/controller/SysConfigController.java
  30. 3 2
      nb-service/web-service/src/main/java/com/nb/web/service/system/service/impl/SysRoleServiceImpl.java
  31. 2 2
      nb-service/web-service/src/main/java/com/nb/web/service/system/service/impl/SysUserServiceImpl.java

+ 2 - 2
nb-admin/src/main/java/com/nb/admin/controller/monitor/OnlineUserController.java

@@ -40,11 +40,11 @@ public class OnlineUserController {
     @SaCheckPermission("monitor:online:page")
     @Log(title = "在线用户分页查询")
     public R page(Page reqPage, String username, String userPlatform) {
-        List<String> keys = StpUtil.searchTokenValue("", -1, 0);
+        List<String> keys = SecurityUtil.getStpLogic().searchTokenValue("", -1, 0);
         List<LoginUser> loginUserList = Lists.newArrayList();
         for (String key : keys) {
             // token sample, Authorization:login:token:8734da0866f4440daeea3d836d5ecf8c
-            String tokenValue = CharSequenceUtil.subAfter(key, StpUtil.getTokenName() + ":" + StpUtil.TYPE + ":token:", true);
+            String tokenValue = CharSequenceUtil.subAfter(key, SecurityUtil.getStpLogic().getTokenName() + ":" + StpUtil.TYPE + ":token:", true);
             LoginUser item =   SecurityUtil.getLoginUser(tokenValue);
             if (CharSequenceUtil.isNotBlank(username) && CharSequenceUtil.isNotBlank(userPlatform)) {
                 if (CharSequenceUtil.contains(item.getUsername(), username) && item.getUserPlatform().equals(userPlatform)) {

+ 1 - 1
nb-admin/src/main/resources/application.yml

@@ -77,7 +77,7 @@ mybatis-plus:
       logic-not-delete-value: 0
       logic-delete-value: 1
   configuration:
-    log-impl: org.apache.ibatis.logging.nologging.NoLoggingImpl
+    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
     default-enum-type-handler: com.baomidou.mybatisplus.core.handlers.MybatisEnumTypeHandler
   type-aliases-package: com.nb.bus.entity
 

+ 5 - 0
nb-auth/pom.xml

@@ -37,6 +37,11 @@
             <artifactId>spring-boot-starter-test</artifactId>
             <scope>provided</scope>
         </dependency>
+        <dependency>
+            <groupId>com.baomidou</groupId>
+            <artifactId>mybatis-plus-boot-starter</artifactId>
+            <scope>provided</scope>
+        </dependency>
         <dependency>
             <groupId>com.github.xiaoymin</groupId>
             <artifactId>knife4j-spring-boot-starter</artifactId>

+ 2 - 0
nb-auth/src/main/java/com/nb/auth/bean/AuthInfo.java

@@ -26,4 +26,6 @@ public class AuthInfo {
     private GrantTypeEnum grantType;
     @ApiModelProperty("令牌失效时间")
     private long activityTimeout;
+    @ApiModelProperty("权限体系名称")
+    private String loginType;
 }

+ 3 - 0
nb-auth/src/main/java/com/nb/auth/bean/LoginUser.java

@@ -2,6 +2,7 @@ package com.nb.auth.bean;
 
 import com.fasterxml.jackson.annotation.JsonFormat;
 import com.nb.auth.enums.GrantTypeEnum;
+import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 
 import java.io.Serializable;
@@ -76,6 +77,8 @@ public class LoginUser<T> implements Serializable {
      */
     private List<SysRoleInfo> roles;
 
+    @ApiModelProperty("权限体系名称")
+    private String loginType;
 
     private T tenantId;
 

+ 6 - 4
nb-auth/src/main/java/com/nb/auth/controller/AuthController.java

@@ -4,6 +4,7 @@ import com.nb.auth.bean.AuthInfo;
 import com.nb.auth.bean.LoginUser;
 import com.nb.auth.granter.IAuthGranter;
 import com.nb.auth.granter.TokenParameter;
+import com.nb.auth.utils.SecurityUtil;
 import com.nb.core.exception.CustomException;
 import com.nb.core.result.R;
 import io.swagger.annotations.Api;
@@ -56,6 +57,7 @@ public class AuthController {
         return R.success(AuthInfo.builder()
                 .activityTimeout(activityTimeout)
                 .grantType(req.getGrantType())
+                .loginType(grant.getLoginType())
                 .token(grant.getToken())
                 .build());
     }
@@ -66,11 +68,11 @@ public class AuthController {
     @ApiOperation("刷新token时间")
     @GetMapping("/refresh")
     public R getTime() {
-        if (StpUtil.isLogin()) {
+        if (SecurityUtil.getStpLogic().isLogin()) {
             try {
-                StpUtil.checkActivityTimeout();
+                SecurityUtil.getStpLogic().checkActivityTimeout();
                 //手动续签
-                StpUtil.updateLastActivityToNow();
+                SecurityUtil.getStpLogic().updateLastActivityToNow();
             }catch (Exception e){
 
             }
@@ -82,7 +84,7 @@ public class AuthController {
     @ApiOperation("用户登出")
     @PostMapping("/logout")
     public R logout() {
-        StpUtil.logout();
+        SecurityUtil.getStpLogic().logout();
         return R.success();
     }
 }

+ 28 - 0
nb-auth/src/main/java/com/nb/auth/enums/StpTypeEnum.java

@@ -0,0 +1,28 @@
+package com.nb.auth.enums;
+
+import com.baomidou.mybatisplus.annotation.IEnum;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+/**
+ * @author lifang
+ * @version 1.0.0
+ * @ClassName StpConstant.java
+ * @Description TODO
+ * @createTime 2022年08月09日 22:00:00
+ */
+@Getter
+@AllArgsConstructor
+@JsonFormat(shape = JsonFormat.Shape.OBJECT)
+public enum  StpTypeEnum implements IEnum<Integer> {
+    DEFAULT(1,"默认登录体系","login"),
+    APP_DOCTOR(2,"app医生端登录体系","app_doctor"),
+    ASSISTANT(3,"疼痛小助手登录体系","assistant")
+    ;
+
+    private Integer value;
+    private String desc;
+    private String text;
+}
+

+ 6 - 0
nb-auth/src/main/java/com/nb/auth/sa/SaConfig.java

@@ -2,6 +2,8 @@ package com.nb.auth.sa;
 
 import cn.dev33.satoken.SaManager;
 import cn.dev33.satoken.dao.SaTokenDaoRedisJackson;
+import cn.dev33.satoken.stp.StpLogic;
+import com.nb.auth.enums.StpTypeEnum;
 import lombok.AllArgsConstructor;
 import org.springframework.stereotype.Component;
 
@@ -22,5 +24,9 @@ public class SaConfig {
     public void init(){
         SaManager.setSaTokenAction(new SaTokenActionDefaultImpl());
         SaManager.setSaTokenDao(saTokenDaoRedisJackson);
+        StpTypeEnum[] values = StpTypeEnum.values();
+        for (StpTypeEnum value : values) {
+            SaManager.putStpLogic(new StpLogic(value.getText()));
+        }
     }
 }

+ 3 - 1
nb-auth/src/main/java/com/nb/auth/sa/SaTokenConfig.java

@@ -3,6 +3,7 @@ package com.nb.auth.sa;
 import cn.dev33.satoken.interceptor.SaRouteInterceptor;
 import cn.dev33.satoken.router.SaRouter;
 import cn.dev33.satoken.stp.StpUtil;
+import com.nb.auth.utils.SecurityUtil;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
@@ -27,7 +28,8 @@ public class SaTokenConfig {
         return new SaRouteInterceptor((req, res, handler) -> {
             SaRouter.match("/**")
                     .notMatch(IGNORE_URL)
-                    .check(StpUtil::checkLogin);
+                    .check(__-> SecurityUtil.getStpLogic().checkLogin());
+//                    .check(StpUtil::checkLogin);
         });
     }
     private static final List<String> IGNORE_URL = new ArrayList<>();

+ 17 - 5
nb-auth/src/main/java/com/nb/auth/utils/SecurityUtil.java

@@ -3,11 +3,12 @@ package com.nb.auth.utils;
 import cn.dev33.satoken.SaManager;
 import cn.dev33.satoken.secure.BCrypt;
 import cn.dev33.satoken.spring.SpringMVCUtil;
-import cn.dev33.satoken.stp.StpUtil;
-//import cn.hutool.crypto.digest.BCrypt;
+import cn.dev33.satoken.stp.StpLogic;
+import cn.hutool.core.util.StrUtil;
 import com.nb.auth.bean.LoginUser;
 import com.nb.auth.enums.GrantTypeEnum;
 
+import javax.servlet.http.HttpServletRequest;
 import java.util.Objects;
 
 /**
@@ -30,7 +31,7 @@ public class SecurityUtil {
      **/
     public static LoginUser getLoginUser(String authorization) {
         try {
-            return (LoginUser) StpUtil.getTokenSessionByToken(authorization).get(LOGIN_USER_KEY);
+            return (LoginUser) getStpLogic().getTokenSessionByToken(authorization).get(LOGIN_USER_KEY);
         } catch (Exception ex) {
             return null;
         }
@@ -41,7 +42,8 @@ public class SecurityUtil {
      **/
     public static LoginUser getLoginUser() {
         try {
-            return (LoginUser) StpUtil.getTokenSession().get(LOGIN_USER_KEY);
+
+            return (LoginUser) getStpLogic().getTokenSession().get(LOGIN_USER_KEY);
         } catch (Exception ex) {
             return null;
         }
@@ -51,7 +53,7 @@ public class SecurityUtil {
      * 获取用户
      **/
     public static void  setLogin(LoginUser loginUser) {
-        StpUtil.getTokenSession().set(LOGIN_USER_KEY,loginUser);
+        getStpLogic().getTokenSession().set(LOGIN_USER_KEY,loginUser);
     }
 
     public static boolean isSys(){
@@ -120,4 +122,14 @@ public class SecurityUtil {
     public static Object getId() {
         return getLoginUser().getId();
     }
+
+
+    public static StpLogic getStpLogic(){
+        HttpServletRequest request = SpringMVCUtil.getRequest();
+        String header = request.getHeader("Login-Type");
+        if(StrUtil.isNullOrUndefined(header)){
+            header="";
+        }
+        return SaManager.getStpLogic(header);
+    }
 }

+ 1 - 1
nb-common/log-common/src/main/java/com/nb/common/log/aop/LogAspect.java

@@ -103,7 +103,7 @@ public class LogAspect {
             sysLog.setBrowser(userAgent.getBrowser().getName());
             sysLog.setOs(userAgent.getOs().getName());
 
-            if (StpUtil.isLogin()) {
+            if (SecurityUtil.getStpLogic().isLogin()) {
                 try {
                     sysLog.setOperName(SecurityUtil.getUsername());
                 }catch (Exception __){

+ 0 - 2
nb-core/src/main/java/com/nb/core/cache/manager/ClusterStorageManager.java

@@ -1,10 +1,8 @@
 package com.nb.core.cache.manager;
 
 import com.nb.core.AppProperties;
-import com.nb.core.Constants;
 import com.nb.core.cache.ClusterConfigStorage;
 import com.nb.core.cache.ConfigStorage;
-import org.redisson.api.RedissonClient;
 import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
 import org.springframework.data.redis.core.RedisTemplate;
 import org.springframework.stereotype.Component;

+ 11 - 0
nb-service-api/web-service-api/src/main/java/com/nb/web/api/feign/IPatientClient.java

@@ -2,6 +2,7 @@ package com.nb.web.api.feign;
 
 import com.nb.web.api.enums.ClinicManageEnum;
 import com.nb.web.api.feign.query.PatientMonitorQuery;
+import com.nb.web.api.feign.result.InviteCodeResult;
 import com.nb.web.api.feign.result.PatientMonitorDetailResult;
 import com.nb.web.api.feign.result.PatientMonitorResult;
 
@@ -36,4 +37,14 @@ public interface IPatientClient {
 
     boolean setManageType(String clinicId, ClinicManageEnum manageEnum);
 
+    /**
+     * 描述: 生成邀请码
+     * @author lifang
+     * @date 2022/8/11 11:31
+     * @param tenantId
+     * @param patientCode
+     * @param manageType
+     * @return InviteCodeResult
+     */
+    InviteCodeResult  generateInviteCode(String tenantId,String patientCode,ClinicManageEnum manageType);
 }

+ 29 - 0
nb-service-api/web-service-api/src/main/java/com/nb/web/api/feign/result/InviteCodeResult.java

@@ -0,0 +1,29 @@
+package com.nb.web.api.feign.result;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.Date;
+
+/**
+ * @author lifang
+ * @version 1.0.0
+ * @ClassName InviteCode.java
+ * @Description TODO
+ * @createTime 2022年08月11日 11:30:00
+ */
+@Data
+@ApiModel("邀请码")
+public class InviteCodeResult {
+    @ApiModelProperty("邀请码")
+    private String inviteCode;
+    @ApiModelProperty("病人id")
+    private String patientId;
+    @ApiModelProperty("住院号")
+    private String patientCode;
+    @ApiModelProperty("邀请码过期截止时间")
+    private Date expiredAtTime;
+    @ApiModelProperty("医院id")
+    private String tenantId;
+}

+ 2 - 1
nb-service/app-assistant/src/main/java/com/nb/app/assistant/controller/base/AppAssistantBaseCrudController.java

@@ -2,6 +2,7 @@ package com.nb.app.assistant.controller.base;
 
 import cn.dev33.satoken.SaManager;
 import cn.dev33.satoken.stp.StpLogic;
+import com.nb.auth.enums.StpTypeEnum;
 import com.nb.common.crud.controller.BaseCrudController;
 
 import java.io.Serializable;
@@ -22,6 +23,6 @@ public abstract class AppAssistantBaseCrudController<E, K extends Serializable>
 
     @Override
     public StpLogic getStpLogin() {
-        return SaManager.getStpLogic("");
+        return SaManager.getStpLogic(StpTypeEnum.ASSISTANT.getText());
     }
 }

+ 4 - 3
nb-service/app-doctor/src/main/java/com/nb/app/doctor/auth/AppDoctorAuthGranter.java

@@ -1,12 +1,12 @@
 package com.nb.app.doctor.auth;
 
-import cn.dev33.satoken.stp.StpUtil;
 import cn.hutool.core.util.StrUtil;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.nb.app.doctor.api.entity.AppDoctorUserEntity;
 import com.nb.app.doctor.service.LocalAppDoctorUserService;
 import com.nb.auth.bean.LoginUser;
 import com.nb.auth.enums.GrantTypeEnum;
+import com.nb.auth.enums.StpTypeEnum;
 import com.nb.auth.granter.IAuthGranter;
 import com.nb.auth.granter.TokenParameter;
 import com.nb.auth.utils.SecurityUtil;
@@ -61,14 +61,15 @@ public class AppDoctorAuthGranter implements IAuthGranter {
         log.info("登录用户:{}", source.getUsername());
 
         // 登录
-        StpUtil.login(user.getId());
+        SecurityUtil.getStpLogic().login(user.getId());
         LoginUser<String> loginUser = new LoginUser();
-        loginUser.setToken(StpUtil.getTokenValue());
+        loginUser.setToken(SecurityUtil.getStpLogic().getTokenValue());
         loginUser.setUserPlatform(UserPlatformEnum.APP_DOCTOR.getCode());
         loginUser.setGrantType(source.getGrantType());
         loginUser.setUsername(source.getUsername());
         loginUser.setTenantId(user.getTenantId());
         loginUser.setId(user.getId());
+        loginUser.setLoginType(StpTypeEnum.APP_DOCTOR.getText());
         fillUserAgentInfo(loginUser);
         // 设置用户信息
         SecurityUtil.setLogin(loginUser);

+ 1 - 3
nb-service/app-doctor/src/main/java/com/nb/app/doctor/auth/AppDoctorUserAccountOperator.java

@@ -1,6 +1,5 @@
 package com.nb.app.doctor.auth;
 
-import cn.dev33.satoken.stp.StpUtil;
 import cn.hutool.core.bean.BeanUtil;
 import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
 import com.nb.app.doctor.controller.vo.DoctorUserVo;
@@ -13,7 +12,6 @@ import com.nb.auth.controller.vo.UserInfoVO;
 import com.nb.auth.enums.GrantTypeEnum;
 import com.nb.auth.granter.IAccountOperator;
 import com.nb.auth.utils.SecurityUtil;
-import com.nb.core.enums.SexEnum;
 import com.nb.core.exception.CustomException;
 import lombok.AllArgsConstructor;
 import org.springframework.stereotype.Component;
@@ -40,7 +38,7 @@ public class AppDoctorUserAccountOperator implements IAccountOperator<DoctorUser
     @Override
     public UserInfoVO getUserInfo() {
         UserInfoVO userInfoVO = new UserInfoVO();
-        AppDoctorUserEntity user = doctorUserService.getById(StpUtil.getLoginIdAsString());
+        AppDoctorUserEntity user = doctorUserService.getById(SecurityUtil.getStpLogic().getLoginIdAsString());
         userInfoVO.setUserId(user.getId());
         userInfoVO.setUsername(user.getUsername());
         userInfoVO.setRealName(user.getRealName());

+ 0 - 12
nb-service/app-doctor/src/main/java/com/nb/app/doctor/constant/StpConstant.java

@@ -1,12 +0,0 @@
-package com.nb.app.doctor.constant;
-
-/**
- * @author lifang
- * @version 1.0.0
- * @ClassName StpConstant.java
- * @Description TODO
- * @createTime 2022年08月09日 22:00:00
- */
-public class StpConstant {
-    public static final String STP_TYPE="app_doctor";
-}

+ 12 - 0
nb-service/app-doctor/src/main/java/com/nb/app/doctor/controller/PatientMonitorController.java

@@ -3,6 +3,7 @@ package com.nb.app.doctor.controller;
 import cn.hutool.json.JSONUtil;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.nb.app.assistant.api.feign.IAssistantEvalClient;
+import com.nb.app.doctor.controller.vo.InviteCodeVo;
 import com.nb.core.entity.GenericEntity;
 import com.nb.core.result.R;
 import com.nb.web.api.entity.BusDeviceAlarmEntity;
@@ -13,12 +14,15 @@ import com.nb.web.api.feign.IPatientClient;
 import com.nb.web.api.feign.query.AlarmQuery;
 import com.nb.web.api.feign.query.EvalQuery;
 import com.nb.web.api.feign.query.PatientMonitorQuery;
+import com.nb.web.api.feign.result.InviteCodeResult;
 import com.nb.web.api.feign.result.PatientMonitorDetailResult;
 import com.nb.web.api.feign.result.PatientMonitorResult;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiParam;
 import lombok.AllArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
+import org.springframework.context.annotation.Configuration;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
 
@@ -79,4 +83,12 @@ public class PatientMonitorController {
     public R add(@PathVariable("clinicId") String  clinicId) {
         return R.success(assistantEvalClient.getLastEval(clinicId));
     }
+
+
+
+    @PostMapping("/invite/code")
+    @ApiOperation(value = "患者看护邀请码")
+    public R<InviteCodeResult> inviteCode(@RequestAttribute("tenantId")@ApiParam(hidden = true) String tenantId, @RequestBody InviteCodeVo resource) {
+        return R.success(patientClient.generateInviteCode(tenantId,resource.getPatientCode(),resource.getManage()));
+    }
 }

+ 2 - 2
nb-service/app-doctor/src/main/java/com/nb/app/doctor/controller/base/AppDoctorBaseCrudController.java

@@ -2,7 +2,7 @@ package com.nb.app.doctor.controller.base;
 
 import cn.dev33.satoken.SaManager;
 import cn.dev33.satoken.stp.StpLogic;
-import com.nb.app.doctor.constant.StpConstant;
+import com.nb.auth.enums.StpTypeEnum;
 import com.nb.common.crud.controller.BaseCrudController;
 
 import java.io.Serializable;
@@ -23,6 +23,6 @@ public abstract class AppDoctorBaseCrudController<E, K extends Serializable> ext
 
     @Override
     public StpLogic getStpLogin() {
-        return SaManager.getStpLogic(StpConstant.STP_TYPE);
+        return SaManager.getStpLogic(StpTypeEnum.APP_DOCTOR.getText());
     }
 }

+ 22 - 0
nb-service/app-doctor/src/main/java/com/nb/app/doctor/controller/vo/InviteCodeVo.java

@@ -0,0 +1,22 @@
+package com.nb.app.doctor.controller.vo;
+
+import com.nb.web.api.enums.ClinicManageEnum;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * @author lifang
+ * @version 1.0.0
+ * @ClassName InviteCode.java
+ * @Description TODO
+ * @createTime 2022年08月11日 11:26:00
+ */
+@Data
+@ApiModel("邀请码")
+public class InviteCodeVo {
+    @ApiModelProperty("住院号")
+    private String patientCode;
+    @ApiModelProperty(value = "监护位置",allowableValues = "0(院内管理) 1(居家管理)")
+    private ClinicManageEnum manage;
+}

+ 1 - 1
nb-service/web-service/src/main/java/com/nb/web/service/bus/controller/BusDeviceHistoryController.java

@@ -95,7 +95,7 @@ public class BusDeviceHistoryController extends BaseCrudController<BusDeviceHist
             histories.stream().map(BusDeviceHistoryEntity::getDataNumber)
                     .max(Comparator.comparing(Integer::byteValue))
                     .map(max->{
-                        BigDecimal proportionRate = BigDecimal.valueOf(max).divide(BigDecimal.valueOf(CollectionUtil.size(histories)), 2, BigDecimal.ROUND_HALF_UP);
+                        BigDecimal proportionRate = BigDecimal.valueOf(CollectionUtil.size(histories)).divide(BigDecimal.valueOf(max), 2, BigDecimal.ROUND_HALF_UP);
                         result.set(BigDecimal.ONE.subtract(proportionRate).multiply(BigDecimal.valueOf(100)));
                         return max;
                     });

+ 46 - 0
nb-service/web-service/src/main/java/com/nb/web/service/bus/service/LocalBusPatientService.java

@@ -4,15 +4,19 @@ import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.collection.CollectionUtil;
 import cn.hutool.core.date.LocalDateTimeUtil;
 import cn.hutool.core.util.ObjectUtil;
+import cn.hutool.core.util.RandomUtil;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import cn.hutool.core.util.StrUtil;
 import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.IdWorker;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.nb.core.Value;
 import com.nb.web.api.entity.BusClinicEntity;
 import com.nb.web.api.entity.BusInfusionHistoryEntity;
 import com.nb.web.api.enums.ClinicManageEnum;
 import com.nb.web.api.feign.IPatientClient;
+import com.nb.web.api.feign.result.InviteCodeResult;
 import com.nb.web.api.feign.result.PatientMonitorDetailResult;
 import com.nb.web.api.feign.query.PatientMonitorQuery;
 import com.nb.web.api.feign.result.PatientMonitorResult;
@@ -29,12 +33,15 @@ import com.nb.web.service.bus.service.dto.*;
 import com.nb.web.service.bus.mapper.BusPatientMapper;
 import com.nb.web.service.bus.registry.patient.PatientOperator;
 import com.nb.web.service.bus.registry.patient.PatientRegistry;
+import com.nb.web.service.bus.utils.CodeUtils;
+import com.nb.web.service.bus.utils.PatientInviteCodeUtil;
 import com.nb.web.service.bus.utils.WsPublishUtils;
 import com.nb.common.crud.BaseService;
 import com.nb.core.exception.CustomException;
 import com.nb.core.result.R;
 import com.nb.core.utils.ExceptionUtil;
 import lombok.extern.slf4j.Slf4j;
+import org.python.compiler.Code;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.context.annotation.Lazy;
 import org.springframework.stereotype.Service;
@@ -94,6 +101,9 @@ public class LocalBusPatientService extends BaseService<BusPatientMapper, BusPat
     @Lazy
     private LocalBusDeviceService deviceService;
 
+    @Autowired
+    private PatientInviteCodeUtil inviteCodeUtil;
+
     private ScheduledExecutorService executorService = Executors.newSingleThreadScheduledExecutor();
 
     @Override
@@ -238,6 +248,7 @@ public class LocalBusPatientService extends BaseService<BusPatientMapper, BusPat
             patient = new BusPatientEntity();
             patient.setTenantId(tenantId);
             patient.setCode(patientCode);
+            patient.setOriginCode(patientCode);
             this.save(patient);
         }
         return patient;
@@ -502,4 +513,39 @@ public class LocalBusPatientService extends BaseService<BusPatientMapper, BusPat
         CompletableFuture.runAsync(()-> wsPublishUtils.publishPatientMonitor(clinic.getPatientId(),clinic.getTenantId()));
         return result;
     }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public InviteCodeResult generateInviteCode(String tenantId,String patientCode, ClinicManageEnum manageType) {
+        InviteCodeResult result = new InviteCodeResult();
+        //将住院号病人存入数据库
+        BusPatientEntity patient = this.getOneByHospitalAndPatientCode(tenantId, patientCode);
+
+        String clinicId = patient.getClinicId();
+        BusClinicEntity clinic = new BusClinicEntity();
+        if (StrUtil.isEmpty(clinicId)) {
+            clinic.setPatientId(patient.getId());
+            clinic.setPatientCode(patientCode);
+            clinic.setTenantId(tenantId);
+            clinic.setMonitorType(true);
+            clinic.setManageType(manageType);
+            clinic.setMonitorStartTime(new Date());
+            clinicService.save(clinic);
+            this.update(new UpdateWrapper<BusPatientEntity>().lambda().eq(BusPatientEntity::getId,patient.getId()).set(BusPatientEntity::getClinicId,clinicId));
+        }else {
+            //更新临床监护位置信息
+            clinicService.update(new UpdateWrapper<BusClinicEntity>()
+                    .lambda()
+                    .eq(BusClinicEntity::getId,clinicId)
+                    .set(BusClinicEntity::getManageType,manageType));
+        }
+        CompletableFuture.runAsync(()->this.getPatientInfoFromHis(tenantId,patientCode,10,false));
+        PatientInviteCodeUtil.InviteCodeNode inviteCodeNode = inviteCodeUtil.generateCode(6, patientCode);
+        result.setPatientCode(patientCode);
+        result.setPatientId(patient.getId());
+        result.setTenantId(tenantId);
+        result.setInviteCode(inviteCodeNode.getInviteCode());
+        result.setExpiredAtTime(inviteCodeNode.getExpiredAtTime());
+        return result;
+    }
 }

+ 81 - 0
nb-service/web-service/src/main/java/com/nb/web/service/bus/utils/PatientInviteCodeUtil.java

@@ -0,0 +1,81 @@
+package com.nb.web.service.bus.utils;
+
+import cn.hutool.core.util.RandomUtil;
+import cn.hutool.core.util.StrUtil;
+import com.nb.core.exception.CustomException;
+import lombok.Data;
+import lombok.extern.slf4j.Slf4j;
+import org.redisson.api.RLock;
+import org.redisson.api.RMapCache;
+import org.redisson.api.RedissonClient;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Configuration;
+
+import java.io.Serializable;
+import java.util.Date;
+import java.util.concurrent.TimeUnit;
+
+/**
+ * @author lifang
+ * @version 1.0.0
+ * @ClassName PatientInviteCodeUtil.java
+ * @Description TODO
+ * @createTime 2022年08月11日 11:53:00
+ */
+@Slf4j
+@Configuration
+public class PatientInviteCodeUtil {
+
+    /**
+     * 邀请码缓存,默认7过期
+     */
+    private final RMapCache<String, InviteCodeNode> inviteCodeMap;
+
+    /**
+     * 住院号缓存,默认7过期
+     */
+    private final RMapCache<String, InviteCodeNode> patientCodeMap;
+
+    public PatientInviteCodeUtil(RedissonClient redissonClient) {
+        this.inviteCodeMap = redissonClient.getMapCache("invite-code-patient");
+        this.patientCodeMap = redissonClient.getMapCache("patient-code-invite");
+    }
+
+    public synchronized InviteCodeNode generateCode(int length,String patientCode){
+        InviteCodeNode result = patientCodeMap.get(patientCode);
+        if(result!=null){
+            return result;
+        }
+        result=new InviteCodeNode();
+        result.setPatientCode(patientCode);
+        for (int i = 0; i < 10; i++) {
+            String code = RandomUtil.randomNumbers(length);
+            if(inviteCodeMap.get(code)==null){
+                result.setInviteCode(code);
+                break;
+            }
+        }
+        //设置过期时间为7天之后
+        result.setExpiredAtTime(new Date(System.currentTimeMillis()+TimeUnit.DAYS.toMillis(7)));
+        if(StrUtil.isEmpty(result.getInviteCode())){
+            log.error("自动生成患者邀请码失败,邀请码位数{},生成次数{}",length,10);
+            throw new CustomException("系统繁忙,请重试");
+        }
+        inviteCodeMap.put(result.getInviteCode(),result,7,TimeUnit.DAYS);
+        patientCodeMap.put(result.getPatientCode(),result,7,TimeUnit.DAYS);
+        return result;
+    }
+
+    public InviteCodeNode getCode(String inviteCode){
+        return inviteCodeMap.get(inviteCode);
+    }
+
+
+
+    @Data
+    public static class InviteCodeNode implements Serializable {
+        private String  patientCode;
+        private String inviteCode;
+        private Date expiredAtTime;
+    }
+}

+ 2 - 1
nb-service/web-service/src/main/java/com/nb/web/service/bus/utils/WsPublishUtils.java

@@ -12,6 +12,7 @@ import com.nb.common.websocket.WebSocketConstant;
 import com.nb.common.config.utils.RedissonUtil;
 import lombok.AllArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
+import org.springframework.context.annotation.Configuration;
 import org.springframework.scheduling.annotation.Async;
 import org.springframework.stereotype.Component;
 import org.springframework.util.Assert;
@@ -25,7 +26,7 @@ import java.io.Serializable;
  * @Description ws发布消息工具类
  * @createTime 2022年05月07日 11:34:00
  */
-@Component
+@Configuration
 @AllArgsConstructor
 @Slf4j
 public class WsPublishUtils implements Serializable{

+ 4 - 2
nb-service/web-service/src/main/java/com/nb/web/service/system/auth/ApplyAuthGranter.java

@@ -6,6 +6,7 @@ import cn.hutool.crypto.digest.DigestUtil;
 import cn.hutool.json.JSONObject;
 import com.nb.auth.bean.LoginUser;
 import com.nb.auth.enums.GrantTypeEnum;
+import com.nb.auth.enums.StpTypeEnum;
 import com.nb.auth.granter.IAuthGranter;
 import com.nb.auth.granter.TokenParameter;
 import com.nb.auth.utils.SecurityUtil;
@@ -54,15 +55,16 @@ public class ApplyAuthGranter implements IAuthGranter {
         LoginUser<String> loginUser = new LoginUser();
         //验证签名
         if (signCorrect(source.getSign(), source.getTimestamp(), source.getAppKey(), appSecret)) {
-            StpUtil.login(source.getAppKey());
+            SecurityUtil.getStpLogic().login(source.getAppKey());
             loginUser.setTenantId(applyManager.getTenantId(appKey));
-            loginUser.setToken(StpUtil.getTokenValue());
+            loginUser.setToken(SecurityUtil.getStpLogic().getTokenValue());
             loginUser.setUserPlatform(UserPlatformEnum.WEB.getCode());
             loginUser.setGrantType(source.getGrantType());
             loginUser.setSys(false);
             loginUser.setUsername(source.getAppKey());
             loginUser.setPermissions(new HashSet<>(applyManager.getPermission(appKey)));
             loginUser.setId(source.getAppKey());
+            loginUser.setLoginType(StpTypeEnum.DEFAULT.getText());
             // 设置用户信息
             SecurityUtil.setLogin(loginUser);
         } else {

+ 1 - 1
nb-service/web-service/src/main/java/com/nb/web/service/system/auth/DefaultAccountOperator.java

@@ -51,7 +51,7 @@ public class DefaultAccountOperator implements IAccountOperator {
     @Override
     public UserInfoVO getUserInfo() {
         UserInfoVO userInfoVO = new UserInfoVO();
-        SysUser sysUser = sysUserService.getById(StpUtil.getLoginIdAsLong());
+        SysUser sysUser = sysUserService.getById(SecurityUtil.getStpLogic().getLoginIdAsLong());
         // 查询角色列表
         List<SysRole> sysRoleList = sysRoleService.listSysRoleByUserId(sysUser.getId());
         List<RoleInfoVO> roleInfoVOList = sysRoleList.stream().map(item -> {

+ 5 - 4
nb-service/web-service/src/main/java/com/nb/web/service/system/auth/WebAuthGranter.java

@@ -1,13 +1,13 @@
 package com.nb.web.service.system.auth;
 
 import cn.dev33.satoken.spring.SpringMVCUtil;
-import cn.dev33.satoken.stp.StpUtil;
 import cn.hutool.core.bean.BeanUtil;
 import cn.hutool.core.util.StrUtil;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.nb.auth.bean.LoginUser;
 import com.nb.auth.bean.SysRoleInfo;
 import com.nb.auth.enums.GrantTypeEnum;
+import com.nb.auth.enums.StpTypeEnum;
 import com.nb.auth.granter.IAuthGranter;
 import com.nb.auth.granter.TokenParameter;
 import com.nb.auth.utils.SecurityUtil;
@@ -71,7 +71,7 @@ public class WebAuthGranter implements IAuthGranter {
             String requestFrom = request.getHeader("RequestFrom");
             //来自app的请求不需要验证码
             if(!"TuoRenApp".equals(requestFrom)){
-                captchaTool.ver(source.getCodeKey(),source.getCode());
+//                captchaTool.ver(source.getCodeKey(),source.getCode());
             }
         }
         sysUser = sysUserService.getOne(Wrappers.lambdaQuery(SysUser.class).eq(SysUser::getAccount, source.getUsername())
@@ -98,9 +98,9 @@ public class WebAuthGranter implements IAuthGranter {
         Set<String> permissions  = sysMenuService.getPermissionsByUserId(sysUser.getId());
 
         // 登录
-        StpUtil.login(sysUser.getId());
+        SecurityUtil.getStpLogic().login(sysUser.getId());
         LoginUser<Long> loginUser = new LoginUser();
-        loginUser.setToken(StpUtil.getTokenValue());
+        loginUser.setToken(SecurityUtil.getStpLogic().getTokenValue());
         loginUser.setUserPlatform(UserPlatformEnum.WEB.getCode());
         loginUser.setGrantType(source.getGrantType());
         loginUser.setSys(sysUser.getIsSys());
@@ -110,6 +110,7 @@ public class WebAuthGranter implements IAuthGranter {
         loginUser.setSuperAdmin(isSuperAdmin(source.getGrantType(),sysRoleList));
         loginUser.setPermissions(permissions);
         loginUser.setId(sysUser.getId());
+        loginUser.setLoginType(StpTypeEnum.DEFAULT.getText());
         fillUserAgentInfo(loginUser);
         // 设置用户信息
         SecurityUtil.setLogin(loginUser);

+ 4 - 3
nb-service/web-service/src/main/java/com/nb/web/service/system/controller/SysConfigController.java

@@ -3,6 +3,7 @@ package com.nb.web.service.system.controller;
 import cn.dev33.satoken.annotation.SaCheckPermission;
 import cn.dev33.satoken.stp.StpUtil;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.nb.auth.utils.SecurityUtil;
 import com.nb.core.annotation.Log;
 import com.nb.core.result.R;
 import com.nb.core.utils.ExcelUtil;
@@ -123,11 +124,11 @@ public class SysConfigController {
     @ApiOperation("获取系统时间(毫秒级)")
     @GetMapping("/getTime")
     public R getTime() {
-        if (StpUtil.isLogin()) {
+        if (SecurityUtil.getStpLogic().isLogin()) {
             try {
-                StpUtil.checkActivityTimeout();
+                SecurityUtil.getStpLogic().checkActivityTimeout();
                 //手动续签
-                StpUtil.updateLastActivityToNow();
+                SecurityUtil.getStpLogic().updateLastActivityToNow();
             }catch (Exception e){
 
             }

+ 3 - 2
nb-service/web-service/src/main/java/com/nb/web/service/system/service/impl/SysRoleServiceImpl.java

@@ -12,6 +12,7 @@ import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.nb.auth.bean.LoginUser;
+import com.nb.auth.utils.SecurityUtil;
 import com.nb.core.Constants;
 import com.nb.core.enums.MenuTypeEnum;
 import com.nb.core.enums.StatusEnum;
@@ -168,10 +169,10 @@ public class SysRoleServiceImpl extends ServiceImpl<SysRoleMapper, SysRole> impl
         userRoleList
                 .forEach(sysUserRole -> {
                     Set<String> permissionsByUserId = sysMenuService.getPermissionsByUserId(sysUserRole.getUserId());
-                    List<String> tokens = StpUtil.getTokenValueListByLoginId(sysUserRole.getUserId());
+                    List<String> tokens = SecurityUtil.getStpLogic().getTokenValueListByLoginId(sysUserRole.getUserId());
                     tokens.parallelStream()
                             .forEach(token->{
-                                SaSession tokenSessionByToken = StpUtil.getTokenSessionByToken(token);
+                                SaSession tokenSessionByToken = SecurityUtil.getStpLogic().getTokenSessionByToken(token);
                                 LoginUser user = (LoginUser) tokenSessionByToken.get(Constants.LOGIN_USER_KEY);
                                 if(user!=null){
                                     user.setPermissions(permissionsByUserId);

+ 2 - 2
nb-service/web-service/src/main/java/com/nb/web/service/system/service/impl/SysUserServiceImpl.java

@@ -215,11 +215,11 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> impl
 
             //更新缓存用户权限信息
             Set<String> permissionsByUserId = sysMenuService.getPermissionsByUserId(req.getId());
-            List<String> tokens = StpUtil.getTokenValueListByLoginId(req.getId());
+            List<String> tokens = SecurityUtil.getStpLogic().getTokenValueListByLoginId(req.getId());
             List<SysRole> sysRoleList = sysRoleService.listSysRoleByUserId(req.getId());
             tokens.parallelStream()
                     .forEach(token->{
-                        SaSession tokenSessionByToken = StpUtil.getTokenSessionByToken(token);
+                        SaSession tokenSessionByToken = SecurityUtil.getStpLogic().getTokenSessionByToken(token);
                         LoginUser user = (LoginUser) tokenSessionByToken.get(Constants.LOGIN_USER_KEY);
                         if(user!=null){
                             user.setPermissions(permissionsByUserId);