package cn.ey.biz.module.system.service.bpm;

import cn.ey.biz.module.system.api.bpm.dto.*;
import cn.ey.biz.module.system.controller.bpm.instance.vo.*;
import javax.validation.Valid;
import java.util.List;

/**
 * 流程实例 Service 接口
 *
 */
public interface BpmProcessInstanceService {

    /**
     * 创建流程实例（提供给前端）
     *
     * @param createReqVO 创建信息
     * @return 实例的编号
     */
    String createProcessInstance(@Valid BpmProcessInstanceCreateReqVO createReqVO);

    /**
     * 创建流程实例（提供给系统）
     *
     * @param createDTO 创建信息
     * @return 实例的编号
     */
    String createProcessInstance(@Valid BpmProcessInstanceCreateDTO createDTO);

    /**
     * 取消流程实例（撤回）
     *
     * @param cancelReqVO 取消信息
     */
    void cancelProcessInstance(@Valid BpmProcessInstanceCancelReqVO cancelReqVO);

    /**
     * 获取流程信息(提供給前端)
     *
     * @param reqVO
     * @return
     */
    BpmWorkflowRespVO getWorkflowRequest(@Valid BpmWorkflowReqVO reqVO);

    /**
     * 获取流程信息(提供給系统)
     *
     * @param
     * @return
     */
    BpmWorkflowRespDTO getWorkflowRequest(@Valid BpmWorkflowDTO workflowDTO);

    /**
     * 获取指定流程的签字意见
     *
     * @param userId
     * @param reqVO
     * @return
     */
    List<BpmWorkflowRequestLogsRespVO> getWorkflowRequestLogs(Long userId, @Valid BpmWorkflowLogsReqVO reqVO);

    /**
     * 获取流程图链接
     *
     * @param reqVO
     * @return
     */
    BpmFlowChartRespVO getRequestFlowChart(@Valid BpmFlowChartReqVO reqVO);

    /**
     * 得流程实例 VO 信息
     *
     * @param reqVO
     * @return
     */
    BpmProcessInstanceRespVO getProcessInstanceVO(BpmProcessInstanceReqVO reqVO);

    /**
     * 强制归档
     *
     * @param reqVO
     */
    void doForceOver(BpmDoForceOverReqVO reqVO);

    /**
     * 转发、意见征询、转办
     *
     * @param reqVO
     */
    void forwardRequest(List<BpmForwardRequestReqVO> reqVO);

    /**
     * 工时ot流程图数据
     *
     * @param reqVO
     */
    BpmSimpleModeDataRespVo getSimpleModeData(BpmSimpleModeDataReqVO reqVO);

    /**
     * 撤回流程
     */
    void withdrawRequest(BpmWithdrawRequestDTO bpmWithdrawRequestDTO);

    /**
     * 获取流程状态
     */
    String getStatusById(BpmGetStatusByIdDTO bpmGetStatusByIdDTO);

    /**
     * 强制归档(提供给系统)
     *
     * @param bpmDoForceOverDT
     */
    void doForceOver(BpmDoForceOverDTO bpmDoForceOverDT);

    /**
     * 统一待办 接收异构系统流程接口
     */
    ReceiveRequestInfoByJsonRespDTO ReceiveRequestInfoByJson(ReceiveRequestInfoByJsonDTO receiveRequestInfoByJsonDTO);

    /**
     * 统一待办 删除异构系统指定接收人待办流程
     */
    DeleteUserRequestInfoByJsonRespDTO deleteUserRequestInfoByJson(DeleteUserRequestInfoByJsonDTO deleteUserRequestInfoByJsonDTO);

    /**
     * 流程代理
     */
    String addAgentSave(BpmAddAgentSaveDTO saveDTO);

    /**
     * 流程删除
     */
    void deleteRequest(BpmDeleteRequestDTO deleteDTO);

    /**
     * 验证用户是否是当前流程操作者
     */
    boolean checkOperatorAndShared(CheckOperatorAndSharedRequestDTO operatorDTO);

    /**
     * 获取流程当前iframe区域操作按钮
     * @return
     */
     String getRequestBtnGroup(CheckOperatorAndSharedRequestDTO btnGroupDTO);

    /**
     *
     * @param operatorDTO
     * @return
     */
     boolean checkOperatorAndSharedButton(CheckOperatorAndSharedRequestDTO operatorDTO);

}