package com.dsk.cscec.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.dsk.common.core.domain.PageQuery;
import com.dsk.common.core.page.TableDataInfo;
import com.dsk.cscec.domain.CbProjectRecord;
import com.dsk.cscec.domain.bo.*;
import com.dsk.cscec.domain.vo.CbProjectCbStageNotDraftVo;
import com.dsk.cscec.domain.vo.CbProjectRecordSearchVo;

import java.util.List;

/**
 * 项目台账表(CbProjectRecord)表服务接口
 *
 * @author sxk
 * @since 2024-02-05 11:37:53
 */
public interface CbProjectRecordService extends IService<CbProjectRecord> {
    /**
     * 新增项目
     *
     * @param addCbProjectBo 新增对象
     * @return 新增结果
     */
    CbProjectRecord addProject(AddCbProjectBo addCbProjectBo);

    /**
     * 根据项目文件导入数据
     *
     * @param projectId 项目ID
     */
    void importData(Long projectId) throws Exception;

    /**
     * 获取项目台账列表
     *
     * @param searchBo  查询条件
     * @param pageQuery 分页对象
     * @return 分页数据
     */
    TableDataInfo<CbProjectRecordSearchVo> getProjectList(CbProjectSearchBo searchBo, PageQuery pageQuery);

    /**
     * 获取项目历史阶段信息(懒加载)
     *
     * @param searchBo 查询条件
     * @return 历史阶段信息
     */
    List<CbProjectRecord> getProjectHistoryInfo(CbProjectHistorySearchBo searchBo);

    /**
     * 修改项目信息
     *
     * @param editBo 修改对象
     * @return 修改结果
     */
    Integer editProjectInfo(EditProjectInfoBo editBo);

    /**
     * 获取新阶段项目可选成本阶段
     *
     * @param relatedId 关联ID
     * @return 可选成本阶段
     */
    List<Integer> getProjectAvailableCbStage(Long relatedId);

    /**
     * 新增新阶段项目
     *
     * @param newProjectBo 新增对象
     * @return 新增结果
     */
    CbProjectRecord addNewStageProject(AddNewCbProjectBo newProjectBo);

    /**
     * 查询当前项目非草稿的成本阶段
     *
     * @param relatedId 关联ID
     * @return 已有数据的成本阶段
     */
    List<CbProjectCbStageNotDraftVo> getProjectCbStageNotDraft(Long relatedId);

    /**
     * 批量删除项目
     *
     * @param projectIds 项目ID
     * @return 删除结果
     */
    Integer batchDeleteProject(List<Long> projectIds);

    /**
     * 获取草稿弹窗列表
     *
     * @param pageQuery 分页对象
     * @return 分页数据
     */
    TableDataInfo<CbProjectRecord> getDraftDialogList(PageQuery pageQuery);

    /**
     * 删除草稿
     *
     * @param projectId 项目ID
     * @return 删除结果
     */
    Integer deleteDraft(Long projectId);

    /**
     * 每2分钟刷新一次项目台账列表内"解析中"项目的状态
     */
    void updateCbProjectRecordParseStatus();
}
