package com.sw.mes.store.api.interfaces.supplier;

import com.sw.mes.core.dto.store.*;
import com.sw.mes.store.dto.*;
import com.sw.mes.core.response.Result;
import com.sw.mes.store.dto.LockInventoryDto;
import com.sw.mes.store.dto.StoreDto;
import com.sw.mes.store.dto.WarehouseAllotBillDto;
import com.sw.mes.store.dto.WarehouseInputReturnDto;
import com.sw.mes.store.dto.WarehouseInventoryDto;
import com.sw.mes.store.entity.WarehouseInventory;
import com.sw.mes.store.entity.WarehouseModel;
import org.springframework.web.bind.annotation.RequestParam;

import java.util.List;
import java.util.Set;

/**
 * @Description 线边仓提供给外部的接口
 * @Author wupeng
 * @Date 2023/12/22 16:45
 **/
public interface WarehouseSupplierService {

    /**
     * @return 入库单号
     * @Author wupeng
     * @Description 线边仓入库接口
     * @Date 11:24 2023/12/30
     * @Param
     **/
    String input(WarehouseInputBillBo inputBillBo);

    WarehouseInputReturnDto inputData(WarehouseInputBillBo inputBillBo);

    /**
     * @return void
     * @Author wupeng
     * @Description 取消入库接口
     * @Date 13:40 2023/12/30
     * @Param
     **/
    void cancelInput(String billNo);

    /**
     * @return 出库单号
     * @Author wupeng
     * @Description 线边仓出库接口
     * @Date 11:24 2023/12/30
     * @Param
     **/
    String output(WarehouseOutputBillBo outputBillBo);

    void lockInventory(List<LockInventoryDto> lockInventoryDto);

    void unLockInventory(List<LockInventoryDto> lockInventoryDto);

    WarehouseInputReturnDto outputData(WarehouseOutputBillBo outputBillBo);

    /**
     * @return void
     * @Author wupeng
     * @Description 取消出库接口
     * @Date 13:41 2023/12/30
     * @Param
     **/
    void cancelOutput(String billNo);

    /**
     * @return
     * @Author wupeng
     * @Description 通过批次号获取库存信息
     * @Date 15:02 2024/1/4
     * @Param
     **/
    List<WarehouseInventory> findByBatchNo(String batchNo);

    /**
     * 对外创建调拨单接口
     *
     * @param warehouseAllotBillDto
     * @return
     */
    Boolean createAllotBill(WarehouseAllotBillDto warehouseAllotBillDto);

    List<WarehouseModelDto> getChildLocationIds(Long parentId);

    /**
     * 自动出入库
     *
     * @param inputBillBo
     * @return
     */
    Result automaticInputOut(WarehouseInputBillBo inputBillBo);

    /**
     * 通过批次号and库位获取当前库存信息
     *
     * @param batchNo
     * @param warehouseId
     * @return
     */
    WarehouseInventoryDto getByBatchWarehouseId(String batchNo, Long warehouseId);

    /**
     * 根据id查询线边仓模型
     *
     * @param id
     * @return
     */
    WarehouseModel getById(Long id);

    /**
     * 同步物料主数据
     *
     * @param warehouseMaterialBos
     */
    Result syncMaterial(List<WarehouseMaterialBo> warehouseMaterialBos);

    Result createInputAndAllotAndOut(StoreDto storeDto);

    List<String> findBatchNoBySerialNoOrTraceId(String serialNo, String traceId);

    /**
     * 根据物料查询入库明细
     *
     * @param materialCode
     * @return
     */
    List<WarehouseInputBillDetailBo> findWarehouseInputBillDetailsByMaterialCode(String materialCode);

    /**
     * 根据物料查询库存明细
     *
     * @param materialCode
     * @return
     */
    List<WarehouseInventoryDto> findWarehouseInventoryByMaterialCode(String materialCode);

    /**
     * 根据物料查询出库明细
     *
     * @param materialCode
     * @return
     */
    List<WarehouseOutputBillDetailBo> findWarehouseOutputBillDetailByMaterialCode(String materialCode);


    /**
     * 获取去重之后的物料code，从入库单这边来取
     *
     * @param page
     * @param PageSize
     * @return
     */
    Set<String> getDistinctMaterialCode(int page, int PageSize);

    /**
     * 线边仓回滚接口
     * @param bo
     * @return
     */
    Result rollBackStore(StoreDataBo bo);
}
