package com.ruoyi.ams.inv.service;

import com.ruoyi.ams.inv.domain.InvLotAtt;
import com.ruoyi.ams.inv.dto.InvLotAttDTO;
import com.ruoyi.ams.inv.dto.InvLotAttPalletTotalDTO;
import com.ruoyi.ams.order.dto.ReversePickInventoryMatchDTO;
import com.ruoyi.framework.service.CrudService;

import java.math.BigDecimal;
import java.util.List;
import java.util.Map;

/**
 * 批次属性Service接口
 *
 * @author andy
 * @date 2022-03-09
 */
public interface IInvLotAttService extends CrudService<InvLotAtt, InvLotAttDTO>
{
    /**
     * 查询批次属性
     *
     * @param lotnum 批次属性主键
     * @return 批次属性
     */
     InvLotAtt selectInvLotAttByLotnum(String lotnum);

    /**
     * 查询批次属性列表
     *
     * @param invLotAtt 批次属性
     * @return 批次属性集合
     */
     List<InvLotAtt> selectInvLotAttList(InvLotAtt invLotAtt);

    /**
     * 查询批次属性
     *
     * @param invLotAtt 批次属性
     * @return 批次属性集合
     */
    InvLotAtt selectInvLotAttByModel(InvLotAtt invLotAtt);

    /**
     * 修改批次属性
     *
     * @param invLotAtt 批次属性
     * @return 结果
     */
     int updateInvLotAtt(InvLotAtt invLotAtt);


    /**
     * 设置批次号Lotatt14为空
     *
     * @param lotnum
     * @return
     */
     int updateInvLotAttLotatt14IsNull(String lotnum);

    /**
     * 批量删除批次属性
     *
     * @param lotnums 需要删除的批次属性主键集合
     * @return 结果
     */
     int deleteInvLotAttByLotnums(String[] lotnums);

    /**
     * 删除批次属性信息
     *
     * @param lotnum 批次属性主键
     * @return 结果
     */
     int deleteInvLotAttByLotnum(String lotnum);

    /**
     * 根据入库单号查询当前入库单内的成品批次列表
     */
    List<InvLotAtt> queryAttributesByAsnno(String asnNo);

    /**
     * 根据多sku获取不同sku各托盘上总数(根据库位库存信息获取所关联批次托盘)
     * @param skuList
     * @return
     */
    Map<String, List<InvLotAttPalletTotalDTO>> buildInvLotAttPalletTotalMap(List<String> skuList);

    /**
     * 根据出库单号以及sku获取不同sku各托盘上已备货总数
     * @param reversePickInventoryMatchDTOList
     * @return
     */
    Map<String, List<InvLotAttPalletTotalDTO>> buildReversePickInvLotAttPalletTotalMap(List<ReversePickInventoryMatchDTO> reversePickInventoryMatchDTOList);

    /**
     * 获取托盘产品数量
     * @param palletNo
     * @param locationId
     * @return
     */
    BigDecimal queryPalletTotal(String palletNo, String locationId);

    /**
     * 新增批次属性
     *
     * @param invLotAtt 批次属性
     * @return 结果
     */
    int insertInvLotAtt(InvLotAtt invLotAtt);

    List<InvLotAtt> queryInvLotAtt(String palletNo);

    /**
     * 根据sn获取批次信息
     * @param palletNo
     * @param sn
     * @return
     */
    List<InvLotAtt> queryInvLotAtt(String palletNo, String sn);

    /**
     * 根据条码获取批次信息(退货情况下可能会有多批次信息)
     * @param palletNo
     * @param sn
     * @param orderNo
     * @return
     */
    List<InvLotAtt> queryInvLotAtt(String palletNo, String sn, String orderNo);

    List<InvLotAtt> queryInvLotAtt(List<String> palletNoList);

    List<InvLotAtt> queryInvLotAttByBarCodeList(String sn);

    /**
     * 根据出库单号查询已备货/出库批次
     * @param orderNoList
     * @return
     */
    List<InvLotAtt> queryInvLotAttByOrderNoList(List<String> orderNoList);

    /**
     * 根据出库单号及物料码查询出库单与扫描物料相同已分配数量
     * @param sku
     * @param orderNo
     * @return
     */
    List<InvLotAtt> queryOrderSameSkuInvLotAttList(String sku, String orderNo);

    /**
     * 根据出库单号及物料码查询出库单与扫描物料相同已分配数量
     */
    List<InvLotAtt> queryOrderSameSkuInvLotAttList(String sku, List<String> orderNoList);

    /**
     * 根据出库单号及物料码查询出库单与扫描物料相同已分配数量
     */
    List<InvLotAtt> queryOrderSameSkuInvLotAttList(List<String> skuList, String orderNo);

    /**
     * 根据出库单号及物料码查询出库单与扫描物料相同已分配数量
     */
    List<InvLotAtt> queryOrderSameSkuInvLotAttList(List<String> skuList, List<String> orderNoList);

    List<InvLotAtt> queryInvLotAttByLotNumList(List<String> lotNumList);
}