#### 功能说明

非组件，提供了多种实现formchef表单联动的核心代码，包括以下5大核心功能
```js static

    genAssociatedFormula,//生成表单中数据互联和外部档案的联动数据
    genShareFieldFormula,//生成表单中共享字段的联动数据
    formChefParser,//核心代码，表单的联动解析器
    genFormulaFieldFormula,//生成表单中公式字段的联动数据
    DynamicFormCtrl,//根据表单的某些数据，实现字段动态配置（包括只读，必填，显示，隐藏，销毁）的核心代码

```
---

#### formulaParser（公式解析器）

一个解析器主要包含运算函数库，变量池，公式语义解析等功能，
简单的解析步骤如下：<br/>
比如解析一个公式"A+B+1"

* step1: 语义解析后得到A, B两个变量, 一个功能函数+, 一个常量1.
* step2: 变量池中寻找A, B，函数库中寻找函数+，找到后获取对应的变量值和函数方法。
* step3: 执行运算，返回结果

***ps: 解析器的变量池初始为空，可添加，删除，更新。函数库内置基础的加减乘除等算术运算功能，解析器实例提供功能函数的添加。***

#### formChefParser（表单解析器）

表单解析器依赖独立的formulaParser（公式解析器）实现，一个表单默认存在一个mainParser（主解析器），以及根据表单的配置信息生产的一些私有解析器。<br/>
注意：表单解析器同时也维护一个变量池，表单的变量池提供更多的功能和操作。

---

#### formChefParser数据关系规则数据模型

|属性名称|说明|类型|默认值|其他|
|--|--|--|--|--|
|targetField|目标字段|string|||
|referField|string|||触发目标字段的关联字段|
|formula|公式信息|string||比如：'A+1', '(A+B)/2'|
|privateParser|是否使用独立解析器|boolean||||
|parserName|私有编译器名称（标识）|string||||
|registerVariables|privateParser=true有效，待注册的变量集合|array[string/object]|||
|updatePool|privateParser=true有效，自定义更新<b>表单变量池</b>方法|function(referFieldValue)|无|返回的结果必须为对象，该对象的信息会被当作变量更新到<b>表单变量池</b>中|
|setFunctionList|在Parser中设置函数|object|无||
|asyncFn|异步函数|function|无|<span style="color:#faad14; ">一旦设置了asyncFn，则联动规则被当作异步触发的机制，<b>formula, privateParser, registerVariables, updatePool</b>等公式解析相关的属性定义将视为无效</span>|


---

#### asyncFn

表单联动的异步函数，字段触发后，可能会有通过异步的方式（从web服务）获取数据的情况，asyncFn就是用于承载异步的函数。<br/>
asyncFn函数对resolve的数据格式有一定的规则, resolve的格式<b style="color:#f5222d; ">必须</b>是{status, data}。<br/>

* status：反馈的状态，'success'表示成功
* data: 要更新字段的值，也就是targetField（目标字段）的值

***注意：asyncFn只能更新targetField的值，不要做额外的表单赋值动作，额外的动作有几率造成表单的死循环以及未知的性能问题。asyncFn不属于formulaParser（公式解析器）相关的属性，是由formchef衍生出来的一个概念属性。***

---

#### formChefParser表单变量池数据模型

|属性名称|说明|类型|默认值|其他|
|--|--|--|--|--|
|name|变量名|string|||
|parent|父变量|string||该变量依赖parent对应的变量，此属性目前只有在公式字段中存在使用场景|
|defaultValue|变量的默认值|any||变量首次注册的时候，默认值会作为初始值传入变量池|
|handle|变量处理函数|function||变量值在进入变量池之前的处理函数，return的值会作为变量池对应的变量值|

<div style="font-weight:bold; background:#f2f4f5; padding:8px 16px; margin-bottom:8px">对parent属性的定义，需要理解变量衍生变量的概念，一个变量A可能会衍生另外一个变量A1，A1的变更依赖A（即parent对应的变量），衍生的的方法通过handle转变，可以理解为公式：A1=f(A)</div>

***ps: 费控中的业务场景，可以参考二级表单衍生出一些变量，然后被单据中的其他一级字段所依赖，比如申请单金额会从申请明细列表的数组中某一个金额字段求和所得 ***

---

#### 更改记录

迭代：2019-10-14
内容：genShareFieldFormula，共享字段的规则，新增'FormAssociated'的表单成员。
