`
julyboxer
  • 浏览: 222548 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

公文转发流程自定义的数据建模

阅读更多

开发比较复杂的企业多用户管理信 息系统(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)时参考。
  ③如果某份公文在某个流程中的某个环节被处理驳回,可以看作该公文在此次流程中被驳回至起始点,最初发送用户可根据处理回复注释修改公文后重新发送。


  总结:
  企业公文流程自定义应该是把企业内已经固定了的公文转发、审批流程电子化,实现高效的无纸化办公,对于非正式的口头 讨论、商议、集会等商务活动并不适合。当企业累积了一定数量的电子化公文转发的记录后,可以在商业咨询专家和技术开发人员的协助下对其进行数据挖掘,分析 出其中的低效、无用环节,进行优化重组,最终提高整个企业的竞争力。作为技术开发人员,我们应该根据企业实际运作情况、资金投入规模,选择当前时期最适合 的技术解决方案,切不可为了展示自己的技术实力,而把开发复杂化,企业开发并不是追求技术最先进,而且最适合。

分享到:
评论
1 楼 kaixin2838 2009-08-08  
遇到救星了,我正在学习公文流转 好多东西都不懂 资料也找不到 能不能给指点一下啊

相关推荐

    信息系统开发流程自定义文档

    总结来说,信息系统开发流程自定义文档的核心在于构建一个灵活、可扩展的MIS,它能够适应企业内部流程的变更,允许用户根据需要自定义审批流程、处理动作以及公文流转方式。通过合理的数据建模和权限管理,可以实现...

    li_3ck_02a_1118.pdf

    li_3ck_02a_1118

    基于MATLAB的牛顿迭代法实现

    基于MATLAB的牛顿迭代法实现

    mellitz_3ck_01_0319.pdf

    mellitz_3ck_01_0319

    2025探索银行业人工智能驱动技术转型的投资回报率

    内容概要:文章阐述了银行采用人工智能(AI)技术替代传统系统的紧迫性和收益,讨论了通过构建现代化的数据和技术平台实现效率提升的方法,同时强调实施过程中确保数据质量和建立信任的重要性。文中提及,在金融行业中,若想优化业绩则必须拥抱AI带来的机遇,并为此进行经营模式的革新。根据Workday主办的研讨会内容,PwC金融服务风险与监管领导和Workday金融服务高层指出了大部分银行对AI认知不足的问题,强调AI在金融、人力资源以及IT等领域的广泛应用潜力及具体应用场景,如欺诈检测、技能映射和财务管理方面的作用。并且提到了AI部署过程中可能出现的技术与非技术难题及相应解决办法,鼓励金融机构及时投资建设新型基础设施,以保持竞争力。 适用人群:银行及其他金融机构管理人员;金融科技领域的专业研究人员;对企业数字化和智能化转型感兴趣的商业分析师、投资者;从事信息技术咨询工作的顾问。 使用场景及目标:本文可以帮助金融机构制定合理的技术发展战略规划,评估是否有必要推进AI技术转型,同时也为希望涉足银行科技项目的开发者提供了宝贵的市场洞察,帮助理解行业内普遍存在的困难与潜在的市场需求。此外,对于想要了解银行

    matlab程序代码项目案例论文+程序 基于在线优化的快速模型预测控制Fast model predicitive control with matlab interface.zip

    matlab程序代码项目案例 【备注】 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用!有问题请及时沟通交流。 2、适用人群:计算机相关专业(如计科、信息安全、数据科学与大数据技术、人工智能、通信、物联网、自动化、电子信息等)在校学生、专业老师或者企业员工下载使用。 3、用途:项目具有较高的学习借鉴价值,不仅适用于小白学习入门进阶。也可作为毕设项目、课程设计、大作业、初期项目立项演示等。 4、如果基础还行,或热爱钻研,亦可在此项目代码基础上进行修改添加,实现其他不同功能。 欢迎下载!欢迎交流学习!不清楚的可以私信问我!

    [AB PLC例程源码][MMS_043071]Phase Manager and a Scalable Batching Solution.zip

    AB PLC例程代码项目案例 【备注】 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用!有问题请及时沟通交流。 2、适用人群:计算机相关专业(如计科、信息安全、数据科学与大数据技术、人工智能、通信、物联网、自动化、电子信息等)在校学生、专业老师或者企业员工下载使用。 3、用途:项目具有较高的学习借鉴价值,不仅适用于小白学习入门进阶。也可作为毕设项目、课程设计、大作业、初期项目立项演示等。 4、如果基础还行,或热爱钻研,亦可在此项目代码基础上进行修改添加,实现其他不同功能。 欢迎下载!欢迎交流学习!不清楚的可以私信问我!

    [AB PLC例程源码][MMS_044386]1769-SM2 Compact I-O to DSI Module - Multi Drive Mode Operation - with.zip

    AB PLC例程代码项目案例 【备注】 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用!有问题请及时沟通交流。 2、适用人群:计算机相关专业(如计科、信息安全、数据科学与大数据技术、人工智能、通信、物联网、自动化、电子信息等)在校学生、专业老师或者企业员工下载使用。 3、用途:项目具有较高的学习借鉴价值,不仅适用于小白学习入门进阶。也可作为毕设项目、课程设计、大作业、初期项目立项演示等。 4、如果基础还行,或热爱钻研,亦可在此项目代码基础上进行修改添加,实现其他不同功能。 欢迎下载!欢迎交流学习!不清楚的可以私信问我!

    [AB PLC例程源码][MMS_041232]Monitor I-O Connections in Logix.zip

    AB PLC例程代码项目案例 【备注】 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用!有问题请及时沟通交流。 2、适用人群:计算机相关专业(如计科、信息安全、数据科学与大数据技术、人工智能、通信、物联网、自动化、电子信息等)在校学生、专业老师或者企业员工下载使用。 3、用途:项目具有较高的学习借鉴价值,不仅适用于小白学习入门进阶。也可作为毕设项目、课程设计、大作业、初期项目立项演示等。 4、如果基础还行,或热爱钻研,亦可在此项目代码基础上进行修改添加,实现其他不同功能。 欢迎下载!欢迎交流学习!不清楚的可以私信问我!

    chromedriver-linux64-136.0.7058.0.zip

    chromedriver-linux64-136.0.7058.0.zip

    [AB PLC例程源码][MMS_042504]Logix5000 interface to Atlas-Copco Tool Controller over EtherNet-IP.zip

    AB PLC例程代码项目案例 【备注】 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用!有问题请及时沟通交流。 2、适用人群:计算机相关专业(如计科、信息安全、数据科学与大数据技术、人工智能、通信、物联网、自动化、电子信息等)在校学生、专业老师或者企业员工下载使用。 3、用途:项目具有较高的学习借鉴价值,不仅适用于小白学习入门进阶。也可作为毕设项目、课程设计、大作业、初期项目立项演示等。 4、如果基础还行,或热爱钻研,亦可在此项目代码基础上进行修改添加,实现其他不同功能。 欢迎下载!欢迎交流学习!不清楚的可以私信问我!

    [AB PLC例程源码][MMS_042349]How to read-write data to-from a PLC using OPC in Visual Basic 6.zip

    AB PLC例程代码项目案例 【备注】 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用!有问题请及时沟通交流。 2、适用人群:计算机相关专业(如计科、信息安全、数据科学与大数据技术、人工智能、通信、物联网、自动化、电子信息等)在校学生、专业老师或者企业员工下载使用。 3、用途:项目具有较高的学习借鉴价值,不仅适用于小白学习入门进阶。也可作为毕设项目、课程设计、大作业、初期项目立项演示等。 4、如果基础还行,或热爱钻研,亦可在此项目代码基础上进行修改添加,实现其他不同功能。 欢迎下载!欢迎交流学习!不清楚的可以私信问我!

    电力工程领域中背压热电联产电厂的设计与参数计算

    内容概要:本文档介绍了背压热电联产(CHP)发电厂的详细设计步骤,涵盖确定各状态点的压力、温度、比焓以及质量流率的具体方法。主要内容围绕计算净电功率、燃料消耗及其效率展开,并提供了T-s图绘制的指南。针对每个组件(如蒸汽轮机、冷凝器、除氧器等),都列出了详细的效率假设和压力损失表,为实际工程应用提供了宝贵的参考资料和操作指导。同时,该作业任务要求学生从给定初始值中选择合适的操作条件进行系统模拟,并利用课程讲义和Moodle平台资料完成计算流程。 适用人群:对能源转换和动力设备设计感兴趣的学生或者初涉该领域的工程师。 使用场景及目标:旨在帮助学员深入了解并掌握背压热电联产装置的工作原理和技术指标计算的方法论,通过实践练习提高他们的问题解决能力。 其他说明:文档强调了稳态运行假设的重要性,即物质平衡等于能量输入等于输出的原则,并鼓励参与者借助附录提供的典型操作参数图表来寻找解决问题的方向。此外,它还特别指出对于一些变量值求解可能需要迭代法来进行调整,直至获得稳定结果。提交的报告必须含有一份详细的T-s图和其他必要附件。

    机器学习-市财政收入分析(含数据集)

    机器学习_市财政收入分析(含数据集)

    [AB PLC例程源码][MMS_046989]KAT with Code Sequencer.zip

    AB PLC例程代码项目案例 【备注】 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用!有问题请及时沟通交流。 2、适用人群:计算机相关专业(如计科、信息安全、数据科学与大数据技术、人工智能、通信、物联网、自动化、电子信息等)在校学生、专业老师或者企业员工下载使用。 3、用途:项目具有较高的学习借鉴价值,不仅适用于小白学习入门进阶。也可作为毕设项目、课程设计、大作业、初期项目立项演示等。 4、如果基础还行,或热爱钻研,亦可在此项目代码基础上进行修改添加,实现其他不同功能。 欢迎下载!欢迎交流学习!不清楚的可以私信问我!

    tracy_3cd_01_0318.pdf

    tracy_3cd_01_0318

    lusted_3cd_01_0918.pdf

    lusted_3cd_01_0918

    基于51的自动分拣系统设计20250307

    题目:基于51的自动分拣系统设计 主控:AT89C52 测距模块:超声波测距模块 甲醛传感器(ADC0832+滑动变阻器模拟) 粉尘传感器(PCF8591+滑动变阻器模拟) 净化模块(继电器驱动蓝灯) 排风模块(继电器驱动绿灯) 电源电路(5V降压为3.3V供电) 显示模块(LCD1602) 声光报警 按键(3个,切换阈值选择,阈值加减) 检测物体:开关模拟 电机驱动模块(继电器驱动直流电机转动) 功能: 1.显示屏显示甲醛,粉尘浓度可以切换设置阈值。 2.通过甲醛传感器检测车间环境,大于阈值时声光报警并启动净化模块。 3.通过粉尘传感器检测车间环境,大于阈值时声光报警并启动排风模块。 4.采用超声波传感器进行物体超高监测异常(大于XX距离)时触发声光报警 5.检测到物体(开关闭合)直流电机转动(模拟传送带)

    network-server

    network_server

    [AB PLC例程源码][MMS_046691]Integrated Architecture Foundations of Modular Programming.zip

    AB PLC例程代码项目案例 【备注】 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用!有问题请及时沟通交流。 2、适用人群:计算机相关专业(如计科、信息安全、数据科学与大数据技术、人工智能、通信、物联网、自动化、电子信息等)在校学生、专业老师或者企业员工下载使用。 3、用途:项目具有较高的学习借鉴价值,不仅适用于小白学习入门进阶。也可作为毕设项目、课程设计、大作业、初期项目立项演示等。 4、如果基础还行,或热爱钻研,亦可在此项目代码基础上进行修改添加,实现其他不同功能。 欢迎下载!欢迎交流学习!不清楚的可以私信问我!

Global site tag (gtag.js) - Google Analytics