# 表单数据生命期

# Overview

  • 本文旨在解释表单数据生命期、及其权限控制和查错方式
  • 表单数据以实例为单位,实例间没有耦合

# Introduction / 简介

# Categories / 数据分类

  • 字段数据:主表单画的字段

  • 内部变量:比如 _VAR_ACTION_ACCOUNT(当前办理用户的账号)。点此处查看完整列表

  • 自定义变量:

    • 通过Messenger或脚本定义直接返回到FormData中的变量
    • 自定义变量的生命期从赋值之后一直有效
    • 可用于表单名称、标签替换,以及样式公式
    • 无法利用 DataBinding 的功能自动持久化
  • 附加属性:Code等类型的字段或一些变量会带有附加属性,通过加后缀表示

    • _Name后缀:作为Code时的显示值
    • _Codes和_Names:作为Datasource使用,每个条目之间回车分割
    • _Attr后缀:Code的额外属性

# Examination / 数据检查

除了直接肉眼查看渲染界面外,如下方式可辅助开发者调试

# [方式A] 前端渲染初始数据

在浏览器Console中,输入transformer.render.data查看加载数据

# [方式B] 前端渲染实时数据

在浏览器Console中,输入transformer.render.save()查看当前数据

# [方式C] 前后端传输数据

通过浏览器的网络通讯查看功能,在Request或Response中查看

# [方式D] 服务端传输数据

通过查看Messenger调用入口处的JSON,转化之后的数据不一定准确

# [方式E] 持久化数据

在IDE中,Project的Instances中,点击实例后的放大镜

# Presentation / 数据表示

# 传输数据

  • 如无特别声明所有传输采用key-value方式表示
  • 对于重复字段的数据,value是数组
  • 重复字段的定义可递归
  • 事件日期采用Unix时间戳

# 持久化数据

  • 使用InfoPath的Xml格式保存

# Instance Stage / 实例阶段

  1. 发起
  2. 办理:待办中查看
  3. 回顾:在办和已办中查看表单
  4. 打印
  5. 完成或终止
  6. 撤回
  • 一个实例可能会经历一次或多次上述阶段
  • 数据生命期部分将会按上面单独分析

# Life Cycle / 数据生命期

# 发起

  1. 初试化数据
  • 数据初始内容为InfoPath中的数据模版,默认无数据
  • CheckPoint 1: 通过解压缩InfoPath文件查看template.xml文件
  1. 发起时数据
  • 对于API发起的实例,可通过API参数以JSON给出,格式需符合上节的"数据表示"
  • 对于发起页发起的实例,数据可由发起页获得
  • CheckPoint 2: 对于存在发起页的,通过**[方式C]**查看
  1. 发起中数据
  • CheckPoint 3: 通过**[方式D]**查看
  • INSTANCE_STARTING事件中,可获得上述数据,并可修改
  • CheckPoint 4: 通过**[方式D]**查看
  • INSTANCE_STARTED事件中,可确认上述修改是否生效
  1. 持久化数据
  • 数据直接转化成XML保存
  • CheckPoint 5: 用户可在IDE中检查数据**[方式E]**

# 办理

# 渲染:数据从持久化到浏览器的过程

  1. 持久化读入
  • CheckPoint 1: 用户可在IDE中检查数据**[方式E]**
  • 引擎总会读入最新的持久化数据,而不一定是上个步骤提交的数据
  1. 完善数据
  • 重新计算内部变量
  • 计算非重复字段表单初值
  • 读入Code类型字段的附加属性
  1. 触发STEP_RENDERING
  • CheckPoint 2: 用户可在Messenger端检查数据**[方式D]**
  • STEP_RENDERING可返回数据来影响界面呈现但不会持久化
  • 修改的重复节字段请慎重,可能会带来FORM_DATA_UNAUTHORIZED异常
    • 重复字段需有写权限,如不希望用户更改,请设置该group的控件属性readOnly=true
  1. 步骤字段权限处理
  • 引擎会按照步骤字段权限,过滤掉用户不可读的数据传输给前台
  • 当前视图页/ViewPage中如有画出的字段,会忽略该字段的步骤字段权限
  • CheckPoint 3: 此时可在浏览器中检查**[方式A和方式C均可]**

