通用工作列表的设计
applebomb[优快云]
§ 概述
对于工作流系统,工作列表是系统的一个非常核心的部分,工作列表的操作效率直接影响到系统的性能和用户的操作体验。本文对于实现JBPM的工作列表,结合可能遇到的情况,提出一种通用的设计方案。
对于工作流系统,工作列表是系统的一个非常核心的部分,工作列表的操作效率直接影响到系统的性能和用户的操作体验。本文对于实现JBPM的工作列表,结合可能遇到的情况,提出一种通用的设计方案。
§ 实现难点
实现通用处理工作流信息表的一个难点是:工作列表可能有排序和附加参数的功能。并且将来可能不断变化。
当前预计可能遇到的实例情况有:
实现通用处理工作流信息表的一个难点是:工作列表可能有排序和附加参数的功能。并且将来可能不断变化。
当前预计可能遇到的实例情况有:
1) 不同业务工作列表合并
由于业务人员认为点不同菜单出不同流程的工作列表不方便,并且此几个不同的流程具备同样的jsp用户列表视图,那么业务人员希望将此多个流程的工作列表合并,将几个处理的工作合并到一个工作列表。
由于业务人员认为点不同菜单出不同流程的工作列表不方便,并且此几个不同的流程具备同样的jsp用户列表视图,那么业务人员希望将此多个流程的工作列表合并,将几个处理的工作合并到一个工作列表。
2) 灵活搜索的需求
在实际使用中,发现经常需要按照某一方式来搜索,例如搜索金额占比小于100%的,而按照以前的工作列表设计方式。则需要JOIN对应的业务TABLE来操作,如果多个信息位于不同的业务TABLE,那么则可能消耗过多的资源在表连接上,导致工作列表消耗系统资源过大,反映变慢的情况。在工作流系统中,此缺陷尤其严重。
在实际使用中,发现经常需要按照某一方式来搜索,例如搜索金额占比小于100%的,而按照以前的工作列表设计方式。则需要JOIN对应的业务TABLE来操作,如果多个信息位于不同的业务TABLE,那么则可能消耗过多的资源在表连接上,导致工作列表消耗系统资源过大,反映变慢的情况。在工作流系统中,此缺陷尤其严重。
3) 随时添加附加信息
附加信息并不一定是查询的,例如涉及到一个打印过的流水变红来提示用户的需求,该信息并不需要查询,但是需要根据该信息来设置流水的显示状态。或者根据不同流水的类型,需要显示不同的按钮菜单直接从工作列表上点入,而不需要切换到审批界面,增进操作员的操作效率,这些都是有可能需要的附加信息。
附加信息并不一定是查询的,例如涉及到一个打印过的流水变红来提示用户的需求,该信息并不需要查询,但是需要根据该信息来设置流水的显示状态。或者根据不同流水的类型,需要显示不同的按钮菜单直接从工作列表上点入,而不需要切换到审批界面,增进操作员的操作效率,这些都是有可能需要的附加信息。
解决方案
为了应对这样的情况,将工作列表信息的类型设置为两类:1,索引字段,2非索引字段:索引字段用于查询,而非索引字段仅进行记录。
WORK_INF (记录索引字段)
逻辑名
|
名称
|
类型
|
描述
|
工作流信息ID
|
WORK_INF_ID
|
INTEGER
| |
流程ID
|
PID
|
INTEGER
|
processInstanceId
|
流程名称
|
PROCESS_NAME
|
INTEGER
|
流程类型名称,由JBPM_PROCESSDEFINITION定义的名称
|
参数名称
|
PARA_NAME
|
CHAR(64)
| |
参数类型
|
PTYPE
|
CHAR(1)
|
S(String),B(Boolean),D(Datetime)或X(XML)。可以利用Hibernate的discriminator-value来区分类型
|
DOUBLE参数
|
FVALUE
|
DECIMAL
| |
DATETIME参数
|
DVALUE
|
DATETIME
| |
STRING参数
|
SVALUE
|
CAHR(255)
|
有颜色的字段均建立索引,用于查询。流程ID和参数名称一组建立为组合唯一索引。
WORK_XML (记录工作流的所有信息,XML信息记录了所有字段数据)
逻辑名
|
名称
|
类型
|
描述
|
流程ID
|
PID
|
INTEGER
|
processInstanceId
|
XML参数
|
XML
|
VARCHAR(1024)
|
该信息可以采用Xstream兼容形式,各HashMap数据采用JAVA原始类型,方便的转换为HashMap与其它类型参数方便的拼接为工作列表记录信息
|
如果有需要默认排序的列,有两种方案,一是添加排序用的字段信息在WORK_XML,例如增加一个提交时间字段。或者再增加缓急度字段来进行order by,二是采用displayTag的默认排序,即defaultsort="列数"来对指定列默认排序。
例如,当前列表需要显示名称为ccas及cbsp流程的工作列表,列表查询参数名为”amount”的double值小于10000的表信息并按完成时间PNAME=”finish_time”,值为DATETIME倒排序,即可用以下SQL:
SELECT WORK_XML.* WHERE PID IN
(SELECT PID FROM WORK_INF WHERE PROCESS_NAME IN (‘ccas’,’cbsp’) AND PARA_NAME =’amount’ and DOUBLE<10000)
然后将WORK_XML的流程参数转换为HashMap作为行记录
XStream xstream = new XStream(new DomDriver("GBK"));
然后将WORK_XML的流程参数转换为HashMap作为行记录
XStream xstream = new XStream(new DomDriver("GBK"));
HashMap dataMap = (HashMap)xstream.fromXML(workXml.xml);
排序功能则使用displayTag自带的功能排序,即可完成这个用户需求功能。
这样一来,就可以将多种类型流程,多种查询方式及多种排序方式写成一种通用的工作列表方法了。
排序功能则使用displayTag自带的功能排序,即可完成这个用户需求功能。
这样一来,就可以将多种类型流程,多种查询方式及多种排序方式写成一种通用的工作列表方法了。
缺点和不足
这样的设计也有其不足,主要问题是,投产以后,已有使用参数的是否索引的改变。例如某参数之前是仅显示用的,WORK_INF表没有其信息,而从增加的时间前WORK_INF流水没有记录次参数PARA_NAME的信息因此也无法被查询出来。可以考虑采用一个批量处理程序将之前的需要用索引搜索的参数插入到WORK_INF表内。