package com.cf.imes.framework.organ.core.aop;

import com.cf.imes.framework.organ.core.context.OrganContextHolder;
import com.cf.imes.framework.organ.core.util.OrganUtils;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;

/**
 * 忽略多组织的 Aspect，基于 {@link OrganIgnore} 注解实现，用于一些全局的逻辑。
 * 例如说，一个定时任务，读取所有数据，进行处理。
 * 又例如说，读取所有数据，进行缓存。
 *
 * 整体逻辑的实现，和 {@link OrganUtils#executeIgnore(Runnable)} 需要保持一致
 *
 * @author 晨丰科技
 */
@Aspect
@Slf4j
public class OrganIgnoreAspect {

    @Around("@annotation(organIgnore)")
    public Object around(ProceedingJoinPoint joinPoint, OrganIgnore organIgnore) throws Throwable {
        Boolean oldIgnore = OrganContextHolder.isIgnore();
        try {
            OrganContextHolder.setIgnore(true);
            // 执行逻辑
            return joinPoint.proceed();
        } finally {
            OrganContextHolder.setIgnore(oldIgnore);
        }
    }

}
