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.ImportResultVO;
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.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.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.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 org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletResponse;
import javax.validation.Valid;
import java.io.IOException;
import java.util.List;

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

    Long inbound(@Valid MaterialIoOrderSaveReqVO reqVO);

    Long outbound(@Valid MaterialIoOrderSaveReqVO reqVO);

    Long outboundByInbound(@Valid MaterialOutboundByInboundReqVO reqVO);

    Long outboundReturn(@Valid MaterialIoOrderSaveReqVO reqVO);

    Long inboundReturn(@Valid MaterialIoOrderSaveReqVO reqVO);

    void update(@Valid MaterialIoOrderSaveReqVO updateReqVO);

    void delete(Long id);

    MaterialInboundOrderRespVO getInboundOrder(Long id);

    MaterialOutboundOrderRespVO getOutboundOrder(Long id);

    PageResult<MaterialIoOrderPageRespVO> page(MaterialIoOrderPageReqVO pageReqVO);

    List<MaterialInBalanceRespVO> listInboundBatches(MaterialInBalanceListReqVO reqVO);

    List<MaterialInboundOrderDO> inboundList(Long[] tenantIds);

    List<MaterialOutboundOrderDO> outboundList(Long[] tenantIds);

    MaterialOutboundReturnOrderRespVO getOutboundReturn(Long id);

    MaterialInboundReturnOrderRespVO getInboundReturn(Long id);

    PageResult<MaterialOutboundReturnOrderPageRespVO> pageOutboundReturn(MaterialOutboundReturnOrderPageReqVO reqVO);

    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);

    void exportInboundImportTemplate(HttpServletResponse response) throws IOException;

    void exportOutboundImportTemplate(HttpServletResponse response) throws IOException;

    ImportResultVO importInbound(MultipartFile file) throws IOException;

    ImportResultVO importOutbound(MultipartFile file) throws IOException;

}
