package com.unis.crk.aop;

import com.unis.crk.rabbitmq.RabbitConfig;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.Signature;
import org.aspectj.lang.annotation.*;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.lang.reflect.Method;

@Aspect
@Component
@SuppressWarnings("unused")
public class uploaderceptor {

    @Autowired
    private RabbitTemplate rabbitTemplate;
    //配置接入点
    @Pointcut("@annotation(com.unis.crk.aop.SystemLog)")
    private void serviceAspect() {
    }//定义一个切入点


//    @AfterReturning("serviceAspect()")
    public void doAfterReturning(JoinPoint pjp) throws Throwable {

        //方法通知前获取时间,为什么要记录这个时间呢？当然是用来计算模块执行时间的
        long start = System.currentTimeMillis();
        // 拦截的实体类，就是当前正在执行的controller
        Object target = pjp.getTarget();
        // 拦截的方法名称。当前正在执行的方法
        String methodName = pjp.getSignature().getName();
        // 拦截的方法参数
        Object[] args = pjp.getArgs();
        // 拦截的放参数类型
        Signature sig = pjp.getSignature();
        MethodSignature msig = null;
        if (!(sig instanceof MethodSignature)) {
            throw new IllegalArgumentException("该注解只能用于方法");
        }
        msig = (MethodSignature) sig;
        Class[] parameterTypes = msig.getMethod().getParameterTypes();

        Object object = null;
        // 获得被拦截的方法
        Method method = null;

            method = target.getClass().getMethod(methodName, parameterTypes);
            if (null != method) {
                // 判断是否包含自定义的注解，说明一下这里的SystemLog就是我自己自定义的注解
                if (method.isAnnotationPresent(SystemLog.class)) {
                    //通过特定的注解,取得需要上传的数据对应的QUEUE_NAME,执行业务进行上传
                    SystemLog systemlog = method.getAnnotation(SystemLog.class);
                    try {
//                            rabbitTemplate.convertAndSend(RabbitConfig.CRK_EXCHANGE_NAME, RabbitConfig.CRK_QUEUE_NAME, systemlog.uploadName()+"|"+systemlog.methods());
//                            System.out.println("消息已发送!");
                        } catch (Exception e1) {
                            e1.printStackTrace();
                        }finally {
                            }
                } else {//没有包含注解
                }
            } else { //不需要拦截直接执行
            }


    }
}