第一章. Web前端设计

1. 概述

本项目的Web前端采用AngularJS+SeaJS的框架来实现。

Web前端的工作涵盖如下几大块内容:

1. 基本功能流程
2. 单元测试
3. 页面动画

2. 安装和部署

前端代码采用bower进行版本管理,用grunt来跑代码。安装部署过程如下(以crm_oa_web_admin为例,crm_oa_web_frontend过程一致):

  1. Mac OSX下的过程如下(前提是安装了brew)

    1. 安装nodejs:

      brew install nodejs

    2. 安装grunt

      npm install -g grunt-cli --registry=https://registry.npm.taobao.org

    3. 安装Compass

      a. 安装ruby

       brew install ruby
      

      b. 安装compass

       gem sources --remove https://rubygems.org
       gem sources -a https://ruby.taobao.org/
       gem install compass
      
    4. 安装bower

      npm install -g bower --registry=https://registry.npm.taobao.org

    5. 安装依赖的JS:

      a. cd crm_oa_web_admin

      b. bower install

      c. npm install --registry=https://registry.npm.taobao.org

    6. 启动代码

      a. cd crm_oa_web_admin

      b. grunt server

  2. Windows的过程如下

    1. 安装和配置nodejs

      参考资料:http://jingyan.baidu.com/article/2d5afd69e243cc85a2e28efa.html 注意:请将nodejs安装到C:/根目录下

    2. 安装Python 2.7.x,若已经安装,则无需安装。

      注意:需要将Python的可执行程序加入到环境变量中去。默认安装路径应该是C:\python27。

    3. 安装grunt

      a. npm install -g grunt-cli --registry=https://registry.npm.taobao.org

      b. 配置环境变量:添加grunt的路径到变量Path,以胡小根的Win7为例,路径为:C:\Users\hxgqh\AppData\Roaming\npm\node_modules\grunt-cli\bin

    4. 安装Compass(因为本系统的前端CSS采用SASS编写)

      a. 安装ruby-2.2.3 64位点击32位版本安装Ruby需要注意的配置

      b. 安装Compass

       gem sources --remove https://rubygems.org
       gem sources -a https://ruby.taobao.org/
       gem install compass
      
    5. 安装bower

      a. 安装bower:

       npm install -g bower --registry=https://registry.npm.taobao.org
      

      b. 添加bower的路径到变量Path,以胡小根的Win7为例,路径为:C:\Users\hxgqh\AppData\Roaming\npm\node_modules\bower\bin

    6. 安装Visual Studio 2015

    7. 安装依赖的JS

      a. cd crm_oa_web_admin
      b. bower install
      c. npm install --registry=https://registry.npm.taobao.org

    8. 启动代码:

      a. cd crm_oa_web_admin
      b. grunt server

  3. Ubuntu下的过程如(暂略)

3. 代码结构

Web前端的代码结构如下:

- app   # 代码的主目录
- dist  # grunt打包后的目录
- docs  # grunt-docular生成的代码说明目录
- node_modules  # npm依赖库
- bower_compenents  # bower依赖库
- test  # 测试代码
- tmp   # UI人员放置临时代码的目录

4. 页面渲染流程

由于本系统的权限机制控制较为复杂,于是页面的渲染过程需要作进一步的细化。具体来说包括以下主要流程:

1. 用户认证过程
2. 界面功能授权过程
3. 界面数据授权过程
4. 数据渲染过程

本系统前端权限的设计原则是:

1. 凡是用户可见到的操作,除非商业逻辑上不允许,否则都可以操作;
2. 凡是用户为授权的功能,除非后台授权,否则都不能存在;

前台菜单产生

本系统的菜单结构如下:

- 首页
- CRM
    - 客户
    - 物料
    - 自定义业务场景(数量不限。这里取决于后台配置了多少个)
- 办公
    - 工作报告
    - 通讯录
    - 知识库
    - 流程
- 统计

前台CRM下内容详情页产生

这里说的内容页指的是点击某条客户、物料或自定义业务场景数据,右边展开的详细内容页面。

#

5. 表单验证

这里根据系统涉及到的增删改查表单进行说明。 以下对字符长度的计算,单位为Byte。

