liusheng
2 天以前 f99cfc5b3f40104749b0eff219b19dae26c1aaab
提交切面
已添加2个文件
199 ■■■■■ 文件已修改
ruoyi-common/src/main/java/com/ruoyi/common/annotation/AddOrgId.java 40 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/src/main/java/com/ruoyi/common/aspectj/SetOrgIdAspect.java 159 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/src/main/java/com/ruoyi/common/annotation/AddOrgId.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,40 @@
package com.ruoyi.common.annotation;
import java.lang.annotation.*;
/**
 * è®¾ç½®æœºæž„ID注解
 * ç”¨äºŽè‡ªåŠ¨å°†å½“å‰ç™»å½•ç”¨æˆ·çš„æœºæž„ID设置到实体对象中
 *
 * @author ls
 */
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface AddOrgId
{
    /**
     * å®žä½“类中机构ID字段的名称,默认为"orgid"
     */
    String field() default "orgid";
    /**
     * å®žä½“参数的索引位置,默认为0(第一个参数)
     */
    int paramIndex() default 0;
    /**
     * å½“字段已经有值时是否跳过设置,默认为true(如果已有值则不覆盖)
     */
    boolean skipIfPresent() default true;
    /**
     * å®žä½“类中院区ID字段的名称,默认为"campusid"
     */
    String campusField() default "campusid";
    /**
     * æ˜¯å¦åŒæ—¶è®¾ç½®é™¢åŒºID,默认为true
     */
    boolean withCampusId() default true;
}
ruoyi-common/src/main/java/com/ruoyi/common/aspectj/SetOrgIdAspect.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,159 @@
package com.ruoyi.common.aspectj;
import com.ruoyi.common.annotation.AddOrgId;
import com.ruoyi.common.core.domain.model.LoginUser;
import com.ruoyi.common.utils.SecurityUtils;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.reflect.MethodSignature;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
/**
 * è®¾ç½®æœºæž„ID
 *
 * @author ls
 */
@Aspect
@Component
public class SetOrgIdAspect
{
    private static final Logger log = LoggerFactory.getLogger(SetOrgIdAspect.class);
    @Before("@annotation(setOrgId)")
    public void setOrgId(JoinPoint joinPoint, AddOrgId setOrgId) throws Throwable
    {
        if (setOrgId != null)
        {
            // èŽ·å–å½“å‰ç™»å½•ç”¨æˆ·
            LoginUser loginUser = SecurityUtils.getLoginUser();
            if (loginUser != null && loginUser.getUser() != null)
            {
                String orgid = loginUser.getUser().getOrgid();
                String campusid = loginUser.getUser().getCampusid();
                // èŽ·å–æ–¹æ³•å‚æ•°
                Object[] args = joinPoint.getArgs();
                int paramIndex = setOrgId.paramIndex();
                if (paramIndex >= 0 && paramIndex < args.length)
                {
                    Object param = args[paramIndex];
                    if (param != null)
                    {
                        // è®¾ç½®orgid
                        if (orgid != null)
                        {
                            // èŽ·å–å­—æ®µåç§°
                            String fieldName = setOrgId.field();
                            // æ£€æŸ¥å­—段是否已经有值,如果有且skipIfPresent为true,则跳过设置
                            Object currentValue = getFieldValue(param, fieldName);
                            if (setOrgId.skipIfPresent() && currentValue != null && !currentValue.toString().isEmpty()) {
                                // å¦‚果字段已经有值且skipIfPresent为true,则跳过设置
                                log.debug("字段 {} å·²æœ‰å€¼: {},跳过设置", fieldName, currentValue);
                            } else {
                                setFieldValue(param, fieldName, orgid);
                            }
                        }
                        // å¦‚果需要同时设置campusid
                        if (setOrgId.withCampusId() && campusid != null)
                        {
                            String campusFieldName = setOrgId.campusField();
                            // æ£€æŸ¥å­—段是否已经有值,如果有且skipIfPresent为true,则跳过设置
                            Object currentValueCampus = getFieldValue(param, campusFieldName);
                            if (setOrgId.skipIfPresent() && currentValueCampus != null && !currentValueCampus.toString().isEmpty()) {
                                // å¦‚果字段已经有值且skipIfPresent为true,则跳过设置
                                log.debug("字段 {} å·²æœ‰å€¼: {},跳过设置", campusFieldName, currentValueCampus);
                            } else {
                                setFieldValue(param, campusFieldName, campusid);
                            }
                        }
                    }
                }
            }
        }
    }
    /**
     * èŽ·å–æ³¨è§£
     */
    private AddOrgId getAnnotationLog(JoinPoint joinPoint) throws Exception
    {
        MethodSignature signature = (MethodSignature) joinPoint.getSignature();
        Method method = signature.getMethod();
        if (method != null)
        {
            return method.getAnnotation(AddOrgId.class);
        }
        return null;
    }
    /**
     * èŽ·å–å¯¹è±¡å­—æ®µçš„å€¼
     */
    private Object getFieldValue(Object obj, String fieldName) throws Exception
    {
        Class<?> clazz = obj.getClass();
        Field field = null;
        // æŸ¥æ‰¾å­—段,包括父类中的字段
        while (clazz != null && field == null)
        {
            try
            {
                field = clazz.getDeclaredField(fieldName);
            }
            catch (NoSuchFieldException e)
            {
                clazz = clazz.getSuperclass();
            }
        }
        if (field != null)
        {
            field.setAccessible(true);
            return field.get(obj);
        }
        return null;
    }
    /**
     * è®¾ç½®å¯¹è±¡å­—段的值
     */
    private void setFieldValue(Object obj, String fieldName, Object value) throws Exception
    {
        Class<?> clazz = obj.getClass();
        Field field = null;
        // æŸ¥æ‰¾å­—段,包括父类中的字段
        while (clazz != null && field == null)
        {
            try
            {
                field = clazz.getDeclaredField(fieldName);
            }
            catch (NoSuchFieldException e)
            {
                clazz = clazz.getSuperclass();
            }
        }
        if (field != null)
        {
            field.setAccessible(true);
            field.set(obj, value);
        }
        else
        {
            log.warn("未找到字段: {} åœ¨ç±»: {} åŠå…¶çˆ¶ç±»ä¸­", fieldName, obj.getClass().getName());
        }
    }
}