package com.ozs.rpm.mapper;

import java.util.List;

import com.ozs.rpm.dto.RpmRelReportUserDTO;
import com.ozs.rpm.dto.chart.ChartTypeDTO;
import org.apache.ibatis.annotations.Param;

import com.ozs.rpm.dto.ReportDTO;
import com.ozs.rpm.dto.ReportKPIDTO;
import com.ozs.rpm.dto.ReportSqlDTO;
import com.ozs.rpm.dto.RpmDimReportColorGroup;
import com.ozs.rpm.dto.RpmDimTypeAll;
import com.ozs.rpm.dto.RpmRelReportKpiUserDTO;
import com.ozs.rpm.dto.UserDTO;
import com.ozs.rpm.dto.save.RelReportKpiDrillDTO;
import com.ozs.rpm.dto.save.RelReportOutsideParamDTO;
import com.ozs.rpm.dto.save.ReportKpiDrillDown;
import com.ozs.rpm.dto.save.RpmInfoReportChartDTO;
import com.ozs.rpm.dto.save.SaveFiveDTO;
import com.ozs.rpm.dto.save.SaveFourDTO;
import com.ozs.rpm.dto.save.SaveOneDTO;
import com.ozs.rpm.dto.save.SaveReportDTO;
import com.ozs.rpm.dto.save.SaveRportKpiDTO;
import com.ozs.rpm.dto.save.SaveThreeDTO;
import com.ozs.rpm.dto.save.SaveTwoDTO;

public interface ReportMapper {

	List<RpmDimTypeAll> listReportType(@Param("typeId") Integer typeId);

	List<ReportDTO> listReport(@Param("reportName") String reportName, @Param("reportLevel") Integer reportLevel,
			@Param("ifFinish") Integer ifFinish);

	void removeReport(@Param("id") String id);

	void updateStatus(@Param("id") String id, @Param("status") Integer status);

	void saveOne(SaveOneDTO saveDto);

	// void saveTwo(SaveTwoDTO saveDto);

	// void saveThree(SaveThreeDTO saveDto);

	// void saveFour(SaveFourDTO saveDto);

	void saveFive(SaveFiveDTO saveDto);

	void saveReportKpi(@Param("list") List<SaveRportKpiDTO> kpis);

	void updateSaveTwo(SaveTwoDTO saveDto);

	ReportDTO getReportByName(@Param("reportName") String reportName);

	void updateReportKpi(@Param("list") List<SaveRportKpiDTO> queryKpis, @Param("reportId") String reportId);

	void updateSaveThree(SaveThreeDTO saveDto);

	ReportDTO getReportById(@Param("id") String id);

	void updateSaveFour(SaveFourDTO saveDto);

	void updateReportKpiFour(@Param("list") List<ReportKpiDrillDown> drillDowns, @Param("reportId") String reportId);

	/**
	 * 
	 * @param relatedKpis
	 */
	void updateReportKpiRelated(@Param("list") List<String> relatedKpis, @Param("reportId") String reportId);

	/**
	 * 修改kpi为分组展示字段
	 * 
	 * @param groupKpi
	 */
	void updateGroupKpiReportKpi(@Param("kpiId") String kpiId, @Param("reportId") String reportId);

	void updateSaveFive(SaveFiveDTO saveDto);

	void saveReportChart(@Param("list") List<RpmInfoReportChartDTO> barAndLineCharts);

	List<RpmDimReportColorGroup> listColorGroup();

	SaveReportDTO getSaveReportById(String reportId);

	void updateReportMenuReport(@Param("menuCode") String menuCode, @Param("reportId") String reportId);

	List<SaveRportKpiDTO> listSaveRportKpi(String reportId);

	List<RpmInfoReportChartDTO> listBarAndLineCharts(String reportId);

	/**
	 * 通过报表ID获取饼状图所用kpi
	 * 
	 * @param reportId
	 * @return
	 */
	List<String> listChartPieKpiId(String reportId);

	/**
	 * 获取已完成子报表
	 * 
	 * @return
	 */
	List<ReportDTO> listSonReport();

	/**
	 * 获取已完成子报表
	 * 
	 * @return
	 */
	List<ReportDTO> listParentReport(@Param("menuCode") String menuCode);

	/**
	 * 获取用户名
	 * 
	 * @return
	 */
	List<UserDTO> listUser();

	/**
	 * 获取已授权用户
	 * 
	 * @param reportId
	 * @return
	 */
	List<UserDTO> listRelUser(String reportId);

	void updateSaveSix(SaveReportDTO saveDto);

	void saveRpmRelReportUser(@Param("list") List<RpmRelReportUserDTO> list);

	/**
	 * 根据报表id删除与用户关系表
	 * 
	 * @param id
	 */
	void removeReportRelUserByReportId(@Param("reportId") String reportId);

	void updateMenuReportToNull(@Param("reportId") String reportId);

	void updateOne(SaveOneDTO saveDto);

	/**
	 * 删除不存在的kpi信息
	 * 
	 * @param kpiIds
	 * @param id
	 */
	void removeNotKpi(@Param("list") List<String> kpiIds, @Param("reportId") String reportId);

	void updateUpReportKpi(@Param("list") List<SaveRportKpiDTO> kpis);

	/**
	 * 清除第三步编辑kpi配置
	 * 
	 * @param reportId
	 */
	void cleanKpiConfigThree(@Param("reportId") String reportId);