5.1 Web后台

5.1.1 业务场景

5.1.1.1 业务场景

相关字段:

名称:
    必填
    长度<=10
管理方式:
    必填
状态:
    必填
描述:
    可选
    长度<=1024

涉及到的表单:

添加业务场景表单
编辑业务场景表单
5.1.1.2 阶段

相关字段:

名称:
    必填
    长度<=128
顺序:
    必填
    只能为正整数,>0且<4294967295
百分比:
    必填
    只能为正小数
    >0.0且<=100.0
描述:
    可选
    长度<=1024

涉及到的表单:

添加阶段表单
编辑阶段表单
5.1.1.3 事件

相关字段:

名称:
    必填
    长度<=128
顺序:
    必填
    只能为正整数,>0且<4294967295
百分比:
    必填
    只能为正小数
    >0.0且<=100.0
描述:
    可选
    长度<=1024

涉及到的表单:

添加事件表单
编辑事件表单
5.1.1.4 业务场景表定义

相关字段:

表名:
    必填
    必须以字母开头
    长度不能超过30个字符
    只能使用字符:A-Z,a-z,0-9
表描述:
    必填
    长度<=64
顺序:必填
    必填
    只能为正整数,>0且<4294967295
类型:
    必填
描述:(不应该存在)

涉及到的表单:

添加表定义表单
编辑表定义表单
5.1.1.5 业务场景字段定义

相关字段:

字段名:
    必填
    必须以字母开头
    长度不能超过30个字符
    只能使用字符:A-Z,a-z,0-9
字段描述:
    必填
    长度<=64
顺序:
    必填
    只能为正整数,>0且<4294967295
字段类型:
    必填
选项:
    当字段类型为“单选”,“复选”,“下拉列表”之一时,必填;
状态:
    必填
外链表:
    可选。
外链字段:
    当外链表已选择时,必选。

涉及到的表单:

添加字段表单
编辑字段表单

5.1.2 办公主数据

5.1.2.1 分类

相关字段:

父分类:
    可选
名称:
    必填
    长度<=64
顺序号:
    必填
描述:
    可选
    长度<=1024

涉及到的表单:

添加表单分类
编辑表单分类
添加流程分类
编辑流程分类
5.1.2.2 表定义

相关字段:

表名:
    必填
    必须以字母开头
    长度不能超过30个字符
    只能使用字符:A-Z,a-z,0-9
表描述:
    必填
    长度<=64
顺序:
    必填
    只能为正整数,>0且<4294967295
类型:
    必填

涉及到的表单:

添加表定义表单
编辑表定义表单
5.1.2.3 字段定义

相关字段:

字段名:
    必填
    必须以字母开头
    长度不能超过30个字符
    只能使用字符:A-Z,a-z,0-9
字段描述:
    必填
    长度<=64
顺序:
    必填
    只能为正整数,>0且<4294967295
字段类型:
    必填
选项:
    当字段类型为“单选”,“复选”,“下拉列表”之一时,必填;
状态:
    必填
外链表:
    可选。
外链字段:
    当外链表已选择时,必选。

涉及到的表单:

添加字段定义表单
编辑字段定义表单
5.1.2.4 流程

相关字段:

流程名称:
    必填
    长度<=128
流程分类:
    必填
流程表单:
    必填
流程顺序:
    必填
    只能为正整数,>0且<4294967295

涉及到的表单:

添加流程表单
编辑流程表单

5.1.3 用户权限管理

5.1.3.1 部门

部门表单测试,需要特别注意:

相关字段:

部门编码:
    必填
    长度<=16
部门名称:
    必填
    长度<=128
部门类型:
    必填
部门名称:
    必填
    长度<=128
显示顺序:
    必填
    只能为正整数,>0且<4294967295
描述:
    可选
    长度<=1024

涉及到的表单:

添加部门表单
编辑部门表单

对于部门的自定义字段,参见5.1.2.3。

5.1.3.2 角色

相关字段:

名称:
    必填
    长度<=128
描述:
    可选
    长度<=1024

涉及到的表单:

添加角色表单
编辑角色表单
5.1.3.3 用户

相关字段:

用户名:
    必填
    长度<=256
