陈昶聿
5 天以前 672412bddd714eed3191b5393b85ab2b22d70e00
【市一】调整mapper获取ordid
已添加2个文件
174 ■■■■■ 文件已修改
ruoyi-common/src/main/java/com/ruoyi/common/annotation/AutoInit.java 39 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-framework/src/main/java/com/ruoyi/framework/aspectj/AutoInitAspect.java 135 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/src/main/java/com/ruoyi/common/annotation/AutoInit.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,39 @@
package com.ruoyi.common.annotation;
import java.lang.annotation.*;
/**
 * è‡ªå®šä¹‰æ³¨è§£ - è‡ªåЍ填充orgid
 *
 * ä½¿ç”¨åœºæ™¯ï¼š
 * åœ¨Controller的增删改查方法上添加此注解,会自动为方法参数对象填充当前登录用户的orgid
 *
 * ç¤ºä¾‹ï¼š
 * @AutoInit
 * @PostMapping
 * public AjaxResult add(@RequestBody YourEntity entity) {
 *     // entity的orgid字段会被自动填充
 *     return toAjax(yourService.insert(entity));
 * }
 *
 * @author smartor
 */
@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface AutoInit {
    /**
     * æ˜¯å¦è¦†ç›–已有的orgid值
     * é»˜è®¤false:如果参数对象的orgid已有值,则不覆盖
     * true:强制覆盖为当前用户的orgid
     */
    boolean override() default false;
    /**
     * æŒ‡å®šè¦å¡«å……orgid的参数名称
     * é»˜è®¤ä¸ºç©ºï¼Œè¡¨ç¤ºè‡ªåŠ¨æŸ¥æ‰¾å¹¶å¡«å……æ‰€æœ‰åŒ…å«orgid字段的参数
     * å¦‚果指定了参数名,则只填充指定的参数对象
     */
    String[] paramNames() default {};
}
ruoyi-framework/src/main/java/com/ruoyi/framework/aspectj/AutoInitAspect.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,135 @@
package com.ruoyi.framework.aspectj;
import com.ruoyi.common.annotation.AutoInit;
import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.common.utils.StringUtils;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.MethodSignature;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import java.lang.reflect.Method;
import java.util.Arrays;
import java.util.List;
/**
 * è‡ªåЍ填充orgid切面
 *
 * @author smartor
 */
@Aspect
@Component
public class AutoInitAspect {
    private static final Logger log = LoggerFactory.getLogger(AutoInit.class);
    /**
     * å®šä¹‰åˆ‡ç‚¹ - æ‹¦æˆªæ‰€æœ‰å¸¦æœ‰@AutoInit注解的方法
     */
    @Pointcut("@annotation(com.ruoyi.common.annotation.AutoInit)")
    public void autoInitPointCut() {
    }
    /**
     * åœ¨æ–¹æ³•执行前自动初始化
     *
     * @param joinPoint åˆ‡ç‚¹
     * @param autoInit æ³¨è§£å¯¹è±¡
     */
    @Before("autoInitPointCut() && @annotation(autoInit)")
    public void doBefore(JoinPoint joinPoint, AutoInit autoInit) {
        try {
            // èŽ·å–å½“å‰ç™»å½•ç”¨æˆ·çš„orgid
            String orgid = SecurityUtils.getLoginUser().getUser().getOrgid();
            // å¦‚æžœorgid为空,则不初始化
            if (StringUtils.isEmpty(orgid)) {
                log.warn("当前用户orgid为空,跳过自动初始化");
                return;
            }
            // èŽ·å–æ–¹æ³•å‚æ•°
            Object[] args = joinPoint.getArgs();
            if (args == null || args.length == 0) {
                return;
            }
            // èŽ·å–æ–¹æ³•ç­¾å
            MethodSignature signature = (MethodSignature) joinPoint.getSignature();
            Method method = signature.getMethod();
            String[] parameterNames = signature.getParameterNames();
            // èŽ·å–æ³¨è§£é…ç½®çš„å‚æ•°ååˆ—è¡¨
            String[] configuredParamNames = autoInit.paramNames();
            List<String> targetParamNames = configuredParamNames.length > 0
                    ? Arrays.asList(configuredParamNames)
                    : null;
            // éåŽ†æ‰€æœ‰å‚æ•°
            for (int i = 0; i < args.length; i++) {
                Object arg = args[i];
                if (arg == null) {
                    continue;
                }
                // å¦‚果指定了参数名,检查当前参数是否在指定列表中
                if (targetParamNames != null && !targetParamNames.contains(parameterNames[i])) {
                    continue;
                }
                // å°è¯•å¡«å……orgid
                setOrgId(arg, orgid, autoInit.override());
            }
        } catch (Exception e) {
            log.error("自动填充orgid失败", e);
        }
    }
    /**
     * å¡«å……orgid到目标对象
     *
     * @param target ç›®æ ‡å¯¹è±¡
     * @param orgid è¦å¡«å……çš„orgid值
     * @param override æ˜¯å¦è¦†ç›–已有值
     */
    private void setOrgId(Object target, String orgid, boolean override) {
        try {
            Class<?> clazz = target.getClass();
            // å°è¯•获取getOrgid方法
            Method getOrgidMethod = null;
            try {
                getOrgidMethod = clazz.getMethod("getOrgid");
            } catch (NoSuchMethodException e) {
                // å¯¹è±¡æ²¡æœ‰getOrgid方法,跳过
                return;
            }
            // æ£€æŸ¥æ˜¯å¦éœ€è¦è¦†ç›–
            if (!override) {
                Object existingOrgid = getOrgidMethod.invoke(target);
                if (existingOrgid != null && StringUtils.isNotEmpty(existingOrgid.toString())) {
                    log.debug("对象已有orgid值: {},跳过填充", existingOrgid);
                    return;
                }
            }
            // èŽ·å–setOrgid方法并填充值
            Method setOrgidMethod = clazz.getMethod("setOrgid", String.class);
            setOrgidMethod.invoke(target, orgid);
            log.debug("成功为对象 {} å¡«å……orgid: {}", clazz.getSimpleName(), orgid);
        } catch (NoSuchMethodException e) {
            // å¯¹è±¡æ²¡æœ‰setOrgid方法,跳过
            log.debug("对象 {} æ²¡æœ‰setOrgid方法,跳过填充", target.getClass().getSimpleName());
        } catch (Exception e) {
            log.error("填充orgid时发生异常: {}", e.getMessage());
        }
    }
}