# 使用逻辑流和动作流实现校验明细表字段不能重复

来源快照：`result_data_new_260518.json`

- 来源 ID：`1243018180558127118`
- 模块：低代码平台e-builder
- 目录：专题学习 - 场景专题 - 动作流专题
- space ID：`1157961794811633670`
- 原文链接：未提供
- 产品基线：未提供

## 正文

# 一、编写目的

需求研发管理场景中每个研发任务的工时清单里人员不能重复出现在多个明细，同一个人的工时需要在一条明细汇总申报：

![](https://weapp.eteams.cn/papi/file/preview?fileId=1243022191854542858&type=redirect&customParam=%7B%22isExtDist%22%3Atrue%2C%22distributeId%22%3A%22%22%2C%22externalId%22%3A%22%22%2C%22appId%22%3A%22%22%7D)

类似上述表单或者流程数据填报时存在合规校验需求可以通过动作流或者逻辑流实现，本文档将会介绍在不同要求下如何实现明细表字段重复校验。

# 二、核心思路

整表提交时获取明细表的全部人员字段值，对人员字段进行去重，如果去重前后的人员数量一致则无重复，否则重复；

![](https://weapp.eteams.cn/papi/file/preview?fileId=1243022209067966469&type=redirect&customParam=%7B%22isExtDist%22%3Atrue%2C%22distributeId%22%3A%22%22%2C%22externalId%22%3A%22%22%2C%22appId%22%3A%22%22%7D)

每次新建明细行填写人员字段时循环遍历明细行查询是否存在其他行人员字段与当前行人员字段相等，存在则提示重复行位置并自动清除当前人员字段值。

![](https://weapp.eteams.cn/papi/file/preview?fileId=1243022200448253958&type=redirect&customParam=%7B%22isExtDist%22%3Atrue%2C%22distributeId%22%3A%22%22%2C%22externalId%22%3A%22%22%2C%22appId%22%3A%22%22%7D)

 

# 三、操作步骤

### 3.1动作流实现表单提交时校验

#### 场景介绍

点击表单保存按钮或者流程提交按钮时执行动作流校验明细表中是否存在重复数据，存在则弹出提示信息并阻止数据保存和流程提交：

![](https://weapp.eteams.cn/papi/file/preview?fileId=1243022191854542854&type=redirect&customParam=%7B%22isExtDist%22%3Atrue%2C%22distributeId%22%3A%22%22%2C%22externalId%22%3A%22%22%2C%22appId%22%3A%22%22%7D)

#### 整体配置

![](https://weapp.eteams.cn/papi/file/preview?fileId=1243022217661677583&type=redirect&customParam=%7B%22isExtDist%22%3Atrue%2C%22distributeId%22%3A%22%22%2C%22externalId%22%3A%22%22%2C%22appId%22%3A%22%22%7D)

#### 详细步骤

##### 1）根据实际校验场景需求添加触发组件

添加触发组件，流程校验场景选择流程触发，离开发起节点时；表单校验场景选择表单按钮触发，系统保存按钮执行前触发

![](https://weapp.eteams.cn/papi/file/preview?fileId=1243022217749348357&type=redirect&customParam=%7B%22isExtDist%22%3Atrue%2C%22distributeId%22%3A%22%22%2C%22externalId%22%3A%22%22%2C%22appId%22%3A%22%22%7D)

##### 2）添加数据汇总组件实现明细表字段去重

添加数据汇总组件，数据集选择需要校验的明细表，分组字段选择需要校验重复的字段，此处选择人员：

![](https://weapp.eteams.cn/papi/file/preview?fileId=1243022187662811137&type=redirect&customParam=%7B%22isExtDist%22%3Atrue%2C%22distributeId%22%3A%22%22%2C%22externalId%22%3A%22%22%2C%22appId%22%3A%22%22%7D)

##### 3）添加条件分支组件用len_array函数运算去重前后的明细表人员选项个数是否一致

添加条件分支组件，用len_array()函数分别结算分组前后的人员数组长度是否一致，不一致则代表存在重复项被分组合并了，终止组件拦截后续操作并提示原因：

![](https://weapp.eteams.cn/papi/file/preview?fileId=1243022200656764929&type=redirect&customParam=%7B%22isExtDist%22%3Atrue%2C%22distributeId%22%3A%22%22%2C%22externalId%22%3A%22%22%2C%22appId%22%3A%22%22%7D)

![](https://weapp.eteams.cn/papi/file/preview?fileId=1243022204775571459&type=redirect&customParam=%7B%22isExtDist%22%3Atrue%2C%22distributeId%22%3A%22%22%2C%22externalId%22%3A%22%22%2C%22appId%22%3A%22%22%7D)

![](https://weapp.eteams.cn/papi/file/preview?fileId=1243022196144898052&type=redirect&customParam=%7B%22isExtDist%22%3Atrue%2C%22distributeId%22%3A%22%22%2C%22externalId%22%3A%22%22%2C%22appId%22%3A%22%22%7D)

### 3.2逻辑流实现表单提交时校验

#### 场景介绍

点击表单保存按钮时取研发工时明细表的全部人员字段值进行去重，如果去重前后的人员数组长度不一致，则代表存在重复人员被去重操作合并了，弹窗提示人员不能出现重复并拦截表单保存：

![](https://weapp.eteams.cn/papi/file/preview?fileId=1243022209138851841&type=redirect&customParam=%7B%22isExtDist%22%3Atrue%2C%22distributeId%22%3A%22%22%2C%22externalId%22%3A%22%22%2C%22appId%22%3A%22%22%7D)

#### 整体配置

![](https://weapp.eteams.cn/papi/file/preview?fileId=1243022191954378764&type=redirect&customParam=%7B%22isExtDist%22%3Atrue%2C%22distributeId%22%3A%22%22%2C%22externalId%22%3A%22%22%2C%22appId%22%3A%22%22%7D)

#### 详细步骤

##### 1）添加表单事件拦截组件

新建逻辑流绑定当前表单，添加表单事件拦截组件，提示信息为“研发人员不能重复”

![](https://weapp.eteams.cn/papi/file/preview?fileId=1243022204775571457&type=redirect&customParam=%7B%22isExtDist%22%3Atrue%2C%22distributeId%22%3A%22%22%2C%22externalId%22%3A%22%22%2C%22appId%22%3A%22%22%7D)

2）

##### 添加变量赋值组件，初始化开发人员数组和开发人员文本变量均为空

![](https://weapp.eteams.cn/papi/file/preview?fileId=1243022204775571462&type=redirect&customParam=%7B%22isExtDist%22%3Atrue%2C%22distributeId%22%3A%22%22%2C%22externalId%22%3A%22%22%2C%22appId%22%3A%22%22%7D)

###### 这里为什么要定义两个不同类型的开发人员变量存储明细表的人员字段值？

数组类型的开发人员变量能直接返回数组长度及人员数量；

表单多选字段值以英文逗号拼接的字符串形式传入逻辑流无法直接存储到数组类型的变量；明细表暂不支持一次性获取全部明细行的某个字段值，目前的实现方案是遍历明细表，将每行的人员id以英文逗号分隔符依次拼接到一个文本变量，再通过字符串分割函数转换成数组格式。

##### 3）添加明细表操作循环遍历明细表获取全部人员字段值

添加明细表操作选择研发工时明细表，操作类型遍历明细行；

![](https://weapp.eteams.cn/papi/file/preview?fileId=1243022183393009676&type=redirect&customParam=%7B%22isExtDist%22%3Atrue%2C%22distributeId%22%3A%22%22%2C%22externalId%22%3A%22%22%2C%22appId%22%3A%22%22%7D)

明细表操作内添加获取字段值组件，新建一个文本变量当前人员，按照行索引获取名表每行的人员字段值；

![](https://weapp.eteams.cn/papi/file/preview?fileId=1243022191982944258&type=redirect&customParam=%7B%22isExtDist%22%3Atrue%2C%22distributeId%22%3A%22%22%2C%22externalId%22%3A%22%22%2C%22appId%22%3A%22%22%7D)

添加变量赋值组件，将每行人员字段值按照英文逗号拼接到开发人员文本变量；

![](https://weapp.eteams.cn/papi/file/preview?fileId=1243022187542798336&type=redirect&customParam=%7B%22isExtDist%22%3Atrue%2C%22distributeId%22%3A%22%22%2C%22externalId%22%3A%22%22%2C%22appId%22%3A%22%22%7D)

##### 4）将明细表表全部人员字段值转换成数组格式

添加字符串函数，将开发人员文本变量按照英文逗号分隔成数组，结果由开发人员数组变量接收;

![](https://weapp.eteams.cn/papi/file/preview?fileId=1243022204894216195&type=redirect&customParam=%7B%22isExtDist%22%3Atrue%2C%22distributeId%22%3A%22%22%2C%22externalId%22%3A%22%22%2C%22appId%22%3A%22%22%7D)

##### 5）将明细表全部人员字段值数组去重

添加数组函数组件，对开发人员数组变量进行去重，结果由去重后研发人员数组变量接收；

![](https://weapp.eteams.cn/papi/file/preview?fileId=1243022196269522946&type=redirect&customParam=%7B%22isExtDist%22%3Atrue%2C%22distributeId%22%3A%22%22%2C%22externalId%22%3A%22%22%2C%22appId%22%3A%22%22%7D)

##### 6）判断去重前后的数组长度是否一致

添加分支判断组件去重前后的两个数组长度是否一致，一致就继续保存，不一致就代表有重复项终止保存:

![](https://weapp.eteams.cn/papi/file/preview?fileId=1243022187542798342&type=redirect&customParam=%7B%22isExtDist%22%3Atrue%2C%22distributeId%22%3A%22%22%2C%22externalId%22%3A%22%22%2C%22appId%22%3A%22%22%7D)

![](https://weapp.eteams.cn/papi/file/preview?fileId=1243022196148682755&type=redirect&customParam=%7B%22isExtDist%22%3Atrue%2C%22distributeId%22%3A%22%22%2C%22externalId%22%3A%22%22%2C%22appId%22%3A%22%22%7D)

 

### 3.3逻辑流实现字段填写时校验

#### 场景介绍

新建明细行输入人员数据后立即校验刚输入的人员是否在前面的明细中出现过，如果已经出现过弹窗提示“当前输入的人员在前面第几行出现过，不能重复选择”，并自动删除刚输入的人员：

![](https://weapp.eteams.cn/papi/file/preview?fileId=1243022191984148482&type=redirect&customParam=%7B%22isExtDist%22%3Atrue%2C%22distributeId%22%3A%22%22%2C%22externalId%22%3A%22%22%2C%22appId%22%3A%22%22%7D)

#### 整体配置

![](https://weapp.eteams.cn/papi/file/preview?fileId=1243022183306551303&type=redirect&customParam=%7B%22isExtDist%22%3Atrue%2C%22distributeId%22%3A%22%22%2C%22externalId%22%3A%22%22%2C%22appId%22%3A%22%22%7D)

#### 详细步骤

##### 1）新建逻辑流添加触发组件为明细表人员字段数字修改和失去焦点时

新建逻辑流绑定表单，研发工时明细表下的人员字段拖拽到画布中：

![](https://weapp.eteams.cn/papi/file/preview?fileId=1243022209083916289&type=redirect&customParam=%7B%22isExtDist%22%3Atrue%2C%22distributeId%22%3A%22%22%2C%22externalId%22%3A%22%22%2C%22appId%22%3A%22%22%7D)

###### 失去焦点触发时机默认不显示，如何添加？

选中组件打开侧拉框，可以添加失去焦点等使用频率较低的其余触发事件：

![](https://weapp.eteams.cn/papi/file/preview?fileId=1243022200448253968&type=redirect&customParam=%7B%22isExtDist%22%3Atrue%2C%22distributeId%22%3A%22%22%2C%22externalId%22%3A%22%22%2C%22appId%22%3A%22%22%7D)

![](https://weapp.eteams.cn/papi/file/preview?fileId=1243022217749348352&type=redirect&customParam=%7B%22isExtDist%22%3Atrue%2C%22distributeId%22%3A%22%22%2C%22externalId%22%3A%22%22%2C%22appId%22%3A%22%22%7D)

##### 2）添加获取字段值组件获取当前人员字段值

添加获取字段值组件，连接人员组件数值修改和获取字段值组件，新建文本类型的变量存储当前输入的人员字段值：

![](https://weapp.eteams.cn/papi/file/preview?fileId=1243022183393009670&type=redirect&customParam=%7B%22isExtDist%22%3Atrue%2C%22distributeId%22%3A%22%22%2C%22externalId%22%3A%22%22%2C%22appId%22%3A%22%22%7D)

获取字段值的目标字段选择研发人员明细表下的人员：

![](https://weapp.eteams.cn/papi/file/preview?fileId=1243022213311774723&type=redirect&customParam=%7B%22isExtDist%22%3Atrue%2C%22distributeId%22%3A%22%22%2C%22externalId%22%3A%22%22%2C%22appId%22%3A%22%22%7D)

目标字段下面的两个参数，左侧行索引、行标识选择明细字段获取依据，如果选择按照行索引获取明细行字段值，右侧参数就要选择行索引（即行序号），选择按照行标识获取明细行字段值，右侧参数就要选择行标识（即行id）：

![](https://weapp.eteams.cn/papi/file/preview?fileId=1243022187662811139&type=redirect&customParam=%7B%22isExtDist%22%3Atrue%2C%22distributeId%22%3A%22%22%2C%22externalId%22%3A%22%22%2C%22appId%22%3A%22%22%7D)

##### 3）添加浏览按钮相关组件获取当前人员字段的标题栏内容（即姓名）

添加浏览按钮相关组件获取当前输入的人员浏览字段显示标题（即姓名），人员浏览字段实际存储为人员id，作为提醒内容弹出时人员id没有可读性，需要替换成姓名，新建文本变量存储人员名称，目标字段配置和前一个获取字段值组件一致：

![](https://weapp.eteams.cn/papi/file/preview?fileId=1243022200587083777&type=redirect&customParam=%7B%22isExtDist%22%3Atrue%2C%22distributeId%22%3A%22%22%2C%22externalId%22%3A%22%22%2C%22appId%22%3A%22%22%7D)

##### 4）添加明细表操作组件依次校验其他行是否存在相同人员字段值

添加明细表操作组件，依次当前输入的人员字段值和其他明细行的人员字段值是否重复。明细表操作类型选择遍历明细行，组件内添加获取字段值组件新建文本变量“其他行人员”存储每一行的人员字段值；按照行索引获取明细行人员字段值，实际索引选择节点上下文-明细表操作-行索引：

![](https://weapp.eteams.cn/papi/file/preview?fileId=1243022183393009672&type=redirect&customParam=%7B%22isExtDist%22%3Atrue%2C%22distributeId%22%3A%22%22%2C%22externalId%22%3A%22%22%2C%22appId%22%3A%22%22%7D)

添加条件分支组件，判断当前输入的人员字段行标识不一样的其他明细行人员字段值是否相同：

![](https://weapp.eteams.cn/papi/file/preview?fileId=1243022196144898051&type=redirect&customParam=%7B%22isExtDist%22%3Atrue%2C%22distributeId%22%3A%22%22%2C%22externalId%22%3A%22%22%2C%22appId%22%3A%22%22%7D)

![](https://weapp.eteams.cn/papi/file/preview?fileId=1243022200493981705&type=redirect&customParam=%7B%22isExtDist%22%3Atrue%2C%22distributeId%22%3A%22%22%2C%22externalId%22%3A%22%22%2C%22appId%22%3A%22%22%7D)

添加消息提醒组件，在出现人员重复时弹窗提示当前选择的人员姓名在前面第几行显示过：

![](https://weapp.eteams.cn/papi/file/preview?fileId=1243022187662811141&type=redirect&customParam=%7B%22isExtDist%22%3Atrue%2C%22distributeId%22%3A%22%22%2C%22externalId%22%3A%22%22%2C%22appId%22%3A%22%22%7D)

添加设置字段值组件将当前输入的人员字段值置空：

![](https://weapp.eteams.cn/papi/file/preview?fileId=1243022200448253970&type=redirect&customParam=%7B%22isExtDist%22%3Atrue%2C%22distributeId%22%3A%22%22%2C%22externalId%22%3A%22%22%2C%22appId%22%3A%22%22%7D)