密码:
    必填
    长度<=32
手机号:
    必填
    长度<=16
邮箱:
    可选
    长度<=256
头像:
    可选
部门:
    必填
性别:
    必填
上级:
    可选
离职:
    可选
禁用:
    可选
办公电话:
    可选
    长度<=16

涉及到的表单:

添加用户表单
编辑用户表单

6. 动画设计

如何给第三方进行定制(例如给鸿合系统定制?)

定制需要满足以下原则:

1. 第三方的需求,若跟我们的需求变动较大,则原则上数据库的变动最少为宜(尽量只做增加,不做修改)
2. 若第三方的需求中,在我们基础上进行了删减,则通过前端js的方式将功能进行屏蔽,为每一个第三方制作一个third.patch.js文件,屏蔽不需要的功能模块。本系统的前端设计需要为这种patch机制留下入口。

7. 自定义流程开发前端指南

本系统向自定义开发开放了如下的接口:

1. 页面显示控制:控制按钮功能及表单内容显示的接口
2. 表单交互控制:控制表单输入项交互的接口
3. 流转流程控制:提供了流程的流转的控制接口
4. Rest请求:提供了流程相关的Rest请求接口
5. Api接口:提供了一些帮助函数接口,方便快速二次开发

若要开发自定义流程,可以遵循以下原则进行开发。

7.1 可以继承或复用的模块包括:

FlowApi - 流程相关的通用Api接口
FlowRestService - 流程相关的Rest请求接口
AbstractFlowCtrl - 流程的核心代码

7.2 开发的规则

定制流程开发时,不应该修改以下文件:

1. abstractFlowCtrl.js
2. flowApiService.js
3. flowRestService.js

对于定制的流程,有以下定制方式和内容:

7.2.1 重载AbstractFlow中的函数。

AbstractFlow中的一些显示控制的接口可以重载。

注意:只有形如vm.xxx函数才能重写;形如vm._xxx函数不能重写,只能使用,不能重写。可重写的函数列表如下:

功能按钮控制:
    vm.shouldShowAddDetailBtn(tableInstance)                    控制增加明细航的按钮显示、隐藏
    vm.shouldShowDeleteDetailBtn(tableInstance)                控制删除明细航的按钮显示、隐藏            
    vm.shouldShowDeleteProcessInstanceBtn()        控制删除流程的按钮显示、隐藏        
    vm.shouldShowApproveBtn()                        控制批准按钮的显示、隐藏            
    vm.shouldShowArchiveBtn()                        控制归档按钮的显示、隐藏        
    vm.shouldShowReturnBtn()                        控制退回按钮的显示、隐藏        
    vm.shouldShowSaveBtn()                        控制保存按钮的显示、隐藏        
    vm.shouldShowSubmitBtn()                        控制提交按钮的显示、隐藏        
    vm.shouldShowTransferBtn()                    控制转发按钮的显示、隐藏        
    vm.shouldShowWithdrawBtn()                    控制收回按钮的显示、隐藏
    vm.shouldShowTabMyRequest()                    控制“我的请求”Tab页的显示、隐藏。默认显示。
    vm.shouldShowTabMyAttention()                    控制“我的关注”Tab页的显示、隐藏。默认隐藏。

表单内容控制:
    vm.shouldShowTableInstance(tableInstance)                    控制表实例的显示、隐藏
    vm.shouldShowColumnInstance(tableInstance, columnInstance)                    控制字段实例的显示、隐藏

重载的写法如下:

vm.shouldShowXXX = function(){
    // 这里写你的逻辑,生成yourFlag的值
    // var yourFlag = true|false;
    return yourFlag && vm._shouldShowXXX();
}

7.2.2 监听AbstractFlow中抛出的事件。

抛出的事件列表包括如下几类:

1. 流程流转事件
2. 表单交互事件
3. 页面/Tab选项切换事件

所有的事件都是$rootScope级别的。

