package cn.fateverse.workflow.mapper;

import cn.fateverse.workflow.entity.HistoricalOperation;
import cn.fateverse.workflow.enums.OperationStateEnums;
import org.apache.ibatis.annotations.Param;

import java.util.List;

/**
 * @author Clay
 * @date 2023-02-24
 */
public interface HistoricalOperationMapper {
    /**
     * 根据流程实例id查询到操作历史
     *
     * @param processInstanceId 流程实例id
     * @return 操作历史数据
     */
    List<HistoricalOperation> selectListByProcessInstanceId(@Param("processInstanceId") String processInstanceId, @Param("mark") Integer mark);

    /**
     * 根据任务id查询到操作历史
     *
     * @param taskId 任务id
     * @return 操作历史
     */
    HistoricalOperation selectByTaskId(String taskId);

    /**
     * 根据流程实例id和nodeid获取到操作历史
     *
     * @param processInstanceId 流程实例id
     * @param nodeId            节点id
     * @return 操作历史
     */
    HistoricalOperation selectByProcessInstanceIdAndNodeId(@Param("processInstanceId") String processInstanceId, @Param("nodeId") String nodeId);

    /**
     * 获取到其他正在运行的节点
     *
     * @param processInstanceId 流程实例id
     * @return 操作历史
     */
    List<HistoricalOperation> selectByProcessInstanceIdAndNotNodeId(@Param("processInstanceId") String processInstanceId, @Param("state") String state);

    /**
     * 新增操作历史
     *
     * @param historicalOperation 操作历史
     * @return 结果
     */
    int insert(HistoricalOperation historicalOperation);

    /**
     * @param historicalOperation 操作历史
     * @return 结果
     */
    int update(HistoricalOperation historicalOperation);

    /**
     * 批量更新操作历史
     *
     * @param operationList 操作历史
     * @return 结果
     */
    int batchUpdate(List<HistoricalOperation> operationList);

    /**
     * 根据当前流程实例id和节点id查询是否存在数据
     *
     * @param processInstanceId 流程实例id
     * @param nodeId            节点id
     * @return 数量
     */
    int selectCountByProcessInstanceIdAndNodeId(@Param("processInstanceId") String processInstanceId, @Param("nodeId") String nodeId);

    /**
     * 根据当前接地那实例id和节点id更新操作历史状态
     *
     * @param processInstanceId 流程实例id
     * @param nodeId            节点id
     * @param state             状态
     * @return 改变数据
     */
    int updateStatusByProcessInstanceIdAndNodeId(@Param("processInstanceId") String processInstanceId,
                                                 @Param("nodeId") String nodeId,
                                                 @Param("state") OperationStateEnums state);

    /**
     * 获取到所有运行中的节点信息
     *
     * @param processInstanceListIds 流程实例ids
     * @return 流程实例数据
     */
    List<HistoricalOperation> selectRunningByProcessInstanceId(List<String> processInstanceListIds);
}
