package com.zt.plat.module.qms.resource.material.service;

import com.zt.plat.framework.common.pojo.PageResult;
import com.zt.plat.module.qms.resource.material.controller.vo.MaterialInventoryCheckDetailPageReqVO;
import com.zt.plat.module.qms.resource.material.controller.vo.MaterialInventoryCheckDetailRespVO;
import com.zt.plat.module.qms.resource.material.controller.vo.MaterialInventoryCheckDetailSaveReqVO;
import com.zt.plat.module.qms.resource.material.dal.dataobject.MaterialInventoryCheckDetailDO;
import jakarta.validation.Valid;

import java.util.List;

/**
 * 库存盘点明细 Service 接口
 *
 * @author 后台管理
 */
public interface MaterialInventoryCheckDetailService {

    /**
     * 创建库存盘点明细
     *
     * @param createReqVO 创建信息
     * @return 编号
     */
    MaterialInventoryCheckDetailRespVO createMaterialInventoryCheckDetail(@Valid MaterialInventoryCheckDetailSaveReqVO createReqVO);

    /**
     * 更新库存盘点明细
     *
     * @param updateReqVO 更新信息
     */
    void updateMaterialInventoryCheckDetail(@Valid MaterialInventoryCheckDetailSaveReqVO updateReqVO);

    /**
     * 删除库存盘点明细
     *
     * @param id 编号
     */
    void deleteMaterialInventoryCheckDetail(Long id);

    /**
    * 批量删除库存盘点明细
    *
    * @param ids 编号
    */
    void deleteMaterialInventoryCheckDetailListByIds(List<Long> ids);

    /**
     * 获得库存盘点明细
     *
     * @param id 编号
     * @return 库存盘点明细
     */
    MaterialInventoryCheckDetailDO getMaterialInventoryCheckDetail(Long id);

    /**
     * 获得库存盘点明细分页
     *
     * @param pageReqVO 分页查询
     * @return 库存盘点明细分页
     */
    PageResult<MaterialInventoryCheckDetailDO> getMaterialInventoryCheckDetailPage(MaterialInventoryCheckDetailPageReqVO pageReqVO);

    /**
     * 根据盘点项id查询盘点明细
     *
     * @param itemId 盘点项id
     * @return 盘点项列表
     */
    List<MaterialInventoryCheckDetailDO> getListByItemId(Long itemId);

    /**
     * 批量添加盘点明细
     *
     * @param checkDetailDOS 盘点明细列表
     */
    void addBatch(List<MaterialInventoryCheckDetailDO> checkDetailDOS);

    /**
     * 盘点
     *
     * @param inventoryReqVO 盘点信息
     * @return 盘点后物料信息
     */
    MaterialInventoryCheckDetailRespVO inventoryCheckInfomation(@Valid MaterialInventoryCheckDetailSaveReqVO inventoryReqVO);

    /**
     * 盘点明细分页列表
     *
     * @param pageReqVO 请求参数
     * @return 盘点列表
     */
    PageResult<MaterialInventoryCheckDetailRespVO> getPageWithInf(@Valid MaterialInventoryCheckDetailPageReqVO pageReqVO);

    /**
     * 盘点明细列表 - 实际存在但不在库的
     *
     * @param lfcId 仓库id
     * @return 盘点列表
     */
    List<MaterialInventoryCheckDetailDO> getListNotAtWarehouse(Long lfcId);

    /**
     * 盘点明细列表 - 在库但实际不存在的
     *
     * @param lfcId 仓库id
     * @return 盘点列表
     */
    List<MaterialInventoryCheckDetailDO> getListNotPresentAndAtWarehouse(Long lfcId);

    /**
     * 根据盘点id和物料id查询盘点明细
     *
     * @param checkId 盘点id
     * @param infId 物料id
     * @return 盘点明细
     */
    MaterialInventoryCheckDetailDO getByCheckIdAndInfId(Long checkId, Long infId);

    /**
     * 保存盘点明细
     *
     * @param checkDetailDO 盘点明细
     */
    void save(MaterialInventoryCheckDetailDO checkDetailDO);

    /**
     * 根据id更新盘点明细
     *
     * @param checkDetailDO 盘点明细
     */
    void updateById(MaterialInventoryCheckDetailDO checkDetailDO);
}