package com.ruoyi.credit.mapper;

import java.util.List;

import org.apache.ibatis.annotations.Param;

import com.ruoyi.credit.domain.ServiceContract;

/**
 * 服务合同Mapper接口
 * 
 * @author ruoyi
 * @date 2025-01-20
 */
public interface ServiceContractMapper 
{
    /**
     * 查询服务合同
     * 
     * @param contractId 服务合同主键
     * @return 服务合同
     */
    public ServiceContract selectServiceContractByContractId(Long contractId);

    /**
     * 根据合同编号查询服务合同
     * 
     * @param contractNumber 合同编号
     * @return 服务合同
     */
    public ServiceContract selectServiceContractByContractNumber(String contractNumber);

    /**
     * 查询服务合同列表
     * 
     * @param serviceContract 服务合同
     * @return 服务合同集合
     */
    public List<ServiceContract> selectServiceContractList(ServiceContract serviceContract);

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

    /**
     * 根据合同来源查询服务合同列表
     * 
     * @param contractSource 合同来源
     * @return 服务合同集合
     */
    public List<ServiceContract> selectServiceContractListBySource(@Param("contractSource") String contractSource);

    /**
     * 根据安保公司名称查询服务合同列表
     * 
     * @param securityCompany 安保公司名称
     * @return 服务合同集合
     */
    public List<ServiceContract> selectServiceContractListBySecurityCompany(@Param("securityCompany") String securityCompany);

    /**
     * 根据甲方单位名称查询服务合同列表
     * 
     * @param clientCompany 甲方单位名称
     * @return 服务合同集合
     */
    public List<ServiceContract> selectServiceContractListByClientCompany(@Param("clientCompany") String clientCompany);

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

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

    /**
     * 新增服务合同
     * 
     * @param serviceContract 服务合同
     * @return 结果
     */
    public int insertServiceContract(ServiceContract serviceContract);

    /**
     * 使用指定 contract_id 新增服务合同（用于从 dc_contract 复制数据）
     * 
     * @param serviceContract 服务合同（包含指定的 contractId）
     * @return 结果
     */
    public int insertServiceContractWithId(ServiceContract serviceContract);

    /**
     * 修改服务合同
     * 
     * @param serviceContract 服务合同
     * @return 结果
     */
    public int updateServiceContract(ServiceContract serviceContract);

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

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

    /**
     * 关联线下合同文件
     * 
     * @param contractId 合同ID
     * @param attachmentId 附件ID
     * @param extractedInfo 提取信息
     * @return 结果
     */
    public int linkOfflineContract(@Param("contractId") Long contractId, 
                                  @Param("attachmentId") Long attachmentId, 
                                  @Param("extractedInfo") String extractedInfo);

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

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

    /**
     * 查询已确认状态的服务合同
     * 
     * @return 已确认的服务合同集合
     */
    public List<ServiceContract> selectConfirmedContracts();

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

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

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

    /**
     * 查询有数据问题的合同
     * 
     * @return 有数据问题的合同集合
     */
    public List<ServiceContract> selectContractsWithDataIssues();
}