/*
 * Copyright (c) 2023 codvision.com All Rights Reserved.
 */

package com.codvision.workflow.service;

import com.codvision.webcore.service.IBaseService;
import com.codvision.workflow.entity.WorkFlowRecord;
import com.codvision.workflow.entity.vo.WorkFlowRecordVO;

import java.util.List;

/**
 * @author hxl
 */
public interface WorkFlowRecordService extends IBaseService<WorkFlowRecord, WorkFlowRecordVO> {

    /**
     * 根据流程实例ID获取列表
     * @param instanceId 流程实例ID
     * @return 列表
     */
    List<WorkFlowRecordVO> getListByInstanceId(String instanceId);

    /**
     * 获取最新记录
     * @param instanceId 流程实例ID
     * @return 最新记录
     */
    WorkFlowRecord getLatestByInstanceId(String instanceId);

    /**
     * 获取最新记录
     * @param instanceId 流程实例ID
     * @param activityId 活动ID
     * @return 最新记录
     */
    WorkFlowRecord getLatestByInstanceIdAndActivityId(String instanceId, String activityId);

    /**
     * 添加自定义记录
     * @param taskId 任务ID
     * @param operationType 操作类型
     */
    void addCustomRecord(String taskId, Integer operationType);

    /**
     * 根据任务ID获取信息
     * @param taskId 任务ID
     * @return 当前正在执行的任务记录
     */
    WorkFlowRecord getByTodoTaskId(String taskId);

    /**
     * 根据任务ID获取信息
     * @param taskId 任务ID
     * @return 任务记录
     */
    WorkFlowRecord getByTaskId(String taskId);

    /**
     * 根据任务ID与处理动作查询
     * @param taskId 任务ID
     * @param action 处理动作
     * @return 操作记录
     */
    WorkFlowRecord getByTaskIdAndAction(String taskId, Integer action);

    /**
     * 清除当前流程的所有操作记录
     * @param instanceId 流程实例ID
     */
    void delAllByInstanceId(String instanceId);

    /**
     * 清除相应的任务操作记录
     * @param taskId 任务ID
     */
    void delByTaskId(String taskId);

    /**
     * 初始化流程开始记录
     * @param instanceId 流程实例ID
     */
    void initStartRecords(String instanceId);

    /**
     * 添加任务记录
     * @param taskId 任务ID
     * @param action 处理动作
     * @param comment 操作备注
     * @param formDataJson 表单数据
     */
    void addTaskRecord(String taskId, Integer action, String comment, String formDataJson);

    /**
     * 添加退回记录
     * @param processInstanceId 流程实例ID
     * @param targetActivityId 目标活动ID
     * @param currentTime 当前时间
     */
    void addReturnRecord(String processInstanceId, String targetActivityId, String currentTime);

    /**
     * 更新当前任务记录
     * @param taskId 任务ID
     * @param action 处理动作
     * @param comment 操作备注
     * @param currentTime 当前时间
     * @return 操作记录
     */
    WorkFlowRecord updateCurrentTaskRecord(String taskId, Integer action, String comment, String currentTime);

    /**
     * 根据流程实例ID与活动ID与任务ID删除记录
     * @param instanceId 流程实例ID
     * @param activityId 活动ID
     * @param taskIds 任务ID集合
     */
    void delByInstanceIdAndActivityIdAndTaskIds(String instanceId, String activityId, List<String> taskIds);
}
