package com.ruoyi.web.modules.goods.mapper;

import java.util.List;
import org.apache.ibatis.annotations.Param;
import com.ruoyi.web.modules.goods.domain.BizGoods;
import com.ruoyi.web.modules.goods.vo.GoodsListVO;
import com.ruoyi.web.modules.stock.vo.StockQueryListRowVO;

/**
 * 商品 Mapper
 */
public interface BizGoodsMapper
{
    BizGoods selectById(@Param("goodsId") Long goodsId);

    BizGoods selectByIdAndShop(@Param("goodsId") Long goodsId, @Param("shopId") Long shopId);

    List<GoodsListVO> selectPlatformList(BizGoods query);

    int countPlatformPending();

    List<GoodsListVO> selectSellerList(BizGoods query);

    int countBlockingByShopId(@Param("shopId") Long shopId);

    int countByCategoryId(@Param("categoryId") Long categoryId);

    int countByShopCategoryId(@Param("shopCategoryId") Long shopCategoryId);

    int countByAttrTemplateId(@Param("templateId") Long templateId);

    int insert(BizGoods goods);

    int updateSeller(BizGoods goods);

    int updateSubmitStatus(@Param("goodsId") Long goodsId, @Param("goodsStatus") String goodsStatus,
            @Param("submitTime") java.util.Date submitTime, @Param("updateFirstSubmit") boolean updateFirstSubmit,
            @Param("updateBy") String updateBy);

    int updateAuditPass(@Param("goodsId") Long goodsId, @Param("updateBy") String updateBy);

    int updateAuditReject(@Param("goodsId") Long goodsId, @Param("rejectReason") String rejectReason,
            @Param("updateBy") String updateBy);

    int updateOffShelf(@Param("goodsId") Long goodsId, @Param("updateBy") String updateBy);

    int logicDeleteByIds(@Param("goodsIds") List<Long> goodsIds, @Param("shopId") Long shopId,
            @Param("updateBy") String updateBy);

    /** 支付成功扣减库存并累加销量 */
    int deductStock(@Param("goodsId") Long goodsId, @Param("quantity") Integer quantity);

    /** 入库加库存 */
    int incrementStock(@Param("goodsId") Long goodsId, @Param("shopId") Long shopId,
            @Param("quantity") Integer quantity);

    /** 行锁查询（手工入库） */
    BizGoods selectByIdAndShopForUpdate(@Param("goodsId") Long goodsId, @Param("shopId") Long shopId);

    /** 入库选品列表 */
    List<BizGoods> selectStockPickList(@Param("shopId") Long shopId, @Param("keyword") String keyword);

    /** 条码/编号精确匹配 */
    List<BizGoods> selectByGoodsSnAndShop(@Param("shopId") Long shopId, @Param("goodsSn") String goodsSn);

    /** 出库选品列表（stock>0） */
    List<BizGoods> selectOutboundPickList(@Param("shopId") Long shopId, @Param("keyword") String keyword);

    /** 手工出库减库存 */
    int decrementStockForOutbound(@Param("goodsId") Long goodsId, @Param("shopId") Long shopId,
            @Param("quantity") Integer quantity);

    /** 库存查询列表 */
    List<StockQueryListRowVO> selectStockQueryList(@Param("shopId") Long shopId, @Param("keyword") String keyword);

    /** 库存调整：直接设置可用库存（须 >= 0） */
    int setStockForAdjust(@Param("goodsId") Long goodsId, @Param("shopId") Long shopId,
            @Param("stock") Integer stock);
}
