package com.shkj.wms.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.shkj.common.core.domain.Result;
import com.shkj.wms.bo.*;
import com.shkj.wms.domain.BaseLocation;
import com.shkj.wms.config.ValidList;
import com.shkj.wms.vo.BaseLocationDetailVo;
import com.shkj.wms.vo.BaseLocationVo;
import com.shkj.wms.vo.BusinDataTaskGoodsVo;

import java.util.List;

/**
 * 货位资料Service接口
 *
 * @author lch
 * @date 2022-04-23
 */
public interface IBaseLocationService extends IService<BaseLocation> {
    /**
     * 查询单个
     *
     * @param id
     * @return
     */
    Result<BaseLocationVo> queryById(Long id);

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

    /**
     * 根据新增业务对象插入货位资料
     *
     * @param bo 货位资料新增业务对象
     * @return
     */
    Result<Boolean> insertByAddBo(BaseLocationAddBo bo);

    /**
     * 根据编辑业务对象修改货位资料
     *
     * @param bo 货位资料编辑业务对象
     * @return
     */
    Result<Boolean> updateByEditBo(BaseLocationEditBo bo);

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

    /**
     * 获取推荐的货位
     *
     * @param distribute    true 已存在就不会找新的  false 会找到所有符合的
     * @param locationName
     * @param businInShelfD
     * @param goods
     * @param basePackage
     * @return
     */
  //  List<Long> queryRecommendLocations(Boolean distribute, String locationName, BusinInShelfD businInShelfD, BaseGoods goods, BasePackage basePackage);

    /**
     * 根据id集合查询货位信息
     *
     * @param locationIds
     * @return
     */
    List<BaseLocationVo> queryLocationsByIds(List<Long> locationIds);

    /**
     * 根据id集合查询货位信息
     *
     * @param locationIds
     * @param goodsId
     * @return
     */
    List<BaseLocationVo> queryLocationsPackageByIds(List<Long> locationIds, Long goodsId);


    /**
     * 查询货位资料列表
     * @param bo
     * @return
     */
    List<BaseLocationVo> queryBaseLocationList(BaseLocationQueryPageBo bo);


    /**
     * 查询满足条件下的货位数据对应的巷道号
     * @param bo
     * @return
     */
    List<String> queryBaseLocationTunnelList(BaseLocationQueryListBo bo);

    /**
     * 保存或者修改货位资料集合（根据是否有id来判断新增或者修改）
     * @param list
     * @return
     */
    Result<Boolean> saveOrUpdateBaseLocations(ValidList<BaseLocationSaveOrUpdateBo> list);

    /**
     * 按规则保存多个货位资料集合
     * @param bo
     * @return
     */
    Result<Boolean> saveBaseLocationMany(BaseLocationManyBo bo);

    /**
     * 保存或者修改货位（根据是否有id来判断新增或者修改）
     * @param bo
     * @return
     */
    Result<Boolean> saveOrUpdateBaseLocation(BaseLocationSaveOrUpdateBo bo);

    BaseLocationVo queryLocationById(Long targetLocationId);
    BaseLocationVo queryLocationByCode(String locationCode);
    BaseLocationVo queryLocationByName(String locationName);



    Result<Boolean> switchStatus(Long id, String status);

    /**
     * 根据派生分配空货位
     *
     * @param vehicheModel
     * @return
     */
    Result<BaseLocationVo> assignEmptyLocation(String vehicheModel,String color ,String batch,List<BusinDataTaskGoodsVo> businDataTaskGoodsVos);

    /**
     * 根据产品查找库内库存数量最少的巷道
     * @param goodsNo
     * @param batch
     * @param businDataTaskGoodsVos
     * @return
     */
    Result<BaseLocationVo> assignEmptyLocationByStock( String goodsNo,String vehicheModel, String batch,List<BusinDataTaskGoodsVo> businDataTaskGoodsVos);


    /**
     * 检查货位是否有对应双深位
     *
     * @param locationVo  当前货位
     * @return
     */
    Result<BaseLocationVo> getDeepLocation(BaseLocationVo locationVo);

    /**
     * 更改货位状态
     *
     * @param id  货位ID
     * @param status  货位状态
     * @return
     */
    Result<Boolean> changeLocationStatus(Long id, String status);


    List<BaseLocationVo> getBaseLocationForMap(BaseLocationQueryPageBo bo);

    Result<List<BaseLocationDetailVo>> queryTargetLocation(BaseLocationUrgentBo bo);

}
