diff --git a/src/main/java/com/gaotao/common/utils/LoginUserContextUtils.java b/src/main/java/com/gaotao/common/utils/LoginUserContextUtils.java new file mode 100644 index 00000000..0ffa1fd2 --- /dev/null +++ b/src/main/java/com/gaotao/common/utils/LoginUserContextUtils.java @@ -0,0 +1,36 @@ +package com.gaotao.common.utils; + +import com.gaotao.modules.sys.entity.SysUserEntity; +import org.apache.commons.lang3.StringUtils; +import org.apache.shiro.SecurityUtils; + +/** + * 登录人上下文工具 + * 统一提供当前会话登录名,供 MyBatis 权限注入与业务代码复用。 + */ +public final class LoginUserContextUtils { + + private LoginUserContextUtils() { + } + + /** + * 获取当前登录名(access_site.user_id 对应字段)。 + * 无登录上下文(如定时任务)时返回 null。 + */ + public static String getCurrentLoginAccount() { + try { + Object principal = SecurityUtils.getSubject().getPrincipal(); + if (principal instanceof SysUserEntity) { + String principalName = ((SysUserEntity) principal).getUsername(); + return StringUtils.isBlank(principalName) ? null : principalName.trim(); + } + if (principal instanceof String) { + String principalName = (String) principal; + return StringUtils.isBlank(principalName) ? null : principalName.trim(); + } + } catch (Exception ignored) { + // 定时任务/匿名访问等场景没有登录态,按 null 处理 + } + return null; + } +} diff --git a/src/main/java/com/gaotao/config/MybatisLoginUserInterceptor.java b/src/main/java/com/gaotao/config/MybatisLoginUserInterceptor.java new file mode 100644 index 00000000..c143a59d --- /dev/null +++ b/src/main/java/com/gaotao/config/MybatisLoginUserInterceptor.java @@ -0,0 +1,114 @@ +package com.gaotao.config; + +import com.gaotao.common.utils.LoginUserContextUtils; +import org.apache.ibatis.cache.CacheKey; +import org.apache.ibatis.executor.Executor; +import org.apache.ibatis.executor.statement.StatementHandler; +import org.apache.ibatis.mapping.BoundSql; +import org.apache.ibatis.mapping.MappedStatement; +import org.apache.ibatis.plugin.Interceptor; +import org.apache.ibatis.plugin.Intercepts; +import org.apache.ibatis.plugin.Invocation; +import org.apache.ibatis.plugin.Plugin; +import org.apache.ibatis.plugin.Signature; +import org.apache.ibatis.reflection.MetaObject; +import org.apache.ibatis.reflection.SystemMetaObject; +import org.apache.ibatis.session.ResultHandler; +import org.apache.ibatis.session.RowBounds; +import org.springframework.core.Ordered; +import org.springframework.core.annotation.Order; +import org.springframework.stereotype.Component; + +import java.sql.Connection; +import java.util.Map; +import java.util.Properties; + +/** + * 统一注入当前登录名,供 Mapper 直接使用 currentLoginUserName。 + */ +@Component +@Order(Ordered.LOWEST_PRECEDENCE) +@Intercepts({ + @Signature(type = Executor.class, method = "update", args = {MappedStatement.class, Object.class}), + @Signature(type = Executor.class, method = "query", args = { + MappedStatement.class, Object.class, RowBounds.class, ResultHandler.class + }), + @Signature(type = Executor.class, method = "query", args = { + MappedStatement.class, Object.class, RowBounds.class, ResultHandler.class, CacheKey.class, BoundSql.class + }), + @Signature(type = StatementHandler.class, method = "prepare", args = {Connection.class, Integer.class}) +}) +public class MybatisLoginUserInterceptor implements Interceptor { + + private static final String LOGIN_USER_PARAM = "currentLoginUserName"; + + @Override + public Object intercept(Invocation invocation) throws Throwable { + String loginUserName = LoginUserContextUtils.getCurrentLoginAccount(); + Object target = invocation.getTarget(); + if (target instanceof Executor) { + injectToParameterObject(invocation.getArgs(), loginUserName); + } else if (target instanceof StatementHandler) { + injectToBoundSql((StatementHandler) target, loginUserName); + } + return invocation.proceed(); + } + + @SuppressWarnings("unchecked") + private void injectToParameterObject(Object[] args, String loginUserName) { + if (args == null || args.length < 2) { + return; + } + Object parameterObject = args[1]; + if (parameterObject == null) { + return; + } + + if (parameterObject instanceof Map) { + Map paramMap = (Map) parameterObject; + if (!paramMap.containsKey(LOGIN_USER_PARAM)) { + paramMap.put(LOGIN_USER_PARAM, loginUserName); + } + if (paramMap.containsKey("params")) { + Object paramsObject = paramMap.get("params"); + if (paramsObject != null) { + injectToBeanOrMap(paramsObject, loginUserName); + } + } + return; + } + injectToBeanOrMap(parameterObject, loginUserName); + } + + @SuppressWarnings("unchecked") + private void injectToBeanOrMap(Object bean, String loginUserName) { + if (bean instanceof Map) { + Map mapBean = (Map) bean; + if (!mapBean.containsKey(LOGIN_USER_PARAM)) { + mapBean.put(LOGIN_USER_PARAM, loginUserName); + } + return; + } + MetaObject metaObject = SystemMetaObject.forObject(bean); + if (metaObject.hasSetter(LOGIN_USER_PARAM) && metaObject.getValue(LOGIN_USER_PARAM) == null) { + metaObject.setValue(LOGIN_USER_PARAM, loginUserName); + } + } + + private void injectToBoundSql(StatementHandler statementHandler, String loginUserName) { + BoundSql boundSql = statementHandler.getBoundSql(); + if (boundSql != null && !boundSql.hasAdditionalParameter(LOGIN_USER_PARAM)) { + boundSql.setAdditionalParameter(LOGIN_USER_PARAM, loginUserName); + } + } + + @Override + public Object plugin(Object target) { + return Plugin.wrap(target, this); + } + + @Override + public void setProperties(Properties properties) { + // no-op + } +} diff --git a/src/main/java/com/gaotao/config/MybatisPlusConfig.java b/src/main/java/com/gaotao/config/MybatisPlusConfig.java index 772ee3c6..d7c79669 100644 --- a/src/main/java/com/gaotao/config/MybatisPlusConfig.java +++ b/src/main/java/com/gaotao/config/MybatisPlusConfig.java @@ -4,6 +4,8 @@ import com.baomidou.mybatisplus.annotation.DbType; import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor; import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor; import com.gaotao.common.batch.NoahSqlInjector; +import org.springframework.core.Ordered; +import org.springframework.core.annotation.Order; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @@ -34,6 +36,7 @@ public class MybatisPlusConfig { }*/ @Bean + @Order(Ordered.HIGHEST_PRECEDENCE) public MybatisPlusInterceptor mybatisPlusInterceptor() { MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor(); // 当前页码大于总页数返回首页 diff --git a/src/main/java/com/gaotao/modules/handlingunit/controller/PdaLabelController.java b/src/main/java/com/gaotao/modules/handlingunit/controller/PdaLabelController.java index 823458e9..b407bcf6 100644 --- a/src/main/java/com/gaotao/modules/handlingunit/controller/PdaLabelController.java +++ b/src/main/java/com/gaotao/modules/handlingunit/controller/PdaLabelController.java @@ -59,16 +59,16 @@ public class PdaLabelController extends AbstractController { @PostMapping("query") public R queryLabelInfo(@RequestBody Map params) { try { - String site = (String) params.get("site"); + //String site = (String) params.get("site"); String labelCode = (String) params.get("labelCode"); log.info("=== 开始查询标签信息 ==="); - log.info("工厂: {}, 标签编码: {}", site, labelCode); + //log.info("工厂: {}, 标签编码: {}", site, labelCode); // 参数验证 - if (site == null || site.trim().isEmpty()) { + /*if (site == null || site.trim().isEmpty()) { return R.error("工厂编码不能为空"); - } + }*/ if (labelCode == null || labelCode.trim().isEmpty()) { return R.error("标签编码不能为空"); @@ -76,12 +76,11 @@ public class PdaLabelController extends AbstractController { // 查询HandlingUnit信息 HandlingUnit handlingUnit = handlingUnitService.lambdaQuery() - .eq(HandlingUnit::getSite, site) .eq(HandlingUnit::getUnitId, labelCode.trim()) .one(); if (handlingUnit == null) { - log.warn("标签不存在: site={}, labelCode={}", site, labelCode); + log.warn("标签不存在: labelCode={}", labelCode); return R.error("标签不存在"); } if(!"Y".equals(handlingUnit.getInStockFlag()) && !"X".equals(handlingUnit.getInStockFlag())){ diff --git a/src/main/resources/mapper/procurement/PoReceiptMapper.xml b/src/main/resources/mapper/procurement/PoReceiptMapper.xml index ada2cf32..74d27f21 100644 --- a/src/main/resources/mapper/procurement/PoReceiptMapper.xml +++ b/src/main/resources/mapper/procurement/PoReceiptMapper.xml @@ -64,8 +64,19 @@ FROM po_receipt_detail prd LEFT JOIN po_receipt pr ON prd.receipt_no = pr.receipt_no AND prd.site = pr.site - - AND prd.site = #{params.site} + + AND EXISTS ( + SELECT 1 + FROM access_site ac + WHERE ac.user_id = #{currentLoginUserName} + + AND ( + ac.site LIKE #{params.site} + OR ISNULL(NULLIF(ac.sub_site_id, ''), ac.site) LIKE #{params.site} + ) + + AND prd.site = ISNULL(NULLIF(ac.sub_site_id, ''), ac.site) + ) AND prd.receipt_no LIKE CONCAT('%', #{params.receiptNo}, '%') diff --git a/src/main/resources/mapper/warehouse/LabelQueryMapper.xml b/src/main/resources/mapper/warehouse/LabelQueryMapper.xml index 8fec4064..e4922203 100644 --- a/src/main/resources/mapper/warehouse/LabelQueryMapper.xml +++ b/src/main/resources/mapper/warehouse/LabelQueryMapper.xml @@ -37,8 +37,19 @@ LEFT JOIN warehouse w WITH (NOLOCK) ON h.warehouse_id = w.WareHouseID AND h.site = w.Site LEFT JOIN location l WITH (NOLOCK) ON h.location_id = l.LocationID AND h.site = l.Site - - AND h.site = #{params.site} + + AND EXISTS ( + SELECT 1 + FROM access_site ac + WHERE ac.user_id = #{currentLoginUserName} + + AND ( + ac.site LIKE #{params.site} + OR ISNULL(NULLIF(ac.sub_site_id, ''), ac.site) LIKE #{params.site} + ) + + AND h.site = ISNULL(NULLIF(ac.sub_site_id, ''), ac.site) + ) AND h.in_stock_flag = #{params.inStockFlag}