
package com.tmerclub.cloud.product.mapper;

import com.tmerclub.cloud.api.product.dto.StockBillLogItemDTO;
import com.tmerclub.cloud.common.product.dto.ProductSearchDTO;
import com.tmerclub.cloud.common.product.dto.SkuDTO;
import com.tmerclub.cloud.common.product.vo.SkuAddrVO;
import com.tmerclub.cloud.common.product.vo.SkuVO;
import com.tmerclub.cloud.product.model.Sku;
import com.tmerclub.cloud.product.model.SkuStock;
import org.apache.ibatis.annotations.Param;

import java.util.List;
import java.util.Set;

/**
 * sku信息
 *
 * @author tmerclub
 * @date 2020-10-28 15:27:24
 */
public interface SkuMapper {

    /**
     * 获取skuVO集合
     * @param skuDTO skuDTO
     * @return skuVO集合
     */
    List<SkuVO> listSku(@Param("skuDTO") SkuDTO skuDTO);

    /**
     * 更新sku信息
     *
     * @param sku sku信息
     */
    void update(@Param("sku") Sku sku);

    /**
     * 根据sku信息id删除sku信息
     *
     * @param skuId
     */
    void deleteById(@Param("skuId") Long skuId);

    /**
     * 根据spuId获取sku信息
     *
     * @param spuId id
     * @return 返回sku信息
     */
    List<SkuVO> listSkuWithAttrBySpuId(@Param("spuId") Long spuId);

    /**
     * 批量保存
     *
     * @param skuList
     */
    void saveBatch(@Param("skuList") List<SkuDTO> skuList);

    /**
     * 根据spuId删除sku信息
     *
     * @param spuId spuId
     */
    void updateBySpuId(Long spuId);

    /**
     * 批量修改
     *
     * @param skus 修改后的信息
     */
    void updateBatch(@Param("skus") List<Sku> skus);


    /**
     * 根据skuid获取sku信息
     *
     * @param skuId
     * @return
     */
    SkuVO getSkuBySkuId(@Param("skuId") Long skuId);

    /**
     * 获取导出的sku
     *
     * @param product
     * @return
     */
    List<SkuVO> listExportSku(@Param("product") ProductSearchDTO product);

    /**
     * 获取excel导出sku数据列表
     *
     * @param spuIds
     * @return
     */
    List<SkuVO> excelSkuList(@Param("spuIds") List<Long> spuIds);


    /**
     * 获取excel导出sku数据列表(过滤掉下架和删除的sku)
     *
     * @param spuIds
     * @return
     */
    List<SkuVO> listSkuBySpuIds(@Param("spuIds") List<Long> spuIds);

    /**
     * 获取指定sku的价格
     *
     * @param skuIds
     * @return
     */
    List<SkuVO> listSkuPriceByIds(@Param("skuIds") List<Long> skuIds);


    /**
     * 根据skuId列表获取商品订单修改地址所需信息
     *
     * @param skuIds skuId列表
     * @return sku列表
     */
    List<SkuAddrVO> listSpuDetailByIds(@Param("skuIds") List<Long> skuIds);

    /**
     * 根据skuId列表获取售价最低的商品的售价
     *
     * @param skuIds
     * @return
     */
    Long getMinPriceFeeByIds(@Param("skuIds") List<Long> skuIds);

    /**
     * 根据商品id和供应商skuId获取代销sku售价
     *
     * @param skuId
     * @param supplierSkuId
     * @return
     */
    Long getPriceFeeBySpuIdAndSupplierSkuId(@Param("spuId") Long skuId, @Param("supplierSkuId") Long supplierSkuId);


    /**
     * 根据供应商品skuId和spuId获取代销商品skuId
     *
     * @param supplierSkuId
     * @param spuId
     * @return
     */
    Long getSkuIdBySupplierSkuId(@Param("supplierSkuId") Long supplierSkuId, @Param("spuId") Long spuId);

    /**
     * 根据skuid获取sku信息
     *
     * @param skuIdList
     * @return
     */
    List<SkuVO> listSkuBySkuIds(@Param("skuIdList") List<Long> skuIdList);

    /**
     * 根据商品编码获取商品规格列表
     *
     * @param partyCodeList 商品编码
     * @return 商品信息
     */
    List<SkuVO> listByPartyCodeList(@Param("partyCodeList") List<String> partyCodeList);

