package com.steerinfo.ems.formula.service;

import com.steerinfo.framework.service.IBaseService;

import java.util.HashMap;
import java.util.List;
import java.util.Map;
import com.steerinfo.ems.formula.model.Formula;
import com.steerinfo.framework.service.pagehelper.PageList;

/**
 * Formula服务接口：
 * @author generator
 * @version 1.0-SNAPSHORT 2019-11-13 09:38
 * 类描述
 * 修订历史：
 * 日期：2019-11-13
 * 作者：generator
 * 参考：
 * 描述：Formula服务接口
 * @see null
 * @Copyright 湖南视拓信息技术股份有限公司. All rights reserved.
 */
public interface IFormulaService extends IBaseService<Formula, String>{

    /**
     * 根据公式code查找
     * @param code
     * @return
     */
    List<Formula> getByCode(String code);
    

	/**
	 * 根据计算公式读取数据,负值表示读取失败(-1:公式格式错误，-2:公式内容为空)
	 * 
	 * @param formula 公式内容
	 * @param timegranid 时间粒度
	 * @param clock 时间
	 * @param digits 精度
	 * @param type 数据字段 0 最终值 1 累计值 2 折标值
	 * @return
	 */
    Double getValByFormula(String formula,String timegranid,String clock,int digits, int type);

    /**
     * 根据项目ID读取数据,负值表示错误(通过公式计算，不累加；-1:公式格式错误，-2:公式内容为空)
     * 
     *
     * @param itemid 项目编号
     * @param timegranid 时间粒度
     * @param clock 时间 yyyy-MM-dd、yyyy-MM
     * @param type 数据字段 0 最终值 1 累计值 2 折标值
     * @return
     */
    Double getValByItemid(String itemid,String timegranid,String clock, int type);

    /**
     * 获取某时间版本的公式内容（如果该公式被禁用，则返回null）
     * @param itemid 项目id
     * @param clock 公式版本yyyyMM或者yyyy-MM、yyyy-MM-dd，自动匹配前6位或者7位
     * @return
     */
    String getFormula(String itemid,String clock);
    
    /**
     * 检查公式是否合法
     * @param formula 公式
     * 
     *
     * @return 空字符串表示合法,其他表示错误
     *
     */
    String checkFormula(Formula formula);
    
    /**
     * 检查公式是否合法(修改时间粒度)
     * 
     * @param formula
     * @param mintimegranid
     * @return
     */
    String checkFormulaMint(Formula formula, String mintimegranid);
    
    /**
     * 修改项目，根据项目Id、修改的时间获得所有被影响的项目(公式)，用于重新计算
     * @param ids 项目id
     * @param items 保存返回被影响项目ID
     * @param clock 时间 yyyy-MM或者yyyyMM
     * @param timegranid 时间粒度
     * 
     * @return
     */
    List<String> getAllItem(List<String> ids, List<String> items, String clock, String timegranid);
    
    /**
     * 获取公式与写入表名
     * 
     * @param itemid
     * @param clock 公式版本，例如2019-11
     * @return
     */
    Map<String, Object> getFormulaAndTbname(String itemid,String clock);
    
    /**
     * 重新计算修改项目itemid后其他项目的数据(公式关联)
     * 
     * @param itemid
     * @param clock 开始日期
     * @param timegranid 时间粒度
     * @param clockend 结束日期,为空则为最后一天,如clock为2020-01-03，clockend为空将计算为2020-01-31
     * @return
     */
    String reCalculate(String itemid, String clock, String timegranid, String clockend);
    
    /**
     * 重新计算单个项目数据，日粒度计算完，会重新计算对应的月、年数据
     * 
     * @param itemid 项目编号
     * @param clock 开始日期
     * @param timegranid 时间粒度
     * @param clockend 结束日期,为空则为最后一天,如clock为2020-01-03，clockend为空将计算为2020-01-31
     * @return
     */
    String reItemVal(String itemid, String clock, String timegranid, String clockend);
    
    /**
     * 根据code进行删除
     * @param code
     * @return
     */
    int deleteBycode(String code);
    
    /**
     * 解析公式成为文字描述
     * 
     * @param fm 
     * 	需要版本、公式内容、项目编号（code）、表名等信息
     * @return 公式文字描述
     *
     */
    String anaFormula(Formula fm);

