Oracle存储过程(包:PACK_KPI_KERNEL For YS三度评价体系)
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