package com.ozs.pm.service;


import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService;
import com.ozs.common.core.domain.AjaxResult;
import com.ozs.base.domain.vo.BaseExpertVo;
import com.ozs.pm.doman.PmDemand;
import com.ozs.pm.doman.vo.requestVo.*;
import com.ozs.pm.doman.vo.responseVo.PmDemandResVo;
import com.ozs.pm.doman.vo.responseVo.StatisticalChartsResVo;
import com.ozs.system.domain.SysFileRef;

import java.util.List;
import java.util.Map;


/**
 * 采购需求Service接口
 *
 * @author ruoyi
 * @date 2023-01-16
 */
public interface IPmDemandService extends IService<PmDemand> {
    /**
     * 查询采购需求
     *
     * @param demandId 采购需求主键
     * @return 采购需求
     */
    PmDemandResVo selectPmDemandByDemandId(Long demandId, String detailType);

    /**
     * 查询采购需求列表
     *
     * @param pmDemandReqVo 采购需求
     * @return 采购需求集合
     */
    IPage<PmDemandResVo> selectPmDemandList(PmDemandReqVo pmDemandReqVo, int reqType);


    /**
     * 需求建档
     *
     * @param pmBookBuildingReqVo 需求建档
     * @return 结果
     */
    boolean bookBuilding(PmBookBuildingReqVo pmBookBuildingReqVo) throws Exception;


    /**
     * 提交采购需求
     *
     * @param pmDemandReqVo
     * @return 结果
     */
    boolean commit(PmDemandReqVo pmDemandReqVo);

    /**
     * 查看流程图
     *
     * @param demandId 采购需求主键
     * @return 采购需求
     */
    Object viewFlowChart(Long demandId);

    /**
     * 审核采购需求通过
     *
     * @param pmDemandReqVo
     * @return 结果
     */
    boolean reviewTo(PmDemandReqVo pmDemandReqVo);

    /**
     * 审核采购需求退回
     *
     * @param pmDemandReqVo
     * @return 结果
     */
    boolean reviewReturn(PmDemandReqVo pmDemandReqVo);

    /**
     * 下达任务
     *
     * @param pmDemandReqVo
     * @return 结果
     */
    boolean releaseTask(PmDemandReqVo pmDemandReqVo);

    boolean uploadFile(Long redId, Integer fileType, List<SysFileRef> sysFileRefs, String upateBy, boolean delOld);

    boolean uploadFile(Long redId, Integer fileType, List<SysFileRef> sysFileRefs, String upateBy);

    boolean insertPmReleaseAnnouncement(PmReleaseAnnouncementReqVo pmReleaseAnnouncementReqVo) throws Exception;

    boolean insertExpertBatch(PmBaseExpertFillReqVo pmBaseExpertFillReqVo) throws Exception;

    boolean extractExpertBatch(PmBaseExpertExtractReqVo pmBaseExpertExtractReqVo) throws Exception;

    boolean insertBidOpeningBatch(PmBidOpeningFillReqVo pmBidOpeningFillReqVo) throws Exception;

    boolean insertPmBidWinning(PmBidWinningReqVo pmBidWinningReqVo) throws Exception;

    boolean updatePmBidWinning(PmBidWinningReqVo pmBidWinningReqVo) throws Exception;

    boolean insertPmBidFailure(PmBidFailureReqVo pmBidFailureReqVo) throws Exception;

    boolean insertContractInfo(PmContractInfoReqVo pmContractInfoReqVo) throws Exception;

    boolean insertProjectConstruction(PmProjectConstructionReqVo pmProjectConstructionReqVo) throws Exception;

    /**
     * 更新需求预警状态
     *
     * @param demnadId
     * @return
     */
    void updateDemandWarnStatus(Long demnadId);

    /**
     * 通过需求ID列表 查询采购执行列表 sunhh
     *
     * @param demandIdList
     * @return
     */
    List<PmDemand> selectByDemandIdList(List<Integer> demandIdList);

    /**
     * 专家库--查询抽取专家列表 非必传条件：专家名称，开始结束时间 sunhh
     *
     * @param baseExpertVo
     * @return
     */
    List<PmDemand> selectExtractionExpert(BaseExpertVo baseExpertVo);

    /**
     * 查询需求单位首页待办事项（需求待提交）
     *
     * @return
     */
    List<PmDemandResVo> demandWaitCommit();

    /**
     * 查询需求单位首页待办事项（合同待填制）
     *
     * @return
     */
    List<PmDemandResVo> contractWaitFilled();

    /**
     * 查询需求单位首页待办事项（项目建设待完成）
     *
     * @return
     */
    List<PmDemandResVo> projectWaitFinish();

    /**
     * 采购管理部门首页待办事项（需求待审核）
     *
     * @return
     */
    List<PmDemandResVo> demandWaitExamine();

    /**
     * 采购管理部门首页待办事项（任务待下达）
     *
     * @return
     */
    List<PmDemandResVo> taskWaitRelease();

    List<PmDemandResVo> purchaseDemandDocking();

    List<PmDemandResVo> expertFeedback();

    List<PmDemandResVo> procurementDocumentsReview();

    List<PmDemandResVo> procurementAnnouncement();

    List<PmDemandResVo> preBidQuery();

