• 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏吧

用工作流思想实现简单的校园请假系统

互联网 diligentman 5天前 8次浏览

写在前面

这两周软件工程课留了一个作业,要写一个小程序去体现工作流,具体内容不限。我上周也写过一篇《浅谈对于工作流的认知》这篇博客给冯冯。但是那时候对于工作流的认识可能连皮毛都没有,里面也有很多错误和表述不清楚的地方。为了弥补上周的错误,我重新写一篇。这次的认识也算是得到的老师的认可,所以我觉得我现在对于工作流的认识也更加靠谱。我对于工作流的认识和程序的设计灵感来源于:老师讲课的内容、OY的程序、FF的数据库设计、姐姐给的资料和第一周被老师骂的同学们。

需求分析

对于理论知识大家可以上网查,这里就不整理了。我们直接来设计校园请假系统。既然要体现工作流,那肯定他得“流”起来,审批的节点要多,角色也要多。如果只是学生提交申请,辅导员审批通过就完了,那就不用工作流了。至少得有三个吧,假设我们有三个角色:学生、辅导员、院长。继续设计一个审批流程:首先学生提交请假申请,之后辅导员就可以看到学生请假的申请了。紧接着辅导员审批,如果通过了辅导员的审批,请假申请将提交给院长,最后一步,院长审批。这就是全部流程了,很简单,流程图如下:
用工作流思想实现简单的校园请假系统
为了记录有哪些角色,我们建立一个角色表

角色ID 名字
1 学生
2 辅导员
3 院长

紧接着我们把目光集中到一条请假申请上,根据上面的流程图我们把一条请假申请可以有哪些状态写出来并标一个号,就像这张图一样:
用工作流思想实现简单的校园请假系统
这个应该不难理解,学生提交申请后,那条申请就在1状态,辅导员拒绝了,就直接向上到4状态,通过了就向右到2状态,之后院长这边同理。

为了记录有哪些节点每个节点都代表什么,我们得建一个状态表

状态ID 含义
1 等待辅导员审核
2 等待院长审核
3 通过
4 不通过

我们为了保存一下这张图,建个表吧,这张表就是传说中的流程控制表,也是工作流引擎操作的表。角色id表示该行中,可以操作现在状态的角色。判断条件中1表示同意,-1表示不同意。于是上图可以表示为下表:

现在状态 下个状态 角色ID 判断条件
1 4 2 -1
1 2 2 1
2 4 3 -1
2 3 3 1

举个例子解释一下,比如第一行,这条申请现在的状态是1,也就是等待辅导员审核,那谁能操作这个状态的申请呢?ID为2的角色,也就是辅导员。当判断条件为-1的时候,也就是辅导员不同意的情况下,这条申请所要变成的状态是什么呢?是4,也就是不通过。其他行以此类推。

现在离写出这个程序还差什么呢?好像请假信息还没存,我们再建一个请假表吧,如下:

申请ID 学号 状态ID 请假的相关数据

申请ID唯一标识一个申请,可以设置成int类型,让他自增,我们不用手动插入;学号标识了这个假是谁请的;状态ID标识这条申请处于什么状态;还有一些请假的相关数据,什么理由啊,时间啊我就不在这写了。主要是看这个状态ID

编写程序

好啦,注意我们要开始写程序了:
首先我们要写一个函数或者方法,实现学生请假,本质上就是往请假表里插入一个数据,相信大家都会。sql语句是这样的:insert into 请假表 (学号,状态ID,请假数据) values(123,1,数据)
在学生请假的时候直接将请假申请的状态置为1,这条处在了等待辅导员审核的状态。
请假表变成了这样:

申请ID 学号 状态ID 请假的相关数据
1 123 1 数据

接下来继续写一个函数或者方法,实现老师的辅导员功能。其实本质是什么,就是修改上面这个请假表中的状态。首先第一步,辅导员要找到需要它审批的请假的信息,怎么找?看每条请假的状态ID啊,如果状态ID=1。是不是他就处于等待辅导员审核的状态?那你就可以把这条信息读出来呀。sql语句可以这么写:select * from 请假表 where 状态ID=1

读出来显示了后,比如老师同意了,按照状态图是不是要走到状态2。如果你不用工作流,你可以直接这么写sql语句:UPDATE 请假表 SET 状态ID= 2 WHERE 申请ID = 1。那么上一条请假状态就变成了

申请ID 学号 状态ID 请假的相关数据
1 123 2 数据

院长的做法是不是同理啊,读取所有处于状态2的节点。sql语句可以这么写:select * from 请假表 where 状态ID=2。假设它同意,sql语句可以这么写 select * from 请假表 where 状态ID=3。那么上一条请假状态就变成了

申请ID 学号 状态ID 请假的相关数据
1 123 3 数据

审批就通过了。

但是这样大家想没想过一个问题,你的状态转换是不是写死了啊,写在了代码里。举个例子。比如现在审批流程改了,不需要院长审核了,辅导员同意就直接通过了,到了状态3。这时候你要怎么改程序?你是不是要把整个工程打开,修改代码?这样是很浪费时间的,有没有什么办法可以不改代码,就能让他变流程?这个时候就需要工作流了。

问题的关键就在于怎么判断当前状态的下一个状态是什么?别忘了我们之前还定义了一个流程控制表啊。贴心的我再复制一份下来吧:

现在状态 下个状态 角色ID 判断条件
1 4 2 -1
1 2 2 1
2 4 3 -1
2 3 3 1

要像知道下一个状态是什么怎么办?查这张表呗。继续写一个方法,他的功能就是查这张表,返回下一个状态的编号,这个类就叫工作流引擎,工作流引擎里的sql语句怎么写?
select 下一个状态 from 流程控制表 where 现在的状态 = XX and 角色ID=XX and 判断条件=XX
是不是就把下一个状态给找出来的,再当作返回值返回给上一级。

举个例子!这次老师要同意某个人的申请了,先去调用工作流引擎,把现在状态=1,角色ID=2,判断条件=1传给工作流引擎,工作流引擎就去查表,发现它属于第二条记录。于是就查到了下一个状态是状态2,再将状态2反给老师审批的方法,这个时候老师更新的sql语句就可以写成:UPDATE 请假表 SET 状态ID= 返回的状态ID WHERE 申请ID = 1

这样做有一个好处,就是如果现在审批流程改了,不需要院长审核了,辅导员同意就直接通过了,咱们怎么改,是不是把流程控制表改一项就行了。将第二行的下个状态改成3。是不是就跳过了院长审批的阶段了。第三第四行就废了,发现了没。

现在状态 下个状态 角色ID 判断条件
1 4 2 -1
1 3 2 1
2 4 3 -1
2 3 3 1

结语

写这个博客是想让大家通过这个小例子知道什么是工作流,怎么来实现。我想大家应该知道怎么写一个简单的工作流程序了,这只是一个例子,大家可以随意地网上套,什么审批,什么申请,亦或者增加了什么判断条件,这个大家根据自己地需求来就好。这只是我自己地一点总结,可能是对的,也可能错地。如果你发现了本文地错误,希望大家在评论区提出来。如果你恰好是我的同学,想用我这个套路去写程序去讲,无论老师夸你还是为难你,都和我没关系!如果老师问起你这是和谁学的,请回答他,是一个叫雷锋的小伙子。

好啦!这就是全部内容,如果你觉得对你有帮助,别忘了点个赞再走!谢谢大家~


喜欢 (0)