package jnpf.personnels.service;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import jnpf.base.ActionResult;
import jnpf.model.personnels.po.FtbPersonnelsTransferManage;
import com.baomidou.mybatisplus.extension.service.IService;
import jnpf.model.personnels.req.transfer.FtbHandleTransferDTO;
import jnpf.model.personnels.req.transfer.FtbHandleTransferOaDTO;
import jnpf.model.personnels.req.transfer.FtbHandleTransferQueryDTO;
import jnpf.model.personnels.vo.transfer.FtbHandleTransferDetailsVO;
import jnpf.model.personnels.vo.transfer.FtbHandleTransferPageVO;

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

public interface FtbPersonnelsTransferManageService extends IService<FtbPersonnelsTransferManage> {

    /**
     * 获取处理转让管理列表
     *
     * @param page                      分页对象，包含分页信息如当前页码、页面大小等
     * @param ftbHandleTransferQueryDTO 查询条件对象，包含查询转让管理列表的条件
     * @return 返回一个分页对象，其中包含符合查询条件的转让管理信息列表
     */
    Page<FtbHandleTransferPageVO> transferManageList(Page<FtbHandleTransferPageVO> page, FtbHandleTransferQueryDTO ftbHandleTransferQueryDTO);

    /**
     * 查询转账记录列表（适用于App端）
     * 该方法用于获取经过特定用户处理的转账记录页面列表，主要供App端使用
     *
     * @param page 分页对象，包含每页记录数、当前页码等信息
     * @param userName 用户名，用于筛选处理人与此用户相关的转账记录
     * @return 返回一个分页对象，其中包含符合筛选条件的转账记录列表
     */
    Page<FtbHandleTransferPageVO> transferListApp(Page<FtbHandleTransferPageVO> page, String userName);

    /**
     * 查询我的转账申请记录
     *
     * 该方法用于获取当前用户发起的转账申请记录，通过分页形式返回
     * 主要解决了用户需要查看自己历史转账申请的需求
     *
     * @param page 分页对象，包含查询条件和分页参数，如当前页码、每页大小等
     * @return 返回一个分页对象，包含查询到的转账申请记录列表和分页信息
     */
    Page<FtbHandleTransferPageVO> myTransferApp(Page<FtbHandleTransferPageVO> page);

    /**
     * 处理转账操作
     * 该方法负责处理资金从一个账户转移到另一个账户的请求
     * 它不返回任何值，但可能会抛出异常或记录错误信息，如果转账无法完成
     *
     * @param ftbHandleTransferDTO 包含了转账所需的所有信息，如转出账户ID、转入账户ID和转账金额等
     */
    String handleTransfer(FtbHandleTransferDTO ftbHandleTransferDTO);

    /**
     * 处理转账OA操作
     * 该方法接收一个包含转账相关信息的数据对象，并执行相应的业务逻辑处理
     *
     * @param ftbHandleTransferDTO 包含转账所需信息的数据传输对象
     */
    ActionResult<Void> handleTransferOa(FtbHandleTransferDTO ftbHandleTransferDTO);

    /**
     * 根据指定的ID删除资源
     * 此方法用于从数据源中删除与给定ID关联的资源它通常用于数据管理，
     * 允许通过唯一的标识符来移除不再需要或已损坏的数据项
     *
     * @param id 要删除的资源的唯一标识符
     */
    void delete(String id);

    /**
     * 审批OA流程
     * 本方法用于处理OA系统中的审批流程，根据传入的DTO对象进行相应的审批操作
     *
     * @param dto 包含处理OA审批所需的信息，包括但不限于审批人、审批意见等
     */
    void approvalForOA(FtbHandleTransferOaDTO dto);

    /**
     * 根据ID获取转让详情
     *
     * @param id 转让详情的唯一标识
     * @return 返回转让详情的对象，如果ID不存在，则返回null
     */
    FtbHandleTransferDetailsVO transferDetails(String id);

    /**
     * 计划任务中执行效果转移的操作
     * 本方法主要用于在计划任务中处理效果的转移逻辑，确保在指定的时间或条件下，
     * 将某些效果从一个实体转移到另一个实体
     *
     * @param tenantId 租户ID，用于标识操作的租户，以便在多租户环境中正确执行效果转移
     */
    void transferEffectScheduledTask(String tenantId);


    /**
     * 查询字段值
     * <p>
     * 该方法用于查询并返回一个包含字段及其对应值的列表每个字段值都以键值对的形式存在，
     * 其中键代表字段名，值代表字段的内容该方法不接受任何参数，使用时不需要提供额外的输入
     *
     * @return 字段值列表，每个字段值以键值对形式存在
     */
    List<Map<String, String>> queryFieldValue();

    /**
     * 根据指定ID撤销转账记录
     * 此方法用于在系统中撤销一个已存在的转账记录它通常在需要取消或回滚
     * 某笔转账操作时被调用
     *
     * @param id 转账记录的唯一标识符此ID用于定位需要撤销的转账记录
     */
    void revokeTheTransferRecord(String id);

    /**
     * 离职清除调动数据
     */
    void clearTransferData(List<String> userId);

    /**
    * 借调校验时间交叉
    */
    List<Date> transferCheckTimeCrossing(String userId,Date startTime,Date endTime);
}