    List<PmDemandResVo> waitOpenBid();

    List<PmDemandResVo> bidResultAnnouncement();

    List<PmDemandResVo> wasteBidHandle();

    List<PmDemandResVo> postBidQuery();


    /**
     * 采购管理部门首页待办事项（全部）
     *
     * @return
     */
    AjaxResult procurementOfficeWillManipulateTotal();

    /**
     * 统计分析-采购项目信息统计
     *
     * @param pmDemandReqVo
     * @return
     */
    Map<String, Integer> purchaseProjectStatistical(PmDemandReqVo pmDemandReqVo);

    /**
     * 统计分析-按照项目属性统计所有的项目
     *
     * @param
     * @return
     */
    List<StatisticalChartsResVo> countByProjectAttr(PmDemandReqVo pmDemandReqVo);

    /**
     * 统计分析-按照采购方式统计所有的项目
     *
     * @param
     * @return
     */
    List<StatisticalChartsResVo> countByPurchaseMode(PmDemandReqVo pmDemandReqVo);

    /**
     * 统计分析-按照概算金额统计所有的项目
     *
     * @param
     * @return
     */
    List<StatisticalChartsResVo> countByEvaluation(PmDemandReqVo pmDemandReqVo);

    /**
     * 执行滞后采购项目情况
     *
     * @return
     */
    AjaxResult countProjectExceed(PmDemandReqVo pmDemandReqVo);

    /**
     * 统计不同时间维度的逾期项目
     *
     * @return
     */
    AjaxResult exceedAnalysis(PmDemandReqVo pmDemandReqVo);

    /**
     * 滞后项目时长分析
     *
     * @return
     */
    AjaxResult exceedMarketAnalysis(PmDemandReqVo pmDemandReqVo);

    /**
     * 重大规划采购任务专项计划管理情况
     *
     * @return
     */
    AjaxResult countMajorProject(PmDemandReqVo pmDemandReqVo);

    /**
     * 重大规划采购任务专项计划管理情况（采购办）
     *
     * @return
     */
    AjaxResult countMajorProjectCGB(PmDemandReqVo pmDemandReqVo);

    /**
     * 任务数量趋势分析
     *
     * @return
     */
    AjaxResult taskQuantityAnalysis(PmDemandReqVo pmDemandReqVo);

    /**
     * 各阶段采购任务数量分布
     *
     * @return
     */
    AjaxResult countEveryStatusNum(PmDemandReqVo pmDemandReqVo);

    /**
     * 通过计划ID查询项目
     *
     * @param planId
     * @return
     */
    PmDemand selectByPlanId(Long planId);

    /**
     * 项目执行进度统计
     *
     * @param pmDemandReqVo
     * @return
     */
    List<StatisticalChartsResVo> purchaseProjectExecute(PmDemandReqVo pmDemandReqVo);

    /**
     * 已完成项目数量统计
     *
     * @param pmDemandReqVo
     * @return
     */
    List<Map<String, Integer>> purchaseProjectCompleteNumber(PmDemandReqVo pmDemandReqVo);

    /**
     * 已完成采购任务数量统计
     *
     * @param pmDemandReqVo
     * @return
     */
    List<Map<String, Integer>> purchaseTaskFinish(PmDemandReqVo pmDemandReqVo);

    /**
     * 各阶段项目数量分布
     *
     * @param pmDemandReqVo
     * @return
     */
    List<Map<String, String>> purchaseProjectDistribution(PmDemandReqVo pmDemandReqVo);

    /**
     * 项目数量分析
     *
     * @param pmDemandReqVo
     * @return
     */
    List<Map<String, String>> purchaseProjectNumberAnalysis(PmDemandReqVo pmDemandReqVo);

    /**
     * 需求提报情况
     *
     * @param pmDemandReqVo
     * @return
     */
    List<StatisticalChartsResVo> demandSubCount(PmDemandReqVo pmDemandReqVo);

    /**
     * 项目类型情况统计
     *
     * @param pmDemandReqVo
     * @return
     */
    List<StatisticalChartsResVo> countByProjectType(PmDemandReqVo pmDemandReqVo);

    /**
     * 需采转化情况统计
     *
     * @param pmDemandReqVo
     * @return
     */
    List<StatisticalChartsResVo> countByPurchaseChange(PmDemandReqVo pmDemandReqVo);

    /**
     * 滞后主要直接原因
     *
     * @param pmDemandReqVo
     * @return
     */
    AjaxResult exceedReason(PmDemandReqVo pmDemandReqVo);

    /**
     * 滞后直接原因
     *
     * @param pmDemandReqVo
     * @return
     */
    AjaxResult exceedReasonZj(PmDemandReqVo pmDemandReqVo);

    /**
     * 所属采购服务站数量
     *
     * @param pmDemandReqVo
     * @return
     */
    AjaxResult countPurTask(PmDemandReqVo pmDemandReqVo);

    /**
     * 新增执行滞后采购任务数量分析
     *
     * @param pmDemandReqVo
     * @return
     */
    AjaxResult countMajorProjectNumCGB(PmDemandReqVo pmDemandReqVo);

    /**
     * 滞留环节
     *
     * @param pmDemandReqVo
     * @return
     */
    AjaxResult exceedLink(PmDemandReqVo pmDemandReqVo);
}