	/**
	 * 清除第四步编辑kpi配置
	 * 
	 * @param reportId
	 */
	void cleanKpiConfigFour(@Param("reportId") String reportId);

	/**
	 * 清除第五步编辑kpi配置
	 * 
	 * @param reportId
	 */
	void cleanKpiConfigFive(@Param("reportId") String reportId);

	/**
	 * 删除报表配置
	 * 
	 * @param reportId
	 */
	void deleteReportChartByReportId(@Param("reportId") String reportId);

	/**
	 * 获取子报表下钻使用数量
	 * 
	 * @param reportId
	 * @return
	 */
	int countSubReportById(@Param("reportId") String reportId);

	/**
	 * 删除报表kpi信息
	 * 
	 * @param reportId
	 */
	void removeReportKpi(@Param("reportId") String reportId);

	/**
	 * 删除报表图标信息
	 * 
	 * @param reportId
	 */
	void removeReportChart(@Param("reportId") String reportId);

	/**
	 * 根据报表ID查询报表对应的KPI数组
	 * 
	 * @param reportId
	 * @return
	 */
	List<ReportKPIDTO> listReportKPI(@Param("reportId") String reportId) throws Exception;

	List<String> listReportIdByGroupSort(@Param("reportId") String reportId) throws Exception;

	List<RpmInfoReportChartDTO> getReportChartType(@Param("reportId") String reportId) throws Exception;

	int saveReportSql(@Param("list") List<ReportSqlDTO> list) throws Exception;

	int usedKPI(@Param("kpiId") String kpiId) throws Exception;

	ReportSqlDTO getReportSql(@Param("reportId") String reportId, @Param("chartType") Integer chartType)
			throws Exception;

	/**
	 * 删除没被选中的kpi
	 * 
	 * @param id
	 * @param kpis
	 */
	void deleteReportChartNotKpi(@Param("reportId") String reportId, @Param("list") List<SaveRportKpiDTO> kpis);

	/**
	 * 保存报表分类关联关系
	 * 
	 * @param menuCode
	 * @param id
	 */
	void saveRpmInfoReportMenu(@Param("menuCode") String menuCode, @Param("reportId") String reportId);

	/**
	 * 删除报表分类关联
	 * 
	 * @param id
	 */
	void removeRpmInfoReportMenuByReportId(@Param("id") String id);

	/**
	 * 获取菜单下报表列表
	 * 
	 * @return
	 */
	List<ReportDTO> listReportByMenu(@Param("menuCode") String menuCode);

	/**
	 * 根据报表ID查询kpi信息
	 * 
	 * @param reportId
	 * @return
	 */
	List<ReportKPIDTO> listKpiByReportId(@Param("reportId") String reportId);

	/**
	 * 获取报表已授权的kpi列表
	 * 
	 * @param reportId
	 * @return
	 */
	List<ReportKPIDTO> listKpiByReportAndUser(@Param("reportId") String reportId, @Param("userId") String userId);

	/**
	 * 获取报表已授权的kpi列表
	 * 
	 * @param reportId
	 * @return
	 */
	List<ReportKPIDTO> listKpiByReport(@Param("reportId") String reportId);

	/**
	 * 清空报表KPI授权用户关联，根据报表ID
	 * 
	 * @param reportId
	 */
	void removeReportKpiRelUserByReportId(@Param("reportId") String reportId);

	void saveRpmRelReportKpiUser(@Param("list") List<RpmRelReportKpiUserDTO> list);

	List<ReportKPIDTO> listKpiByReportIds(@Param("list") List<String> reportIds);

	SaveRportKpiDTO getRelReportKpi(@Param("reportId") String reportId, @Param("kpiId") String kpiId);

	SaveRportKpiDTO getRelReportKpiByKpiCode(@Param("reportId") String reportId, @Param("kpiCode") String kpiCode);
	// ----------------------------添加图表设置---------------------------------------

	/**
	 * 获取图表类型列表
	 * 
	 * @return
	 */
	List<ChartTypeDTO> listChartType();

	Integer saveRelReportOutsideParam(@Param("list") List<RelReportOutsideParamDTO> list);

	List<RelReportOutsideParamDTO> listRelReportOutsideParam(@Param("reportId") String reportId);

	Integer removeRelReportOutsideParam(@Param("reportId") String reportId);

	/**
	 * 获取汇总kpiId
	 * 
	 * @param reportId
	 * @return
	 */
	List<String> listTotalKpis(@Param("reportId") String reportId, @Param("ifTotal") Integer ifTotal);

	/**
	 * 获取汇总kpiCode
	 * 
	 * @param reportId
	 * @param ifTotal
	 * @return
	 */
	List<String> listTotalKpiCodes(@Param("reportId") String reportId, @Param("ifTotal") Integer ifTotal);

	Integer saveRelReportKpiDrill(@Param("list") List<RelReportKpiDrillDTO> list);

	List<RelReportKpiDrillDTO> listRelReportKpiDrill(@Param("reportId") String reportId);

	Integer removeRelReportKpiDrill(@Param("reportId") String reportId);

	/**
	 * 获取可操作聚合kpiId列表，根据报表ID
	 * 
	 * @param reportId
	 * @return
	 * @throws Exception
	 */
	List<String> listReportIdByOperableGroup(@Param("reportId") String reportId) throws Exception;

}
