package jnpf.personnels.service;

import com.baomidou.mybatisplus.extension.service.IService;
import jnpf.model.enums.FtbPersonnelsAuditTaskEnum;
import jnpf.model.enums.FtbPersonnelsCofigEnum;
import jnpf.model.personnels.dto.audit.FtbPersonnelsAuditDto;
import jnpf.model.personnels.po.FtbPersonnelsAuditRunTask;
import jnpf.model.personnels.vo.task.FtbPersonnelsAuditRunTaskVO;
import jnpf.util.StringUtil;

import java.util.List;

public interface FtbPersonnelsAuditRunTaskService extends IService<FtbPersonnelsAuditRunTask> {

    /**
     * 开启审核流程 返回 状态码审核执行状态码
     *
     * @param businessId 业务主键id
     * @param type       审核类型
     * @param userId
     * @return id 主键id写入对应的业务表
     */
    String startTheReviewProcess(String businessId, Integer type, String orgId, String userId);

    /**
     * 审核流程
     * @param auditDto 审核DTO
     * @return 返回 最终审核状态码
     */
    FtbPersonnelsAuditTaskEnum performReview(FtbPersonnelsAuditDto auditDto,String... userId);

    /**
     * 撤销对应的审核流程
     *
     * @param businessId 业务主键id
     * @return 返回 撤销后的状态
     */
    FtbPersonnelsAuditTaskEnum withdrawTheReviewProcess(String businessId);

    /**
     * 获取登录人是否到审核节点
     * @param businessId
     * @return 返回待审核状态 否者还是为 审核中
     */
    FtbPersonnelsAuditTaskEnum getWhetherLoginPerToTheAuditNode(String businessId,FtbPersonnelsCofigEnum ftbPersonnelsCofigEnum);

    /**
     * 获取当前审核流程配置详情 是否必填 显示项
     * @param businessId 业务主键id
     * @return 返回审核流程详情
     */
    FtbPersonnelsAuditRunTaskVO viewTheCurrentApprovalProcess(String businessId);

    /**
     * 根据当前用户查询当前需要我审批的审核流程
     * @param userId 当前用户id
     * @param ftbPersonnelsCofigEnum 枚举标识
     * @return 返回业务主键ids
     */
    List<String> queryInfoThatCurrentUserNeedsToApprove(String userId, FtbPersonnelsCofigEnum ftbPersonnelsCofigEnum);


    /**
     * 查询我已经审批的流程
     * @param userId 当前用户id
     * @param ftbPersonnelsCofigEnum 枚举标识
     * @return 返回业务主键ids
     */
    List<String> queryMyApprovedReviewProcess(String userId, FtbPersonnelsCofigEnum ftbPersonnelsCofigEnum);

    /**
     * 查询当前是否为或签
     *
     * @param businessId
     * @param configType
     * @param userId
     * @return
     */
    Boolean checkWhetherTheCurrentSignIsOr(String businessId, Integer configType, String userId);

    /**
     * 查询当前人是否为审批人
     * @param userId
     * @return
     */
    Boolean checkWhetherTheCurrentApproverIs(String userId);

    /**
     * 查询当前业务是否处于审核流程中
     * @param businessId
     * @return false 不处于, true 处于审批中
     */
    Boolean checkIsTheCurrentBusinessInTheApprovalProcess(String businessId);
    /**
     * 查询当前业务是否处于审核流程中
     * @param businessId
     * @return FtbPersonnelsCofigEnum 处于其中的枚举类型中 没有返回空
     */
    FtbPersonnelsCofigEnum checksItInTheReviewProcess(String businessId);

    /**
     * 查询运行流程
     * @param id
     * @return
     */
    FtbPersonnelsAuditRunTaskVO viewTheCurrentApprovalProcessByTaskId(String id);
    /**
     * 查询对应的人员是否处于任意流程中
     * @param userId
     * @return null 不处于 ,1转正 2,调岗, 3离职, 4晋升
     */
    String checkWhetherTheCurrentPersonnelIsInTheReviewProcess(String userId);

    /**
     * 清除对应审批数据
     * @param runTaskId
     * @param businessId
     */
    void deleteReviewProcessAndRecords(String runTaskId, String businessId);

    void closeAllExecutionData(List<String> teantIdList);

    default String checkWhetherTheCheckIsInTheProcessForOA(String userId) {
        // null 不处于 ,1 转正 2,调岗, 3离职 4晋升 5调店 6降职
        String s = checkWhetherTheCurrentPersonnelIsInTheReviewProcess(userId);
        if (StringUtil.isNotEmpty(s)) {
            // 1 转正 2 调岗, 3 离职
            String str = "";
            switch (s) {
                case "1":
                    str = "转正";
                    break;
                case "2":
                    str = "调岗";
                    break;
                case "3":
                    str = "离职";
                    break;
                case "4":
                    str = "晋升";
                    break;
                case "5":
                    str = "调店";
                    break;
                case "6":
                    str = "降职";
                    break;
                case "7":
                    str = "借调";
                    break;
            }
            return ("当前人员处于" + str + "审批流程中，无法再次发起流程！");
        }
        return null;
    }

}
