lifang преди 1 месец
родител
ревизия
96f90b116f

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

@@ -7,7 +7,7 @@ spring:
   application:
     name: nb
   profiles:
-    active: prod
+    active: dev
   jackson:
     time-zone: GMT+8
   flyway:

+ 18 - 0
nb-common/config-common/src/main/java/com/nb/common/config/annotation/TenantIgnore.java

@@ -0,0 +1,18 @@
+package com.nb.common.config.annotation;
+
+import java.lang.annotation.*;
+
+/**
+ * 忽略租户,标记指定方法不进行租户的自动过滤
+ *
+ * 注意,只有 DB 的场景会过滤,其它场景暂时不过滤:
+ * 1、Redis 场景:因为是基于 Key 实现多租户的能力,所以忽略没有意义,不像 DB 是一个 column 实现的
+ * 2、MQ 场景:有点难以抉择,目前可以通过 Consumer 手动在消费的方法上,添加 @TenantIgnore 进行忽略
+ *
+ * @author 芋道源码
+ */
+@Target({ElementType.METHOD})
+@Retention(RetentionPolicy.RUNTIME)
+@Inherited
+public @interface TenantIgnore {
+}

+ 1 - 1
nb-common/config-common/src/main/java/com/nb/common/config/aspect/TenantIgnoreAspect.java

@@ -29,7 +29,7 @@ public class TenantIgnoreAspect {
             // 执行逻辑
             return joinPoint.proceed();
         } finally {
-            TenantContextHolder.setIgnore(Boolean.TRUE.equals(oldIgnore));
+            TenantContextHolder.setIgnore(oldIgnore);
         }
     }
 

+ 59 - 0
nb-common/config-common/src/main/java/com/nb/common/config/context/TenantContextHolder.java

@@ -0,0 +1,59 @@
+package com.nb.common.config.context;
+
+/**
+ * 多租户上下文 Holder
+ *
+ * @author tr
+ */
+public class TenantContextHolder {
+
+    private static final ThreadLocal<String> TENANT_ID_HOLDER = new ThreadLocal<>();
+    private static final ThreadLocal<Boolean> IGNORE_HOLDER = new ThreadLocal<>();
+
+    /**
+     * 获得租户编号。
+     *
+     * @return 租户编号
+     */
+    public static String getTenantId() {
+        return TENANT_ID_HOLDER.get();
+    }
+
+    /**
+     * 获得租户编号。如果不存在,则抛出 NullPointerException 异常
+     *
+     * @return 租户编号
+     */
+    public static String getRequiredTenantId() {
+        String tenantId = getTenantId();
+        if (tenantId == null) {
+            throw new NullPointerException("TenantContextHolder 不存在租户编号!");
+        }
+        return tenantId;
+    }
+
+    public static void setTenantId(String tenantId) {
+        TENANT_ID_HOLDER.set(tenantId);
+    }
+
+    public static void setIgnore(boolean ignore) {
+        IGNORE_HOLDER.set(ignore);
+    }
+
+    /**
+     * 当前是否忽略租户
+     *
+     * @return 是否忽略
+     */
+    public static Boolean isIgnore() {
+        return IGNORE_HOLDER.get();
+    }
+    
+    /**
+     * 清除当前线程的租户上下文信息
+     */
+    public static void clear() {
+        TENANT_ID_HOLDER.remove();
+        IGNORE_HOLDER.remove();
+    }
+}

+ 4 - 0
nb-common/config-common/src/main/java/com/nb/common/config/mybatisplus/interceptor/DefaultTenantLineInnerInterceptor.java

@@ -10,6 +10,7 @@ import com.baomidou.mybatisplus.extension.plugins.inner.TenantLineInnerIntercept
 import com.nb.auth.bean.LoginUser;
 import com.nb.auth.enums.StpTypeEnum;
 import com.nb.auth.utils.SecurityUtil;
+import com.nb.common.config.context.TenantContextHolder;
 import com.nb.core.entity.TenantGenericEntity;
 import net.sf.jsqlparser.expression.Expression;
 import net.sf.jsqlparser.expression.StringValue;