7.2.2.1 流程流转事件
1) beforeStartProcess         发起流程前。发送数据:process_definition_id。
2) afterStartProcess         发起流程后。发送数据:/process/{process_definition_id}/start接口返回的数据。
3) beforeSubmitForm            提交/批准流程任务表单前 。发送数据:formInstance
4) afterSubmitForm            提交/批准流程任务表单后 。发送数据:/task/{task_id}/form_instance/update接口返回的数据。
5) beforeSaveForm            保存流程任务表单前 。发送数据:formInstance
6) afterSaveForm            保存流程任务表单后 。发送数据:/task/{task_id}/form_instance/save接口返回的数据。
7) beforeLoadTaskFormInstance    加载流程表单前 。发送数据:task
8) afterLoadTaskFormInstance    加载流程表单后 。发送数据:formInstance
9) beforeReturnProcess        退回流程前 。发送数据:/task/{task_id}/form_instance/update接口返回的数据。
10) afterReturnProcess        退回流程后 。发送数据:/task/{task_id}/form_instance/update接口返回的数据。
11) beforeTransferProcess    转发流程前 。发送数据:task
12) afterTransferProcess    转发流程后 。发送数据:/task/{task_id}/transfer接口返回的数据。
13) beforeArchiveProcess    归档流程前 。发送数据:processInstance
14) afterArchiveProcess        归档流程后 。发送数据:/process_instance/{process_instance_id}/archive接口返回的数据
15) beforeWithdrawProcess    收回流程前 。发送数据:processInstance
16) afterWithdrawProcess    收回流程后 。发送数据:发送数据:/process_instance/{process_instance_id}/withdraw接口返回的数据
17) beforeDeleteProcess        删除流程前 。发送数据:processInstance
18) afterDeleteProcess        删除流程后 。发送数据:发送数据:/process_instance/{process_instance_id}/delete接口返回的数据
19) beforeConvertFormInstance2View    转换接口的表单实例数据为页面展示数据前。发送数据:formInstance
19) afterConvertFormInstance2View    转换接口的表单实例数据为页面展示数据后。发送数据:formInstance
7.2.2.2 表单交互事件
1) beforeDeleteDetailTable        删除明细前。发送数据:tableInstance
2) afterDeleteDetailTable        删除明细后。发送数据:tableInstance
3) beforeExpandDetailTable        展开明细前。发送数据:tableInstance
4) afterExpandDetailTable        展开明细后。发送数据:tableInstance
5) beforeCollapseDetailTable    收缩明细前。发送数据:tableInstance
6) afterCollapseDetailTable        收缩明细后。发送数据:tableInstance
7) beforeShowNotCommonColumn    显示非常用字段前。发送数据:tableInstance
8) afterShowNotCommonColumn        显示非常用字段后。发送数据:tableInstance
9) beforeHideNotCommonColumn    隐藏非常用字段前。发送数据:tableInstance
10) afterHideNotCommonColumn    隐藏非常用字段后。发送数据:tableInstance

1) onChangeColumnInstance        表单任意字段值改变。发送数据:{'columnInstance': columnInstance, 'tableInstance': tableInstance}
1) onFocusColumnInstance        Input输入框focus。发送数据:{'columnInstance': columnInstance, 'tableInstance': tableInstance}
2) onBlurColumnInstance        Input输入框blur。发送数据:{'columnInstance': columnInstance, 'tableInstance': tableInstance}
7.2.2.3 页面/Tab选项切换事件
1) loadPageTodoTask         切换到待办事宜。发送数据:null
2) loadPageResolvedTask        切换到已办事宜。发送数据:null
3) loadPageFinishedTask        切换到办结事宜。发送数据:null
4) loadPageMyRequest        切换到我的请求。发送数据:null
5) switchTabForm            切换到流程表单。发送数据:Null
6) switchTabDiagram            切换到流程图。发送数据:Null
7) onOpenForm                打开流程表单。发送数据:task
8) onCloseForm                关闭流程表单。发送数据:task

7.2.3 Hook流程流转

hookFunc = function(data){
    var deferred = $q.defer();
    // write your code here
    return deferred.promise;
}

支持的hook函数如下(用FlowApi.addHook来注册hook函数):