    /**
     * 当公式code发生更改，替换对应的公式内容
     * @param params
     * @return
     */
    int replaceFormula(Map<String, Object> params);
    
    /**
	 * 获得计算公式中包含code的公式列表
	 * 
	 * @param code 公式code(项目itemid)
	 * @return
	 */
    List<Formula> getFormulaByCode(String code);
    
    /**
     * 解析项目数据成为数值描述
     * 
     *
     * @param itemid 项目编号
     * @param clock 时间：yyyy-MM-dd
     * @return
     */
    String anaItem(String itemid,String clock);

    /**
     * 检查复合公式顺序号是否合法（验证公式是否合法时调用，只验证自身顺序号大于子项）
     * 
     * @param formula 
     *
     * @param formula
     * 	公式（只能为复合公式，即[]+[]等,必须要有itemid、sourcecode、tablename、clock属性）
     * @return ""表示合法,其他表示错误
     *
     */
    String checkFormulaSeq(Formula formula);

    /**
     * 获取最新版本的公式
     * @param itemid 项目id
     * @return
     */
    Formula getFormulaLatest(String itemid);

    /**
     * 获取该公式名所关联的所有公式
     * @param  code 公式名
     * @return
     */
    List<Formula> getAssociatedFormula(String code);
    
    /**
     * 获取项目顺序号 -1表示公式错误，存在死循环
     * 
     * @param formula
     * 	（需要属性，公式内容、表名、项目编号code）
     * @return
     */
    Integer getFormulaSeq(Formula formula);

    /**
     * 根据所传的内容来修改公式或新增新版本公式
     * @param  formula
     * （需要属性:公式内容SOURCECODE、表名TABLENAME、项目编号CODE,是否启用ISAVAILABLE）
     * @return
     */
    Formula updateFormula(Formula model);
    
    /**
     * 重新计算修改项目itemid后其他项目的数据(指标)
     * 
     * @param itemid
     * @param clock
     * @param timegranid
     * @return
     */
    void reCalculateIndexVal(String itemid, String clock, String timegranid);
    
    /**
     * 保存编辑公式为唯一版本
     * 
     * @param  formula
     * （需要属性:公式内容SOURCECODE、表名TABLENAME、项目编号CODE,是否启用ISAVAILABLE）
     * @return
     */
    Formula saveOnly(Formula model);
    
    /**
	 * 根据code进行批量更新描述
	 * 
	 * @param params
	 * @return
	 */
    int updateDesBycode(Map<String, Object> params);
    
    /**
     * 查找项目的各个版本号
     * 
     * @param  code 项目编号
     * @return
     */
    List<String> getClockByCode(Map<String, Object> params);
    
    /**
	 * 根据项目编号、时间获取公式，clock之前最近的公式
	 * 
	 * @param params
	 * @return
	 */
    Formula getFormulaCodeClock(Map<String, Object> params);
    
    /**
     * 删除指定版本、code的公式
     * 
     * @param code
     * @param clock
     * @return
     */
    int deleteByCodeClock(String code, String clock);

    /**
     * 新增公式
     * @param model
     * @return
     */
	Formula addFormula(Formula model);
	
	/**
     * 获取计算公式数据组成
     *
     * @param itemid 项目编号
     * @param timegranid 时间粒度
     * @param clock 时间 yyyy-MM-dd、yyyy-MM
     * @return
     */
	String getAnaByVal(String itemid,String timegranid,String clock);
    /**
     *获取所有公式
     *
     * @param parmas
     * @param pageNum
     * @param pageSize
     * @return
     */
    PageList<Map<String, Object>> getDateForPage(HashMap<String, Object> parmas, Integer pageNum, Integer pageSize);
    
    /**
     * 根据项目ID读取数据,直接从数据库中读取，不计算
     * 
     *
     * @param itemid 项目编号
     * @param timegranid 时间粒度
     * @param clock 时间 yyyy-MM-dd、yyyy-MM
     * @param type 数据字段 0 最终值 1 累计值 2 折标值
     * @return
     */
    Double readValByItemid(String itemid,String timegranid,String clock, int type);

}