@@ -82,6 +83,9 @@ public class DefaultTenantLineInnerInterceptor {
 
             @Override
             public boolean ignoreTable(String tableName) {
+                if (Boolean.TRUE.equals(TenantContextHolder.isIgnore())) {
+                    return Boolean.TRUE;
+                }
                 ServletRequestAttributes request = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
                 //非用户请求,即来自程序自身,则忽略
                 if(request==null||request.getRequest() instanceof MockHttpServletRequest){

+ 0 - 2
nb-service-api/web-service-api/src/main/java/com/nb/web/api/feign/IHospitalClient.java

@@ -21,6 +21,4 @@ public interface IHospitalClient {
     List<HospitalResult> selectAll();
 
     List<AppHospitalVO> selectUserHospitalList(String username);
-
-    String selectHospitalCode(String id);
 }

+ 0 - 2
nb-service-api/web-service-api/src/main/java/com/nb/web/api/feign/result/AppHospitalVO.java

@@ -12,6 +12,4 @@ public class AppHospitalVO implements Serializable {
     private String id;
     @ApiModelProperty("医院名称")
     private String name;
-
-    private String userId;
 }

+ 30 - 3
nb-service/app-doctor/src/main/java/com/nb/app/doctor/controller/UserController.java

@@ -1,18 +1,24 @@
 package com.nb.app.doctor.controller;
 
+import cn.dev33.satoken.session.SaSession;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
-import com.nb.app.doctor.api.entity.AppDoctorUserEntity;
 import com.nb.app.doctor.api.entity.AppUserConsultConfigEntity;
+import com.nb.app.doctor.service.dto.UserShiftHospitalDTO;
+import com.nb.auth.bean.LoginUser;
+import com.nb.common.config.annotation.TenantIgnore;
+import com.nb.web.api.feign.result.AppHospitalVO;
 import com.nb.app.doctor.service.LocalUserConsultConfigService;
+import com.nb.auth.utils.SecurityUtil;
 import com.nb.core.entity.GenericEntity;
 import com.nb.core.result.R;
+import com.nb.web.api.feign.IHospitalClient;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import lombok.AllArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
-
+import java.util.*;
 /**
  * @author lifang
  * @version 1.0.0
@@ -27,7 +33,7 @@ import org.springframework.web.bind.annotation.*;
 @Slf4j
 public class UserController {
     private final LocalUserConsultConfigService consultConfigService;
-
+    private final IHospitalClient hospitalClient;
 
     @PostMapping("/consult/{userId}")
     @ApiOperation("查询医生咨询设置")
@@ -42,4 +48,25 @@ public class UserController {
         return R.success(consultConfigService.updateById(source));
     }
 
+
+    @GetMapping("/hospitalList")
+    @ApiOperation("查询当前用户所在的医院列表")
+    @TenantIgnore
+    public R<List<AppHospitalVO>> hospitalList(){
+        return R.success(hospitalClient.selectUserHospitalList(SecurityUtil.getUsername()));
+    }
+
+    @PostMapping("/shiftHospital")
+    @ApiOperation("切换当前用户所在医院")
+    @TenantIgnore
+    public R<Boolean> shiftHospital(@RequestBody@Validated UserShiftHospitalDTO source){
+        SaSession tokenSession = SecurityUtil.getStpLogic().getTokenSessionByToken(SecurityUtil.getStpLogic().getTokenValue());
+        LoginUser<String> loginUserClass =tokenSession.getModel(SecurityUtil.LOGIN_USER_KEY, LoginUser.class);
+        String hospitalId = source.getHospitalId();
+        loginUserClass.setTenantId(hospitalId);
+        tokenSession.set(SecurityUtil.LOGIN_USER_KEY, loginUserClass);
+        return R.success(Boolean.TRUE);
+    }
+
+
 }

+ 13 - 0
nb-service/app-doctor/src/main/java/com/nb/app/doctor/service/dto/UserShiftHospitalDTO.java

@@ -0,0 +1,13 @@
+package com.nb.app.doctor.service.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotBlank;
+
+@Data
+public class UserShiftHospitalDTO {
+    @ApiModelProperty("医院id")
+    @NotBlank(message = "医院id不能为空")
+    private String hospitalId;
+}

+ 1 - 1
nb-service/web-service/src/main/java/com/nb/web/service/bus/hospital/HospitalHisDataPullJob.java

@@ -66,7 +66,7 @@ public class HospitalHisDataPullJob implements Job {
                 log.warn("[定时拉取病人数据]未找到医院管理器,hospitalId:{}", hospitalId);
                 return;
             }
-            if (hospitalManager.getScriptSession().isOnline()) {
+            if (!hospitalManager.getScriptSession().isOnline()) {
                 log.warn("[定时拉取病人数据]医院不在线,hospitalId:{}", hospitalId);
                 return;
             }

+ 12 - 1
nb-service/web-service/src/main/java/com/nb/web/service/bus/mapper/BusHospitalMapper.java

@@ -1,8 +1,13 @@
 package com.nb.web.service.bus.mapper;
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.nb.web.api.feign.result.AppHospitalVO;
 import com.nb.web.service.bus.entity.BusHospitalEntity;
 import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+import org.apache.ibatis.annotations.Select;
+
+import java.util.List;
 
 /**
  * @author lifang
@@ -13,4 +18,10 @@ import org.apache.ibatis.annotations.Mapper;
  */
 @Mapper
 public interface BusHospitalMapper extends BaseMapper<BusHospitalEntity> {
-}
+    /**
+     * 根据用户名查询用户所拥有的医院列表
+     * @param username
+     * @return
+     */
+    List<AppHospitalVO> selectUserHospitalListByUsername(@Param("username") String username);
+}

+ 2 - 16
nb-service/web-service/src/main/java/com/nb/web/service/bus/service/LocalBusHospitalService.java

@@ -49,7 +49,6 @@ import org.springframework.web.context.request.ServletRequestAttributes;
 
 import javax.annotation.PostConstruct;
 import java.util.Collections;
-import java.util.HashMap;
 import java.util.List;
 import java.util.Optional;
 import java.util.concurrent.CompletableFuture;
@@ -70,7 +69,6 @@ public class LocalBusHospitalService extends BaseService<BusHospitalMapper, BusH
 
     private ConfigStorage nameCache;
 
-    private HashMap<String,String> codeMap=new HashMap<>();
     @Autowired
     @Lazy
     private LocalBusConMixService conMixService;
@@ -252,13 +250,13 @@ public class LocalBusHospitalService extends BaseService<BusHospitalMapper, BusH
     public void run(String... args) {
         saveDefaultHospital();
         List<BusHospitalEntity> list = list();
-        list.parallelStream().forEach(entity -> {
+        list.forEach(entity -> {
             entity.setScriptOnline(false);
             nameCache.setConfig(entity.getId(),entity.getName());
             this.baseMapper.updateById(entity);
         });
         configService.saveDefaultConfig();
-//        list.parallelStream().forEach(hospital-> hospitalManagerRegister.refresh(hospital.getId(),true,true,true,true));
+        list.parallelStream().forEach(hospital-> hospitalManagerRegister.refresh(hospital.getId(),true,true,true,true));
     }
 
 
@@ -342,16 +340,4 @@ public class LocalBusHospitalService extends BaseService<BusHospitalMapper, BusH
     public List<AppHospitalVO> selectUserHospitalList(String username) {
         return hospitalMapper.selectUserHospitalListByUsername(username);
     }
-
-    @Override
-    public String selectHospitalCode(String id) {
-        return codeMap.computeIfAbsent(id,k->{
-            BusHospitalEntity busHospitalEntity = hospitalMapper.selectById(id);
-            if(busHospitalEntity==null){
-                return "";
-            }else {
-                return busHospitalEntity.getCode();
-            }
-        });
-    }
 }

+ 0 - 2
nb-service/web-service/src/main/resources/mapper/bus/BusHospitalMapper.xml

@@ -4,12 +4,10 @@
     <resultMap id="hospitalList" type="com.nb.web.api.feign.result.AppHospitalVO">
         <id property="id" column="id"/>
         <result property="name" column="name"/>
-        <result property="userId" column="user_id"/>
     </resultMap>
 
     <select id="selectUserHospitalListByUsername" resultMap="hospitalList">
         select
-            adu.id as user_id,
             bh.tenant_id as id,
                 bh.name as name
         from app_doctor_user as adu join bus_hospital as bh on bh.tenant_id=adu.tenant_id where adu.username=#{username}