Oracle存储过程(包:PACK_KPI_KERNEL For YS三度评价体系)

   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 /
原文地址:https://www.cnblogs.com/qiupiaohujie/p/11960215.html