烟草局绩效考核系统打分模块开发笔记

本文介绍了一种基于Oracle的烟草局绩效考核系统的设计方案,包括技术细节如存储过程的编写及调用,以及如何通过Java程序操作数据库实现树形结构查询。

烟草局绩效考核系统打分模块开发笔记

开发一个绩效考核系统,其难度、复杂度不在开发一个功能复杂的权限系统开发难度之下。作者这里把原始设计以及一些技术细节公布出来,希望能和大家一起交流学习。
背景:原始系统设计方案参见《某烟草局绩效考核系统整体设计方案》。
要求:指标树层级排列,以便打分使用。
环境:WindowsXP5.1SP2、IE6.0、JDK(JRE)1.6U0、MyEclipse5.1.0、Tomcat5.5、Oracle9i、PL/SQL Developer7.0。
技术细节:临时表 + 存储过程实现树形结构查询 + 游标 + 递归查询。
技术难点:返回结果集的存储过程的编写以及调用、临时表与 Java 程序的衔接。
部分页面效果及其部分源码如下:
1、指标库界面

指标库页面
指标库数据结构

指标库数据结构
2、岗位指标界面

岗位指标界面
岗位指标数据结构

岗位指标数据结构
3、临时表的创建 sql

-- Create table create global temporary table JXKH_TEMP_ROLE_GUIDELINE ( ID NUMBER(15), FID NUMBER(15), ROLEID NUMBER(15), ROLENAME VARCHAR2(50), GUIDELINEID NUMBER(15), GUIDELINENAME VARCHAR2(50), ISATOMIC NUMBER(1), GUIDEFID NUMBER(15), GUIDESEQ NUMBER(4), GUIDELEVEL NUMBER(1), NOTES VARCHAR2(1000), MAXIMUM NUMBER(5,2), MINIMUM NUMBER(5,2), CHILDNUM NUMBER ) on commit delete rows;
4、评估打分列表界面

评估打分列表界面
5、目标:评估打分页面

评估打分页面
评估打分静态页面效果源代码(部分)

