开发比较复杂的企业多用户管理信
息系统(MIS),不可能不涉及到系统内多个用户之间的数据文件的流转、审批等功能的开发。由于企业的需求总是随着时间推移不断发生变化,加之各个企业内
部所设置的办公流程不尽相同,一套通用性比较好的管理信息系统应该能让系统管理员自己定义公文转发的流程。
尽管笔者没有机会在已参与开发了的MIS中实现出文件转发流程自定义的功能,但是,早在2002年初就曾深入思考过这方面的设计。当时由于某些
原因不能公开自己的设计思路,现在市面上已经有不少MIS产品提供这样的功能,笔者又已离职,所以是时候把我的设计思路整理出来,和大家分享。
首先,让我们分析需求,制定目标。
1)一般情况下,企业内的公文转发、审批是按部门或职位来转送,即对岗不对人。例如:某个流程的某个环节需要财务总监审批,日后财务总监换人,该流程应该不受影响。而且,流程中某个环节可能出现某个部门中的任何一人都能审批,或者需要该部门的所有人员共同审批。
2)流程中转送,审批的公文一般分为文件和表单2种格式。文件格式的公文应该支持批处理,即一次可以转发多个文件,审批时可以只退回其中某一个不合格的
文件,其他的文件可以转送到下一个环节继续处理。表单格式的公文应该能让用户自己定义表单格式,确定表单中的表项。同理,表单也应该支持批处理。
3)流程中处理公文的动作应该能让用户自己定义。这样一旦日后增加了新的处理动作,也不用修改MIS系统的底层数据建模。当然,要实现新的处理动作,还是需要在业务逻辑层编写相应的代码,不过和修改底层数据建模比起来,工作量要少得多。
4)每个流程的环节数不一定相同,应该能让用户设定环节数,指定公文流转中每个环节的发送部门和接受部门,处理模式,最长等待时间。
5)当待处理的公文发出后,系统应该在等待时间中定期向该流程中下个环节的用户(们)发出通知,提醒该用户(们)及时处理,直至公文已被处理。如果超出
最长等待时间,公文还未被用户(们)处理,此次流程处理失败。企业管理层可能会要求记录相关信息,以便在日后业务流程重组(BPR)时参考。
6)某些企业由于特殊原因,在某个流程中要求实现跨环节处理。例如,该流程有6步,执行到第二个环节时要求处理后可以跳过中间三个环节,直接转到最后一个
环节等候处理。其实,这种情况下,并不一定要在技术层面上实现其灵活性,这种特例毕竟是少数。用户只需定义一个新流程,把上面流程的第1,2,6步复制加
入进来,2个流程之间用流程名来区分即可。一个优秀的系统架构设计师应该充分利用现有的工具,不要什么都自行架设开发。
上面的需求对灵活性要求较高,抽象化程度较深,所以在表现层和业务逻辑层的开发量较大,初期投资较多,不过开发完毕后估计不需对底层数据库修
改,即可满足日后不断变化的公文流转需求。如果不需要这么高的灵活性,可以按实际项目简化某些假设条件。下面按照上面的需求进行用例(use
case)分析和数据建模。
1)由于流程环节的发送方和接受方是对岗不对人,我们应该先描画出整个企业的机构设置,确定每个部门的权利职责。其中大的部门内可能有若干子部
门,每个子部门内又有不同职位,负责处理相应的事务。所以,可先建立一个树形关系的数据表来保存企业结构,然后,采用权限表和用户组相结合的方式来保存每
个部门每个职位的职能。这块的设计思路见我之前发布的“浅谈数据库设计技巧(上)、(下)”,我在下面直接给出大致的数据表结构:
部门表(Department_table)
名称 类型 约束条件 说明
Dp_id int 无重复 类别标识,主键
Dp_name varchar(50) 不允许为空 类型名称,不允许重复
Dp_father int 不允许为空 该类别的父类别标识,如果是顶节点的话设定为某个唯一值
Dp_layer varchar(6) 限定3层,初始值为000000 类别的先序遍历,主要为减少检索数据库的次数
功能表(Function_table)
名称 类型 约束条件 说明
f_id int 无重复 功能标识,主键
f_name varchar(20) 不允许为空 功能名称,不允许重复
f_desc varchar(50) 允许为空 功能描述
用户组表(User_group)
名称 类型 约束条件 说明
group_id int 无重复 用户组标识,主键
group_name varchar(20) 不允许为空 用户组名称
group_power varchar(100) 不允许为空 用户组权限表,内容为功能表f_id的集合
用户表(User_table)
名称 类型 约束条件 说明
user_id int 无重复 用户标识,主键
user_name varchar(20) 无重复 用户名
user_pwd varchar(20) 不允许为空 用户密码
user_type int 不允许为空 所属用户组标识,和User_group.group_id关联
说明:其中,按部门的不同职位设置不同权限的用户组,如某个用户组为“市场部业务员”,该用户组的用户可在流程“报销申请”中发送报销申请。
2)尽管流程中的公文分为文件和表单2种格式,但是每个文件/表单都应该有其唯一标识,名称等属性。所以,我们把公文抽象化,把这2种格式的公文的共有属性提取出来建立一张公文表。
公文表(Document_table)
名称 类型 约束条件 说明
doc_id int 无重复 公文标识,主键
doc_name varchar(50) 不允许为空 公文名称
doc_type char(1) 不允许为空 公文类型
doc_type字段用来辨别公文格式,目前只有2种格式,可设“1”表示文件格式,“2”表示表单格式。估计未来新增公文格式不会太多,所以
该字段只需一位字符。文件格式的公文一般是在文件内固定好格式,我们可用一个二进制的字段直接保存整个文件的内容。文件格式的公文需要建一个表来保存相关
信息,其大致数据表如下:
文件表(File_table)
名称 类型 约束条件 说明
file_id int 无重复 文件标识,主键
file_name varchar(50) 不允许为空 文件名称
file_value binary 不允许为空 文件内容
……
表单格式的公文要让用户自己定义表单格式,确定表单中的表项。有两种方法来实现:
①每当用户建立一个新格式的表单时,就新建立一个
表,把用户输入的表单表项当作该表的字段。这种方式的优点是表单查询速度较快方便,业务逻辑层的开发量较小。缺点是不太灵活,如果企业所使用的不同格式的
表单较多(>20种),整个数据库的结构显得比较混乱,而且大部分表单中都有相同的字段,这样也增加了数据冗余。这种方式的数据建模如下:
表单总表(Sheet_table)
名称 类型 约束条件 说明
sheet_id int 无重复 表单标识,主键
sheet_name varchar(50) 不允许为空 表单名称
table_name varchar(20) 不允许为空 表单子表名,如Sub_table1/Sub_table2
表单子表1(Sub_table1)
名称 类型 约束条件 说明
sub_id int 无重复 表单子表标识,主键
option1 varchar 不允许为空 表单表项1
option2 varchar 不允许为空 表单表项2
option3 varchar 不允许为空 表单表项3
……
表单子表2(Sub_table2)
名称 类型 约束条件 说明
sub_id int 无重复 表单子表标识,主键
option1 varchar 不允许为空 表单表项1
option2 varchar 不允许为空 表单表项2
option3 varchar 不允许为空 表单表项3
……
……
②对表单再进行一个抽象,把表单看成由若干个表单表项所组合成的一个集合。这种方式的优点是相当灵活,用户建立新格式的表单时只用从已有表单表
项中勾选出需要的表项即可,而且整个数据库结构清晰,没有数据冗余。缺点是开发比较复杂,工作量和上面相比高出不少,而且表单查询速度较慢。下面是这种方
式的数据建模:
表单总表(Sheet_table)
名称 类型 约束条件 说明
sheet_id int 无重复 表单标识,主键
sheet_name varchar(50) 不允许为空 表单名称
表单表项表(Option_table)
名称 类型 约束条件 说明
op_id int 无重复 表单表项标识,主键
op_name varchar(50) 不允许为空 表单表项名称
op_length int 不允许为空 表单表项长度
op_unit varchar(10) 允许为空 表单表项单位
表单信息表(Sheetinfo_table)
名称 类型 约束条件 说明
info_id int 无重复 表单信息标识,主键
sheet_id int 不允许为空 所属表单标识,和Sheet_table.sheet_id关联
op_id int 不允许为空 表单表项标识,和Option_table.op_id关联
info_value varchar() 不允许为空 表单信息值
3)我们可以把公文转发的流程抽象化,看作一个实体超类。建表如下:
流程表(Flow_table)
名称 类型 约束条件 说明
flow_id int 无重复 流程标识,主键
flow_name varchar(50) 不允许为空 流程名称
flow_stepnum int 不允许为空 流程步数
flow_desc varchar(200) 允许为空 流程描述
流程中的每一步都可以抽象化成从发送方至接受方的用例,其数据建模大致如下:
处理动作表(Action_table)
名称 类型 约束条件 说明
a_id int 无重复 动作标识,主键
a_name varchar(20) 不允许为空 动作名称
a_call varchar(50) 不允许为空 动作所调用的模块
a_desc varchar(200) 允许为空 动作描述
说明:如果采用面向过程的开发方式,如纯脚本语言,可以把每一个处理动作写成一个函数,调用a_call字段记录的函数,即可完成相应处理动
作。如果采用面向对象的开发方式,可以用COM组件来封装处理动作,则a_call用来记录相应的COM组件的接口方法。如果是在.NET
Framework环境下,可以采用Web服务的方式。当然,发送方、接受方以及公文标识是作为输入参数的。
流程环节表(Step_table)
名称 类型 约束条件 说明
step_id int 无重复 环节标识,主键
belong int 不允许为空 所属流程标识,和Flow_table.flow_id关联
setp_order int 不允许为空 所属流程的步骤次序
sender int 不允许为空 发送方标识,和User_group.group_id关联
receiver int 不允许为空 接受方标识,和User_group.group_id关联
a_id int 不允许为空 处理动作标识,和Action_table.a_id关联
a_type int 不允许为空 接受方所需的处理人数
max_wait int 不允许为空 最长等待时间
wait_unit varchar(5) 不允许为空 等待时间的单位
说明:a_type用来确定接受方所需的处理人数,“0”表示需同职位的所有人一起处理,“1”表示只需该职位的任意一名员工处理,“2”表示
需该职位的任意两名员工一起处理,依次递推……一起处理的方式和处理动作有关,例如是投票方式,少数服从多数,还是某人有一票否决权等等。可能针对某些处
理动作还得细化,进行相关的数据建模,这里我就不细分下去了。
4)下面分析公文转发的流程环节记录。此时相当于实例化一个流程环节的对象,发送方和接受方应具体联系到管理信息系统的某个(些)用户,而不是
某个用户组。每经过一环节,我们除了要保存这方面的信息,还必须保存该环节所转发的公文,以及处理状况等信息。而且,该环节所转发公文数量大于等于一,所
以可以参考我之前发布的“浅谈数据库设计技巧(下)”中的“简洁的批量m:n设计”,建表大致如下:
流程环节记录表(Step_log)
名称 类型 约束条件 说明
log_id int 无重复 环节记录标识,主键
step_id int 不允许为空 环节标识,和Step_table.step_id关联
sender varchar(100) 不允许为空 发送用户标识,相关用户组的User_table.user_id的集合
receiver varchar(100) 不允许为空 接受用户标识,相关用户组的User_table.user_id的集合
doc_id int 不允许为空 转发公文标识,和Document_table.doc_id关联
batch_no int 不允许为空 批量转发公文编号,同一流程环节转发的batch_no相同
state char(1) 不允许为空 处理状态
sub_date datetime 不允许为空 提交时间
res_date datetime 允许为空 处理回复时间
comment varchar(255) 允许为空 处理回复注释
说明:
①同一流程环节转发的batch_no和该批第一条入库的log_id相同。举例:假设当前最大log_id是64,接着某
用户一次转发了3件公文,则批量插入的3条流程环节记录的batch_no都是65。之后另外一个用户通过某个流程环节转发了一件公文,再插入流程环节记
录的batch_id是68。
②state字段用来描述其流程环节所处的状态,是正待处理,已被处理通过,已被处理驳回,还是超出最长等待时
间被系统自动收回等等。通过这个字段我们对接受用户发出处理通知,还可以可以很容易的查询出所有超出最长等待时间被系统自动收回的流程,以便企业管理层在
日后业务流程重组(BPR)时参考。
③如果某份公文在某个流程中的某个环节被处理驳回,可以看作该公文在此次流程中被驳回至起始点,最初发送用户可根据处理回复注释修改公文后重新发送。
总结:
企业公文流程自定义应该是把企业内已经固定了的公文转发、审批流程电子化,实现高效的无纸化办公,对于非正式的口头
讨论、商议、集会等商务活动并不适合。当企业累积了一定数量的电子化公文转发的记录后,可以在商业咨询专家和技术开发人员的协助下对其进行数据挖掘,分析
出其中的低效、无用环节,进行优化重组,最终提高整个企业的竞争力。作为技术开发人员,我们应该根据企业实际运作情况、资金投入规模,选择当前时期最适合
的技术解决方案,切不可为了展示自己的技术实力,而把开发复杂化,企业开发并不是追求技术最先进,而且最适合。
分享到:
相关推荐
一个简单实用的公文流转系统,内含自定义流程. 采用ASP.NET C#设计, 数据库采用MS SQLServer2005.
总结来说,信息系统开发流程自定义文档的核心在于构建一个灵活、可扩展的MIS,它能够适应企业内部流程的变更,允许用户根据需要自定义审批流程、处理动作以及公文流转方式。通过合理的数据建模和权限管理,可以实现...
《建筑行业办公室公文处理流程(下行文)》 在建筑行业中,公文处理是日常管理工作的核心环节,尤其对于下行文,即由上级部门向下属单位发布的文件,其流程严谨且至关重要。以下是对该流程的详细解读: 一、流程概述...
OA系统公文收发文流程 在OA系统中,公文收发文流程是一个重要的业务流程,它涉及到公文的起草、审核、签收等多个环节。下面将对OA系统公文收发文流程进行详细的介绍。 一、公文起草 公文起草是公文收发文流程的第...
2. **审批流程定义**:系统允许管理员自定义公文的审批流程,设置不同的审批节点,每个节点可指定审批人或审批组,确保公文按照规定的顺序进行流转。 3. **权限管理**:根据组织结构和职务,分配不同的操作权限,如...
转发公文格式精选.doc
《心通达OA公文表单流程事业单位样例》是一个宝贵的经验分享资源,它涵盖了事业单位在执行公文处理流程中的具体应用。这个压缩包包含了多种公文表单和流程示例,旨在帮助用户快速理解和实施公文管理。下面将详细阐述...
《建筑业办公室公文处理流程(平行文)》的讲解 公文处理流程是任何组织内部信息流通的关键环节,尤其在建筑业这种对规范性和效率要求极高的行业中,公文的高效处理至关重要。平行文,即在组织内部或与平行级别单位...
数飞公文流转系统,用于收发文流转审批,可实现公文单自定义、行文单自定义、印章验证、痕迹保留、红头文件、流程自定义、流程审批、会签、催督办等功能。可按照30、60、100、200用户购买。 数飞公文流转系统功能...
流程定制则允许用户根据实际工作需求自定义审批流程,比如设置紧急公文的快速通道。状态跟踪则可以帮助用户实时查看公文的处理进度。 此外,安全性是公文管理系统不可忽视的一环。这包括用户身份验证(如用户名密码...
《建筑行业办公室公文处理流程详解》 在建筑行业中,公文处理是日常工作中不可或缺的一环,它涉及到公司的决策传达、信息交流以及管理工作。本文将深入解析“建筑行业办公室公文处理流程(平行文)”,旨在帮助相关...
公文类型:自定义公文类型、按公文类型过滤显示、按公文类型调用。 3. 涉密公文:选择特定的分组、用户签收,其他人无权查看。。 4. 附件公文:可以在公文内增加附件。 5. 签收公文:签收公文后记录签收信息,实时...
它不仅包含了公文审批的自定义流程功能还包含了自定义公文审批单据功能,用户完全可以对需要使用的公文单据如:请示、报告、通知、通报等自定义样式、自定义字段、自定义模板,不需要懂程序开发,只要在浏览器下...
1. 工作流定制:系统允许用户自定义工作流程,根据单位内部的实际需求设定审批层次、节点和顺序,确保公文流转的顺畅。 2. 流程跟踪:每个公文的状态和流转路径在系统中都有清晰记录,方便查询和追踪,确保每个环节...
1. **公文创建**:用户可以根据预设的公文模板或自定义格式创建新的公文,填写公文内容、指定收文单位和个人,设置流转规则。 2. **审批流程**:系统根据设定的审批流程自动将公文分发给相关人员,审批人可以查看、...
公文流转系统是企业内部管理的重要组成部分,它主要用于规范工作流程,提高工作效率。在这个系统中,我们主要关注的是微软企业库(Microsoft Enterprise Library)的应用以及Asp.net、Ajax、Js和JavaScript等Web开发...
《建筑业办公室公文处理流程(下行文)》的讲解 公文处理流程是任何组织内部信息流通的关键环节,尤其在建筑业这种需要高度协调与管理的行业中。下行文是指上级机构向其下属单位传达指令、政策、通知等信息的文书流动...
2. **工作流引擎**:系统可能内置了工作流引擎,允许用户自定义公文审批流程,根据不同的公文类型和内容设定不同级别的审批节点,确保公文处理的高效性和准确性。 3. **权限控制**:为了保护敏感信息,系统可能会有...
表单建模.zip包含自定义表单的设计和定义,如字段类型、必填项、验证规则等。这些数据字典有助于构建符合业务需求的表单,提升数据录入的效率和准确性。 6. **知识管理**: 知识管理.zip可能包括文档分类、版本...
此外,公文流转过程中还应支持添加批注、转发、会签等功能,以满足不同场景的需求。 在实际应用中,"oa_09"可能代表该系统的一个特定版本或者一个特定的模块,它可能包含了公文流转实现的详细代码、配置文件、...