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 /