<table class="Ntable" cellspacing="1" cellpadding="1" align="Center" border="0" id="gvInfo" style="border-style:None;width:100%;"> <tr class="SkyTDTopLine" align="center"> <th scope="col">指标大类</th><th scope="col">指标小类</th><th scope="col">指标名称</th><th scope="col">说明</th><th scope="col">最小值</th><th scope="col">最大值</th><th scope="col">单项分</th> </tr><tr class="SkyTDLine" align="center"> <!-- 一级指标 --> <td rowspan="2">经济指标</td> <!-- 二级指标 --> <td rowspan="1">投资管理</td> <!-- 三级指标 --> <td> <div style="width:200px;"> <span id="gvInfo_ctl02_Label1">省局项目</span></div> </td><td><a href="/jxkh/atomicGuideLine.do?method=getNotes" mce_href="jxkh/atomicGuideLine.do?method=getNotes" target="_blank">说明</a></td><td> <input class='classN1' name="Sky_10351" type="text" style="width:30px;" value="-50" readonly="readonly"> </td><td> <input class='classN2' name="Sky_10352" type="text" style="width:30px;" value="0" readonly="readonly"> </td><td> <input name="marks" id="marks" type="text" style="width:80px;" value="0" maxlength="4"> <!-- onblur="skyChange(this,'1035');" --> <input name="guideIds" id="guideIds" type="hidden" value="1076"> <input name="guideNames" id="guideNames" type="hidden" value="省局项目"> <input type="hidden" name="markIds" id="markIds" value=""/> </td> </tr><tr class="SkyTDLine" align="center"> <!-- 二级指标 --> <td rowspan="1">会务组织</td> <!-- 三级指标 --> <td> <div style="width:200px;"> <span id="gvInfo_ctl02_Label1">制定会务管理制度</span></div> </td><td><a href="/jxkh/atomicGuideLine.do?method=getNotes" mce_href="jxkh/atomicGuideLine.do?method=getNotes" target="_blank">说明</a></td><td> <input class='classN1' name="Sky_10351" type="text" style="width:30px;" value="-2" readonly="readonly"> </td><td> <input class='classN2' name="Sky_10352" type="text" style="width:30px;" value="0" readonly="readonly"> </td><td> <input name="marks" id="marks" type="text" style="width:80px;" value="0" maxlength="4"> <!-- onblur="skyChange(this,'1035');" --> <input name="guideIds" id="guideIds" type="hidden" value="1075"> <input name="guideNames" id="guideNames" type="hidden" value="制定会务管理制度"> <input type="hidden" name="markIds" id="markIds" value=""/> </td> </tr><tr class="SkyTDLine" align="center"> <!-- 一级指标 --> <td rowspan="4">工作质量指标</td> <!-- 二级指标 --> <td rowspan="1">会务组织</td> <!-- 三级指标 --> <td> <div style="width:200px;"> <span id="gvInfo_ctl02_Label1">组织及时</span></div> </td><td><a href="/jxkh/atomicGuideLine.do?method=getNotes" mce_href="jxkh/atomicGuideLine.do?method=getNotes" target="_blank">说明</a></td><td> <input class='classN1' name="Sky_10351" type="text" style="width:30px;" value="-10" readonly="readonly"> </td><td> <input class='classN2' name="Sky_10352" type="text" style="width:30px;" value="0" readonly="readonly"> </td><td> <input name="marks" id="marks" type="text" style="width:80px;" value="0" maxlength="4"> <!-- onblur="skyChange(this,'1035');" --> <input name="guideIds" id="guideIds" type="hidden" value="1140"> <input name="guideNames" id="guideNames" type="hidden" value="组织及时"> <input type="hidden" name="markIds" id="markIds" value=""/> </td> </tr><tr class="SkyTDLine" align="center"> <!-- 二级指标 --> <td rowspan="3">办公用品管理</td> <!-- 三级指标 --> <td> <div style="width:200px;"> <span id="gvInfo_ctl02_Label1">用品管理</span></div> </td><td><a href="/jxkh/atomicGuideLine.do?method=getNotes" mce_href="jxkh/atomicGuideLine.do?method=getNotes" target="_blank">说明</a></td><td> <input class='classN1' name="Sky_10351" type="text" style="width:30px;" value="-4" readonly="readonly"> </td><td> <input class='classN2' name="Sky_10352" type="text" style="width:30px;" value="0" readonly="readonly"> </td><td> <input name="marks" id="marks" type="text" style="width:80px;" value="0" maxlength="4"> <!-- onblur="skyChange(this,'1035');" --> <input name="guideIds" id="guideIds" type="hidden" value="1141"> <input name="guideNames" id="guideNames" type="hidden" value="用品管理"> <input type="hidden" name="markIds" id="markIds" value=""/> </td> </tr><tr class="SkyTDLine" align="center"> <!-- 三级指标 --> <td> <div style="width:200px;"> <span id="gvInfo_ctl02_Label1">办公用品</span></div> </td><td><a href="/jxkh/atomicGuideLine.do?method=getNotes" mce_href="jxkh/atomicGuideLine.do?method=getNotes" target="_blank">说明</a></td><td> <input class='classN1' name="Sky_10351" type="text" style="width:30px;" value="-5" readonly="readonly"> </td><td> <input class='classN2' name="Sky_10352" type="text" style="width:30px;" value="0" readonly="readonly"> </td><td> <input name="marks" id="marks" type="text" style="width:80px;" value="0" maxlength="4"> <!-- onblur="skyChange(this,'1035');" --> <input name="guideIds" id="guideIds" type="hidden" value="1142"> <input name="guideNames" id="guideNames" type="hidden" value="办公用品"> <input type="hidden" name="markIds" id="markIds" value=""/> </td> </tr><tr class="SkyTDLine" align="center"> <!-- 三级指标 --> <td> <div style="width:200px;"> <span id="gvInfo_ctl02_Label1">办公管理</span></div> </td><td><a href="/jxkh/atomicGuideLine.do?method=getNotes" mce_href="jxkh/atomicGuideLine.do?method=getNotes" target="_blank">说明</a></td><td> <input class='classN1' name="Sky_10351" type="text" style="width:30px;" value="-8" readonly="readonly"> </td><td> <input class='classN2' name="Sky_10352" type="text" style="width:30px;" value="0" readonly="readonly"> </td><td> <input name="marks" id="marks" type="text" style="width:80px;" value="0" maxlength="4"> <!-- onblur="skyChange(this,'1035');" --> <input name="guideIds" id="guideIds" type="hidden" value="1143"> <input name="guideNames" id="guideNames" type="hidden" value="办公管理"> <input type="hidden" name="markIds" id="markIds" value=""/> </td> </tr><tr class="SkyTDLine" align="center">
6、编写 JXKH_GUIDELE_CHILD_NUM 存储过程源代码

