package com.ruoyi.execution.produce.dispersed.service.templateimpl;


import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.execution.produce.dispersed.service.IRunBPMService;
import com.ruoyi.execution.produce.dispersed.enetity.BpmExecuteNode;
import com.ruoyi.execution.produce.dispersed.service.IBpmExecuteNodeService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import javax.annotation.PreDestroy;
import java.util.List;
import java.util.Map;

/**
 * @author hanzihang
 * @date 2023/11/3
 * <p>
 * 当前bean名称必填项！
 * {
 * @AliasFor(annotation = Component.class)
 * String value() default "";
 * }
 * <p>
 * 使用 @Scope("prototype") 注解指定了 bean 的作用域为 prototype。
 * 这样，在每次通过 applicationContext.getBean()
 * 获取该 bean 的实例时，都会返回一个新的实例。从而避免并发的的操作
 */
@Service("RunBPMImpl")
public class RunBPMImpl implements IRunBPMService {

    @Autowired
    private IBpmExecuteNodeService bpmExecuteNodeService;

    /**
     * 前置验证节点
     *
     * @param executionFlowKey 执行流程key
     * @param executionNodeKey 执行节点key
     * @param executionMap     其他执行参数
     * @return
     */
    @Override
    public AjaxResult preValidation(String executionFlowKey, String executionNodeKey, Map<String, Object> executionMap) {
        System.out.println("测试RunBPMImpl成功！");
        List<BpmExecuteNode> list = bpmExecuteNodeService.selectBpmExecuteNodeList(new BpmExecuteNode());
        return AjaxResult.success(list);
    }

    /**
     * 节点执行流程
     *
     * @param executionFlowKey 执行流程key
     * @param executionNodeKey 执行节点key
     * @param executionMap     其他执行参数
     * @return
     */
    @Override
    public AjaxResult executeNode(String executionFlowKey, String executionNodeKey, Map<String, Object> executionMap) {
        return null;
    }

    /**
     * 后置验证节点
     *
     * @param executionFlowKey 执行流程key
     * @param executionNodeKey 执行节点key
     * @param executionMap     其他执行参数
     * @return
     * @PreDestroy 注解用来清理当前bean。
     * spring不会清理prototype作用域的bean。
     */
    @Override
    public AjaxResult afterValidation(String executionFlowKey, String executionNodeKey, Map<String, Object> executionMap) {
        return null;
    }

    /**
     * 需要手动修改返回为true！当前实现类中不得写逻辑代码！
     * 此操作只为验证当前实现类是否存在！
     *
     * @return
     */
    @Override
    public boolean isVerificationMethod() {
        return true;
    }

    @Override
    @PreDestroy
    public boolean preDestroy() {
        // 执行清理操作
        System.out.println("清理成功！");
        return true;
    }
}
