package com.ruoyi.asset.mapper;

import java.util.List;
import org.apache.ibatis.annotations.Param;
import com.ruoyi.asset.domain.AmsAsset;
import com.ruoyi.asset.domain.AmsInboundOrder;
import com.ruoyi.asset.domain.AmsInboundOrderItem;

/**
 * 入库管理Mapper接口
 * 
 * @author Yangk
 * @date 2026-06-10
 */
public interface AmsInboundOrderMapper 
{
    /**
     * 查询入库管理
     * 
     * @param orderId 入库管理主键
     * @return 入库管理
     */
    public AmsInboundOrder selectAmsInboundOrderByOrderId(Long orderId);

    /**
     * 锁定并查询入库单
     *
     * @param orderId 入库单ID
     * @return 入库单
     */
    public AmsInboundOrder selectAmsInboundOrderByOrderIdForUpdate(Long orderId);

    /**
     * 查询入库管理列表
     * 
     * @param amsInboundOrder 入库管理
     * @return 入库管理集合
     */
    public List<AmsInboundOrder> selectAmsInboundOrderList(AmsInboundOrder amsInboundOrder);

    /**
     * 查询未被其他有效草稿占用的待入库资产（入库单明细弹窗选择器使用）
     * <p>只筛选 PENDING_INBOUND 状态的资产，并排除已被其他草稿入库单引用的行项，
     * 若传入 currentOrderId 则排除自身占用以支持编辑场景。</p>
     */
    public List<AmsAsset> selectAvailableInboundAssetList(@Param("asset") AmsAsset amsAsset,
            @Param("currentOrderId") Long currentOrderId, @Param("pendingStatus") String pendingStatus,
            @Param("draftStatus") String draftStatus);

    /**
     * 统计资产被其他有效草稿占用的数量（保存草稿时防重复占用校验）
     * <p>配合 selectAmsAssetByAssetIdForUpdate 行锁使用，
     * 确保同一资产不会被两个并发草稿同时引用。</p>
     */
    public int countOtherDraftInboundOrderByAssetId(@Param("assetId") Long assetId,
            @Param("currentOrderId") Long currentOrderId, @Param("draftStatus") String draftStatus);

    /**
     * 新增入库管理
     * 
     * @param amsInboundOrder 入库管理
     * @return 结果
     */
    public int insertAmsInboundOrder(AmsInboundOrder amsInboundOrder);

    /**
     * 修改入库管理
     * 
     * @param amsInboundOrder 入库管理
     * @return 结果
     */
    public int updateAmsInboundOrder(AmsInboundOrder amsInboundOrder);

    /**
     * 确认入库并写入操作人信息
     *
     * @param amsInboundOrder 入库单
     * @return 结果
     */
    public int confirmAmsInboundOrder(AmsInboundOrder amsInboundOrder);

    /**
     * 删除入库管理
     * 
     * @param orderId 入库管理主键
     * @return 结果
     */
    public int deleteAmsInboundOrderByOrderId(Long orderId);

    /**
     * 批量删除入库管理
     * 
     * @param orderIds 需要删除的数据主键集合
     * @return 结果
     */
    public int deleteAmsInboundOrderByOrderIds(String[] orderIds);

    /**
     * 批量删除入库单明细
     * 
     * @param orderIds 需要删除的数据主键集合
     * @return 结果
     */
    public int deleteAmsInboundOrderItemByOrderIds(String[] orderIds);
    
    /**
     * 批量新增入库单明细
     * 
     * @param amsInboundOrderItemList 入库单明细列表
     * @return 结果
     */
    public int batchAmsInboundOrderItem(List<AmsInboundOrderItem> amsInboundOrderItemList);
    

    /**
     * 通过入库管理主键删除入库单明细信息
     * 
     * @param orderId 入库管理ID
     * @return 结果
     */
    public int deleteAmsInboundOrderItemByOrderId(Long orderId);
}
