节点配置
通用节点配置
常规
常规节点可以配置当前节点的基本信息
ID:当前节点的ID名称:当前节点的显示名称描述:当前节点的描述信息
执行监听器
暂略
开始/结束
开始/结束节点分别代表流程的开始和结束,是最基本的两个基础节点,在ZeroCloud中,任何的流程必然以开始节点开始,以结束节点结束
开始节点需要配置数据表,这样数据才能落库。 
审批
审批节点主要用于确定对审批的办理人和审批的规则
审批节点
此区域主要用于配置审批节点的审批规则,如
办理人、操作权限、处理规则等

其中:
办理人
指定此审核节点的办理人(处理人),详细规则请参考办理人配置部分的介绍
操作权限
审批节点办理人只能执行勾选上的操作
批量同意
无需打开表单,直接在我的任务页面上选中待办任务,批量通过。注:只有配置了批量同意权限的任务,才能正常同意

退回重填
将流程退回到填写节点,让发起人重新填写表单内容。例如审批时发现部分数据错误或缺失
方式1:在我的任务页面,对应任务的操作栏中,点击更多,然后点击退回重填

方式2:打开流程表单,在操作栏中,点击退回重填

退回某步
将流程退回到已经处理过的指定节点


取回
将进行中的流程,取回到已经处理过的节点。例如流程发起后,发现数据填错,在审批人未审批前,将流程取回重填
发起人取回
在个人申请页面,选中进行中的流程,然后点击取回

或者在个人申请页面,打开流程表单,点击更多操作,点击取回

办理人取回
在已办任务页面,打开流程表单,点击更多操作,点击取回

取回配置

转办
将流程任务交给他人处理。转办后,转办人待办列表中会显示该任务



撤销


拒绝


加签
临时添加一位或多位审批人,共同处理该任务


保存、暂存
审批阶段,对表单内容进行了修改后保存,以便下次打开后继续进行数据调整。注:保存会触发表单中的校验规则,暂存不会

直送
退回重填后,跳过中间的审批节点,将流程前进到退回重填的节点

使用直送时,审批节点和填写节点都要配置直送权限


无匹配办理人策略
当此审核节点没有对应的办理人时执行的操作
跳过本步骤:自动跳过当前审核节点不允许提交:不允许用户执行提交操作
自动同意规则
指定此审核节点在何时可以自动同意,可以有效的避免重复审核
办理人为发起人:如果当前节点的办理人是发起人自己,将自动跳过此审核节点
共享处理
指定此审核节点是否允许多个办理人共享处理,打开共享处理,任务会进入到共享任务中,需要先获取处理权,才能继续处理
数据控制
数据表
配置当前审核节点使用的数据表
- 点击编辑表定义按钮

- 在打开数据表定义页面中配置需要使用到的数据表,明细表需要勾选明细表的选项,根据需求决定是否需要自动创建行。

- 数据表中可以设置默认值及提交值

默认值为这个字段没有值的时候才会生效。距离说明,前置节点已经设置了提交值,那么后置节点的默认值不会生效。
提交值跟默认值都是实际都是java语句,所以需要赋值常量时,需要加上""括起来。 提交值跟默认值也支持使用上下文变量直接赋值。


右侧通过单选框的形式,可以控制字段读写权限,也可以添加必填校验和开启字段留痕
开启字段留痕后,在开启留痕的节点打开表单时,字段对应的输入组件右上角会出现如图所示标识,点击后可以查看痕迹

节点表单
配置当前审核节点对应的表单
- 点击选择框右侧的放大镜图标

- 在打开的
选择表单对话框中,选择对应的表单即可。

会签
会签节点和审批节点类似,与审核节点不同,会签节点有一些额外的配置,可以更灵活的控制多人审核时的场景

配置审核节点中的项和普通的审核节点一致,区别是额外多了一个会签的配置

其中:
会签模式
用于控制会签的签核模式,有顺序签核以及并行签核
顺序签核:是由审核节点中配置的办理人列表的顺序依次审批并行审核:则是办理人列表中所有办理人并行审批

