All Downloads are FREE. Search and download functionalities are using the official Maven repository.

cn.schoolwow.quickflow.service.quickFlow.execute.QuickFlowExecuteOperationImpl Maven / Gradle / Ivy

package cn.schoolwow.quickflow.service.quickFlow.execute;

import cn.schoolwow.quickflow.QuickFlow;
import cn.schoolwow.quickflow.QuickFlowBuilder;
import cn.schoolwow.quickflow.QuickFlowExecutor;
import cn.schoolwow.quickflow.domain.*;
import cn.schoolwow.quickflow.dto.FlowContextDataRange;
import cn.schoolwow.quickflow.flow.BusinessFlow;
import cn.schoolwow.quickflow.flow.CompositeBusinessFlow;
import cn.schoolwow.quickflow.listener.SingleFlowListener;
import cn.schoolwow.quickflow.listener.TryCatchFinallyHandler;
import cn.schoolwow.quickflow.util.QuickFlowConfigUtil;
import cn.schoolwow.quickflow.util.QuickFlowUtil;
import com.alibaba.fastjson.JSONObject;

import java.util.HashMap;
import java.util.concurrent.ConcurrentHashMap;

public class QuickFlowExecuteOperationImpl implements QuickFlowExecuteOperation {
    /**流程配置信息*/
    private FlowConfig flowConfig;

    public QuickFlowExecuteOperationImpl(FlowConfig flowConfig) {
        this.flowConfig = flowConfig;
    }

    /**
     * 构建流程
     * */
    @Override
    public QuickFlowExecutor startFlow(String name) {
        if(null==name||name.isEmpty()){
            throw new IllegalArgumentException("请指定主流程名称!");
        }
        FlowExecutorConfig flowExecutorConfig = new FlowExecutorConfig();
        flowExecutorConfig.name = name;
        flowExecutorConfig.flowContext = QuickFlowUtil.getFlowContextInvocationHandler(flowExecutorConfig);
        flowExecutorConfig.currentCompositeFlowDataMap = new ConcurrentHashMap<>();
        if(null!=flowExecutorConfig.parentFlowExecutorConfig){
            flowExecutorConfig.currentCompositeFlowDataMap.putAll(flowExecutorConfig.parentFlowExecutorConfig.currentCompositeFlowDataMap);
        }

        FlowExecutorRootConfig flowExecutorRootConfig = new FlowExecutorRootConfig();
        flowExecutorRootConfig.threadLocalDataMap.set(new HashMap<>());
        flowExecutorRootConfig.flowConfig = flowConfig;
        flowExecutorRootConfig.quickFlow = flowConfig.quickFlow;
        flowExecutorConfig.flowExecutorRootConfig = flowExecutorRootConfig;

        return QuickFlowUtil.getQuickFlowExecutorInvocationHandler(flowExecutorConfig);
    }

    /**
     * 构建流程
     * */
    @Override
    public QuickFlowExecutor startFlow(BusinessFlow businessFlow) {
        return startFlow(businessFlow.name())
                .next(businessFlow);
    }

    /**
     * 构建流程
     * */
    @Override
    public QuickFlowExecutor startFlow(FlowExecutorOption flowExecutorOption) {
        if(null==flowConfig.flowConfigHandlerContext.flowMappingHandler){
            throw new IllegalArgumentException("请先指定流程名称实例映射处理器!");
        }
        if(null==flowExecutorOption.name||flowExecutorOption.name.isEmpty()){
            throw new IllegalArgumentException("请先指定流程名称!");
        }
        //首先查找复合流程
        {
            CompositeBusinessFlow compositeBusinessFlow = flowConfig.flowConfigHandlerContext.flowMappingHandler.getCompositeBusinessFlow(flowExecutorOption.name);
            if(null!=compositeBusinessFlow){
                return startFlow(compositeBusinessFlow)
                        .putFlowContextDataMap(flowExecutorOption.requestData, FlowContextDataRange.Flow);
            }
        }
        //其次查找单个流程
        {
            BusinessFlow businessFlow = flowConfig.flowConfigHandlerContext.flowMappingHandler.getFlow(flowExecutorOption.name);
            if(null!=businessFlow){
                return startFlow(businessFlow)
                        .putFlowContextDataMap(flowExecutorOption.requestData, FlowContextDataRange.Flow);
            }
        }
        //剩下为自定义流程
        if(null==flowExecutorOption.flowArray||flowExecutorOption.flowArray.isEmpty()){
            throw new IllegalArgumentException("请指定流程列表!");
        }
        QuickFlowExecutor quickFlowExecutor = startFlow(flowExecutorOption.name)
                .putFlowContextDataMap(flowExecutorOption.requestData, FlowContextDataRange.Flow);
        for(int i=0;i




© 2015 - 2025 Weber Informatics LLC | Privacy Policy