package com.sunxung.factoring.service.project;

import com.sunxung.factoring.entity.GridPage;
import com.sunxung.factoring.entity.project.vo.BusinessHistoricDetailVo;
import com.sunxung.factoring.entity.project.vo.BusinessProcessingTaskVo;
import com.sunxung.factoring.entity.project.vo.SearchBusinessProcessingTask;

import java.util.List;

/**
 * @Description:流程相关业务任务列表Service（如立项流程、尽调流程、评审会流程等待我处理、我已处理和全部列表）
 * @Author:wanxiangZhou
 * @E-mail:zhouyu@sunxung.cn
 * @Date:2018年7月30日 下午7:21:16
 */
public interface BusinessProcessingTaskService {

    /**
     * 分页查询待我处理的流程业务信息
     *
     * @param search 查询条件
     * @return 待我处理的业务信息列表
     */
    GridPage<BusinessProcessingTaskVo> findMyPendingList(SearchBusinessProcessingTask search);

    /**
     * 分页查询我已处理（办理）的任务
     *
     * @param search 业务查询条件
     * @return 我已办理的任务集合（历史任务）
     */
    GridPage<BusinessProcessingTaskVo> findMyCompletedList(SearchBusinessProcessingTask search);

    /**
     * 全部流程业务信息
     *
     * @param search 业务查询条件
     * @return 全部流程业务信息
     */
    GridPage<BusinessProcessingTaskVo> findAll(SearchBusinessProcessingTask search);

    /**
     * 获取流程业务已完成的业务表单信息
     *
     * @param businessKey  流程业务ID
     * @param businessType 流程业务类别
     * @return
     */
    List<BusinessHistoricDetailVo> getHistoricBusinessById(Long businessKey, String businessType);

    /**
     * 获取C端用户完成的业务表单信息（最新）
     * @param businessKey
     * @param businessType
     * @return
     */
    List<BusinessHistoricDetailVo> getCLogByBusinessKeyBusinessType(Long businessKey, String businessType);

    /**
     * 验证任务是否已经完成或者被分配了<br>
     * 1.任务办理人是当前操作者； 2.任务未完成
     *
     * @param taskId 任务ID
     * @return true表示待我处理的任务，否则不是待我处理的任务，无法进行处理操作
     */
    Boolean duplicateProcessingTask(String taskId);

    /**
     * 非业务流程的处理权限的判断（如账后收放款执行(保理融资款)仅运营专员方可有权限操作）. <br/>
     *
     * @param businessId   （主）业务ID
     * @param businessType 业务类型（数据字典CODE）
     * @param msgType      消息类型（数据字典CODE）
     * @return true表示当前登录用户有权限操作该条业务数据，否则无权限
     */
    Boolean duplicateProcessingBusiness(Long businessId, String businessType, String msgType);

    /**
     * 终止流程
     * @param taskId
     * @param entityId
     * @param businessType
     * @param taskName
     * @param taskDefKey
     * @return
     */
    Long terminate(String taskId,Long entityId,String businessType,String taskName, String taskDefKey);
}
