) parameter;
+ newMap.putAll(originalMap);
+ // 用户手动传的值优先(已存在则不覆盖)
+ newMap.putIfAbsent(PARAM_NAME, hosId);
+ return newMap;
+ }
+
+ // 参数是 POJO -> 通过 MetaObject 读取所有可读字段 + hos_id
+ MetaObject metaObject = SystemMetaObject.forObject(parameter);
+ for (String name : metaObject.getGetterNames()) {
+ if ("class".equals(name)) continue;
+ try {
+ newMap.put(name, metaObject.getValue(name));
+ } catch (Exception ignored) {
+ // 某些 getter 可能不可读,跳过即可
+ }
+ }
+ newMap.putIfAbsent(PARAM_NAME, hosId);
+ // 同时把原 POJO 也放进去,作为 fallback
+ newMap.put("_pojo", parameter);
+ return newMap;
+ }
+
+ @Override
+ public Object plugin(Object target) {
+ return Plugin.wrap(target, this);
+ }
+
+ @Override
+ public void setProperties(Properties properties) {
+ }
+}
\ No newline at end of file
diff --git a/blood_common/src/main/java/com/czblood/common/core/domain/entity/SysUser.java b/blood_common/src/main/java/com/czblood/common/core/domain/entity/SysUser.java
index 660034d..99a15d5 100644
--- a/blood_common/src/main/java/com/czblood/common/core/domain/entity/SysUser.java
+++ b/blood_common/src/main/java/com/czblood/common/core/domain/entity/SysUser.java
@@ -101,7 +101,7 @@ public class SysUser extends BaseEntity
private String vshisuser;
private String vshisuser1;
private String vshisuser2;
- private String yljg;
+ private String hos_id;
private String sn;
private String snid;
private String signCert;
@@ -140,14 +140,6 @@ public class SysUser extends BaseEntity
this.vshisuser2 = vshisuser2;
}
- public String getYljg() {
- return yljg;
- }
-
- public void setYljg(String yljg) {
- this.yljg = yljg;
- }
-
public String getSn() {
return sn;
}
@@ -185,6 +177,14 @@ public class SysUser extends BaseEntity
}
+ public String getHos_id() {
+ return hos_id;
+ }
+
+ public void setHos_id(String hos_id) {
+ this.hos_id = hos_id;
+ }
+
public SysUser(Long userId)
{
this.userId = userId;
@@ -413,7 +413,7 @@ public class SysUser extends BaseEntity
.append("vshisuser",getVshisuser())
.append("vshisuser1",getVshisuser1())
.append("vshisuser2",getVshisuser1())
- .append("yljg",getYljg())
+ .append("hos_id",getHos_id())
.append("sn",getSn())
.append("snid",getSnid())
.append("signCert",getSignCert())
diff --git a/blood_common/src/main/java/com/czblood/common/utils/HosIdHolder.java b/blood_common/src/main/java/com/czblood/common/utils/HosIdHolder.java
new file mode 100644
index 0000000..a348222
--- /dev/null
+++ b/blood_common/src/main/java/com/czblood/common/utils/HosIdHolder.java
@@ -0,0 +1,73 @@
+package com.czblood.common.utils;
+
+import com.czblood.common.core.domain.entity.SysLoginParam;
+import com.czblood.common.core.domain.model.LoginUser;
+
+import javax.servlet.http.HttpServletRequest;
+
+/**
+ * 持有当前请求的 hos_id
+ *
+ * 获取优先级:
+ * 1. 手动通过 {@link #setHosId(String)} 放入 ThreadLocal 的值
+ * 2. HTTP 请求 header 中的 "hos_id"
+ * 3. 当前登录用户 sysLoginParam 中的 loginYLJG
+ *
+ */
+public class HosIdHolder {
+
+ private static final ThreadLocal HOS_ID_HOLDER = new ThreadLocal<>();
+
+ /**
+ * 获取当前 hos_id
+ */
+ public static String getHosId() {
+ // 1. 优先取手动设置的值
+ String hosId = HOS_ID_HOLDER.get();
+ if (hosId != null && !hosId.isEmpty()) {
+ return hosId;
+ }
+
+ // 2. 从 HTTP 请求 header 中取
+ try {
+ HttpServletRequest request = ServletUtils.getRequest();
+ if (request != null) {
+ String headerHosId = request.getHeader("hos_id");
+ if (headerHosId != null && !headerHosId.isEmpty()) {
+ return headerHosId;
+ }
+ // 兼容可能的其他命名,比如 X-Hos-Id
+ String headerHosId2 = request.getHeader("x-hos-id");
+ if (headerHosId2 != null && !headerHosId2.isEmpty()) {
+ return headerHosId2;
+ }
+ }
+ } catch (Exception ignored) {
+ // 非 web 环境(如定时任务、MQ 消费等)拿不到 request,忽略即可
+ }
+
+ // 3. 从登录用户的 sysLoginParam.loginYLJG 取
+ try {
+ LoginUser loginUser = SecurityUtils.getLoginUser();
+ if (loginUser != null) {
+ SysLoginParam loginParam = loginUser.getSysLoginParam();
+ if (loginParam != null && loginParam.getLoginYLJG() != null
+ && !loginParam.getLoginYLJG().isEmpty()) {
+ return loginParam.getLoginYLJG();
+ }
+ }
+ } catch (Exception ignored) {
+ // 未登录或获取失败,返回 null 即可(拦截器中为 null 时不注入)
+ }
+
+ return null;
+ }
+
+ public static void setHosId(String hosId) {
+ HOS_ID_HOLDER.set(hosId);
+ }
+
+ public static void clear() {
+ HOS_ID_HOLDER.remove();
+ }
+}
\ No newline at end of file
diff --git a/blood_system/src/main/java/com/czblood/system/config/MyBatisConfig.java b/blood_system/src/main/java/com/czblood/system/config/MyBatisConfig.java
index c013fee..7c55164 100644
--- a/blood_system/src/main/java/com/czblood/system/config/MyBatisConfig.java
+++ b/blood_system/src/main/java/com/czblood/system/config/MyBatisConfig.java
@@ -1,7 +1,10 @@
package com.czblood.system.config;
+import com.czblood.common.config.mybatis.HosIdInjectingSqlSource;
import com.czblood.common.utils.StringUtils;
import org.apache.ibatis.io.VFS;
+import org.apache.ibatis.mapping.MappedStatement;
+import org.apache.ibatis.mapping.SqlSource;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.boot.autoconfigure.SpringBootVFS;
@@ -20,10 +23,8 @@ import org.springframework.util.ClassUtils;
import javax.sql.DataSource;
import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.HashSet;
-import java.util.List;
+import java.lang.reflect.Field;
+import java.util.*;
/**
* Mybatis支持*匹配扫描包
@@ -105,6 +106,44 @@ public class MyBatisConfig {
sessionFactory.setTypeAliasesPackage(typeAliasesPackage);
sessionFactory.setMapperLocations(resolveMapperLocations(StringUtils.split(mapperLocations, ",")));
sessionFactory.setConfigLocation(new DefaultResourceLoader().getResource(configLocation));
- return sessionFactory.getObject();
+
+ SqlSessionFactory sqlSessionFactory = sessionFactory.getObject();
+
+ // ↓↓↓ 核心:把所有 MappedStatement 的 SqlSource 包一层,自动注入 hos_id
+ injectHosIdSqlSource(sqlSessionFactory);
+
+ return sqlSessionFactory;
+ }
+
+ /**
+ * 遍历 Configuration 中所有 MappedStatement,用 HosIdInjectingSqlSource 包装其 sqlSource。
+ * 通过反射修改 MappedStatement 私有字段 sqlSource。
+ */
+ private void injectHosIdSqlSource(SqlSessionFactory sqlSessionFactory) {
+ try {
+ org.apache.ibatis.session.Configuration configuration = sqlSessionFactory.getConfiguration();
+
+ // 反射获取 MappedStatement.sqlSource 字段
+ Field sqlSourceField = MappedStatement.class.getDeclaredField("sqlSource");
+ sqlSourceField.setAccessible(true);
+
+ // 注意:getMappedStatements() 返回的 Collection 里不全是 MappedStatement,
+ // 还可能包含 StrictMap.Ambiguity(MyBatis 内部用来标记 statement id 有歧义的对象),
+ // 必须用 Object 接收并做 instanceof 判断。
+ Collection> statements = configuration.getMappedStatements();
+ for (Object obj : statements) {
+ if (!(obj instanceof MappedStatement)) continue; // 跳过 StrictMap.Ambiguity
+ MappedStatement ms = (MappedStatement) obj;
+
+ SqlSource original = ms.getSqlSource();
+ if (original == null) continue;
+ if (original instanceof HosIdInjectingSqlSource) continue; // 避免重复包装
+
+ sqlSourceField.set(ms, new HosIdInjectingSqlSource(original));
+ }
+ } catch (Exception e) {
+ System.err.println("[HosId] 自动注入 hos_id 失败: " + e.getMessage());
+ e.printStackTrace();
+ }
}
}
\ No newline at end of file
diff --git a/blood_system/src/main/java/com/czblood/system/web/service/SysLoginService.java b/blood_system/src/main/java/com/czblood/system/web/service/SysLoginService.java
index e63ba65..89dab68 100644
--- a/blood_system/src/main/java/com/czblood/system/web/service/SysLoginService.java
+++ b/blood_system/src/main/java/com/czblood/system/web/service/SysLoginService.java
@@ -231,7 +231,7 @@ public class SysLoginService {
//判断用户名是否在登录的医疗机构中
SysUser sysUser1 = new SysUser();
sysUser1.setUserName(username);
- sysUser1.setYljg(loginParam.getLoginYLJG());
+ sysUser1.setHos_id(loginParam.getLoginYLJG());
SysUser sysUser = userService.queryUserList(sysUser1);
//管理员不判断
diff --git a/blood_system/src/main/resources/mapper/system/SysUserCommMapper.xml b/blood_system/src/main/resources/mapper/system/SysUserCommMapper.xml
index 5d5fd0e..152164f 100644
--- a/blood_system/src/main/resources/mapper/system/SysUserCommMapper.xml
+++ b/blood_system/src/main/resources/mapper/system/SysUserCommMapper.xml
@@ -25,7 +25,7 @@
-
+
diff --git a/blood_system/src/main/resources/mapper/system/SysUserMapper.xml b/blood_system/src/main/resources/mapper/system/SysUserMapper.xml
index 6b21855..c13f141 100644
--- a/blood_system/src/main/resources/mapper/system/SysUserMapper.xml
+++ b/blood_system/src/main/resources/mapper/system/SysUserMapper.xml
@@ -26,7 +26,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
-
+
@@ -55,7 +55,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
select u.user_id, u.dept_id, u.user_name, u.nick_name, u.email, u.avatar, u.phonenumber, u.password, u.sex, u.status, u.del_flag, u.login_ip, u.login_date, u.create_by, u.create_time, u.remark,
- u.yljg,
+ u.hos_id,
d.dept_id, d.parent_id, d.ancestors, d.dept_name, d.order_num, d.leader, d.status as dept_status,
r.role_id, r.role_name, r.role_key, r.role_sort, r.data_scope, r.status as role_status
from sys_user u
@@ -141,7 +141,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"