推荐阅读:摘要:生产绩效指标管理主要功能是采集实时、准确、可靠的生产数据;提供数据计算,图形分析和报表输出的功能。系统的核心是搭建公司有效的指标管理体系,要解决的最大的技术问题如何最大限度地提高数据的处理效率,实现数据和指标计算的可扩展、可维护和可
摘要:生产绩效指标管理主要功能是采集实时、准确、可靠的生产数据;提供数据计算,图形分析和报表输出的功能。系统的核心是搭建公司有效的指标管理体系,要解决的最大的技术问题如何最大限度地提高数据的处理效率,实现数据和指标计算的可扩展、可维护和可验证。文中针对该问题,分析比较了基于Java程序计算和Oracle PL/SQL存储过程计算两种实施方案的优缺点,最终选择基于Oracle PL/SQL的技术方案,为生产绩效指标管理系统提供计算引擎。
关键词:PL/SQL 指标管理系统 设计 实现
指标管理作为一种定量和定性的管理手段在企业生产经营管理中的作用越来越被重视起来,一方面通过指标管理管理的开发整合了企业生产管理过程中的各类数据,为企业搭建起数据中心;另外,指标管理系统直接服务于企业的各类管理者,对于企业生产经营决策也具有重要的作用和意义。
指标管理系统的开发通过理对企业生产管理全范围的数据进行分析,梳理元数据和基础数据,开发面向部门、公司、集团等不同层面的指标分析场景和报表,通过这个过程搭建并完善公司的指标管理体系,并使这个体系进入实际有效的运转。
1 PL/SQL简介
SQL (Structure Query Language)是一种第四代语言(4GL),它是目前各类关系型数据库中最通用的数据库操作语言。PL/SQL是Oracle公司在标准SQL语言上进行的扩展,在普通SQL语句的使用上增加了编程语言的特点,所以PL/SQL就是把数据操作和查询语句组织在PL/SQL代码的过程性单元中,通过逻辑判断、循环等操作实现复杂的功能或者计算的程序语言。PL/SQL的使用,使SQL成为一种高级程序设计语言,支持高级语言的块操作,条件判断,循环语句,嵌套等,与数据库核心的数据类型集成,使SQL的程序设计效率更高。
2生产绩效指标管理系统
生产绩效指标管理系统是与某核电运营公司共同开发,项目内容包括指标管理与数据管理后台管理系统:实现指标和数据定义,数据采集和维护等功能;面向BI分析的数据仓库开发,以及面向分析的数据查询和BI场景分析门户三部分内容。项目一期开发的指标包括发电,安全及WANO指标。
3数据与指标计算设计
生产绩效指标管理系统后台管理部分实现数据和指标定义、数据采集、系统管理等功能。本系统提及的指标是指阈值指标,即通过相关数据给出指标的评价,红黄绿蓝(部分定义了四级阈值的指标存在蓝色阈值逻辑),即面向定性分析;数据包含基础数据和指标数据,例如发电量计划完成率的阈值计算逻辑:
红色阈值逻辑条件:年末预测发电计划完成率小于98%;
黄色阈值逻辑条件:年末预测发电任务完成率小于100%且年末预测发电任务完成率大于等于98%
绿色阈值逻辑条件:年度累计发电计划执行率大于100%且年末预测发电计划完成率大于等于100%;
指标的配置过程中,设计了参数表,上述发电量分析指标,包含了两个参数,
A:年末预测发电任务完成率
B:年度累计发电计划执行率
指标的阈值配置如下:
红色阈值逻辑条件:A < 98 ;
黄色阈值逻辑条件:A < 100 && A>=98 ;
绿色阈值逻辑条件:B > 100 && A >100 ;
指标数据,例如年度累计发电计划执行率,包含了两个参数:
A:年度累计发电量
B:年度累计计划发电量
计算公式配置为:A/B*100 。
3.1JAVA程序计算
基于JAVA程序的计算的一个重要的思路就是引用JEP,JEP是Java expression parser的简称,即java表达式分析器,Jep是一个用来转换和计算数学表达式的java库。通过这个程序包,用户可以以字符串的形式输入一个、任意的公式,然后快速地计算出结果。Jep支持用户自定义变量、常量和函数。包括许多常用的数学函数和常量,可以实现数值计算和逻辑计算。按照JEP的逻辑的实现原理,用户可以管理指标的计算公式,并实现可扩展、可维护以及可验证。指标数据和指标阈值的定义如前文所述,下面阐述其实现的原理和例子解析。
//引用jep-3.3.0-trial.jar
public class FunRGBCompute {
public static Object getValue(Map map, String fun){
try{
if(null == map)
return null;
if(map.size() < 1)
return null;
if(null == fun || "".equals(fun.trim()))
return null;
Jep jep = new Jep();
for (String key : map.keySet()) {
String value = map.get(key).trim();
double num = 0;
try{
num = Double.valueOf(value);
jep.addVariable(key, num);
}catch(Exception e){ try {
boolean isBoolean = Boolean.valueOf(value.trim().toLowerCase());
jep.addVariable(key, isBoolean);
} catch (JepException e1) {
}
}
}
jep.parse(fun);
Object result = jep.evaluate();
return result;
}catch(Exception e){
return null;
}
}
//样例测试
public static void main(String[] args){
Map map = new HashMap();
map.put("D10001", "100");
map.put("D10005", "400");
//测试1、逻辑表达式
Object result = FunRGBCompute.getValue(map, fun);
System.out.println(result);
//测试2、算术表达式
result = FunRGBCompute.getValue(map, fun);
System.out.println(result);
}
}
3.2基于PL/SQL存储过程计算
基于PL/SQL的计算,包括PL/SQL的存储过程、函数和定时任务处理。基本的实现逻辑是读取指标数据和指标阈值的设置,进行解析,计算出结果。这里涉及的采集数据存储表、参数定义表、阈值结果存储表、指标数据存储表同“(1) JAVA程序计算”,差异在于,基于PL/SQL存储过程计算,将计算公式的解析和计算过程交给了Oracle数据库段的PL/SQL 存储过程以及函数。
指标数值和指标阈值计算的逻辑实现如下:
Function Get_Value(itemCode VARCHAR2,
calculationFormula VARCHAR2,
valueDate date) Return NUMBER AS
n_value NUMBER;
v_string VARCHAR2(4000);
v_sql VARCHAR2(4000);
v_r VARCHAR2(1000);
cursor myCur is
select fm.fmla_item_co_pr, nvl(rt.data_value, 0) data_value
from PIMS_DATA_REF_DATA fm, PIMS_DATA_STORE rt
where fm.fmla_item_co_pr = rt.item_code_prefix(+)
and rt.data_date = valueDate
and fm.item_code_prefix = itemCode;
begin
if calculationFormula is null then
--如果公式为空,这指标数据默认为null
n_value := null;
else
v_string := '''' || calculationFormula || '''';
--循环公式指标,将指标替换成对应数据
for c in cur1 loop
v_string := 'replace(' || v_string || ',''[' || c.FMLA_ITEM_CO_PR ||
']'',''' || c.data_value || ''')';
end loop;
--将替换后的表达式字符串赋值
v_sql := 'select ' || v_string || ' from dual';
execute immediate v_sql into v_r;
commit;
--将字符串里的--替换成+,要不然会出错
v_r := replace(v_r,'--','+');
--这里最后判断一下最后的表达式里是否还存在没有替换的指标
if instr(v_r, '[') > 0 or instr(v_r, ']') > 0 then
n_value := 0;
else
--执行表达式
v_sql := 'select ' || v_r || ' from dual';
execute immediate v_sql into n_value;
commit;
end if;
end if;
--返回数据
return n_value;
--异常处理
exception
when Others then
--日志表中记录异常,供后续分析
return null;
END Get_Value;
数据库相关设计如下
PIMS_DATA_REF_DATA存储指标数据计算的参数设置信息,fmla_item_co_pr为参数的主键;item_code_prefix 为计算的指标数据的主键
PIMS_DATA_STORE存储采集的基础数据表,item_code_prefix为数据的ID,data_date为数据日期,data_value为数据值。
在项目实现上设计了一个指标数据计算的清单表,在该清单中维护了指标的计算顺序。通过编写一个Oracle Job来实现定期调用对应的计算公式,获取整个系统的计算周期的数值和阈值。
4实现效果及评价
采用JAVA程序计算和PL/SQL存储过程计算两种,都实现了指标数据和指标阈值计算的可扩展、可维护和易于验证性;解决了这一个系统上线之初的一个核心问题,但是随着数据量的增涨,两者存在较大的差异。
5结语
生产绩效指标系统设计的核心是数据计算的正确性和可验证性,这个是一个指标系统的生命线,基于此,首先实现了基于JAVA程序的公式编辑和解析指标计算,在项目初期也取得了较好的效果;但后续调整为基于PL/SQL的存储过程和函数的计算,极大提升的提升了计算的效率,也为开发人员的调试和整个系统的联调提供了便利,取得了很好的效果。