CREATE OR REPLACE PROCEDURE JXKH_GUIDELE_CHILD_NUM( ROLE_ID_ JXKH_ROLE_GUIDELINE.ROLEID%TYPE, REF_CURSOR OUT SYS_REFCURSOR ) AS NUM_ NUMBER; CURSOR C_ROLE_GUIDE IS SELECT * FROM V_JXKH_ROLE_GUIDELINE;---申明一个游标 这时候ORACLE并不执行SELECT 只是申明 V_EMP V_JXKH_ROLE_GUIDELINE%ROWTYPE; BEGIN NUM_:=0; OPEN C_ROLE_GUIDE;--打开游标ORACLE才执行SELECT FETCH C_ROLE_GUIDE INTO V_EMP; WHILE C_ROLE_GUIDE%FOUND LOOP --EXIT WHEN (C_ROLE_GUIDE%NOTFOUND); IF V_EMP.GUIDELEVEL = 1 THEN--一级分类 SELECT COUNT(*) INTO NUM_ FROM V_JXKH_ROLE_GUIDELINE WHERE FID IN (SELECT GUIDELINEID FROM V_JXKH_ROLE_GUIDELINE WHERE FID=V_EMP.GUIDELINEID AND ROLEID=ROLE_ID_); INSERT INTO JXKH_TEMP_ROLE_GUIDELINE VALUES(V_EMP.ID,V_EMP.fid,V_EMP.ROLEID,V_EMP.ROLENAME,V_EMP.GUIDELINEID,V_EMP.GUIDELINENAME,V_EMP.isatomic,V_EMP.guideFid,V_EMP.guideseq,V_EMP.guidelevel,V_EMP.notes,V_EMP.maximum,V_EMP.minimum,NUM_); ELSIF V_EMP.GUIDELEVEL = 2 THEN--二级分类 SELECT COUNT(*) INTO NUM_ FROM V_JXKH_ROLE_GUIDELINE WHERE FID=V_EMP.GUIDELINEID AND ROLEID=ROLE_ID_; INSERT INTO JXKH_TEMP_ROLE_GUIDELINE VALUES(V_EMP.ID,V_EMP.fid,V_EMP.ROLEID,V_EMP.ROLENAME,V_EMP.GUIDELINEID,V_EMP.GUIDELINENAME,V_EMP.isatomic,V_EMP.guideFid,V_EMP.guideseq,V_EMP.guidelevel,V_EMP.notes,V_EMP.maximum,V_EMP.minimum,NUM_); ELSE--三级分类 INSERT INTO JXKH_TEMP_ROLE_GUIDELINE VALUES(V_EMP.ID,V_EMP.fid,V_EMP.ROLEID,V_EMP.ROLENAME,V_EMP.GUIDELINEID,V_EMP.GUIDELINENAME,V_EMP.isatomic,V_EMP.guideFid,V_EMP.guideseq,V_EMP.guidelevel,V_EMP.notes,V_EMP.maximum,V_EMP.minimum,NUM_); END IF; NUM_:=0;--计数器清零 FETCH C_ROLE_GUIDE INTO V_EMP; END LOOP; CLOSE C_ROLE_GUIDE; OPEN REF_CURSOR FOR SELECT * FROM (SELECT * FROM JXKH_TEMP_ROLE_GUIDELINE T1 WHERE T1.ROLEID=ROLE_ID_)T2 START WITH T2.FID=0 CONNECT BY PRIOR T2.GUIDELINEID=T2.FID;--存储过程返回结果集 END;
调用 JXKH_GUIDELE_CHILD_NUM 存储过程 Java 源代码

