CREATE OR REPLACE PACKAGE PACK_KPI_KERNEL
IS
2 --定义多级数组 字符串
3 TYPE TSTRARRY
IS TABLE OF VARCHAR2(
4000)
INDEX BY BINARY_INTEGER;
4
5 TYPE TSTRARRYARRY
IS TABLE OF TSTRARRY
INDEX BY BINARY_INTEGER;
6
7 TYPE TSTRARRYARRYARRY
IS TABLE OF TSTRARRYARRY
INDEX BY BINARY_INTEGER;
8
9 -- Author : D
10 -- Created : 2011
11 -- Purpose : KPI模块 绩效考核核心算法包
12
13 --核心 调用接口 as_KEY是关键值 as_flag 是调用标记
14 PROCEDURE KERNEL_MASTER_CONTROL;
15
16 --自动获取绩效考核月份参数 默认为 本月上月的月份
17 FUNCTION GET_KPI_DATE
RETURN VARCHAR2;
18
19 --核心 调用接口 as_KEY是关键值 as_flag 是调用标记
20 PROCEDURE KT_MAIN_MASTER_CONTROL(as_KEY
IN VARCHAR2, as_flag
IN VARCHAR2);
21
22 --计算 量化指标 单项得分 体系ID BODATA
23 FUNCTION GET_ONETARGET_SCORE(as_TARSYS_id
IN VARCHAR2, as_bodata
NUMBER)
24 RETURN NUMBER;
25
26 --计算 量化指标 单项有自变量 得分 体系ID BODATA
27 FUNCTION GET_ONETARGET_SCORE_VAR(as_TARSYS_id
IN VARCHAR2,
28 as_bodata
NUMBER)
RETURN NUMBER;
29
30 --计算量化月奖 每日
31 PROCEDURE GET_BORESULT_LH_AWORD_TODAY;
32
33 --建立System_P_ID二维数组
34 FUNCTION Get_KPI_System_P_ID(as_target_id
IN VARCHAR2)
RETURN TSTRARRY;
35
36 --建立SystemID二维数组
37 FUNCTION Get_KPI_SystemID(as_target_id
IN VARCHAR2)
RETURN TSTRARRYARRY;
38
39 --计算量化月奖
40 FUNCTION GetComAword(as_KPI_SCORE
IN number, as_CATALOG_ID
IN VARCHAR2)
41 RETURN NUMBER;
42
43 --计算总月奖
44 FUNCTION Get_all_Aword(as_LH_SCORE
IN number, as_GL_SCORE
IN NUMBER)
45 RETURN NUMBER;
46
47 --获取指标的bodata2
48 FUNCTION Get_bodata2_kpi_flu_record(as_target_id
IN VARCHAR2,
49 as_month
IN VARCHAR2)
RETURN NUMBER;
50
51 --部门得分修正
52 FUNCTION Get_K_DEP_DATA(as_dep_id
IN VARCHAR2, as_month
IN VARCHAR2)
53 RETURN NUMBER;
54
55 --指标单项得分修正
56 FUNCTION get_lh_score_fix(LH_score
IN NUMBER,
57 dep_id
IN NUMBER,
58 as_month
IN VARCHAR2)
RETURN NUMBER;
59
60 --取得资金计划准确率
61 FUNCTION get_zjjhzql(as_dep_id
IN VARCHAR2, as_month
IN VARCHAR2)
62 RETURN NUMBER;
63
64 --定时取指标元素 主程序 小元素合成算法
65 --=-=-==-=-=-=-=-------------------------------
66 PROCEDURE BOELEMENT_MASTER_CONTROL(as_date
IN VARCHAR2);
67
68 --取值
69 --=-=-==-=-=-=-=-------------------------------
70 FUNCTION GET_BOELEMENT(as_ele_id
IN VARCHAR2, as_date
IN VARCHAR2)
71 RETURN NUMBER;
72
73 --取值
74 --=-=-==-=-=-=-=-------------------------------
75 FUNCTION kpi_splitelementex(P_STRING
IN VARCHAR2, as_date
IN VARCHAR2)
76 return NUMBER;
77 --取值
78 --=-=-==-=-=-=-=-------------------------------
79 FUNCTION kpi_splitelementgetrs(as_V_POS
IN VARCHAR2, as_date
IN VARCHAR2)
80 return VARCHAR2;
81
82 --根据指标公式,得出指标的实际值和计划值
83 --=-=-==-=-=-=-=-------------------------------
84 PROCEDURE KERNEL_TARGET_DATA_MAIN(AS_MONTH
IN VARCHAR2);
85
86 procedure KPI_VIEW_TARGET;
--集团指标取数
87
88 /*procedure Insert_JHZ_ToJHFluTable(as_date IN VARCHAR2);
89 procedure InsertOne_JHZ_ToJHFluTable(as_TARGET_ID in varchar2,
90 as_VALUE_PLAN in varchar2,
91 as_VALUE_DATA in varchar2,
92 as_REC_REASON in varchar2,
93 as_REC_MONTH in varchar2);
94
95 procedure kpi_BackToELeResultTable(as_date in varchar2);
96 */
97
98 --计算量化月奖
99 FUNCTION Get_OneTarget_Score_NEW(as_TARSYS_id
IN VARCHAR2,
100 as_bodata
NUMBER)
RETURN NUMBER;
101 PROCEDURE KERNEL_TARGET_ALL_XS(AS_YEAR
IN VARCHAR2);
102 procedure KPI_LR_SJ_PM(as_month
varchar2);
103 procedure KPI_LR_YSZQL_PM(as_month
varchar2);
104 END PACK_KPI_KERNEL;
105 /
106 CREATE OR REPLACE PACKAGE BODY PACK_KPI_KERNEL
IS
107 type My_Cursor
is ref
cursor;
108
109 ARRY1 TSTRARRY;
110 ARRY2 TSTRARRYARRY;
111 ARRY3 TSTRARRYARRYARRY;
112
113 --====================================================================
114 --主控制,控制元素合成和指标计算,缺BO部分
115 PROCEDURE KERNEL_MASTER_CONTROL
AS
116 ls_YF
VARCHAR2(
10);
117 ln_RESULT
NUMBER;
118
119 BEGIN
120
121 DBMS_OUTPUT.ENABLE(
10000000);
122 --DBMS_OUTPUT.ENABLE( buffer_size =>Null );
123
124 BEGIN
125 /* insert into kpi_test2 values(to_char(sysdate,‘yyyy-mm-dd hh:mi:ss‘));
126 commit;*/
127
128 ls_YF :
= GET_KPI_DATE();
129
130 --取计划值
131 PACK_KPI_JHZ.KPI_GET_JHZ_BYDAY(
‘‘);
132
133 DBMS_OUTPUT.put_line(
‘检查点1-1‘);
134 --小元素取值,小元素合成大元素,kpi_manager_boelement ---> kpi_manager_boelement_result
135 BOELEMENT_MASTER_CONTROL(ls_YF);
136 DBMS_OUTPUT.put_line(
‘检查点1-2‘);
137 --根据指标公式,计算指标计划值和实际值
138
139 KERNEL_TARGET_DATA_MAIN(ls_YF);
140 DBMS_OUTPUT.put_line(
‘检查点1-3‘);
141 --指标计划值,实际值取值,计算指标得分,kpi_manager_boresult ---> kpi_manager_boresult_report
142 KT_MAIN_MASTER_CONTROL(ls_YF,
‘0‘);
143 DBMS_OUTPUT.put_line(
‘检查点1-4‘);
144 --第二次计算
145 BOELEMENT_MASTER_CONTROL(ls_YF);
146 DBMS_OUTPUT.put_line(
‘检查点2-1‘);
147 KERNEL_TARGET_DATA_MAIN(ls_YF);
148
149 DBMS_OUTPUT.put_line(
‘检查点2-2‘);
150 KT_MAIN_MASTER_CONTROL(ls_YF,
‘0‘);
151
152 DBMS_OUTPUT.put_line(
‘检查点2-3‘);
153 --运行日志
154 pack_kpi_base.SET_SYSTEM_LOG(
‘核心任务成功!‘,
‘被计算月份‘ || ls_YF);
155
156 /* if to_number(to_char(SYSDATE, ‘dd‘))=15 then
157 Insert_JHZ_ToJHFluTable(ls_YF);
158 end if;*/
159
160 DBMS_OUTPUT.disable();
161 EXCEPTION
162 WHEN OTHERS
THEN
163 --运行日志
164 pack_kpi_base.SET_SYSTEM_LOG(
‘核心任务失败!‘,
165 ‘被计算月份‘ || ls_YF
|| Sqlerrm(Sqlcode));
166 END;
167
168 END KERNEL_MASTER_CONTROL;
169
170 --====================================================================
171
172 --====================================================================
173 --自动获取绩效考核月份参数 默认为 本月上月的月份
174 FUNCTION GET_KPI_DATE
RETURN VARCHAR2 AS
175
176 ls_kpi_date
VARCHAR2(
10);
177 day number;
178
179 BEGIN
180 day :
= to_number(to_char(SYSDATE,
‘dd‘));
181
182 if day < 20 then
183 ls_kpi_date :
= to_char(pack_kpi_base.F_GET_SYM(to_char(SYSDATE,
184 ‘yyyymm‘)),
185 ‘yyyy-mm‘);
186
187 -- ls_kpi_date := ‘2012-12‘;
188 else
189 ls_kpi_date :
= to_char(SYSDATE,
‘yyyy-mm‘);
190 --ls_kpi_date := ‘2012-01‘;
191 end if;
192
193 RETURN ls_kpi_date;
194
195 END GET_KPI_DATE;
196
197 --====================================================================
198
199 --=================================================================================
200 --====================================================================
201
202 --核心 调用接口 as_KEY是关键值 as_flag 是调用标记 0 是自动指标计算 1 是用户自定义计算
203 PROCEDURE KT_MAIN_MASTER_CONTROL(as_KEY
IN VARCHAR2, as_flag
IN VARCHAR2)
IS
204
205 ls_key
VARCHAR2(
4000);
206 ls_flag
VARCHAR2(
10);
207
208 --游标取值
209 Cursor Cur_BO
Is
210 SELECT t1.id,
--主键
211 t1.t_id,
212 t1.target_id,
213 t1.target_code,
214 t1.target_name,
215 t1.tarsys_id,
216 t1.standardvalue,
--标准值
217 t1.RATIO,
--预测值
218 --2011-10-08 修改四舍五入
219 round(t1.BODATA,
4) BODATA,
--指标分值 当月累计数
220 t1.bodata2,
221 t1.bodate
222 From kpi_manager_boresult_temp t1
223 -- where t1.target_id=38568
224 ;
225
226 --
227 ln_ID
NUMBER;
228 ls_T_ID
VARCHAR2(
4000);
229 ls_TARGET_ID
VARCHAR2(
4000);
230 ls_TARGET_CODE
VARCHAR2(
4000);
231 ls_TARGET_NAME
VARCHAR2(
4000);
232 ls_tarsys_id
VARCHAR2(
4000);
233 ls_STANDARDVALUE
VARCHAR2(
4000);
234 ls_RATIO
VARCHAR2(
4000);
235 ls_BODATA
NUMBER;
--实际值
236 ls_BODATA2
NUMBER;
237 ls_BODATE
VARCHAR2(
4000);
238
239 ls_realvalue
number;
--实际值=ls_BODATA
240 --
241 ln_i
NUMBER;
242 ln_industry90001
NUMBER;
243 ln_industry90002
NUMBER;
244 ln_ALL_BEST
NUMBER;
245 ln_HISTORY_BEST
NUMBER;
246
247 --分数计算部分变量
248 ln_industry
NUMBER;
249 resScore
NUMBER;
250 resScoreYSZQL
NUMBER;
251 --ln_score NUMBER;
252 Ln_TARSYS_TYPE
NUMBER;
253 ln_TARSYS_SCORE_TYPE
NUMBER;
--体系得分算法体系,重要用于判断分支
254
255 ln_K_DEP_DATA
NUMBER;
--部门指标修正系数
256 ln_CXD_SCORE
NUMBER;
--创新度得分
257 ln_WDD_SCORE
NUMBER;
--稳定度的分
258 ln_NLD_SCORE
NUMBER;
--努力度得分
259 ln_YSZQL_SCROE
NUMBER;
--预算准确率得分
260
261 BEGIN
262 DBMS_OUTPUT.ENABLE(
10000000);
263
264 --参数处理
265 IF as_KEY
IS NULL THEN
266 ls_key :
= GET_KPI_DATE();
267 ELSE
268 ls_key :
= as_KEY;
269 END IF;
270
271 IF as_flag
IS NULL THEN
272 ls_flag :
= ‘0‘;
273 ELSE
274 ls_flag :
= as_flag;
275 END IF;
276
277 --test
278 DBMS_OUTPUT.PUT_LINE(
‘0、 装填原始数据 、参数 主键 = ‘ || ls_key
||
279 ‘计算类型 0 自动计算 1 用户计算= ls_flag =‘ || ls_flag);
280
281 --==================================================
282 --第一部分 完成待计算数据处理 根据flag
283 --==================================================
284
285 --测试时候注释掉保留中间结果
286 DELETE FROM kpi_manager_boresult_temp;
287 COMMIT;
288
289 --ls_flag = 0 每日计算
290 IF ls_flag
= ‘0‘ THEN
291
292 INSERT INTO kpi_manager_boresult_temp
293
294 (ID,
295 T_ID,
296 TARGET_ID,
297 TARGET_CODE,
298 TARGET_NAME,
299 tarsys_id,
300 STANDARDVALUE,
301 RATIO,
302 BODATA,
303 BODATA2,
304 BODATE,
305 JS_DATE)
306 SELECT rownum,
307 t.BORESULTID,
308 t.TARGET_ID,
309 NULL,
310 t.TARGET_NAME,
311 tt.tarsys_id,
312 t.STANDARDVALUE,
313 t.RATIO,
314 t.BODATA,
315 t.bodata2,
316 to_char(t.BOGETDATE,
‘yyyy-mm‘),
317 SYSDATE
318 FROM kpi_kernel_boresult_v t, kpi_kpimodel_tst tt
319 WHERE t.TARGET_ID
= tt.target_id
320 --and t.target_id=‘38568‘
321 ;
322 COMMIT;
323
324 END IF;
325
326 --=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
327 --ls_flag = 1 用户自定义计算
328 IF ls_flag
= ‘1‘ THEN
329
330 INSERT INTO kpi_manager_boresult_temp
331
332 (ID,
333 T_ID,
334 TARGET_ID,
335 TARGET_CODE,
336 TARGET_NAME,
337 tarsys_id,
338 STANDARDVALUE,
339 RATIO,
340 BODATA,
341 BODATA2,
342 BODATE,
343 JS_DATE)
344 SELECT rownum,
345 t.rec_id,
346 t.target_id,
--指标ID
347 ‘‘,
348 tt.target_name,
--指标名字
349 tt.tarsys_id,
350 -- pack_kpi_base.F_GET_standardvalue(t.target_id) standardvalue, --标准值
351
352 pack_kpi_kernel.Get_bodata2_kpi_flu_record(t.target_id,
353 t.rec_date) standardvalue,
354 pack_kpi_base.F_GET_RATIO(t.target_id) PRE_RATIO,
--预测值
355 t.BODATA,
--指标分值 用户自行修改值
356 -- pack_kpi_kernel.Get_bodata2_kpi_flu_record(t.target_id,to_char(to_date(t.rec_date,‘yyyy-mm-dd‘),‘yyyy-mm‘)) BODATA2,
357 pack_kpi_kernel.Get_bodata2_kpi_flu_record(t.target_id,
358 t.rec_date) BODATA2,
359
360 t.rec_date,
--时间
361 SYSDATE
362 FROM kpi_flu_record t, kpi_kpimodel_tst tt
363 WHERE t.target_id
= tt.target_id
364 AND t.rec_id
= ls_key;
365
366 COMMIT;
367
368 END IF;
369
370 --==================================================
371 --第二部分 完成指标体系分值计算
372 --==================================================
373
374 --游标从统一接口取数
375 Open Cur_BO;
376 Fetch Cur_BO
377 INTO ln_ID,
378 ls_T_ID,
379 ls_TARGET_ID,
380 ls_TARGET_CODE,
381 ls_TARGET_NAME,
382 ls_tarsys_id,
383 ls_STANDARDVALUE,
384 ls_RATIO,
385 ls_BODATA,
386 ls_BODATA2,
387 ls_BODATE;
388 ln_i :
= 1;
389 --主循环 每次一个指标。
390 While Cur_BO
%Found LOOP
391 --test
392
393 ln_i :
= ln_i
+ 1;
394
395 --循环每行
396 --根据指标类型编码 判断 是那个类型的指标 ,分别调用不同方法计算。并保存
397 --各项变量重新初始化
398 ln_industry :
= 99999;
--创新度中间结果
399 ln_CXD_SCORE :
= 99999;
--创新度
400 ln_WDD_SCORE :
= 99999;
--稳定度的分
401 ln_NLD_SCORE :
= 99999;
--努力度得分
402 ln_YSZQL_SCROE :
= 99999;
--预算准确率得分
403 ln_K_DEP_DATA :
= 1;
--部门得分修正系数
404 ln_TARSYS_SCORE_TYPE :
= -1;
--默认为无效
405 ls_realvalue :
= ls_BODATA;
--保存实际值
406
407 --通过判断实际值和计划值与指标是否是比值行还是普通型,确定是否进行计算
408 IF ((ls_BODATA
IS NOT NULL)
AND
409 pack_kpi_base.F_GET_TARSYS_TYPE(ls_tarsys_id)
= ‘0‘)
OR
410 (pack_kpi_base.F_GET_TARSYS_TYPE(ls_tarsys_id)
= ‘1‘ AND
411 (ls_STANDARDVALUE
IS NOT NULL)
or
412 pack_kpi_base.F_GET_TARSYS_TYPE(ls_tarsys_id)
= ‘2‘)
THEN
413 --第一类:普通型
414 IF pack_kpi_base.F_GET_TARSYS_TYPE(ls_tarsys_id)
= ‘0‘ THEN
415
416 ls_BODATA :
= ls_BODATA
- ls_STANDARDVALUE;
--跟计划值没关系
417
418 END IF;
419 --第二类:比值型
420 --bodata 综合处理 当 指标体系是比值型的时候,对bodata除以计划值得到率
421 IF pack_kpi_base.F_GET_TARSYS_TYPE(ls_tarsys_id)
= ‘1‘ THEN
422
423 IF ls_STANDARDVALUE
= 0 THEN
424 --预测值等于0 或为空 预测值得分为100 否则执行 用分数除以预测值的比值
425 IF ls_BODATA
= 0 THEN
426 ls_BODATA :
= ‘100‘;
427 END IF;
428 ELSE
429 ls_BODATA :
= round(ls_BODATA
/ ls_STANDARDVALUE,
4)
* 100;
430 END IF