package com.ruoyi.asset.mapper;

import java.util.List;
import com.ruoyi.asset.domain.AmsAsset;
import com.ruoyi.asset.domain.AmsReturnAssetCandidate;
import com.ruoyi.asset.domain.AmsReturnOrder;
import com.ruoyi.asset.domain.AmsReturnOrderItem;
import org.apache.ibatis.annotations.Param;

/**
 * 退库管理Mapper接口
 *
 * @author Yangk
 */
public interface AmsReturnOrderMapper
{
    public AmsReturnOrder selectAmsReturnOrderByOrderId(Long orderId);

    /** 
     * 查询退库单并对其所在的数据库记录行加排他锁（FOR UPDATE）。
     * <p>
     * 业务保障：
     * 用于确保在进行单据提交（DRAFT -> PENDING_CONFIRM）或确认退库（PENDING_CONFIRM -> RETURNED）等状态操作时，
     * 两个并发的线程不会同时修改同一条单据状态，从而杜绝多线程下的事务竞态和脏数据。
     * </p>
     */
    public AmsReturnOrder selectAmsReturnOrderByOrderIdForUpdate(Long orderId);

    public List<AmsReturnOrder> selectAmsReturnOrderList(AmsReturnOrder amsReturnOrder);

    /** 
     * 查询未被其他有效退库单占用的可退库（在用状态）资产候选列表。
     * 
     * @param amsAsset 资产基础筛选信息
     * @param currentOrderId 当前编辑的退库单ID（若存在，查询应包括当前单据已包含的资产，避免自冲突）
     * @param originWarehouseId 限制特定的源仓库ID（一单一仓库规则）
     * @param missingOriginOnly 是否仅筛选缺少领用来源的资产
     * @param inUseStatus 资产正常的“在用”状态常量
     * @param draftStatus 退库单的“草稿”状态常量（防占用检测用）
     * @param pendingStatus 退库单的“待确认”状态常量（防占用检测用）
     */
    public List<AmsReturnAssetCandidate> selectAvailableReturnAssetList(@Param("asset") AmsAsset amsAsset,
            @Param("currentOrderId") Long currentOrderId, @Param("originWarehouseId") Long originWarehouseId,
            @Param("missingOriginOnly") Boolean missingOriginOnly, @Param("inUseStatus") String inUseStatus,
            @Param("draftStatus") String draftStatus, @Param("pendingStatus") String pendingStatus);

    /** 
     * 查询资产最近一次已完成领用的原仓位快照。
     * 从领用历史表中按确认时间降序关联提取。
     */
    public AmsReturnAssetCandidate selectReturnAssetCandidateByAssetId(Long assetId);

    /** 
     * 统计指定资产在除当前单据外的其他有效退库单（草稿、待确认）中的占用数量。
     * 用以在保存、提交、确认时进行排他性资产占用防呆验证。
     */
    public int countOtherActiveReturnOrderByAssetId(@Param("assetId") Long assetId,
            @Param("currentOrderId") Long currentOrderId, @Param("draftStatus") String draftStatus,
            @Param("pendingStatus") String pendingStatus);

    public int insertAmsReturnOrder(AmsReturnOrder amsReturnOrder);

    public int updateAmsReturnOrder(AmsReturnOrder amsReturnOrder);

    public int submitAmsReturnOrder(AmsReturnOrder amsReturnOrder);

    public int confirmAmsReturnOrder(AmsReturnOrder amsReturnOrder);

    public int deleteAmsReturnOrderByOrderId(Long orderId);

    public int deleteAmsReturnOrderByOrderIds(String[] orderIds);

    public int deleteAmsReturnOrderItemByOrderIds(String[] orderIds);

    public int batchAmsReturnOrderItem(List<AmsReturnOrderItem> amsReturnOrderItemList);

    public int deleteAmsReturnOrderItemByOrderId(Long orderId);
}
