package com.ruoyi.asset.mapper;

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

/**
 * 资产台账Mapper接口
 * 
 * @author Yangk
 * @date 2026-06-04
 */
public interface AmsAssetMapper 
{
    /**
     * 查询资产台账
     * 
     * @param assetId 资产台账主键
     * @return 资产台账
     */
    public AmsAsset selectAmsAssetByAssetId(Long assetId);

    /**
     * 锁定并查询资产台账
     *
     * @param assetId 资产ID
     * @return 资产台账
     */
    public AmsAsset selectAmsAssetByAssetIdForUpdate(Long assetId);

    /**
     * 按资产编码锁定并查询资产台账
     *
     * @param assetCode 资产编码
     * @return 资产台账
     */
    public AmsAsset selectAmsAssetByAssetCodeForUpdate(String assetCode);

    /**
     * 查询资产台账列表
     * 
     * @param amsAsset 资产台账
     * @return 资产台账集合
     */
    public List<AmsAsset> selectAmsAssetList(AmsAsset amsAsset);

    /**
     * 查询可绑定RFID标签的资产列表
     *
     * @param amsAsset 查询条件
     * @param disposedStatus 已报废状态
     * @return 可绑定资产集合
     */
    public List<AmsAsset> selectBindableAmsAssetList(@Param("asset") AmsAsset amsAsset,
                                                     @Param("disposedStatus") String disposedStatus);

    /**
     * 校验资产编码是否唯一
     *
     * @param assetCode 资产编码
     * @return 资产台账
     */
    public AmsAsset checkAssetCodeUnique(String assetCode);

    /**
     * 统计资产业务引用数量
     *
     * @param assetId 资产ID
     * @return 引用数量
     */
    public int countAssetReferences(Long assetId);

    /**
     * 新增资产台账
     * 
     * @param amsAsset 资产台账
     * @return 结果
     */
    public int insertAmsAsset(AmsAsset amsAsset);

    /**
     * 修改资产台账
     * 
     * @param amsAsset 资产台账
     * @return 结果
     */
    public int updateAmsAsset(AmsAsset amsAsset);

    /**
     * 更新资产状态流转字段
     *
     * @param amsAsset 资产台账
     * @return 结果
     */
    public int updateAssetForTransition(AmsAsset amsAsset);

    /**
     * 建立资产当前RFID绑定
     *
     * @param assetId 资产ID
     * @param tagId 标签ID
     * @param tagCode 标签编码
     * @param epcCode EPC编码
     * @param disposedStatus 已报废状态
     * @param updateBy 更新人
     * @param updateTime 更新时间
     * @return 结果
     */
    public int bindAssetRfid(@Param("assetId") Long assetId,
                             @Param("tagId") Long tagId,
                             @Param("tagCode") String tagCode,
                             @Param("epcCode") String epcCode,
                             @Param("disposedStatus") String disposedStatus,
                             @Param("updateBy") String updateBy,
                             @Param("updateTime") Date updateTime);

    /**
     * 清空资产当前RFID绑定信息
     * <p>通过标签ID或"标签编码+EPC"双重条件匹配当前绑定关系，防止解绑到错误的标签。</p>
     *
     * @param assetId    资产ID
     * @param tagId      当前绑定标签ID（优先按 tagId 匹配）
     * @param tagCode    当前标签编码（tagId 为空时回退到编码+EPC联合匹配）
     * @param epcCode    当前绑定EPC编码
     * @param updateBy   更新人
     * @param updateTime 更新时间
     * @return 结果
     */
    public int clearAssetRfidBinding(@Param("assetId") Long assetId,
                                     @Param("tagId") Long tagId,
                                     @Param("tagCode") String tagCode,
                                     @Param("epcCode") String epcCode,
                                     @Param("updateBy") String updateBy,
                                     @Param("updateTime") Date updateTime);

    /**
     * 更新资产上次维保日期
     *
     * @param assetId 资产ID
     * @param lastMaintenanceDate 上次维保日期
     * @param updateBy 更新人
     * @param updateTime 更新时间
     * @return 结果
     */
    public int updateAssetMaintenanceDate(@Param("assetId") Long assetId,
                                          @Param("lastMaintenanceDate") Date lastMaintenanceDate,
                                          @Param("updateBy") String updateBy,
                                          @Param("updateTime") Date updateTime);

    /**
     * 删除资产台账
     * 
     * @param assetId 资产台账主键
     * @return 结果
     */
    public int deleteAmsAssetByAssetId(Long assetId);

}
