package jnpf.personnels.service;

import com.baomidou.mybatisplus.extension.service.IService;
import jnpf.base.vo.PageListVO;
import jnpf.model.attendance.vo.DailyApprovalVo;
import jnpf.model.cultivate.CultivatePage;
import jnpf.model.personnels.dto.audit.FtbPersonnelsAuditDto;
import jnpf.model.personnels.dto.base.PersonnelsQueryDTO;
import jnpf.model.personnels.dto.secondment.FtbHandleSecondmentDTO;
import jnpf.model.personnels.dto.secondment.FtbSecondMentQueryDTO;
import jnpf.model.personnels.po.FtbPersonnelsSecondmentManagement;
import jnpf.model.personnels.vo.secondment.FtbPersonnelsSecondmentInfoVO;
import jnpf.model.personnels.vo.secondment.FtbPersonnelsSecondmentVO;

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

/**
*
*
*@Author: peng.hao
*@create: 2025/9/11
*
*/
public interface FtbPersonnelsSecondmentManagementService extends IService<FtbPersonnelsSecondmentManagement> {


    /**
     * 分页查询人员借调列表
     * @param dto 查询条件封装对象
     * @param page 分页参数对象
     * @return 人员借调分页列表数据
     */
    PageListVO<FtbPersonnelsSecondmentVO> pageList(PersonnelsQueryDTO dto, CultivatePage page);

    /**
     * 根据ID获取人员借调详情信息
     * @param id 人员借调记录唯一标识
     * @return 人员借调详细信息对象
     */
    FtbPersonnelsSecondmentInfoVO details(String id);

    /**
     * 处理人员借调业务操作
     *
     * @param ftbHandleSecondmentDTO 借调处理数据传输对象
     * @return
     */
    String handleSecondment(FtbHandleSecondmentDTO ftbHandleSecondmentDTO);

    /**
     * 根据ID删除人员借调记录
     * @param id 人员借调记录唯一标识
     */
    void delete(String id);

    /**
     * 处理OA系统的人员借调业务操作
     * @param ftbHandleSecondmentDTO 借调处理数据传输对象
     */
    void handleSecondmentForOA(FtbHandleSecondmentDTO ftbHandleSecondmentDTO);

    /**
     * 处理人员借调审批流程
     * @param ftbPersonnelsAuditDto 人员审批数据传输对象
     */
    void secondmentApproval(FtbPersonnelsAuditDto ftbPersonnelsAuditDto);

    /**
     * 处理人员借调撤回流程
     * @param ftbPersonnelsAuditDto 人员审批数据传输对象
     */
    void secondmentWithdrawal(FtbPersonnelsAuditDto ftbPersonnelsAuditDto);

    /**
     * 提前结束人员借调
     * @param map 包含借调结束相关信息的参数映射
     */
    void earlyEnd(Map<String, Object> map);

    /**
     * 延长人员借调时间
     * @param map 包含借调延期相关信息的参数映射
     */
    void delayTime(Map<String, Object> map);

    Boolean checkIsInTheProcess(String userId, Date startTime, Date endTime);

    /**
     * 根据人员确认是否存在借调记录并根据离职时间结束
     */
    void endByUserConfirm(String userId, Date leaveTime);
    /**
     * 校验是否有借调记录
     */
    int checkWhetherThereIsASecondmentRecord(String userId, Date leaveTime);

    List<FtbPersonnelsSecondmentVO> getSecondmentRecord(String userId, String startLeaveTime, String endLeaveTime);

    List<FtbPersonnelsSecondmentVO> getSecondmentRecordBath(FtbSecondMentQueryDTO dto);
    /**
     * 定时任务检测当借调结束后薪资生成 借调返岗
     */
    void checkSecondmentEnd(String tenantId);
    List<FtbPersonnelsSecondmentManagement> getIdList(String userId, Date leaveTime);

    List<FtbPersonnelsSecondmentManagement> salarySecondmentCrossover(String userId, Date leaveTime);

    List<DailyApprovalVo> queryListApproval(FtbSecondMentQueryDTO dto);

    void cancel(String id);
}
