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

import com.yhy.module.core.controller.admin.workbench.vo.WbBoqResourceCategorySummaryVO;
import com.yhy.module.core.controller.admin.workbench.vo.WbBoqResourceRespVO;
import com.yhy.module.core.controller.admin.workbench.vo.WbBoqResourceSaveReqVO;
import java.util.List;
import javax.validation.Valid;

/**
 * 工作台工料机消耗 Service 接口
 *
 * @author yhy
 */
public interface WbBoqResourceService {

    /**
     * 创建工料机消耗
     *
     * @param createReqVO 创建信息
     * @return ID
     */
    Long create(@Valid WbBoqResourceSaveReqVO createReqVO);

    /**
     * 更新工料机消耗
     * 当编制价/价格来源变更时，会批量同步项目内同编码+名称+规格+单位的工料机
     *
     * @param updateReqVO 更新信息
     * @return 批量更新结果（受影响的单位工程和行数），无批量同步时返回null
     */
    com.yhy.module.core.controller.admin.workbench.vo.WbBoqResourceBatchUpdateResultVO update(@Valid WbBoqResourceSaveReqVO updateReqVO);

    /**
     * 删除工料机消耗
     *
     * @param id ID
     */
    void delete(Long id);

    /**
     * 获取工料机消耗详情
     *
     * @param id ID
     * @return 详情
     */
    WbBoqResourceRespVO get(Long id);

    /**
     * 获取定额节点下的工料机列表
     *
     * @param divisionId 定额节点ID
     * @return 工料机列表
     */
    List<WbBoqResourceRespVO> getListByDivisionId(Long divisionId);

    /**
     * 根据定额节点ID删除所有工料机
     *
     * @param divisionId 定额节点ID
     */
    void deleteByDivisionId(Long divisionId);

    /**
     * 从后台定额工料机复制数据到工作台（快照模式）
     *
     * @param divisionId 定额节点ID
     * @param quotaItemId 后台定额基价ID
     */
    void copyFromQuotaResource(Long divisionId, Long quotaItemId);

    /**
     * 获取清单节点下所有定额的工料机汇总
     *
     * @param boqDivisionId 清单节点ID
     * @return 工料机汇总列表
     */
    List<WbBoqResourceRespVO> getListByBoqDivisionId(Long boqDivisionId);

    /**
     * 获取定额节点下工料机的分类汇总（按类别汇总四个合价）
     *
     * @param divisionId 定额节点ID
     * @return 分类汇总列表
     */
    List<WbBoqResourceCategorySummaryVO> getCategorySummary(Long divisionId);

    /**
     * 根据多个定额节点ID获取工料机列表
     *
     * @param divisionIds 定额节点ID列表
     * @return 工料机列表
     */
    List<WbBoqResourceRespVO> getResourcesByDivisionIds(List<Long> divisionIds);

    /**
     * 编码弹窗查询工料机（本项目+非项目）
     *
     * @param divisionId 定额节点ID
     * @param code 编码（模糊查询）
     * @return 查询结果列表
     */
    List<com.yhy.module.core.controller.admin.workbench.vo.WbResourceSearchRespVO> searchByCode(Long divisionId, String code);

    /**
     * 创建空白工料机行
     *
     * @param createBlankReqVO 创建请求
     * @return 新行ID
     */
    Long createBlank(com.yhy.module.core.controller.admin.workbench.vo.WbBoqResourceCreateBlankReqVO createBlankReqVO);

    /**
     * 双击填充工料机数据到空白行
     *
     * @param fillReqVO 填充请求
     */
    void fillFromSearch(com.yhy.module.core.controller.admin.workbench.vo.WbBoqResourceFillReqVO fillReqVO);
}
