package com.shkj.wms.service;


import com.baomidou.mybatisplus.extension.service.IService;
import com.shkj.common.core.domain.Result;
import com.shkj.wms.bo.BaseContainerCallBo;
import com.shkj.wms.bo.SysStockDetailAddBo;
import com.shkj.wms.bo.SysStockDetailEditBo;
import com.shkj.wms.bo.SysStockDetailQueryBo;
import com.shkj.wms.domain.*;
import com.shkj.wms.vo.*;

import java.util.List;
import java.util.Map;

/**
 * 库存明细Service接口
 *
 * @author lch
 * @date 2023-05-05
 */
public interface ISysStockDetailService extends IService<SysStockDetail> {
    /**
     * 查询单个
     *
     * @param id
     * @return
     */
    Result<SysStockDetailVo> queryById(Long id);

    /**
     * 查询列表
     *
     * @param bo
     * @return
     */
    List<SysStockDetailVo> queryList(SysStockDetailQueryBo bo);

    /**
     * 根据新增业务对象插入库存明细
     *
     * @param bo 库存明细新增业务对象
     * @return
     */
    Result<Boolean> insertByAddBo(SysStockDetailAddBo bo);

    /**
     * 根据编辑业务对象修改库存明细
     *
     * @param bo 库存明细编辑业务对象
     * @return
     */
    Result<Boolean> updateByEditBo(SysStockDetailEditBo bo);

    /**
     * 校验并删除数据
     *
     * @param ids     主键集合
     * @param isValid 是否校验,true-删除前校验,false-不校验
     * @return
     */
    Result<Boolean> deleteWithValidById(List<Long> ids, Boolean isValid);

    /**
     * 根据货位查询库存
     *
     * @param locationId 货位Id
     * @return
     */
    Result<SysStockDetailVo> queryByLocation(Long locationId);

    /**
     * 入库
     *
     * @param locationId  货位ID
     * @param containerId 治具编号
     * @param batch       批次
     * @param isPuch      是否冲孔
     * @param goods       入库产品信息
     * @return
     */
    Result<Boolean> productDepositDetail(Long locationId, Long containerId, String batch, String isPuch, List<Map<String, String>> goods, Long storageCode);

    /**
     * 库存查询
     */
    List<SysStockDetailConVo> StockInquiry(SysStockDetailQueryBo bo);

    List<SysStockDetailConVo> StockInquiryPda(SysStockDetailQueryBo bo) ;
    /**
     * 找到位置
     *
     * @param containerId         容器id
     * @param baseMoldBarcodeList 基模具条码列表中
     * @param currentBranchId     当前分支id
     * @param isHigh
     * @return {@link StockDetailLocationVo}
     */
    StockDetailLocationVo findLocation(Long containerId, List<BaseMold> baseMoldBarcodeList, Long currentBranchId, boolean isHigh);

    StockDetailLocationVo findLocationByContainer(String  findLocationByContainer, Long currentBranchId);

    /**
     * 增加库存
     *
     * @param inPlans    在计划
     * @param locationVo
     * @param isActual
     */
    void addStockByIn(List<BusinOutInPlan> inPlans, StockDetailLocationVo locationVo, boolean isActual);

    /**
     * 找到出库货位
     *
     * @param plan 计划
     * @return {@code Result}
     */
    Result<SysStockDetailVo> findOutLocation(BusinOutInPlan plan);

    /**
     * 减少库存
     *
     * @param plan     计划
     * @param detailId 位置
     * @param isActual 是否实际出库
     */
    void subtractStockByOut(BusinOutInPlan plan, Long detailId, boolean isActual);


    /**
     * 货位调整时选择目的货位下拉框列表
     *
     * @return {@code Result<List<BaseLocation>>}
     */
    Result<List<BaseLocation>> getEmptyLocation();


    /**
     * 盘点更新库存数量
     *
     * @param updList 乌利希期刊指南列表
     * @return {@link Result}
     */
    Result updStockByInv(List<BusinStockInv> updList);

    /**
     * 通过托盘id
     *
     * @param containerId 托盘id
     * @return {@code List<SysStockDetail>}
     */
    List<SysStockDetail> getByContainerId(Long containerId);

    /**
     * 找到空位置
     *
     *
     * @param containerId
     * @param currentBranchId 当前分支id
     * @return {@code StockDetailLocationVo}
     */
    StockDetailLocationVo findEmptyLocation(Long containerId, Long currentBranchId);

    /**
     * 呼叫托盘入库
     *
     * @param containerCode 托盘代码
     * @return {@code StockDetailLocationVo}
     */
    StockDetailLocationVo findLocationNotContainerCode(String containerCode);

    StockDetailMoldVo findLocationNotContainerCode(BaseContainerCallBo bo);

    /**
     * 按位置删除id
     *
     * @param locationId 位置标识
     */
    void deleteByLocationId(Long locationId);


    /**
     * 根据托盘删除库位上的数据
     *
     * @param containerId 托盘ID
     */
    void deleteByContainerCode(Long containerId);


    /**
     * 出入库数量及库存数量
     * @return
     */
    public Result<List<SysStockAndInOutVo>> getPutInOutStockQty() ;

    /**
     * 区域库存占比
     * @return
     */
    public Result<List<SysStockByAreaVo>> getInventoryManagement();


    public Result<List<SysStockWeightByAreaVo>> getInvWeightManagement();
    /**
     * 货位使用率
     * @return
     */
    public Result<List<SysStockByReteVo>> getLocationUsageRate();

    /**
     * 获取库位上的模具数量，计算库位的状态，是满位还是半满位，还是空闲等
     */
    Integer getLocationMoldQty(Long locationId);


    /**
     * 根据条码获取所在的库位信息
     * @param moldBarcodeList
     * @return
     */
    List<SysStockDetail> queryByMoldBarcodeLocationList(List<String> moldBarcodeList);


    /**
     * 根据库位获取库位上的模具信息
     * @param locationCode
     * @return
     */
    public List<BaseMoldVo> getLocationMoldByLocationCode(String locationCode);

}
