package com.ruoyi.asset.mapper;

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

/**
 * 报修维修管理Mapper接口
 *
 * @author Yangk
 * @date 2026-06-16
 */
public interface AmsRepairOrderMapper
{
    /**
     * 查询报修维修管理
     *
     * @param repairId 报修维修管理主键
     * @return 报修维修管理
     */
    public AmsRepairOrder selectAmsRepairOrderByRepairId(Long repairId);

    /**
     * 悲观独占锁查询报修维修管理
     *
     * @param repairId 报修维修管理主键
     * @return 报修维修管理
     */
    public AmsRepairOrder selectAmsRepairOrderByRepairIdForUpdate(Long repairId);

    /**
     * 查询报修维修管理列表
     *
     * @param amsRepairOrder 报修维修管理
     * @return 报修维修管理集合
     */
    public List<AmsRepairOrder> selectAmsRepairOrderList(AmsRepairOrder amsRepairOrder);

    /**
     * 新增报修维修管理
     *
     * @param amsRepairOrder 报修维修管理
     * @return 结果
     */
    public int insertAmsRepairOrder(AmsRepairOrder amsRepairOrder);

    /**
     * 修改报修维修管理
     *
     * @param amsRepairOrder 报修维修管理
     * @return 结果
     */
    public int updateAmsRepairOrder(AmsRepairOrder amsRepairOrder);

    /**
     * 删除报修维修管理（逻辑删除）
     *
     * @param repairId 报修维修管理主键
     * @return 结果
     */
    public int deleteAmsRepairOrderByRepairId(Long repairId);

    /**
     * 批量删除报修维修管理（逻辑删除）
     *
     * @param repairIds 需要删除的数据主键集合
     * @return 结果
     */
    public int deleteAmsRepairOrderByRepairIds(String[] repairIds);

    /**
     * 统计资产被其他未完结报修单占用的次数
     *
     * @param assetId 资产ID
     * @param currentRepairId 当前报修单ID（排除自身）
     * @param statuses 未完结的报修单状态列表
     * @return 占用次数
     */
    public int countOtherActiveRepairOrderByAssetId(@Param("assetId") Long assetId,
            @Param("currentRepairId") Long currentRepairId,
            @Param("statuses") List<String> statuses);

    /**
     * 查询可用于报修的在库/在用资产列表
     *
     * @param asset 过滤条件
     * @param currentRepairId 当前单据ID（排除自身）
     * @param statuses 允许的前置资产状态（IN_STOCK, IN_USE）
     * @param activeRepairStatuses 活跃报修状态列表
     * @return 可报修资产列表
     */
    public List<AmsAsset> selectAvailableRepairAssetList(@Param("asset") AmsAsset asset,
            @Param("currentRepairId") Long currentRepairId,
            @Param("statuses") List<String> statuses,
            @Param("activeRepairStatuses") List<String> activeRepairStatuses);
}