1) FlowApi.addHook(processDefinitionId, 'beforeStartProcess', hookFunc), hookFunc接受的参数为:process_definition_id
2) FlowApi.addHook(processDefinitionId, 'beforeSubmitForm', hookFunc), hookFunc接受的参数为:form_instance
3) FlowApi.addHook(processDefinitionId, 'beforeSaveForm', hookFunc), hookFunc接受的参数为:form_instance
4) FlowApi.addHook(processDefinitionId, 'beforeLoadFormInstance', hookFunc), hookFunc接受的参数为:task
5) FlowApi.addHook(processDefinitionId, 'beforeReturnProcess', hookFunc), hookFunc接受的参数为:process_instance
6) FlowApi.addHook(processDefinitionId, 'beforeTransferProcess', hookFunc), hookFunc接受的参数为:process_instance
7) FlowApi.addHook(processDefinitionId, 'beforeArchiveProcess', hookFunc), hookFunc接受的参数为:process_instance
8) FlowApi.addHook(processDefinitionId, 'beforeWithdrawProcess', hookFunc), hookFunc接受的参数为:process_instance
9) FlowApi.addHook(processDefinitionId, 'beforeDeleteProcess', hookFunc), hookFunc接受的参数为:process_instance

7.2.4 弹出框的定制

弹出框采用了angular-ui-bootstrap的$uibModal。 以下情况可能需要定制弹出框:

1)    当鼠标进入某个input字段的时候,需要定制弹出框。例如交货申请单里的合同号字段。
2)    添加明细的弹出框,需要进行定制。

定制弹出框需要修改的步骤:

1)    注册弹出框
    a. 进入scripts/Common/utils/crmModal.js,添加需要定制的弹出框:
        {modalName: {templateUrl: 'yourModalPath.html'}
    b. 在新增的xxxFlowCtrl.js中,添加:
        $scope.modal_map['modalName'] = crmModal.getModalById('modalName', $scope,             {
            controller: 'ModalNameCtrl',
            size: 'lg'
        });
2)     重载openModal和closeModal

  $scope.openModal = function (modal) {
    // 打开弹出框时,所有的input离焦,防止出现持续打开弹窗
    _.each(document.getElementsByTagName("input"), function(input){
      input.blur();
    });

    var modal_instance = $uibModal.open($scope.modal_map[modal]);
    $scope.modal_instance_map[modal] = modal_instance;
    modal_instance.result.then(function (data) {
      if (modal == 'yourModalName') {    
          // @todo: 这里应该放置关闭弹出框,获取弹出框数据的逻辑代码
      }
    });
  };

  $scope.closeModal = function (modal) {
    $scope.modal_instance_map[modal].dismiss('cancel');
  };

需要说明的是:

1. Hook和事件监听有些不同。
    a. Hook的所有函数,必须返回promise对象;事件监听的函数,可以返回任意对象;
    b. Hook的所有函数执行完之后,才会执行流程流转的函数;事件监听的函数,和流程流转的函数是"并行"的;
2. 弹出框除了可以新增,也可以系统目前支持的弹出框,包括:
    a. addFlowDetailTableInstance  添加明细弹出框
    b. archiveProcess  归档流程确认弹出框
    c. deleteProcess  删除流程确认弹出框 
    d. withdrawProcess  收回流程确认弹出框
    e. deleteProcess  删除流程确认弹出框
    f. returnProcess  退回流程确认弹出框
    g. transferTask  转发任务确认弹出框
    h. selectNextTaskUsers  选择下一节点操作者弹出框
    i. selectSingleCustomer  选择单个客户弹出框

3. 存在多个明细弹出框的情况下,重写弹出框addFlowDetailTableInstance的时候,需要根据$scope.new_detail_table_instance变量(新建表实例)的name属性判断是在添加哪种明细的弹出框;

7.3 数据结构

流程中重要的数据结构说明如下:

1. ProcessInstance - 流程实例,示例如下:


