package com.yhy.module.core.service.quota;

import com.yhy.module.core.controller.admin.quota.vo.QuotaUnifiedFeeResourceSaveReqVO;
import com.yhy.module.core.dal.dataobject.quota.QuotaUnifiedFeeResourceDO;
import java.util.List;
import javax.validation.Valid;

/**
 * 统一取费子目工料机 Service 接口
 */
public interface QuotaUnifiedFeeResourceService {

    /**
     * 创建子目工料机
     */
    Long createUnifiedFeeResource(@Valid QuotaUnifiedFeeResourceSaveReqVO createReqVO);

    /**
     * 更新子目工料机
     */
    void updateUnifiedFeeResource(@Valid QuotaUnifiedFeeResourceSaveReqVO updateReqVO);

    /**
     * 删除子目工料机
     */
    void deleteUnifiedFeeResource(Long id);

    /**
     * 获取子目工料机详情
     */
    QuotaUnifiedFeeResourceDO getUnifiedFeeResource(Long id);

    /**
     * 获取子目工料机列表（包含工料机详细信息）
     */
    List<com.yhy.module.core.controller.admin.quota.vo.QuotaUnifiedFeeResourceRespVO> getUnifiedFeeResourceList(Long unifiedFeeSettingId);

    /**
     * 批量创建子目工料机
     */
    void batchCreateUnifiedFeeResource(List<QuotaUnifiedFeeResourceSaveReqVO> createReqVOList);

    /**
     * 根据子定额ID删除所有子目工料机
     */
    void deleteByUnifiedFeeSettingId(Long unifiedFeeSettingId);

    /**
     * 交换排序
     */
    void swapSort(Long nodeId1, Long nodeId2);

    /**
     * 验证子目工料机是否存在
     */
    void validateUnifiedFeeResourceExists(Long id);

    /**
     * 根据编码精确查询可用工料机
     *
     * @param unifiedFeeSettingId 统一取费设置ID
     * @param code 工料机编码
     * @return 工料机信息，如果未找到返回null
     */
    com.yhy.module.core.controller.admin.resource.vo.ResourceItemRespVO getResourceItemByCode(Long unifiedFeeSettingId, String code);

    /**
     * 验证工料机是否在统一取费设置的数据范围内
     *
     * @param unifiedFeeSettingId 统一取费设置ID
     * @param resourceItemId 工料机ID
     * @throws cn.iocoder.yudao.framework.common.exception.ServiceException 如果不在范围内
     */
    void validateResourceInScope(Long unifiedFeeSettingId, Long resourceItemId);

    /**
     * 获取可选的工料机列表（已过滤范围，支持模糊查询）
     * 
     * 只返回统一取费设置绑定的工料机专业下的工料机数据
     *
     * @param unifiedFeeSettingId 统一取费设置ID
     * @param code 编码（模糊查询，可选）
     * @param name 名称（模糊查询，可选）
     * @param spec 型号规格（模糊查询，可选）
     * @return 可选的工料机列表
     */
    java.util.List<com.yhy.module.core.controller.admin.resource.vo.ResourceItemRespVO> getAvailableResourceItemsWithFilter(
        Long unifiedFeeSettingId, String code, String name, String spec);
}
