package com.sundot.airport.system.service.approval;

import java.util.List;

/**
 * 审批流程用户服务接口
 *
 * @author simon lin
 * @date 2025-09-06
 */
public interface IApprovalUserService {
    /**
     * 根据审批人类型获取审批人ID列表
     *
     * @param approverType  审批人类型
     * @param approverValue 审批人值
     * @param businessData  业务数据（可用于动态获取审批人）
     * @return 审批人ID列表
     */
    List<Long> getApproverIds(String approverType, String approverValue, Object businessData);

    /**
     * 根据部门ID获取部门负责人（科长）
     *
     * @param deptId 部门ID
     * @return 部门负责人用户ID列表
     */
    List<Long> getDeptLeaderIds(Long deptId);

    /**
     * 根据用户ID获取所属部门的科长
     *
     * @param userId 用户ID
     * @return 科长用户ID列表
     */
    List<Long> getSectionLeaderIdsByUserId(Long userId);

    /**
     * 根据用户ID获取所属班组的班组长
     *
     * @param userId 用户ID
     * @return 班组长用户ID列表
     */
    List<Long> getGroupLeaderIdsByUserId(Long userId);

    /**
     * 根据角色标识获取用户ID列表
     *
     * @param roleKey 角色标识
     * @return 用户ID列表
     */
    List<Long> getUserIdsByRoleKey(String roleKey);

    /**
     * 根据部门ID获取部门下所有用户ID列表
     *
     * @param deptId 部门ID
     * @return 用户ID列表
     */
    List<Long> getUserIdsByDeptId(Long deptId);

    /**
     * 判断用户是否为班组长角色
     *
     * @param userId 用户ID
     * @return 是否为班组长
     */
    boolean isGroupLeader(Long userId);

    /**
     * 判断用户是否为科长角色
     *
     * @param userId 用户ID
     * @return 是否为科长
     */
    boolean isSectionLeader(Long userId);

    /**
     * 根据业务数据动态获取整改班组
     *
     * @param businessData 业务数据
     * @return 班组ID
     */
    Long getTargetGroupIdFromBusinessData(Object businessData);

    /**
     * 根据任务ID获取原始操作者（创建者或更新者）的用户ID
     *
     * @param taskId 任务ID
     * @return 原始操作者的用户ID，如果找不到返回null
     */
    Long getOriginalOperatorByTaskId(Long taskId);

    /**
     * 根据任务ID获取任务的创建者或更新者用户ID（用于驳回回流）
     *
     * @param taskId 任务ID
     * @return 任务创建者或更新者的用户ID，如果找不到返回null
     */
    Long getTaskCreatorOrUpdaterByTaskId(Long taskId);

    /**
     * 根据用户ID查找其直接上级（违禁品审批用）
     * 如果用户是安检员，找其班组长；如果是班组长，找其科长
     *
     * @param userId 用户ID
     * @return 直接上级的用户ID列表
     */
    List<Long> getDirectSuperiorIds(Long userId);

    /**
     * 判断用户是否为安检员角色
     *
     * @param userId 用户ID
     * @return 是否为班组长
     */
    boolean isSecurityCheck(Long userId);

    /**
     * 根据用户ID查找其主管（违禁品审批用）
     *
     * @param userId 用户ID
     * @return 主管的用户ID列表
     */
    List<Long> getKeZhangByUserId(Long userId);
}