//package com.base.step.aop;
//
//import com.alibaba.fastjson.JSON;
//import com.alibaba.fastjson.JSONArray;
//import com.alibaba.fastjson.JSONObject;
//import com.base.api.client.FzTaskRpcService;
//import com.base.api.model.FzTaskRpcDTO;
//import com.base.api.model.request.FzTaskInfoRpcReqDTO;
//import com.base.orbit.web.Result;
//import lombok.extern.slf4j.Slf4j;
//import org.aspectj.lang.ProceedingJoinPoint;
//import org.aspectj.lang.annotation.Around;
//import org.aspectj.lang.annotation.Aspect;
//import org.aspectj.lang.annotation.Pointcut;
//import org.aspectj.lang.reflect.MethodSignature;
//import org.springframework.stereotype.Component;
//
//import javax.annotation.Resource;
//import java.lang.reflect.Method;
//import java.util.*;
//
///**
// * 任务执行状态反馈
// *
// * @author xj
// * @date 2023-06-01
// */
//@Aspect
//@Component
//@Slf4j
//public class IndicationStepAspect {
//
//    @Resource
//    MqService mqService;
//
//    @Resource
//    FzTaskRpcService fzTaskRpcService;
//
//    @Pointcut("@annotation(com.base.step.aop.IndicationStep)")
//    public void IndicationStep() {
//    }
//
//    /**
//     * 环绕通知 = 前置通知+目标方法执行+后置 proceed方法就是用于启动目标方法执行
//     *
//     * @param joinPoint
//     * @throws InterruptedException
//     */
//    @Around(value = "IndicationStep()")
//    public Object aroundStep(ProceedingJoinPoint joinPoint) throws InterruptedException {
//        MethodSignature methodSignature = (MethodSignature) joinPoint.getSignature();
//        Method method = methodSignature.getMethod();
//        //  执行目标方法前，获取请求参数，根据请求参数获取需求id从而获取taskId
//        Object[] args = joinPoint.getArgs();
//        String taskId = getTaskIdByObjArr(args);
//        Objects.requireNonNull(taskId, "taskId must be not null !!!");
//        //  获取当前步骤信息
//        IndicationStep indicationStep = method.getAnnotation(IndicationStep.class);
//        IndicationStepEnums[] stepEnums = indicationStep.value();
//        try {
//            //  执行目标方法
//            Object obj = joinPoint.proceed();
//            if (Objects.nonNull(obj)) {
//                //  执行目标方法后，上报任务执行状态
//                mqService.sendIndicatorState(taskId, IndicationStateEnums.SUCCESS, stepEnums);
//            } else {
//                mqService.sendIndicatorState(taskId, IndicationStateEnums.FAIL, stepEnums);
//            }
//            return obj;
//        } catch (Exception e) {
//            e.printStackTrace();
//            //  执行方法异常后，上报任务异常状态
//            mqService.sendIndicatorState(taskId, IndicationStateEnums.EXCEPTION, stepEnums);
//        } catch (Throwable t) {
//            t.printStackTrace();
//            //  执行方法异常后，上报任务异常状态
//            mqService.sendIndicatorState(taskId, IndicationStateEnums.EXCEPTION, stepEnums);
//        }
//        return Result.error();
//    }
//
//
//    /**
//     * 根据请求参数
//     *
//     * @param args
//     * @return
//     */
//    public String getTaskIdByObjArr(Object[] args) {
//        String taskId = null;
//        Map map = JSON.parseObject(JSON.toJSONString(args[0]), Map.class);
//        List<String> reqs = new ArrayList<>();
//        if (map.get("reqIds") instanceof JSONArray) {
//            reqs.addAll(JSON.parseArray(JSON.toJSONString(map.get("reqIds")), String.class));
//        } else if (map.get("reqIds") instanceof JSONObject) {
//            reqs.add(JSON.parseObject(JSON.toJSONString(map.get("reqIds")), String.class));
//        }
//        //  根据需求id查询任务id
//        FzTaskInfoRpcReqDTO fzTaskInfoRpcReqDTO = new FzTaskInfoRpcReqDTO();
//        fzTaskInfoRpcReqDTO.setReqIds(reqs);
//        List<FzTaskRpcDTO> fzTaskDTOList = fzTaskRpcService.getFzTaskDTOList(fzTaskInfoRpcReqDTO);
//        Optional<FzTaskRpcDTO> taskRpcDTO = fzTaskDTOList.stream().findFirst();
//        if (taskRpcDTO.isPresent()) {
//            taskId = taskRpcDTO.get().getTaskId();
//        }
//        return taskId;
//    }
//}