package com.ruoyi.credit.mapper;

import java.util.List;

import org.apache.ibatis.annotations.Param;

import com.ruoyi.credit.domain.Contract;

/**
 * 合同Mapper接口
 * 
 * @author ruoyi
 * @date 2025-01-11
 */
public interface ContractMapper 
{
    /**
     * 查询合同
     * 
     * @param contractId 合同主键
     * @return 合同
     */
    public Contract selectContractByContractId(Long contractId);

    /**
     * 根据合同编号查询合同
     * 
     * @param contractNumber 合同编号
     * @return 合同
     */
    public Contract selectContractByContractNumber(String contractNumber);

    /**
     * 查询合同列表
     * 
     * @param contract 合同
     * @return 合同集合
     */
    public List<Contract> selectContractList(Contract contract);

    /**
     * 根据合同类型查询合同列表
     * 
     * @param contractType 合同类型
     * @return 合同集合
     */
    public List<Contract> selectContractListByType(@Param("contractType") String contractType);

    /**
     * 根据安保公司ID查询合同列表
     * 
     * @param securityCompanyId 安保公司ID
     * @return 合同集合
     */
    public List<Contract> selectContractListBySecurityCompany(@Param("securityCompanyId") Long securityCompanyId);

    /**
     * 根据甲方单位ID查询合同列表
     * 
     * @param clientCompanyId 甲方单位ID
     * @return 合同集合
     */
    public List<Contract> selectContractListByClientCompany(@Param("clientCompanyId") Long clientCompanyId);

    /**
     * 根据状态查询合同
     * 
     * @param contractStatus 合同状态
     * @return 合同集合
     */
    public List<Contract> selectContractByStatus(@Param("contractStatus") String contractStatus);

    /**
     * 查询已确认的合同
     * 
     * @return 已确认的合同集合
     */
    public List<Contract> selectConfirmedContracts();

    /**
     * 查询即将到期的合同
     * 
     * @param days 提前天数
     * @return 合同集合
     */
    public List<Contract> selectExpiringContracts(@Param("days") int days);

    /**
     * 根据状态统计合同数量
     * 
     * @param contractStatus 合同状态
     * @return 合同数量
     */
    public int countContractsByStatus(@Param("contractStatus") String contractStatus);

    /**
     * 新增合同
     * 
     * @param contract 合同
     * @return 结果
     */
    public int insertContract(Contract contract);

    /**
     * 修改合同
     * 
     * @param contract 合同
     * @return 结果
     */
    public int updateContract(Contract contract);

    /**
     * 更新合同状态
     * 
     * @param contractId 合同ID
     * @param contractStatus 新状态
     * @return 结果
     */
    public int updateContractStatus(@Param("contractId") Long contractId, @Param("contractStatus") String contractStatus);

    /**
     * 更新合同区块链哈希
     * 
     * @param contractId 合同ID
     * @param blockchainTxHash 区块链交易哈希
     * @return 结果
     */
    public int updateContractBlockchainHash(@Param("contractId") Long contractId, @Param("blockchainTxHash") String blockchainTxHash);

    /**
     * 确认合同
     * 
     * @param contractId 合同ID
     * @param confirmedBy 确认人ID
     * @return 结果
     */
    public int confirmContract(@Param("contractId") Long contractId, @Param("confirmedBy") Long confirmedBy);

    /**
     * 检查合同编号唯一性
     * 
     * @param contractNumber 合同编号
     * @return 是否唯一
     */
    public boolean checkContractNumberUnique(@Param("contractNumber") String contractNumber);

    /**
     * 删除合同
     * 
     * @param contractId 合同主键
     * @return 结果
     */
    public int deleteContractByContractId(Long contractId);

    /**
     * 批量删除合同
     * 
     * @param contractIds 需要删除的数据主键集合
     * @return 结果
     */
    public int deleteContractByContractIds(Long[] contractIds);
}