    /**
     * 根据商品编码和店铺id获取
     *
     * @param partyCode
     * @param shopId
     * @param sysType
     * @return
     */
    StockBillLogItemDTO getSkuByPartyCodeAndShopId(@Param("partyCode") String partyCode, @Param("shopId") Long shopId, @Param("sysType") Integer sysType);

    /**
     * 根据spuId获取sku
     *
     * @param spuId
     * @return
     */
    List<SkuVO> getBySpuId(@Param("spuId") Long spuId);

    /**
     * 获取当前商家的所有sku编码
     *
     * @param shopId
     * @param sysType
     * @param spuId
     * @return
     */
    List<String> listSkuPartyCodesByShopId(@Param("shopId") Long shopId, @Param("sysType") Integer sysType, @Param("spuId") Long spuId);

    /**
     * 根据spuId和供应商skuId获取skuId
     *
     * @param spuId
     * @param supplierSkuId
     * @return
     */
    Long getSkuIdBySpuIdAndSupplierSkuId(@Param("spuId") Long spuId, @Param("supplierSkuId") Long supplierSkuId);


    /**
     * 获取商品库存预警数量
     *
     * @param product 商品筛选
     * @return
     */
    Integer getStockWarningNum(@Param("product") ProductSearchDTO product);

    /**
     * 根据供应商skuId获取代销skuId列表
     *
     * @param supplierSkuId
     * @return
     */
    List<Long> getSkuIdsBySupplierSkuId(@Param("supplierSkuId") Long supplierSkuId);

    /**
     * 根据供应商skuId，获取代销skuId
     *
     * @param shopId 指定查询的店铺
     * @param skuIds
     * @return
     */
    List<SkuVO> listShopSkuPriceBySupplierSkuIds(@Param("shopId") Long shopId, @Param("skuIds") List<Long> skuIds);

    /**
     * 根据店铺id和商品编码获取skuId列表
     *
     * @param partyCode 商品编码
     * @param shopId    店铺id
     * @param supplierId 供应商id
     * @return skuId列表
     */
    List<SkuVO> listSkuByPartyCodeAndShopId(@Param("partyCode") String partyCode,
                                            @Param("shopId") Long shopId,
                                            @Param("supplierId") Long supplierId);


    /**
     * 库存查询
     *
     * @param product
     * @return
     */
    List<SkuVO> pageSku(@Param("product") ProductSearchDTO product);

    /**
     * 获取商品的skuId列表
     *
     * @param spuId
     * @return
     */
    List<Long> listSkuIdBySpuId(@Param("spuId") Long spuId);

    /**
     * 获取商品的skuId列表
     *
     * @param spuIds
     * @return
     */
    List<SkuVO> listSimpleSkuBySpuIds(@Param("spuIds") List<Long> spuIds);

    /**
     * 获取商品的供应商skuId列表
     *
     * @param spuIds
     * @param shopId
     * @return
     */
    List<SkuVO> listSupplierSkuIdBySpuId(@Param("spuIds") List<Long> spuIds, @Param("shopId") Long shopId);

    /**
     * 初始化商品库存的分页查询
     *
     * @param skuIds
     * @return
     */
    List<SkuStock> listSkuStock(@Param("skuIds") List<Long> skuIds);

    /**
     * 根据商品编码和店铺id获取skuId列表
     *
     * @param partyCodes
     * @param shopId
     * @return
     */
    List<SkuVO> listSkuIdByPartyCodesAndShopId(@Param("partyCodes") List<String> partyCodes, @Param("shopId") Long shopId);

    /**
     * 获取指定商品的sku列表
     *
     * @param spuIds
     * @return
     */
    List<SkuVO> listBySpuIds(@Param("spuIds") List<Long> spuIds);

    /**
     * 批量更新库存预警状态
     *
     * @param skuList
     */
    void batchUpdateSkuWarning(@Param("skuList") List<SkuVO> skuList);

    /**
     * 获取所有的sku数据
     * @return
     */
    List<SkuVO> listAll();

    /**
     * 获取指定商品的skuId列表和组合商品的sku组合列表
     * @param spuId
     * @return
     */
    List<SkuVO> listSimpleSkuAndComboBySpuId(@Param("spuId") Long spuId);


    /**
     * 获取状态正常的规格数量
     *
     * @param skuIds
     * @return
     */
    int countNormalSkuBySkuIds(@Param("skuIds") Set<Long> skuIds);
}
