package com.ruoyi.web.stock.mapper;

import com.ruoyi.web.stock.domain.WarehouseInventory;
import com.ruoyi.web.stock.domain.vo.InventoryLineOptionVo;
import com.ruoyi.web.stock.domain.vo.StockOptionVo;
import org.apache.ibatis.annotations.Param;

import java.util.List;

/**
 * 仓库库存 Mapper。
 */
public interface WarehouseInventoryMapper {
    WarehouseInventory selectWarehouseInventoryById(Long id);

    List<WarehouseInventory> selectWarehouseInventoryList(WarehouseInventory query);

    /**
     * 指定企业、仓库编号下的全部库存（未删除），按 id 倒序。
     */
    List<WarehouseInventory> selectWarehouseInventoryListByWarehouseNo(@Param("orgId") String orgId,
                                                                       @Param("warehouseNo") String warehouseNo);

    int insertWarehouseInventory(WarehouseInventory entity);

    int updateWarehouseInventory(WarehouseInventory entity);

    int deleteWarehouseInventoryById(Long id);

    WarehouseInventory selectByUniqueKey(@Param("orgId") String orgId,
                                         @Param("warehouseNo") String warehouseNo,
                                         @Param("goodsNum") String goodsNum,
                                         @Param("batchNo") String batchNo);

    int increaseInventory(@Param("id") Long id,
                          @Param("stockQty") java.math.BigDecimal stockQty,
                          @Param("assistStockQty") java.math.BigDecimal assistStockQty,
                          @Param("costAmount") java.math.BigDecimal costAmount,
                          @Param("updateBy") String updateBy);

    /**
     * 盘点确认：将库存数量直接更新为实盘数量（成本不变）。
     */
    int updateStockQtyById(@Param("id") Long id,
                           @Param("stockQty") java.math.BigDecimal stockQty,
                           @Param("assistStockQty") java.math.BigDecimal assistStockQty,
                           @Param("updateBy") String updateBy);

    WarehouseInventory selectWarehouseInventoryByBatchNo(@Param("batchNo") String batchNo, @Param("orgId") String orgId);

    StockOptionVo selectMaterialByGoodsNum(String goodsNum);

    List<StockOptionVo> selectMaterialOptions(@Param("orgId") String orgId);

    /**
     * 当前租户下可盘点的库存行（含物料基本/辅助单位）。
     */
    List<InventoryLineOptionVo> selectInventoryLinesForStockCheck(@Param("orgId") String orgId);
}
