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

import com.yhy.module.core.controller.admin.workbench.vo.progresspayment.ProgressDivisionTreeRespVO;
import com.yhy.module.core.controller.admin.workbench.vo.progresspayment.ProgressPaymentModeWithDivisionsRespVO;
import com.yhy.module.core.dal.dataobject.workbench.ProgressDivisionDO;
import java.math.BigDecimal;
import java.util.List;
import java.util.Map;

/**
 * 进度款-清单关联 Service 接口
 *
 * @author yhy
 */
public interface ProgressDivisionService {

    /**
     * 保存或更新期数值
     * 如果已存在则更新，不存在则创建
     *
     * @param progressPaymentModeId 进度款模式ID
     * @param boqDivisionId 清单节点ID
     * @param periodValue 期数值
     * @return 关联ID
     */
    Long saveOrUpdate(Long progressPaymentModeId, Long boqDivisionId, BigDecimal periodValue);

    /**
     * 批量保存或更新期数值
     *
     * @param progressPaymentModeId 进度款模式ID
     * @param periodValueMap key=清单节点ID, value=期数值
     */
    void batchSaveOrUpdate(Long progressPaymentModeId, Map<Long, BigDecimal> periodValueMap);

    /**
     * 根据进度款模式ID获取所有关联数据
     *
     * @param progressPaymentModeId 进度款模式ID
     * @return 关联列表
     */
    List<ProgressDivisionDO> getListByProgressPaymentModeId(Long progressPaymentModeId);

    /**
     * 根据进度款模式ID获取清单ID到期数值的映射
     *
     * @param progressPaymentModeId 进度款模式ID
     * @return Map<清单节点ID, 期数值>
     */
    Map<Long, BigDecimal> getPeriodValueMap(Long progressPaymentModeId);

    /**
     * 根据进度款模式ID删除所有关联
     *
     * @param progressPaymentModeId 进度款模式ID
     */
    void deleteByProgressPaymentModeId(Long progressPaymentModeId);

    /**
     * 根据清单节点ID删除所有关联
     *
     * @param boqDivisionId 清单节点ID
     */
    void deleteByBoqDivisionId(Long boqDivisionId);

    /**
     * 获取分部分项树（含定额单价计算，并绑定进度款期数信息）
     *
     * @param compileTreeId 编制模式树的单位工程节点ID
     * @param progressPaymentModeId 进度款模式ID
     * @return 树形结构（清单节点包含期数信息）
     */
    List<ProgressDivisionTreeRespVO> getTreeWithPeriodInfo(Long compileTreeId, Long progressPaymentModeId);

    /**
     * 获取项目下的进度款模式列表（含关联清单）
     *
     * @param projectId 项目ID
     * @return 进度款模式列表（每个模式包含关联的清单列表）
     */
    List<ProgressPaymentModeWithDivisionsRespVO> getProgressPaymentModeWithDivisionsList(Long projectId);
}