1. Task - 任务实例,示例如下:
  {
    "owner": null,
    "process_definition": {},
    "task_status": "pending",
    "parent_task_id": null,
    "create_time": "2016-08-14 11:50:46",
    "delegation_state": null,
    "end_time": null,
    "due_date": null,
    "description": null,
    "priority": 50,
    "title": "1.申请人",
    "task_inst_see": {
      "id": "61b56d18f5044f6f8c7c1a7c34b03fbf",
      "process_instance_id": null,
      "task_id": "1075144",
      "user_id": "4db570bc5cca4e11ba27df6315cdaa11",
      "create_time": "2016-08-14 11:50:47",
      "last_update_time": "2016-08-14 11:50:47"
    },
    "suspended": false,
    "process_instance_id": "1075136",
    "name": "1.申请人",
    "process_instance_no": {
      "id": "e3f2723663fe400db2879267a6e238e4",
      "year": null,
      "month": null,
      "day": null,
      "process_instance_id": "1075136",
      "process_no": "Z110020019",
      "process_definition_id": "f5f71f8e3c5d443da915e420fb94e839",
      "serial_number": 20019,
      "department_id": "9693f560a2a14c558f2009b504e41556",
      "create_time": "2016-08-14 11:51:36"
    },
    "assignee": {
      "id": "4db570bc5cca4e11ba27df6315cdaa11",
      "loginid": "3000308",
      "username": "王进军",
      "mobile": null,
      "email": null,
      "avatar": null,
      "sexual": null,
      "type": 1,
      "xslx": "2",
      "currentUserRoles": null,
      "locco": null,
      "department_id": "9693f560a2a14c558f2009b504e41556",
      "superior_id": null,
      "assistant_manager_id": null,
      "create_time": "2016-06-15 08:23:20",
      "last_update_time": "2016-08-09 08:33:15",
      "is_dismissed": 0,
      "is_forbidden": 0,
      "work_phone": null,
      "last_login_time": "2016-08-17 18:18:08",
      "security_level": 10,
      "department": {
        "id": "9693f560a2a14c558f2009b504e41556",
        "code": "1100",
        "name": "北京分支",
        "description": "北京分支",
        "parent_department_id": "c4ceb1768f4c4bc9a8328c79443d2bfa",
        "view_order": 1,
        "department_type_id": "0",
        "create_time": "2016-06-13 16:03:03",
        "last_update_time": "2016-08-06 15:32:02",
        "security_level": null,
        "simple_name": "1100"
      },
      "branch_department": null,
      "user_table_instances": null
    },
    "id": "1075144",
    "activiti_process_instance": {
      "starter": "com.haomostudio.crm.vo.CrmUserDVO@24074188",
      "create_time": "2016-08-14 11:50:46",
      "is_archive": false,
      "id": "1075136",
      "title": "转储申请单-北京分支-王进军-20160814"
    },
    "task_definition_key": "sid-F02DE457-6630-4044-85D3-09F0FD37B4A6"
  }

2. FormInstance - 表单实例,示例如下:
  {
    "id": "cb38987abb894a1081178f492a9d7a35",
    "name": "转储申请单",
    "description": "转储申请单",
    "withDraw": false,
    "transfer": false,
    "create_time": null,
    "last_update_time": "2016-08-15 09:14:08",
    "form_definition_id": "4fbbde85e1074f9aa046790835f6ba54",
    "creator_id": "3f4fc2edd2a14e499618967af4bb3980",
    "table_instances": [],
    "form_definition": {},
    "is_transfer": false,
    "task_ideas": [],
    "is_withdraw": false,
    "process_definition": {}
  }

3. TableInstance - 表实例,示例如下:
    {
      "id": "7dc48e4dec1e47e5abe806a81fbdda24",
      "rank": 1,
      "type": 0,
      "name": "EKKO",
      "description": null,
      "form_instance_id": "cb38987abb894a1081178f492a9d7a35",
      "table_definition_id": "c66dc75e1db249abbf2f9789323ef4a5",
      "display_name": "转储申请表单主表",
      "create_time": "2016-08-15 09:14:08",
      "last_update_time": null,
      "column_instances": [],
      "table_definition": {},
      "$$hashKey": "object:498"
    }

4. ColumnInstance - 字段实例,示例如下:
    {
      "id": null,
      "type": 1,
      "rank": 2,
      "name": "WFNO",
      "status": 1,
      "value": "Z110020021",
      "table_instance_id": "7dc48e4dec1e47e5abe806a81fbdda24",
      "column_definition_id": "bce5615d74b74fd1909f02ab030d02a4",
      "display_name": "转储单号",
      "is_visible": 1,
      "is_must": 0,
      "is_used_often": 1,
      "foreign_table_definition_id": null,
      "foreign_column_definition_id": null,
      "column_definition": {},
      "$$hashKey": "object:510",
      "is_writable": 0
    }

