zoukankan      html  css  js  c++  java
  • 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 /
  • 相关阅读:
    bzoj3816 矩阵变换
    bzoj5029 贴小广告
    【BZOJ-1208】宠物收养所 Splay
    【BZOJ-2879】美食节 最小费用最大流 + 动态建图
    【BZOJ-1984】月下“毛景树” 树链剖分
    写在SDOI2016Round1前的To Do List
    BZOJ solve 100 纪念
    BZOJ-1143&&BZOJ-2718 祭祀river&&毕业旅行 最长反链(Floyed传递闭包+二分图匹配)
    【SDOI2009】解题汇总
    BZOJ-1879 Bill的挑战 状态压缩DP
  • 原文地址:https://www.cnblogs.com/qiupiaohujie/p/11960215.html
Copyright © 2011-2022 走看看