package cn.iocoder.yudao.module.system.service.biz;

import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.module.system.controller.admin.biz.vo.materialio.MaterialInBalanceListReqVO;
import cn.iocoder.yudao.module.system.controller.admin.biz.vo.materialio.MaterialInBalanceRespVO;
import cn.iocoder.yudao.module.system.controller.admin.biz.vo.materialio.MaterialIoOrderPageReqVO;
import cn.iocoder.yudao.module.system.controller.admin.biz.vo.materialio.MaterialIoOrderPageRespVO;
import cn.iocoder.yudao.module.system.controller.admin.biz.vo.materialio.MaterialIoOrderRespVO;
import cn.iocoder.yudao.module.system.controller.admin.biz.vo.materialio.MaterialIoOrderSaveReqVO;
import cn.iocoder.yudao.module.system.controller.admin.biz.vo.materialio.inbound.*;
import cn.iocoder.yudao.module.system.controller.admin.biz.vo.materialio.inboundreturn.MaterialInboundReturnOrderRespVO;
import cn.iocoder.yudao.module.system.controller.admin.biz.vo.materialio.inventory.MaterialInventoryFlowReqVO;
import cn.iocoder.yudao.module.system.controller.admin.biz.vo.materialio.inventory.MaterialInventoryFlowRespVO;
import cn.iocoder.yudao.module.system.controller.admin.biz.vo.materialio.inventory.MaterialInventoryReportPageReqVO;
import cn.iocoder.yudao.module.system.controller.admin.biz.vo.materialio.inventory.MaterialInventoryReportRespVO;
import cn.iocoder.yudao.module.system.controller.admin.biz.vo.materialio.outbound.*;
import cn.iocoder.yudao.module.system.controller.admin.biz.vo.materialio.inboundreturn.MaterialInboundReturnOrderPageReqVO;
import cn.iocoder.yudao.module.system.controller.admin.biz.vo.materialio.inboundreturn.MaterialInboundReturnOrderPageRespVO;
import cn.iocoder.yudao.module.system.controller.admin.biz.vo.materialio.outboundreturn.MaterialOutboundReturnOrderPageReqVO;
import cn.iocoder.yudao.module.system.controller.admin.biz.vo.materialio.outboundreturn.MaterialOutboundReturnOrderPageRespVO;
import cn.iocoder.yudao.module.system.controller.admin.biz.vo.materialio.outboundreturn.MaterialOutboundReturnOrderRespVO;
import cn.iocoder.yudao.module.system.dal.dataobject.biz.MaterialInboundOrderDO;
import cn.iocoder.yudao.module.system.dal.dataobject.biz.MaterialOutboundOrderDO;

import javax.validation.Valid;
import java.util.List;

/**
 * 物资出入库 Service 接口
 */
public interface MaterialIoService {

    /**
     * 物资入库
     *
     * @param reqVO 创建信息
     * @return 编号
     */
    Long inbound(@Valid MaterialIoOrderSaveReqVO reqVO);

    /**
     * 物资出库
     *
     * @param reqVO 创建信息
     * @return 编号
     */
    Long outbound(@Valid MaterialIoOrderSaveReqVO reqVO);

    /**
     * 出库退回
     *
     * @param reqVO 创建信息
     * @return 编号
     */
    Long outboundReturn(@Valid MaterialIoOrderSaveReqVO reqVO);

    /**
     * 入库退回
     *
     * @param reqVO 创建信息
     * @return 编号
     */
    Long inboundReturn(@Valid MaterialIoOrderSaveReqVO reqVO);

    /**
     * 更新出入库单
     *
     * @param updateReqVO 更新信息
     */
    void update(@Valid MaterialIoOrderSaveReqVO updateReqVO);

    /**
     * 删除出入库单
     *
     * @param id 编号
     */
    void delete(Long id);

    /**
     * 获得入库单详情
     *
     * @param id 编号
     * @return 入库单详情
     */
    MaterialInboundOrderRespVO getInboundOrder(Long id);

    /**
     * 获得出库单详情
     *
     * @param id 编号
     * @return 出库单详情
     */
    MaterialOutboundOrderRespVO getOutboundOrder(Long id);

    /**
     * 获得出入库单分页
     *
     * @param pageReqVO 分页查询
     * @return 出入库单分页
     */
    PageResult<MaterialIoOrderPageRespVO> page(MaterialIoOrderPageReqVO pageReqVO);

    /**
     * 获得入库批次列表（不分页，用于出库时选择可用批次）
     *
     * @param reqVO 查询条件
     * @return 入库批次列表
     */
    List<MaterialInBalanceRespVO> listInboundBatches(MaterialInBalanceListReqVO reqVO);

    /**
     * 入库单下拉列表
     *
     * @param tenantIds 查询条件
     * @return 入库单下拉列表
     */
    List<MaterialInboundOrderDO> inboundList(Long[] tenantIds);
    /**
     * 出库单下拉列表
     *
     * @param tenantIds 查询条件
     * @return 出库单下拉列表
     */
    List<MaterialOutboundOrderDO> outboundList(Long[] tenantIds);

    /**
     * 获取出库退回单详情
     *
     * @param id 退回单ID
     * @return 出库退回单详情
     */
    MaterialOutboundReturnOrderRespVO getOutboundReturn(Long id);

    /**
     * 获取入库退回单详情
     *
     * @param id 退回单ID
     * @return 入库退回单详情
     */
    MaterialInboundReturnOrderRespVO getInboundReturn(Long id);

    /**
     * 出库退回单分页
     *
     * @param reqVO 查询条件
     * @return 分页结果
     */
    PageResult<MaterialOutboundReturnOrderPageRespVO> pageOutboundReturn(MaterialOutboundReturnOrderPageReqVO reqVO);

    /**
     * 入库退回单分页
     *
     * @param reqVO 查询条件
     * @return 分页结果
     */
    PageResult<MaterialInboundReturnOrderPageRespVO> pageInboundReturn(MaterialInboundReturnOrderPageReqVO reqVO);

    /**
     * 入库统计汇总分页
     */
    PageResult<MaterialInboundSummaryRespVO> pageInboundSummary(MaterialInboundSummaryPageReqVO reqVO);

    /**
     * 入库统计明细分页
     */
    PageResult<MaterialInboundDetailRespVO> pageInboundDetail(MaterialInboundDetailPageReqVO reqVO);

    /**
     * 出库统计汇总分页
     */
    PageResult<MaterialOutboundSummaryRespVO> pageOutboundSummary(MaterialOutboundSummaryPageReqVO reqVO);

    /**
     * 出库统计明细分页
     */
    PageResult<MaterialOutboundDetailRespVO> pageOutboundDetail(MaterialOutboundDetailPageReqVO reqVO);

    /**
     * 库存查询报表分页
     */
    PageResult<MaterialInventoryReportRespVO> pageInventoryReport(MaterialInventoryReportPageReqVO reqVO);

    /**
     * 库存查询报表导出列表（不分页）
     */
    List<MaterialInventoryReportRespVO> listInventoryReport(MaterialInventoryReportPageReqVO reqVO);

    /**
     * 库存流水查询
     */
    MaterialInventoryFlowRespVO getInventoryFlow(MaterialInventoryFlowReqVO reqVO);

}
