
package com.tmerclub.cloud.product.service;

import com.tmerclub.cloud.api.product.vo.SkuStockVO;
import com.tmerclub.cloud.common.cache.constant.LuaOperateEnum;
import com.tmerclub.cloud.common.product.dto.SkuDTO;
import com.tmerclub.cloud.common.product.dto.StockPointSkuDTO;
import com.tmerclub.cloud.common.product.vo.SkuVO;
import com.tmerclub.cloud.common.product.vo.StockPointSkuVO;
import com.tmerclub.cloud.product.model.SkuStock;
import org.apache.ibatis.annotations.Param;

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

/**
 * 库存信息
 *
 * @author tmerclub
 * @date 2020-10-28 15:27:24
 */
public interface SkuStockService {

    /**
     * 批量保存库存信息
     * @param skuStocks 库存信息
     * @param spuStatus 商品状态
     */
    void batchSave(List<SkuStockVO> skuStocks, Integer spuStatus);

    /**
     * 批量更新sku库存信息
     * @param skuList
     */
    void updateBatch(List<SkuDTO> skuList);

    /**
     * 根据商品id获取库存信息
     *
     * @param spuId
     * @return
     */
    Map<String, SkuStockVO> listStockBySpuId(@Param("spuId") Long spuId);

    /**
     * 通过供应商的spuId，获取商家对应的sku库存
     * @param spuIds
     * @param shopId
     * @return
     */
    List<SkuVO> listSkuStockBySupplierSpuIds(List<Long> spuIds, Long shopId);

    /**
     * 获取指定sku的库存
     *
     * @param skuId
     * @param spuMold
     * @return
     */
    SkuStock getBySkuId(Long skuId, Integer spuMold);


    /**
     * 批量指定商品总库存，不包括被禁用的sku的库存
     * @param spuIds
     * @return
     */
    Map<Long, Integer> spuStockMapBySpuIds(List<Long> spuIds);

    /**
     * 通过商品编码，获取商家对应的库存
     * @param partyCodes
     * @param shopId
     * @return
     */
    List<SkuVO> listShopStockByPartyCodesAndShopId(List<String> partyCodes, Long shopId);

    /**
     * 获取指定的sku库存列表
     * @param stockPointIdList
     * @return
     */
    List<SkuStockVO> listSkuStockBySkuIds(List<StockPointSkuVO> stockPointIdList);

    /**
     * 获取指定的sku总库存
     * @param skuIds
     * @return
     */
    Map<Long, SkuStockVO> mapSkuTotalStockBySkuIds(List<Long> skuIds);

    /**
     * 获取指定的sku区域库存
     * @param stockPointSkuVOList
     * @return
     */
    Map<String, SkuStockVO> mapSkuPointStockByStockPoints(List<StockPointSkuVO> stockPointSkuVOList);

    /**
     * 获取指定的sku总库存和区域库存
     * @param stockPointSkuVOList
     * @return
     */
    Map<String, SkuStockVO> mapSkuTotalStockAndPointStock(List<StockPointSkuVO> stockPointSkuVOList);

    /**
     * 获取指定的sku库存信息列表
     * @param skuIds
     * @return
     */
    Map<String, SkuStockVO> skuStockMapBySkuIds(List<Long> skuIds);

    /**
     * 定时任务处理sku库存的变化
     */
    void handleSkuStockChange();

    /**
     * 版本升级后初始化sku库存
     */
    void initSkuStock();

    /**
     * 版本升级后初始化sku区域库存， 需要先执行initSkuStock()
     */
    void initPointStock();

    /**
     * 改变sku状态
     * @param skuStockList
     */
    void changeSkuStatus(List<SkuStockVO> skuStockList);

    /**
     * 处理库存点关联数据
     * @param spuId
     * @param skuStockList
     * @param luaOperateEnum
     * @param hasUserPickUp 是否自提
     */
    void handSkuStock(Long spuId, List<SkuStockVO> skuStockList, LuaOperateEnum luaOperateEnum, Boolean hasUserPickUp);

    /**
     * 修改sku库存
     * @param skuStockVOList sku库存VO集合
     */
    void changeSkuStock(List<SkuStockVO> skuStockVOList);

    /**
     * 补充商品库存
     * @param spuId
     * @param stockPointSkuVOList
     */
    void addStockPointBySpuId(Long spuId, List<StockPointSkuDTO> stockPointSkuVOList);
}