# 交互:数据在浏览器中和用户交互的过程

  1. 渲染初始化过程
  • 此过程不会公式等改变数据的事情
  • CheckPoint 1: 如此时界面和上一个CheckPoint不符,请检查控件类型
  1. FIELD_CHANGING 事件
  • FIELD_CHANGING通过触发Messenger改变表单数据
  • 按钮点击、公式级联等也会触发 FIELD_CHANGING 事件
  • CheckPoint 2: 触发前后的数据可通过**[方式C]**检查
  • CheckPoint 3: 可在Messenger端检查**[方式D]**
  1. FIELD_SUGGESTING 事件
  • FIELD_SUGGESTING通过触发Messenger改变表单数据
  • CheckPoint 4: 触发前后的数据可通过**[方式C]**检查,注意通讯的URL有所不同
  • CheckPoint 5: 对于外部代码表,可通过**[方式D]**
  1. 公式和CodeTable级联
  • 公式和可由用户输入等其他任何可能的对数据的改变触发
  • 默认情况下CodeTable数据或Datasource改变时,会级联清空其下级CodeTable的显示数据
  • CheckPoint 6: 可通过**[方式B]**随时查看表单的当前数据

# 提交:数据在浏览器到持久化的过程

  1. 动作按钮点击
  • CheckPoint 1: 可通过**[方式C]**查看网络通讯
  • 触发 ACTION_CLICKING 事件,可 临时 修改表单数据
  • 该事件临时修改表单数据用于后续判断节点,但不会影响UI或持久化
  • CheckPoint 2: 可通过**[方式D]**在Messenger端检查
  • 触发动作脚本、后续自动脚本执行,但同样是 临时 修改表单数据
  1. 确认提交(或保草稿)
  • CheckPoint 3: 可通过**[方式C]**查看网络通讯
  • 注:存草稿和提交在表单数据方面工作流脚本之外,几乎具有相同的行为,所以在此一并讨论
  1. 步骤字段权限处理和完善
  • 读入步骤字段权限,并做如下处理:
    • 对于界面上不存在控件或节,移除其所有权限
    • 对于初始化只读的数据(InitR+)的字段,移除写权限
  • 按如下规则合并持久化数据和界面提交的数据:
    • 检查界面提交过来的重复节信息,如和工作流编辑器配置的该步骤的增、删、排序权限冲突,报FORM_DATA_UNAUTHORIZED异常
    • 有写权限的字段,以界面给的数据为准
    • 无写权限的字段,以数据库为准,但会重新计算其排序
  • 重新计算内部变量
  • 读入Code类型字段的附加属性
  • 对于InitR+的字段,计算字段表单初值
  1. 触发ACTION_DOING或ACTION_SAVING
  • CheckPoint 4: 可在Messenger端检查数据**[方式D]**
  • ACTION_DOING或ACTION_SAVING的返回值可以改变表单数据
  • 改变之后的数据会被重新计算Code类型的附加属性
  • 重新计算实例名称、标签
  1. 执行动作脚本和自动节点脚本
  • 存草稿动作不会触发本节事件
  • 可以修改表单数据
  • 这也是建立、使用"自定义变量"的一个时机
  • 脚本对数据的改变无法直接检查到。但作为调试可以在任何执行路径的脚本中加入 error.report(${“fieldName”}) 来输出表单数据的某项内容,并阻止流程继续执行。
  1. 触发ACTION_DONE 或 ACTION_SAVED 或 INSTANCE_COMPLETED
  • CheckPoint 5: 可在Messenger端检查数据**[方式D]**
  • 此时的数据即为最终持久化数据,Messenger无法更改
  • 对于阻塞的Messenger依然可以返回错误来取消持久化
  1. 持久化
  • 数据直接转化成XML保存
  • CheckPoint 6: 用户可在IDE中检查数据**[方式E]**

# Review / 回顾

  • 尚待完善
  • 按照实例的回顾,会自动跳转到该实例、该用户办理过的最后一步回顾
  • 一般情况下,回顾使用该实例的最新表单数据
  • 现阶段仅有如下情况,使用用户在该步骤提交时的表单数据
    • 处于动态并行节点内、且没有配置回顾模版

# View & Admin / 查看和管理

  • 尚待完善
  • 尚待完善

# Complete or Kill / 完成或终止

  • 尚待完善

# Withdraw / 撤回

  • 尚待完善
  • 撤回时保持数据不变,尚未支持事件修改。