/** * 根据传入的角色id,调用存储过程jxkh_guidele_child_num返回该角色分配的所有指标任务 */ public List<AtomicGuideLine> getRoleGuideline(String roleId){ List<AtomicGuideLine> list = new ArrayList<AtomicGuideLine>(); Connection conn = null; CallableStatement stmt = null; ResultSet rs = null; try { DBConnectionManager dcm = DBConnectionManager.getInstance(); conn = dcm.getConnection("oracle"); conn.setAutoCommit(false);//这里一定要的,不然会报“ORA-08103”错误 stmt = conn.prepareCall("BEGIN JXKH_GUIDELE_CHILD_NUM(?,?); END;"); stmt.setInt(1, Integer.parseInt(roleId)); stmt.registerOutParameter(2, -10 /* OracleTypes.CURSOR = -10 */); //REF CURSOR(OracleTypes.CURSOR==-10) stmt.execute(); rs = (ResultSet) stmt.getObject(2); while(rs.next()){ AtomicGuideLine atomicGuideLine = new AtomicGuideLine(); atomicGuideLine.setId(rs.getString("guidelineid")); atomicGuideLine.setFid(rs.getString("fid")); atomicGuideLine.setGuideName(rs.getString("guidelinename")); atomicGuideLine.setGuideSeq(rs.getString("guideSeq")); atomicGuideLine.setGuideLevel(rs.getString("guideLevel")); atomicGuideLine.setNotes(rs.getString("notes")); atomicGuideLine.setMaximum(rs.getString("maximum")); atomicGuideLine.setMinimum(rs.getString("minimum")); atomicGuideLine.setChildNum(rs.getString("childNum")); atomicGuideLine.setGuideMark("0"); list.add(atomicGuideLine); } conn.commit(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } finally{ if(rs != null){ try { rs.close(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } if(stmt != null){ try { stmt.close(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } if(conn != null){ try { conn.close(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } return list; }
关于绩效考核系统设计以及存储过程结果集调用方面的任何问题,欢迎读者在线和作者交流,msn:defonds@hotmail.com

本程序结合了OA办公系统+HR人力资源管理系统+CRM客户关系管理系统集合而成。我们把程序设计信息化应用分为三个方面的内容:通用办公应用、业务管理和决策支持。采用现代最新技术,建立一种新概念的、开放的现代管理和办公环境,它以TCP/IP、广域网互连、路由、防火墙和网络管理技术为核心,建立一个安全可靠的网络应用平台。利用最新的ASP.NET平台、javascript和AJAX、SQLSERVER关系型数据库等技术,结合OA思想的独特设计,建立一个开放的信息资源管理平台。 利用数据库及分布式处理技术、模块化功能设计,构造信息存储与事务处理平台。该智能办公平台结合了广大机构的信息需求所研发,适用于全部的政府和企业的信息办公需要。程序具体商业价值型,同时也是完全的开源,可以供下载者研究和进行二次的开发均可。该智能办公平台具有如下几大特色亮点: 亮点一:office文档在线编辑。 两点二:动态生成各类报表。 亮点三:工作流优化,方便新建任意格式审批单。 亮点四:功能授权于数据授权并用,可对多部门,多人员进行进行交叉授权。 亮点五:提供“智能窗体”向导,可任您快速且自由地制作多功能的网页办公系统。 亮点六:自定义工作流程,系统所有参数可自定义配置,支持多分公司、多部门架构。 亮点七:系统基于B/S结构,客户端零管理,避免了C/S系统维护的烦琐,降低维护成本。 亮点八:细分的权限管理,可满足用户不同的权限管理要求。 亮点九:灵活的配置,可方便自定义工作表单、环节和流程。 亮点十:良好的系统开放性和可扩展性,为企业轻松架构Internet应用。 政 府、企事业单位的信息化建设是一个集办公自动化、业务管理、领导决策等应用为一体综合信息管理系统,是一个应用覆盖面广泛,涉及部门多的应用系统。财务、 人事、或业务管理系统往往只是涉及一个部门,或者一部分人员使用的业务管理系统。而整个单位的信息化涉及各个部门和各项业务,使用人员包括单位的最高级领 导、管理部门和全体员工。因此,政府和企业的信息化是一个涉及面广泛的综合信息管理系统。该OA办公程序是一套通用的信息管理平台,平台主要包含八个主要部分:个人事务、工作流程、公共事务、信息交流、人力资源、销售管理、附件程序和系统管理。 个人事务:主要是与个人办公、通讯、考勤、会议等等相关内容的整合。 工作流程:涉及个人的网络公章管理及使用记录,各种表单的定制、类别管理,工作流的管理及工作管理。 公共事务:涉及工作计划、办公用品的管理、会议、车辆以及固定资产的管理。 信息交流:用于建立公司企业内部的交流平台及短信发送。 人力资源:对公司人员的信息档案有一定的管理,涵盖了人事档案、考勤批示、统计、薪资管理、培训记录及奖惩记录等等。 销售管理:大致分为客户方面的管理、产品方面管理以及销售方面管理的综合业务管理。 附件管理:提供常用的日历、世界时间查询、常用网址的保存(便于一键打开特定的地址)、全国各个省、县、市的邮政编码和电话区号。 系统管理:用于规划本单位信息系统的结构、内容、印章、公告、红头文件的管理。按照组织机构、业务分类、功能需要设计信息系统的菜单,按照用户所属的部门、角色、职位、管理范围进行管理和权限指派。其中主要的功能模块和说明如下解释: 个人办公: 内部邮件---系统内部的信息交流、文件交流、信息提醒等 Internet邮件---接口外部邮箱,采用pop3和smtp协议代收代发 单位公告通知---管理公告通知、新闻等信息,可选定特定部门发送 投票---内部信息投票,每个用户拥有一次投票权利 手机短信---发送内部或者外部的手机短信消息,用于提醒等 日程安排---个人日程以日历形式重点体现,到期自动提醒 工作日志---工作过程中的记录以及工作日志等 通讯簿 --- 包含各种分类,主要用于联系使用 个人设置 --- 设置个人参数、邮箱参数、提醒参数、修改密码等 审批流程: 新建工作---新建新的审批工作流,选定需要的工作新建即可 我的工作--- 个人发起的所有工作,包括已审批、未审批的所有工作 待办工作---需要当前用户进行办理或者审批的工作列表 已办工作---当前用户已经办理过的各项工作,包含历史工作 工作查询---查询系统中工作的信息,全面检索 工作监控---管理员监控运行,发现问题,可强制干预 归档工作---已办理完成的工作,自动进行归档 工作委托 --- 当前用户指定办理人,所有待办事项自动提交到委托人办理 流程设置 --- 自定义流程、自定义表单、表单各个字段在流程中权限控制 印章管理 --- 管理公章与私章,查看印章的各项使用日志等 公文收发: 接收文件--- 需要接受的文件,未签收时有颜色标注 传阅文件 --- 传阅发送出去文件 接收分类 --- 按照指定文件夹分类查看 传阅分类 --- 传阅文件夹个人分类查看 工作管理: 我的计划---个人工作计划,可共享给其他指定用户协同查看 协同计划--- 其他用户协同共享查看的工作计划信息 我的汇报---个人工作汇报,可共享给其他指定用户协同查看 协同汇报---其他用户协同共享查看的工作汇报信息 下属任务: 我的任务 --- 个人接收到的各项任务,提交工作任务报告 任务分配--- 对下属用户分派工作任务,实时监控任务情况 下属日程 --- 下属员工的日程安排信息 下属日志 --- 下属员工的工作日志信息 下属计划--- 下属员工的工作计划信息 下属汇报 --- 下属员工的工作汇报信息 下属邮件 --- 下属员工的内部邮件信息 下属客户--- 下属员工的客户资料信息 知识文档: 个人文件 --- 类同与网络硬盘、个人文件柜存储等文件存储类 单位文件 --- 单位各类文件存储区 项目文件 --- 项目实施、进度、评审等文件存储类 电子刊物 --- 电子刊物等文件存储类 重要文件 --- 特别重要的文件额外存储类 机密文件 --- 机密文件存储类 知识库 --- 各项知识库、技术资料、学习资料、单位规范等 技术文件 --- 技术类文件存储 共享文件 --- 查看各类共享的文件资料 回收站 --- 删除的文件,可恢复或者彻底删除 扩展应用: 资产管理--- 管理固定资产、仪器、办公用品等 培训管理--- 管理培训信息 会议管理 --- 各项会议会议、上传会议记录 车辆管理 --- 车辆信息、使用、维修、保险、加油等 图书管理 --- 图书信息、借阅、归还等 档案卷库 --- 各类档案分卷库保存、销毁 考试管理 --- 在线考试、可分题库、题目类型、试卷制定、自动评分等 学习管理--- 在线学习、学习心得、领导批注等 客户管理: 会员管理 --- 会员信息管理,即为个人类别的客户 我的客户 --- 个人客户资料、联系记录、需求等 客户管理 --- 管理所有客户资料,联系人、联系记录、需求计划等 进销存类: 产品管理--- 产品管理、库存列表显示、库存报警等 销售管理 --- 销售合同、产品销售出库、利润等 采购管理 --- 采购合同、产品采购入库等 供应商管理 --- 管理各个供应商、供应商联系人 项目管理: 项目信息 --- 项目各项信息、状态等 评审信息 --- 评审记录 项目进度--- 项目具体进度安排、时间进度 收款信息 --- 收款具体情况,按照项目分类 项目实施 --- 项目的具体实施情况 报销申请 --- 项目类单独报销,也可使用审批流程中的自定义流程 报销管理 --- 审批报销记录,复杂流程可使用审批流程 项目利润 --- 核算具体利润情况 数据统计 --- 数据各项统计 人力资源: 考勤管理 --- 考勤记录、考勤设置、查询、统计等 人事档案--- 人事基本资料维护 人事合同--- 合同管理情况 奖惩记录 --- 奖惩各类记录管理 奖惩制度 --- 各类具体制度安排、单位规章制度等。 应聘简历 --- 简历管理,建立单位人才库 面试管理 --- 具体面试情况管理 绩效考核 --- 绩效考核数据上报等 绩效参数 --- 绩效各项参数的设置 薪酬管理--- 薪酬各类数据管理 薪酬参数 --- 各个参数设置 报表中心: 报表分类--- 报表分类设置,根据需要可分多个类别 报表管理--- 动态定制报表、动态数据抓取。报表可自定义。 信息交流: 论坛BBS---论坛各个信息、帖子发帖信息 版块设置 --- 版块具体设置 内部聊天室 --- 各个聊天室进入后可自由聊天 聊天室设置 ---聊天室的基本设置 组织机构: 单位信息查询 --- 查询单位基本信息 部门信息查询 --- 查询部门信息 用户信息查询 --- 查询用户个人信息 附件程序: 电话区号查询--- 电话区号查询 邮政编码查询---邮政编码查询,超级链接到网址 列车时刻查询 --- 链接到列车时刻查询网址 公交线路查询 --- 公交线路查询 法律法规查询 --- 法律法规各项资料超级链接查询 休闲游戏 --- 链接到游戏网 万年历--- 日历基本信息 世界时钟 --- 时间查询 常用网址---常用的网站
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值