会签通过比例
会签通过比例用于配置在审核的通过规则
一票通过:有一个办理人同意即可通过半数以上通过:当一半以上办理人同意时通过按比例通过:当指定比例的办理人同意时通过按数量通过:当指定数量的办理人同意时通过全部通过:当所有办理人均同意时方可通过一票否决:有一个办理人否决即`不通过``半数以上否决:有一半以上办理人否决即不通过按比例否决:有指定比例办理人否决即不通过按数量否决:有指定数量办理人否决即不通过全部否决:当所有办理人均否决时才不通过


允许否决
只有开启后,审批人才能投否决票

否决后操作

自由签核
自由签核节点和会签节点类似,在配置中仅多了一个会签人指定节点选项

知会节点
知会节点正常配置办理人,但是无需办理人做任何操作,流程自动流转到下一个节点。

该任务会推送到流程门户->待办事项->我的待阅中,在这里可以进行已阅操作,或者知会操作

互斥网关
互斥网关和其他节点不同,条件节点的主要配置不在节点配置中,而在连线的配置中

在连接条件节点和其他节点后,选择连线,出现以下配置页面

其中:
条件类型
用于控制判断的方式,可选脚本或表达式,脚本方式可以通过脚本来进行条件判断,而表达式方式则允许通过js表达式进行判断
条件内容
填写具体的脚本或表达式
例如,需要判断指定数据表中的amount字段是否大于1000,这里使用的是juel表达式,建议使用juel表达式
${form_data_snapshot.ZeroCloudData.purchase_m.get(0).amount>=1000}
例如判断这个字段中是否包含指定字符

${form_data_snapshot.erp.buyer.get(0).user_name.indexOf("老师")!=-1}
这里也支持Groovy条件语言

def name = form_data_snapshot?.erp?.buyer?.get(0)?.user_name?: ''
def containsNurse = name.contains('护士')
使用提示
选中连线后,点击小扳手

选择默认流程。 这样在互斥网关发现没有符合条件内容的路径时,会走默认流程,如果不设置,流程就会报错。

或者能确定路径的配置可以包含所有情况,也可以。
并行网关
并行网关可以将流程的走向分离或整合,如果流程经过并行网关时,会分为多条流程继续执行,如果多条流程经过同一个并行网关时,会合并为一条流程
通过并行网关,可以控制流程走向

包容网关
包容网关是互斥网关和并行网关的综合体。当进行决策判断时,与互斥网关所不同的是,所有条件为true的后继分支都会被依次执行,如果所有分支条件决策都为false且该网关定义了一个默认的连线,那么该默认分支将被执行。如果没有可到达的分支,抛出异常,该网关所处的分支被中断,在流程设计上应避免这种情况发生。包容网关有分支和合并两种行为,允许多进多出。 
SQL脚本
数据源
首先需要配置sql语句交互的数据源 
脚本语言
支持groovy和freemark两种格式,推荐使用groovy

SQL脚本
通过sql语句,直接交互数据库
点击按钮可以打开编辑页面,左侧可以快速插入变量值,注:快捷插入的变量是用${}包起来的,选择Groovy脚本时要去掉

Groovy示例
修改语句
def businessKey = variables["zc_business_key"];
def sql = "update demo set state = 1 where business_key = '$businessKey'";
//process打印sql
println sql;
return sql;
循环明细表
def businessKey = variables["zc_business_key"];
def codes = "";
formData["erp"]["purchase_m_detail"].each{
if(it["quantity"] > 1){
if(codes == ""){
codes = it["material_code"];
}else{
codes = codes + "," + it["material_code"]
}
}
}
def sql = "DELETE FROM purchase_m_detail WHERE business_key = '${businessKey}' AND material_code IN ($codes)";
println sql;
return sql;
Freemarker示例
修改语句
update demo set state = 1 where business_key = '${formData["zerocloud_data"]["test"][0]["business_key"]}';
设置变量
<#assign item_code = '010'>
<#assign item_name = formData["erp"]["buyer"][0]["user_name"]>
INSERT INTO `erp`.`stock`(`item_code`, `item_name`) VALUES ('${item_code}', '${item_name}')
判断传参是否为空
<#assign item_code = '010'>
<#assign user_name_exists = formData["erp"]["buyer"][0]["user_name"]?has_content>
<#if user_name_exists>
<#assign item_name = formData["erp"]["buyer"][0]["user_name"]>
<#else>
<#assign item_name = 'Default User Name'>
</#if>
INSERT INTO `erp`.`stock`(`item_code`, `item_name`) VALUES ('${item_code}', '${item_name}')
循环明细表并判断
<#list formData["erp"]["buyer"] as buyer>
<#assign item_code = '010'>
<#assign user_name_exists = buyer.user_name?has_content>
<#if user_name_exists>
<#assign item_name = buyer.user_name>
<#else>
<#assign item_name = 'Default User Name'>
</#if>
INSERT INTO `erp`.`stock`(`item_code`, `item_name`) VALUES ('${item_code}', '${item_name}')
</#list>
HTTP服务
通过http调用后端接口,完成业务逻辑 
Method:接口调用方式
URL:接口请求路径,当请求的是平台内置的自定义服务时,可以根据nacos别名使用/custom/**/**来请求。
使用本地项目或者其他第三方项目时,使用公网可以访问的url 
Query:携带在路径上的参数,可以点击右侧放大镜选择数据

Header:携带在请求头上的参数
Content Type:body请求体类型
Body:post请求请求体,使用java代码封装成请求的json格式数据

示例语句就是把[数据源][表名]转换为一组json格式的数据
return new ObjectMapper().writeValueAsString(formData["zerocloud_data"]["purchase_t"]
);
更新数据
对指定数据源,指定数据表的数据进行操作
添加数据表


更新方式
- 更新:更新已存在的数据
- 合并:存在则更新,不存在则插入
- 插入:插入一组新数据
- 删除:删除匹配的数据
更新规则

左侧选择数据表中的字段,右侧配置要插入或修改的值。分为常量、字段和公式三种类型。
选择常量时,字符串类型要用""包起来
选择字段时,点击放大镜可以选择流程关联数据表中的字段
选择公式时,可以将多个字段进行拼接,使用formData["数据源"]["数据表"][0]["字段名"]的方式来取字段值
匹配规则
当更新方式为更新、合并或删除时,用来判断哪些数据需要操作

子流程
在某个流程执行过程中可以创建一个新的流程并执行,结束后可以返回父流程的流程。发起子流程时,主流程会等待子流程执行完,同时子流程的执行结果会影响主流程,比如子流程若被拒绝,那么主流程也会拒绝。平台提供了两个子流程组件,分别是调用子流程和嵌入子流程
调用子流程
绑定流程key,可以在流程中调用流程 
嵌入子流程
嵌套子流程跟住流程使用一套数据,使用嵌套子流程的目的是方便流程展示,保证流程可读性。 点击右下角小箭头可以编辑子流程 
进入子流程后,必须配置开始节点跟结束节点
点击左上角超链接,可以回到主流程。
发起流程
发起一个新的流程实例,不会等待其执行结果也不会受其审批结果影响。

配置数据输入时,发起流程的主表数据只能来自于当前流程的主表数据,明细表数据也只能来自于当前流程的明细表数据
