package com.yh.saas.plugin.yiliangyiyun.service;

import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.plugins.Page;
import com.winsea.svc.base.base.entity.CommonStaff;
import com.winsea.svc.base.workflow.entity.Workflow;

import java.io.InputStream;
import java.io.Serializable;
import java.util.List;

/**
 * 工作流服务
 *
 * @author gdc
 */
public interface INewWorkflowService {

    /**
     * 创建工作流
     *
     * @param workflow 工作流对象
     * @return 工作流ID
     */
    String create(Workflow workflow);

    /**
     * 修改工作流信息
     *
     * @param workflow 工作流对象
     * @return 工作流ID
     */
    String changeInfo(Workflow workflow);

    /**
     * 获取工作流详情
     *
     * @param workflowId 工作流ID
     * @return 工作流详情
     */
    Workflow getWorkflowDetail(String workflowId);

    /**
     * 通过业务编码获取最新工作流定义列表<br/>
     * 查询公司下所有
     *
     * @param businessCode 业务编码
     * @param compId       公司ID
     * @return 最新工作流定义列表
     */
    List<Workflow> getWorkflowDefinitions(String businessCode, String compId);

    /**
     * 通过业务编码查询最新工作流<br/>
     * 根据用户和角色查询
     *
     * @param businessCode 业务编码
     * @return 最新关联工作流
     */
    Workflow findLatestWorkflowByBusinessCode(String businessCode);


    /**
     * 通过业务编码查询最新工作流<br/>
     * 根据用户和角色查询
     *
     * @param businessCode 业务编码
     * @return 最新关联工作流
     */
    Workflow findLatestWorkflowByBusinessCodeByApp(String compId ,String businessCode);

    /**
     * 通过业务编码和公司ID获取最新工作流
     *
     * @param businessCode 业务编码
     * @param compId       公司ID
     * @return 最新关联工作流
     */
    Workflow getLatestWorkflowByBusinessCodeAndCompId(String businessCode, String compId);

    /**
     * 通过业务编码查询工作流列表<br/>
     * 根据用户和角色查询
     *
     * @param businessCode 业务编码
     * @return 关联工作流列表
     */
    List<Workflow> findWorkflowsByBusinessCode(String businessCode);

    /**
     * 通过业务编码查询工作流ID列表
     *
     * @param businessCode 业务编码
     * @return 关联工作流ID列表
     */
    List<String> findWorkflowIdsByBusinessCode(String businessCode);

    /**
     * 获取流程图
     *
     * @param workflowId 工作流ID
     * @return InputStream
     */
    InputStream getProcessDiagram(String workflowId);

    /**
     * 开始一个工作流
     *
     * @param processId   工作流ID
     * @param businessKey 业务码
     */
    void startInstance(String workflowId, String businessKey);

    /**
     * 开始一个工作流
     *
     * @param processId   工作流ID
     * @param businessKey 业务码
     * @param startUserId 申请用户ID
     */
    void startInstance(String workflowId, String businessKey, String startUserId);

    /**
     * 激活工作流
     *
     * @param processId   工作流ID
     * @param businessKey 业务码
     * 
     * @return 工作流ID
     */
    String activateInstance(String workflowId, String businessKey);

    /**
     * 挂起工作流
     *
     * @param processId   工作流ID
     * @param businessKey 业务码
     */
    void suspendInstance(String workflowId, String businessKey);

    /**
     * 结束工作流
     *
     * @param workflowId  工作流ID
     * @param businessKey 业务码
     * @param reason      结束原因
     */
    void stopInstance(String workflowId, String businessKey, String reason);

    /**
     * 当前登录人签收
     *
     * @param taskId 任务ID
     */
    void claim(String taskId);

    /**
     * 签收
     *
     * @param taskId 任务ID
     * @param userId 用户ID
     */
    void claim(String taskId, String userId);

    /**
     * 任务ID
     *
     * @param taskId      任务ID
     * @param approved    是否同意
     * @param auditMind   审核意见
     * @param needReapply 是否需要重新申请
     */
    void handle(String taskId, boolean approved, String auditMind, boolean needReapply);

    /**
     * 获取任务分页列表
     *
     * @param workflowIds 工作流ID列表
     * @param current     页码
     * @param size        分页大小
     * @return 任务分页列表<br />
     * records->任务列表<br/>
     * taskId->任务ID，taskName->任务名称，workflowId->工作流ID，businessKey->业务编码
     */
    Page<Object> getTaskList(List<String> workflowIds, int current, int size);

    /**
     * 获得审批人代办的所有任务相关businessKey
     *
     * @param businessCode 业务编码
     * @return businessKeys
     */
    List<String> getTaskBusinessKeysByCode(String businessCode);

    /**
     * 获得审批人代办的所有任务相关businessKey
     *
     * @param workflowId 工作流ID
     * @return businessKeys
     */
    List<String> getTaskBusinessKeysByFlowId(String workflowId);

    /**
     * 获得审批人已办的所有任务相关businessKey
     *
     * @param businessCode 业务编码
     * @return businessKeys
     */
    List<String> getDoneTaskBusinessKeysByCode(String businessCode);

    /**
     * 获得审批人已办的所有任务相关businessKey
     *
     * @param workflowId 工作流ID
     * @return businessKeys
     */
    List<String> getDoneTaskBusinessKeysByFlowId(String workflowId);

    /**
     * 获取活动的任务
     *
     * @param workflowIds 工作流ID列表
     * @param businessKey 业务编码
     * @return 活动的任务<br />
     * taskId->任务ID，taskName->任务名称，workflowId->工作流ID
     */
    JSONObject getActiveTask(List<String> workflowIds, String businessKey);

    /**
     * 获取活动的任务
     *
     * @param workflowIds 工作流ID列表
     * @param businessKey 业务编码
     * @return 活动的任务<br />
     * taskId->任务ID，taskName->任务名称，workflowId->工作流ID
     */
    JSONObject getActiveTask(String staffId, List<String> workflowIds, String businessKey);

    /**
     * Mybatis plus
     */
    Workflow selectById(Serializable id);

    /**
     * 查询 - 当前审核流业务实例处于第几步骤
     *
     * @param workflowId  审核流id
     * @param businessKey 主键业务
     * @return 第几步
     */
    Integer findWorkflowStepNumber(String workflowId, String businessKey);

    /**
     * 判断当前任务是否处于最后一级节点
     *
     * @param businessKey 业务主键id
     * @return 是||否
     */
    boolean judgeBusinessLastStep(String businessKey);

    /**
     * 删除最新审核流(改为旧审核流)
     * @param workflowId 审核流id
     */
    void removeLatestWorkflow(String workflowId);


    /**
     * 获取流程当前任务候选人
     *
     * @param workflowId  工作流ID
     * @param businessKey 业务码
     * @return
     */
    List<CommonStaff> getTaskCandidates(String workflowId, String businessKey);


    void getTaskWebsocket(String workflowId, String businessKey ,String type);
}
