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

import com.zt.plat.framework.common.pojo.PageResult;
import com.zt.plat.module.qms.enums.AdjustType;
import com.zt.plat.module.qms.enums.LockType;
import com.zt.plat.module.qms.resource.material.controller.vo.MaterialBatchPageReqVO;
import com.zt.plat.module.qms.resource.material.controller.vo.MaterialBatchRespVO;
import com.zt.plat.module.qms.resource.material.controller.vo.MaterialBatchSaveReqVO;
import com.zt.plat.module.qms.resource.material.controller.vo.importer.MaterialBatchImportExcelVO;
import com.zt.plat.module.qms.resource.material.controller.vo.resp.MaterialBatchImportRespVO;
import com.zt.plat.module.qms.resource.material.dal.dataobject.MaterialBatchDO;
import com.zt.plat.module.qms.resource.material.dal.dataobject.MaterialLifecycleDetailDO;
import jakarta.validation.*;

import java.util.List;

/**
 * 物料批次 Service 接口
 *
 * @author 后台管理
 */
public interface MaterialBatchService {

    /**
     * 创建物料批次
     *
     * @param createReqVO 创建信息
     * @return 编号
     */
    MaterialBatchRespVO createMaterialBatch(@Valid MaterialBatchSaveReqVO createReqVO);

    /**
     * 更新物料批次
     *
     * @param updateReqVO 更新信息
     */
    void updateMaterialBatch(@Valid MaterialBatchSaveReqVO updateReqVO);

    /**
     * 删除物料批次
     *
     * @param id 编号
     */
    void deleteMaterialBatch(Long id);

    /**
    * 批量删除物料批次
    *
    * @param ids 编号
    */
    void deleteMaterialBatchListByIds(List<Long> ids);

    /**
     * 获得物料批次
     *
     * @param id 编号
     * @return 物料批次
     */
    MaterialBatchDO getMaterialBatch(Long id);

    /**
     * 获得物料批次分页
     *
     * @param pageReqVO 分页查询
     * @return 物料批次分页
     */
    PageResult<MaterialBatchDO> getMaterialBatchPage(MaterialBatchPageReqVO pageReqVO);

    /**
     * 批次工段拆分
     *
     * @param createReqVOs 创建信息
     * @return 工段编号
     */
    List<MaterialBatchRespVO> assignMaterialBatchGongduan(@Valid List<MaterialBatchSaveReqVO> createReqVOs);

    /**
     * 获取工段列表
     *
     * @param batIds 批次 id
     * @return 工段列表
     */
    List<MaterialBatchDO> getGongduanListByBatIds(List<Long> batIds);

    /**
     * 提交物料批次
     *
     * @param id 批次id
     * @return 是否
     */
    Boolean submitMaterialBatch(Long id);

    /**
     * 根据工段ids 获取工段列表
     *
     * @param gongIds ids
     * @return 工段列表
     */
    List<MaterialBatchDO> getGongduanListByGongIds(List<Long> gongIds);

    /**
     * 更新批次工段入库数量
     *
     * @param gongDO 批次工段信息
     */
    void updateById(MaterialBatchDO gongDO);

    /**
     * 根据批次id 获取批次信息
     *
     * @param batchIds 批次id
     * @return 批次信息
     */
    List<MaterialBatchDO> getBatchListByBatchIds(List<Long> batchIds);

    /**
     * 更新批次退换数量
     *
     * @param batches 批次信息
     * @param adjustType 调整类型
     */
    void updateBatchReturnExchangeCount(List<MaterialLifecycleDetailDO> batches, AdjustType adjustType);

    /**
     * 更新工段退换数量
     *
     * @param gongs 工段信息
     * @param adjustType 调整类型
     */
    void updateGongduanReturnExchangeCount(List<MaterialLifecycleDetailDO> gongs, AdjustType adjustType);

    /**
     * 根据批次ids 获取批次信息
     *
     * @param ids 批次ids
     * @return 批次信息
     */
    List<MaterialBatchDO> getListByIds(List<Long> ids);

    /**
     * 锁定批次退换数量
     *
     * @param batches 批次信息
     * @param lockType 锁定类型
     */
    void lockBatchReturnExchangeCount(List<MaterialLifecycleDetailDO> batches, LockType lockType);

    /**
     * 锁定工段退换数量
     *
     * @param gongs 工段信息
     * @param lockType 锁定类型
     */
    void lockGongduanReturnExchangeCount(List<MaterialLifecycleDetailDO> gongs, LockType lockType);

    /**
     * 获得批次工段分页 - 需要可以层级穿透查询及返回物料信息
     *
     * @param pageReqVO 分页请求参数
     * @return 分页数据
     */
    PageResult<MaterialBatchRespVO> getBatchGongPageWithPdtInfo(@Valid MaterialBatchPageReqVO pageReqVO);

    /**
     * 锁定批次校准数量
     *
     * @param batches 批次信息
     * @param lockType 锁定类型
     */
    void lockBatchVerifyCalibrateCount(List<MaterialLifecycleDetailDO> batches, LockType lockType);

    /**
     * 更新批次检定数量
     *
     * @param batches 批次信息
     * @param adjustType 调整类型
     */
    void updateBatchVerifyCalibrateCount(List<MaterialLifecycleDetailDO> batches, AdjustType adjustType);

    /**
     * 导入物料批次列表
     *
     * @param importList 导入数据列表
     * @return 导入结果
     */
    MaterialBatchImportRespVO importMaterialBatchList(List<MaterialBatchImportExcelVO> importList);

    /**
     * 根据ids 更新
     *
     * @param ids ids
     */
    void updateByIds(List<Long> ids, MaterialBatchDO updateEntity);

    /**
     * 批量保存
     *
     * @param dos 实体集合
     */
    void saveBatch(List<MaterialBatchDO> dos);

    /**
     * 批量更新
     *
     * @param gongs 批次信息
     */
    void updateBatch(List<MaterialBatchDO> gongs);
}