@nocobase/plugin-workflow-aggregate 0.18.0-alpha.9 → 0.19.0-alpha.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -12,508 +12,2156 @@ import {
12
12
  } from '@nocobase/plugin-workflow-test/e2e';
13
13
  import { expect, test } from '@nocobase/test/e2e';
14
14
  import { dayjs } from '@nocobase/utils';
15
+ test.describe('no filter', () => {
16
+ test('Collection event add data trigger, normal table integer fields not de-emphasised COUNT', async ({
17
+ page,
18
+ mockCollections,
19
+ mockRecords,
20
+ }) => {
21
+ //数据表后缀标识
22
+ const triggerNodeAppendText = 'a' + faker.string.alphanumeric(4);
23
+ const aggregateNodeAppendText = 'b' + faker.string.alphanumeric(4);
24
+ //创建触发器节点数据表
25
+ const triggerNodeCollectionDisplayName = `自动>组织[普通表]${triggerNodeAppendText}`;
26
+ const triggerNodeCollectionName = `tt_amt_org${triggerNodeAppendText}`;
27
+ const triggerNodeFieldName = 'orgname';
28
+ const triggerNodeFieldDisplayName = '公司名称(单行文本)';
29
+ await mockCollections(
30
+ appendJsonCollectionName(JSON.parse(JSON.stringify(generalWithNoRelationalFields)), triggerNodeAppendText)
31
+ .collections,
32
+ );
15
33
 
16
- test('Collection event add data trigger, aggregated data table, no filtering, normal table integer fields not de-emphasised COUNT', async ({
17
- page,
18
- mockCollections,
19
- mockRecords,
20
- }) => {
21
- //数据表后缀标识
22
- const triggerNodeAppendText = 'a' + faker.string.alphanumeric(4);
23
- const aggregateNodeAppendText = 'b' + faker.string.alphanumeric(4);
24
- //创建触发器节点数据表
25
- const triggerNodeCollectionDisplayName = `自动>组织[普通表]${triggerNodeAppendText}`;
26
- const triggerNodeCollectionName = `tt_amt_org${triggerNodeAppendText}`;
27
- const triggerNodeFieldName = 'orgname';
28
- const triggerNodeFieldDisplayName = '公司名称(单行文本)';
29
- await mockCollections(
30
- appendJsonCollectionName(JSON.parse(JSON.stringify(generalWithNoRelationalFields)), triggerNodeAppendText)
31
- .collections,
32
- );
33
-
34
- // 创建聚合节点数据表
35
- const aggregateNodeCollectionDisplayName = `自动>组织[普通表]${aggregateNodeAppendText}`;
36
- const aggregateNodeCollectionName = `tt_amt_org${aggregateNodeAppendText}`;
37
- const aggregateNodeFieldName = 'staffnum';
38
- const aggregateNodeFieldDisplayName = '员工人数(整数)';
39
- await mockCollections(
40
- appendJsonCollectionName(JSON.parse(JSON.stringify(generalWithNoRelationalFields)), aggregateNodeAppendText)
41
- .collections,
42
- );
43
- const aggregateNodeCollectionData = [
44
- { staffnum: 3, regcapital: 3.12 },
45
- { staffnum: 3, regcapital: 3.6 },
46
- { staffnum: 4, regcapital: 4.6 },
47
- { staffnum: 4, regcapital: 4.6 },
48
- { staffnum: 5, regcapital: 5.6 },
49
- ];
50
- const aggregateNodeCollectionRecords = await mockRecords(aggregateNodeCollectionName, aggregateNodeCollectionData);
51
-
52
- //添加工作流
53
- const workFlowName = faker.string.alphanumeric(5) + triggerNodeAppendText;
54
- const workflowData = {
55
- current: true,
56
- options: { deleteExecutionOnStatus: [] },
57
- title: workFlowName,
58
- type: 'collection',
59
- enabled: true,
60
- };
61
- const workflow = await apiCreateWorkflow(workflowData);
62
- const workflowObj = JSON.parse(JSON.stringify(workflow));
63
- const workflowId = workflowObj.id;
64
- //配置工作流触发器
65
- const triggerNodeData = {
66
- config: { appends: [], collection: triggerNodeCollectionName, changed: [], condition: { $and: [] }, mode: 1 },
67
- };
68
- const triggerNode = await apiUpdateWorkflowTrigger(workflowId, triggerNodeData);
69
- const triggerNodeObj = JSON.parse(JSON.stringify(triggerNode));
70
-
71
- //配置聚合数据节点
72
- await page.goto(`admin/workflow/workflows/${workflowId}`);
73
- await page.waitForLoadState('networkidle');
74
- const collectionTriggerNode = new CollectionTriggerNode(page, workFlowName, triggerNodeCollectionName);
75
- await collectionTriggerNode.addNodeButton.click();
76
- await page.getByRole('button', { name: 'aggregate', exact: true }).click();
77
- const aggregateRecordNodeName = 'Aggregate' + dayjs().format('YYYYMMDDHHmmss.SSS').toString();
78
- await page.getByLabel('Aggregate-Aggregate', { exact: true }).getByRole('textbox').fill(aggregateRecordNodeName);
79
- const aggregateRecordNode = new AggregateNode(page, aggregateRecordNodeName);
80
- const aggregateRecordNodeId = await aggregateRecordNode.node.locator('.workflow-node-id').innerText();
81
- await aggregateRecordNode.nodeConfigure.click();
82
- await aggregateRecordNode.collectionDropDown.click();
83
- await page.getByText(aggregateNodeCollectionDisplayName).click();
84
- await aggregateRecordNode.aggregatedFieldDropDown.click();
85
- await page.getByRole('option', { name: aggregateNodeFieldDisplayName }).click();
86
- await aggregateRecordNode.submitButton.click();
87
-
88
- // 2、测试步骤:添加数据触发工作流
89
- const triggerNodeCollectionRecordOne = triggerNodeFieldDisplayName + dayjs().format('YYYYMMDDHHmmss.SSS').toString();
90
- const triggerNodeCollectionRecords = await mockRecords(triggerNodeCollectionName, [
91
- { orgname: triggerNodeCollectionRecordOne },
92
- ]);
93
- await page.waitForTimeout(1000);
94
-
95
- // 3、预期结果:工作流成功触发,数据查询成功
96
- const getWorkflow = await apiGetWorkflow(workflowId);
97
- const getWorkflowObj = JSON.parse(JSON.stringify(getWorkflow));
98
- const getWorkflowExecuted = getWorkflowObj.executed;
99
- expect(getWorkflowExecuted).toBe(1);
100
- const getWorkflowNodeExecutions = await apiGetWorkflowNodeExecutions(workflowId);
101
- const getWorkflowNodeExecutionsObj = JSON.parse(JSON.stringify(getWorkflowNodeExecutions));
102
- getWorkflowNodeExecutionsObj.sort(function (a: { id: number }, b: { id: number }) {
103
- return b.id - a.id;
34
+ // 创建聚合节点数据表
35
+ const aggregateNodeCollectionDisplayName = `自动>组织[普通表]${aggregateNodeAppendText}`;
36
+ const aggregateNodeCollectionName = `tt_amt_org${aggregateNodeAppendText}`;
37
+ const aggregateNodeFieldName = 'staffnum';
38
+ const aggregateNodeFieldDisplayName = '员工人数(整数)';
39
+ await mockCollections(
40
+ appendJsonCollectionName(JSON.parse(JSON.stringify(generalWithNoRelationalFields)), aggregateNodeAppendText)
41
+ .collections,
42
+ );
43
+ const aggregateNodeCollectionData = [
44
+ { staffnum: 3, regcapital: 3.12 },
45
+ { staffnum: 3, regcapital: 3.6 },
46
+ { staffnum: 4, regcapital: 4.6 },
47
+ { staffnum: 4, regcapital: 4.6 },
48
+ { staffnum: 5, regcapital: 5.6 },
49
+ ];
50
+ const aggregateNodeCollectionRecords = await mockRecords(aggregateNodeCollectionName, aggregateNodeCollectionData);
51
+
52
+ //添加工作流
53
+ const workFlowName = faker.string.alphanumeric(5) + triggerNodeAppendText;
54
+ const workflowData = {
55
+ current: true,
56
+ options: { deleteExecutionOnStatus: [] },
57
+ title: workFlowName,
58
+ type: 'collection',
59
+ enabled: true,
60
+ };
61
+ const workflow = await apiCreateWorkflow(workflowData);
62
+ const workflowObj = JSON.parse(JSON.stringify(workflow));
63
+ const workflowId = workflowObj.id;
64
+ //配置工作流触发器
65
+ const triggerNodeData = {
66
+ config: { appends: [], collection: triggerNodeCollectionName, changed: [], condition: { $and: [] }, mode: 1 },
67
+ };
68
+ const triggerNode = await apiUpdateWorkflowTrigger(workflowId, triggerNodeData);
69
+ const triggerNodeObj = JSON.parse(JSON.stringify(triggerNode));
70
+
71
+ //配置聚合数据节点
72
+ await page.goto(`admin/workflow/workflows/${workflowId}`);
73
+ await page.waitForLoadState('networkidle');
74
+ const collectionTriggerNode = new CollectionTriggerNode(page, workFlowName, triggerNodeCollectionName);
75
+ await collectionTriggerNode.addNodeButton.click();
76
+ await page.getByRole('button', { name: 'aggregate', exact: true }).click();
77
+ const aggregateRecordNodeName = 'Aggregate' + dayjs().format('YYYYMMDDHHmmss.SSS').toString();
78
+ await page.getByLabel('Aggregate-Aggregate', { exact: true }).getByRole('textbox').fill(aggregateRecordNodeName);
79
+ const aggregateRecordNode = new AggregateNode(page, aggregateRecordNodeName);
80
+ const aggregateRecordNodeId = await aggregateRecordNode.node.locator('.workflow-node-id').innerText();
81
+ await aggregateRecordNode.nodeConfigure.click();
82
+ await aggregateRecordNode.collectionDropDown.click();
83
+ await page.getByText(aggregateNodeCollectionDisplayName).click();
84
+ await aggregateRecordNode.aggregatedFieldDropDown.click();
85
+ await page.getByRole('option', { name: aggregateNodeFieldDisplayName }).click();
86
+ await aggregateRecordNode.submitButton.click();
87
+
88
+ // 2、测试步骤:添加数据触发工作流
89
+ const triggerNodeCollectionRecordOne =
90
+ triggerNodeFieldDisplayName + dayjs().format('YYYYMMDDHHmmss.SSS').toString();
91
+ const triggerNodeCollectionRecords = await mockRecords(triggerNodeCollectionName, [
92
+ { orgname: triggerNodeCollectionRecordOne },
93
+ ]);
94
+ await page.waitForTimeout(1000);
95
+
96
+ // 3、预期结果:工作流成功触发,数据查询成功
97
+ const getWorkflow = await apiGetWorkflow(workflowId);
98
+ const getWorkflowObj = JSON.parse(JSON.stringify(getWorkflow));
99
+ const getWorkflowExecuted = getWorkflowObj.executed;
100
+ expect(getWorkflowExecuted).toBe(1);
101
+ const getWorkflowNodeExecutions = await apiGetWorkflowNodeExecutions(workflowId);
102
+ const getWorkflowNodeExecutionsObj = JSON.parse(JSON.stringify(getWorkflowNodeExecutions));
103
+ getWorkflowNodeExecutionsObj.sort(function (a: { id: number }, b: { id: number }) {
104
+ return b.id - a.id;
105
+ });
106
+ const jobs = getWorkflowNodeExecutionsObj[0].jobs;
107
+ const aggregateNodeJob = jobs.find((job) => job.nodeId.toString() === aggregateRecordNodeId);
108
+ const aggregateNodeJobResult = aggregateNodeJob.result;
109
+ expect(aggregateNodeJobResult).toBe(aggregateNodeCollectionData.length);
110
+ // 4、后置处理:删除工作流
111
+ await apiDeleteWorkflow(workflowId);
104
112
  });
105
- const jobs = getWorkflowNodeExecutionsObj[0].jobs;
106
- const queryRecordNodeJob = jobs.find((job) => job.nodeId.toString() === aggregateRecordNodeId);
107
- const queryRecordNodeJobResult = queryRecordNodeJob.result;
108
- expect(queryRecordNodeJobResult).toBe(aggregateNodeCollectionData.length);
109
- // 4、后置处理:删除工作流
110
- await apiDeleteWorkflow(workflowId);
111
- });
112
113
 
113
- test('Collection event add data trigger, aggregated data table, no filtering, normal table integer fields not de-emphasised SUM', async ({
114
- page,
115
- mockCollections,
116
- mockRecords,
117
- }) => {
118
- //数据表后缀标识
119
- const triggerNodeAppendText = 'a' + faker.string.alphanumeric(4);
120
- const aggregateNodeAppendText = 'b' + faker.string.alphanumeric(4);
121
- //创建触发器节点数据表
122
- const triggerNodeCollectionDisplayName = `自动>组织[普通表]${triggerNodeAppendText}`;
123
- const triggerNodeCollectionName = `tt_amt_org${triggerNodeAppendText}`;
124
- const triggerNodeFieldName = 'orgname';
125
- const triggerNodeFieldDisplayName = '公司名称(单行文本)';
126
- await mockCollections(
127
- appendJsonCollectionName(JSON.parse(JSON.stringify(generalWithNoRelationalFields)), triggerNodeAppendText)
128
- .collections,
129
- );
130
-
131
- // 创建聚合节点数据表
132
- const aggregateNodeCollectionDisplayName = `自动>组织[普通表]${aggregateNodeAppendText}`;
133
- const aggregateNodeCollectionName = `tt_amt_org${aggregateNodeAppendText}`;
134
- const aggregateNodeFieldName = 'staffnum';
135
- const aggregateNodeFieldDisplayName = '员工人数(整数)';
136
- await mockCollections(
137
- appendJsonCollectionName(JSON.parse(JSON.stringify(generalWithNoRelationalFields)), aggregateNodeAppendText)
138
- .collections,
139
- );
140
- const aggregateNodeCollectionData = [
141
- { staffnum: 3, regcapital: 3.12 },
142
- { staffnum: 3, regcapital: 3.6 },
143
- { staffnum: 4, regcapital: 4.6 },
144
- { staffnum: 4, regcapital: 4.6 },
145
- { staffnum: 5, regcapital: 5.6 },
146
- ];
147
- const aggregateNodeCollectionRecords = await mockRecords(aggregateNodeCollectionName, aggregateNodeCollectionData);
148
-
149
- //添加工作流
150
- const workFlowName = faker.string.alphanumeric(5) + triggerNodeAppendText;
151
- const workflowData = {
152
- current: true,
153
- options: { deleteExecutionOnStatus: [] },
154
- title: workFlowName,
155
- type: 'collection',
156
- enabled: true,
157
- };
158
- const workflow = await apiCreateWorkflow(workflowData);
159
- const workflowObj = JSON.parse(JSON.stringify(workflow));
160
- const workflowId = workflowObj.id;
161
- //配置工作流触发器
162
- const triggerNodeData = {
163
- config: { appends: [], collection: triggerNodeCollectionName, changed: [], condition: { $and: [] }, mode: 1 },
164
- };
165
- const triggerNode = await apiUpdateWorkflowTrigger(workflowId, triggerNodeData);
166
- const triggerNodeObj = JSON.parse(JSON.stringify(triggerNode));
167
-
168
- //配置聚合数据节点
169
- await page.goto(`admin/workflow/workflows/${workflowId}`);
170
- await page.waitForLoadState('networkidle');
171
- const collectionTriggerNode = new CollectionTriggerNode(page, workFlowName, triggerNodeCollectionName);
172
- await collectionTriggerNode.addNodeButton.click();
173
- await page.getByRole('button', { name: 'aggregate', exact: true }).click();
174
- const aggregateRecordNodeName = 'Aggregate' + dayjs().format('YYYYMMDDHHmmss.SSS').toString();
175
- await page.getByLabel('Aggregate-Aggregate', { exact: true }).getByRole('textbox').fill(aggregateRecordNodeName);
176
- const aggregateRecordNode = new AggregateNode(page, aggregateRecordNodeName);
177
- const aggregateRecordNodeId = await aggregateRecordNode.node.locator('.workflow-node-id').innerText();
178
- await aggregateRecordNode.nodeConfigure.click();
179
- await aggregateRecordNode.sumRadio.click();
180
- await aggregateRecordNode.collectionDropDown.click();
181
- await page.getByText(aggregateNodeCollectionDisplayName).click();
182
- await aggregateRecordNode.aggregatedFieldDropDown.click();
183
- await page.getByRole('option', { name: aggregateNodeFieldDisplayName }).click();
184
- await aggregateRecordNode.submitButton.click();
185
-
186
- // 2、测试步骤:添加数据触发工作流
187
- const triggerNodeCollectionRecordOne = triggerNodeFieldDisplayName + dayjs().format('YYYYMMDDHHmmss.SSS').toString();
188
- const triggerNodeCollectionRecords = await mockRecords(triggerNodeCollectionName, [
189
- { orgname: triggerNodeCollectionRecordOne },
190
- ]);
191
- await page.waitForTimeout(1000);
192
-
193
- // 3、预期结果:工作流成功触发,数据查询成功
194
- const getWorkflow = await apiGetWorkflow(workflowId);
195
- const getWorkflowObj = JSON.parse(JSON.stringify(getWorkflow));
196
- const getWorkflowExecuted = getWorkflowObj.executed;
197
- expect(getWorkflowExecuted).toBe(1);
198
- const getWorkflowNodeExecutions = await apiGetWorkflowNodeExecutions(workflowId);
199
- const getWorkflowNodeExecutionsObj = JSON.parse(JSON.stringify(getWorkflowNodeExecutions));
200
- getWorkflowNodeExecutionsObj.sort(function (a: { id: number }, b: { id: number }) {
201
- return b.id - a.id;
114
+ test('Collection event add data trigger, normal table integer fields not de-emphasised SUM', async ({
115
+ page,
116
+ mockCollections,
117
+ mockRecords,
118
+ }) => {
119
+ //数据表后缀标识
120
+ const triggerNodeAppendText = 'a' + faker.string.alphanumeric(4);
121
+ const aggregateNodeAppendText = 'b' + faker.string.alphanumeric(4);
122
+ //创建触发器节点数据表
123
+ const triggerNodeCollectionDisplayName = `自动>组织[普通表]${triggerNodeAppendText}`;
124
+ const triggerNodeCollectionName = `tt_amt_org${triggerNodeAppendText}`;
125
+ const triggerNodeFieldName = 'orgname';
126
+ const triggerNodeFieldDisplayName = '公司名称(单行文本)';
127
+ await mockCollections(
128
+ appendJsonCollectionName(JSON.parse(JSON.stringify(generalWithNoRelationalFields)), triggerNodeAppendText)
129
+ .collections,
130
+ );
131
+
132
+ // 创建聚合节点数据表
133
+ const aggregateNodeCollectionDisplayName = `自动>组织[普通表]${aggregateNodeAppendText}`;
134
+ const aggregateNodeCollectionName = `tt_amt_org${aggregateNodeAppendText}`;
135
+ const aggregateNodeFieldName = 'staffnum';
136
+ const aggregateNodeFieldDisplayName = '员工人数(整数)';
137
+ await mockCollections(
138
+ appendJsonCollectionName(JSON.parse(JSON.stringify(generalWithNoRelationalFields)), aggregateNodeAppendText)
139
+ .collections,
140
+ );
141
+ const aggregateNodeCollectionData = [
142
+ { staffnum: 3, regcapital: 3.12 },
143
+ { staffnum: 3, regcapital: 3.6 },
144
+ { staffnum: 4, regcapital: 4.6 },
145
+ { staffnum: 4, regcapital: 4.6 },
146
+ { staffnum: 5, regcapital: 5.6 },
147
+ ];
148
+ const aggregateNodeCollectionRecords = await mockRecords(aggregateNodeCollectionName, aggregateNodeCollectionData);
149
+
150
+ //添加工作流
151
+ const workFlowName = faker.string.alphanumeric(5) + triggerNodeAppendText;
152
+ const workflowData = {
153
+ current: true,
154
+ options: { deleteExecutionOnStatus: [] },
155
+ title: workFlowName,
156
+ type: 'collection',
157
+ enabled: true,
158
+ };
159
+ const workflow = await apiCreateWorkflow(workflowData);
160
+ const workflowObj = JSON.parse(JSON.stringify(workflow));
161
+ const workflowId = workflowObj.id;
162
+ //配置工作流触发器
163
+ const triggerNodeData = {
164
+ config: { appends: [], collection: triggerNodeCollectionName, changed: [], condition: { $and: [] }, mode: 1 },
165
+ };
166
+ const triggerNode = await apiUpdateWorkflowTrigger(workflowId, triggerNodeData);
167
+ const triggerNodeObj = JSON.parse(JSON.stringify(triggerNode));
168
+
169
+ //配置聚合数据节点
170
+ await page.goto(`admin/workflow/workflows/${workflowId}`);
171
+ await page.waitForLoadState('networkidle');
172
+ const collectionTriggerNode = new CollectionTriggerNode(page, workFlowName, triggerNodeCollectionName);
173
+ await collectionTriggerNode.addNodeButton.click();
174
+ await page.getByRole('button', { name: 'aggregate', exact: true }).click();
175
+ const aggregateRecordNodeName = 'Aggregate' + dayjs().format('YYYYMMDDHHmmss.SSS').toString();
176
+ await page.getByLabel('Aggregate-Aggregate', { exact: true }).getByRole('textbox').fill(aggregateRecordNodeName);
177
+ const aggregateRecordNode = new AggregateNode(page, aggregateRecordNodeName);
178
+ const aggregateRecordNodeId = await aggregateRecordNode.node.locator('.workflow-node-id').innerText();
179
+ await aggregateRecordNode.nodeConfigure.click();
180
+ await aggregateRecordNode.sumRadio.click();
181
+ await aggregateRecordNode.collectionDropDown.click();
182
+ await page.getByText(aggregateNodeCollectionDisplayName).click();
183
+ await aggregateRecordNode.aggregatedFieldDropDown.click();
184
+ await page.getByRole('option', { name: aggregateNodeFieldDisplayName }).click();
185
+ await aggregateRecordNode.submitButton.click();
186
+
187
+ // 2、测试步骤:添加数据触发工作流
188
+ const triggerNodeCollectionRecordOne =
189
+ triggerNodeFieldDisplayName + dayjs().format('YYYYMMDDHHmmss.SSS').toString();
190
+ const triggerNodeCollectionRecords = await mockRecords(triggerNodeCollectionName, [
191
+ { orgname: triggerNodeCollectionRecordOne },
192
+ ]);
193
+ await page.waitForTimeout(1000);
194
+
195
+ // 3、预期结果:工作流成功触发,数据查询成功
196
+ const getWorkflow = await apiGetWorkflow(workflowId);
197
+ const getWorkflowObj = JSON.parse(JSON.stringify(getWorkflow));
198
+ const getWorkflowExecuted = getWorkflowObj.executed;
199
+ expect(getWorkflowExecuted).toBe(1);
200
+ const getWorkflowNodeExecutions = await apiGetWorkflowNodeExecutions(workflowId);
201
+ const getWorkflowNodeExecutionsObj = JSON.parse(JSON.stringify(getWorkflowNodeExecutions));
202
+ getWorkflowNodeExecutionsObj.sort(function (a: { id: number }, b: { id: number }) {
203
+ return b.id - a.id;
204
+ });
205
+ const jobs = getWorkflowNodeExecutionsObj[0].jobs;
206
+ const aggregateNodeJob = jobs.find((job) => job.nodeId.toString() === aggregateRecordNodeId);
207
+ const aggregateNodeJobResult = aggregateNodeJob.result;
208
+ // aggregateNodeCollectionData中staffnum字段值总和
209
+ const aggregateNodeCollectionDataSum = aggregateNodeCollectionData.reduce((total, currentValue) => {
210
+ return total + currentValue.staffnum;
211
+ }, 0);
212
+ expect(aggregateNodeJobResult).toBe(aggregateNodeCollectionDataSum);
213
+ // 4、后置处理:删除工作流
214
+ await apiDeleteWorkflow(workflowId);
215
+ });
216
+
217
+ test('Collection event add data trigger, normal table integer fields not de-emphasised AVG', async ({
218
+ page,
219
+ mockCollections,
220
+ mockRecords,
221
+ }) => {
222
+ //数据表后缀标识
223
+ const triggerNodeAppendText = 'a' + faker.string.alphanumeric(4);
224
+ const aggregateNodeAppendText = 'b' + faker.string.alphanumeric(4);
225
+ //创建触发器节点数据表
226
+ const triggerNodeCollectionDisplayName = `自动>组织[普通表]${triggerNodeAppendText}`;
227
+ const triggerNodeCollectionName = `tt_amt_org${triggerNodeAppendText}`;
228
+ const triggerNodeFieldName = 'orgname';
229
+ const triggerNodeFieldDisplayName = '公司名称(单行文本)';
230
+ await mockCollections(
231
+ appendJsonCollectionName(JSON.parse(JSON.stringify(generalWithNoRelationalFields)), triggerNodeAppendText)
232
+ .collections,
233
+ );
234
+
235
+ // 创建聚合节点数据表
236
+ const aggregateNodeCollectionDisplayName = `自动>组织[普通表]${aggregateNodeAppendText}`;
237
+ const aggregateNodeCollectionName = `tt_amt_org${aggregateNodeAppendText}`;
238
+ const aggregateNodeFieldName = 'staffnum';
239
+ const aggregateNodeFieldDisplayName = '员工人数(整数)';
240
+ await mockCollections(
241
+ appendJsonCollectionName(JSON.parse(JSON.stringify(generalWithNoRelationalFields)), aggregateNodeAppendText)
242
+ .collections,
243
+ );
244
+ const aggregateNodeCollectionData = [
245
+ { staffnum: 3, regcapital: 3.12 },
246
+ { staffnum: 3, regcapital: 3.6 },
247
+ { staffnum: 4, regcapital: 4.6 },
248
+ { staffnum: 4, regcapital: 4.6 },
249
+ { staffnum: 5, regcapital: 5.6 },
250
+ ];
251
+ const aggregateNodeCollectionRecords = await mockRecords(aggregateNodeCollectionName, aggregateNodeCollectionData);
252
+
253
+ //添加工作流
254
+ const workFlowName = faker.string.alphanumeric(5) + triggerNodeAppendText;
255
+ const workflowData = {
256
+ current: true,
257
+ options: { deleteExecutionOnStatus: [] },
258
+ title: workFlowName,
259
+ type: 'collection',
260
+ enabled: true,
261
+ };
262
+ const workflow = await apiCreateWorkflow(workflowData);
263
+ const workflowObj = JSON.parse(JSON.stringify(workflow));
264
+ const workflowId = workflowObj.id;
265
+ //配置工作流触发器
266
+ const triggerNodeData = {
267
+ config: { appends: [], collection: triggerNodeCollectionName, changed: [], condition: { $and: [] }, mode: 1 },
268
+ };
269
+ const triggerNode = await apiUpdateWorkflowTrigger(workflowId, triggerNodeData);
270
+ const triggerNodeObj = JSON.parse(JSON.stringify(triggerNode));
271
+ //配置聚合数据节点
272
+ await page.goto(`admin/workflow/workflows/${workflowId}`);
273
+ await page.waitForLoadState('networkidle');
274
+ const collectionTriggerNode = new CollectionTriggerNode(page, workFlowName, triggerNodeCollectionName);
275
+ await collectionTriggerNode.addNodeButton.click();
276
+ await page.getByRole('button', { name: 'aggregate', exact: true }).click();
277
+ const aggregateRecordNodeName = 'Aggregate' + dayjs().format('YYYYMMDDHHmmss.SSS').toString();
278
+ await page.getByLabel('Aggregate-Aggregate', { exact: true }).getByRole('textbox').fill(aggregateRecordNodeName);
279
+ const aggregateRecordNode = new AggregateNode(page, aggregateRecordNodeName);
280
+ const aggregateRecordNodeId = await aggregateRecordNode.node.locator('.workflow-node-id').innerText();
281
+ await aggregateRecordNode.nodeConfigure.click();
282
+ await aggregateRecordNode.avgRadio.click();
283
+ await aggregateRecordNode.collectionDropDown.click();
284
+ await page.getByText(aggregateNodeCollectionDisplayName).click();
285
+ await aggregateRecordNode.aggregatedFieldDropDown.click();
286
+ await page.getByRole('option', { name: aggregateNodeFieldDisplayName }).click();
287
+ await aggregateRecordNode.submitButton.click();
288
+
289
+ // 2、测试步骤:添加数据触发工作流
290
+ const triggerNodeCollectionRecordOne =
291
+ triggerNodeFieldDisplayName + dayjs().format('YYYYMMDDHHmmss.SSS').toString();
292
+ const triggerNodeCollectionRecords = await mockRecords(triggerNodeCollectionName, [
293
+ { orgname: triggerNodeCollectionRecordOne },
294
+ ]);
295
+ await page.waitForTimeout(1000);
296
+
297
+ // 3、预期结果:工作流成功触发,数据查询成功
298
+ const getWorkflow = await apiGetWorkflow(workflowId);
299
+ const getWorkflowObj = JSON.parse(JSON.stringify(getWorkflow));
300
+ const getWorkflowExecuted = getWorkflowObj.executed;
301
+ expect(getWorkflowExecuted).toBe(1);
302
+ const getWorkflowNodeExecutions = await apiGetWorkflowNodeExecutions(workflowId);
303
+ const getWorkflowNodeExecutionsObj = JSON.parse(JSON.stringify(getWorkflowNodeExecutions));
304
+ getWorkflowNodeExecutionsObj.sort(function (a: { id: number }, b: { id: number }) {
305
+ return b.id - a.id;
306
+ });
307
+ const jobs = getWorkflowNodeExecutionsObj[0].jobs;
308
+ const aggregateNodeJob = jobs.find((job) => job.nodeId.toString() === aggregateRecordNodeId);
309
+ const aggregateNodeJobResult = aggregateNodeJob.result;
310
+ // aggregateNodeCollectionData中staffnum字段值平均值
311
+ const aggregateNodeCollectionDataAvg =
312
+ aggregateNodeCollectionData.reduce((total, currentValue) => {
313
+ return total + currentValue.staffnum;
314
+ }, 0) / aggregateNodeCollectionData.length;
315
+ expect(aggregateNodeJobResult).toBe(aggregateNodeCollectionDataAvg);
316
+ // 4、后置处理:删除工作流
317
+ await apiDeleteWorkflow(workflowId);
318
+ });
319
+
320
+ test('Collection event add data trigger, normal table integer fields not de-emphasised MIN', async ({
321
+ page,
322
+ mockCollections,
323
+ mockRecords,
324
+ }) => {
325
+ //数据表后缀标识
326
+ const triggerNodeAppendText = 'a' + faker.string.alphanumeric(4);
327
+ const aggregateNodeAppendText = 'b' + faker.string.alphanumeric(4);
328
+ //创建触发器节点数据表
329
+ const triggerNodeCollectionDisplayName = `自动>组织[普通表]${triggerNodeAppendText}`;
330
+ const triggerNodeCollectionName = `tt_amt_org${triggerNodeAppendText}`;
331
+ const triggerNodeFieldName = 'orgname';
332
+ const triggerNodeFieldDisplayName = '公司名称(单行文本)';
333
+ await mockCollections(
334
+ appendJsonCollectionName(JSON.parse(JSON.stringify(generalWithNoRelationalFields)), triggerNodeAppendText)
335
+ .collections,
336
+ );
337
+
338
+ // 创建聚合节点数据表
339
+ const aggregateNodeCollectionDisplayName = `自动>组织[普通表]${aggregateNodeAppendText}`;
340
+ const aggregateNodeCollectionName = `tt_amt_org${aggregateNodeAppendText}`;
341
+ const aggregateNodeFieldName = 'staffnum';
342
+ const aggregateNodeFieldDisplayName = '员工人数(整数)';
343
+ await mockCollections(
344
+ appendJsonCollectionName(JSON.parse(JSON.stringify(generalWithNoRelationalFields)), aggregateNodeAppendText)
345
+ .collections,
346
+ );
347
+ const aggregateNodeCollectionData = [
348
+ { staffnum: 3, regcapital: 3.12 },
349
+ { staffnum: 3, regcapital: 3.6 },
350
+ { staffnum: 4, regcapital: 4.6 },
351
+ { staffnum: 4, regcapital: 4.6 },
352
+ { staffnum: 5, regcapital: 5.6 },
353
+ ];
354
+ const aggregateNodeCollectionRecords = await mockRecords(aggregateNodeCollectionName, aggregateNodeCollectionData);
355
+
356
+ //添加工作流
357
+ const workFlowName = faker.string.alphanumeric(5) + triggerNodeAppendText;
358
+ const workflowData = {
359
+ current: true,
360
+ options: { deleteExecutionOnStatus: [] },
361
+ title: workFlowName,
362
+ type: 'collection',
363
+ enabled: true,
364
+ };
365
+ const workflow = await apiCreateWorkflow(workflowData);
366
+ const workflowObj = JSON.parse(JSON.stringify(workflow));
367
+ const workflowId = workflowObj.id;
368
+ //配置工作流触发器
369
+ const triggerNodeData = {
370
+ config: { appends: [], collection: triggerNodeCollectionName, changed: [], condition: { $and: [] }, mode: 1 },
371
+ };
372
+ const triggerNode = await apiUpdateWorkflowTrigger(workflowId, triggerNodeData);
373
+ const triggerNodeObj = JSON.parse(JSON.stringify(triggerNode));
374
+
375
+ //配置聚合数据节点
376
+ await page.goto(`admin/workflow/workflows/${workflowId}`);
377
+ await page.waitForLoadState('networkidle');
378
+ const collectionTriggerNode = new CollectionTriggerNode(page, workFlowName, triggerNodeCollectionName);
379
+ await collectionTriggerNode.addNodeButton.click();
380
+ await page.getByRole('button', { name: 'aggregate', exact: true }).click();
381
+ const aggregateRecordNodeName = 'Aggregate' + dayjs().format('YYYYMMDDHHmmss.SSS').toString();
382
+ await page.getByLabel('Aggregate-Aggregate', { exact: true }).getByRole('textbox').fill(aggregateRecordNodeName);
383
+ const aggregateRecordNode = new AggregateNode(page, aggregateRecordNodeName);
384
+ const aggregateRecordNodeId = await aggregateRecordNode.node.locator('.workflow-node-id').innerText();
385
+ await aggregateRecordNode.nodeConfigure.click();
386
+ await aggregateRecordNode.minRadio.click();
387
+ await aggregateRecordNode.collectionDropDown.click();
388
+ await page.getByText(aggregateNodeCollectionDisplayName).click();
389
+ await aggregateRecordNode.aggregatedFieldDropDown.click();
390
+ await page.getByRole('option', { name: aggregateNodeFieldDisplayName }).click();
391
+ await aggregateRecordNode.submitButton.click();
392
+
393
+ // 2、测试步骤:添加数据触发工作流
394
+ const triggerNodeCollectionRecordOne =
395
+ triggerNodeFieldDisplayName + dayjs().format('YYYYMMDDHHmmss.SSS').toString();
396
+ const triggerNodeCollectionRecords = await mockRecords(triggerNodeCollectionName, [
397
+ { orgname: triggerNodeCollectionRecordOne },
398
+ ]);
399
+ await page.waitForTimeout(1000);
400
+
401
+ // 3、预期结果:工作流成功触发,数据查询成功
402
+ const getWorkflow = await apiGetWorkflow(workflowId);
403
+ const getWorkflowObj = JSON.parse(JSON.stringify(getWorkflow));
404
+ const getWorkflowExecuted = getWorkflowObj.executed;
405
+ expect(getWorkflowExecuted).toBe(1);
406
+ const getWorkflowNodeExecutions = await apiGetWorkflowNodeExecutions(workflowId);
407
+ const getWorkflowNodeExecutionsObj = JSON.parse(JSON.stringify(getWorkflowNodeExecutions));
408
+ getWorkflowNodeExecutionsObj.sort(function (a: { id: number }, b: { id: number }) {
409
+ return b.id - a.id;
410
+ });
411
+ const jobs = getWorkflowNodeExecutionsObj[0].jobs;
412
+ const aggregateNodeJob = jobs.find((job) => job.nodeId.toString() === aggregateRecordNodeId);
413
+ const aggregateNodeJobResult = aggregateNodeJob.result;
414
+ // aggregateNodeCollectionData中staffnum字段值最小值
415
+ const aggregateNodeCollectionDataMin = aggregateNodeCollectionData.reduce((min, currentValue) => {
416
+ return currentValue.staffnum < min ? currentValue.staffnum : min;
417
+ }, aggregateNodeCollectionData[0].staffnum);
418
+ expect(aggregateNodeJobResult).toBe(aggregateNodeCollectionDataMin);
419
+ // 4、后置处理:删除工作流
420
+ await apiDeleteWorkflow(workflowId);
421
+ });
422
+
423
+ test('Collection event add data trigger, normal table integer fields not de-emphasised MAX', async ({
424
+ page,
425
+ mockCollections,
426
+ mockRecords,
427
+ }) => {
428
+ //数据表后缀标识
429
+ const triggerNodeAppendText = 'a' + faker.string.alphanumeric(4);
430
+ const aggregateNodeAppendText = 'b' + faker.string.alphanumeric(4);
431
+ //创建触发器节点数据表
432
+ const triggerNodeCollectionDisplayName = `自动>组织[普通表]${triggerNodeAppendText}`;
433
+ const triggerNodeCollectionName = `tt_amt_org${triggerNodeAppendText}`;
434
+ const triggerNodeFieldName = 'orgname';
435
+ const triggerNodeFieldDisplayName = '公司名称(单行文本)';
436
+ await mockCollections(
437
+ appendJsonCollectionName(JSON.parse(JSON.stringify(generalWithNoRelationalFields)), triggerNodeAppendText)
438
+ .collections,
439
+ );
440
+
441
+ // 创建聚合节点数据表
442
+ const aggregateNodeCollectionDisplayName = `自动>组织[普通表]${aggregateNodeAppendText}`;
443
+ const aggregateNodeCollectionName = `tt_amt_org${aggregateNodeAppendText}`;
444
+ const aggregateNodeFieldName = 'staffnum';
445
+ const aggregateNodeFieldDisplayName = '员工人数(整数)';
446
+ await mockCollections(
447
+ appendJsonCollectionName(JSON.parse(JSON.stringify(generalWithNoRelationalFields)), aggregateNodeAppendText)
448
+ .collections,
449
+ );
450
+ const aggregateNodeCollectionData = [
451
+ { staffnum: 3, regcapital: 3.12 },
452
+ { staffnum: 3, regcapital: 3.6 },
453
+ { staffnum: 4, regcapital: 4.6 },
454
+ { staffnum: 4, regcapital: 4.6 },
455
+ { staffnum: 5, regcapital: 5.6 },
456
+ ];
457
+ const aggregateNodeCollectionRecords = await mockRecords(aggregateNodeCollectionName, aggregateNodeCollectionData);
458
+
459
+ //添加工作流
460
+ const workFlowName = faker.string.alphanumeric(5) + triggerNodeAppendText;
461
+ const workflowData = {
462
+ current: true,
463
+ options: { deleteExecutionOnStatus: [] },
464
+ title: workFlowName,
465
+ type: 'collection',
466
+ enabled: true,
467
+ };
468
+ const workflow = await apiCreateWorkflow(workflowData);
469
+ const workflowObj = JSON.parse(JSON.stringify(workflow));
470
+ const workflowId = workflowObj.id;
471
+ //配置工作流触发器
472
+ const triggerNodeData = {
473
+ config: { appends: [], collection: triggerNodeCollectionName, changed: [], condition: { $and: [] }, mode: 1 },
474
+ };
475
+ const triggerNode = await apiUpdateWorkflowTrigger(workflowId, triggerNodeData);
476
+ const triggerNodeObj = JSON.parse(JSON.stringify(triggerNode));
477
+
478
+ //配置聚合数据节点
479
+ await page.goto(`admin/workflow/workflows/${workflowId}`);
480
+ await page.waitForLoadState('networkidle');
481
+ const collectionTriggerNode = new CollectionTriggerNode(page, workFlowName, triggerNodeCollectionName);
482
+ await collectionTriggerNode.addNodeButton.click();
483
+ await page.getByRole('button', { name: 'aggregate', exact: true }).click();
484
+ const aggregateRecordNodeName = 'Aggregate' + dayjs().format('YYYYMMDDHHmmss.SSS').toString();
485
+ await page.getByLabel('Aggregate-Aggregate', { exact: true }).getByRole('textbox').fill(aggregateRecordNodeName);
486
+ const aggregateRecordNode = new AggregateNode(page, aggregateRecordNodeName);
487
+ const aggregateRecordNodeId = await aggregateRecordNode.node.locator('.workflow-node-id').innerText();
488
+ await aggregateRecordNode.nodeConfigure.click();
489
+ await aggregateRecordNode.maxRadio.click();
490
+ await aggregateRecordNode.collectionDropDown.click();
491
+ await page.getByText(aggregateNodeCollectionDisplayName).click();
492
+ await aggregateRecordNode.aggregatedFieldDropDown.click();
493
+ await page.getByRole('option', { name: aggregateNodeFieldDisplayName }).click();
494
+ await aggregateRecordNode.submitButton.click();
495
+
496
+ // 2、测试步骤:添加数据触发工作流
497
+ const triggerNodeCollectionRecordOne =
498
+ triggerNodeFieldDisplayName + dayjs().format('YYYYMMDDHHmmss.SSS').toString();
499
+ const triggerNodeCollectionRecords = await mockRecords(triggerNodeCollectionName, [
500
+ { orgname: triggerNodeCollectionRecordOne },
501
+ ]);
502
+ await page.waitForTimeout(1000);
503
+
504
+ // 3、预期结果:工作流成功触发,数据查询成功
505
+ const getWorkflow = await apiGetWorkflow(workflowId);
506
+ const getWorkflowObj = JSON.parse(JSON.stringify(getWorkflow));
507
+ const getWorkflowExecuted = getWorkflowObj.executed;
508
+ expect(getWorkflowExecuted).toBe(1);
509
+ const getWorkflowNodeExecutions = await apiGetWorkflowNodeExecutions(workflowId);
510
+ const getWorkflowNodeExecutionsObj = JSON.parse(JSON.stringify(getWorkflowNodeExecutions));
511
+ getWorkflowNodeExecutionsObj.sort(function (a: { id: number }, b: { id: number }) {
512
+ return b.id - a.id;
513
+ });
514
+ const jobs = getWorkflowNodeExecutionsObj[0].jobs;
515
+ const aggregateNodeJob = jobs.find((job) => job.nodeId.toString() === aggregateRecordNodeId);
516
+ const aggregateNodeJobResult = aggregateNodeJob.result;
517
+ // aggregateNodeCollectionData中staffnum字段值最大值
518
+ const aggregateNodeCollectionDataMax = aggregateNodeCollectionData.reduce((max, currentValue) => {
519
+ return currentValue.staffnum > max ? currentValue.staffnum : max;
520
+ }, aggregateNodeCollectionData[0].staffnum);
521
+ expect(aggregateNodeJobResult).toBe(aggregateNodeCollectionDataMax);
522
+ // 4、后置处理:删除工作流
523
+ await apiDeleteWorkflow(workflowId);
524
+ });
525
+
526
+ test('Collection event add data trigger, normal table integer fields de-weighting COUNT', async ({
527
+ page,
528
+ mockCollections,
529
+ mockRecords,
530
+ }) => {
531
+ //数据表后缀标识
532
+ const triggerNodeAppendText = 'a' + faker.string.alphanumeric(4);
533
+ const aggregateNodeAppendText = 'b' + faker.string.alphanumeric(4);
534
+ //创建触发器节点数据表
535
+ const triggerNodeCollectionDisplayName = `自动>组织[普通表]${triggerNodeAppendText}`;
536
+ const triggerNodeCollectionName = `tt_amt_org${triggerNodeAppendText}`;
537
+ const triggerNodeFieldName = 'orgname';
538
+ const triggerNodeFieldDisplayName = '公司名称(单行文本)';
539
+ await mockCollections(
540
+ appendJsonCollectionName(JSON.parse(JSON.stringify(generalWithNoRelationalFields)), triggerNodeAppendText)
541
+ .collections,
542
+ );
543
+
544
+ // 创建聚合节点数据表
545
+ const aggregateNodeCollectionDisplayName = `自动>组织[普通表]${aggregateNodeAppendText}`;
546
+ const aggregateNodeCollectionName = `tt_amt_org${aggregateNodeAppendText}`;
547
+ const aggregateNodeFieldName = 'staffnum';
548
+ const aggregateNodeFieldDisplayName = '员工人数(整数)';
549
+ await mockCollections(
550
+ appendJsonCollectionName(JSON.parse(JSON.stringify(generalWithNoRelationalFields)), aggregateNodeAppendText)
551
+ .collections,
552
+ );
553
+ const aggregateNodeCollectionData = [
554
+ { staffnum: 3, regcapital: 3.12 },
555
+ { staffnum: 3, regcapital: 3.6 },
556
+ { staffnum: 4, regcapital: 4.6 },
557
+ { staffnum: 4, regcapital: 4.6 },
558
+ { staffnum: 5, regcapital: 5.6 },
559
+ ];
560
+ const aggregateNodeCollectionRecords = await mockRecords(aggregateNodeCollectionName, aggregateNodeCollectionData);
561
+
562
+ //添加工作流
563
+ const workFlowName = faker.string.alphanumeric(5) + triggerNodeAppendText;
564
+ const workflowData = {
565
+ current: true,
566
+ options: { deleteExecutionOnStatus: [] },
567
+ title: workFlowName,
568
+ type: 'collection',
569
+ enabled: true,
570
+ };
571
+ const workflow = await apiCreateWorkflow(workflowData);
572
+ const workflowObj = JSON.parse(JSON.stringify(workflow));
573
+ const workflowId = workflowObj.id;
574
+ //配置工作流触发器
575
+ const triggerNodeData = {
576
+ config: { appends: [], collection: triggerNodeCollectionName, changed: [], condition: { $and: [] }, mode: 1 },
577
+ };
578
+ const triggerNode = await apiUpdateWorkflowTrigger(workflowId, triggerNodeData);
579
+ const triggerNodeObj = JSON.parse(JSON.stringify(triggerNode));
580
+
581
+ //配置聚合数据节点
582
+ await page.goto(`admin/workflow/workflows/${workflowId}`);
583
+ await page.waitForLoadState('networkidle');
584
+ const collectionTriggerNode = new CollectionTriggerNode(page, workFlowName, triggerNodeCollectionName);
585
+ await collectionTriggerNode.addNodeButton.click();
586
+ await page.getByRole('button', { name: 'aggregate', exact: true }).click();
587
+ const aggregateRecordNodeName = 'Aggregate' + dayjs().format('YYYYMMDDHHmmss.SSS').toString();
588
+ await page.getByLabel('Aggregate-Aggregate', { exact: true }).getByRole('textbox').fill(aggregateRecordNodeName);
589
+ const aggregateRecordNode = new AggregateNode(page, aggregateRecordNodeName);
590
+ const aggregateRecordNodeId = await aggregateRecordNode.node.locator('.workflow-node-id').innerText();
591
+ await aggregateRecordNode.nodeConfigure.click();
592
+ await aggregateRecordNode.collectionDropDown.click();
593
+ await page.getByText(aggregateNodeCollectionDisplayName).click();
594
+ await aggregateRecordNode.aggregatedFieldDropDown.click();
595
+ await page.getByRole('option', { name: aggregateNodeFieldDisplayName }).click();
596
+ await aggregateRecordNode.distinctCheckBox.click();
597
+ await aggregateRecordNode.submitButton.click();
598
+
599
+ // 2、测试步骤:添加数据触发工作流
600
+ const triggerNodeCollectionRecordOne =
601
+ triggerNodeFieldDisplayName + dayjs().format('YYYYMMDDHHmmss.SSS').toString();
602
+ const triggerNodeCollectionRecords = await mockRecords(triggerNodeCollectionName, [
603
+ { orgname: triggerNodeCollectionRecordOne },
604
+ ]);
605
+ await page.waitForTimeout(1000);
606
+
607
+ // 3、预期结果:工作流成功触发,数据查询成功
608
+ const getWorkflow = await apiGetWorkflow(workflowId);
609
+ const getWorkflowObj = JSON.parse(JSON.stringify(getWorkflow));
610
+ const getWorkflowExecuted = getWorkflowObj.executed;
611
+ expect(getWorkflowExecuted).toBe(1);
612
+ const getWorkflowNodeExecutions = await apiGetWorkflowNodeExecutions(workflowId);
613
+ const getWorkflowNodeExecutionsObj = JSON.parse(JSON.stringify(getWorkflowNodeExecutions));
614
+ getWorkflowNodeExecutionsObj.sort(function (a: { id: number }, b: { id: number }) {
615
+ return b.id - a.id;
616
+ });
617
+ const jobs = getWorkflowNodeExecutionsObj[0].jobs;
618
+ const aggregateNodeJob = jobs.find((job) => job.nodeId.toString() === aggregateRecordNodeId);
619
+ const aggregateNodeJobResult = aggregateNodeJob.result;
620
+ expect(aggregateNodeJobResult).toBe(3);
621
+ // 4、后置处理:删除工作流
622
+ await apiDeleteWorkflow(workflowId);
623
+ });
624
+
625
+ test.skip('Collection event add data trigger, normal table integer fields de-weighting SUM', async ({
626
+ page,
627
+ mockCollections,
628
+ mockRecords,
629
+ }) => {
630
+ //数据表后缀标识
631
+ const triggerNodeAppendText = 'a' + faker.string.alphanumeric(4);
632
+ const aggregateNodeAppendText = 'b' + faker.string.alphanumeric(4);
633
+ //创建触发器节点数据表
634
+ const triggerNodeCollectionDisplayName = `自动>组织[普通表]${triggerNodeAppendText}`;
635
+ const triggerNodeCollectionName = `tt_amt_org${triggerNodeAppendText}`;
636
+ const triggerNodeFieldName = 'orgname';
637
+ const triggerNodeFieldDisplayName = '公司名称(单行文本)';
638
+ await mockCollections(
639
+ appendJsonCollectionName(JSON.parse(JSON.stringify(generalWithNoRelationalFields)), triggerNodeAppendText)
640
+ .collections,
641
+ );
642
+
643
+ // 创建聚合节点数据表
644
+ const aggregateNodeCollectionDisplayName = `自动>组织[普通表]${aggregateNodeAppendText}`;
645
+ const aggregateNodeCollectionName = `tt_amt_org${aggregateNodeAppendText}`;
646
+ const aggregateNodeFieldName = 'staffnum';
647
+ const aggregateNodeFieldDisplayName = '员工人数(整数)';
648
+ await mockCollections(
649
+ appendJsonCollectionName(JSON.parse(JSON.stringify(generalWithNoRelationalFields)), aggregateNodeAppendText)
650
+ .collections,
651
+ );
652
+ const aggregateNodeCollectionData = [
653
+ { staffnum: 3, regcapital: 3.12 },
654
+ { staffnum: 3, regcapital: 3.6 },
655
+ { staffnum: 4, regcapital: 4.6 },
656
+ { staffnum: 4, regcapital: 4.6 },
657
+ { staffnum: 5, regcapital: 5.6 },
658
+ ];
659
+ const aggregateNodeCollectionRecords = await mockRecords(aggregateNodeCollectionName, aggregateNodeCollectionData);
660
+
661
+ //添加工作流
662
+ const workFlowName = faker.string.alphanumeric(5) + triggerNodeAppendText;
663
+ const workflowData = {
664
+ current: true,
665
+ options: { deleteExecutionOnStatus: [] },
666
+ title: workFlowName,
667
+ type: 'collection',
668
+ enabled: true,
669
+ };
670
+ const workflow = await apiCreateWorkflow(workflowData);
671
+ const workflowObj = JSON.parse(JSON.stringify(workflow));
672
+ const workflowId = workflowObj.id;
673
+ //配置工作流触发器
674
+ const triggerNodeData = {
675
+ config: { appends: [], collection: triggerNodeCollectionName, changed: [], condition: { $and: [] }, mode: 1 },
676
+ };
677
+ const triggerNode = await apiUpdateWorkflowTrigger(workflowId, triggerNodeData);
678
+ const triggerNodeObj = JSON.parse(JSON.stringify(triggerNode));
679
+
680
+ //配置聚合数据节点
681
+ await page.goto(`admin/workflow/workflows/${workflowId}`);
682
+ await page.waitForLoadState('networkidle');
683
+ const collectionTriggerNode = new CollectionTriggerNode(page, workFlowName, triggerNodeCollectionName);
684
+ await collectionTriggerNode.addNodeButton.click();
685
+ await page.getByRole('button', { name: 'aggregate', exact: true }).click();
686
+ const aggregateRecordNodeName = 'Aggregate' + dayjs().format('YYYYMMDDHHmmss.SSS').toString();
687
+ await page.getByLabel('Aggregate-Aggregate', { exact: true }).getByRole('textbox').fill(aggregateRecordNodeName);
688
+ const aggregateRecordNode = new AggregateNode(page, aggregateRecordNodeName);
689
+ const aggregateRecordNodeId = await aggregateRecordNode.node.locator('.workflow-node-id').innerText();
690
+ await aggregateRecordNode.nodeConfigure.click();
691
+ await aggregateRecordNode.sumRadio.click();
692
+ await aggregateRecordNode.collectionDropDown.click();
693
+ await page.getByText(aggregateNodeCollectionDisplayName).click();
694
+ await aggregateRecordNode.aggregatedFieldDropDown.click();
695
+ await page.getByRole('option', { name: aggregateNodeFieldDisplayName }).click();
696
+ await aggregateRecordNode.distinctCheckBox.click();
697
+ await aggregateRecordNode.submitButton.click();
698
+
699
+ // 2、测试步骤:添加数据触发工作流
700
+ const triggerNodeCollectionRecordOne =
701
+ triggerNodeFieldDisplayName + dayjs().format('YYYYMMDDHHmmss.SSS').toString();
702
+ const triggerNodeCollectionRecords = await mockRecords(triggerNodeCollectionName, [
703
+ { orgname: triggerNodeCollectionRecordOne },
704
+ ]);
705
+ await page.waitForTimeout(1000);
706
+
707
+ // 3、预期结果:工作流成功触发,数据查询成功
708
+ const getWorkflow = await apiGetWorkflow(workflowId);
709
+ const getWorkflowObj = JSON.parse(JSON.stringify(getWorkflow));
710
+ const getWorkflowExecuted = getWorkflowObj.executed;
711
+ expect(getWorkflowExecuted).toBe(1);
712
+ const getWorkflowNodeExecutions = await apiGetWorkflowNodeExecutions(workflowId);
713
+ const getWorkflowNodeExecutionsObj = JSON.parse(JSON.stringify(getWorkflowNodeExecutions));
714
+ getWorkflowNodeExecutionsObj.sort(function (a: { id: number }, b: { id: number }) {
715
+ return b.id - a.id;
716
+ });
717
+ const jobs = getWorkflowNodeExecutionsObj[0].jobs;
718
+ const aggregateNodeJob = jobs.find((job) => job.nodeId.toString() === aggregateRecordNodeId);
719
+ const aggregateNodeJobResult = aggregateNodeJob.result;
720
+ // aggregateNodeCollectionData中staffnum字段值去重
721
+ const aggregateNodeCollectionDataDistinct = [...new Set(aggregateNodeCollectionData.map((item) => item.staffnum))];
722
+ // aggregateNodeCollectionDataDistinct中staffnum字段值总和
723
+ const aggregateNodeCollectionDataDistinctSum = aggregateNodeCollectionDataDistinct.reduce((total, currentValue) => {
724
+ return total + currentValue;
725
+ }, 0);
726
+ expect(aggregateNodeJobResult).toBe(aggregateNodeCollectionDataDistinctSum);
727
+ // 4、后置处理:删除工作流
728
+ await apiDeleteWorkflow(workflowId);
729
+ });
730
+
731
+ test.skip('Collection event add data trigger, normal table integer fields de-weighting AVG', async ({
732
+ page,
733
+ mockCollections,
734
+ mockRecords,
735
+ }) => {
736
+ //数据表后缀标识
737
+ const triggerNodeAppendText = 'a' + faker.string.alphanumeric(4);
738
+ const aggregateNodeAppendText = 'b' + faker.string.alphanumeric(4);
739
+ //创建触发器节点数据表
740
+ const triggerNodeCollectionDisplayName = `自动>组织[普通表]${triggerNodeAppendText}`;
741
+ const triggerNodeCollectionName = `tt_amt_org${triggerNodeAppendText}`;
742
+ const triggerNodeFieldName = 'orgname';
743
+ const triggerNodeFieldDisplayName = '公司名称(单行文本)';
744
+ await mockCollections(
745
+ appendJsonCollectionName(JSON.parse(JSON.stringify(generalWithNoRelationalFields)), triggerNodeAppendText)
746
+ .collections,
747
+ );
748
+
749
+ // 创建聚合节点数据表
750
+ const aggregateNodeCollectionDisplayName = `自动>组织[普通表]${aggregateNodeAppendText}`;
751
+ const aggregateNodeCollectionName = `tt_amt_org${aggregateNodeAppendText}`;
752
+ const aggregateNodeFieldName = 'staffnum';
753
+ const aggregateNodeFieldDisplayName = '员工人数(整数)';
754
+ await mockCollections(
755
+ appendJsonCollectionName(JSON.parse(JSON.stringify(generalWithNoRelationalFields)), aggregateNodeAppendText)
756
+ .collections,
757
+ );
758
+ const aggregateNodeCollectionData = [
759
+ { staffnum: 3, regcapital: 3.12 },
760
+ { staffnum: 3, regcapital: 3.6 },
761
+ { staffnum: 4, regcapital: 4.6 },
762
+ { staffnum: 4, regcapital: 4.6 },
763
+ { staffnum: 5, regcapital: 5.6 },
764
+ ];
765
+ const aggregateNodeCollectionRecords = await mockRecords(aggregateNodeCollectionName, aggregateNodeCollectionData);
766
+
767
+ //添加工作流
768
+ const workFlowName = faker.string.alphanumeric(5) + triggerNodeAppendText;
769
+ const workflowData = {
770
+ current: true,
771
+ options: { deleteExecutionOnStatus: [] },
772
+ title: workFlowName,
773
+ type: 'collection',
774
+ enabled: true,
775
+ };
776
+ const workflow = await apiCreateWorkflow(workflowData);
777
+ const workflowObj = JSON.parse(JSON.stringify(workflow));
778
+ const workflowId = workflowObj.id;
779
+ //配置工作流触发器
780
+ const triggerNodeData = {
781
+ config: { appends: [], collection: triggerNodeCollectionName, changed: [], condition: { $and: [] }, mode: 1 },
782
+ };
783
+ const triggerNode = await apiUpdateWorkflowTrigger(workflowId, triggerNodeData);
784
+ const triggerNodeObj = JSON.parse(JSON.stringify(triggerNode));
785
+ //配置聚合数据节点
786
+ await page.goto(`admin/workflow/workflows/${workflowId}`);
787
+ await page.waitForLoadState('networkidle');
788
+ const collectionTriggerNode = new CollectionTriggerNode(page, workFlowName, triggerNodeCollectionName);
789
+ await collectionTriggerNode.addNodeButton.click();
790
+ await page.getByRole('button', { name: 'aggregate', exact: true }).click();
791
+ const aggregateRecordNodeName = 'Aggregate' + dayjs().format('YYYYMMDDHHmmss.SSS').toString();
792
+ await page.getByLabel('Aggregate-Aggregate', { exact: true }).getByRole('textbox').fill(aggregateRecordNodeName);
793
+ const aggregateRecordNode = new AggregateNode(page, aggregateRecordNodeName);
794
+ const aggregateRecordNodeId = await aggregateRecordNode.node.locator('.workflow-node-id').innerText();
795
+ await aggregateRecordNode.nodeConfigure.click();
796
+ await aggregateRecordNode.avgRadio.click();
797
+ await aggregateRecordNode.collectionDropDown.click();
798
+ await page.getByText(aggregateNodeCollectionDisplayName).click();
799
+ await aggregateRecordNode.aggregatedFieldDropDown.click();
800
+ await page.getByRole('option', { name: aggregateNodeFieldDisplayName }).click();
801
+ await aggregateRecordNode.distinctCheckBox.click();
802
+ await aggregateRecordNode.submitButton.click();
803
+
804
+ // 2、测试步骤:添加数据触发工作流
805
+ const triggerNodeCollectionRecordOne =
806
+ triggerNodeFieldDisplayName + dayjs().format('YYYYMMDDHHmmss.SSS').toString();
807
+ const triggerNodeCollectionRecords = await mockRecords(triggerNodeCollectionName, [
808
+ { orgname: triggerNodeCollectionRecordOne },
809
+ ]);
810
+ await page.waitForTimeout(1000);
811
+
812
+ // 3、预期结果:工作流成功触发,数据查询成功
813
+ const getWorkflow = await apiGetWorkflow(workflowId);
814
+ const getWorkflowObj = JSON.parse(JSON.stringify(getWorkflow));
815
+ const getWorkflowExecuted = getWorkflowObj.executed;
816
+ expect(getWorkflowExecuted).toBe(1);
817
+ const getWorkflowNodeExecutions = await apiGetWorkflowNodeExecutions(workflowId);
818
+ const getWorkflowNodeExecutionsObj = JSON.parse(JSON.stringify(getWorkflowNodeExecutions));
819
+ getWorkflowNodeExecutionsObj.sort(function (a: { id: number }, b: { id: number }) {
820
+ return b.id - a.id;
821
+ });
822
+ const jobs = getWorkflowNodeExecutionsObj[0].jobs;
823
+ const aggregateNodeJob = jobs.find((job) => job.nodeId.toString() === aggregateRecordNodeId);
824
+ const aggregateNodeJobResult = aggregateNodeJob.result;
825
+ // aggregateNodeCollectionData中staffnum字段值去重
826
+ const aggregateNodeCollectionDataDistinct = [...new Set(aggregateNodeCollectionData.map((item) => item.staffnum))];
827
+ // aggregateNodeCollectionDataDistinct中staffnum字段值平均值
828
+ const aggregateNodeCollectionDataDistinctAvg =
829
+ aggregateNodeCollectionDataDistinct.reduce((total, currentValue) => {
830
+ return total + currentValue;
831
+ }, 0) / aggregateNodeCollectionDataDistinct.length;
832
+ expect(aggregateNodeJobResult).toBe(aggregateNodeCollectionDataDistinctAvg);
833
+ // 4、后置处理:删除工作流
834
+ await apiDeleteWorkflow(workflowId);
835
+ });
836
+
837
+ test.skip('Collection event add data trigger, normal table integer fields de-weighting MIN', async ({
838
+ page,
839
+ mockCollections,
840
+ mockRecords,
841
+ }) => {
842
+ //数据表后缀标识
843
+ const triggerNodeAppendText = 'a' + faker.string.alphanumeric(4);
844
+ const aggregateNodeAppendText = 'b' + faker.string.alphanumeric(4);
845
+ //创建触发器节点数据表
846
+ const triggerNodeCollectionDisplayName = `自动>组织[普通表]${triggerNodeAppendText}`;
847
+ const triggerNodeCollectionName = `tt_amt_org${triggerNodeAppendText}`;
848
+ const triggerNodeFieldName = 'orgname';
849
+ const triggerNodeFieldDisplayName = '公司名称(单行文本)';
850
+ await mockCollections(
851
+ appendJsonCollectionName(JSON.parse(JSON.stringify(generalWithNoRelationalFields)), triggerNodeAppendText)
852
+ .collections,
853
+ );
854
+
855
+ // 创建聚合节点数据表
856
+ const aggregateNodeCollectionDisplayName = `自动>组织[普通表]${aggregateNodeAppendText}`;
857
+ const aggregateNodeCollectionName = `tt_amt_org${aggregateNodeAppendText}`;
858
+ const aggregateNodeFieldName = 'staffnum';
859
+ const aggregateNodeFieldDisplayName = '员工人数(整数)';
860
+ await mockCollections(
861
+ appendJsonCollectionName(JSON.parse(JSON.stringify(generalWithNoRelationalFields)), aggregateNodeAppendText)
862
+ .collections,
863
+ );
864
+ const aggregateNodeCollectionData = [
865
+ { staffnum: 3, regcapital: 3.12 },
866
+ { staffnum: 3, regcapital: 3.6 },
867
+ { staffnum: 4, regcapital: 4.6 },
868
+ { staffnum: 4, regcapital: 4.6 },
869
+ { staffnum: 5, regcapital: 5.6 },
870
+ ];
871
+ const aggregateNodeCollectionRecords = await mockRecords(aggregateNodeCollectionName, aggregateNodeCollectionData);
872
+
873
+ //添加工作流
874
+ const workFlowName = faker.string.alphanumeric(5) + triggerNodeAppendText;
875
+ const workflowData = {
876
+ current: true,
877
+ options: { deleteExecutionOnStatus: [] },
878
+ title: workFlowName,
879
+ type: 'collection',
880
+ enabled: true,
881
+ };
882
+ const workflow = await apiCreateWorkflow(workflowData);
883
+ const workflowObj = JSON.parse(JSON.stringify(workflow));
884
+ const workflowId = workflowObj.id;
885
+ //配置工作流触发器
886
+ const triggerNodeData = {
887
+ config: { appends: [], collection: triggerNodeCollectionName, changed: [], condition: { $and: [] }, mode: 1 },
888
+ };
889
+ const triggerNode = await apiUpdateWorkflowTrigger(workflowId, triggerNodeData);
890
+ const triggerNodeObj = JSON.parse(JSON.stringify(triggerNode));
891
+
892
+ //配置聚合数据节点
893
+ await page.goto(`admin/workflow/workflows/${workflowId}`);
894
+ await page.waitForLoadState('networkidle');
895
+ const collectionTriggerNode = new CollectionTriggerNode(page, workFlowName, triggerNodeCollectionName);
896
+ await collectionTriggerNode.addNodeButton.click();
897
+ await page.getByRole('button', { name: 'aggregate', exact: true }).click();
898
+ const aggregateRecordNodeName = 'Aggregate' + dayjs().format('YYYYMMDDHHmmss.SSS').toString();
899
+ await page.getByLabel('Aggregate-Aggregate', { exact: true }).getByRole('textbox').fill(aggregateRecordNodeName);
900
+ const aggregateRecordNode = new AggregateNode(page, aggregateRecordNodeName);
901
+ const aggregateRecordNodeId = await aggregateRecordNode.node.locator('.workflow-node-id').innerText();
902
+ await aggregateRecordNode.nodeConfigure.click();
903
+ await aggregateRecordNode.minRadio.click();
904
+ await aggregateRecordNode.collectionDropDown.click();
905
+ await page.getByText(aggregateNodeCollectionDisplayName).click();
906
+ await aggregateRecordNode.aggregatedFieldDropDown.click();
907
+ await page.getByRole('option', { name: aggregateNodeFieldDisplayName }).click();
908
+ await aggregateRecordNode.distinctCheckBox.click();
909
+ await aggregateRecordNode.submitButton.click();
910
+
911
+ // 2、测试步骤:添加数据触发工作流
912
+ const triggerNodeCollectionRecordOne =
913
+ triggerNodeFieldDisplayName + dayjs().format('YYYYMMDDHHmmss.SSS').toString();
914
+ const triggerNodeCollectionRecords = await mockRecords(triggerNodeCollectionName, [
915
+ { orgname: triggerNodeCollectionRecordOne },
916
+ ]);
917
+ await page.waitForTimeout(1000);
918
+
919
+ // 3、预期结果:工作流成功触发,数据查询成功
920
+ const getWorkflow = await apiGetWorkflow(workflowId);
921
+ const getWorkflowObj = JSON.parse(JSON.stringify(getWorkflow));
922
+ const getWorkflowExecuted = getWorkflowObj.executed;
923
+ expect(getWorkflowExecuted).toBe(1);
924
+ const getWorkflowNodeExecutions = await apiGetWorkflowNodeExecutions(workflowId);
925
+ const getWorkflowNodeExecutionsObj = JSON.parse(JSON.stringify(getWorkflowNodeExecutions));
926
+ getWorkflowNodeExecutionsObj.sort(function (a: { id: number }, b: { id: number }) {
927
+ return b.id - a.id;
928
+ });
929
+ const jobs = getWorkflowNodeExecutionsObj[0].jobs;
930
+ const aggregateNodeJob = jobs.find((job) => job.nodeId.toString() === aggregateRecordNodeId);
931
+ const aggregateNodeJobResult = aggregateNodeJob.result;
932
+ // aggregateNodeCollectionData中staffnum字段值最小值
933
+ const aggregateNodeCollectionDataMin = aggregateNodeCollectionData.reduce((min, currentValue) => {
934
+ return currentValue.staffnum < min ? currentValue.staffnum : min;
935
+ }, aggregateNodeCollectionData[0].staffnum);
936
+ expect(aggregateNodeJobResult).toBe(aggregateNodeCollectionDataMin);
937
+ // 4、后置处理:删除工作流
938
+ await apiDeleteWorkflow(workflowId);
939
+ });
940
+
941
+ test.skip('Collection event add data trigger, normal table integer fields de-weighting MAX', async ({
942
+ page,
943
+ mockCollections,
944
+ mockRecords,
945
+ }) => {
946
+ //数据表后缀标识
947
+ const triggerNodeAppendText = 'a' + faker.string.alphanumeric(4);
948
+ const aggregateNodeAppendText = 'b' + faker.string.alphanumeric(4);
949
+ //创建触发器节点数据表
950
+ const triggerNodeCollectionDisplayName = `自动>组织[普通表]${triggerNodeAppendText}`;
951
+ const triggerNodeCollectionName = `tt_amt_org${triggerNodeAppendText}`;
952
+ const triggerNodeFieldName = 'orgname';
953
+ const triggerNodeFieldDisplayName = '公司名称(单行文本)';
954
+ await mockCollections(
955
+ appendJsonCollectionName(JSON.parse(JSON.stringify(generalWithNoRelationalFields)), triggerNodeAppendText)
956
+ .collections,
957
+ );
958
+
959
+ // 创建聚合节点数据表
960
+ const aggregateNodeCollectionDisplayName = `自动>组织[普通表]${aggregateNodeAppendText}`;
961
+ const aggregateNodeCollectionName = `tt_amt_org${aggregateNodeAppendText}`;
962
+ const aggregateNodeFieldName = 'staffnum';
963
+ const aggregateNodeFieldDisplayName = '员工人数(整数)';
964
+ await mockCollections(
965
+ appendJsonCollectionName(JSON.parse(JSON.stringify(generalWithNoRelationalFields)), aggregateNodeAppendText)
966
+ .collections,
967
+ );
968
+ const aggregateNodeCollectionData = [
969
+ { staffnum: 3, regcapital: 3.12 },
970
+ { staffnum: 3, regcapital: 3.6 },
971
+ { staffnum: 4, regcapital: 4.6 },
972
+ { staffnum: 4, regcapital: 4.6 },
973
+ { staffnum: 5, regcapital: 5.6 },
974
+ ];
975
+ const aggregateNodeCollectionRecords = await mockRecords(aggregateNodeCollectionName, aggregateNodeCollectionData);
976
+
977
+ //添加工作流
978
+ const workFlowName = faker.string.alphanumeric(5) + triggerNodeAppendText;
979
+ const workflowData = {
980
+ current: true,
981
+ options: { deleteExecutionOnStatus: [] },
982
+ title: workFlowName,
983
+ type: 'collection',
984
+ enabled: true,
985
+ };
986
+ const workflow = await apiCreateWorkflow(workflowData);
987
+ const workflowObj = JSON.parse(JSON.stringify(workflow));
988
+ const workflowId = workflowObj.id;
989
+ //配置工作流触发器
990
+ const triggerNodeData = {
991
+ config: { appends: [], collection: triggerNodeCollectionName, changed: [], condition: { $and: [] }, mode: 1 },
992
+ };
993
+ const triggerNode = await apiUpdateWorkflowTrigger(workflowId, triggerNodeData);
994
+ const triggerNodeObj = JSON.parse(JSON.stringify(triggerNode));
995
+
996
+ //配置聚合数据节点
997
+ await page.goto(`admin/workflow/workflows/${workflowId}`);
998
+ await page.waitForLoadState('networkidle');
999
+ const collectionTriggerNode = new CollectionTriggerNode(page, workFlowName, triggerNodeCollectionName);
1000
+ await collectionTriggerNode.addNodeButton.click();
1001
+ await page.getByRole('button', { name: 'aggregate', exact: true }).click();
1002
+ const aggregateRecordNodeName = 'Aggregate' + dayjs().format('YYYYMMDDHHmmss.SSS').toString();
1003
+ await page.getByLabel('Aggregate-Aggregate', { exact: true }).getByRole('textbox').fill(aggregateRecordNodeName);
1004
+ const aggregateRecordNode = new AggregateNode(page, aggregateRecordNodeName);
1005
+ const aggregateRecordNodeId = await aggregateRecordNode.node.locator('.workflow-node-id').innerText();
1006
+ await aggregateRecordNode.nodeConfigure.click();
1007
+ await aggregateRecordNode.maxRadio.click();
1008
+ await aggregateRecordNode.collectionDropDown.click();
1009
+ await page.getByText(aggregateNodeCollectionDisplayName).click();
1010
+ await aggregateRecordNode.aggregatedFieldDropDown.click();
1011
+ await page.getByRole('option', { name: aggregateNodeFieldDisplayName }).click();
1012
+ await aggregateRecordNode.distinctCheckBox.click();
1013
+ await aggregateRecordNode.submitButton.click();
1014
+
1015
+ // 2、测试步骤:添加数据触发工作流
1016
+ const triggerNodeCollectionRecordOne =
1017
+ triggerNodeFieldDisplayName + dayjs().format('YYYYMMDDHHmmss.SSS').toString();
1018
+ const triggerNodeCollectionRecords = await mockRecords(triggerNodeCollectionName, [
1019
+ { orgname: triggerNodeCollectionRecordOne },
1020
+ ]);
1021
+ await page.waitForTimeout(1000);
1022
+
1023
+ // 3、预期结果:工作流成功触发,数据查询成功
1024
+ const getWorkflow = await apiGetWorkflow(workflowId);
1025
+ const getWorkflowObj = JSON.parse(JSON.stringify(getWorkflow));
1026
+ const getWorkflowExecuted = getWorkflowObj.executed;
1027
+ expect(getWorkflowExecuted).toBe(1);
1028
+ const getWorkflowNodeExecutions = await apiGetWorkflowNodeExecutions(workflowId);
1029
+ const getWorkflowNodeExecutionsObj = JSON.parse(JSON.stringify(getWorkflowNodeExecutions));
1030
+ getWorkflowNodeExecutionsObj.sort(function (a: { id: number }, b: { id: number }) {
1031
+ return b.id - a.id;
1032
+ });
1033
+ const jobs = getWorkflowNodeExecutionsObj[0].jobs;
1034
+ const aggregateNodeJob = jobs.find((job) => job.nodeId.toString() === aggregateRecordNodeId);
1035
+ const aggregateNodeJobResult = aggregateNodeJob.result;
1036
+ // aggregateNodeCollectionData中staffnum字段值最大值
1037
+ const aggregateNodeCollectionDataMax = aggregateNodeCollectionData.reduce((max, currentValue) => {
1038
+ return currentValue.staffnum > max ? currentValue.staffnum : max;
1039
+ }, aggregateNodeCollectionData[0].staffnum);
1040
+ expect(aggregateNodeJobResult).toBe(aggregateNodeCollectionDataMax);
1041
+ // 4、后置处理:删除工作流
1042
+ await apiDeleteWorkflow(workflowId);
202
1043
  });
203
- const jobs = getWorkflowNodeExecutionsObj[0].jobs;
204
- const queryRecordNodeJob = jobs.find((job) => job.nodeId.toString() === aggregateRecordNodeId);
205
- const queryRecordNodeJobResult = queryRecordNodeJob.result;
206
- // aggregateNodeCollectionData中staffnum字段值总和
207
- const aggregateNodeCollectionDataSum = aggregateNodeCollectionData.reduce((total, currentValue) => {
208
- return total + currentValue.staffnum;
209
- }, 0);
210
- expect(queryRecordNodeJobResult).toBe(aggregateNodeCollectionDataSum);
211
- // 4、后置处理:删除工作流
212
- await apiDeleteWorkflow(workflowId);
213
1044
  });
214
1045
 
215
- test('Collection event add data trigger, aggregated data table, no filtering, normal table integer fields not de-emphasised AVG', async ({
216
- page,
217
- mockCollections,
218
- mockRecords,
219
- }) => {
220
- //数据表后缀标识
221
- const triggerNodeAppendText = 'a' + faker.string.alphanumeric(4);
222
- const aggregateNodeAppendText = 'b' + faker.string.alphanumeric(4);
223
- //创建触发器节点数据表
224
- const triggerNodeCollectionDisplayName = `自动>组织[普通表]${triggerNodeAppendText}`;
225
- const triggerNodeCollectionName = `tt_amt_org${triggerNodeAppendText}`;
226
- const triggerNodeFieldName = 'orgname';
227
- const triggerNodeFieldDisplayName = '公司名称(单行文本)';
228
- await mockCollections(
229
- appendJsonCollectionName(JSON.parse(JSON.stringify(generalWithNoRelationalFields)), triggerNodeAppendText)
230
- .collections,
231
- );
232
-
233
- // 创建聚合节点数据表
234
- const aggregateNodeCollectionDisplayName = `自动>组织[普通表]${aggregateNodeAppendText}`;
235
- const aggregateNodeCollectionName = `tt_amt_org${aggregateNodeAppendText}`;
236
- const aggregateNodeFieldName = 'staffnum';
237
- const aggregateNodeFieldDisplayName = '员工人数(整数)';
238
- await mockCollections(
239
- appendJsonCollectionName(JSON.parse(JSON.stringify(generalWithNoRelationalFields)), aggregateNodeAppendText)
240
- .collections,
241
- );
242
- const aggregateNodeCollectionData = [
243
- { staffnum: 3, regcapital: 3.12 },
244
- { staffnum: 3, regcapital: 3.6 },
245
- { staffnum: 4, regcapital: 4.6 },
246
- { staffnum: 4, regcapital: 4.6 },
247
- { staffnum: 5, regcapital: 5.6 },
248
- ];
249
- const aggregateNodeCollectionRecords = await mockRecords(aggregateNodeCollectionName, aggregateNodeCollectionData);
250
-
251
- //添加工作流
252
- const workFlowName = faker.string.alphanumeric(5) + triggerNodeAppendText;
253
- const workflowData = {
254
- current: true,
255
- options: { deleteExecutionOnStatus: [] },
256
- title: workFlowName,
257
- type: 'collection',
258
- enabled: true,
259
- };
260
- const workflow = await apiCreateWorkflow(workflowData);
261
- const workflowObj = JSON.parse(JSON.stringify(workflow));
262
- const workflowId = workflowObj.id;
263
- //配置工作流触发器
264
- const triggerNodeData = {
265
- config: { appends: [], collection: triggerNodeCollectionName, changed: [], condition: { $and: [] }, mode: 1 },
266
- };
267
- const triggerNode = await apiUpdateWorkflowTrigger(workflowId, triggerNodeData);
268
- const triggerNodeObj = JSON.parse(JSON.stringify(triggerNode));
269
- //配置聚合数据节点
270
- await page.goto(`admin/workflow/workflows/${workflowId}`);
271
- await page.waitForLoadState('networkidle');
272
- const collectionTriggerNode = new CollectionTriggerNode(page, workFlowName, triggerNodeCollectionName);
273
- await collectionTriggerNode.addNodeButton.click();
274
- await page.getByRole('button', { name: 'aggregate', exact: true }).click();
275
- const aggregateRecordNodeName = 'Aggregate' + dayjs().format('YYYYMMDDHHmmss.SSS').toString();
276
- await page.getByLabel('Aggregate-Aggregate', { exact: true }).getByRole('textbox').fill(aggregateRecordNodeName);
277
- const aggregateRecordNode = new AggregateNode(page, aggregateRecordNodeName);
278
- const aggregateRecordNodeId = await aggregateRecordNode.node.locator('.workflow-node-id').innerText();
279
- await aggregateRecordNode.nodeConfigure.click();
280
- await aggregateRecordNode.avgRadio.click();
281
- await aggregateRecordNode.collectionDropDown.click();
282
- await page.getByText(aggregateNodeCollectionDisplayName).click();
283
- await aggregateRecordNode.aggregatedFieldDropDown.click();
284
- await page.getByRole('option', { name: aggregateNodeFieldDisplayName }).click();
285
- await aggregateRecordNode.submitButton.click();
286
-
287
- // 2、测试步骤:添加数据触发工作流
288
- const triggerNodeCollectionRecordOne = triggerNodeFieldDisplayName + dayjs().format('YYYYMMDDHHmmss.SSS').toString();
289
- const triggerNodeCollectionRecords = await mockRecords(triggerNodeCollectionName, [
290
- { orgname: triggerNodeCollectionRecordOne },
291
- ]);
292
- await page.waitForTimeout(1000);
293
-
294
- // 3、预期结果:工作流成功触发,数据查询成功
295
- const getWorkflow = await apiGetWorkflow(workflowId);
296
- const getWorkflowObj = JSON.parse(JSON.stringify(getWorkflow));
297
- const getWorkflowExecuted = getWorkflowObj.executed;
298
- expect(getWorkflowExecuted).toBe(1);
299
- const getWorkflowNodeExecutions = await apiGetWorkflowNodeExecutions(workflowId);
300
- const getWorkflowNodeExecutionsObj = JSON.parse(JSON.stringify(getWorkflowNodeExecutions));
301
- getWorkflowNodeExecutionsObj.sort(function (a: { id: number }, b: { id: number }) {
302
- return b.id - a.id;
1046
+ test.describe('filter', () => {
1047
+ test('Collection event add data trigger, normal table integer fields not de-emphasised COUNT', async ({
1048
+ page,
1049
+ mockCollections,
1050
+ mockRecords,
1051
+ }) => {
1052
+ //数据表后缀标识
1053
+ const triggerNodeAppendText = 'a' + faker.string.alphanumeric(4);
1054
+ const aggregateNodeAppendText = 'b' + faker.string.alphanumeric(4);
1055
+ //创建触发器节点数据表
1056
+ const triggerNodeCollectionDisplayName = `自动>组织[普通表]${triggerNodeAppendText}`;
1057
+ const triggerNodeCollectionName = `tt_amt_org${triggerNodeAppendText}`;
1058
+ const triggerNodeFieldName = 'orgname';
1059
+ const triggerNodeFieldDisplayName = '公司名称(单行文本)';
1060
+ await mockCollections(
1061
+ appendJsonCollectionName(JSON.parse(JSON.stringify(generalWithNoRelationalFields)), triggerNodeAppendText)
1062
+ .collections,
1063
+ );
1064
+
1065
+ // 创建聚合节点数据表
1066
+ const aggregateNodeCollectionDisplayName = `自动>组织[普通表]${aggregateNodeAppendText}`;
1067
+ const aggregateNodeCollectionName = `tt_amt_org${aggregateNodeAppendText}`;
1068
+ const aggregateNodeFieldName = 'staffnum';
1069
+ const aggregateNodeFieldDisplayName = '员工人数(整数)';
1070
+ await mockCollections(
1071
+ appendJsonCollectionName(JSON.parse(JSON.stringify(generalWithNoRelationalFields)), aggregateNodeAppendText)
1072
+ .collections,
1073
+ );
1074
+ const aggregateNodeCollectionData = [
1075
+ { staffnum: 3, regcapital: 3.12 },
1076
+ { staffnum: 3, regcapital: 3.6 },
1077
+ { staffnum: 4, regcapital: 4.6 },
1078
+ { staffnum: 4, regcapital: 4.6 },
1079
+ { staffnum: 5, regcapital: 5.6 },
1080
+ ];
1081
+ const aggregateNodeCollectionRecords = await mockRecords(aggregateNodeCollectionName, aggregateNodeCollectionData);
1082
+
1083
+ //添加工作流
1084
+ const workFlowName = faker.string.alphanumeric(5) + triggerNodeAppendText;
1085
+ const workflowData = {
1086
+ current: true,
1087
+ options: { deleteExecutionOnStatus: [] },
1088
+ title: workFlowName,
1089
+ type: 'collection',
1090
+ enabled: true,
1091
+ };
1092
+ const workflow = await apiCreateWorkflow(workflowData);
1093
+ const workflowObj = JSON.parse(JSON.stringify(workflow));
1094
+ const workflowId = workflowObj.id;
1095
+ //配置工作流触发器
1096
+ const triggerNodeData = {
1097
+ config: { appends: [], collection: triggerNodeCollectionName, changed: [], condition: { $and: [] }, mode: 1 },
1098
+ };
1099
+ const triggerNode = await apiUpdateWorkflowTrigger(workflowId, triggerNodeData);
1100
+ const triggerNodeObj = JSON.parse(JSON.stringify(triggerNode));
1101
+
1102
+ //配置聚合数据节点
1103
+ await page.goto(`admin/workflow/workflows/${workflowId}`);
1104
+ await page.waitForLoadState('networkidle');
1105
+ const collectionTriggerNode = new CollectionTriggerNode(page, workFlowName, triggerNodeCollectionName);
1106
+ await collectionTriggerNode.addNodeButton.click();
1107
+ await page.getByRole('button', { name: 'aggregate', exact: true }).click();
1108
+ const aggregateRecordNodeName = 'Aggregate' + dayjs().format('YYYYMMDDHHmmss.SSS').toString();
1109
+ await page.getByLabel('Aggregate-Aggregate', { exact: true }).getByRole('textbox').fill(aggregateRecordNodeName);
1110
+ const aggregateRecordNode = new AggregateNode(page, aggregateRecordNodeName);
1111
+ const aggregateRecordNodeId = await aggregateRecordNode.node.locator('.workflow-node-id').innerText();
1112
+ await aggregateRecordNode.nodeConfigure.click();
1113
+ await aggregateRecordNode.collectionDropDown.click();
1114
+ await page.getByText(aggregateNodeCollectionDisplayName).click();
1115
+ await aggregateRecordNode.aggregatedFieldDropDown.click();
1116
+ await page.getByRole('option', { name: aggregateNodeFieldDisplayName }).click();
1117
+ // 过滤条件
1118
+ await page.getByText('Add condition', { exact: true }).click();
1119
+ await page.getByLabel('block-item-Filter-workflows-Filter').getByRole('button', { name: 'Select field' }).click();
1120
+ await page.getByRole('menuitemcheckbox', { name: '员工人数(整数)' }).click();
1121
+ await page.getByRole('button', { name: '=' }).click();
1122
+ await page.getByRole('option', { name: '>' }).click();
1123
+ await page.getByLabel('block-item-Filter-workflows-Filter').getByRole('spinbutton').fill('3');
1124
+ await aggregateRecordNode.submitButton.click();
1125
+
1126
+ // 2、测试步骤:添加数据触发工作流
1127
+ const triggerNodeCollectionRecordOne =
1128
+ triggerNodeFieldDisplayName + dayjs().format('YYYYMMDDHHmmss.SSS').toString();
1129
+ const triggerNodeCollectionRecords = await mockRecords(triggerNodeCollectionName, [
1130
+ { orgname: triggerNodeCollectionRecordOne },
1131
+ ]);
1132
+ await page.waitForTimeout(1000);
1133
+
1134
+ // 3、预期结果:工作流成功触发,数据查询成功
1135
+ const getWorkflow = await apiGetWorkflow(workflowId);
1136
+ const getWorkflowObj = JSON.parse(JSON.stringify(getWorkflow));
1137
+ const getWorkflowExecuted = getWorkflowObj.executed;
1138
+ expect(getWorkflowExecuted).toBe(1);
1139
+ const getWorkflowNodeExecutions = await apiGetWorkflowNodeExecutions(workflowId);
1140
+ const getWorkflowNodeExecutionsObj = JSON.parse(JSON.stringify(getWorkflowNodeExecutions));
1141
+ getWorkflowNodeExecutionsObj.sort(function (a: { id: number }, b: { id: number }) {
1142
+ return b.id - a.id;
1143
+ });
1144
+ const jobs = getWorkflowNodeExecutionsObj[0].jobs;
1145
+ const aggregateNodeJob = jobs.find((job) => job.nodeId.toString() === aggregateRecordNodeId);
1146
+ const aggregateNodeJobResult = aggregateNodeJob.result;
1147
+ expect(aggregateNodeJobResult).toBe(3);
1148
+ // 4、后置处理:删除工作流
1149
+ await apiDeleteWorkflow(workflowId);
303
1150
  });
304
- const jobs = getWorkflowNodeExecutionsObj[0].jobs;
305
- const queryRecordNodeJob = jobs.find((job) => job.nodeId.toString() === aggregateRecordNodeId);
306
- const queryRecordNodeJobResult = queryRecordNodeJob.result;
307
- // aggregateNodeCollectionData中staffnum字段值平均值
308
- const aggregateNodeCollectionDataAvg =
309
- aggregateNodeCollectionData.reduce((total, currentValue) => {
1151
+
1152
+ test('Collection event add data trigger, normal table integer fields not de-emphasised SUM', async ({
1153
+ page,
1154
+ mockCollections,
1155
+ mockRecords,
1156
+ }) => {
1157
+ //数据表后缀标识
1158
+ const triggerNodeAppendText = 'a' + faker.string.alphanumeric(4);
1159
+ const aggregateNodeAppendText = 'b' + faker.string.alphanumeric(4);
1160
+ //创建触发器节点数据表
1161
+ const triggerNodeCollectionDisplayName = `自动>组织[普通表]${triggerNodeAppendText}`;
1162
+ const triggerNodeCollectionName = `tt_amt_org${triggerNodeAppendText}`;
1163
+ const triggerNodeFieldName = 'orgname';
1164
+ const triggerNodeFieldDisplayName = '公司名称(单行文本)';
1165
+ await mockCollections(
1166
+ appendJsonCollectionName(JSON.parse(JSON.stringify(generalWithNoRelationalFields)), triggerNodeAppendText)
1167
+ .collections,
1168
+ );
1169
+
1170
+ // 创建聚合节点数据表
1171
+ const aggregateNodeCollectionDisplayName = `自动>组织[普通表]${aggregateNodeAppendText}`;
1172
+ const aggregateNodeCollectionName = `tt_amt_org${aggregateNodeAppendText}`;
1173
+ const aggregateNodeFieldName = 'staffnum';
1174
+ const aggregateNodeFieldDisplayName = '员工人数(整数)';
1175
+ await mockCollections(
1176
+ appendJsonCollectionName(JSON.parse(JSON.stringify(generalWithNoRelationalFields)), aggregateNodeAppendText)
1177
+ .collections,
1178
+ );
1179
+ const aggregateNodeCollectionData = [
1180
+ { staffnum: 3, regcapital: 3.12 },
1181
+ { staffnum: 3, regcapital: 3.6 },
1182
+ { staffnum: 4, regcapital: 4.6 },
1183
+ { staffnum: 4, regcapital: 4.6 },
1184
+ { staffnum: 5, regcapital: 5.6 },
1185
+ ];
1186
+ const aggregateNodeCollectionRecords = await mockRecords(aggregateNodeCollectionName, aggregateNodeCollectionData);
1187
+
1188
+ //添加工作流
1189
+ const workFlowName = faker.string.alphanumeric(5) + triggerNodeAppendText;
1190
+ const workflowData = {
1191
+ current: true,
1192
+ options: { deleteExecutionOnStatus: [] },
1193
+ title: workFlowName,
1194
+ type: 'collection',
1195
+ enabled: true,
1196
+ };
1197
+ const workflow = await apiCreateWorkflow(workflowData);
1198
+ const workflowObj = JSON.parse(JSON.stringify(workflow));
1199
+ const workflowId = workflowObj.id;
1200
+ //配置工作流触发器
1201
+ const triggerNodeData = {
1202
+ config: { appends: [], collection: triggerNodeCollectionName, changed: [], condition: { $and: [] }, mode: 1 },
1203
+ };
1204
+ const triggerNode = await apiUpdateWorkflowTrigger(workflowId, triggerNodeData);
1205
+ const triggerNodeObj = JSON.parse(JSON.stringify(triggerNode));
1206
+
1207
+ //配置聚合数据节点
1208
+ await page.goto(`admin/workflow/workflows/${workflowId}`);
1209
+ await page.waitForLoadState('networkidle');
1210
+ const collectionTriggerNode = new CollectionTriggerNode(page, workFlowName, triggerNodeCollectionName);
1211
+ await collectionTriggerNode.addNodeButton.click();
1212
+ await page.getByRole('button', { name: 'aggregate', exact: true }).click();
1213
+ const aggregateRecordNodeName = 'Aggregate' + dayjs().format('YYYYMMDDHHmmss.SSS').toString();
1214
+ await page.getByLabel('Aggregate-Aggregate', { exact: true }).getByRole('textbox').fill(aggregateRecordNodeName);
1215
+ const aggregateRecordNode = new AggregateNode(page, aggregateRecordNodeName);
1216
+ const aggregateRecordNodeId = await aggregateRecordNode.node.locator('.workflow-node-id').innerText();
1217
+ await aggregateRecordNode.nodeConfigure.click();
1218
+ await aggregateRecordNode.sumRadio.click();
1219
+ await aggregateRecordNode.collectionDropDown.click();
1220
+ await page.getByText(aggregateNodeCollectionDisplayName).click();
1221
+ await aggregateRecordNode.aggregatedFieldDropDown.click();
1222
+ await page.getByRole('option', { name: aggregateNodeFieldDisplayName }).click();
1223
+ // 过滤条件
1224
+ await page.getByText('Add condition', { exact: true }).click();
1225
+ await page.getByLabel('block-item-Filter-workflows-Filter').getByRole('button', { name: 'Select field' }).click();
1226
+ await page.getByRole('menuitemcheckbox', { name: '员工人数(整数)' }).click();
1227
+ await page.getByRole('button', { name: '=' }).click();
1228
+ await page.getByRole('option', { name: '>' }).click();
1229
+ await page.getByLabel('block-item-Filter-workflows-Filter').getByRole('spinbutton').fill('3');
1230
+ await aggregateRecordNode.submitButton.click();
1231
+
1232
+ // 2、测试步骤:添加数据触发工作流
1233
+ const triggerNodeCollectionRecordOne =
1234
+ triggerNodeFieldDisplayName + dayjs().format('YYYYMMDDHHmmss.SSS').toString();
1235
+ const triggerNodeCollectionRecords = await mockRecords(triggerNodeCollectionName, [
1236
+ { orgname: triggerNodeCollectionRecordOne },
1237
+ ]);
1238
+ await page.waitForTimeout(1000);
1239
+
1240
+ // 3、预期结果:工作流成功触发,数据查询成功
1241
+ const getWorkflow = await apiGetWorkflow(workflowId);
1242
+ const getWorkflowObj = JSON.parse(JSON.stringify(getWorkflow));
1243
+ const getWorkflowExecuted = getWorkflowObj.executed;
1244
+ expect(getWorkflowExecuted).toBe(1);
1245
+ const getWorkflowNodeExecutions = await apiGetWorkflowNodeExecutions(workflowId);
1246
+ const getWorkflowNodeExecutionsObj = JSON.parse(JSON.stringify(getWorkflowNodeExecutions));
1247
+ getWorkflowNodeExecutionsObj.sort(function (a: { id: number }, b: { id: number }) {
1248
+ return b.id - a.id;
1249
+ });
1250
+ const jobs = getWorkflowNodeExecutionsObj[0].jobs;
1251
+ const aggregateNodeJob = jobs.find((job) => job.nodeId.toString() === aggregateRecordNodeId);
1252
+ const aggregateNodeJobResult = aggregateNodeJob.result;
1253
+ const aggregateNodeCollectionDataFilter = aggregateNodeCollectionData.filter((item) => item.staffnum > 3);
1254
+ // aggregateNodeCollectionDataFilter中staffnum字段值的总和
1255
+ const aggregateNodeCollectionDataFilterSum = aggregateNodeCollectionDataFilter.reduce((total, currentValue) => {
310
1256
  return total + currentValue.staffnum;
311
- }, 0) / aggregateNodeCollectionData.length;
312
- expect(queryRecordNodeJobResult).toBe(aggregateNodeCollectionDataAvg);
313
- // 4、后置处理:删除工作流
314
- await apiDeleteWorkflow(workflowId);
315
- });
1257
+ }, 0);
1258
+ expect(aggregateNodeJobResult).toBe(aggregateNodeCollectionDataFilterSum);
1259
+ // 4、后置处理:删除工作流
1260
+ await apiDeleteWorkflow(workflowId);
1261
+ });
1262
+
1263
+ test('Collection event add data trigger, normal table integer fields not de-emphasised AVG', async ({
1264
+ page,
1265
+ mockCollections,
1266
+ mockRecords,
1267
+ }) => {
1268
+ //数据表后缀标识
1269
+ const triggerNodeAppendText = 'a' + faker.string.alphanumeric(4);
1270
+ const aggregateNodeAppendText = 'b' + faker.string.alphanumeric(4);
1271
+ //创建触发器节点数据表
1272
+ const triggerNodeCollectionDisplayName = `自动>组织[普通表]${triggerNodeAppendText}`;
1273
+ const triggerNodeCollectionName = `tt_amt_org${triggerNodeAppendText}`;
1274
+ const triggerNodeFieldName = 'orgname';
1275
+ const triggerNodeFieldDisplayName = '公司名称(单行文本)';
1276
+ await mockCollections(
1277
+ appendJsonCollectionName(JSON.parse(JSON.stringify(generalWithNoRelationalFields)), triggerNodeAppendText)
1278
+ .collections,
1279
+ );
1280
+
1281
+ // 创建聚合节点数据表
1282
+ const aggregateNodeCollectionDisplayName = `自动>组织[普通表]${aggregateNodeAppendText}`;
1283
+ const aggregateNodeCollectionName = `tt_amt_org${aggregateNodeAppendText}`;
1284
+ const aggregateNodeFieldName = 'staffnum';
1285
+ const aggregateNodeFieldDisplayName = '员工人数(整数)';
1286
+ await mockCollections(
1287
+ appendJsonCollectionName(JSON.parse(JSON.stringify(generalWithNoRelationalFields)), aggregateNodeAppendText)
1288
+ .collections,
1289
+ );
1290
+ const aggregateNodeCollectionData = [
1291
+ { staffnum: 3, regcapital: 3.12 },
1292
+ { staffnum: 3, regcapital: 3.6 },
1293
+ { staffnum: 4, regcapital: 4.6 },
1294
+ { staffnum: 4, regcapital: 4.6 },
1295
+ { staffnum: 5, regcapital: 5.6 },
1296
+ ];
1297
+ const aggregateNodeCollectionRecords = await mockRecords(aggregateNodeCollectionName, aggregateNodeCollectionData);
1298
+
1299
+ //添加工作流
1300
+ const workFlowName = faker.string.alphanumeric(5) + triggerNodeAppendText;
1301
+ const workflowData = {
1302
+ current: true,
1303
+ options: { deleteExecutionOnStatus: [] },
1304
+ title: workFlowName,
1305
+ type: 'collection',
1306
+ enabled: true,
1307
+ };
1308
+ const workflow = await apiCreateWorkflow(workflowData);
1309
+ const workflowObj = JSON.parse(JSON.stringify(workflow));
1310
+ const workflowId = workflowObj.id;
1311
+ //配置工作流触发器
1312
+ const triggerNodeData = {
1313
+ config: { appends: [], collection: triggerNodeCollectionName, changed: [], condition: { $and: [] }, mode: 1 },
1314
+ };
1315
+ const triggerNode = await apiUpdateWorkflowTrigger(workflowId, triggerNodeData);
1316
+ const triggerNodeObj = JSON.parse(JSON.stringify(triggerNode));
1317
+ //配置聚合数据节点
1318
+ await page.goto(`admin/workflow/workflows/${workflowId}`);
1319
+ await page.waitForLoadState('networkidle');
1320
+ const collectionTriggerNode = new CollectionTriggerNode(page, workFlowName, triggerNodeCollectionName);
1321
+ await collectionTriggerNode.addNodeButton.click();
1322
+ await page.getByRole('button', { name: 'aggregate', exact: true }).click();
1323
+ const aggregateRecordNodeName = 'Aggregate' + dayjs().format('YYYYMMDDHHmmss.SSS').toString();
1324
+ await page.getByLabel('Aggregate-Aggregate', { exact: true }).getByRole('textbox').fill(aggregateRecordNodeName);
1325
+ const aggregateRecordNode = new AggregateNode(page, aggregateRecordNodeName);
1326
+ const aggregateRecordNodeId = await aggregateRecordNode.node.locator('.workflow-node-id').innerText();
1327
+ await aggregateRecordNode.nodeConfigure.click();
1328
+ await aggregateRecordNode.avgRadio.click();
1329
+ await aggregateRecordNode.collectionDropDown.click();
1330
+ await page.getByText(aggregateNodeCollectionDisplayName).click();
1331
+ await aggregateRecordNode.aggregatedFieldDropDown.click();
1332
+ await page.getByRole('option', { name: aggregateNodeFieldDisplayName }).click();
1333
+ // 过滤条件
1334
+ await page.getByText('Add condition', { exact: true }).click();
1335
+ await page.getByLabel('block-item-Filter-workflows-Filter').getByRole('button', { name: 'Select field' }).click();
1336
+ await page.getByRole('menuitemcheckbox', { name: '员工人数(整数)' }).click();
1337
+ await page.getByRole('button', { name: '=' }).click();
1338
+ await page.getByRole('option', { name: '>' }).click();
1339
+ await page.getByLabel('block-item-Filter-workflows-Filter').getByRole('spinbutton').fill('3');
1340
+ await aggregateRecordNode.submitButton.click();
316
1341
 
317
- test('Collection event add data trigger, aggregated data table, no filtering, normal table integer fields not de-emphasised MIN', async ({
318
- page,
319
- mockCollections,
320
- mockRecords,
321
- }) => {
322
- //数据表后缀标识
323
- const triggerNodeAppendText = 'a' + faker.string.alphanumeric(4);
324
- const aggregateNodeAppendText = 'b' + faker.string.alphanumeric(4);
325
- //创建触发器节点数据表
326
- const triggerNodeCollectionDisplayName = `自动>组织[普通表]${triggerNodeAppendText}`;
327
- const triggerNodeCollectionName = `tt_amt_org${triggerNodeAppendText}`;
328
- const triggerNodeFieldName = 'orgname';
329
- const triggerNodeFieldDisplayName = '公司名称(单行文本)';
330
- await mockCollections(
331
- appendJsonCollectionName(JSON.parse(JSON.stringify(generalWithNoRelationalFields)), triggerNodeAppendText)
332
- .collections,
333
- );
334
-
335
- // 创建聚合节点数据表
336
- const aggregateNodeCollectionDisplayName = `自动>组织[普通表]${aggregateNodeAppendText}`;
337
- const aggregateNodeCollectionName = `tt_amt_org${aggregateNodeAppendText}`;
338
- const aggregateNodeFieldName = 'staffnum';
339
- const aggregateNodeFieldDisplayName = '员工人数(整数)';
340
- await mockCollections(
341
- appendJsonCollectionName(JSON.parse(JSON.stringify(generalWithNoRelationalFields)), aggregateNodeAppendText)
342
- .collections,
343
- );
344
- const aggregateNodeCollectionData = [
345
- { staffnum: 3, regcapital: 3.12 },
346
- { staffnum: 3, regcapital: 3.6 },
347
- { staffnum: 4, regcapital: 4.6 },
348
- { staffnum: 4, regcapital: 4.6 },
349
- { staffnum: 5, regcapital: 5.6 },
350
- ];
351
- const aggregateNodeCollectionRecords = await mockRecords(aggregateNodeCollectionName, aggregateNodeCollectionData);
352
-
353
- //添加工作流
354
- const workFlowName = faker.string.alphanumeric(5) + triggerNodeAppendText;
355
- const workflowData = {
356
- current: true,
357
- options: { deleteExecutionOnStatus: [] },
358
- title: workFlowName,
359
- type: 'collection',
360
- enabled: true,
361
- };
362
- const workflow = await apiCreateWorkflow(workflowData);
363
- const workflowObj = JSON.parse(JSON.stringify(workflow));
364
- const workflowId = workflowObj.id;
365
- //配置工作流触发器
366
- const triggerNodeData = {
367
- config: { appends: [], collection: triggerNodeCollectionName, changed: [], condition: { $and: [] }, mode: 1 },
368
- };
369
- const triggerNode = await apiUpdateWorkflowTrigger(workflowId, triggerNodeData);
370
- const triggerNodeObj = JSON.parse(JSON.stringify(triggerNode));
371
-
372
- //配置聚合数据节点
373
- await page.goto(`admin/workflow/workflows/${workflowId}`);
374
- await page.waitForLoadState('networkidle');
375
- const collectionTriggerNode = new CollectionTriggerNode(page, workFlowName, triggerNodeCollectionName);
376
- await collectionTriggerNode.addNodeButton.click();
377
- await page.getByRole('button', { name: 'aggregate', exact: true }).click();
378
- const aggregateRecordNodeName = 'Aggregate' + dayjs().format('YYYYMMDDHHmmss.SSS').toString();
379
- await page.getByLabel('Aggregate-Aggregate', { exact: true }).getByRole('textbox').fill(aggregateRecordNodeName);
380
- const aggregateRecordNode = new AggregateNode(page, aggregateRecordNodeName);
381
- const aggregateRecordNodeId = await aggregateRecordNode.node.locator('.workflow-node-id').innerText();
382
- await aggregateRecordNode.nodeConfigure.click();
383
- await aggregateRecordNode.minRadio.click();
384
- await aggregateRecordNode.collectionDropDown.click();
385
- await page.getByText(aggregateNodeCollectionDisplayName).click();
386
- await aggregateRecordNode.aggregatedFieldDropDown.click();
387
- await page.getByRole('option', { name: aggregateNodeFieldDisplayName }).click();
388
- await aggregateRecordNode.submitButton.click();
389
-
390
- // 2、测试步骤:添加数据触发工作流
391
- const triggerNodeCollectionRecordOne = triggerNodeFieldDisplayName + dayjs().format('YYYYMMDDHHmmss.SSS').toString();
392
- const triggerNodeCollectionRecords = await mockRecords(triggerNodeCollectionName, [
393
- { orgname: triggerNodeCollectionRecordOne },
394
- ]);
395
- await page.waitForTimeout(1000);
396
-
397
- // 3、预期结果:工作流成功触发,数据查询成功
398
- const getWorkflow = await apiGetWorkflow(workflowId);
399
- const getWorkflowObj = JSON.parse(JSON.stringify(getWorkflow));
400
- const getWorkflowExecuted = getWorkflowObj.executed;
401
- expect(getWorkflowExecuted).toBe(1);
402
- const getWorkflowNodeExecutions = await apiGetWorkflowNodeExecutions(workflowId);
403
- const getWorkflowNodeExecutionsObj = JSON.parse(JSON.stringify(getWorkflowNodeExecutions));
404
- getWorkflowNodeExecutionsObj.sort(function (a: { id: number }, b: { id: number }) {
405
- return b.id - a.id;
1342
+ // 2、测试步骤:添加数据触发工作流
1343
+ const triggerNodeCollectionRecordOne =
1344
+ triggerNodeFieldDisplayName + dayjs().format('YYYYMMDDHHmmss.SSS').toString();
1345
+ const triggerNodeCollectionRecords = await mockRecords(triggerNodeCollectionName, [
1346
+ { orgname: triggerNodeCollectionRecordOne },
1347
+ ]);
1348
+ await page.waitForTimeout(1000);
1349
+
1350
+ // 3、预期结果:工作流成功触发,数据查询成功
1351
+ const getWorkflow = await apiGetWorkflow(workflowId);
1352
+ const getWorkflowObj = JSON.parse(JSON.stringify(getWorkflow));
1353
+ const getWorkflowExecuted = getWorkflowObj.executed;
1354
+ expect(getWorkflowExecuted).toBe(1);
1355
+ const getWorkflowNodeExecutions = await apiGetWorkflowNodeExecutions(workflowId);
1356
+ const getWorkflowNodeExecutionsObj = JSON.parse(JSON.stringify(getWorkflowNodeExecutions));
1357
+ getWorkflowNodeExecutionsObj.sort(function (a: { id: number }, b: { id: number }) {
1358
+ return b.id - a.id;
1359
+ });
1360
+ const jobs = getWorkflowNodeExecutionsObj[0].jobs;
1361
+ const aggregateNodeJob = jobs.find((job) => job.nodeId.toString() === aggregateRecordNodeId);
1362
+ const aggregateNodeJobResult = aggregateNodeJob.result;
1363
+ // aggregateNodeCollectionData中staffnum字段值大于3的元素个数
1364
+ const aggregateNodeCollectionDataCount = aggregateNodeCollectionData.reduce((total, currentValue) => {
1365
+ return currentValue.staffnum > 3 ? total + 1 : total;
1366
+ }, 0);
1367
+ // aggregateNodeCollectionData中staffnum字段值大于3的平均值
1368
+ const aggregateNodeCollectionDataAvg =
1369
+ aggregateNodeCollectionData.reduce((total, currentValue) => {
1370
+ return currentValue.staffnum > 3 ? total + currentValue.staffnum : total;
1371
+ }, 0) / aggregateNodeCollectionDataCount;
1372
+ expect(aggregateNodeJobResult).toBe(aggregateNodeCollectionDataAvg);
1373
+ // 4、后置处理:删除工作流
1374
+ await apiDeleteWorkflow(workflowId);
406
1375
  });
407
- const jobs = getWorkflowNodeExecutionsObj[0].jobs;
408
- const queryRecordNodeJob = jobs.find((job) => job.nodeId.toString() === aggregateRecordNodeId);
409
- const queryRecordNodeJobResult = queryRecordNodeJob.result;
410
- // aggregateNodeCollectionData中staffnum字段值最小值
411
- const aggregateNodeCollectionDataMin = aggregateNodeCollectionData.reduce((min, currentValue) => {
412
- return currentValue.staffnum < min ? currentValue.staffnum : min;
413
- }, aggregateNodeCollectionData[0].staffnum);
414
- expect(queryRecordNodeJobResult).toBe(aggregateNodeCollectionDataMin);
415
- // 4、后置处理:删除工作流
416
- await apiDeleteWorkflow(workflowId);
417
- });
418
1376
 
419
- test('Collection event add data trigger, aggregated data table, no filtering, normal table integer fields not de-emphasised MAX', async ({
420
- page,
421
- mockCollections,
422
- mockRecords,
423
- }) => {
424
- //数据表后缀标识
425
- const triggerNodeAppendText = 'a' + faker.string.alphanumeric(4);
426
- const aggregateNodeAppendText = 'b' + faker.string.alphanumeric(4);
427
- //创建触发器节点数据表
428
- const triggerNodeCollectionDisplayName = `自动>组织[普通表]${triggerNodeAppendText}`;
429
- const triggerNodeCollectionName = `tt_amt_org${triggerNodeAppendText}`;
430
- const triggerNodeFieldName = 'orgname';
431
- const triggerNodeFieldDisplayName = '公司名称(单行文本)';
432
- await mockCollections(
433
- appendJsonCollectionName(JSON.parse(JSON.stringify(generalWithNoRelationalFields)), triggerNodeAppendText)
434
- .collections,
435
- );
436
-
437
- // 创建聚合节点数据表
438
- const aggregateNodeCollectionDisplayName = `自动>组织[普通表]${aggregateNodeAppendText}`;
439
- const aggregateNodeCollectionName = `tt_amt_org${aggregateNodeAppendText}`;
440
- const aggregateNodeFieldName = 'staffnum';
441
- const aggregateNodeFieldDisplayName = '员工人数(整数)';
442
- await mockCollections(
443
- appendJsonCollectionName(JSON.parse(JSON.stringify(generalWithNoRelationalFields)), aggregateNodeAppendText)
444
- .collections,
445
- );
446
- const aggregateNodeCollectionData = [
447
- { staffnum: 3, regcapital: 3.12 },
448
- { staffnum: 3, regcapital: 3.6 },
449
- { staffnum: 4, regcapital: 4.6 },
450
- { staffnum: 4, regcapital: 4.6 },
451
- { staffnum: 5, regcapital: 5.6 },
452
- ];
453
- const aggregateNodeCollectionRecords = await mockRecords(aggregateNodeCollectionName, aggregateNodeCollectionData);
454
-
455
- //添加工作流
456
- const workFlowName = faker.string.alphanumeric(5) + triggerNodeAppendText;
457
- const workflowData = {
458
- current: true,
459
- options: { deleteExecutionOnStatus: [] },
460
- title: workFlowName,
461
- type: 'collection',
462
- enabled: true,
463
- };
464
- const workflow = await apiCreateWorkflow(workflowData);
465
- const workflowObj = JSON.parse(JSON.stringify(workflow));
466
- const workflowId = workflowObj.id;
467
- //配置工作流触发器
468
- const triggerNodeData = {
469
- config: { appends: [], collection: triggerNodeCollectionName, changed: [], condition: { $and: [] }, mode: 1 },
470
- };
471
- const triggerNode = await apiUpdateWorkflowTrigger(workflowId, triggerNodeData);
472
- const triggerNodeObj = JSON.parse(JSON.stringify(triggerNode));
473
-
474
- //配置聚合数据节点
475
- await page.goto(`admin/workflow/workflows/${workflowId}`);
476
- await page.waitForLoadState('networkidle');
477
- const collectionTriggerNode = new CollectionTriggerNode(page, workFlowName, triggerNodeCollectionName);
478
- await collectionTriggerNode.addNodeButton.click();
479
- await page.getByRole('button', { name: 'aggregate', exact: true }).click();
480
- const aggregateRecordNodeName = 'Aggregate' + dayjs().format('YYYYMMDDHHmmss.SSS').toString();
481
- await page.getByLabel('Aggregate-Aggregate', { exact: true }).getByRole('textbox').fill(aggregateRecordNodeName);
482
- const aggregateRecordNode = new AggregateNode(page, aggregateRecordNodeName);
483
- const aggregateRecordNodeId = await aggregateRecordNode.node.locator('.workflow-node-id').innerText();
484
- await aggregateRecordNode.nodeConfigure.click();
485
- await aggregateRecordNode.maxRadio.click();
486
- await aggregateRecordNode.collectionDropDown.click();
487
- await page.getByText(aggregateNodeCollectionDisplayName).click();
488
- await aggregateRecordNode.aggregatedFieldDropDown.click();
489
- await page.getByRole('option', { name: aggregateNodeFieldDisplayName }).click();
490
- await aggregateRecordNode.submitButton.click();
491
-
492
- // 2、测试步骤:添加数据触发工作流
493
- const triggerNodeCollectionRecordOne = triggerNodeFieldDisplayName + dayjs().format('YYYYMMDDHHmmss.SSS').toString();
494
- const triggerNodeCollectionRecords = await mockRecords(triggerNodeCollectionName, [
495
- { orgname: triggerNodeCollectionRecordOne },
496
- ]);
497
- await page.waitForTimeout(1000);
498
-
499
- // 3、预期结果:工作流成功触发,数据查询成功
500
- const getWorkflow = await apiGetWorkflow(workflowId);
501
- const getWorkflowObj = JSON.parse(JSON.stringify(getWorkflow));
502
- const getWorkflowExecuted = getWorkflowObj.executed;
503
- expect(getWorkflowExecuted).toBe(1);
504
- const getWorkflowNodeExecutions = await apiGetWorkflowNodeExecutions(workflowId);
505
- const getWorkflowNodeExecutionsObj = JSON.parse(JSON.stringify(getWorkflowNodeExecutions));
506
- getWorkflowNodeExecutionsObj.sort(function (a: { id: number }, b: { id: number }) {
507
- return b.id - a.id;
1377
+ test('Collection event add data trigger, normal table integer fields not de-emphasised MIN', async ({
1378
+ page,
1379
+ mockCollections,
1380
+ mockRecords,
1381
+ }) => {
1382
+ //数据表后缀标识
1383
+ const triggerNodeAppendText = 'a' + faker.string.alphanumeric(4);
1384
+ const aggregateNodeAppendText = 'b' + faker.string.alphanumeric(4);
1385
+ //创建触发器节点数据表
1386
+ const triggerNodeCollectionDisplayName = `自动>组织[普通表]${triggerNodeAppendText}`;
1387
+ const triggerNodeCollectionName = `tt_amt_org${triggerNodeAppendText}`;
1388
+ const triggerNodeFieldName = 'orgname';
1389
+ const triggerNodeFieldDisplayName = '公司名称(单行文本)';
1390
+ await mockCollections(
1391
+ appendJsonCollectionName(JSON.parse(JSON.stringify(generalWithNoRelationalFields)), triggerNodeAppendText)
1392
+ .collections,
1393
+ );
1394
+
1395
+ // 创建聚合节点数据表
1396
+ const aggregateNodeCollectionDisplayName = `自动>组织[普通表]${aggregateNodeAppendText}`;
1397
+ const aggregateNodeCollectionName = `tt_amt_org${aggregateNodeAppendText}`;
1398
+ const aggregateNodeFieldName = 'staffnum';
1399
+ const aggregateNodeFieldDisplayName = '员工人数(整数)';
1400
+ await mockCollections(
1401
+ appendJsonCollectionName(JSON.parse(JSON.stringify(generalWithNoRelationalFields)), aggregateNodeAppendText)
1402
+ .collections,
1403
+ );
1404
+ const aggregateNodeCollectionData = [
1405
+ { staffnum: 3, regcapital: 3.12 },
1406
+ { staffnum: 3, regcapital: 3.6 },
1407
+ { staffnum: 4, regcapital: 4.6 },
1408
+ { staffnum: 4, regcapital: 4.6 },
1409
+ { staffnum: 5, regcapital: 5.6 },
1410
+ ];
1411
+ const aggregateNodeCollectionRecords = await mockRecords(aggregateNodeCollectionName, aggregateNodeCollectionData);
1412
+
1413
+ //添加工作流
1414
+ const workFlowName = faker.string.alphanumeric(5) + triggerNodeAppendText;
1415
+ const workflowData = {
1416
+ current: true,
1417
+ options: { deleteExecutionOnStatus: [] },
1418
+ title: workFlowName,
1419
+ type: 'collection',
1420
+ enabled: true,
1421
+ };
1422
+ const workflow = await apiCreateWorkflow(workflowData);
1423
+ const workflowObj = JSON.parse(JSON.stringify(workflow));
1424
+ const workflowId = workflowObj.id;
1425
+ //配置工作流触发器
1426
+ const triggerNodeData = {
1427
+ config: { appends: [], collection: triggerNodeCollectionName, changed: [], condition: { $and: [] }, mode: 1 },
1428
+ };
1429
+ const triggerNode = await apiUpdateWorkflowTrigger(workflowId, triggerNodeData);
1430
+ const triggerNodeObj = JSON.parse(JSON.stringify(triggerNode));
1431
+
1432
+ //配置聚合数据节点
1433
+ await page.goto(`admin/workflow/workflows/${workflowId}`);
1434
+ await page.waitForLoadState('networkidle');
1435
+ const collectionTriggerNode = new CollectionTriggerNode(page, workFlowName, triggerNodeCollectionName);
1436
+ await collectionTriggerNode.addNodeButton.click();
1437
+ await page.getByRole('button', { name: 'aggregate', exact: true }).click();
1438
+ const aggregateRecordNodeName = 'Aggregate' + dayjs().format('YYYYMMDDHHmmss.SSS').toString();
1439
+ await page.getByLabel('Aggregate-Aggregate', { exact: true }).getByRole('textbox').fill(aggregateRecordNodeName);
1440
+ const aggregateRecordNode = new AggregateNode(page, aggregateRecordNodeName);
1441
+ const aggregateRecordNodeId = await aggregateRecordNode.node.locator('.workflow-node-id').innerText();
1442
+ await aggregateRecordNode.nodeConfigure.click();
1443
+ await aggregateRecordNode.minRadio.click();
1444
+ await aggregateRecordNode.collectionDropDown.click();
1445
+ await page.getByText(aggregateNodeCollectionDisplayName).click();
1446
+ await aggregateRecordNode.aggregatedFieldDropDown.click();
1447
+ await page.getByRole('option', { name: aggregateNodeFieldDisplayName }).click();
1448
+ // 过滤条件
1449
+ await page.getByText('Add condition', { exact: true }).click();
1450
+ await page.getByLabel('block-item-Filter-workflows-Filter').getByRole('button', { name: 'Select field' }).click();
1451
+ await page.getByRole('menuitemcheckbox', { name: '员工人数(整数)' }).click();
1452
+ await page.getByRole('button', { name: '=' }).click();
1453
+ await page.getByRole('option', { name: '>' }).click();
1454
+ await page.getByLabel('block-item-Filter-workflows-Filter').getByRole('spinbutton').fill('3');
1455
+ await aggregateRecordNode.submitButton.click();
1456
+
1457
+ // 2、测试步骤:添加数据触发工作流
1458
+ const triggerNodeCollectionRecordOne =
1459
+ triggerNodeFieldDisplayName + dayjs().format('YYYYMMDDHHmmss.SSS').toString();
1460
+ const triggerNodeCollectionRecords = await mockRecords(triggerNodeCollectionName, [
1461
+ { orgname: triggerNodeCollectionRecordOne },
1462
+ ]);
1463
+ await page.waitForTimeout(1000);
1464
+
1465
+ // 3、预期结果:工作流成功触发,数据查询成功
1466
+ const getWorkflow = await apiGetWorkflow(workflowId);
1467
+ const getWorkflowObj = JSON.parse(JSON.stringify(getWorkflow));
1468
+ const getWorkflowExecuted = getWorkflowObj.executed;
1469
+ expect(getWorkflowExecuted).toBe(1);
1470
+ const getWorkflowNodeExecutions = await apiGetWorkflowNodeExecutions(workflowId);
1471
+ const getWorkflowNodeExecutionsObj = JSON.parse(JSON.stringify(getWorkflowNodeExecutions));
1472
+ getWorkflowNodeExecutionsObj.sort(function (a: { id: number }, b: { id: number }) {
1473
+ return b.id - a.id;
1474
+ });
1475
+ const jobs = getWorkflowNodeExecutionsObj[0].jobs;
1476
+ const aggregateNodeJob = jobs.find((job) => job.nodeId.toString() === aggregateRecordNodeId);
1477
+ const aggregateNodeJobResult = aggregateNodeJob.result;
1478
+ const aggregateNodeCollectionDataFilter = aggregateNodeCollectionData.filter((item) => item.staffnum > 3);
1479
+ // aggregateNodeCollectionDataFilter中staffnum字段值的最小值
1480
+ const aggregateNodeCollectionDataMin = aggregateNodeCollectionDataFilter.reduce((min, currentValue) => {
1481
+ return currentValue.staffnum < min ? currentValue.staffnum : min;
1482
+ }, aggregateNodeCollectionDataFilter[0].staffnum);
1483
+ expect(aggregateNodeJobResult).toBe(aggregateNodeCollectionDataMin);
1484
+ // 4、后置处理:删除工作流
1485
+ await apiDeleteWorkflow(workflowId);
1486
+ });
1487
+
1488
+ test('Collection event add data trigger, normal table integer fields not de-emphasised MAX', async ({
1489
+ page,
1490
+ mockCollections,
1491
+ mockRecords,
1492
+ }) => {
1493
+ //数据表后缀标识
1494
+ const triggerNodeAppendText = 'a' + faker.string.alphanumeric(4);
1495
+ const aggregateNodeAppendText = 'b' + faker.string.alphanumeric(4);
1496
+ //创建触发器节点数据表
1497
+ const triggerNodeCollectionDisplayName = `自动>组织[普通表]${triggerNodeAppendText}`;
1498
+ const triggerNodeCollectionName = `tt_amt_org${triggerNodeAppendText}`;
1499
+ const triggerNodeFieldName = 'orgname';
1500
+ const triggerNodeFieldDisplayName = '公司名称(单行文本)';
1501
+ await mockCollections(
1502
+ appendJsonCollectionName(JSON.parse(JSON.stringify(generalWithNoRelationalFields)), triggerNodeAppendText)
1503
+ .collections,
1504
+ );
1505
+
1506
+ // 创建聚合节点数据表
1507
+ const aggregateNodeCollectionDisplayName = `自动>组织[普通表]${aggregateNodeAppendText}`;
1508
+ const aggregateNodeCollectionName = `tt_amt_org${aggregateNodeAppendText}`;
1509
+ const aggregateNodeFieldName = 'staffnum';
1510
+ const aggregateNodeFieldDisplayName = '员工人数(整数)';
1511
+ await mockCollections(
1512
+ appendJsonCollectionName(JSON.parse(JSON.stringify(generalWithNoRelationalFields)), aggregateNodeAppendText)
1513
+ .collections,
1514
+ );
1515
+ const aggregateNodeCollectionData = [
1516
+ { staffnum: 3, regcapital: 3.12 },
1517
+ { staffnum: 3, regcapital: 3.6 },
1518
+ { staffnum: 4, regcapital: 4.6 },
1519
+ { staffnum: 4, regcapital: 4.6 },
1520
+ { staffnum: 5, regcapital: 5.6 },
1521
+ ];
1522
+ const aggregateNodeCollectionRecords = await mockRecords(aggregateNodeCollectionName, aggregateNodeCollectionData);
1523
+
1524
+ //添加工作流
1525
+ const workFlowName = faker.string.alphanumeric(5) + triggerNodeAppendText;
1526
+ const workflowData = {
1527
+ current: true,
1528
+ options: { deleteExecutionOnStatus: [] },
1529
+ title: workFlowName,
1530
+ type: 'collection',
1531
+ enabled: true,
1532
+ };
1533
+ const workflow = await apiCreateWorkflow(workflowData);
1534
+ const workflowObj = JSON.parse(JSON.stringify(workflow));
1535
+ const workflowId = workflowObj.id;
1536
+ //配置工作流触发器
1537
+ const triggerNodeData = {
1538
+ config: { appends: [], collection: triggerNodeCollectionName, changed: [], condition: { $and: [] }, mode: 1 },
1539
+ };
1540
+ const triggerNode = await apiUpdateWorkflowTrigger(workflowId, triggerNodeData);
1541
+ const triggerNodeObj = JSON.parse(JSON.stringify(triggerNode));
1542
+
1543
+ //配置聚合数据节点
1544
+ await page.goto(`admin/workflow/workflows/${workflowId}`);
1545
+ await page.waitForLoadState('networkidle');
1546
+ const collectionTriggerNode = new CollectionTriggerNode(page, workFlowName, triggerNodeCollectionName);
1547
+ await collectionTriggerNode.addNodeButton.click();
1548
+ await page.getByRole('button', { name: 'aggregate', exact: true }).click();
1549
+ const aggregateRecordNodeName = 'Aggregate' + dayjs().format('YYYYMMDDHHmmss.SSS').toString();
1550
+ await page.getByLabel('Aggregate-Aggregate', { exact: true }).getByRole('textbox').fill(aggregateRecordNodeName);
1551
+ const aggregateRecordNode = new AggregateNode(page, aggregateRecordNodeName);
1552
+ const aggregateRecordNodeId = await aggregateRecordNode.node.locator('.workflow-node-id').innerText();
1553
+ await aggregateRecordNode.nodeConfigure.click();
1554
+ await aggregateRecordNode.maxRadio.click();
1555
+ await aggregateRecordNode.collectionDropDown.click();
1556
+ await page.getByText(aggregateNodeCollectionDisplayName).click();
1557
+ await aggregateRecordNode.aggregatedFieldDropDown.click();
1558
+ await page.getByRole('option', { name: aggregateNodeFieldDisplayName }).click();
1559
+ // 过滤条件
1560
+ await page.getByText('Add condition', { exact: true }).click();
1561
+ await page.getByLabel('block-item-Filter-workflows-Filter').getByRole('button', { name: 'Select field' }).click();
1562
+ await page.getByRole('menuitemcheckbox', { name: '员工人数(整数)' }).click();
1563
+ await page.getByRole('button', { name: '=' }).click();
1564
+ await page.getByRole('option', { name: '>' }).click();
1565
+ await page.getByLabel('block-item-Filter-workflows-Filter').getByRole('spinbutton').fill('3');
1566
+ await aggregateRecordNode.submitButton.click();
1567
+
1568
+ // 2、测试步骤:添加数据触发工作流
1569
+ const triggerNodeCollectionRecordOne =
1570
+ triggerNodeFieldDisplayName + dayjs().format('YYYYMMDDHHmmss.SSS').toString();
1571
+ const triggerNodeCollectionRecords = await mockRecords(triggerNodeCollectionName, [
1572
+ { orgname: triggerNodeCollectionRecordOne },
1573
+ ]);
1574
+ await page.waitForTimeout(1000);
1575
+
1576
+ // 3、预期结果:工作流成功触发,数据查询成功
1577
+ const getWorkflow = await apiGetWorkflow(workflowId);
1578
+ const getWorkflowObj = JSON.parse(JSON.stringify(getWorkflow));
1579
+ const getWorkflowExecuted = getWorkflowObj.executed;
1580
+ expect(getWorkflowExecuted).toBe(1);
1581
+ const getWorkflowNodeExecutions = await apiGetWorkflowNodeExecutions(workflowId);
1582
+ const getWorkflowNodeExecutionsObj = JSON.parse(JSON.stringify(getWorkflowNodeExecutions));
1583
+ getWorkflowNodeExecutionsObj.sort(function (a: { id: number }, b: { id: number }) {
1584
+ return b.id - a.id;
1585
+ });
1586
+ const jobs = getWorkflowNodeExecutionsObj[0].jobs;
1587
+ const aggregateNodeJob = jobs.find((job) => job.nodeId.toString() === aggregateRecordNodeId);
1588
+ const aggregateNodeJobResult = aggregateNodeJob.result;
1589
+ const aggregateNodeCollectionDataFilter = aggregateNodeCollectionData.filter((item) => item.staffnum > 3);
1590
+ // aggregateNodeCollectionDataFilter中staffnum最大值
1591
+ const aggregateNodeCollectionDataMax = aggregateNodeCollectionDataFilter.reduce((max, currentValue) => {
1592
+ return currentValue.staffnum > max ? currentValue.staffnum : max;
1593
+ }, aggregateNodeCollectionDataFilter[0].staffnum);
1594
+ expect(aggregateNodeJobResult).toBe(aggregateNodeCollectionDataMax);
1595
+ // 4、后置处理:删除工作流
1596
+ await apiDeleteWorkflow(workflowId);
1597
+ });
1598
+
1599
+ test('Collection event add data trigger, normal table integer fields de-weighting COUNT', async ({
1600
+ page,
1601
+ mockCollections,
1602
+ mockRecords,
1603
+ }) => {
1604
+ //数据表后缀标识
1605
+ const triggerNodeAppendText = 'a' + faker.string.alphanumeric(4);
1606
+ const aggregateNodeAppendText = 'b' + faker.string.alphanumeric(4);
1607
+ //创建触发器节点数据表
1608
+ const triggerNodeCollectionDisplayName = `自动>组织[普通表]${triggerNodeAppendText}`;
1609
+ const triggerNodeCollectionName = `tt_amt_org${triggerNodeAppendText}`;
1610
+ const triggerNodeFieldName = 'orgname';
1611
+ const triggerNodeFieldDisplayName = '公司名称(单行文本)';
1612
+ await mockCollections(
1613
+ appendJsonCollectionName(JSON.parse(JSON.stringify(generalWithNoRelationalFields)), triggerNodeAppendText)
1614
+ .collections,
1615
+ );
1616
+
1617
+ // 创建聚合节点数据表
1618
+ const aggregateNodeCollectionDisplayName = `自动>组织[普通表]${aggregateNodeAppendText}`;
1619
+ const aggregateNodeCollectionName = `tt_amt_org${aggregateNodeAppendText}`;
1620
+ const aggregateNodeFieldName = 'staffnum';
1621
+ const aggregateNodeFieldDisplayName = '员工人数(整数)';
1622
+ await mockCollections(
1623
+ appendJsonCollectionName(JSON.parse(JSON.stringify(generalWithNoRelationalFields)), aggregateNodeAppendText)
1624
+ .collections,
1625
+ );
1626
+ const aggregateNodeCollectionData = [
1627
+ { staffnum: 3, regcapital: 3.12 },
1628
+ { staffnum: 3, regcapital: 3.6 },
1629
+ { staffnum: 4, regcapital: 4.6 },
1630
+ { staffnum: 4, regcapital: 4.6 },
1631
+ { staffnum: 5, regcapital: 5.6 },
1632
+ ];
1633
+ const aggregateNodeCollectionRecords = await mockRecords(aggregateNodeCollectionName, aggregateNodeCollectionData);
1634
+
1635
+ //添加工作流
1636
+ const workFlowName = faker.string.alphanumeric(5) + triggerNodeAppendText;
1637
+ const workflowData = {
1638
+ current: true,
1639
+ options: { deleteExecutionOnStatus: [] },
1640
+ title: workFlowName,
1641
+ type: 'collection',
1642
+ enabled: true,
1643
+ };
1644
+ const workflow = await apiCreateWorkflow(workflowData);
1645
+ const workflowObj = JSON.parse(JSON.stringify(workflow));
1646
+ const workflowId = workflowObj.id;
1647
+ //配置工作流触发器
1648
+ const triggerNodeData = {
1649
+ config: { appends: [], collection: triggerNodeCollectionName, changed: [], condition: { $and: [] }, mode: 1 },
1650
+ };
1651
+ const triggerNode = await apiUpdateWorkflowTrigger(workflowId, triggerNodeData);
1652
+ const triggerNodeObj = JSON.parse(JSON.stringify(triggerNode));
1653
+
1654
+ //配置聚合数据节点
1655
+ await page.goto(`admin/workflow/workflows/${workflowId}`);
1656
+ await page.waitForLoadState('networkidle');
1657
+ const collectionTriggerNode = new CollectionTriggerNode(page, workFlowName, triggerNodeCollectionName);
1658
+ await collectionTriggerNode.addNodeButton.click();
1659
+ await page.getByRole('button', { name: 'aggregate', exact: true }).click();
1660
+ const aggregateRecordNodeName = 'Aggregate' + dayjs().format('YYYYMMDDHHmmss.SSS').toString();
1661
+ await page.getByLabel('Aggregate-Aggregate', { exact: true }).getByRole('textbox').fill(aggregateRecordNodeName);
1662
+ const aggregateRecordNode = new AggregateNode(page, aggregateRecordNodeName);
1663
+ const aggregateRecordNodeId = await aggregateRecordNode.node.locator('.workflow-node-id').innerText();
1664
+ await aggregateRecordNode.nodeConfigure.click();
1665
+ await aggregateRecordNode.collectionDropDown.click();
1666
+ await page.getByText(aggregateNodeCollectionDisplayName).click();
1667
+ await aggregateRecordNode.aggregatedFieldDropDown.click();
1668
+ await page.getByRole('option', { name: aggregateNodeFieldDisplayName }).click();
1669
+ await aggregateRecordNode.distinctCheckBox.click();
1670
+ // 过滤条件
1671
+ await page.getByText('Add condition', { exact: true }).click();
1672
+ await page.getByLabel('block-item-Filter-workflows-Filter').getByRole('button', { name: 'Select field' }).click();
1673
+ await page.getByRole('menuitemcheckbox', { name: '员工人数(整数)' }).click();
1674
+ await page.getByRole('button', { name: '=' }).click();
1675
+ await page.getByRole('option', { name: '>' }).click();
1676
+ await page.getByLabel('block-item-Filter-workflows-Filter').getByRole('spinbutton').fill('3');
1677
+ await aggregateRecordNode.submitButton.click();
1678
+
1679
+ // 2、测试步骤:添加数据触发工作流
1680
+ const triggerNodeCollectionRecordOne =
1681
+ triggerNodeFieldDisplayName + dayjs().format('YYYYMMDDHHmmss.SSS').toString();
1682
+ const triggerNodeCollectionRecords = await mockRecords(triggerNodeCollectionName, [
1683
+ { orgname: triggerNodeCollectionRecordOne },
1684
+ ]);
1685
+ await page.waitForTimeout(1000);
1686
+
1687
+ // 3、预期结果:工作流成功触发,数据查询成功
1688
+ const getWorkflow = await apiGetWorkflow(workflowId);
1689
+ const getWorkflowObj = JSON.parse(JSON.stringify(getWorkflow));
1690
+ const getWorkflowExecuted = getWorkflowObj.executed;
1691
+ expect(getWorkflowExecuted).toBe(1);
1692
+ const getWorkflowNodeExecutions = await apiGetWorkflowNodeExecutions(workflowId);
1693
+ const getWorkflowNodeExecutionsObj = JSON.parse(JSON.stringify(getWorkflowNodeExecutions));
1694
+ getWorkflowNodeExecutionsObj.sort(function (a: { id: number }, b: { id: number }) {
1695
+ return b.id - a.id;
1696
+ });
1697
+ const jobs = getWorkflowNodeExecutionsObj[0].jobs;
1698
+ const aggregateNodeJob = jobs.find((job) => job.nodeId.toString() === aggregateRecordNodeId);
1699
+ const aggregateNodeJobResult = aggregateNodeJob.result;
1700
+ expect(aggregateNodeJobResult).toBe(2);
1701
+ // 4、后置处理:删除工作流
1702
+ await apiDeleteWorkflow(workflowId);
1703
+ });
1704
+
1705
+ test.skip('Collection event add data trigger, normal table integer fields de-weighting SUM', async ({
1706
+ page,
1707
+ mockCollections,
1708
+ mockRecords,
1709
+ }) => {
1710
+ //数据表后缀标识
1711
+ const triggerNodeAppendText = 'a' + faker.string.alphanumeric(4);
1712
+ const aggregateNodeAppendText = 'b' + faker.string.alphanumeric(4);
1713
+ //创建触发器节点数据表
1714
+ const triggerNodeCollectionDisplayName = `自动>组织[普通表]${triggerNodeAppendText}`;
1715
+ const triggerNodeCollectionName = `tt_amt_org${triggerNodeAppendText}`;
1716
+ const triggerNodeFieldName = 'orgname';
1717
+ const triggerNodeFieldDisplayName = '公司名称(单行文本)';
1718
+ await mockCollections(
1719
+ appendJsonCollectionName(JSON.parse(JSON.stringify(generalWithNoRelationalFields)), triggerNodeAppendText)
1720
+ .collections,
1721
+ );
1722
+
1723
+ // 创建聚合节点数据表
1724
+ const aggregateNodeCollectionDisplayName = `自动>组织[普通表]${aggregateNodeAppendText}`;
1725
+ const aggregateNodeCollectionName = `tt_amt_org${aggregateNodeAppendText}`;
1726
+ const aggregateNodeFieldName = 'staffnum';
1727
+ const aggregateNodeFieldDisplayName = '员工人数(整数)';
1728
+ await mockCollections(
1729
+ appendJsonCollectionName(JSON.parse(JSON.stringify(generalWithNoRelationalFields)), aggregateNodeAppendText)
1730
+ .collections,
1731
+ );
1732
+ const aggregateNodeCollectionData = [
1733
+ { staffnum: 3, regcapital: 3.12 },
1734
+ { staffnum: 3, regcapital: 3.6 },
1735
+ { staffnum: 4, regcapital: 4.6 },
1736
+ { staffnum: 4, regcapital: 4.6 },
1737
+ { staffnum: 5, regcapital: 5.6 },
1738
+ ];
1739
+ const aggregateNodeCollectionRecords = await mockRecords(aggregateNodeCollectionName, aggregateNodeCollectionData);
1740
+
1741
+ //添加工作流
1742
+ const workFlowName = faker.string.alphanumeric(5) + triggerNodeAppendText;
1743
+ const workflowData = {
1744
+ current: true,
1745
+ options: { deleteExecutionOnStatus: [] },
1746
+ title: workFlowName,
1747
+ type: 'collection',
1748
+ enabled: true,
1749
+ };
1750
+ const workflow = await apiCreateWorkflow(workflowData);
1751
+ const workflowObj = JSON.parse(JSON.stringify(workflow));
1752
+ const workflowId = workflowObj.id;
1753
+ //配置工作流触发器
1754
+ const triggerNodeData = {
1755
+ config: { appends: [], collection: triggerNodeCollectionName, changed: [], condition: { $and: [] }, mode: 1 },
1756
+ };
1757
+ const triggerNode = await apiUpdateWorkflowTrigger(workflowId, triggerNodeData);
1758
+ const triggerNodeObj = JSON.parse(JSON.stringify(triggerNode));
1759
+
1760
+ //配置聚合数据节点
1761
+ await page.goto(`admin/workflow/workflows/${workflowId}`);
1762
+ await page.waitForLoadState('networkidle');
1763
+ const collectionTriggerNode = new CollectionTriggerNode(page, workFlowName, triggerNodeCollectionName);
1764
+ await collectionTriggerNode.addNodeButton.click();
1765
+ await page.getByRole('button', { name: 'aggregate', exact: true }).click();
1766
+ const aggregateRecordNodeName = 'Aggregate' + dayjs().format('YYYYMMDDHHmmss.SSS').toString();
1767
+ await page.getByLabel('Aggregate-Aggregate', { exact: true }).getByRole('textbox').fill(aggregateRecordNodeName);
1768
+ const aggregateRecordNode = new AggregateNode(page, aggregateRecordNodeName);
1769
+ const aggregateRecordNodeId = await aggregateRecordNode.node.locator('.workflow-node-id').innerText();
1770
+ await aggregateRecordNode.nodeConfigure.click();
1771
+ await aggregateRecordNode.sumRadio.click();
1772
+ await aggregateRecordNode.collectionDropDown.click();
1773
+ await page.getByText(aggregateNodeCollectionDisplayName).click();
1774
+ await aggregateRecordNode.aggregatedFieldDropDown.click();
1775
+ await page.getByRole('option', { name: aggregateNodeFieldDisplayName }).click();
1776
+ await aggregateRecordNode.distinctCheckBox.click();
1777
+ // 过滤条件
1778
+ await page.getByText('Add condition', { exact: true }).click();
1779
+ await page.getByLabel('block-item-Filter-workflows-Filter').getByRole('button', { name: 'Select field' }).click();
1780
+ await page.getByRole('menuitemcheckbox', { name: '员工人数(整数)' }).click();
1781
+ await page.getByRole('button', { name: '=' }).click();
1782
+ await page.getByRole('option', { name: '>' }).click();
1783
+ await page.getByLabel('block-item-Filter-workflows-Filter').getByRole('spinbutton').fill('3');
1784
+ await aggregateRecordNode.submitButton.click();
1785
+
1786
+ // 2、测试步骤:添加数据触发工作流
1787
+ const triggerNodeCollectionRecordOne =
1788
+ triggerNodeFieldDisplayName + dayjs().format('YYYYMMDDHHmmss.SSS').toString();
1789
+ const triggerNodeCollectionRecords = await mockRecords(triggerNodeCollectionName, [
1790
+ { orgname: triggerNodeCollectionRecordOne },
1791
+ ]);
1792
+ await page.waitForTimeout(1000);
1793
+
1794
+ // 3、预期结果:工作流成功触发,数据查询成功
1795
+ const getWorkflow = await apiGetWorkflow(workflowId);
1796
+ const getWorkflowObj = JSON.parse(JSON.stringify(getWorkflow));
1797
+ const getWorkflowExecuted = getWorkflowObj.executed;
1798
+ expect(getWorkflowExecuted).toBe(1);
1799
+ const getWorkflowNodeExecutions = await apiGetWorkflowNodeExecutions(workflowId);
1800
+ const getWorkflowNodeExecutionsObj = JSON.parse(JSON.stringify(getWorkflowNodeExecutions));
1801
+ getWorkflowNodeExecutionsObj.sort(function (a: { id: number }, b: { id: number }) {
1802
+ return b.id - a.id;
1803
+ });
1804
+ const jobs = getWorkflowNodeExecutionsObj[0].jobs;
1805
+ const aggregateNodeJob = jobs.find((job) => job.nodeId.toString() === aggregateRecordNodeId);
1806
+ const aggregateNodeJobResult = aggregateNodeJob.result;
1807
+ const aggregateNodeCollectionDataFilter = aggregateNodeCollectionData.filter((item) => item.staffnum > 3);
1808
+ // aggregateNodeCollectionData中staffnum字段值去重
1809
+ const aggregateNodeCollectionDataDistinct = [
1810
+ ...new Set(aggregateNodeCollectionDataFilter.map((item) => item.staffnum)),
1811
+ ];
1812
+ // aggregateNodeCollectionDataDistinct中staffnum字段值大于3的总和
1813
+ const aggregateNodeCollectionDataDistinctSum = aggregateNodeCollectionDataDistinct.reduce((total, currentValue) => {
1814
+ return currentValue > 3 ? total + currentValue : total;
1815
+ }, 0);
1816
+ expect(aggregateNodeJobResult).toBe(aggregateNodeCollectionDataDistinctSum);
1817
+ // 4、后置处理:删除工作流
1818
+ await apiDeleteWorkflow(workflowId);
1819
+ });
1820
+
1821
+ test.skip('Collection event add data trigger, normal table integer fields de-weighting AVG', async ({
1822
+ page,
1823
+ mockCollections,
1824
+ mockRecords,
1825
+ }) => {
1826
+ //数据表后缀标识
1827
+ const triggerNodeAppendText = 'a' + faker.string.alphanumeric(4);
1828
+ const aggregateNodeAppendText = 'b' + faker.string.alphanumeric(4);
1829
+ //创建触发器节点数据表
1830
+ const triggerNodeCollectionDisplayName = `自动>组织[普通表]${triggerNodeAppendText}`;
1831
+ const triggerNodeCollectionName = `tt_amt_org${triggerNodeAppendText}`;
1832
+ const triggerNodeFieldName = 'orgname';
1833
+ const triggerNodeFieldDisplayName = '公司名称(单行文本)';
1834
+ await mockCollections(
1835
+ appendJsonCollectionName(JSON.parse(JSON.stringify(generalWithNoRelationalFields)), triggerNodeAppendText)
1836
+ .collections,
1837
+ );
1838
+
1839
+ // 创建聚合节点数据表
1840
+ const aggregateNodeCollectionDisplayName = `自动>组织[普通表]${aggregateNodeAppendText}`;
1841
+ const aggregateNodeCollectionName = `tt_amt_org${aggregateNodeAppendText}`;
1842
+ const aggregateNodeFieldName = 'staffnum';
1843
+ const aggregateNodeFieldDisplayName = '员工人数(整数)';
1844
+ await mockCollections(
1845
+ appendJsonCollectionName(JSON.parse(JSON.stringify(generalWithNoRelationalFields)), aggregateNodeAppendText)
1846
+ .collections,
1847
+ );
1848
+ const aggregateNodeCollectionData = [
1849
+ { staffnum: 3, regcapital: 3.12 },
1850
+ { staffnum: 3, regcapital: 3.6 },
1851
+ { staffnum: 4, regcapital: 4.6 },
1852
+ { staffnum: 4, regcapital: 4.6 },
1853
+ { staffnum: 5, regcapital: 5.6 },
1854
+ ];
1855
+ const aggregateNodeCollectionRecords = await mockRecords(aggregateNodeCollectionName, aggregateNodeCollectionData);
1856
+
1857
+ //添加工作流
1858
+ const workFlowName = faker.string.alphanumeric(5) + triggerNodeAppendText;
1859
+ const workflowData = {
1860
+ current: true,
1861
+ options: { deleteExecutionOnStatus: [] },
1862
+ title: workFlowName,
1863
+ type: 'collection',
1864
+ enabled: true,
1865
+ };
1866
+ const workflow = await apiCreateWorkflow(workflowData);
1867
+ const workflowObj = JSON.parse(JSON.stringify(workflow));
1868
+ const workflowId = workflowObj.id;
1869
+ //配置工作流触发器
1870
+ const triggerNodeData = {
1871
+ config: { appends: [], collection: triggerNodeCollectionName, changed: [], condition: { $and: [] }, mode: 1 },
1872
+ };
1873
+ const triggerNode = await apiUpdateWorkflowTrigger(workflowId, triggerNodeData);
1874
+ const triggerNodeObj = JSON.parse(JSON.stringify(triggerNode));
1875
+ //配置聚合数据节点
1876
+ await page.goto(`admin/workflow/workflows/${workflowId}`);
1877
+ await page.waitForLoadState('networkidle');
1878
+ const collectionTriggerNode = new CollectionTriggerNode(page, workFlowName, triggerNodeCollectionName);
1879
+ await collectionTriggerNode.addNodeButton.click();
1880
+ await page.getByRole('button', { name: 'aggregate', exact: true }).click();
1881
+ const aggregateRecordNodeName = 'Aggregate' + dayjs().format('YYYYMMDDHHmmss.SSS').toString();
1882
+ await page.getByLabel('Aggregate-Aggregate', { exact: true }).getByRole('textbox').fill(aggregateRecordNodeName);
1883
+ const aggregateRecordNode = new AggregateNode(page, aggregateRecordNodeName);
1884
+ const aggregateRecordNodeId = await aggregateRecordNode.node.locator('.workflow-node-id').innerText();
1885
+ await aggregateRecordNode.nodeConfigure.click();
1886
+ await aggregateRecordNode.avgRadio.click();
1887
+ await aggregateRecordNode.collectionDropDown.click();
1888
+ await page.getByText(aggregateNodeCollectionDisplayName).click();
1889
+ await aggregateRecordNode.aggregatedFieldDropDown.click();
1890
+ await page.getByRole('option', { name: aggregateNodeFieldDisplayName }).click();
1891
+ await aggregateRecordNode.distinctCheckBox.click();
1892
+ // 过滤条件
1893
+ await page.getByText('Add condition', { exact: true }).click();
1894
+ await page.getByLabel('block-item-Filter-workflows-Filter').getByRole('button', { name: 'Select field' }).click();
1895
+ await page.getByRole('menuitemcheckbox', { name: '员工人数(整数)' }).click();
1896
+ await page.getByRole('button', { name: '=' }).click();
1897
+ await page.getByRole('option', { name: '>' }).click();
1898
+ await page.getByLabel('block-item-Filter-workflows-Filter').getByRole('spinbutton').fill('3');
1899
+ await aggregateRecordNode.submitButton.click();
1900
+
1901
+ // 2、测试步骤:添加数据触发工作流
1902
+ const triggerNodeCollectionRecordOne =
1903
+ triggerNodeFieldDisplayName + dayjs().format('YYYYMMDDHHmmss.SSS').toString();
1904
+ const triggerNodeCollectionRecords = await mockRecords(triggerNodeCollectionName, [
1905
+ { orgname: triggerNodeCollectionRecordOne },
1906
+ ]);
1907
+ await page.waitForTimeout(1000);
1908
+
1909
+ // 3、预期结果:工作流成功触发,数据查询成功
1910
+ const getWorkflow = await apiGetWorkflow(workflowId);
1911
+ const getWorkflowObj = JSON.parse(JSON.stringify(getWorkflow));
1912
+ const getWorkflowExecuted = getWorkflowObj.executed;
1913
+ expect(getWorkflowExecuted).toBe(1);
1914
+ const getWorkflowNodeExecutions = await apiGetWorkflowNodeExecutions(workflowId);
1915
+ const getWorkflowNodeExecutionsObj = JSON.parse(JSON.stringify(getWorkflowNodeExecutions));
1916
+ getWorkflowNodeExecutionsObj.sort(function (a: { id: number }, b: { id: number }) {
1917
+ return b.id - a.id;
1918
+ });
1919
+ const jobs = getWorkflowNodeExecutionsObj[0].jobs;
1920
+ const aggregateNodeJob = jobs.find((job) => job.nodeId.toString() === aggregateRecordNodeId);
1921
+ const aggregateNodeJobResult = aggregateNodeJob.result;
1922
+ const aggregateNodeCollectionDataFilter = aggregateNodeCollectionData.filter((item) => item.staffnum > 3);
1923
+ // aggregateNodeCollectionData中staffnum字段值去重
1924
+ const aggregateNodeCollectionDataDistinct = [
1925
+ ...new Set(aggregateNodeCollectionDataFilter.map((item) => item.staffnum)),
1926
+ ];
1927
+ // aggregateNodeCollectionDataDistinct中staffnum字段值大于3的元素个数
1928
+ const aggregateNodeCollectionDataDistinctCount = aggregateNodeCollectionDataDistinct.reduce(
1929
+ (count, currentValue) => {
1930
+ return currentValue > 3 ? count + 1 : count;
1931
+ },
1932
+ 0,
1933
+ );
1934
+ // aggregateNodeCollectionDataDistinct中staffnum字段值大于3的平均值
1935
+ const aggregateNodeCollectionDataDistinctAvg =
1936
+ aggregateNodeCollectionDataDistinct.reduce((total, currentValue) => {
1937
+ return currentValue > 3 ? total + currentValue : total;
1938
+ }, 0) / aggregateNodeCollectionDataDistinctCount;
1939
+ expect(aggregateNodeJobResult).toBe(aggregateNodeCollectionDataDistinctAvg);
1940
+ // 4、后置处理:删除工作流
1941
+ await apiDeleteWorkflow(workflowId);
1942
+ });
1943
+
1944
+ test.skip('Collection event add data trigger, normal table integer fields de-weighting MIN', async ({
1945
+ page,
1946
+ mockCollections,
1947
+ mockRecords,
1948
+ }) => {
1949
+ //数据表后缀标识
1950
+ const triggerNodeAppendText = 'a' + faker.string.alphanumeric(4);
1951
+ const aggregateNodeAppendText = 'b' + faker.string.alphanumeric(4);
1952
+ //创建触发器节点数据表
1953
+ const triggerNodeCollectionDisplayName = `自动>组织[普通表]${triggerNodeAppendText}`;
1954
+ const triggerNodeCollectionName = `tt_amt_org${triggerNodeAppendText}`;
1955
+ const triggerNodeFieldName = 'orgname';
1956
+ const triggerNodeFieldDisplayName = '公司名称(单行文本)';
1957
+ await mockCollections(
1958
+ appendJsonCollectionName(JSON.parse(JSON.stringify(generalWithNoRelationalFields)), triggerNodeAppendText)
1959
+ .collections,
1960
+ );
1961
+
1962
+ // 创建聚合节点数据表
1963
+ const aggregateNodeCollectionDisplayName = `自动>组织[普通表]${aggregateNodeAppendText}`;
1964
+ const aggregateNodeCollectionName = `tt_amt_org${aggregateNodeAppendText}`;
1965
+ const aggregateNodeFieldName = 'staffnum';
1966
+ const aggregateNodeFieldDisplayName = '员工人数(整数)';
1967
+ await mockCollections(
1968
+ appendJsonCollectionName(JSON.parse(JSON.stringify(generalWithNoRelationalFields)), aggregateNodeAppendText)
1969
+ .collections,
1970
+ );
1971
+ const aggregateNodeCollectionData = [
1972
+ { staffnum: 3, regcapital: 3.12 },
1973
+ { staffnum: 3, regcapital: 3.6 },
1974
+ { staffnum: 4, regcapital: 4.6 },
1975
+ { staffnum: 4, regcapital: 4.6 },
1976
+ { staffnum: 5, regcapital: 5.6 },
1977
+ ];
1978
+ const aggregateNodeCollectionRecords = await mockRecords(aggregateNodeCollectionName, aggregateNodeCollectionData);
1979
+
1980
+ //添加工作流
1981
+ const workFlowName = faker.string.alphanumeric(5) + triggerNodeAppendText;
1982
+ const workflowData = {
1983
+ current: true,
1984
+ options: { deleteExecutionOnStatus: [] },
1985
+ title: workFlowName,
1986
+ type: 'collection',
1987
+ enabled: true,
1988
+ };
1989
+ const workflow = await apiCreateWorkflow(workflowData);
1990
+ const workflowObj = JSON.parse(JSON.stringify(workflow));
1991
+ const workflowId = workflowObj.id;
1992
+ //配置工作流触发器
1993
+ const triggerNodeData = {
1994
+ config: { appends: [], collection: triggerNodeCollectionName, changed: [], condition: { $and: [] }, mode: 1 },
1995
+ };
1996
+ const triggerNode = await apiUpdateWorkflowTrigger(workflowId, triggerNodeData);
1997
+ const triggerNodeObj = JSON.parse(JSON.stringify(triggerNode));
1998
+
1999
+ //配置聚合数据节点
2000
+ await page.goto(`admin/workflow/workflows/${workflowId}`);
2001
+ await page.waitForLoadState('networkidle');
2002
+ const collectionTriggerNode = new CollectionTriggerNode(page, workFlowName, triggerNodeCollectionName);
2003
+ await collectionTriggerNode.addNodeButton.click();
2004
+ await page.getByRole('button', { name: 'aggregate', exact: true }).click();
2005
+ const aggregateRecordNodeName = 'Aggregate' + dayjs().format('YYYYMMDDHHmmss.SSS').toString();
2006
+ await page.getByLabel('Aggregate-Aggregate', { exact: true }).getByRole('textbox').fill(aggregateRecordNodeName);
2007
+ const aggregateRecordNode = new AggregateNode(page, aggregateRecordNodeName);
2008
+ const aggregateRecordNodeId = await aggregateRecordNode.node.locator('.workflow-node-id').innerText();
2009
+ await aggregateRecordNode.nodeConfigure.click();
2010
+ await aggregateRecordNode.minRadio.click();
2011
+ await aggregateRecordNode.collectionDropDown.click();
2012
+ await page.getByText(aggregateNodeCollectionDisplayName).click();
2013
+ await aggregateRecordNode.aggregatedFieldDropDown.click();
2014
+ await page.getByRole('option', { name: aggregateNodeFieldDisplayName }).click();
2015
+ await aggregateRecordNode.distinctCheckBox.click();
2016
+ // 过滤条件
2017
+ await page.getByText('Add condition', { exact: true }).click();
2018
+ await page.getByLabel('block-item-Filter-workflows-Filter').getByRole('button', { name: 'Select field' }).click();
2019
+ await page.getByRole('menuitemcheckbox', { name: '员工人数(整数)' }).click();
2020
+ await page.getByRole('button', { name: '=' }).click();
2021
+ await page.getByRole('option', { name: '>' }).click();
2022
+ await page.getByLabel('block-item-Filter-workflows-Filter').getByRole('spinbutton').fill('3');
2023
+ await aggregateRecordNode.submitButton.click();
2024
+
2025
+ // 2、测试步骤:添加数据触发工作流
2026
+ const triggerNodeCollectionRecordOne =
2027
+ triggerNodeFieldDisplayName + dayjs().format('YYYYMMDDHHmmss.SSS').toString();
2028
+ const triggerNodeCollectionRecords = await mockRecords(triggerNodeCollectionName, [
2029
+ { orgname: triggerNodeCollectionRecordOne },
2030
+ ]);
2031
+ await page.waitForTimeout(1000);
2032
+
2033
+ // 3、预期结果:工作流成功触发,数据查询成功
2034
+ const getWorkflow = await apiGetWorkflow(workflowId);
2035
+ const getWorkflowObj = JSON.parse(JSON.stringify(getWorkflow));
2036
+ const getWorkflowExecuted = getWorkflowObj.executed;
2037
+ expect(getWorkflowExecuted).toBe(1);
2038
+ const getWorkflowNodeExecutions = await apiGetWorkflowNodeExecutions(workflowId);
2039
+ const getWorkflowNodeExecutionsObj = JSON.parse(JSON.stringify(getWorkflowNodeExecutions));
2040
+ getWorkflowNodeExecutionsObj.sort(function (a: { id: number }, b: { id: number }) {
2041
+ return b.id - a.id;
2042
+ });
2043
+ const jobs = getWorkflowNodeExecutionsObj[0].jobs;
2044
+ const aggregateNodeJob = jobs.find((job) => job.nodeId.toString() === aggregateRecordNodeId);
2045
+ const aggregateNodeJobResult = aggregateNodeJob.result;
2046
+ const aggregateNodeCollectionDataFilter = aggregateNodeCollectionData.filter((item) => item.staffnum > 3);
2047
+ // aggregateNodeCollectionDataFilter中staffnum最小值
2048
+ const aggregateNodeCollectionDataMin = aggregateNodeCollectionDataFilter.reduce((min, currentValue) => {
2049
+ return currentValue.staffnum < min ? currentValue.staffnum : min;
2050
+ }, aggregateNodeCollectionDataFilter[0].staffnum);
2051
+ expect(aggregateNodeJobResult).toBe(aggregateNodeCollectionDataMin);
2052
+ // 4、后置处理:删除工作流
2053
+ await apiDeleteWorkflow(workflowId);
2054
+ });
2055
+
2056
+ test.skip('Collection event add data trigger, normal table integer fields de-weighting MAX', async ({
2057
+ page,
2058
+ mockCollections,
2059
+ mockRecords,
2060
+ }) => {
2061
+ //数据表后缀标识
2062
+ const triggerNodeAppendText = 'a' + faker.string.alphanumeric(4);
2063
+ const aggregateNodeAppendText = 'b' + faker.string.alphanumeric(4);
2064
+ //创建触发器节点数据表
2065
+ const triggerNodeCollectionDisplayName = `自动>组织[普通表]${triggerNodeAppendText}`;
2066
+ const triggerNodeCollectionName = `tt_amt_org${triggerNodeAppendText}`;
2067
+ const triggerNodeFieldName = 'orgname';
2068
+ const triggerNodeFieldDisplayName = '公司名称(单行文本)';
2069
+ await mockCollections(
2070
+ appendJsonCollectionName(JSON.parse(JSON.stringify(generalWithNoRelationalFields)), triggerNodeAppendText)
2071
+ .collections,
2072
+ );
2073
+
2074
+ // 创建聚合节点数据表
2075
+ const aggregateNodeCollectionDisplayName = `自动>组织[普通表]${aggregateNodeAppendText}`;
2076
+ const aggregateNodeCollectionName = `tt_amt_org${aggregateNodeAppendText}`;
2077
+ const aggregateNodeFieldName = 'staffnum';
2078
+ const aggregateNodeFieldDisplayName = '员工人数(整数)';
2079
+ await mockCollections(
2080
+ appendJsonCollectionName(JSON.parse(JSON.stringify(generalWithNoRelationalFields)), aggregateNodeAppendText)
2081
+ .collections,
2082
+ );
2083
+ const aggregateNodeCollectionData = [
2084
+ { staffnum: 3, regcapital: 3.12 },
2085
+ { staffnum: 3, regcapital: 3.6 },
2086
+ { staffnum: 4, regcapital: 4.6 },
2087
+ { staffnum: 4, regcapital: 4.6 },
2088
+ { staffnum: 5, regcapital: 5.6 },
2089
+ ];
2090
+ const aggregateNodeCollectionRecords = await mockRecords(aggregateNodeCollectionName, aggregateNodeCollectionData);
2091
+
2092
+ //添加工作流
2093
+ const workFlowName = faker.string.alphanumeric(5) + triggerNodeAppendText;
2094
+ const workflowData = {
2095
+ current: true,
2096
+ options: { deleteExecutionOnStatus: [] },
2097
+ title: workFlowName,
2098
+ type: 'collection',
2099
+ enabled: true,
2100
+ };
2101
+ const workflow = await apiCreateWorkflow(workflowData);
2102
+ const workflowObj = JSON.parse(JSON.stringify(workflow));
2103
+ const workflowId = workflowObj.id;
2104
+ //配置工作流触发器
2105
+ const triggerNodeData = {
2106
+ config: { appends: [], collection: triggerNodeCollectionName, changed: [], condition: { $and: [] }, mode: 1 },
2107
+ };
2108
+ const triggerNode = await apiUpdateWorkflowTrigger(workflowId, triggerNodeData);
2109
+ const triggerNodeObj = JSON.parse(JSON.stringify(triggerNode));
2110
+
2111
+ //配置聚合数据节点
2112
+ await page.goto(`admin/workflow/workflows/${workflowId}`);
2113
+ await page.waitForLoadState('networkidle');
2114
+ const collectionTriggerNode = new CollectionTriggerNode(page, workFlowName, triggerNodeCollectionName);
2115
+ await collectionTriggerNode.addNodeButton.click();
2116
+ await page.getByRole('button', { name: 'aggregate', exact: true }).click();
2117
+ const aggregateRecordNodeName = 'Aggregate' + dayjs().format('YYYYMMDDHHmmss.SSS').toString();
2118
+ await page.getByLabel('Aggregate-Aggregate', { exact: true }).getByRole('textbox').fill(aggregateRecordNodeName);
2119
+ const aggregateRecordNode = new AggregateNode(page, aggregateRecordNodeName);
2120
+ const aggregateRecordNodeId = await aggregateRecordNode.node.locator('.workflow-node-id').innerText();
2121
+ await aggregateRecordNode.nodeConfigure.click();
2122
+ await aggregateRecordNode.maxRadio.click();
2123
+ await aggregateRecordNode.collectionDropDown.click();
2124
+ await page.getByText(aggregateNodeCollectionDisplayName).click();
2125
+ await aggregateRecordNode.aggregatedFieldDropDown.click();
2126
+ await page.getByRole('option', { name: aggregateNodeFieldDisplayName }).click();
2127
+ await aggregateRecordNode.distinctCheckBox.click();
2128
+ // 过滤条件
2129
+ await page.getByText('Add condition', { exact: true }).click();
2130
+ await page.getByLabel('block-item-Filter-workflows-Filter').getByRole('button', { name: 'Select field' }).click();
2131
+ await page.getByRole('menuitemcheckbox', { name: '员工人数(整数)' }).click();
2132
+ await page.getByRole('button', { name: '=' }).click();
2133
+ await page.getByRole('option', { name: '>' }).click();
2134
+ await page.getByLabel('block-item-Filter-workflows-Filter').getByRole('spinbutton').fill('3');
2135
+ await aggregateRecordNode.submitButton.click();
2136
+
2137
+ // 2、测试步骤:添加数据触发工作流
2138
+ const triggerNodeCollectionRecordOne =
2139
+ triggerNodeFieldDisplayName + dayjs().format('YYYYMMDDHHmmss.SSS').toString();
2140
+ const triggerNodeCollectionRecords = await mockRecords(triggerNodeCollectionName, [
2141
+ { orgname: triggerNodeCollectionRecordOne },
2142
+ ]);
2143
+ await page.waitForTimeout(1000);
2144
+
2145
+ // 3、预期结果:工作流成功触发,数据查询成功
2146
+ const getWorkflow = await apiGetWorkflow(workflowId);
2147
+ const getWorkflowObj = JSON.parse(JSON.stringify(getWorkflow));
2148
+ const getWorkflowExecuted = getWorkflowObj.executed;
2149
+ expect(getWorkflowExecuted).toBe(1);
2150
+ const getWorkflowNodeExecutions = await apiGetWorkflowNodeExecutions(workflowId);
2151
+ const getWorkflowNodeExecutionsObj = JSON.parse(JSON.stringify(getWorkflowNodeExecutions));
2152
+ getWorkflowNodeExecutionsObj.sort(function (a: { id: number }, b: { id: number }) {
2153
+ return b.id - a.id;
2154
+ });
2155
+ const jobs = getWorkflowNodeExecutionsObj[0].jobs;
2156
+ const aggregateNodeJob = jobs.find((job) => job.nodeId.toString() === aggregateRecordNodeId);
2157
+ const aggregateNodeJobResult = aggregateNodeJob.result;
2158
+ const aggregateNodeCollectionDataFilter = aggregateNodeCollectionData.filter((item) => item.staffnum > 3);
2159
+ // aggregateNodeCollectionDataFilter中staffnum最大值
2160
+ const aggregateNodeCollectionDataMax = aggregateNodeCollectionDataFilter.reduce((max, currentValue) => {
2161
+ return currentValue.staffnum > max ? currentValue.staffnum : max;
2162
+ }, aggregateNodeCollectionDataFilter[0].staffnum);
2163
+ expect(aggregateNodeJobResult).toBe(aggregateNodeCollectionDataMax);
2164
+ // 4、后置处理:删除工作流
2165
+ await apiDeleteWorkflow(workflowId);
508
2166
  });
509
- const jobs = getWorkflowNodeExecutionsObj[0].jobs;
510
- const queryRecordNodeJob = jobs.find((job) => job.nodeId.toString() === aggregateRecordNodeId);
511
- const queryRecordNodeJobResult = queryRecordNodeJob.result;
512
- // aggregateNodeCollectionData中staffnum字段值最大值
513
- const aggregateNodeCollectionDataMax = aggregateNodeCollectionData.reduce((max, currentValue) => {
514
- return currentValue.staffnum > max ? currentValue.staffnum : max;
515
- }, aggregateNodeCollectionData[0].staffnum);
516
- expect(queryRecordNodeJobResult).toBe(aggregateNodeCollectionDataMax);
517
- // 4、后置处理:删除工作流
518
- await apiDeleteWorkflow(workflowId);
519
2167
  });