
package com.tmerclub.cloud.product.mapper;

import com.tmerclub.cloud.api.product.bo.SpuSimpleBO;
import com.tmerclub.cloud.common.database.util.PageAdapter;
import com.tmerclub.cloud.common.product.bo.EsProductBO;
import com.tmerclub.cloud.common.product.dto.SpuDTO;
import com.tmerclub.cloud.common.product.dto.StockPointSkuDTO;
import com.tmerclub.cloud.common.product.vo.SpuVO;
import com.tmerclub.cloud.product.dto.SpuPageSearchDTO;
import com.tmerclub.cloud.product.model.Spu;
import com.tmerclub.cloud.product.vo.PlatformSpuExcelVO;
import com.tmerclub.cloud.product.vo.SpuCountVO;
import com.tmerclub.cloud.product.vo.SpuExcelVO;
import com.tmerclub.cloud.product.vo.SupplierSpuExcelVO;
import org.apache.ibatis.annotations.Param;

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

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

    /**
     * 获取spu信息列表
     *
     * @param spu
     * @return spu信息列表
     */
    List<SpuVO> list(@Param("spu") SpuPageSearchDTO spu);

    /**
     * 获取商品sku列表
     *
     * @param spuDTO
     * @param lang
     * @return
     */
    List<SpuVO> pageSpuSku(@Param("spuDTO") SpuDTO spuDTO, @Param("lang") Integer lang);

    /**
     * 根据spu信息id获取spu信息
     *
     * @param spuId spu信息id
     * @return spu信息
     */
    SpuVO getBySpuId(@Param("spuId") Long spuId);

    /**
     * 根据spu信息id获取spu信息
     *
     * @param spuId spu信息id
     * @return spu信息
     */
    SpuVO getSpuInfoBySpuId(@Param("spuId") Long spuId);

    /**
     * 保存spu信息
     *
     * @param spu spu信息
     */
    void save(@Param("spu") Spu spu);

    /**
     * 更新spu信息
     *
     * @param spu spu信息
     */
    void update(@Param("spu") Spu spu);

    /**
     * 根据商品id修改商品状态
     *
     * @param spuId 商品id
     */
    void updateStatusBySpuId(@Param("spuId") Long spuId);

    /**
     * 根据spuId获取商品信息（搜索）
     *
     * @param spuId
     * @return 商品信息
     */
    EsProductBO loadEsProductBO(@Param("spuId") Long spuId);

    /**
     * 获取 spuId列表
     *
     * @param shopCategoryIds 店铺分类id列表
     * @param categoryIds     平台分类Id列表
     * @param brandId         品牌id
     * @param shopId          店铺id
     * @return spuId列表
     */
    List<Long> getSpuIdsBySpuUpdateDTO(@Param("shopCategoryIds") List<Long> shopCategoryIds, @Param("categoryIds") List<Long> categoryIds
            , @Param("brandId") Long brandId, @Param("shopId") Long shopId);

    /**
     * 批量改变商品状态（上下架）
     *
     * @param spuIds
     * @param status
     */
    void batchChangeSpuStatus(@Param("spuIds") List<Long> spuIds, @Param("status") Integer status);

    /**
     * 更新spu表（canal监听后，会发送更新的消息，更新es中的数据）
     *
     * @param spuIds
     * @param categoryIds
     * @param shopIds
     * @param sysType
     */
    void updateSpuUpdateTime(@Param("spuIds") List<Long> spuIds, @Param("categoryIds") List<Long> categoryIds, @Param("shopIds") List<Long> shopIds, @Param("sysType") Integer sysType);

    /**
     * 下线店铺中的商品
     *
     * @param shopId
     */
    void offlineSpuByShopId(@Param("shopId") Long shopId);

    /**
     * 下线店铺中的商品
     *
     * @param supplierId
     */
    void offlineSpuBySupplierId(@Param("supplierId") Long supplierId);

    /**
     * 获取spu信息列表（excel导出）
     *
     * @param spuDTO
     * @return
     */
    List<SpuExcelVO> excelSpuList(@Param("spuSearch") SpuPageSearchDTO spuDTO);

    /**
     * 根据spuId或者为空直接获取可以参与秒杀活动的商品列表
     *
     * @param pageAdapter 分页数据
     * @param spuDTO      店铺id
     * @param lang        语言
     * @return 商品信息
     */
    List<SpuVO> listCanSeckillProd(@Param("page") PageAdapter pageAdapter, @Param("spuDTO") SpuDTO spuDTO, @Param("lang") Integer lang);

    /**
     * 根据运费id获取商品数量
     *
     * @param transportId
     * @return
     */
    Integer countByTransportId(@Param("transportId") Long transportId);

    /**
     * 变为普通商品
     *
     * @param spuIds
     */
    void changeToNormalSpu(@Param("spuIds") List<Long> spuIds);

    /**
     * 根据分类id与店铺id查询使用该分类的商品数量
     *
     * @param categoryId
     * @param shopId
     * @param sysType
     * @return
     */
    int countByCategoryAndShopId(@Param("categoryId") Long categoryId, @Param("shopId") Long shopId, @Param("sysType") Integer sysType);

    /**
     * 根据用户id查询商品收藏数量
     *
     * @param userId 用户id
     * @return 商品收藏数量
     */
    Integer countByUserId(@Param("userId") Long userId);

    /**
     * 获取商品id列表， 商品的店铺id列表，
     *
     * @param spuIds 商品的店铺id列表
     * @return 商品id列表
     */
    List<Long> spuShopIdsBySpuIds(@Param("spuIds") List<Long> spuIds);

    /**
     * 批量修改
     *
     * @param spuList 修改后的商品信息
     */
    void updateBatch(@Param("spuList") List<SpuVO> spuList);

    /**
     * 根据分类id列表与店铺id获取商品id列表
     *
     * @param cidList
     * @param shopId
     * @param sysType
     * @return
     */
    List<Long> listIdByCidAndShopId(@Param("cidList") List<Long> cidList, @Param("shopId") Long shopId, @Param("sysType") Integer sysType);

    /**
     * 根据分类id列表与店铺id或者商品id获取活动商品列表
     *
     * @param type        下线商品和活动类型，1.直接通过商品ids，2.通过shopId判断为平台还是店铺分类ids进行下架，3.下线店铺通过shopId
     * @param spuIds      商品ids
     * @param shopId      店铺id
     * @param categoryIds 分类id
     * @param status      修改后的商品状态，为空 默认查询条件status是1
     * @param shopIds
     * @return 商品信息
     */
    List<SpuVO> getActivitySpuInfoByCategoryIdsAndShopId(@Param("type") Integer type, @Param("spuIds") List<Long> spuIds,
                                                         @Param("shopId") Long shopId, @Param("categoryIds") List<Long> categoryIds,
                                                         @Param("status") Integer status, @Param("shopIds") List<Long> shopIds);

    /**
     * 获取商品信息列表
     *
     * @param spuIds 商品ids
     * @return
     */
    List<SpuVO> listSpuBySpuIds(@Param("spuIds") List<Long> spuIds);

    /**
     * 获取商品详细信息列表
     *
     * @param spuIds 商品ids
     * @return
     */
    List<SpuVO> listSpuDetailBySpuIds(@Param("spuIds") List<Long> spuIds);

    /**
     * 获取未删除商品数量
     *
     * @param time
     * @return 商品数量
     */
    Long getAllSpuNum(@Param("time") Date time);

    /**
     * 根据商品更新时间，获取商品id列表
     *
     * @param time
     * @return
     */
    List<Spu> listAllSpu(@Param("time") Date time);

    /**
     * 根据店铺id列表与商品状态获取商品id列表
     *
     * @param sysType
     * @param shopIds
     * @param status
     * @param disStatus
     * @return
     */
    List<Long> listSpuIdByShopIdsAndStatus(@Param("sysType") Integer sysType, @Param("shopIds") List<Long> shopIds, @Param("status") Integer status, @Param("disStatus") Integer disStatus);


    /**
     * 根据商品id设置商品是否置顶
     *
     * @param spuId
     */
    void toTopBySpuId(@Param("spuId") Long spuId);

    /**
     * 批量更新商品，允许设置字段为空
     *
     * @param spuList 商品集合
     * @return
     */
    Integer updateBatchFieldSetNull(@Param("spuList") List<SpuVO> spuList);

    /**
     * 根据基本信息获取商品列表
     *
     * @param spuSimpleBO
     * @return
     */
    List<SpuSimpleBO> listSimple(@Param("spuSimpleBO") SpuSimpleBO spuSimpleBO);

    /**
     * 根据基本信息获取商品列表(包含删除商品
     *
     * @param spuSimpleBO
     * @return
     */
    List<SpuSimpleBO> listSimples(@Param("spuSimpleBO") SpuSimpleBO spuSimpleBO);

    /**
     * 根据商品id列表获取商品名称列表
     *
     * @param spuIds 商品id列表
     * @return 商品列表
     */
    List<SpuVO> listSpuNameBySpuIds(@Param("spuIds") List<Long> spuIds);

    /**
     * 根据店铺id列表获取商品id列表
     *
     * @param shopIds
     * @return
     */
    List<Long> getSpuIdsByShopIds(@Param("shopIds") List<Long> shopIds);

    /**
     * 移除商品中指定的品牌信息
     *
     * @param brandId
     */
    void removeBrandOfSpu(@Param("brandId") Long brandId);

    /**
     * 根据spuIds获取spu状态列表
     *
     * @param spuIds
     * @return
     */
    List<SpuVO> listSpuStatusByIds(@Param("spuIds") List<Long> spuIds);

    /**
     * 根据供应商Id查询不同状态下商品数量
     *
     * @param supplierId
     * @return
     */
    SpuCountVO getSpuCountBySupplierId(@Param("supplierId") Long supplierId);


    /**
     * 根据店铺id和供应商商品id判断店铺是否代销了
     *
     * @param shopId
     * @param supplierSpuId
     * @return
     */
    Integer isCommissionByShopIdAndSpuId(@Param("shopId") Long shopId, @Param("supplierSpuId") Long supplierSpuId);

    /**
     * 根据供应商商品skuId获取代销商品id集合
     *
     * @param skuId
     * @return
     */
    List<Spu> getSupplierSupIdBySkuId(@Param("skuId") Long skuId);

    /**
     * 根据店铺id获取供应商商品id列表
     *
     * @param shopId
     * @return
     */
    List<Long> getSupplierSpuId(@Param("shopId") Long shopId);

    /**
     * 获取代销spu信息列表（excel导出）
     *
     * @param spuDTO
     * @return
     */
    List<SupplierSpuExcelVO> excelSupplierSpuList(@Param("spuSearch") SpuPageSearchDTO spuDTO);

    /**
     * 根据店铺id和供应商商品id获取代销商品信息
     *
     * @param shopId
     * @param supplierSpuId
     * @return
     */
    SpuVO getSpuByShopIdAndSupplierSpuId(@Param("shopId") Long shopId, @Param("supplierSpuID") Long supplierSpuId);

    /**
     * 根据店铺id和供应商品id列表获取代销商品id列表
     *
     * @param shopId
     * @param supplierSpuId
     * @return
     */
    List<Long> getSpuIdByShopIdAndSupplierSpuId(@Param("shopId") Long shopId, @Param("supplierSpuId") List<Long> supplierSpuId);

    /**
     * 获取代销商品spu信息列表
     *
     * @param spu
     * @return spu信息列表
     */
    List<SpuVO> supplierSpuList(@Param("spu") SpuPageSearchDTO spu);

    /**
     * 根据店铺id和供应商商品id列表批量获取代销商品信息
     *
     * @param shopId
     * @param supplierSpuIds
     * @return
     */
    List<SpuVO> listSpuByShopIdAndSupplierSpuId(@Param("shopId") Long shopId, @Param("supplierSpuIds") List<Long> supplierSpuIds);

    /**
     * 批量设置供应商商品更新后代销商品是否已同步更新值
     *
     * @param spuIds
     * @param isSynUpdate
     */
    void batchChangeSynUpdate(@Param("spuIds") List<Long> spuIds, @Param("isSynUpdate") Integer isSynUpdate);

    /**
     * 供应商商品更新后代销商品是否已同步更新值
     *
     * @param spuId
     * @param isSynUpdate
     */
    void changeSynUpdate(@Param("spuId") Long spuId, @Param("isSynUpdate") Integer isSynUpdate);

    /**
     * 根据供应商商品id获取代销商品id集合
     *
     * @param supplierId
     * @return
     */
    List<Long> getSupIdListBySupplierId(@Param("supplierId") Long supplierId);

    /**
     * 根据供应商商品id列表获取代销商品id集合
     *
     * @param supplierIds
     * @return
     */
    List<Long> batchSupIdListBySupplierId(@Param("supplierIds") List<Long> supplierIds);

    /**
     * 根据供应商商品id列表获取代销商品id集合
     *
     * @param supplierIds
     * @return
     */
    List<SpuVO> batchSupListBySupplierId(@Param("supplierIds") List<Long> supplierIds);

    /**
     * 根据供应商id和商品类型批量获取商品信息
     *
     * @param supplierId
     * @param createTime
     * @param supplierSpuType
     * @return
     */
    List<SpuVO> getSpuIdsBySupplierIdAndSupplierSpuType(@Param("supplierId") Long supplierId, @Param("createTime") Date createTime, @Param("supplierSpuType") Integer supplierSpuType);

    /**
     * 根据供应商id批量获取商家代销商品信息
     *
     * @param supplierId
     * @return
     */
    List<SpuVO> listMerchantSpuIdsBySupplierId(@Param("supplierId") Long supplierId);

    /**
     * 根据供应商商品id获取发货方式为供应商的代销商品信息
     *
     * @param supplierSpuId
     * @return
     */
    List<SpuVO> listSpuBySupplierSpuId(@Param("supplierSpuId") Long supplierSpuId);

    /**
     * 根据spuCode查询商品数量
     *
     * @param spuCode
     * @param spuId
     * @param supplierSpuId
     * @return
     */
    Integer getCountBySpuCode(@Param("spuCode") String spuCode, @Param("spuId") Long spuId, @Param("supplierSpuId") Long supplierSpuId);

    /**
     * 根据供应商品id获取代销商品Id集合
     *
     * @param supplierSpuId
     * @param deliveryType
     * @return
     */
    List<Long> getCommissionSpuIdList(@Param("supplierSpuIds") Long supplierSpuId, @Param("deliveryType") Integer deliveryType);

    /**
     * 根据供应商品id获取发货方式为供应商发货代销商品Id集合
     *
     * @param supplierSpuId
     * @return
     */
    List<SpuVO> getCommissionSpuListBySupplierDeliver(@Param("supplierSpuId") Long supplierSpuId);

    /**
     * 获取代销商品的 供应商商品更新后代销商品是否已同步更新 值
     *
     * @param spuIds
     * @return
     */
    List<SpuVO> getSpuIsSynUpdate(@Param("spuIds") List<Long> spuIds);

    /**
     * 批量修改代销商品发货方式
     *
     * @param spuIds
     * @param deliverType
     */
    void batchUpdateCommissionSpuDeliverType(@Param("spuIds") List<Long> spuIds, @Param("deliverType") Integer deliverType);

    /**
     * 根据供应商品id获取代销商品集合
     *
     * @param supplierSpuId
     * @return
     */
    List<SpuVO> getCommissionSpuList(@Param("supplierSpuId") Long supplierSpuId);

    /**
     * 获取商家端的代销商品
     *
     * @param shopId
     * @return
     */
    List<Long> getCommissionSpuListByShopId(@Param("shopId") Long shopId);

    /**
     * 更新商品的品牌信息（删除签约品牌时，同步更改相关的商品品牌信息）
     *
     * @param brandIdList
     * @param shopId
     * @param sysType
     */
    void updateSpuByBrandIdAndShopId(@Param("brandIdList") List<Long> brandIdList, @Param("shopId") Long shopId, @Param("sysType") Integer sysType);

    /**
     * 根据供应商id和商品状态获取供应商品
     *
     * @param supplierId
     * @param status
     * @return
     */
    List<SpuVO> getSupplierSpuBySupplierId(@Param("supplierId") Long supplierId, @Param("status") Integer status);

    /**
     * 根据spuIds获取多个spu信息
     *
     * @param spuIds
     * @return
     */
    List<SpuVO> getBySpuIds(@Param("spuIds") List<Long> spuIds);

    /**
     * 获取除当前状态以外的商品id
     *
     * @param status
     * @return
     */
    List<Long> listSpuIdsByExcludeStatus(@Param("status") Integer status);

    /**
     * 获取平台商品导出列表
     *
     * @param spuIds
     * @return
     */
    List<PlatformSpuExcelVO> listPlatformSpuExcel(@Param("spuIds") List<Long> spuIds);

    /**
     * 获取供应商库存预警数量
     *
     * @param supplierId
     * @return
     */
    Long stockWarningCount(@Param("supplierId") Long supplierId);

    /**
     * 获取列表
     *
     * @return
     */
    List<SpuVO> getVirtualSpuList();

    /**
     * 根据店铺id更新商品
     *
     * @param shopId  店铺id
     * @param sysType 系统类型
     */
    void updateSpuByShopId(@Param("shopId") Long shopId, @Param("sysType") Integer sysType);

    /**
     * 获取店铺中指定供应商商品的代销商品列表
     *
     * @param shopId
     * @param supplierSpuIds
     * @return
     */
    List<SpuVO> listShopSpuBySupplierSpuIds(@Param("shopId") Long shopId, @Param("supplierSpuIds") List<Long> supplierSpuIds);

    /**
     * 获取库存点spu信息列表
     *
     * @param spuDTO
     * @return spu信息列表
     */
    List<SpuVO> listPointSpu(@Param("spuDTO") StockPointSkuDTO spuDTO);

    /**
     * 获取库存点spu和sku信息列表
     * @param spuDTO spuDTO
     * @return spu信息列表
     */
    List<SpuVO> listStockPointSpuAndSku(@Param("spuDTO") StockPointSkuDTO spuDTO);


    /**
     * 获取状态正常的商品数量
     *
     * @param spuIds
     * @param skuIds
     * @return
     */
    int countNormalSpuBySpuIds(@Param("spuIds") Set<Long> spuIds);

    /**
     * 获取店铺/供应商spu编码集合
     * @param tenantId 租户id
     * @param sysType 系统类
     * @param spuId 商品spuId
     * @return spu编码集合
     */
    List<String> listSpuCodes(@Param("tenantId") Long tenantId,
                              @Param("sysType") Integer sysType,
                              @Param("spuId") Long spuId);
}
