基于Extjs的web表单设计器 第七节——取数公式设计之取数公式定义


基于Extjs的web表单设计器

基于Extjs的web表单设计器 第一节

基于Extjs的web表单设计器 第二节——表单控件设计 

基于Extjs的web表单设计器 第三节——控件拖放 

基于Extjs的web表单设计器 第四节——控件拖放 

基于Extjs的web表单设计器 第五节——数据库设计

基于Extjs的web表单设计器 第六节——界面框架设计

基于Extjs的web表单设计器 第七节——取数公式设计之取数公式定义

基于Extjs的web表单设计器 第八节——表单引擎设计 


  本节我们介绍表单设计器的取数公式设计。对于一个系统来说,我们除了最基本的业务之外,可能针对不同的企业用户或者不同的生成环境的用户会动态的增加一些不同于现有业务类型的数据,这也就会导致实际的生产环境要求我们的表单控件支持不同的数据来源取数。在这里我先抛几个问题出来供大家思考一下:

  1. 一个比较复杂的表单的单控件一般有几种类型?
  2. 不同类型的控件数据来源形式有哪些?
  3. 针对这些不同形式的数据来源,我们能不能把它们抽象一下下,用一种比较统一的方式或者方法来集中对它们进行处理?

  我们仔细考虑一下这几个问题之后,会发现针对问题1表单的控件分类如下图一

  通过上面的图我们可以看出表单的控件基本上可以抽象的分为简单类型和复杂类型两类控件。

  对于问题2我们通过分析这些控件可以发现这几种不同控件的数据来源无非如下图二所示的几种方式。(PS:请注意Sad表情的几处地方,为什么我要用Sad表情,因为这几个地方通常是我们觉得灰常不好搞的地方)

 

  至此问题1、问题2都解决了,那么问题3呢?答案是肯定的。我们当然可以使用一种比较抽象的方式来针对不同方式的数据来源定义不同的取值方式。

  取数公式的设计我们可以分为两个部分进行分开设计(如下图三所示),一个是取数公式的定义部分,另一个是取数公式的解析部分。很明显我们除了要定义一套取数的公式之外,更重要的是能够解析这些取数公式,这样才能够在表单中灵活的使用它们来为我们工作。

  •  取数公式的定义

开始讲解取数公式的定义之前,先对几个概念做个解释,不然看不懂下面的图四。

系统资源:比如员工、组织结构等基础数据,也可以是系统涉及的业务类型、外部单位等等。总之我们可以把系统中使用的任何数据都当成一种资源。这些系统资源在系统中的存储除了它本身所具有的属性字段外,一般都还包含这些资源的Key、Value值。我们在具体业务中一般存储这些资源的Key,而在具体的单据中显示这些业务数据的时候,数据库会根据这些key去顺带出它对应的Value值。(总不能显示一串Id字符串吧,谁看得懂。)

静态资源:一般就是根据某种资源的Key直接获取该类型资源的所有数据,比如根据员工类型的Key获取系统的所有员工,静态资源一般可以设置默认值,和范围值。

动态资源:动态资源其实是相当于静态资源而言,它除了需要资源的Key之外,可能还需要其它参数来获取特定范围的该种资源,比如获取某个组织结构下的员工,而这个组织机构是根据表单上的另外一个控件来取值的。

  理清了这几个概念之后,我们正式进入取数公式的设计。我们认为一个设计得比较好的取数公式应该具有以下属性:公式名称、公式支持的控件类型、公式的输入参数(0个或者多个)、公式解析路径URL、资源类型Key、公式的描述。其中公式名称和公式支持的控件类型是每个公式的必带属性,其它是可选属性(参见图三所示。)这样定义的一个取数公式对用户来说是比较好识别的,通过公式名称和公式的描述属性可以很好的知道该公式是干嘛的,而其它几个属性则很好的描述的公式的适用控件类型、资源类型以及公式的输入参数和解析公式的URL。

  为了方便清晰的描述每一个取数公式,我们把所有的取数公式存放到一个XML文件中,通过XML的属性来描述每一个取数公式。这里举两个例子:

  例一 每个表单基本上都会具有一个单据编号,而这个单据编号一般都是系统后台根据一定规则动态生成的,我们这里可能定义的一个简单的“单据编号”的取数公式就是如下的形式:

它只包含公式的两个必要属性名称和控件类型,ControlType="TextField"表明了TextField类型(文本类型)的控件可以选择“单据编号”这个取数公式。

  例二 比如表单上有两个控件一个是“部门”的下拉树控件(A表示),一个是“部门员工”的下拉树控件(B表示),B的数据来源是根据A所选择的的部门来动态从数据库中获取的,那么可能我们需要为B定义一个“部门员工”的取数公式就是下面这个样子:

Description="获取某个部门下的">

   

      departId

   

 

  该公式包含了公式的所有属性,其中ControlType="NetDropDown"说明了我们的NetDropDown类型的控件(下拉树类型控件)可以使用这个公式,Url说明我们的公式解析路的路径是CommonFormController下面的GetDepartEmployee方法(这里关于MVC的路由映射我不做具体的解释,相信熟悉MVC的同学都知道。不知道的请自学MVC相关知识。)

  看到这里也许有些同学会问,例二“部门员工”有对应的URL去解析公式,而例一“单据编号”却没有URL,那么这个公式是如何解析的呢?其实细心的同学也许会注意到我们在定义公式的模型的时候”公式解析路径URL”是非必选项。对于这种缺省URL路径的公式我们当然会定义一个统一的方法去解析,这样就省的每一个公式都去定义自己的方法解析。这里对于系统的静态资源的获取我们肯定是可以统一的归纳一个方法去解析他们的。只有少量的、特殊的需求我们才需要写自己的方法去解析的。

      至此,我们就定义出了公式的基本模型。本节内容就先到这里,下一步我们就需要归纳出系统中常用的统一的取数公式。然后就是在我们表单设计中设计表单的时候针对某个控件属性的取数进行公式设置、校验、保存。具体请看下一节“基于Extjs的web表单设计器 第七节——取数公式设计之取数公式的使用“。