1 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;
431
432 -- DBMS_OUTPUT.PUT_LINE( '1.1、bodata 综合处理 、ln_ID = '|| ln_ID || 'ls_TARGET_ID='||ls_TARGET_ID||' ls_TARGET_NAME='||ls_TARGET_NAME||' ls_BODATA='|| ls_BODATA );
433
434 END IF;
435
436 --取得 考核体系 类型代码 重要用于判断分支
437 --0,稳定度(普通);1,稳定度(正向);2,稳定度(反向);3,努力度;4,创新度;5,预算准确率;6,修正系数;7,不计算 8创新度不计算
438
439 ln_TARSYS_SCORE_TYPE := pack_kpi_base.F_GET_SCORETYPE_from_tarsys_id(ls_tarsys_id);
440
441 DBMS_OUTPUT.PUT_LINE('1、 初始化完成待计算前 、ln_ID = ' || ln_ID ||
442 'ls_TARGET_ID=' || ls_TARGET_ID ||
443 ' ls_TARGET_NAME=' || ls_TARGET_NAME ||
444 ' ls_BODATA=' || ls_BODATA ||
445 ' ln_TARSYS_SCORE_TYPE=' ||
446 ln_TARSYS_SCORE_TYPE);
447
448 --========算法开始,=================================
449 --=====创新度=========================================================
450
451 --!!!!!
452 IF ln_TARSYS_SCORE_TYPE = 4 THEN
453
454 --文件中规定的算法,暂时屏蔽
455 /* BEGIN --获取指标的历史最好水平和行业最好水平
456 SELECT t.ALL_BEST,t.HISTORY_BEST
457 INTO ln_ALL_BEST,ln_HISTORY_BEST
458 from kpi_kpimodel_industry t
459 where t.target_id = ls_TARGET_ID;
460 exception
461 when NO_DATA_FOUND then
462 ln_ALL_BEST := 0;
463 ln_HISTORY_BEST := 0;
464 END;
465 ----
466 IF ln_ALL_BEST+ln_HISTORY_BEST >0 THEN
467
468
469
470 --正向
471 IF ls_tarsys_id = '90001' THEN
472
473 IF (ls_BODATA - ln_ALL_BEST)*1 -3>0 THEN
474 ln_industry90001 := 3;
475 ELSE
476 ln_industry90001 := (ls_BODATA - ln_ALL_BEST)*1;
477 END IF;
478
479 IF (ls_BODATA - ln_HISTORY_BEST)*2 - 5 > 0 THEN
480 ln_industry90002 := 3;
481 ELSE
482 ln_industry90002 := (ls_BODATA - ln_HISTORY_BEST)*5;
483 END IF;
484
485 IF ln_industry90001 > ln_industry90002 THEN
486 ln_industry := ln_industry90001;
487 ELSE
488 ln_industry := ln_industry90002;
489 END IF;
490
491 END IF;
492
493 --反向
494 IF ls_tarsys_id = '90002' THEN
495 IF (ln_ALL_BEST - ls_BODATA)*1 -3>0 THEN
496 ln_industry90001 := 3;
497 ELSE
498 ln_industry90001 := (ln_ALL_BEST - ls_BODATA)*1;
499 END IF;
500
501 IF (ln_HISTORY_BEST - ls_BODATA)*2 - 5 > 0 THEN
502 ln_industry90002 := 3;
503 ELSE
504 ln_industry90002 := (ln_HISTORY_BEST - ls_BODATA)*5;
505 END IF;
506
507 IF ln_industry90001 > ln_industry90002 THEN
508 ln_industry := ln_industry90001;
509 ELSE
510 ln_industry := ln_industry90002;
511 END IF;
512 END IF;
513 ----
514 END IF;
515
516 ln_CXD_SCORE :=ln_industry;*/
517
518 --执行
519 --=========(创新度得分=当权重不为0时:实际值-行业最好>=0?20:0;权重为0:按照普通方法计算)=====================
520 if pack_kpi_base.F_GET_WEIGHT_SCALE(ls_TARGET_ID) <> 0 then
521
522 ln_ALL_BEST := pack_kpi_base.F_GET_ALL_BEST(ls_TARGET_ID); --获取行业最好
523 ls_BODATA := ls_realvalue - ln_ALL_BEST; --实际值-行业最好
524 end if;
525
526 ln_CXD_SCORE := PACK_KPI_KERNEL.Get_OneTarget_Score(ls_tarsys_id,
527 ls_BODATA);
528
529 -- 更新创新度结果 位置需变更!!!!!!!!!
530 UPDATE kpi_manager_boresult_temp t
531 SET t.cxd_score = ln_CXD_SCORE
532 WHERE t.id = ln_ID;
533 COMMIT;
534
535 --test
536 DBMS_OUTPUT.PUT_LINE(' 2.1 创新度计算 、 ls_TARGET_NAME=' ||
537 ls_TARGET_NAME || ' ls_tarsys_id=' ||
538 ls_tarsys_id || 'ln_CXD_SCORE=' ||
539 ln_CXD_SCORE);
540
541 END IF;
542
543 --=======预算准确率===========================================================================
544 --!!!!!
545 IF ln_TARSYS_SCORE_TYPE = 5 THEN
546
547 --执行
548 ln_YSZQL_SCROE := PACK_KPI_KERNEL.Get_OneTarget_Score(ls_tarsys_id,
549 ls_BODATA);
550
551 -- 更新预算准确率
552 UPDATE kpi_manager_boresult_temp t
553 SET t.yszql_scroe = ln_YSZQL_SCROE
554 WHERE t.id = ln_ID;
555 COMMIT;
556 --test
557 DBMS_OUTPUT.PUT_LINE(' 2.1 预算准确率 、 ls_TARGET_NAME=' ||
558 ls_TARGET_NAME || ' ls_tarsys_id=' ||
559 ls_tarsys_id || 'ln_YSZQL_SCROE=' ||
560 ln_YSZQL_SCROE);
561
562 END IF;
563
564 --==================================================================
565
566 --努力度得分===========================================================
567 --!!!!!
568 IF ln_TARSYS_SCORE_TYPE = 3 OR ln_TARSYS_SCORE_TYPE = 31 OR
569 ln_TARSYS_SCORE_TYPE = 32 THEN
570
571 IF ln_TARSYS_SCORE_TYPE = 3 THEN
572 --普通:(实际值-历史最好>=0?10:0)
573 --执行
574 ln_HISTORY_BEST := pack_kpi_base.F_GET_HISTORY_BEST(as_target_id => ls_TARGET_ID);
575 ls_BODATA := ls_realvalue - ln_HISTORY_BEST;
576 ln_NLD_SCORE := PACK_KPI_KERNEL.Get_OneTarget_Score_NEW(ls_tarsys_id,
577 ls_BODATA);
578
579 -- 更新努力度得分 普通
580 UPDATE kpi_manager_boresult_temp t
581 SET t.nld_score = ln_NLD_SCORE
582 WHERE t.id = ln_ID;
583 COMMIT;
584
585 --test
586 DBMS_OUTPUT.PUT_LINE(' 2.3 努力度 普通 得分 、 ls_TARGET_NAME=' ||
587 ls_TARGET_NAME || ' ls_tarsys_id=' ||
588 ls_tarsys_id || 'ln_NLD_SCORE=' ||
589 ln_NLD_SCORE);
590 END IF;
591
592 IF ln_TARSYS_SCORE_TYPE = 31 AND ls_BODATA2 > 0 THEN
593 --正向(实际值-历史最好>=0?10:0)
594 --执行
595 ln_HISTORY_BEST := pack_kpi_base.F_GET_HISTORY_BEST(as_target_id => ls_TARGET_ID);
596 ls_BODATA := ls_realvalue - ln_HISTORY_BEST;
597
598 ln_NLD_SCORE := PACK_KPI_KERNEL.Get_OneTarget_Score_NEW(ls_tarsys_id,
599 ls_BODATA);
600
601 -- 更新努力度得分 正向
602 UPDATE kpi_manager_boresult_temp t
603 SET t.nld_score = ln_NLD_SCORE
604 WHERE t.id = ln_ID;
605 COMMIT;
606
607 --test
608 DBMS_OUTPUT.PUT_LINE(' 2.3 努力度 正向 得分 、 ls_TARGET_NAME=' ||
609 ls_TARGET_NAME || ' ls_tarsys_id=' ||
610 ls_tarsys_id || 'ln_NLD_SCORE=' ||
611 ln_NLD_SCORE);
612 END IF;
613
614 IF ln_TARSYS_SCORE_TYPE = 32 AND ls_BODATA2 < 0 THEN
615 --反向(努力度得分=历史最好-实际值>=0?10:0)
616 --执行
617 ln_HISTORY_BEST := pack_kpi_base.F_GET_HISTORY_BEST(as_target_id => ls_TARGET_ID);
618 ls_BODATA := ln_HISTORY_BEST - ls_realvalue;
619
620 ln_NLD_SCORE := PACK_KPI_KERNEL.Get_OneTarget_Score_NEW(ls_tarsys_id,
621 ls_BODATA);
622
623 -- 更新努力度得分 反向
624 UPDATE kpi_manager_boresult_temp t
625 SET t.nld_score = ln_NLD_SCORE
626 WHERE t.id = ln_ID;
627 COMMIT;
628
629 --test
630 DBMS_OUTPUT.PUT_LINE(' 2.3 努力度 反向 得分 、 ls_TARGET_NAME=' ||
631 ls_TARGET_NAME || ' ls_tarsys_id=' ||
632 ls_tarsys_id || 'ln_NLD_SCORE=' ||
633 ln_NLD_SCORE);
634 END IF;
635
636 END IF;
637
638 --稳定度得分===========================================================
639
640 --先确定tarsys_id 是稳定度部分指标
641 --!!!!!
642 IF ln_TARSYS_SCORE_TYPE = 0 OR ln_TARSYS_SCORE_TYPE = 1 OR
643 ln_TARSYS_SCORE_TYPE = 2 THEN
644 --待修改
645
646 --普通稳定度
647 --!!!!!
648 IF ln_TARSYS_SCORE_TYPE = 0 THEN
649 --执行
650 ln_WDD_SCORE := 100 + nvl(PACK_KPI_KERNEL.Get_OneTarget_Score_NEW(ls_tarsys_id,
651 ls_BODATA),
652 0);
653
654 -- 更新稳定度得分
655 UPDATE kpi_manager_boresult_temp t
656 SET t.wdd_score = ln_WDD_SCORE
657 WHERE t.id = ln_ID;
658 COMMIT;
659 --test
660 DBMS_OUTPUT.PUT_LINE(' 2.4 稳定度得分,普通 、 ls_TARGET_NAME=' ||
661 ls_TARGET_NAME || ' ls_tarsys_id=' ||
662 ls_tarsys_id || 'ln_WDD_SCORE=' ||
663 ln_WDD_SCORE);
664
665 END IF;
666
667 --财务稳定度 正向
668 --!!!!!
669 IF ln_TARSYS_SCORE_TYPE = 1 AND ls_BODATA2 > 0 THEN
670
671 --执行
672 ln_WDD_SCORE := 100 + nvl(PACK_KPI_KERNEL.Get_OneTarget_Score_NEW(ls_tarsys_id,
673 ls_BODATA),
674 0);
675
676 -- 更新稳定度得分
677 UPDATE kpi_manager_boresult_temp t
678 SET t.wdd_score = ln_WDD_SCORE
679 WHERE t.id = ln_ID;
680 COMMIT;
681 --test
682 DBMS_OUTPUT.PUT_LINE(' 2.4 稳定度得分 财务稳定度 正向 、 ls_TARGET_NAME=' ||
683 ls_TARGET_NAME || ' ls_tarsys_id=' ||
684 ls_tarsys_id || 'ln_WDD_SCORE=' ||
685 ln_WDD_SCORE);
686
687 END IF;
688
689 --财务稳定度 反向
690 --!!!!!
691 IF ln_TARSYS_SCORE_TYPE = 2 AND ls_BODATA2 < 0 THEN
692 --执行
693 ln_WDD_SCORE := 100 + nvl(PACK_KPI_KERNEL.Get_OneTarget_Score_NEW(ls_tarsys_id,
694 ls_BODATA),
695 0);
696
697 -- 更新稳定度得分
698 UPDATE kpi_manager_boresult_temp t
699 SET t.wdd_score = ln_WDD_SCORE
700 WHERE t.id = ln_ID;
701 COMMIT;
702
703 --test
704 DBMS_OUTPUT.PUT_LINE(' 2.4 稳定度得分--财务稳定度 反向 、 ls_TARGET_NAME=' ||
705 ls_TARGET_NAME || ' ls_tarsys_id=' ||
706 ls_tarsys_id || 'ln_WDD_SCORE=' ||
707 ln_WDD_SCORE);
708
709 END IF;
710
711 END IF; --
712
713 --不计算的 稳定度得分===========================================================
714 --!!!!!
715 IF ln_TARSYS_SCORE_TYPE = 7 THEN
716
717 -- 更新稳定度得分
718 UPDATE kpi_manager_boresult_temp t
719 SET t.wdd_score = ls_BODATA
720 WHERE t.id = ln_ID;
721 COMMIT;
722 DBMS_OUTPUT.PUT_LINE(' 2.7 不计算的稳定度得分 、 ls_TARGET_NAME=' ||
723 ls_TARGET_NAME || ' ls_tarsys_id=' ||
724 ls_tarsys_id || 'ln_WDD_SCORE=' ||
725 ln_WDD_SCORE);
726
727 END IF; --
728
729 --不计算的 创新度得分===========================================================
730 --!!!!!
731 IF ln_TARSYS_SCORE_TYPE = 8 THEN
732
733 -- 更新创新度得分
734 UPDATE kpi_manager_boresult_temp t
735 SET t.CXD_SCORE = ls_BODATA
736 WHERE t.id = ln_ID;
737 COMMIT;
738 DBMS_OUTPUT.PUT_LINE(' 2.8 不计算的创新度得分 、 ls_TARGET_NAME=' ||
739 ls_TARGET_NAME || ' ls_tarsys_id=' ||
740 ls_tarsys_id || 'CXD_SCORE=' || ls_BODATA);
741
742 END IF; --
743
744 --修正系数得分计算===========================================================
745 --!!!!!
746 IF ln_TARSYS_SCORE_TYPE = 6 THEN
747 ln_K_DEP_DATA := PACK_KPI_KERNEL.Get_OneTarget_Score(ls_tarsys_id,
748 ls_BODATA/100);
749
750 -- 修正系数得分
751 UPDATE kpi_manager_boresult_temp t
752 SET t.K_DEP_DATA = ln_K_DEP_DATA
753 WHERE t.id = ln_ID;
754 COMMIT;
755 DBMS_OUTPUT.PUT_LINE(' 2.6 修正系数得分、 ls_TARGET_NAME=' ||
756 ls_TARGET_NAME || ' ls_tarsys_id=' ||
757 ls_tarsys_id || 'ln_K_DEP_DATA=' ||
758 ln_K_DEP_DATA);
759
760 END IF; --
761 ------------修正系数不计算 范广龙 20130905
762 IF ln_TARSYS_SCORE_TYPE = 61 THEN
763 ln_K_DEP_DATA := ls_BODATA;
764
765 -- 修正系数得分
766 UPDATE kpi_manager_boresult_temp t
767 SET t.K_DEP_DATA = ln_K_DEP_DATA
768 WHERE t.id = ln_ID;
769 COMMIT;
770 DBMS_OUTPUT.PUT_LINE(' 2.7 修正系数不计算体系得分、 ls_TARGET_NAME=' ||
771 ls_TARGET_NAME || ' ls_tarsys_id=' ||
772 ls_tarsys_id || 'ln_K_DEP_DATA=' ||
773 ln_K_DEP_DATA);
774
775 END IF;
776 ----------------------------------------------- --
777 ----
778
779 END IF;
780 --==============================
781 --循环结束FETCH一次=============
782 --==============================
783 Fetch Cur_BO
784 INTO ln_ID,
785 ls_T_ID,
786 ls_TARGET_ID,
787 ls_TARGET_CODE,
788 ls_TARGET_NAME,
789 ls_tarsys_id,
790 ls_STANDARDVALUE,
791 ls_RATIO,
792 ls_BODATA,
793 ls_BODATA2,
794 ls_BODATE;
795
796 End Loop;
797
798 --test
799 DBMS_OUTPUT.PUT_LINE(' 2.9、 计算结束——共计算指标个数 、 ln_i=' || ln_i);
800
801 Close Cur_bo;
802
803 --==================================================
804 --第三部分 完成指标数据提交至指定位置
805 --==================================================
806
807 --更新根据flag分类。
808
809 --ls_flag = 0 批量计算
810 IF ls_flag = '0' THEN
811
812 --kpi_manager_boresult_temp ----》kpi_manager_boresult_report
813
814 begin
815 merge into kpi_manager_boresult_report t1
816 using (select t.t_id,
817 t.target_id,
818 t.target_code,
819 t.target_name,
820 t.bodata,
821 t.bodata2,
822 t.bodate,
823 SUM(t.wdd_score) wdd_score,
824 SUM(t.nld_score) nld_score,
825 SUM(t.cxd_score) cxd_score,
826 SUM(t.yszql_scroe) yszql_scroe,
827 SUM(t.K_DEP_DATA) K_DEP_DATA
828
829 from KPI_MANAGER_BORESULT_TEMP t
830 GROUP BY t.t_id,
831 t.target_id,
832 t.target_code,
833 t.target_name,
834 t.bodata,
835 t.bodata2,
836 t.bodate) t2
837 on (t1.target_id || t1.report_month = t2.target_id || t2.bodate)
838
839 when matched then
840 update
841 set t1.update_date = SYSDATE,
842 t1.useflag = '0',
843 t1.bodata = t2.bodata,
844 t1.bodata2 = t2.bodata2,
845 t1.wdd_score = t2.wdd_score,
846 t1.nld_score = t2.nld_score,
847 t1.cxd_score = t2.cxd_score,
848 t1.yszql_scroe = t2.yszql_scroe,
849 t1.K_DEP_DATA = t2.K_DEP_DATA /*,
850 t1.commit_flag = '0'*/
851
852 WHERE t1.target_id = t2.target_id
853 AND t1.report_month = t2.bodate
854 and t1.commit_flag = 0
855
856
857 when not matched then
858 insert
859 (TARGET_ID,
860 TARGET_NAME,
861 TARGET_CODE,
862 UPDATE_DATE,
863 REPORT_MONTH,
864 USEFLAG,
865 WDD_SCORE,
866 NLD_SCORE,
867 CXD_SCORE,
868 YSZQL_SCROE,
869 K_DEP_DATA,
870 COMMIT_FLAG,
871 BODATA,
872 BODATA2
873
874 )
875 Values
876 (t2.target_id,
877 t2.target_name,
878 t2.target_code,
879 SYSDATE,
880 t2.bodate,
881 '0',
882 t2.WDD_SCORE,
883 t2.NLD_SCORE,
884 t2.CXD_SCORE,
885 t2.YSZQL_SCROE,
886 t2.K_DEP_DATA,
887 '0',
888 t2.bodata,
889 t2.bodata2);
890 commit;
891 exception
892 when OTHERS then
893 rollback;
894 end;
895 END IF; --==========================================
896
897 --=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
898 --ls_flag = 1 用户自定义计算
899 IF ls_flag = '1' THEN
900
901 begin
902 merge into kpi_flu_record t1
903 using (select t.t_id,
904 t.target_id,
905 t.target_code,
906 t.target_name,
907 t.bodata,
908 t.bodate,
909 SUM(t.wdd_score) wdd_score,
910 SUM(t.nld_score) nld_score,
911 SUM(t.cxd_score) cxd_score,
912 SUM(t.yszql_scroe) yszql_scroe
913
914 from KPI_MANAGER_BORESULT_TEMP t
915 GROUP BY t.t_id,
916 t.target_id,
917 t.target_code,
918 t.target_name,
919 t.bodata,
920 t.bodate) t2
921 on (t1.rec_id = t2.t_id)
922
923 when matched then
924 update
925 SET t1.wdd_score = t2.wdd_score,
926 t1.nld_score = t2.nld_score,
927 t1.cxd_score = t2.cxd_score,
928 t1.yszql_scroe = t2.yszql_scroe
929 WHERE t1.rec_id = t2.t_id;
930 commit;
931 exception
932 when OTHERS then
933 rollback;
934 end;
935 --更新K值
936 begin
937 merge into kpi_manager_boresult_report t1
938 using (select t.t_id,
939 t.target_id,
940 t.target_code,
941 t.target_name,
942 t.bodata,
943 t.bodata2,
944 t.bodate,
945 SUM(t.wdd_score) wdd_score,
946 SUM(t.nld_score) nld_score,
947 SUM(t.cxd_score) cxd_score,
948 SUM(t.yszql_scroe) yszql_scroe,
949 SUM(t.K_DEP_DATA) K_DEP_DATA
950
951 from KPI_MANAGER_BORESULT_TEMP t
952 GROUP BY t.t_id,
953 t.target_id,
954 t.target_code,
955 t.target_name,
956 t.bodata,
957 t.bodata2,
958 t.bodate) t2
959 on (t1.target_id || t1.report_month = t2.target_id || t2.bodate)
960
961 when matched then
962 update
963 set t1.update_date = SYSDATE,
964 t1.useflag = '0',
965 -- t1.bodata = t2.bodata,
966 t1.bodata2 = t2.bodata2,
967
968 t1.K_DEP_DATA = t2.K_DEP_DATA
969 /*,
970 t1.commit_flag = '0'*/
971
972 WHERE t1.target_id = t2.target_id
973 AND t1.report_month = t2.bodate;
974
975 commit;
976 exception
977 when OTHERS then
978 rollback;
979 end;
980
981 END IF;
982
983 END KT_MAIN_MASTER_CONTROL;
984
985 ---==================================================
986
987 --====================================================================
988
989 FUNCTION GET_ONETARGET_SCORE(as_TARSYS_id IN VARCHAR2, as_bodata NUMBER)
990 RETURN NUMBER AS
991 --ComClass CATALOG_ID
992 --分数上限、下限和步长
993
994 --返回值
995 ln_RESULT NUMBER;
996
997 BEGIN
998
999 DECLARE
1000
1001 BEGIN
1002 --初始化
1003
1004 IF as_bodata IS NULL THEN
1005 --
1006
1007 RETURN 0;
1008
1009 ELSE
1010 BEGIN
1011
1012 SELECT DECODE(SIGN(t.tarsys_step),
1013 1,
1014 ( /*trunc(*/
1015 (as_bodata - t.tarsys_bottom) / t.tarsys_step) *
1016 t.tarsys_score /*)*/,
1017 -1,
1018 ( /*trunc(*/
1019 (t.tarsys_upper - as_bodata) / (-t.tarsys_step)) *
1020 t.tarsys_score /*)*/,
1021 0,
1022 t.tarsys_score, --步长为0,直接返回默认分值
1023 0)
1024 INTO ln_RESULT
1025 from kpi_kpimodel_targetsystem t
1026
1027 WHERE t.p_tarsys_id = as_TARSYS_id
1028 AND t.tarsys_upper > as_bodata
1029 AND t.tarsys_bottom <= as_bodata;
1030 EXCEPTION
1031 WHEN OTHERS THEN
1032 ln_RESULT := 0;
1033
1034 END;
1035 END IF;
1036 END;
1037
1038 RETURN round(ln_RESULT, 2);
1039 END GET_ONETARGET_SCORE;
1040
1041 --====================================================================
1042
1043 --====================================================================
1044
1045 --====================================================================
1046
1047 FUNCTION GET_ONETARGET_SCORE_VAR(as_TARSYS_id IN VARCHAR2,
1048 as_bodata NUMBER) RETURN NUMBER AS
1049 --ComClass CATALOG_ID
1050 --分数上限、下限和步长
1051
1052 --返回值
1053 ln_RESULT NUMBER;
1054
1055 BEGIN
1056
1057 DECLARE
1058
1059 BEGIN
1060 --初始化
1061
1062 IF as_bodata IS NULL THEN
1063 --
1064
1065 RETURN 0;
1066
1067 ELSE
1068 BEGIN
1069
1070 SELECT as_bodata * t.tarsys_score --传入值乘参数,用体系得分保存。
1071 INTO ln_RESULT
1072
1073 from kpi_kpimodel_targetsystem t
1074
1075 WHERE t.p_tarsys_id = as_TARSYS_id
1076 AND t.tarsys_upper > as_bodata
1077 AND t.tarsys_bottom <= as_bodata;
1078 EXCEPTION
1079 WHEN OTHERS THEN
1080 ln_RESULT := 0;
1081
1082 END;
1083 END IF;
1084 END;
1085
1086 RETURN round(ln_RESULT, 2);
1087 END GET_ONETARGET_SCORE_VAR;
1088
1089 --====================================================================
1090
1091 --====================================================================
1092
1093 --计算量化月奖 ,每日 ,暂时停用中
1094 PROCEDURE GET_BORESULT_LH_AWORD_today IS
1095
1096 BEGIN
1097
1098 begin
1099 --从kpi_kernel_lh_aword_v ----》KPI_RESULT_DEP_AWORD
1100 --仅仅取当日的BODATA结果,根据部门汇总月奖保存
1101 merge into KPI_RESULT_DEP_AWORD t1
1102 using (SELECT *
1103
1104 FROM kpi_kernel_lh_aword_v t
1105 WHERE t.resultdate = to_char(SYSDATE, 'yyyymmdd')) t2
1106 on (t1.depid = t2.department_id)
1107
1108 when matched then
1109 update
1110 set t1.resdata = t2.Aword, t1.resdate = t2.resultdate
1111 WHERE t1.resdate = to_char(SYSDATE, 'yyyymmdd')
1112 when not matched then
1113 insert
1114 (ResultID, DepID, ResDATA, ResDate)
1115 Values
1116 (seq_KPI_Result_AWORD.NEXTVAL,
1117 t2.department_id,
1118 t2.Aword,
1119 SYSDATE);
1120 commit;
1121
1122 exception
1123 when OTHERS then
1124 rollback;
1125 end;
1126
1127 END GET_BORESULT_LH_AWORD_today;
1128
1129 FUNCTION Get_KPI_System_P_ID(as_target_id IN VARCHAR2) RETURN TSTRARRY AS
1130
1131 tst_arry TSTRARRY;
1132
1133 --tst游标
1134 Cursor Cur_TST Is
1135 select t.TARSYS_ID
1136 from kpi_kpimodel_tst t
1137 where t.target_id = as_target_id;
1138
1139 ls_tst VARCHAR2(100);
1140 ls_tst2 VARCHAR2(100);
1141 ln_i INTEGER;
1142 ln_count INTEGER;
1143
1144 BEGIN
1145 Open Cur_TST;
1146 Fetch Cur_TST
1147 INTO ls_tst;
1148 ln_i := 1;
1149 --主循环 每次一个指标。
1150 While Cur_TST%Found LOOP
1151
1152 tst_arry(ln_i) := ls_tst;
1153 ln_i := ln_i + 1;
1154 --循环结束FETCH一次
1155
1156 Fetch Cur_TST
1157 INTO ls_tst;
1158 End Loop;
1159 Close Cur_TST;
1160
1161 --处理数组0位置,用来记录数据数量
1162 tst_arry(0) := ln_i;
1163
1164 RETURN tst_arry;
1165
1166 END Get_KPI_System_P_ID;
1167 --====================================================================
1168
1169 FUNCTION Get_KPI_SystemID(as_target_id IN VARCHAR2) RETURN TSTRARRYARRY AS
1170
1171 tst_arry TSTRARRY;
1172 tst_arryarry TSTRARRYARRY;
1173
1174 --tst游标
1175 Cursor Cur_TST Is
1176 select t.TARSYS_ID
1177 from kpi_kpimodel_tst t
1178 where t.target_id = as_target_id;
1179
1180 ls_tst VARCHAR2(100);
1181 ls_tst2 VARCHAR2(100);
1182 ln_i INTEGER;
1183 ln_count INTEGER;
1184
1185 --system1 有子节点
1186 Cursor Cur_system1 Is
1187 select t.tarsys_id
1188 from KPI_KPIMODEL_TARGETSYSTEM t
1189 where t.tarsys_id <> ls_tst2
1190 start with t.tarsys_id = ls_tst2
1191 connect by prior t.tarsys_id = t.p_tarsys_id;
1192
1193 --system2 没子节点
1194 Cursor Cur_system2 Is
1195 select t.tarsys_id
1196 from KPI_KPIMODEL_TARGETSYSTEM t
1197 where t.tarsys_id = ls_tst2
1198 start with t.tarsys_id = ls_tst2
1199 connect by prior t.tarsys_id = t.p_tarsys_id;
1200
1201 BEGIN
1202 Open Cur_TST;
1203 Fetch Cur_TST
1204 INTO ls_tst;
1205 ln_i := 1;
1206 --主循环 每次一个指标。
1207 While Cur_TST%Found LOOP
1208
1209 tst_arry(ln_i) := ls_tst;
1210 ln_i := ln_i + 1;
1211 --循环结束FETCH一次
1212
1213 Fetch Cur_TST
1214 INTO ls_tst;
1215 End Loop;
1216 Close Cur_TST;
1217
1218 --处理数组0位置,用来记录数据数量
1219 tst_arry(0) := ln_i;
1220 tst_arryarry(0)(0) := ln_i;
1221 IF ln_i = 1 THEN
1222 tst_arryarry(0)(0) := '0';
1223 END IF;
1224
1225 --根据tst取所有的子节点
1226 FOR i IN 1 .. tst_arry(0) - 1 LOOP
1227 DBMS_OUTPUT.PUT_LINE('二、 tst第一步,循环次数:' || i || ',target_id:' ||
1228 as_target_id || ' 考核大体系' || tst_arry(i));
1229 END LOOP;
1230
1231 IF tst_arryarry(0) (0) <> 0 THEN
1232 FOR i IN 1 .. tst_arry(0) - 1 LOOP
1233 ls_tst2 := tst_arry(i);
1234
1235 --判断是否有子节点
1236 BEGIN
1237 select COUNT(1)
1238 INTO ln_count
1239 from KPI_KPIMODEL_TARGETSYSTEM t
1240 where t.tarsys_id <> ls_tst2
1241 start with t.tarsys_id = ls_tst2
1242 connect by prior t.tarsys_id = t.p_tarsys_id;
1243 exception
1244 when NO_DATA_FOUND then
1245 ln_count := 0;
1246 END;
1247
1248 IF ln_count > 0 THEN
1249 Open Cur_system1;
1250 Fetch Cur_system1
1251 INTO ls_tst;
1252 ln_i := 1;
1253 --主循环 每次一个指标。
1254 While Cur_system1%Found LOOP
1255
1256 tst_arryarry(i)(ln_i) := ls_tst;
1257 ln_i := ln_i + 1;
1258 Fetch Cur_system1
1259 INTO ls_tst;
1260 End Loop;
1261 Close Cur_system1;
1262 tst_arryarry(i)(0) := ln_i;
1263
1264 ELSE
1265 Open Cur_system2;
1266 Fetch Cur_system2
1267 INTO ls_tst;
1268 ln_i := 1;
1269 --主循环 每次一个指标。
1270 While Cur_system2%Found LOOP
1271
1272 tst_arryarry(i)(ln_i) := ls_tst;
1273 ln_i := ln_i + 1;
1274 Fetch Cur_system2
1275 INTO ls_tst;
1276 End Loop;
1277 Close Cur_system2;
1278 tst_arryarry(i)(0) := ln_i;
1279
1280 END IF;
1281
1282 END LOOP;
1283 END IF;
1284
1285 RETURN tst_arryarry;
1286
1287 END Get_KPI_SystemID;
1288
1289 --====================================================================
1290
1291 FUNCTION GetComAword(as_KPI_SCORE IN number, as_CATALOG_ID IN VARCHAR2)
1292 RETURN NUMBER AS
1293 --ComClass CATALOG_ID
1294 --分数上限、下限和步长
1295 dblScoreUP number;
1296 dblScoreBottom number;
1297 dblScoreStep number;
1298 dblScoreTT number;
1299
1300 LS_BOTTOM number; --记录起征点
1301 --返回值
1302 ln_RESULT NUMBER;
1303
1304 BEGIN
1305
1306 DECLARE
1307 --TYPE s_TYPE IS RECORD
1308 --( str VARCHAR2(4000) );
1309
1310 BEGIN
1311 LS_BOTTOM := 0;
1312 ln_RESULT := 0;
1313
1314 --获取“起征点”
1315 BEGIN
1316
1317 SELECT t.catalog_t_bottom
1318 INTO LS_BOTTOM
1319 from KPI_KPIMODEL_CATALOGTARGET t
1320
1321 WHERE t.catalog_id = as_CATALOG_ID
1322 AND t.catalog_t_award = 0;
1323 EXCEPTION
1324 WHEN OTHERS THEN
1325 LS_BOTTOM := -99999;
1326
1327 END;
1328 --无法获取起征点,则结果返回-99999
1329 IF LS_BOTTOM = -99999 THEN
1330 ln_RESULT := -99999; --返回值为-1特殊值,说明表中参数设置有错误。
1331
1332 ELSE
1333 --算法
1334
1335 IF as_KPI_SCORE >= LS_BOTTOM THEN
1336
1337 --新算法,适合累进计算部分
1338 BEGIN
1339 SELECT SUM(DECODE(DECODE(SIGN(as_KPI_SCORE - T.CATALOG_T_UPPER),
1340 0,
1341 1,
1342 1,
1343 1,
1344 -1,
1345 -1), --判断区间 0,1均返回1代表本段算全分 -1返回-1代表本段算比例分
1346 1,
1347 ((T.CATALOG_T_UPPER - T.CATALOG_T_BOTTOM) /
1348 T.CATALOG_T_STEP) * T.CATALOG_T_AWARD, --不在这个区间
1349 -1,
1350 DECODE(SIGN(CATALOG_T_STEP),
1351 1,
1352 ((as_KPI_SCORE - T.CATALOG_T_BOTTOM) /
1353 T.CATALOG_T_STEP * T.CATALOG_T_AWARD)),
1354 -1,
1355 ((T.CATALOG_T_UPPER - as_KPI_SCORE) /
1356 (-T.CATALOG_T_STEP) * T.CATALOG_T_AWARD),
1357 0)) C_AWARD
1358 INTO ln_RESULT
1359 FROM KPI_KPIMODEL_CATALOGTARGET T
1360
1361 WHERE T.CATALOG_ID = as_CATALOG_ID
1362 AND T.CATALOG_T_BOTTOM >= LS_BOTTOM
1363 AND T.CATALOG_T_BOTTOM <= as_KPI_SCORE
1364 ORDER BY T.CATALOG_T_UPPER;
1365 EXCEPTION
1366 WHEN OTHERS THEN
1367 ln_RESULT := -99998;
1368 END;
1369
1370 END IF;
1371
1372 IF as_KPI_SCORE < LS_BOTTOM THEN
1373
1374 --老算法,适合多段计算部分
1375 BEGIN
1376 SELECT
1377
1378 DECODE(SIGN(CATALOG_T_STEP),
1379 1,
1380 (DECODE(CATALOG_T_STEP, --若step为9999,则直接-1,奖金为零
1381 9999,
1382 -1,
1383 --step 小于零
1384 (as_KPI_SCORE - T.CATALOG_T_BOTTOM) /
1385 T.CATALOG_T_STEP * T.CATALOG_T_AWARD)),
1386 -1,
1387 ((T.CATALOG_T_UPPER - as_KPI_SCORE) /
1388 (-T.CATALOG_T_STEP) * T.CATALOG_T_AWARD),
1389 0) LN_RESULT
1390 INTO ln_RESULT
1391 FROM KPI_KPIMODEL_CATALOGTARGET T
1392
1393 WHERE T.CATALOG_ID = as_CATALOG_ID
1394 AND T.CATALOG_T_UPPER <= LS_BOTTOM
1395 AND T.CATALOG_T_UPPER > as_KPI_SCORE
1396 AND T.CATALOG_T_BOTTOM <= as_KPI_SCORE;
1397
1398 EXCEPTION
1399 WHEN OTHERS THEN
1400 ln_RESULT := -99997;
1401 END;
1402
1403 END IF;
1404
1405 END IF;
1406
1407 --test
1408 --DBMS_OUTPUT.PUT_LINE('GetScoreAllYSZQL :as_bo.TARGET_ID=' ||as_bo.TARGET_ID ||'Ln_temp_resDBL预算='||Ln_temp_resDBL );
1409 --加基本月奖1,返回实际月奖
1410 ln_RESULT := nvl(ln_RESULT, 0) + 1;
1411 END;
1412 RETURN ln_RESULT;
1413 END GetComAword;
1414
1415 --====================================================================
1416
1417 --====================================================================
1418 --计算总月奖
1419 FUNCTION Get_all_Aword(as_LH_SCORE IN number, as_GL_SCORE IN NUMBER)
1420 RETURN NUMBER AS
1421
1422 ln_RESULT NUMBER;
1423
1424 BEGIN
1425
1426 ln_RESULT := 0;
1427 ln_RESULT := round(as_LH_SCORE * (1 - as_GL_SCORE), 3);
1428
1429 RETURN ln_RESULT;
1430 END Get_all_Aword;
1431
1432 --====================================================================
1433
1434 --====================================================================
1435 --获取指标的bodata2
1436 FUNCTION Get_bodata2_kpi_flu_record(as_target_id IN VARCHAR2,
1437 as_month IN VARCHAR2) RETURN NUMBER AS
1438 --权重修正
1439 --K值修正
1440 --得分上下限修正。
1441
1442 --返回值
1443 ln_RESULT NUMBER;
1444
1445 BEGIN
1446 begin
1447 select t.bodata2
1448 into ln_RESULT --取P_id
1449 from kpi_manager_boresult_report t
1450 where t.target_id = as_target_id
1451 AND t.report_month = as_month;
1452 exception
1453 when NO_DATA_FOUND then
1454 ln_RESULT := 0;
1455 end;
1456
1457 RETURN ln_RESULT;
1458 END Get_bodata2_kpi_flu_record;
1459
1460 --====================================================================
1461
1462 --====================================================================
1463 --指标得分最终得分修正
1464 FUNCTION Get_K_DEP_DATA(as_dep_id IN VARCHAR2, as_month IN VARCHAR2)
1465 RETURN NUMBER AS
1466 --权重修正
1467 --K值修正
1468 --得分上下限修正。
1469
1470 --返回值
1471 ln_RESULT NUMBER;
1472 ls_target_id VARCHAR2(50);
1473
1474 BEGIN
1475 BEGIN
1476 select tv.target_id
1477 into ls_target_id --取P_id
1478 -----范广龙修改 2013 09 07
1479
1480 from (select t.target_id from kpi_kpimodel_kpitarget t
1481 where t.department_id = as_dep_id
1482 AND t.target_name LIKE '月奖基准系数%' order by t.target_id desc) tv
1483 where
1484 rownum=1;
1485 /*范例
1486 select * from (select t.*
1487 --取P_id
1488 from kpi_kpimodel_kpitarget t
1489 where t.department_id = 122
1490 AND t.target_name LIKE '月奖基准系数%' order by t.target_id desc) ty where rownum=1;
1491
1492 */
1493
1494
1495 exception
1496 when OTHERS then
1497 ln_RESULT := 1;
1498 end;
1499
1500 BEGIN
1501 select t.k_dep_data
1502 into ln_RESULT --取P_id
1503 from kpi_manager_boresult_report t
1504 where t.target_id = ls_target_id
1505 AND t.report_month = as_month;
1506 exception
1507 when OTHERS then
1508 ln_RESULT := 1;
1509 end;
1510
1511 RETURN nvl(ln_RESULT, 1);
1512 END Get_K_DEP_DATA;
1513
1514 --====================================================================
1515
1516 --====================================================================
1517 --指标得分最终得分修正
1518 FUNCTION get_lh_score_fix(LH_score IN NUMBER,
1519 dep_id IN NUMBER,
1520 as_month IN VARCHAR2) RETURN NUMBER AS
1521
1522 --返回值
1523 ln_RESULT NUMBER;
1524 ln_upper_score NUMBER;
1525 ln_LH_score NUMBER;
1526 BEGIN
1527 ln_LH_score := LH_score;
1528 --计算
1529 --(量化指标基础的分 - 本单位资金计划准确率得分)*修正系数 在上下限规整
1530
1531 --1 - 本单位资金计划准确率得分
1532 ln_LH_score := ln_LH_score + get_zjjhzql(dep_id, as_month);
1533
1534 --2 K值修正
1535 ln_LH_score := ln_LH_score *1;-- Get_K_DEP_DATA(dep_id, as_month);
1536
1537 --3 得分上下限修正。
1538
1539 BEGIN
1540 SELECT t.upper_score
1541 INTO ln_upper_score
1542 FROM kpi_kpimodel_department t
1543 WHERE t.department_id = dep_id;
1544 EXCEPTION
1545 WHEN OTHERS THEN
1546 ln_RESULT := ln_LH_score;
1547 END;
1548
1549 --超过上限的 修改成得分上限
1550 IF ln_upper_score < ln_LH_score THEN
1551 ln_RESULT := ln_upper_score;
1552 ELSE
1553 ln_RESULT := ln_LH_score;
1554 END IF;
1555
1556 RETURN ln_RESULT;
1557 END get_lh_score_fix;
1558
1559 --====================================================================
1560 --取得资金计划准确率
1561 FUNCTION get_zjjhzql(as_dep_id IN VARCHAR2, as_month IN VARCHAR2)
1562 RETURN NUMBER AS
1563 --权重修正
1564 --K值修正
1565 --得分上下限修正。
1566
1567 --返回值
1568 ln_RESULT NUMBER;
1569 ls_target_id VARCHAR2(50);
1570
1571 BEGIN
1572 BEGIN
1573 SELECT t.YSZQL_SCROE
1574 INTO ln_RESULT
1575 from kpi_kernel_dep_month_mx_base_v t
1576 WHERE t.TARGET_NAME LIKE '%资金计划准确率%'
1577 AND t.REC_MONTHDATE = as_month
1578 AND t.DEPARTMENT_ID = as_dep_id;
1579 exception
1580 when OTHERS then
1581 ln_RESULT := 0;
1582 end;
1583
1584 RETURN nvl(ln_RESULT, 0);
1585 END get_zjjhzql;
1586
1587 --====================================================================
1588
1589 --====================================================================
1590 --定时取指标元素 主程序 小元素合成算法
1591 --=-=-==-=-=-=-=-------------------------------
1592 PROCEDURE BOELEMENT_MASTER_CONTROL(as_date IN VARCHAR2) AS
1593 --定义一
1594
1595 ls_date VARCHAR2(20);
1596
1597 --定义二
1598
1599 small_ele_idx NUMBER;
1600 ln_S NUMBER;
1601 ln_S1 NUMBER;
1602 ln_A1 NUMBER;
1603 ln_A2 NUMBER;
1604 ln_A3 NUMBER;
1605 ln_A4 NUMBER;
1606 ln_A5 NUMBER;
1607 ln_A6 NUMBER;
1608
1609 --保存游标取出的值
1610 ele_row kpi_kernel_boelement_bigele_v%rowtype;
1611
1612 type small_ele is record --包含转账方向、金额等信息
1613 (
1614 rownum number,
1615 ele_id VARCHAR2(100),
1616 er_value NUMBER
1617
1618 );
1619
1620 type small_ele_t IS TABLE of small_ele index by binary_integer;
1621 l_small_ele small_ele; --记录
1622 l_small_ele_t small_ele_t; --定义表
1623
1624 --大元素游标
1625 Cursor Cur_ele_big Is
1626 --禁用生产的数据,当不需要禁用时,解锁
1627 SELECT *
1628 From kpi_kernel_boelement_bigele_v
1629 where 1 = 2
1630 ORDER BY BIG_ELE_ID;
1631
1632 --小元素游标
1633 Cursor Cur_ele_small Is
1634 SELECT rownum, tt.ele_id, tt.er_value
1635 FROM kpi_manager_boelement t, kpi_manager_boelement_result tt
1636 WHERE t.ele_id = tt.ele_id
1637 AND t.ele_id LIKE ele_row.big_ele_id || '-%'
1638 AND tt.er_month = ls_date
1639 ORDER BY tt.ele_id;
1640
1641 --定义三
1642
1643 BEGIN
1644
1645 -- DBMS_OUTPUT.ENABLE(10000000);
1646
1647 --参数处理
1648 IF as_date IS NULL THEN
1649
1650 ls_date := GET_KPI_DATE();
1651 ELSE
1652 ls_date := as_date;
1653 END IF;
1654
1655 --==================================================
1656 --第一部分 获取所有普通元素和小元素的值
1657 --==================================================
1658
1659 --主体 取元素值,每月一条,有则更新
1660 BEGIN
1661 DBMS_OUTPUT.put_line('检查点1-1');
1662 delete KPI_MANAGER_ELE_RESULT_TEMP;
1663 commit;
1664 DBMS_OUTPUT.put_line('检查点1-2');
1665 insert /*+append */ into KPI_MANAGER_ELE_RESULT_TEMP
1666 SELECT t.ELE_ID,
1667 t.ELE_TYPE,
1668 t.ELEMENT_NAME,
1669 t.DEP_NAME,
1670 t.FACTRY_NAME,
1671 t.ELEMNT_SORUCE,
1672 t.DEFAULTVALUE,
1673 PACK_KPI_KERNEL.GET_BOELEMENT(t.ele_id, ls_date) ER_VALUE,
1674 ls_date er_month
1675 from kpi_manager_boelement t
1676 WHERE t.ele_type_update IN ('0', '1')
1677 and t.ele_type <> '指标值';
1678 commit;
1679
1680 DBMS_OUTPUT.put_line('检查点1-3');
1681 MERGE INTO kpi_manager_boelement_result t1
1682 USING KPI_MANAGER_ELE_RESULT_TEMP t2
1683 ON (t1.ele_id || t1.ER_MONTH = t2.ELE_ID || t2.er_month)
1684 --按月写入条目,每月每元素一条数据
1685 WHEN MATCHED THEN --匹配就更新
1686 UPDATE
1687 SET t1.ER_VALUE = t2.ER_VALUE, t1.ER_DATE = SYSDATE
1688 WHERE t1.ele_id = t2.ELE_ID
1689 AND t1.er_month = t2.er_month
1690
1691
1692 WHEN NOT MATCHED THEN --不匹配就写入新数据
1693 INSERT
1694 (ELE_ID, ER_MONTH, ER_VALUE, ER_DATE)
1695 VALUES
1696 (t2.ELE_ID,
1697 t2.er_month,
1698 t2.ER_VALUE,
1699 SYSDATE
1700
1701 );
1702
1703 commit;
1704 DBMS_OUTPUT.put_line('检查点1-4');
1705 ---新增日志表记录
1706
1707 /* insert into KPI_MANAGER_BOELEMENT_LOG
1708 (er_id,ele_id, er_month, er_value, er_date)
1709 SELECT
1710 SEQ_KPI_KPI_ELE_LOG.Nextval,
1711 t.ELE_ID,
1712 ls_date er_month,
1713 GET_BOELEMENT(t.ele_id, ls_date) ER_VALUE,
1714 sysdate
1715 from kpi_manager_boelement t
1716 WHERE t.ele_type_update IN ('0', '1')
1717 and t.ele_type <> '指标值';
1718
1719
1720
1721 commit;*/
1722 --Exception
1723 --when others then
1724
1725 --pack_kpi_base.SET_SYSTEM_LOG( '指标元素提取出错', '指标元素提取出错');
1726
1727 end;
1728
1729 --将审批通过的计划值更新到元素结果表【kpi_manager_boelement_result】中
1730 DBMS_OUTPUT.put_line('检查点1-5');
1731 PACK_KPI_JHZ.kpi_BackToELeResultTable(ls_date);
1732 DBMS_OUTPUT.put_line('检查点1-6');
1733 --利润实际排名
1734 KPI_LR_SJ_PM(ls_date);
1735 --利润预算准确率排名
1736 KPI_LR_YSZQL_PM(as_month => ls_date);
1737 DBMS_OUTPUT.put_line('检查点1-7');
1738 --==================================================
1739 --第二部分 根据获取的小元素 合成大元素 写入临时表
1740 --==================================================
1741
1742 --1、获取大元素列表逐条计算大元素值
1743 Open Cur_ele_big;
1744 loop
1745 --主循环
1746
1747 --循环内参数初始化####
1748 --small_ele_idx :=0;
1749 ln_s1 := -9997; -- 中间结果
1750 ln_s := -9998; --最终结果
1751 ln_A1 := 0;
1752 ln_A2 := 0;
1753 ln_A3 := 0;
1754 ln_A4 := 0;
1755 ln_A5 := 0;
1756 ln_A6 := 0;
1757
1758 --取游标
1759 fetch Cur_ele_big
1760 into ele_row;
1761 exit when Cur_ele_big%NOTFOUND;
1762
1763 ---
1764 /*DBMS_OUTPUT.PUT_LINE('2.1、 大元素值取得、 big_ele_id = ' ||
1765 ele_row.big_ele_id || ' element_name=' ||
1766 ele_row.element_name || ' ele_type_update=' ||
1767 ele_row.ele_type_update || ' ele_weight1=' ||
1768 ele_row.ele_weight1 || ' tarsys_id=' ||
1769 ele_row.tarsys_id || ' target_id=' ||
1770 ele_row.target_id || ' formula_bm=' ||
1771 ele_row.formula_bm);*/
1772 small_ele_idx := 0;
1773
1774 --(1)得到此大元素的小元素序列,并循环把小元素的值存入变量中。
1775 Open Cur_ele_small;
1776 loop
1777 --主循环
1778 fetch Cur_ele_small
1779 into l_small_ele_t(small_ele_idx);
1780 exit when Cur_ele_small%NOTFOUND;
1781
1782 ---
1783 /*DBMS_OUTPUT.PUT_LINE(' 2.2\小元素值循环调用 、num = ' || l_small_ele_t(small_ele_idx)
1784 .rownum || ' ele_id=' || l_small_ele_t(small_ele_idx)
1785 .ele_id || ' er_value=' || l_small_ele_t(small_ele_idx)
1786 .er_value);*/
1787
1788 small_ele_idx := small_ele_idx + 1;
1789
1790 end LOOP;
1791 close Cur_ele_small;
1792
1793 /* 代码例子备用
1794 for idx in 1 .. 5 loop -- 初始化数据
1795 l_small_ele_t(idx).rownum :=idx;
1796 l_small_ele_t(idx).ele_id := 'xxxxx' ||idx;
1797 l_small_ele_t(idx).er_value := 'F' ;
1798 END loop;*/
1799
1800 --(2)根据大元素的公式标记 进入相对应的算法 计算得分S1
1801
1802 /*
1803 NHYSZQL 指标元素体系-能耗预算准确率 S1=(A2-A1)/A1*100
1804 FJWCL 指标元素体系-分解完成率 S1=(A2-A1)/A1*100
1805 WNCXL 指标元素体系-物耗能耗创新率 S1=A1/A2*100
1806 WNWCL 指标元素体系-能耗物耗完成率 S1=A1/A2*100
1807 CLJH 指标元素体系-产量计划 S1=A2/A1
1808 CLCX1 指标元素体系-产量创新
1809 CLCX3 指标元素体系-产量创新
1810 CLCX4 指标元素体系-产量创新
1811 CLCX5 指标元素体系-产量创新
1812 CLCX6 指标元素体系-产量创新
1813 CLCX7 指标元素体系-产量创新
1814 ZLDF 质量
1815 SSL 损失率*/
1816
1817 --/* SSL
1818 IF ele_row.formula_bm = 'SSL' THEN
1819
1820 BEGIN
1821 ln_a1 := l_small_ele_t(0).er_value; --计划值
1822 ln_a2 := l_small_ele_t(1).er_value; -- 实际值
1823
1824 IF ln_a2 IS NULL OR ln_a1 IS NULL OR ln_a1 = 0 THEN
1825 ln_s1 := 0;
1826 ELSE
1827 ln_s1 := ln_a2 / ln_a1 * 100;
1828 END IF;
1829 EXCEPTION
1830 WHEN OTHERS THEN
1831 ln_s1 := 0;
1832 END;
1833
1834 -- S = f(s1) 根据S1 计算S的过程,每个算法均可能不同
1835 IF ln_s1 = 0 THEN
1836 ln_S := 0;
1837 ELSE
1838
1839 IF ln_s1 <= 90 THEN
1840 ln_S := 110;
1841 END IF;
1842 IF ln_s1 > 90 AND ln_s1 <= 110 THEN
1843 ln_S := ln_s1;
1844 END IF;
1845 IF ln_s1 > 110 THEN
1846 ln_S := 0;
1847 END IF;
1848
1849 END IF;
1850
1851 END IF;
1852
1853 --/* NHYSZQL S1=(A2-A1)/A1*100
1854 IF ele_row.formula_bm = 'NHYSZQL' THEN
1855
1856 BEGIN
1857 ln_a1 := l_small_ele_t(0).er_value;
1858 ln_a2 := l_small_ele_t(1).er_value;
1859
1860 IF ln_a2 IS NULL OR ln_a1 IS NULL OR ln_a1 = 0 THEN
1861 ln_s1 := 0;
1862 ELSE
1863 ln_s1 := (ln_a2 - ln_a1) / ln_a1 * 100;
1864 END IF;
1865 EXCEPTION
1866 WHEN OTHERS THEN
1867 ln_s1 := 0;
1868 END;
1869
1870 -- S = f(s1)根据S1 计算S的过程,每个算法均可能不同
1871
1872 ln_S := PACK_KPI_KERNEL.Get_OneTarget_Score(ele_row.tarsys_id,
1873 ln_s1);
1874
1875 END IF;
1876
1877 --/* FJWCL S1=(A2-A1)/A1*100
1878 IF ele_row.formula_bm = 'FJWCL' THEN
1879
1880 BEGIN
1881 ln_a1 := l_small_ele_t(0).er_value;
1882 ln_a2 := l_small_ele_t(1).er_value;
1883
1884 IF ln_a2 IS NULL OR ln_a1 IS NULL OR ln_a1 = 0 THEN
1885 ln_s1 := 0;
1886 ELSE
1887 ln_s1 := (ln_a2 - ln_a1) / ln_a1 * 100;
1888 ln_s1 := ln_s1 * (ln_a1 / abs(ln_a1));
1889 END IF;
1890 EXCEPTION
1891 WHEN OTHERS THEN
1892 ln_s1 := 0;
1893 END;
1894
1895 -- S = f(s1)根据S1 计算S的过程,每个算法均可能不同
1896
1897 ln_S := PACK_KPI_KERNEL.Get_OneTarget_Score(ele_row.tarsys_id,
1898 ln_s1);
1899
1900 END IF;
1901
1902 --WNCXL S1=A1/A2*100
1903 IF ele_row.formula_bm = 'WNCXL' THEN
1904
1905 BEGIN
1906 ln_a1 := l_small_ele_t(0).er_value;
1907 ln_a2 := l_small_ele_t(1).er_value;
1908
1909 IF ln_a2 IS NULL OR ln_a1 IS NULL OR ln_a1 = 0 THEN
1910 ln_s1 := 0;
1911 ELSE
1912 ln_s1 := (ln_a1 / ln_a2) * 100;
1913 END IF;
1914 EXCEPTION
1915 WHEN OTHERS THEN
1916 ln_s1 := 0;
1917 END;
1918
1919 -- S = f(s1) 根据S1 计算S的过程,每个算法均可能不同
1920 IF ln_s1 = 0 THEN
1921 ln_S := 0;
1922 ELSE
1923
1924 IF ln_s1 < 100 THEN
1925 ln_S := 0;
1926 END IF;
1927 IF ln_s1 >= 100 AND ln_s1 <= 105 THEN
1928 ln_S := ln_s1;
1929 END IF;
1930 IF ln_s1 > 105 THEN
1931 ln_S := 105;
1932 END IF;
1933
1934 END IF;
1935
1936 END IF;
1937
1938 --WNCXL S1=A1/A2*100
1939 IF ele_row.formula_bm = 'WNCXL2' THEN
1940
1941 BEGIN
1942 ln_a1 := l_small_ele_t(0).er_value;
1943 ln_a2 := l_small_ele_t(1).er_value;
1944
1945 IF ln_a2 IS NULL OR ln_a1 IS NULL OR ln_a2 = 0 THEN
1946 ln_s1 := 0;
1947 ELSE
1948 ln_s1 := (ln_a2 / ln_a1) * 100;
1949 END IF;
1950 EXCEPTION
1951 WHEN OTHERS THEN
1952 ln_s1 := 0;
1953 END;
1954
1955 -- S = f(s1) 根据S1 计算S的过程,每个算法均可能不同
1956 IF ln_s1 = 0 THEN
1957 ln_S := 0;
1958 ELSE
1959
1960 IF ln_s1 < 100 THEN
1961 ln_S := 0;
1962 END IF;
1963 IF ln_s1 >= 100 AND ln_s1 <= 105 THEN
1964 ln_S := ln_s1;
1965 END IF;
1966 IF ln_s1 > 105 THEN
1967 ln_S := 105;
1968 END IF;
1969
1970 END IF;
1971
1972 END IF;
1973
1974 -- WNWCL S1=A1/A2*100
1975 IF ele_row.formula_bm = 'WNWCL' THEN
1976
1977 BEGIN
1978 ln_a1 := l_small_ele_t(0).er_value;
1979 ln_a2 := l_small_ele_t(1).er_value;
1980
1981 IF ln_a2 IS NULL OR ln_a1 IS NULL OR ln_a2 = 0 THEN
1982 ln_s1 := 0;
1983 ELSE
1984 ln_s1 := pack_kpi_base.F_GET_CFYS(ln_a1, ln_a2) * 100;
1985 END IF;
1986
1987 EXCEPTION
1988 WHEN OTHERS THEN
1989 ln_s1 := 0;
1990 END;
1991
1992 -- S = f(s1) 根据S1 计算S的过程,每个算法均可能不同
1993 IF ln_s1 = 0 THEN
1994 ln_S := 0;
1995 ELSE
1996
1997 IF ln_s1 < 90 THEN
1998 ln_S := 0;
1999 END IF;
2000 IF ln_s1 >= 90 AND ln_s1 <= 105 THEN
2001 ln_S := ln_s1;
2002 END IF;
2003 IF ln_s1 > 105 THEN
2004 ln_S := 105;
2005 END IF;
2006
2007 END IF;
2008
2009 END IF;
2010
2011 --CLJH 指标元素体系-产量计划S1=A2/A1
2012 IF ele_row.formula_bm = 'CLJH' THEN
2013
2014 BEGIN
2015 ln_a1 := l_small_ele_t(0).er_value;
2016 ln_a2 := l_small_ele_t(1).er_value;
2017
2018 IF ln_a2 IS NULL OR ln_a1 IS NULL OR ln_a1 = 0 THEN
2019 ln_s1 := 0;
2020 ELSE
2021 ln_s1 := pack_kpi_base.F_GET_CFYS(ln_a2, ln_a1);
2022 END IF;
2023
2024 EXCEPTION
2025 WHEN OTHERS THEN
2026 ln_s1 := 0;
2027 END;
2028
2029 -- S = f(s1) 根据S1 计算S的过程,每个算法均可能不同
2030 IF ln_s1 = 0 THEN
2031 ln_S := 0;
2032 ELSE
2033
2034 IF ln_s1 > 1.04 THEN
2035 ln_S := 1.04;
2036 ELSE
2037 ln_S := ln_s1;
2038 END IF;
2039
2040 END IF;
2041
2042 END IF;
2043
2044 /* 较复杂待编写
2045 CLCX1 指标元素体系-产量创新
2046 CLCX2 指标元素体系-产量创新
2047 CLCX3 指标元素体系-产量创新
2048 CLCX4 指标元素体系-产量创新
2049 CLCX5 指标元素体系-产量创新
2050 CLCX6 指标元素体系-产量创新
2051 CLCX7 指标元素体系-产量创新
2052 */
2053
2054 --CLCX1 指标元素体系-产量计划S1=A2/A1
2055 IF ele_row.formula_bm = 'CLCX1' THEN
2056
2057 BEGIN
2058 ln_a1 := l_small_ele_t(0).er_value;
2059 ln_a2 := l_small_ele_t(1).er_value;
2060 ln_a3 := l_small_ele_t(2).er_value;
2061 ln_a4 := l_small_ele_t(3).er_value;
2062 ln_a5 := l_small_ele_t(4).er_value;
2063
2064 DBMS_OUTPUT.PUT_LINE(' CLCX1计算过程及结果 、ln_a1 = ' ||
2065 ln_a1 || 'ln_a2 = ' || ln_a2 || ' ln_a3 =' ||
2066 ln_a3 || ' ln_a4 =' || ln_a4);
2067
2068 --若实际值为0,则结果为0
2069 if nvl(ln_a1, 0) = 0 then
2070 ---
2071 ln_s := 0;
2072
2073 ELSE
2074 ---
2075 ln_a1 := pack_kpi_base.F_GET_CFYS(ln_a1, ln_a5);
2076
2077 --a2,a3,a4,均不为空
2078 IF nvl(ln_a2, 0) <> 0 and nvl(ln_a3, 0) <> 0 and
2079 nvl(ln_a4, 0) <> 0 THEN
2080
2081 IF ln_a1 > ln_a4 THEN
2082 ln_s := (ln_a1 - ln_a4) / ln_a4 * 300 +
2083 (ln_a4 - ln_a3) / ln_a3 * 200 +
2084 (ln_a3 - ln_a2) / ln_a2 * 100;
2085 ELSIF ln_a1 > ln_a3 THEN
2086 ln_s := (ln_a1 - ln_a3) / ln_a3 * 200 +
2087 (ln_a3 - ln_a2) / ln_a2 * 100;
2088 ELSIF ln_a1 > ln_a2 THEN
2089 ln_s := (ln_a1 - ln_a2) / ln_a2 * 100;
2090 ELSIF ln_a1 < ln_a2 THEN
2091 ln_s := 0;
2092
2093 END IF;
2094
2095 IF ln_s > 30 THEN
2096 ln_s := 30;
2097 END IF;
2098
2099 END IF;
2100
2101 --a2,a3,均不为空 a4 = 空
2102 IF nvl(ln_a2, 0) <> 0 and nvl(ln_a3, 0) <> 0 and
2103 nvl(ln_a4, 0) = 0 THEN
2104
2105 IF ln_a1 > ln_a3 THEN
2106 ln_s := (ln_a1 - ln_a3) / ln_a3 * 200 +
2107 (ln_a3 - ln_a2) / ln_a2 * 100;
2108 ELSIF ln_a1 > ln_a2 THEN
2109 ln_s := (ln_a1 - ln_a2) / ln_a2 * 100;
2110 ELSIF ln_a1 < ln_a2 THEN
2111 ln_s := 0;
2112 END IF;
2113
2114 IF ln_s > 20 THEN
2115 ln_s := 20;
2116 END IF;
2117 END IF;
2118
2119 --a2,不为空 a3,a4 = 空
2120 IF nvl(ln_a2, 0) <> 0 and nvl(ln_a3, 0) = 0 and
2121 nvl(ln_a4, 0) = 0 THEN
2122
2123 IF ln_a1 > ln_a2 THEN
2124 ln_s := (ln_a1 - ln_a2) / ln_a2 * 100;
2125 ELSE
2126 IF ln_a1 < ln_a2 THEN
2127 ln_s := 0;
2128
2129 END IF;
2130
2131 IF ln_s > 10 THEN
2132 ln_s := 10;
2133 END IF;
2134 END IF;
2135
2136 END IF;
2137
2138 END IF;
2139 EXCEPTION
2140 WHEN OTHERS THEN
2141 ln_s := 0;
2142 END;
2143
2144 END IF;
2145
2146 --CLCX2 指标元素体系-产量计划S1=A2/A1
2147 IF ele_row.formula_bm = 'CLCX2' THEN
2148
2149 BEGIN
2150 ln_a1 := l_small_ele_t(0).er_value;
2151 ln_a2 := l_small_ele_t(1).er_value;
2152 ln_a3 := l_small_ele_t(2).er_value;
2153 ln_a4 := l_small_ele_t(3).er_value;
2154
2155 --若实际值为0,则结果为0
2156 if nvl(ln_a1, 0) = 0 then
2157 ---
2158 ln_s := 0;
2159
2160 ELSE
2161 ---
2162
2163 ln_a1 := pack_kpi_base.F_GET_CFYS(ln_a1, ln_a4); -- 求日产量
2164
2165 --a2,a3,均不为空
2166 IF nvl(ln_a2, 0) <> 0 and nvl(ln_a3, 0) <> 0 THEN
2167
2168 IF ln_a1 > ln_a3 THEN
2169 ln_s := (ln_a1 - ln_a3) / ln_a3 * 200 +
2170 (ln_a3 - ln_a2) / ln_a2 * 100;
2171 ELSIF ln_a1 > ln_a2 THEN
2172 ln_s := (ln_a1 - ln_a2) / ln_a2 * 100;
2173 ELSIF ln_a1 < ln_a2 THEN
2174 ln_s := 0;
2175 END IF;
2176
2177 IF ln_s > 20 THEN
2178 ln_s := 20;
2179 END IF;
2180 END IF;
2181
2182 --a2,不为空 a3, = 空
2183 IF nvl(ln_a2, 0) <> 0 and nvl(ln_a3, 0) = 0 THEN
2184
2185 IF ln_a1 > ln_a2 THEN
2186 ln_s := (ln_a1 - ln_a2) / ln_a2 * 100;
2187 ELSE
2188 IF ln_a1 < ln_a2 THEN
2189 ln_s := 0;
2190
2191 END IF;
2192
2193 IF ln_s > 10 THEN
2194 ln_s := 10;
2195 END IF;
2196 END IF;
2197
2198 END IF;
2199
2200 END IF;
2201 EXCEPTION
2202 WHEN OTHERS THEN
2203 ln_s := 0;
2204 END;
2205
2206 END IF;
2207
2208 --CLCX3 S1=(A1+A2+A3+A4+A5+A6)*0.15
2209 IF ele_row.formula_bm = 'CLCX3' THEN
2210
2211 BEGIN
2212 ln_a1 := l_small_ele_t(0).er_value;
2213 ln_a2 := l_small_ele_t(1).er_value;
2214 ln_a3 := l_small_ele_t(2).er_value;
2215 ln_a4 := l_small_ele_t(3).er_value;
2216 ln_a5 := l_small_ele_t(4).er_value;
2217 ln_a6 := l_small_ele_t(5).er_value;
2218
2219 ln_s := (ln_a1 + ln_a2 + ln_a3 + ln_a4 + ln_a5 + ln_a6) * 0.15;
2220
2221 EXCEPTION
2222 WHEN OTHERS THEN
2223 ln_s := 0;
2224 END;
2225
2226 END IF;
2227
2228 --CLCX4 S1=(A1+A2+A3+A4+A5)*0.2
2229 IF ele_row.formula_bm = 'CLCX4' THEN
2230
2231 BEGIN
2232 ln_a1 := l_small_ele_t(0).er_value;
2233 ln_a2 := l_small_ele_t(1).er_value;
2234 ln_a3 := l_small_ele_t(2).er_value;
2235 ln_a4 := l_small_ele_t(3).er_value;
2236 ln_a5 := l_small_ele_t(4).er_value;
2237
2238 ln_s := (ln_a1 + ln_a2 + ln_a3 + ln_a4 + ln_a5) * 0.2;
2239
2240 EXCEPTION
2241 WHEN OTHERS THEN
2242 ln_s := 0;
2243 END;
2244
2245 END IF;
2246
2247 --CLCX5 S1=(A1+A2)/A3
2248 IF ele_row.formula_bm = 'CLCX5' THEN
2249
2250 BEGIN
2251 ln_a1 := l_small_ele_t(0).er_value;
2252 ln_a2 := l_small_ele_t(1).er_value;
2253 ln_a3 := l_small_ele_t(2).er_value;
2254
2255 ln_s := pack_kpi_base.F_GET_CFYS(ln_a1 + ln_a2, ln_a3);
2256
2257 EXCEPTION
2258 WHEN OTHERS THEN
2259 ln_s := 0;
2260 END;
2261
2262 END IF;
2263
2264 --CLCX6 S1=(A1+A2)/A3/24
2265 IF ele_row.formula_bm = 'CLCX6' THEN
2266
2267 BEGIN
2268 ln_a1 := l_small_ele_t(0).er_value;
2269 ln_a2 := l_small_ele_t(1).er_value;
2270 ln_a3 := l_small_ele_t(2).er_value;
2271
2272 ln_s := pack_kpi_base.F_GET_CFYS(ln_a1 + ln_a2, ln_a3) / 24;
2273
2274 EXCEPTION
2275 WHEN OTHERS THEN
2276 ln_s := 0;
2277 END;
2278
2279 END IF;
2280
2281 --CLCX7 S1=A1/A2
2282 IF ele_row.formula_bm = 'CLCX7' THEN
2283
2284 BEGIN
2285 ln_a1 := l_small_ele_t(0).er_value;
2286 ln_a2 := l_small_ele_t(1).er_value;
2287
2288 ln_s1 := pack_kpi_base.F_GET_CFYS(ln_a1, ln_a2);
2289 IF ln_s1 > 1 THEN
2290 ln_s := 3;
2291 ELSE
2292 ln_s := 0;
2293 END IF;
2294
2295 EXCEPTION
2296 WHEN OTHERS THEN
2297 ln_s := 0;
2298 END;
2299
2300 END IF;
2301
2302 --zfdl S = a1 - a2
2303 IF ele_row.formula_bm = 'ZLDF' THEN
2304
2305 BEGIN
2306 ln_a1 := l_small_ele_t(0).er_value;
2307 ln_a2 := l_small_ele_t(1).er_value;
2308
2309 IF ln_a1 = 0 THEN
2310 --除数为零结果为零
2311 ln_s := 0;
2312 ELSE
2313 ln_s := (pack_kpi_base.F_GET_CFYS(ln_a1, ln_a2) - 1) * 1000 * 5;
2314 END IF;
2315
2316 --上下限修正
2317 IF ln_s > 50 THEN
2318 ln_s := 50;
2319 END IF;
2320
2321 IF ln_s < -50 THEN
2322 ln_s := -50;
2323 END IF;
2324
2325 EXCEPTION
2326 WHEN OTHERS THEN
2327 ln_s := 0;
2328 END;
2329 END IF;
2330
2331 --test
2332 /* DBMS_OUTPUT.PUT_LINE(' 2.3\权重修正前的s ' || 'ln_s1 = ' ||
2333 ln_s1 || ' ln_s =' || ln_s);*/
2334
2335 --(4)根据大元素的权重类型 进行权重修正。 --测试时NVl为1,正式时为0
2336 ln_S := ln_S * nvl(ele_row.ele_weight1, 100) / 100 *
2337 nvl(ele_row.ele_weight2, 100) / 100;
2338 ln_S := round(ln_S, 2);
2339 --test
2340 /*DBMS_OUTPUT.PUT_LINE(' 2.4\计算过程及结果 、ele_id = ' ||
2341 ele_row.big_ele_id || 'ln_s1 = ' || ln_s1 ||
2342 ' ln_s =' || ln_s);*/
2343
2344 --(5) 结果更新
2345
2346 merge into kpi_manager_boelement_result t1
2347 using (select ele_row.big_ele_id ele_id,
2348 ln_S er_value,
2349 ls_date update_date
2350
2351 from dual
2352
2353 ) t2
2354 on (t1.ele_id || t1.er_month = t2.ele_id || t2.update_date)
2355 WHEN MATCHED THEN
2356 UPDATE
2357 SET t1.er_value = t2.er_value, t1.er_date = SYSDATE
2358 WHERE t1.ele_id = t2.ele_id
2359 and t1.er_month = t2.update_date
2360
2361
2362 WHEN NOT MATCHED THEN
2363 INSERT
2364 (
2365
2366 ELE_ID,
2367 ER_MONTH,
2368 ER_VALUE,
2369 --ER_VALUE2,
2370 ER_DATE)
2371 VALUES
2372 (t2.ele_id, t2.update_date, t2.er_value, SYSDATE);
2373
2374 COMMIT;
2375
2376 end loop; --主循环结束
2377
2378 close Cur_ele_big; --游标关闭
2379
2380 --==================================================
2381 --第三部分 将临时表中计算得到的大元素的值 整体更新入元素结果表
2382 --==================================================
2383
2384 END BOELEMENT_MASTER_CONTROL;
2385
2386 --====================================================================
2387 --====================================================================
2388 --取值
2389 FUNCTION GET_BOELEMENT(as_ele_id IN VARCHAR2, as_date IN VARCHAR2)
2390 RETURN NUMBER AS
2391
2392 ln_RESULT NUMBER;
2393 ln_defaultvalue NUMBER;
2394 ls_SQL LONG;
2395
2396 ls_SJ_SQL LONG;
2397 ls_JH_SQL LONG;
2398
2399 ls_pa varchar2(4000);
2400 ls_temp varchar2(4000);
2401 ls_NF varchar2(10);
2402 ls_source varchar2(10);
2403
2404 ls_ele_name varchar2(4000);
2405
2406 --手动取数:计划值取上月的数据,其它数据取默认值
2407 ls_ele_type varchar2(50);
2408 BEGIN
2409 ls_NF := pack_kpi_base.F_GET_NF(as_date);
2410 --1、根据元素ID取的SQL,若没有,则取默认值。转4
2411 BEGIN
2412 SELECT t.elemnt_soruce, t.source
2413 INTO ls_SJ_SQL, ls_source
2414 FROM kpi_manager_boelement t
2415 WHERE t.ele_id = as_ele_id
2416 AND rownum = 1;
2417 EXCEPTION
2418 WHEN no_data_found THEN
2419 ls_SJ_SQL := '0'; --elemnt_soruce 字段没有值或者值为0,就说明无法自动取数
2420 END;
2421
2422 BEGIN
2423 SELECT t.defaultvalue, t.element_name, t.ele_type
2424 INTO ln_defaultvalue, ls_ele_name, ls_ele_type
2425 FROM kpi_manager_boelement t
2426 WHERE t.ele_id = as_ele_id
2427 AND rownum = 1;
2428 EXCEPTION
2429 WHEN no_data_found THEN
2430 ln_defaultvalue := 0;
2431 END;
2432
2433 --第一种情况:手动取数:计划值取上月数据,其它数据取默认值
2434 if ls_source = 1 then
2435 --计划值取上月数据
2436 if ls_ele_type = '指标值' then
2437
2438 -- ln_RESULT:=0;
2439
2440 select round(nvl(t.VALUE_DATA, 0), 2) er_value
2441 into ln_RESULT
2442 from KPI_FLU_FLOW_RESULT_NEW_V t
2443 where t.TARGET_ID = as_ele_id
2444 and t.REC_MONTH =
2445 to_char(add_months(to_date(as_date || '-01', 'yyyy-MM-dd'),
2446 -1),
2447 'yyyy-MM')
2448 and t.s_code = 8 --已发布
2449 ;
2450
2451 --其它的取默认值
2452 else
2453 ln_RESULT := ln_defaultvalue;
2454 end if;
2455 --#######临时注释########################################################################
2456 --dbms_output.put_line('ELE_ID: ' || as_ele_id || ls_ele_name ||
2457 -- ' 手动取数 默认值');
2458
2459 else
2460 --第二种情况:自动取数,但无SQL
2461 --重要判断 --临时屏蔽,取数口径,自动还是手动,0自动,1手动
2462 IF ls_SJ_SQL = '0' OR ls_SJ_SQL IS NULL THEN
2463 --OR ls_source = 1 THEN
2464
2465 ln_RESULT := ln_defaultvalue;
2466 --#######临时注释########################################################################
2467 --dbms_output.put_line('ELE_ID: ' || as_ele_id || ls_ele_name ||
2468 --' 无SQl 默认值');
2469 --第三种情况:自动取数,有sql
2470 ELSE
2471 --SQL顺利取到,开始取数部分
2472 --2、处理SQL 替换各类信息
2473 BEGIN
2474 --'[#date#]' 'yyyy-mm'格式日期
2475 ls_SJ_SQL := replace(ls_SJ_SQL, '[#date#]', as_date);
2476
2477 --'[#gcdm#]' 工厂代码
2478 ls_SJ_SQL := replace(ls_SJ_SQL,
2479 '[#gcdm#]',
2480 pack_kpi_base.F_GET_GCDM_FROM_ELEID(as_ele_id));
2481
2482 --'[#erp_lr_yf#]' ERP月份 HSLMM
2483 ls_SJ_SQL := replace(ls_SJ_SQL,
2484 '[#erp_lr_yf#]',
2485 'HSL' || pack_kpi_base.F_GET_MM(as_date));
2486
2487 --'[#NF#]' 'yyyy'格式年份
2488 ls_SJ_SQL := replace(ls_SJ_SQL, '[#NF#]', ls_NF);
2489
2490 --修正系数(累计利润)
2491 --'[#curMonth#]' --当前月份
2492 ls_SJ_SQL := replace(ls_SJ_SQL,
2493 '[#curMonth#]',
2494 pack_kpi_base.F_GET_MM(as_date));
2495 --'[#ele_id#]' --元素ID
2496 ls_SJ_SQL := replace(ls_SJ_SQL, '[#ele_id#]', as_ele_id);
2497
2498 --3、执行SQL 取值
2499
2500 execute immediate ls_SJ_SQL
2501 into ln_RESULT;
2502 /* dbms_output.put_line('ELE_ID: ' || as_ele_id || ls_ele_name ||
2503 ' SQl ##OK## 取的的值 ' || ln_RESULT ||
2504 ' 成功的SQL:' || ls_SJ_SQL);
2505 */
2506 IF ln_RESULT IS NULL THEN
2507 ln_RESULT := NULL;
2508 END IF;
2509
2510 --4、最终结果处理并返回。
2511
2512 EXCEPTION
2513 WHEN OTHERS THEN
2514 --pack_kpi_base.SET_SYSTEM_LOG('元素取值错误','配置的SQl执行报错,结果返回默认值'||ls_SJ_SQL);
2515 --#######临时注释########################################################################
2516 --dbms_output.put_line('ELE_ID: ' || as_ele_id || ls_ele_name ||
2517 --' SQl执行报错或没有取得 默认值 SQL:' || ls_SJ_SQL);
2518 ln_RESULT := ln_defaultvalue;
2519 END;
2520
2521 END IF;
2522 end if;
2523 RETURN round(nvl(ln_RESULT, 0), 3);
2524 END GET_BOELEMENT;
2525
2526 --代码保留
2527 --begin
2528 /*loop
2529 exit when instr(v_GS,'[#')=0;
2530 v_pa:=substr(v_GS,instr(v_GS,'[#')+2,instr(v_GS,'#]')-instr(v_GS,'[#')-2);
2531 select CSTQFF into v_temp from tech_device_base_para_day_t where upper(CSDM)=upper(v_pa) and rownum=1;
2532
2533 v_GS:=replace(v_GS,'[#'||v_pa||'#]',v_temp);
2534 end loop;*/
2535
2536 --取实际值过程
2537
2538 /* --SQL例子
2539 (
2540 select sum(mesfctrafmval)
2541 from mb_zbsj_v
2542 where mes_fctr_id ='26'
2543 and mtrl_id='1540015'
2544 and tzzdm='Z5YS0307'
2545 and begtime=last_day(add_months('{#KSSJ#}', -1))
2546 and endtime=last_day('{#KSSJ#}')-1
2547 and id='431'
2548 )*/
2549
2550 /* v_GS:=replace(v_GS,'{#KSSJ#}',p_rq);*/
2551
2552 --ls_SQL:='select '||ls_SJ_SQL||' from dual';
2553
2554 --execute immediate ls_SQL into ln_RESULT;
2555
2556 --dbms_output.put_line(v_SQL,4000);
2557 -- EXCEPTION
2558 -- WHEN TOO_MANY_ROWS or ZERO_DIVIDE then
2559 -- Result:=999.99;
2560 --WHEN OTHERS THEN
2561 -- Result:=0;
2562 --end;
2563
2564 --====================================================================
2565
2566 function KPI_SplitElementEx(P_STRING IN VARCHAR2, as_date IN VARCHAR2)
2567 return NUMBER is
2568 --分解结构[#x#]*常量+[#y#].......公式,并置换为所需要的数值,完成绩效指标公式的运算。函数使用字符串分解办法进行
2569 --Fantasy_Van 2011.6.30
2570 --V_POS为需要的变量[#x#],而后下一个函数对该变量进行处理,取得所需要的数值并返回,置换出原有的内容,V_POS_MID为取得的数值
2571 --E: [#111#]+[#222#]经过置换后成为: 23.12+[#222#]
2572 Result NUMBER;
2573 ls_date VARCHAR2(20);
2574 V_POS VARCHAR2(2000);
2575 V_POS_MID VARCHAR2(2000);
2576 iPosHead INT := 1;
2577 iPosEnd INT := 0;
2578 V_ResultEnd LONG;
2579 ln_num NUMBER;
2580 i INT := 0;
2581 L_STRING VARCHAR2(2000);
2582 BEGIN
2583 --参数处理
2584 IF as_date IS NULL THEN
2585 ls_date := GET_KPI_DATE();
2586 ELSE
2587 ls_date := as_date;
2588 END IF;
2589
2590 L_STRING := P_STRING;
2591 IF Length(L_STRING) > 0 THEN
2592 LOOP
2593 SELECT INSTR(L_STRING, '[#') Into iPosHead FROM dual;
2594 SELECT INSTR(L_STRING, '#]') - INSTR(L_STRING, '[#') + 2
2595 Into iPosEnd
2596 FROM dual;
2597 if iPosHead < 1 THEN
2598 EXIT;
2599 END IF;
2600 SELECT substr(L_STRING, iPosHead, iPosEnd) Into V_POS FROM dual;
2601 V_POS_MID := KPI_SplitElementGetRS(V_POS, ls_date);
2602 L_STRING := REPLACE(L_STRING, V_POS, V_POS_MID);
2603 END LOOP;
2604 END IF;
2605 V_ResultEnd := L_STRING;
2606 IF Length(L_STRING) = 0 THEN
2607 V_ResultEnd := '00000000';
2608 END IF;
2609
2610 BEGIN
2611
2612 V_ResultEnd := 'SELECT ' || V_ResultEnd || ' FROM dual';
2613 Dbms_Output.Put_Line(V_ResultEnd);
2614 BEGIN
2615 execute immediate V_ResultEnd
2616 into ln_num;
2617 EXCEPTION
2618 WHEN OTHERS THEN
2619 ln_num := -9999;
2620 END;
2621 RETURN ln_num;
2622
2623 END;
2624 end KPI_SplitElementEx;
2625
2626 function KPI_SplitElementGetRS(as_V_POS IN VARCHAR2, as_date IN VARCHAR2)
2627 return VARCHAR2 is
2628 --取得所需要的元素的数值 Fantasy_Van 2011-6.30
2629 Result VARCHAR2(2000);
2630 ELEM_ID_RESSULT VARCHAR2(2000);
2631 L_V_POS VARCHAR2(2000);
2632 V_POS_MID VARCHAR2(2000);
2633 iHead INT := 0;
2634 iEnd INT := 0;
2635 v_exist int := 0;
2636 BEGIN
2637 BEGIN
2638 L_V_POS := as_V_POS;
2639 SELECT INSTR(L_V_POS, '[#') Into iHead FROM dual;
2640 SELECT INSTR(L_V_POS, '#]') Into iEnd FROM dual;
2641 V_POS_MID := SUBSTR(L_V_POS, iHead + 2, iEnd - iHead - 2);
2642
2643 --元素取值
2644 select count(1)
2645 into v_exist
2646 FROM kpi_manager_boelement_result t
2647 WHERE t.er_month = as_date
2648 AND t.ele_id = V_POS_MID;
2649
2650 --当kpi_manager_boelement_result表中没有此元素时,取元素表中的默认值
2651 --出现场景:新增指标和元素
2652 if v_exist <> 0 then
2653 SELECT t.er_value
2654 INTO ELEM_ID_RESSULT
2655 FROM kpi_manager_boelement_result t
2656 WHERE t.er_month = as_date
2657 AND t.ele_id = V_POS_MID;
2658 else
2659 select nvl(e.defaultvalue, 0)
2660 into ELEM_ID_RESSULT
2661 from kpi_manager_boelement e
2662 where e.ele_id = V_POS_MID;
2663 end if;
2664
2665 EXCEPTION
2666 WHEN OTHERS THEN
2667 dbms_output.put_line(Sqlerrm(SQLCODE));
2668 END;
2669
2670 Result := nvl(ELEM_ID_RESSULT, 0);
2671 return Result;
2672 EXCEPTION
2673 WHEN OTHERS THEN
2674 return 0;
2675
2676 end KPI_SplitElementGetRS;
2677
2678 --====================================================================
2679 --定时取指标实际值计划值
2680 --=-=-==-=-=-=-=-------------------------------
2681 PROCEDURE KERNEL_TARGET_DATA_MAIN(AS_MONTH IN VARCHAR2) AS
2682 --定义一
2683
2684 LS_MONTH VARCHAR2(20);
2685 BEGIN
2686 DBMS_OUTPUT.ENABLE(10000000);
2687 --参数处理
2688 IF LS_MONTH IS NULL THEN
2689 LS_MONTH := GET_KPI_DATE();
2690 ELSE
2691 LS_MONTH := AS_MONTH;
2692 END IF;
2693
2694 /* 1 原BO新增加 量化指标 的处理。
2695 仿照訾海原程序中写入各种表数据
2696 2 公式计算模块
2697 调用GET_SPLITE_ELEMENT_EX 分解公式字符串,并返回元素的值
2698 实现每月kpi_kernel_target_data 表中量化指标的数据的生成
2699 */
2700
2701 BEGIN
2702 --更新标记
2703 UPDATE kpi_manager_boresult t SET t.useflag = '1';
2704
2705 --写入新数据
2706 INSERT INTO kpi_manager_boresult
2707 (BORESULTID,
2708 TARGET_CODE,
2709 TARGET_NAME,
2710 BODATA,
2711 BODATA2,
2712 BOGETDATE,
2713 USEFLAG,
2714 update_date)
2715 SELECT seq_kpi_manager_boresult.nextval,
2716 t.target_id,
2717 TARGET_NAME,
2718 decode(FORMULA,
2719 NULL,
2720 0,
2721 KPI_SplitElementEx(FORMULA, LS_MONTH)) VALUE_DATA, --实际值
2722 decode(FORMULA2,
2723 NULL,
2724 0,
2725 KPI_SplitElementEx(FORMULA2, LS_MONTH)) VALUE_PLAN, --计划值
2726 pack_kpi_base.F_GET_BYM(LS_MONTH) REC_MONTH,
2727 '0',
2728 SYSDATE
2729 FROM kpi_kpimodel_kpitarget T
2730 WHERE T.TARGET_TYPE = 0
2731 AND T.TARGET_USEFLAG = 0
2732 AND t.target_name <> '专项指标';
2733
2734 --更新标准值
2735 UPDATE kpi_kpimodel_kpitarget t
2736 SET t.standardvalue = decode(t.FORMULA2,
2737 NULL,
2738 0,
2739 KPI_SplitElementEx(t.FORMULA2, LS_MONTH))
2740 WHERE T.TARGET_TYPE = 0
2741 AND T.TARGET_USEFLAG = 0
2742 AND t.target_name <> '专项指标';
2743
2744 COMMIT;
2745
2746 EXCEPTION
2747 WHEN OTHERS THEN
2748 ROLLBACK;
2749 dbms_output.put_line('定时取指标实际值计划值' || SQLERRM(SQLCODE));
2750 END;
2751
2752 END KERNEL_TARGET_DATA_MAIN;
2753 --=================================================================================
2754 --====================================================================
2755 procedure KPI_VIEW_TARGET --集团指标取数(月完成)
2756 as
2757 var_TID NUMBER;
2758 val_T_SQL varchar2(500);
2759 val_source number;
2760 val_result varchar2(50);
2761 var_date varchar2(10);
2762
2763 --表级循环,需要用游标
2764 target_row KPI_VIEW_TARGET_SQL_T%rowtype;
2765
2766 cursor rows is
2767 select * from KPI_VIEW_TARGET_SQL_T;
2768
2769 begin
2770 var_date := GET_KPI_DATE(); --获取日期
2771 --循环执行sql
2772 for target_row in rows loop
2773 val_T_SQL := target_row.t_sql;
2774 val_source := target_row.source;
2775 var_TID := target_row.tid;
2776 if (val_source = 0 and val_T_SQL <> null) then
2777 val_result := PACK_KPI_BASE.EXECSQL_ALL(val_T_SQL, var_date);
2778 --第一步:将获取到的数据插入到KPI_VIEW_TARGET_DATA_T表中
2779 ---删除当月原有数据
2780 delete KPI_VIEW_TARGET_DATA_T t
2781 where t.tid = var_TID
2782 and t.tdate = var_date;
2783 commit;
2784 ---新增获取到的当月月完成的数据
2785 insert into KPI_VIEW_TARGET_DATA_T
2786 (TTID, TID, TYWC, TDATE)
2787 values
2788 ((select nvl(max(a.TTID), 0) + 1 from KPI_VIEW_TARGET_DATA_T a),
2789 var_TID,
2790 val_result,
2791 var_date);
2792 commit;
2793 --第二步:更新KPI_VIEW_TARGET_SQL_T表中的取数时间,为当前时间
2794
2795 update KPI_VIEW_TARGET_SQL_T b
2796 set b.tgetdate = to_char(sysdate, 'yyyy-mm-dd hh:mm:ss am');
2797 commit;
2798
2799 end if;
2800
2801 end loop;
2802 end KPI_VIEW_TARGET;
2803
2804 /* \*
2805 =============================================================
2806 过程名:(Insert_JHZ_ToJHFluTable)
2807 作用 :将元素计划值,从元素结果表
2808 (kpi_manager_boelement_result)
2809 中,提取出来放到计划值审批流程表
2810 (KPI_FLU_FLOW_RESULT_NEW)中
2811
2812 参数:as_date--从元素结果表中取数的日期,格式为‘yyyy-MM’;
2813 =============================================================
2814 *\
2815
2816 procedure Insert_JHZ_ToJHFluTable(as_date IN VARCHAR2) as
2817
2818 ls_date varchar2(20);
2819 ele_row kpi_JHZ_V%rowtype; --计划值行
2820
2821 cursor rows_JHZ is --计划值游标
2822 select * from kpi_JHZ_V t where t.er_month = ls_date;
2823
2824 begin
2825 DBMS_OUTPUT.ENABLE(10000000);
2826
2827 IF as_date IS NULL THEN
2828 ls_date := GET_KPI_DATE();
2829 ELSE
2830 ls_date := as_date;
2831 END IF;
2832
2833 --循环元素结果表【kpi_manager_boelement_result】
2834 for ele_row in rows_JHZ loop
2835 --插入到计划值审批流程表中
2836 InsertOne_JHZ_ToJHFluTable(ele_row.ele_id,
2837 0,
2838 ele_row.er_value,
2839 ele_row.element_name,
2840 ele_row.er_month);
2841
2842 end loop;
2843 dbms_output.put_line('执行成功!');
2844 exception
2845 when others then
2846 rollback;
2847 dbms_output.put_line(sqlerrm);
2848
2849 end Insert_JHZ_ToJHFluTable;
2850
2851 --单个计划值插入
2852 procedure InsertOne_JHZ_ToJHFluTable(as_TARGET_ID in varchar2,
2853 as_VALUE_PLAN in varchar2,
2854 as_VALUE_DATA in varchar2,
2855 as_REC_REASON in varchar2,
2856 as_REC_MONTH in varchar2) as
2857
2858 v_P_INSTID number; --保存流程实例号的最大值
2859 v_Has number; --当本月本元素已有数据,不再执行插入操作,0-没有数据;1-有数据
2860 v_result_Id number; --保持KPI_FLU_FLOW_RESULT_NEW和KPI_FLU_FLOW_RESULT_NEW_OLD的ID保持一致。便于查询
2861 begin
2862 --当本月本元素已有数据,不再执行插入操作
2863 v_Has := 0; -- 0-没有数据
2864 select count(*)
2865 into v_Has
2866 from KPI_FLU_FLOW_RESULT_NEW t
2867 where t.target_id = as_TARGET_ID
2868 and t.rec_month = as_REC_MONTH;
2869
2870 if v_Has = 0 then
2871 --第一:从流程控制表【KPI_FLU_PROCESS_NEW】中获取最大的流程实例号
2872 select (nvl(max(P_INSTID), 0) + 1)
2873 into v_P_INSTID
2874 from KPI_FLU_PROCESS_NEW;
2875
2876 --第二:向流程控制表【KPI_FLU_PROCESS_NEW】中添加数据
2877 insert into KPI_FLU_PROCESS_NEW
2878 (P_ID, P_INSTID, P_WCODE, P_CURRENT)
2879 values
2880 (
2881 --(select nvl(max(P_ID),0)+1 from KPI_FLU_PROCESS_NEW)
2882 SEQ_KPI_FLU_PROCESS.NEXTVAL,
2883 v_P_INSTID,
2884 1 --工作项编码,1:表示专业提交
2885 ,
2886 1 --当前状态为1,表示可用
2887 );
2888
2889 --第三:向流程数据表【KPI_FLU_FLOW_RESULT_NEW】中添加数据
2890
2891 select SEQ_KPI_FLU_FLOW_RESULT.NEXTVAL into v_result_Id from dual;
2892
2893 insert into KPI_FLU_FLOW_RESULT_NEW
2894 (ID,
2895 FLOW_ID,
2896 TARGET_ID,
2897 VALUE_PLAN,
2898 VALUE_DATA,
2899 REC_REASON,
2900 UPDATE_DATE,
2901 FLOW_DESC,
2902 REC_MONTH)
2903 values
2904 (
2905 --(select nvl(max(ID),0)+1 from KPI_FLU_FLOW_RESULT_NEW)
2906 v_result_Id,
2907 v_P_INSTID,
2908 as_TARGET_ID,
2909 as_VALUE_PLAN,
2910 as_VALUE_DATA,
2911 as_REC_REASON,
2912 sysdate,
2913 1 --FLOW_DESC:状态描述
2914 ,
2915 as_REC_MONTH);
2916
2917 --第四:向流程数据原始表【KPI_FLU_FLOW_RESULT_NEW_OLD】中添加数据
2918
2919 insert into KPI_FLU_FLOW_RESULT_NEW_OLD
2920 (ID,
2921 FLOW_ID,
2922 TARGET_ID,
2923 VALUE_PLAN,
2924 VALUE_DATA,
2925 REC_REASON,
2926 UPDATE_DATE,
2927 FLOW_DESC,
2928 REC_MONTH)
2929 values
2930 (v_result_Id,
2931 v_P_INSTID,
2932 as_TARGET_ID,
2933 as_VALUE_PLAN,
2934 as_VALUE_DATA,
2935 as_REC_REASON,
2936 sysdate,
2937 1 --FLOW_DESC:状态描述
2938 ,
2939 as_REC_MONTH);
2940
2941 commit;
2942 end if;
2943
2944 dbms_output.put_line('执行成功!');
2945 exception
2946 when others then
2947 rollback;
2948 dbms_output.put_line(sqlerrm);
2949
2950 end InsertOne_JHZ_ToJHFluTable;
2951
2952 \*
2953 ================================================
2954 过程:kpi_BackToELeResultTable
2955
2956 作用:将审批通过的元素计划值,覆盖到元素结果表
2957 【kpi_manager_boelement_result】中
2958
2959 参数:as_date--覆盖元素结果表中数据的考核日期,
2960 格式为‘yyyy-MM’;
2961 ================================================
2962 *\
2963 procedure kpi_BackToELeResultTable(as_date in varchar2) as
2964 ls_date varchar2(20);
2965 begin
2966
2967 DBMS_OUTPUT.ENABLE(10000000);
2968
2969 IF as_date IS NULL THEN
2970 ls_date := GET_KPI_DATE();
2971 ELSE
2972 ls_date := as_date;
2973 END IF;
2974
2975 merge into kpi_manager_boelement_result t1
2976 using
2977 (
2978 select
2979 t2.TARGET_ID,
2980 t2.VALUE_DATA,
2981 t2.REC_MONTH
2982 from KPI_FLU_FLOW_RESULT_NEW_V t2
2983 where t2.s_code=8
2984 ) t3
2985 on(t1.ele_id||t1.er_month=t3.TARGET_ID||ls_date)
2986
2987 when matched then
2988 update
2989 set t1.er_value=t3.value_data
2990 where t1.ele_id=t3.target_id
2991 and t1.er_month=t3.rec_month;
2992
2993 commit;
2994 dbms_output.put_line('执行成功!');
2995 exception
2996 when others then
2997 rollback;
2998 dbms_output.put_line(sqlerrm);
2999
3000 end kpi_BackToELeResultTable;*/
3001
3002 /*
3003 --2012-2-6
3004 --计算指标得分创新度和努力度由原来的一个段匹配,更改为多段累加
3005 --政工需求
3006 --起征点:有区间这种情况,例如:0-5之间不加分也不减分
3007 */
3008 FUNCTION Get_OneTarget_Score_NEW(as_TARSYS_id IN VARCHAR2,
3009 as_bodata NUMBER) RETURN NUMBER AS
3010
3011 LS_BOTTOM NUMBER; --记录起征点下限
3012 LS_UPPER NUMBER; --记录起征点上限
3013
3014 bottom number; --当下限为-9999时,返回的是定值,不用累加
3015 upper number; --当上限为999999时,返回的是定值,不用累加
3016 --返回值
3017 LN_RESULT NUMBER;
3018
3019 BEGIN
3020 BEGIN
3021 LS_BOTTOM := 0;
3022 LS_UPPER := 0;
3023 LN_RESULT := 0;
3024
3025 -- 第一步:判断是否在极限区间(-9999-xx;xx-999999)
3026 begin
3027 select t.tarsys_bottom, t.tarsys_upper
3028 into bottom, upper
3029 from kpi_kpimodel_targetsystem t
3030 WHERE t.p_tarsys_id = as_TARSYS_id
3031 and t.tarsys_bottom <= as_bodata
3032 and t.tarsys_upper > as_bodata;
3033
3034 EXCEPTION
3035 WHEN OTHERS THEN
3036 bottom := -9999;
3037 upper := -9999;
3038 END;
3039
3040 IF bottom = -9999 OR upper = 999999 THEN
3041 begin
3042 select t.tarsys_score
3043 into LN_RESULT
3044 from kpi_kpimodel_targetsystem t
3045 WHERE t.p_tarsys_id = as_TARSYS_id
3046 and t.tarsys_bottom <= as_bodata
3047 and t.tarsys_upper > as_bodata;
3048
3049 EXCEPTION
3050 WHEN OTHERS THEN
3051 LN_RESULT := -9999;
3052 end;
3053 ELSE
3054 --获取“起征点”
3055 BEGIN
3056 select t.tarsys_bottom, t.tarsys_upper
3057 into LS_BOTTOM, LS_UPPER
3058 from kpi_kpimodel_targetsystem t
3059 WHERE t.p_tarsys_id = as_TARSYS_id
3060 and t.tarsys_score = 0;
3061 EXCEPTION
3062 WHEN OTHERS THEN
3063 LS_BOTTOM := -9999;
3064 LS_UPPER := -9999;
3065 END;
3066
3067 --无法获取起征点,则结果返回-9999
3068 IF LS_BOTTOM = -9999 and LS_UPPER = -9999 THEN
3069 LN_RESULT := -9999; --返回值为-1特殊值,说明表中参数设置有错误。
3070
3071 ELSE
3072 --算法
3073 IF as_bodata >= LS_UPPER THEN
3074 --新算法,适合累进计算部分
3075 BEGIN
3076 select sum(DECODE(DECODE(SIGN(as_bodata - T.TARSYS_UPPER),
3077 0,
3078 1,
3079 1,
3080 1,
3081 -1,
3082 -1),
3083 1, --大于上限
3084 (DECODE(DECODE(sign(t.tarsys_step),
3085 0,
3086 0,
3087 1,
3088 1,
3089 -1,
3090 1),
3091 0, --步长为0,就直接返回得分
3092 t.tarsys_score,
3093 1,
3094 (T.TARSYS_UPPER - T.TARSYS_BOTTOM) /
3095 T.TARSYS_STEP * T.TARSYS_SCORE)),
3096 -1, --小于上限
3097 (decode(DECODE(sign(t.tarsys_step),
3098 0,
3099 0,
3100 1,
3101 1,
3102 -1,
3103 1),
3104 0, --步长为0,就直接返回得分
3105 t.tarsys_score,
3106 1,
3107 (as_bodata - T.TARSYS_BOTTOM) /
3108 T.TARSYS_STEP * T.TARSYS_SCORE))
3109
3110 )) as C_SCORD
3111 into LN_RESULT
3112 FROM kpi_kpimodel_targetsystem T
3113
3114 WHERE T.p_tarsys_id = as_TARSYS_id
3115 and t.tarsys_bottom >= LS_UPPER
3116 and t.tarsys_bottom <= as_bodata
3117 ORDER BY T.TARSYS_UPPER;
3118
3119 EXCEPTION
3120 WHEN OTHERS THEN
3121 LN_RESULT := -9998;
3122 END;
3123
3124 END IF;
3125
3126 IF as_bodata < LS_BOTTOM THEN
3127 --累减
3128 BEGIN
3129 select sum(DECODE(DECODE(SIGN(as_bodata - T.TARSYS_BOTTOM),
3130 0,
3131 1,
3132 1,
3133 1,
3134 -1,
3135 -1),
3136 1, --大于下限
3137 (DECODE(DECODE(sign(t.tarsys_step),
3138 0,
3139 0,
3140 1,
3141 1,
3142 -1,
3143 1),
3144 0, --步长为0,就直接返回得分
3145 t.tarsys_score,
3146 1,
3147 (T.TARSYS_UPPER - as_bodata) /
3148 (-T.TARSYS_STEP) * T.TARSYS_SCORE)),
3149 -1, --小于下限
3150 (DECODE(DECODE(sign(t.tarsys_step),
3151 0,
3152 0,
3153 1,
3154 1,
3155 -1,
3156 1),
3157 0, --步长为0,就直接返回得分
3158 t.tarsys_score,
3159 1,
3160 (T.TARSYS_UPPER - T.TARSYS_BOTTOM) /
3161 (-T.TARSYS_STEP) * T.TARSYS_SCORE)))) as C_SCORD
3162
3163 into LN_RESULT
3164 FROM kpi_kpimodel_targetsystem T
3165
3166 WHERE T.p_tarsys_id = as_TARSYS_id
3167 and t.tarsys_upper <= LS_BOTTOM
3168 and t.tarsys_upper > as_bodata
3169 ORDER BY T.TARSYS_UPPER;
3170
3171 EXCEPTION
3172 WHEN OTHERS THEN
3173 LN_RESULT := -9997;
3174 END;
3175
3176 END IF;
3177
3178 END IF;
3179 end if;
3180 END;
3181 RETURN LN_RESULT;
3182 END Get_OneTarget_Score_NEW;
3183 PROCEDURE KERNEL_TARGET_ALL_XS(AS_YEAR IN VARCHAR2) AS
3184 --一年调用一次 写入每月的系数
3185 intI NUMBER;
3186 strMid varchar2(20);
3187 BEGIN
3188 FOR intI in 1 .. 12 LOOP
3189 if intI < 10 then
3190 select AS_YEAR || '-0' || to_char(intI) into strMid from dual;
3191 else
3192 select AS_YEAR || '-' || to_char(intI) into strMid from dual;
3193 end if;
3194 INSERT INTO KPI_PPXH_ALL_UNIT_T T
3195 (T.TID, t.TYEARMONTH, t.TVALUES)
3196 VALUES
3197 (KPI_NDXH_TID.NEXTVAL, strMid, 1);
3198 COMMIT;
3199 end LOOP;
3200
3201 END KERNEL_TARGET_ALL_XS;
3202
3203 /*利润排名*/
3204 procedure KPI_LR_SJ_PM(as_month varchar2) as
3205 ls_ele_name varchar2(200); --利润元素排名的元素名称
3206 ls_up_ele_name varchar2(200); --需要更新数值的元素
3207 begin
3208 ls_ele_name := '实际利润实际值'; --参与排名的元素
3209 ls_up_ele_name := '实际利润排名'; --需要更新数值的元素
3210
3211 --更新排名默认值
3212 update KPI_MANAGER_BOELEMENT a
3213 set a.defaultvalue =
3214 (select t.pm
3215 from (select t1.department_id,
3216 t1.department_name,
3217 t1.target_name,
3218 t2.bodata sj_value,
3219 rank() over(order by report_month, abs(round((case
3220 when sign(nvl(t2.bodata,
3221 0)) > 0 then
3222 t2.bodata
3223 end), 3)) desc) pm
3224 from KPI_KPITARGET_PREDICT_V t1,
3225 kpi_manager_boresult_report t2
3226 WHERE t1.target_id = t2.target_id
3227 and nvl(weight_scale, 0) = 0
3228 and t1.p_department_id=42
3229 and t1.target_name in
3230 ('利润', '利润(实际)', '实际利润')
3231 and nvl(t2.bodata, 0) > 0
3232 and t2.report_month = as_month) t
3233 where a.dep_id = t.department_id)
3234 where a.element_name = ls_up_ele_name;
3235 commit;
3236
3237 --更新元素结果表
3238 update kpi_manager_boelement_result r
3239 set r.er_value =
3240 (select a.defaultvalue
3241 from KPI_MANAGER_BOELEMENT a
3242 where a.element_name = ls_up_ele_name
3243 and a.ele_id = r.ele_id)
3244 where r.er_month = as_month
3245 and r.ele_id in (select b.ele_id
3246 from KPI_MANAGER_BOELEMENT b
3247 where b.element_name = ls_up_ele_name);
3248
3249 commit;
3250
3251 end KPI_LR_SJ_PM;
3252
3253 /*利润预算准确率排名*/
3254 procedure KPI_LR_YSZQL_PM(as_month varchar2) as
3255
3256 ls_up_ele_name varchar2(200); --需要更新数值的元素
3257 begin
3258
3259 ls_up_ele_name := '利润预算准确率排名'; --需要更新数值的元素
3260
3261 --更新排名默认值
3262 update KPI_MANAGER_BOELEMENT a
3263 set a.defaultvalue =
3264 (select t.pm
3265 from (select t1.department_id,
3266 t1.department_name,
3267 t2.bodata2 plan_value,
3268 t2.bodata sj_value,
3269 t1.weight_scale,
3270 abs(round(pack_kpi_base.F_GET_CFYS(t2.bodata -
3271 t2.bodata2,
3272 t2.bodata2) * 100,
3273 3)) yszql,
3274 rank() over(order by report_month, abs(round((case
3275 when nvl(t2.bodata2,
3276 0) <> 0 then
3277 pack_kpi_base.F_GET_CFYS(t2.bodata -
3278 t2.bodata2,
3279 t2.bodata2) * 100
3280 end), 3)) asc) pm
3281 from KPI_KPITARGET_PREDICT_V t1,
3282 kpi_manager_boresult_report t2
3283 WHERE t1.target_id = t2.target_id
3284 and nvl(weight_scale, 0) <> 0
3285 and t1.p_department_id=42
3286 and t1.target_name like '利润%'
3287 and report_month = as_month) t
3288 where a.dep_id = t.department_id)
3289 where a.element_name = ls_up_ele_name;
3290 commit;
3291
3292 --更新元素结果表
3293 update kpi_manager_boelement_result r
3294 set r.er_value =
3295 (select a.defaultvalue
3296 from KPI_MANAGER_BOELEMENT a
3297 where a.element_name = ls_up_ele_name
3298 and a.ele_id = r.ele_id)
3299 where r.er_month = as_month
3300 and r.ele_id in (select b.ele_id
3301 from KPI_MANAGER_BOELEMENT b
3302 where b.element_name = ls_up_ele_name);
3303
3304 commit;
3305
3306 end KPI_LR_YSZQL_PM;
3307 END PACK_KPI_KERNEL;
3308 /