package com.ho.flow.service.process.service;

import com.ho.common.tools.entity.OrderForm;
import com.ho.common.tools.entity.ProcessOrder;
import com.ho.common.tools.entity.SimpleUser;
import com.ho.flow.entity.process.PreDoUser;
import com.ho.flow.entity.process.TaskOrderInfo;
import com.ho.flow.vo.req.workorder.*;
import com.ho.flow.vo.resp.workorder.FallBackTaskResp;
import com.ho.flow.vo.resp.workorder.HisTaskResp;
import com.ho.flow.vo.resp.workorder.TaskDone;
import com.ho.user.api.entity.SysUser;
import org.activiti.engine.history.HistoricTaskInstance;
import org.activiti.engine.task.Task;

import java.util.List;
import java.util.Map;

/**
 * @Author yule
 * @Date 2023/8/29 10:43
 * @desc ${}
 */
public interface ProcessFlowNewService {
    /**
     * 流程部署
     * @param processOrder 表单及流程管理id
     * @return 流程部署id
     */
    String deployment(ProcessOrder processOrder);

    /**
     * 发起工单
     * @param processOrder 表单及流程管理id
     */
    Integer initProcessInstance(ProcessOrder processOrder);

    /**
     * //查代办列表,根据用户名集团id查询
     * @param simpleUser 当前用户
     * @return 根据状态分组
     */
    Map<String, List<Task>> getTodoList(SimpleUser simpleUser);

    /**
     * 组装任务对象
     * @param taskMap
     * @param doListTaskReq
     * @return
     */
    List<TaskDone> getToDoListFromTask(Map<String, List<Task>> taskMap, DoListTaskReq doListTaskReq);

    /**
     * 根据登录人查询已办任务变量集合
     * @param simpleUser
     * @return
     */
    List<HistoricTaskInstance> getDoneList(SimpleUser simpleUser);

    /**
     * 组装已办任务返回集合
     * @param taskList 办任务变量集合
     * @param doListTaskReq 已办任务入参
     * @return
     */
    List<TaskDone> getDoneListFromTask(List<HistoricTaskInstance> taskList, DoListTaskReq doListTaskReq);

    /**
     * 审批通过
     * @param doTaskReq
     */
    void approval(DoTaskReq doTaskReq);

    /**
     * 审批不通过
     * @param doTaskReq
     */
    void approvalFailed(DoTaskReq doTaskReq);

    /**
     * 查询可回退节点
     * @param fallBackTaskReq
     * @return
     */
    List<FallBackTaskResp> getFallBackTask(FallBackTaskReq fallBackTaskReq);

    /**
     * 回退任务
     * @param rejectTaskReq
     */
    void fallBackTask(RejectTaskReq rejectTaskReq);

    /**
     * 工单详情
     * @param taskReq
     * @return
     */
    List<HisTaskResp> detailsTask(CirculationTaskReq taskReq);

    /**
     * 转发工单
     * @param taskDone
     */
    void forward(TaskDone taskDone);

    /**
     * 流转前查询人员
     * @param taskUserReq
     * @return
     */
    List<PreDoUser> getPreDo(TaskUserReq taskUserReq);

    /**
     * 根据流程id查询任务详情
     * @param taskReq
     * @return
     */
    TaskOrderInfo taskInfo(CirculationTaskReq taskReq);

    /**
     * 接收任务
     * @param taskReq
     */
    void doClaimTask(TaskUserReq taskReq);

    /**
     * 保存保单信息
     * @param taskReq
     */
    void save(TaskUserReq taskReq);

    /**
     * 作废
     * @param taskReq
     */
    void cancel(TaskUserReq taskReq);

    /**
     * 转发前的候选人列表
     */
    List<PreDoUser> preForward(SimpleUser simpleUser);

    /**
     * 获取第一个节点饿流转人员列表
     * @param taskUserReq
     * @return
     */
    List<PreDoUser> getFristPreDo(TaskUserReq taskUserReq);

    /**
     * 第一次流转
     * @param doTaskReq
     */
    void getFristApproval(DoTaskReq doTaskReq);

    /**
     * 第一次查询任务
     * @param taskReq
     * @return
     */
    TaskOrderInfo firstTaskInfo(CirculationTaskReq taskReq);

    void saveOrderForm(TaskUserReq taskReq);

    List<HisTaskResp> detailsFirstTask(CirculationTaskReq taskReq);

    //查询第一节点的候选岗位
    public List<SysUser> getFristUsers(String processKey);

    List<OrderForm> getInspectionOrders(Integer stationId);
}