5. ProcessDefinition - 流程定义,示例如下:
    {
      "id": "f5f71f8e3c5d443da915e420fb94e839",
      "name": "转储申请单",
      "additionals": {
        "activiti_deployment_id": "1017684",
        "activiti_title_rule": {
          "rule": "{F}-{DE}-{U}-{Y}{M}{D}",
          "is_edit": 1
        },
        "title_rule": "流程规则",
        "process_no_rule": {
          "year_flag": false,
          "month_flag": false,
          "length": 5,
          "start": "20000",
          "alphabet": "Z",
          "department_level": "部门"
        },
        "attributes_linkage": [

        ],
        "activiti_model_id": "408172",
        "activiti_process_definition_id": "process:63:1017687"
      },
      "menuId": "07ab3e1faa0f435e9f72e3bb3ed3e04c",
      "status": 1,
      "process_category_id": "7af58c0d1c5e4e2e9f19bb155ea65735",
      "create_time": "2016-07-14 13:57:24",
      "last_update_time": "2016-08-07 10:27:47",
      "creator_id": "3f4fc2edd2a14e499618967af4bb3980",
      "view_order": 3,
      "form_definition_id": "28b4717561ad4def8deb60ff98916698",
      "act_model_id": "408172",
      "act_process_definition_id": "process:63:1017687"
    }
6. FormDefinition - 表单定义,示例如下:
    {
      "id": "28b4717561ad4def8deb60ff98916698",
      "name": "转储申请表单",
      "form_definition_id": "4fbbde85e1074f9aa046790835f6ba54",
      "creator_id": "3f4fc2edd2a14e499618967af4bb3980",
      "create_time": "2016-07-14 13:33:30",
      "last_update_time": "2016-08-15 10:16:16",
      "form_category_id": "46850533ae2246a2ac17bcdaf4172709",
      "view_order": 4
    }
7. TableDefinition - 表定义,示例如下:
    {
      "id": "c66dc75e1db249abbf2f9789323ef4a5",
      "rank": 1,
      "type": 0,
      "name": "EKKO",
      "description": null,
      "form_definition_id": "4fbbde85e1074f9aa046790835f6ba54",
      "display_name": "转储申请表单主表",
      "create_time": "2016-07-14 13:34:18",
      "last_update_time": "2016-07-14 13:35:05"
    }
8. ColumnDefinition - 字段定义,示例如下:
    {
      "id": "b36fb6a2f11d47fa937403abab035339",
      "rank": 104,
      "name": "ZC003",
      "status": 1,
      "type": 1,
      "additionals": "{\"options\":[],\"constraint\":{\"decimal\":{\"is_currency\":false,\"decimal_place\":2},\"text_length\":\"18\",\"multiLine_text_length\":4000},\"type\":1,\"javascript\":\"(function(){})\"}",
      "table_definition_id": "1ec7dd66df914c78a0a09811f8df1689",
      "display_name": "产品编码",
      "is_visible": 1,
      "is_must": 0,
      "is_used_often": 1,
      "foreign_table_definition_id": null,
      "foreign_column_definition_id": null,
      "foreign_column_definition": null,
      "is_writable": 0
    }

7.4 接口使用说明

7.4.1 页面显示控制

控制按钮功能及表单内容显示的接口,说明文档见:

7.4.2 表单交互控制

控制表单输入项交互的接口,说明文档见:

7.4.3 流转流程控制

提供了流程的流转的控制接口,说明文档见:

7.4.4 Rest请求

提供了流程相关的Rest请求接口,说明文档见:

7.4.5 Api接口

提供了一些帮助函数接口,方便快速二次开发,说明文档见:

7.5 示例

7.5.1 根据某些条件,控制表单的某个字段属性(可见、必填等)

7.5.2 表单元素focus,触发弹框(可以自定义任何触发事件)

7.5.3 在流程提交前,修改某些表单字段的值

第三方库

参考文档

1. http://island205.com/HelloSea.js/reference.html

results matching ""

    No results matching ""