package com.yunzhupaas.workflow.service;

import com.baomidou.mybatisplus.core.toolkit.support.SFunction;
import com.yunzhupaas.base.ActionResult;
import com.yunzhupaas.exception.WorkFlowException;
import com.yunzhupaas.flowable.entity.DelegateEntity;
import com.yunzhupaas.flowable.entity.RecordEntity;
import com.yunzhupaas.flowable.entity.TaskEntity;
import com.yunzhupaas.flowable.model.operator.OperatorVo;
import com.yunzhupaas.flowable.model.task.FileModel;
import com.yunzhupaas.flowable.model.task.FlowModel;
import com.yunzhupaas.flowable.model.task.TaskPagination;

import java.util.List;

/**
 * 类的描述
 *
 * @author YUNZHUPAASYUNZHUPAAS开发组
 * @version 5.0.x
 * @since 2024/5/28 14:35
 */
public interface TaskApi {
    /**
     * 获取归档所需的信息
     *
     * @param taskId 任务主键
     */
    FileModel getFileModel(String taskId) throws WorkFlowException;

    /**
     * 信息
     *
     * @param id      主键值
     * @param columns 指定获取的列数据
     */
    TaskEntity getInfoSubmit(String id, SFunction<TaskEntity, ?>... columns);

    /**
     * 信息
     *
     * @param ids     主键值
     * @param columns 指定获取的列数据
     */
    List<TaskEntity> getInfosSubmit(String[] ids, SFunction<TaskEntity, ?>... columns);

    /**
     * 删除
     *
     * @param taskEntity 任务实体
     */
    void delete(TaskEntity taskEntity) throws Exception;

    /**
     * 发起流程
     *
     * @param flowModel
     * @throws Exception
     */
    void saveOrSubmit(FlowModel flowModel) throws Exception;

    /**
     * 根据任务主键获取记录集合
     *
     * @param taskId 任务主键
     */
    List<RecordEntity> getRecordList(String taskId);

    /**
     * 更新归档状态
     *
     * @param taskId 任务主键
     */
    void updateIsFile(String taskId);

    /**
     * 在办
     *
     * @param pagination 分页参数
     */
    List<OperatorVo> getWaitList(TaskPagination pagination);

    /**
     * 已办
     *
     * @param pagination 分页参数
     */
    List<OperatorVo> getTrialList(TaskPagination pagination);

    /**
     * 抄送
     *
     * @param pagination 分页参数
     */
    List<OperatorVo> getCirculateList(TaskPagination pagination);

    /**
     * 委托列表
     */
    List<DelegateEntity> getDelegateList();

    /**
     * 判断是否存在未签收的经办
     */
    Boolean checkSign();

    /**
     * 判断是否存在未办理的经办
     */
    Boolean checkTodo();

    /**
     * 发起流程
     *
     * @param flowModel 参数（templateId、userIds、formDataList）
     */
    ActionResult launchFlow(FlowModel flowModel);
}
