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

import java.math.BigDecimal;
import java.util.*;

import com.alibaba.fastjson.JSONObject;
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.MaterialInfomationPageReqVO;
import com.zt.plat.module.qms.resource.material.controller.vo.MaterialInfomationRespVO;
import com.zt.plat.module.qms.resource.material.controller.vo.MaterialInfomationSaveReqVO;
import com.zt.plat.module.qms.resource.material.controller.vo.MaterialLifecycleRespVO;
import com.zt.plat.module.qms.resource.material.controller.vo.query.MaterialInfomationQueryVO;
import com.zt.plat.module.qms.resource.material.controller.vo.resp.MaterialInfomationLedgerRespVO;
import com.zt.plat.module.qms.resource.material.dal.dataobject.*;
import jakarta.validation.*;
import com.zt.plat.framework.common.pojo.PageResult;

/**
 * 物料实例 Service 接口
 *
 * @author 后台管理
 */
public interface MaterialInfomationService {

    /**
     * 创建物料实例
     *
     * @param createReqVO 创建信息
     * @return 编号
     */
    MaterialInfomationRespVO createMaterialInfomation(@Valid MaterialInfomationSaveReqVO createReqVO);

    /**
     * 更新物料实例
     *
     * @param updateReqVO 更新信息
     */
    void updateMaterialInfomation(@Valid MaterialInfomationSaveReqVO updateReqVO);

    /**
     * 删除物料实例
     *
     * @param id 编号
     */
    void deleteMaterialInfomation(Long id);

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

    /**
     * 获得物料实例
     *
     * @param id 编号
     * @return 物料实例
     */
    MaterialInfomationDO getMaterialInfomation(Long id);

    /**
     * 获得物料实例分页
     *
     * @param pageReqVO 分页查询
     * @return 物料实例分页
     */
    PageResult<MaterialInfomationDO> getMaterialInfomationPage(MaterialInfomationPageReqVO pageReqVO);

    /**
     * 批量保存物料实例
     *
     * @param infomationDOS 物料实例
     */
    void saveBatch(List<MaterialInfomationDO> infomationDOS);

    /**
     * 获得物料实例分页
     *
     * @param pageReqVO 分页查询
     * @return 物料实例分页
     */
    PageResult<MaterialInfomationRespVO> getMaterialInfomationPageWithPdtInfo(@Valid MaterialInfomationPageReqVO pageReqVO);

    /**
     * 根据物料编号获取物料信息
     *
     * @param queryVO 查询信息
     * @return 物料信息
     */
    MaterialInfomationRespVO getMaterialInfomationWithPdtInfoByInfCode(MaterialInfomationQueryVO queryVO);

    /**
     * 根据物料实例id集合 获取物料信息
     *
     * @param infomationIds id集合
     * @return 物料信息
     */
    List<MaterialInfomationDO> getListByIds(List<Long> infomationIds);

    /**
     * 保存物料实例
     *
     * @param infomationDO 物料实例
     */
    void save(MaterialInfomationDO infomationDO);

    /**
     * 更新物料实例
     *
     * @param infomationDO 物料实例
     */
    void updateById(MaterialInfomationDO infomationDO);

    /**
     * 根据id获取物料信息
     *
     * @param id id
     * @return 物料信息
     */
    MaterialInfomationRespVO getMaterialInfomationWithPdtInfoByInfId(Long id);

    /**
     * 批量更新物料信息
     *
     * @param infomationDOS 批量更新
     */
    void updateBatch(List<MaterialInfomationDO> infomationDOS);

    /**
     * 根据id集合获取物料信息 - 带大类信息
     *
     * @param ids id集合
     * @return 物料信息
     */
    List<MaterialInfomationRespVO> getRespListWithPdtInfoByIds(List<Long> ids);

    /**
     * 保存物料信息 - 危化品配置生成
     *
     * @param product 大类信息
     * @param totalOperationQuantity 总操作数量
     * @return 物料信息
     */
    MaterialInfomationDO saveMaterialInfomationByHzrdMtrlMake(MaterialProductDO product, BigDecimal totalOperationQuantity);

    /**
     * 批量保存物料信息 - 标准溶液配置生成生成
     *
     * @param productId 大类id
     * @param mtrlStandSol 标液
     * @return 物料信息
     */
    MaterialInfomationDO saveMaterialInfomationByStdSolMake(Long productId, MaterialStandardSolutionDO mtrlStandSol);

    /**
     * 批量保存物料信息 - 批次入库生成
     *
     * @param locationId 位置id
     * @param reqQuantity 数量
     * @param product 大类信息
     * @param batch 批次信息
     * @return 物料信息
     */
    List<MaterialInfomationDO> saveMaterialInfomationsByBatInb(Long locationId, BigDecimal reqQuantity, MaterialBatchDO gong, MaterialProductDO product, MaterialBatchDO batch);

    /**
     * 批量更新物料信息
     *
     * @param infomationIds id集合
     * @param materialInfomationDO 批量更新
     */
    void updateByIds(List<Long> infomationIds, MaterialInfomationDO materialInfomationDO);

    /**
     * 批量更新物料信息 - 入库/出库
     *
     * @param infomations 物料信息
     * @param adjustType 入库/出库
     */
    void updateInfomationInbOrOutbStatus(List<MaterialLifecycleDetailDO> infomations, AdjustType adjustType);

    /**
     * 批量锁物料 入库/出库 状态
     *
     * @param infomations 物料信息
     * @param lockType 入库/出库
     */
    void lockInfomationInbOrOutbStatus(List<MaterialLifecycleDetailDO> infomations, LockType lockType);

    /**
     * 批量开封处理
     *
     * @param infomationIds id集合
     * @param openInfo 开封信息
     */
    void openSealTreatment(List<Long> infomationIds, MaterialUseEndReuseDO openInfo);

    /**
     * 更新过期物料状态
     *
     * @return 更新的物料数量
     */
    Integer updateExpiredMaterialStatus();

    //查询需要“期间核查”的物料列表
    List<MaterialInfoWithBizConfigVO> getListNeedByRule(JSONObject params);

    /**
     * 获取物料库存台账
     *
     * @param pageReqVO 分页参数
     * @return 物料库存台账
     */
    PageResult<MaterialInfomationLedgerRespVO> getMaterialInventoryLedgerPage(@Valid MaterialInfomationPageReqVO pageReqVO);


    /**
     * 根据盘点单id获取盘点物料信息
     *
     * @param lfcWithDtl 盘点单
     * @return 盘点物料信息
     */
    List<MaterialInfomationDO> getCheckInfsByCheckLfc(MaterialLifecycleRespVO lfcWithDtl);
}