石 悦,武 彤
(贵州大学 计算机科学与技术学院,贵州 贵阳 550025)
在信息技术发展不断完善和知识经济不断创新的时代下,不管是大型还是中小型企业都需要一个可以实现内外资源整合的基于流程化管理的系统。其中,以工作流引擎为核心的系统可以实现业务流程的自动流动和控制,增强业务流程的灵活性,在电信、金融、电力和物流等机构都得以运用[1]。
在国外,工作流技术在很多机构和学校进行了一系列的研究,并且获得了不少成果,如基于持久消息队列的FMQM、自适应能力的工作流管理系统Meteor、基于主动数据库技术的WIDE,以及基于状态和活动图的Mentor等[2]。从国外的这些工作流可以看出,它们都有其各自的特点,能够很方便、迅速地解决问题,但是,国外的工作流始终是在其他国家运行工作的,并不适用于中国新时代特色社会主义社会的国情,毕竟中国工作流的运作方式跟国外的并不一样,处理问题也不太一样。中国的工作流有顺序、回归、分支、返回、并发等具体流程,还有实现了动态的并发、循环[3]。中国的工作流不仅支持嵌套进程,而且还提供超时处理和设置的功能。
在国内,研究工作流技术并且应用工作流技术的时间相对较晚,中国现阶段的研发能力与国外相比还是有一定差距的,而且国内对工作流的研究主要放在如何使用工作流技术以及如何实现工作流这些方面,并且国内很多著名的厂商(如东方易维、西安协同、普元、炎黄动力、有生博大、华创动力等)主要还是针对工作流本身产品的价值或者开发平台,工作流管理只是其中的一小部分,得不到重视[4]。此外,工作流还存在以下问题:现阶段对工作流技术的研究还是比较缺乏,并且工作流模型缺乏一个严格的标准;每个工作流模型的差异性较大,没有统一的标准,这让各个厂商采用的工作流不一致,最后在使用过程中和维护中就会导致资源浪费;工作流模型缺乏一种能够共同支持工作流模型定义的理念,缺乏能够充分分析的形式化的数学模型和统一便于管理的开发平台[5]。
通过对国内外工作流研究现状的比较可知,国内的工作流技术有很大的提升空间。文中将工作流技术引入某技术服务平台,对工作流模块进行二次开发,采用工作流引擎过程建模,节点建模,工作项与活动节点的有关操作以及节点推进,执行节点等功能,并且在流程中加入柔性节点的方式,快速响应外部环境的变化,以提高技术服务平台在处理业务上的效率。
工作流管理联盟简称WFMC,在工作流的标准和规范中主要提出了工作流参考模型。通过对工作流程序结构的分析得出了工作流参考模型,而且还对结构中的接口进行确认,让不同的产品在不同的层次结构上协同工作。工作流系统中包括许多组件,而这些组件和其他定义的方法一起协同工作;不同的产品在这些组件中展示了不同的功能。但是为了让这些不同工作流产品有一起工作的能力,需要在各个组件之间建立接口和数据交换的标准,通过这些标准,才能建立各个产品之间一起协调工作的能力[6]。
如图1所示,接口一是建模与流程定义工具运行时管理各个软件之间的接口;接口二是提供工作流引擎与客户端应用之间的API通信接口;接口三是其他应用程序与工作流引擎之间的API接口;接口四是工作流与其他API通信以及与工作流之间实现分布式管理的核心API接口;接口五是工作流在运行时的状态和在运行实例情况下的监视管理API接口[7]。
图1 工作流参考模型
图1中每个相关工具的作用是:流程定义工具让使用变得方便,还能够识别计算机系统里的过程,自行进行定义。目前,有很多多功能的图形工具对工作流的过程进行定义。XPDL(XML过程定义语言)是工作流管理联盟提出的一种标准化规范,采用XML文件来让不同的工作流软件进行业务交换,并且对各流程进行定义。管理监控工具是让工作流在运行过程中对各个流程进行监控和管理的工具,提供了一些功能来对安全、授权、控制等过程进行管理。这些功能包含用户、角色、资源、监控和过程监控的管理功能,如过程模型的启动、实例化、恢复、暂停、进程实例的执行、终止过程实例等。工作流引擎由许多个工作流执行服务组成,并且提供了实例过程的执行活动、导航活动以及与外部资源的活动,除此之外还包括控制数据的功能。工作流服务流程如图2所示[8-10]。
工作流有4个主要特征:拥有先进的SOA技术构架、支持集群、可扩展能力以及开放性和嵌入能力。这些特征都是为了提高流程效率和效益,缩短生产周期,加强协作,优化流程。具体作用如下[11]:
(1)提高效率,减少等待。
工作流流程的自动化降低了时间成本,让等待变得有价值。自动化循环设置还可以对企业的内部结构进行系统设置,减少时间的等待,提高了决策的速度。
图2 工作流服务的整个流程
(2)规范行为,落实制度。
采用正规的工作流业务流程来规范企业之间的流程与行为,有效解决了企业之间的业务不和谐问题。除此之外,还能把业务流程与企业内部的规章制度结合起来,让各个系统的运行机制保持一致,有效解决了业务流程不一致问题。
(3)协同内外,快速响应。
使得任务、财务状况、材料清单、客户资料、员工计划、知识管理等各个方面的工作流任务跨越时间与空间的限制,有机整合到一起,协同工作。
(4)监控全面,提升执行。
能够全面地对各项任务进行管理并且及时了解任务的执行状态情况,对任务的情况进行分析,从而提高企业执行的效率。
该系统采用MVC(model-view-control)模式开发,采用MVC模式能让各个功能模块与显示模块进行分离,降低各个模块之间的耦合性,让系统开发变得有效率,具有可维护以及扩展性强等特点。采用Myeclipse2014为编程开发工具,以oracle 11g为数据库开发软件。前端部分拟采用HTML,CSS和JavaScript创建前端用户界面,实现与后台技术的分离,后台采用SpringMVC结合Hibernate开发[12-13]。此外,工作流的客户端应用其实就是工作流引擎暴露给外部的客户端API,这样,外部操作工作流就可以通过客户端API进行操作,客户端API调用工作流引擎的核心API对流程进行相关处理。所以采用工作流引擎技术对技术服务平台中的鉴定检测管理系统进行二次开发。系统总共分为“收费单价维护”、“样品发放”、“发放管理”等16个功能模块,在二次开发中将对其相应的模块采用工作流技术,具体结构见图3[14]。
图3 “检定检测管理”的功能结构
系统的每个模块都是严格按照工作流程设计的标准完成每一步的审核与验收。具体以检定检测管理流程为例进行详细阐述。
首先对接收到的设备进行立项,然后移交到专业室,专业室再让市场营销部评估检验设备所需要的费用,确认收费完毕后把设备移交给检定部门进行检定,检定完成后发放设备和检定的证书,然后把批准完的证书给签发部门盖章生效,最后收发部把设备和证书进行发放。每个项目按照设备任务书、设备检定设计、设备精确度检验、设备验收、设备归档、设备发放等流程进行。在工作项目每个环节中,都需要使用工作流进行诸如设备检定、证书审批的管理工作。设备在每个环节执行完毕后,会发放设备的证书,证书也按照上述顺序进行。在证书审批的每个环节,也需要使用工作流进行诸如项目审批的管理工作。基于工作流的检定检测管理系统的流程如图4所示。
过程实例以开始节点、中间节点和结束节点的进程结束开始,并且节点主要是通过转换来链接的。系统中主要使用五种节点进行响应,包括start、decision、task、custom和end。除此之外,JBPM还提供了十多种以外的节点对start、end和task以及自定义事件进行响应,自己可以对响应的方式进行定义。该系统流程以锅炉所审批作为实例[15-16]。
图4 “检定检测管理”流程
下面截取部署过程中的几段代码来解释xml文件表示流程相关信息的基础上如何让程序正确地获取它所传递的信息,以及员工提交任务和各个部门审批任务环节的主要功能。
(1)通过表查询到各部门员工信息,并在表中进行相应操作,部分代码如下:
static Map
public static voidinit(){
Map
Map
Map
System.out.println("系统用户编号,员工编号,员工姓名,邮箱,部门编号,部门名称");
for (String s:employeeName.keySet()) {
Employee e=employeeName.get(s);
System.out.println(userIdMap.get (e.getEmployeeId())+","+e.getEmployeeId()+","+e.getEmployeeName()+","+e.getEmail()+","+postNameMap.get(postName.get(s))+","+postName.get(s));userMap.put(userIdMap.get(e.getEmployeeId()), e.getEmployeeName());}
getsysRole();
启动进程实例后,在JBPM_Excel表中有一个雇员提交的应用程序的活动记录,然后将其应用到员工提交过程中,分别是task.jbpm.xml和task.png。
(2)启动流程实例。
通过启动流程实例,jbpm.xml中name属性的值为task,具体代码如下:
public static void main(String[]args) {
WorkEntrustTicket w=new WorkEntrustTicket();
w.readerDSN(task);}
流程启动后:Employee_task表中有一条员工待申请的任务,员工登录账户对未处理的文件进行处理。
(3)员工操作。
员工登录系统查询具体任务,具体代码如下:
private static Logger logger=Logger.getLogger(ExcelUtil.class);
static String path=DyEnPageBak.class.getResource("/").getPath();
static String websiteUrl=path.replace("classes/","")+"qcenter/qcenter_hibernate.cfg.xml";
static File file=new File(websiteUrl);
private static Configuration cfg=new Configuration().configure(file);
private static SessionFactory fac=cfg.buildSessionFactory();
private static Session session=fac.openSession();
publicint redeExcel(String path) {
Sheetsheet;
Workbook book;
Cell cell1;
try {
// t.xls为要读取的excel文件名
book=Workbook.getWorkbook(new File(path));
sheet=book.getSheet(0);
int rsColumns=sheet.getColumns();
int rsRows=sheet.getRows();
List
int count=0;
for (int k=1;k StringeftutbtName=sheet.getCell(0,k).getContents(); String CERTIFICATE_NO=sheet.getCell(1, k).getContents(); //装置证书号 String STANDARD_NAME=sheet.getCell(2, k).getContents();//装置名称 String EQUIPMENT_NAME=sheet.getCell(3, k).getContents();//主标准信息 String MAJOR=sheet.getCell(5,k).getContents();//所属专业 }} 员工处理完文件提交给锅炉所主任审核,该员工再查询列表时,显示没有任务。 (4)锅炉所主任审核操作。 主任登录账号,查询到有一条未处理的任务,主任对未审核的任务进行处理,具体代码如下: public void read(StringbrFile,String pwFile){ try { BufferedReader br=new BufferedReader(new InputStreamReader(new FileInputStream(brFile), "GBK")); PrintWriter pw=new PrintWriter(new OutputStreamWriter(new FileOutputStream(pwFile), "GBK")); String play; br.readLine(); while ((play=br.readLine())!=null) { StringBuffer sb=new StringBuffer(); String []ss=play.replace(""", "").split(","); sb.append("("); for(int i=0;i sb.append("'").append(ss[i]).append("',"); if(ss.length==13&&i==12){ sb.append("null,");} if(i==ss.length-1){ sb.delete( sb.length()-1, sb.length()); }} sb.append(");"); pw.println(sb.toString()); System.out.println(sb.toString()); } pw.close(); br.close(); }catch (Exception e) { e.printStackTrace(); } } 锅炉所主任审核完文件后,提交批准环节,具体代码如下: public voidCheck_task() { Stringtask_Id=" "; procedure.getTaskService(). Check_task(task_Id); } (5)锅炉所批准操作。 主任再次登入任务批准系统,查询到未批准的任务,具体代码如下: public static ListredeExcel(String path) { List list=new ArrayList(); Sheetsheet; Workbook book; try { // t.xls为要读取的excel文件名 book=Workbook.getWorkbook(new File(path)); sheet=book.getSheet(0); int rsRows=sheet.getRows(); for(int k=2;k StringeftutbtName=sheet.getCell(2,k).getContents();//所属单位 list.add(eftutbtName);} }catch (Exception e) { e.printStackTrace();} return list;} 主任对查询到的未批准的任务进行批准,具体代码如下: public void finish_Task() { Stringtask_Id=" "; procedure.getTaskService(). Check_task(task_Id); } 主任最后审批完任务,即环节最终到达to end1,主任查询个人列表时,查询结果为空。 这样整个任务就经员工办理然后传递到主任审阅及审批,最后到主任终结该任务。采用工作流技术后,系统实现了对组织的分层化管理以及对工作流管理的专业化,让专业的人员处理专门的任务,让每个人都有相应的权利和任务,各司其职。此外,采用工作流技术后,系统能对整体业务流程进行实时的监控与管理,起到了事半功倍的效果。 经过系统的设计和代码的编写,对系统进行第二次开发,使其相较于之前有了质的飞跃。下面说明一下系统的项目管理模块在运行中的主要功能任务,主要由员工办理任务到主任审核并终结任务之间的流程实例。 在浏览器中输入http://127.0.0.1:555/SSOServer进入登录界面。 任务由主任发起,此时项目中的任务开始走工作流流程,以员工的角色进入项目管理系统,员工查询自己未完成的任务,并对此任务进行办理。员工完成此工作后,到下一个流程,提交到主任审核阶段,主任对任务进行审核,主任审核完任务后,流程进入最后一个阶段,即主任终结该任务。 通过工作流技术对整个流程进行升级后,让业务流程变得简便及快速,使系统在处理业务上变得高效。 将工作流技术引入技术服务平台进行二次开发,使用工作流技术后,部门之间需要传送审核的任务从以前的5天以上缩短到了仅要2天就完成出单,有效缩减了文件处理时间,减少了时间的等待。除此之外,企业里各大任务、计划都能采用工作流的协同技术来共同完成协同业务,提高了办事效率。 综上,工作流引擎内核的实现,使原本许多繁琐的任务处理起来变得简单、高效。目前有许多的工作流引擎,而且工作流技术也在不断更新、发展,针对特定的系统需求如何选择和使用工作流进行系统的二次开发是进一步研究的目标。4 应用实效
5 结束语