package com.ruoyi.asset.mapper;

import java.util.List;
import java.util.Date;
import com.ruoyi.asset.domain.AmsAsset;
import com.ruoyi.asset.domain.AmsBorrowOrder;
import com.ruoyi.asset.domain.AmsBorrowOrderItem;
import org.apache.ibatis.annotations.Param;

/**
 * 借用归还管理Mapper接口
 *
 * @author Yangk
 * @date 2026-06-16
 */
public interface AmsBorrowOrderMapper
{
    /**
     * 查询借用归还管理
     *
     * @param orderId 借用归还管理主键
     * @return 借用归还管理
     */
    public AmsBorrowOrder selectAmsBorrowOrderByOrderId(Long orderId);

    /**
     * 独占悲观锁查询借用归还管理
     *
     * @param orderId 借用归还管理主键
     * @return 借用归还管理
     */
    public AmsBorrowOrder selectAmsBorrowOrderByOrderIdForUpdate(Long orderId);

    /**
     * 查询借用归还管理列表
     *
     * @param amsBorrowOrder 借用归还管理
     * @return 借用归还管理集合
     */
    public List<AmsBorrowOrder> selectAmsBorrowOrderList(AmsBorrowOrder amsBorrowOrder);

    /**
     * 新增借用归还管理
     *
     * @param amsBorrowOrder 借用归还管理
     * @return 结果
     */
    public int insertAmsBorrowOrder(AmsBorrowOrder amsBorrowOrder);

    /**
     * 修改借用归还管理
     *
     * @param amsBorrowOrder 借用归还管理
     * @return 结果
     */
    public int updateAmsBorrowOrder(AmsBorrowOrder amsBorrowOrder);

    /**
     * 删除借用归还管理
     *
     * @param orderId 借用归还管理主键
     * @return 结果
     */
    public int deleteAmsBorrowOrderByOrderId(Long orderId);

    /**
     * 批量删除借用归还管理
     *
     * @param orderIds 需要删除的数据主键集合
     * @return 结果
     */
    public int deleteAmsBorrowOrderByOrderIds(String[] orderIds);

    /**
     * 批量删除借用单明细
     *
     * @param orderIds 需要删除的数据主键集合
     * @return 结果
     */
    public int deleteAmsBorrowOrderItemByOrderIds(String[] orderIds);

    /**
     * 批量新增借用单明细
     *
     * @param amsBorrowOrderItemList 借用单明细列表
     * @return 结果
     */
    public int batchAmsBorrowOrderItem(List<AmsBorrowOrderItem> amsBorrowOrderItemList);

    /**
     * 通过借用归还管理主键删除借用单明细信息
     *
     * @param orderId 借用归还管理ID
     * @return 结果
     */
    public int deleteAmsBorrowOrderItemByOrderId(Long orderId);

    /**
     * 查询可用于借用的资产列表
     *
     * @param asset 资产查询条件
     * @param currentOrderId 当前单据ID（排除自身）
     * @param stockStatus 在库状态编码
     * @param draftStatus 草稿状态编码
     * @param pendingStatus 待确认状态编码
     * @return 可借用资产列表
     */
    public List<AmsAsset> selectAvailableBorrowAssetList(@Param("asset") AmsAsset asset,
            @Param("currentOrderId") Long currentOrderId,
            @Param("stockStatus") String stockStatus,
            @Param("draftStatus") String draftStatus,
            @Param("pendingStatus") String pendingStatus);

    /**
     * 统计资产被其他活跃借用单占用的次数
     *
     * @param assetId 资产ID
     * @param currentOrderId 当前单据ID（排除自身）
     * @param draftStatus 草稿状态编码
     * @param pendingStatus 待确认状态编码
     * @return 占用次数
     */
    public int countOtherActiveBorrowOrderByAssetId(@Param("assetId") Long assetId,
            @Param("currentOrderId") Long currentOrderId,
            @Param("draftStatus") String draftStatus,
            @Param("pendingStatus") String pendingStatus);

    /**
     * 提交借用单
     *
     * @param amsBorrowOrder 借用单
     * @return 结果
     */
    public int submitAmsBorrowOrder(AmsBorrowOrder amsBorrowOrder);

    /**
     * 确认借出借用单
     *
     * @param amsBorrowOrder 借用单
     * @return 结果
     */
    public int confirmAmsBorrowOrder(AmsBorrowOrder amsBorrowOrder);

    /**
     * 驳回借用单
     *
     * @param amsBorrowOrder 借用单
     * @return 结果
     */
    public int rejectAmsBorrowOrder(AmsBorrowOrder amsBorrowOrder);

    /**
     * 按主单和明细ID锁定借用单明细
     *
     * @param orderId 借用单ID
     * @param itemId 明细ID
     * @return 借用单明细
     */
    public AmsBorrowOrderItem selectAmsBorrowOrderItemByOrderIdAndItemIdForUpdate(
            @Param("orderId") Long orderId, @Param("itemId") Long itemId);

    /**
     * 带期望状态更新借用单明细归还信息
     *
     * @param item 明细项
     * @param expectedStatus 更新前期望状态
     * @return 结果
     */
    public int updateAmsBorrowOrderItemReturnStatus(@Param("item") AmsBorrowOrderItem item,
            @Param("expectedStatus") String expectedStatus);

    /**
     * 查询借用单明细列表
     *
     * @param orderId 借用单ID
     * @return 结果
     */
    public List<AmsBorrowOrderItem> selectAmsBorrowOrderItemList(Long orderId);

    /**
     * 自定义直接修改主单状态
     *
     * @param orderId 借用单ID
     * @param orderStatus 目标状态
     * @param updateBy 更新人
     * @param updateTime 更新时间
     * @return 结果
     */
    public int updateAmsBorrowOrderStatus(@Param("orderId") Long orderId,
            @Param("orderStatus") String orderStatus,
            @Param("updateBy") String updateBy,
            @Param("updateTime") Date updateTime);
}
