package com.sw.mes.sap.reconciliation.framework;

import java.io.Serializable;

/**
 * 对账接口，业务对账可以实现此接口完成针对不同业务类型的对账
 *
 * @Author：wanjia
 * @Date：2024/2/25 18:34
 */
public interface Reconciliation {

    /**
     * 根据单条id进行对账
     * <p>
     * 前置需要单独扫表，讲主键ID，传入，然后并行去各个datasource进行数据获取，然后进行对账
     *
     * @param bizName         对账名称
     * @param id              业务主键 code / batchNo / code-batchNo-warehouseId/
     * @param crossComparison 交叉对账的代码实现
     * @param fetchData       抓取不同datasource的代码实现
     * @param <T>             中间结果的封装
     * @param <R>             扫表对象的封装
     * @return
     */
    <R, T> ReconResult checkById(String bizName, Serializable id, CrossComparison<R, T> crossComparison, FetchData<T>... fetchData);

    /**
     * 批量扫表进行对账，直接会把扫表的结果进行透传
     *
     * @param bizName   对账名称
     * @param scanFetch 扫表程序
     * @param fetchData 根据queryKey进行数据的查询
     * @param <T>       中间结果的封装
     * @param <R>       扫表对象的封装
     * @return
     */
    <R extends QueryKey, T> void batchScan(String bizName, CrossComparison<R, T> crossComparison, ScanFetchData<R> scanFetch, FetchData<T>... fetchData);
}
