定义注解

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface FlowStart {

    /**
     * 流程类型
     */
    String flowType();

    /**
     * uuid
     */
    String uuid();

    /**
     * 是否删除原来流程
     */
    boolean deleteOld() default false;
}

定义切面

/**
 * 流程启动切面
 * @author GuoYong
 * @since 2023/9/6
 */
@Aspect
@Component
public class FlowStartAspect {

    private final ProcessInstanceClient processInstanceClient;

    public FlowStartAspect(ProcessInstanceClient processInstanceClient) {
        this.processInstanceClient = processInstanceClient;
    }

    /**
     * 定义切面
     */
    @Pointcut("execution(@com.config.FlowStart * *(..))")
    private void startAspect() {

    }

    @Around("startAspect()")
    public Object around(ProceedingJoinPoint joinPoint) throws Throwable {
        Object[] args = joinPoint.getArgs();
        Object proceeded = joinPoint.proceed(args);
        // 获取注解
        FlowStart flowStart = getAnnotationLog(joinPoint);
        // 获取注解的值
        String flowType = flowStart.flowType();
        String uuidEl = flowStart.uuid();
        boolean deleteOld = flowStart.deleteOld();
        // 解析el表达式
        ExpressionParser parser = new SpelExpressionParser();
        LocalVariableTableParameterNameDiscoverer discoverer = new LocalVariableTableParameterNameDiscoverer();
        Method targetMethod = getTargetMethod(joinPoint);
        String[] params = discoverer.getParameterNames(targetMethod);
        EvaluationContext context = new StandardEvaluationContext();
        for (int len = 0; len < params.length; len++) {
            context.setVariable(params[len], args[len]);
        }
        Expression expression = parser.parseExpression(uuidEl);
        String uuids = expression.getValue(context, String.class);
        String [] uuidArray = uuids.split(",");
        for (String uuid : uuidArray) {
            if (deleteOld) {
                processInstanceClient.deleteByBusinessKey(uuid);
            }
            Result result = processInstanceClient.init(InitProcessDto.builder()
                    .businessKey(uuid)
                    .processKey(flowType)
                    .build());
            if (!result.isOk()) {
                throw new RuntimeException("流程启动失败");
            }
        }
        return proceeded;
    }

    private Method getTargetMethod(JoinPoint joinPoint) {
        Signature signature = joinPoint.getSignature();
        MethodSignature methodSignature = (MethodSignature) signature;
        Method method = methodSignature.getMethod();
        return method;
    }

    /**
     * 是否存在注解,如果存在就获取
     */
    private FlowStart getAnnotationLog(JoinPoint joinPoint) {
        Method method = getTargetMethod(joinPoint);
        if (method != null) {
            return method.getAnnotation(FlowStart.class);
        }
        return null;
    }

}

使用

  @FlowStart(flowType = ProcessKeyConstants.DUTY_SCHEDULING_FLOW, uuid = "#editDutySchedulingDto.businessKey", deleteOld = true)
09-07 00:42